/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // node_modules/adm-zip/util/fileSystem.js var require_fileSystem = __commonJS({ "node_modules/adm-zip/util/fileSystem.js"(exports) { exports.require = function() { if (typeof process === "object" && process.versions && process.versions["electron"]) { try { const originalFs = require("original-fs"); if (Object.keys(originalFs).length > 0) { return originalFs; } } catch (e) { } } return require("fs"); }; } }); // node_modules/adm-zip/util/constants.js var require_constants = __commonJS({ "node_modules/adm-zip/util/constants.js"(exports, module2) { module2.exports = { LOCHDR: 30, LOCSIG: 67324752, LOCVER: 4, LOCFLG: 6, LOCHOW: 8, LOCTIM: 10, LOCCRC: 14, LOCSIZ: 18, LOCLEN: 22, LOCNAM: 26, LOCEXT: 28, EXTSIG: 134695760, EXTHDR: 16, EXTCRC: 4, EXTSIZ: 8, EXTLEN: 12, CENHDR: 46, CENSIG: 33639248, CENVEM: 4, CENVER: 6, CENFLG: 8, CENHOW: 10, CENTIM: 12, CENCRC: 16, CENSIZ: 20, CENLEN: 24, CENNAM: 28, CENEXT: 30, CENCOM: 32, CENDSK: 34, CENATT: 36, CENATX: 38, CENOFF: 42, ENDHDR: 22, ENDSIG: 101010256, ENDSUB: 8, ENDTOT: 10, ENDSIZ: 12, ENDOFF: 16, ENDCOM: 20, END64HDR: 20, END64SIG: 117853008, END64START: 4, END64OFF: 8, END64NUMDISKS: 16, ZIP64SIG: 101075792, ZIP64HDR: 56, ZIP64LEAD: 12, ZIP64SIZE: 4, ZIP64VEM: 12, ZIP64VER: 14, ZIP64DSK: 16, ZIP64DSKDIR: 20, ZIP64SUB: 24, ZIP64TOT: 32, ZIP64SIZB: 40, ZIP64OFF: 48, ZIP64EXTRA: 56, STORED: 0, SHRUNK: 1, REDUCED1: 2, REDUCED2: 3, REDUCED3: 4, REDUCED4: 5, IMPLODED: 6, DEFLATED: 8, ENHANCED_DEFLATED: 9, PKWARE: 10, BZIP2: 12, LZMA: 14, IBM_TERSE: 18, IBM_LZ77: 19, AES_ENCRYPT: 99, FLG_ENC: 1, FLG_COMP1: 2, FLG_COMP2: 4, FLG_DESC: 8, FLG_ENH: 16, FLG_PATCH: 32, FLG_STR: 64, FLG_EFS: 2048, FLG_MSK: 4096, FILE: 2, BUFFER: 1, NONE: 0, EF_ID: 0, EF_SIZE: 2, ID_ZIP64: 1, ID_AVINFO: 7, ID_PFS: 8, ID_OS2: 9, ID_NTFS: 10, ID_OPENVMS: 12, ID_UNIX: 13, ID_FORK: 14, ID_PATCH: 15, ID_X509_PKCS7: 20, ID_X509_CERTID_F: 21, ID_X509_CERTID_C: 22, ID_STRONGENC: 23, ID_RECORD_MGT: 24, ID_X509_PKCS7_RL: 25, ID_IBM1: 101, ID_IBM2: 102, ID_POSZIP: 18064, EF_ZIP64_OR_32: 4294967295, EF_ZIP64_OR_16: 65535, EF_ZIP64_SUNCOMP: 0, EF_ZIP64_SCOMP: 8, EF_ZIP64_RHO: 16, EF_ZIP64_DSN: 24 }; } }); // node_modules/adm-zip/util/utils.js var require_utils = __commonJS({ "node_modules/adm-zip/util/utils.js"(exports, module2) { var fsystem = require_fileSystem().require(); var pth = require("path"); var Constants = require_constants(); var isWin = typeof process === "object" && process.platform === "win32"; var is_Obj = (obj) => obj && typeof obj === "object"; var crcTable = new Uint32Array(256).map((t, c) => { for (let k = 0; k < 8; k++) { if ((c & 1) !== 0) { c = 3988292384 ^ c >>> 1; } else { c >>>= 1; } } return c >>> 0; }); function Utils2(opts) { this.sep = pth.sep; this.fs = fsystem; if (is_Obj(opts)) { if (is_Obj(opts.fs) && typeof opts.fs.statSync === "function") { this.fs = opts.fs; } } } module2.exports = Utils2; Utils2.prototype.makeDir = function(folder) { const self2 = this; function mkdirSync2(fpath) { let resolvedPath = fpath.split(self2.sep)[0]; fpath.split(self2.sep).forEach(function(name) { if (!name || name.substr(-1, 1) === ":") return; resolvedPath += self2.sep + name; var stat; try { stat = self2.fs.statSync(resolvedPath); } catch (e) { self2.fs.mkdirSync(resolvedPath); } if (stat && stat.isFile()) throw Errors.FILE_IN_THE_WAY.replace("%s", resolvedPath); }); } mkdirSync2(folder); }; Utils2.prototype.writeFileTo = function(path3, content, overwrite, attr) { const self2 = this; if (self2.fs.existsSync(path3)) { if (!overwrite) return false; var stat = self2.fs.statSync(path3); if (stat.isDirectory()) { return false; } } var folder = pth.dirname(path3); if (!self2.fs.existsSync(folder)) { self2.makeDir(folder); } var fd; try { fd = self2.fs.openSync(path3, "w", 438); } catch (e) { self2.fs.chmodSync(path3, 438); fd = self2.fs.openSync(path3, "w", 438); } if (fd) { try { self2.fs.writeSync(fd, content, 0, content.length, 0); } finally { self2.fs.closeSync(fd); } } self2.fs.chmodSync(path3, attr || 438); return true; }; Utils2.prototype.writeFileToAsync = function(path3, content, overwrite, attr, callback) { if (typeof attr === "function") { callback = attr; attr = void 0; } const self2 = this; self2.fs.exists(path3, function(exist) { if (exist && !overwrite) return callback(false); self2.fs.stat(path3, function(err, stat) { if (exist && stat.isDirectory()) { return callback(false); } var folder = pth.dirname(path3); self2.fs.exists(folder, function(exists) { if (!exists) self2.makeDir(folder); self2.fs.open(path3, "w", 438, function(err2, fd) { if (err2) { self2.fs.chmod(path3, 438, function() { self2.fs.open(path3, "w", 438, function(err3, fd2) { self2.fs.write(fd2, content, 0, content.length, 0, function() { self2.fs.close(fd2, function() { self2.fs.chmod(path3, attr || 438, function() { callback(true); }); }); }); }); }); } else if (fd) { self2.fs.write(fd, content, 0, content.length, 0, function() { self2.fs.close(fd, function() { self2.fs.chmod(path3, attr || 438, function() { callback(true); }); }); }); } else { self2.fs.chmod(path3, attr || 438, function() { callback(true); }); } }); }); }); }); }; Utils2.prototype.findFiles = function(path3) { const self2 = this; function findSync(dir, pattern, recursive) { if (typeof pattern === "boolean") { recursive = pattern; pattern = void 0; } let files = []; self2.fs.readdirSync(dir).forEach(function(file) { var path4 = pth.join(dir, file); if (self2.fs.statSync(path4).isDirectory() && recursive) files = files.concat(findSync(path4, pattern, recursive)); if (!pattern || pattern.test(path4)) { files.push(pth.normalize(path4) + (self2.fs.statSync(path4).isDirectory() ? self2.sep : "")); } }); return files; } return findSync(path3, void 0, true); }; Utils2.prototype.getAttributes = function() { }; Utils2.prototype.setAttributes = function() { }; Utils2.crc32update = function(crc, byte) { return crcTable[(crc ^ byte) & 255] ^ crc >>> 8; }; Utils2.crc32 = function(buf) { if (typeof buf === "string") { buf = Buffer.from(buf, "utf8"); } if (!crcTable.length) genCRCTable(); let len = buf.length; let crc = ~0; for (let off = 0; off < len; ) crc = Utils2.crc32update(crc, buf[off++]); return ~crc >>> 0; }; Utils2.methodToString = function(method) { switch (method) { case Constants.STORED: return "STORED (" + method + ")"; case Constants.DEFLATED: return "DEFLATED (" + method + ")"; default: return "UNSUPPORTED (" + method + ")"; } }; Utils2.canonical = function(path3) { if (!path3) return ""; var safeSuffix = pth.posix.normalize("/" + path3.split("\\").join("/")); return pth.join(".", safeSuffix); }; Utils2.sanitize = function(prefix, name) { prefix = pth.resolve(pth.normalize(prefix)); var parts = name.split("/"); for (var i = 0, l = parts.length; i < l; i++) { var path3 = pth.normalize(pth.join(prefix, parts.slice(i, l).join(pth.sep))); if (path3.indexOf(prefix) === 0) { return path3; } } return pth.normalize(pth.join(prefix, pth.basename(name))); }; Utils2.toBuffer = function toBuffer(input) { if (Buffer.isBuffer(input)) { return input; } else if (input instanceof Uint8Array) { return Buffer.from(input); } else { return typeof input === "string" ? Buffer.from(input, "utf8") : Buffer.alloc(0); } }; Utils2.readBigUInt64LE = function(buffer, index) { var slice = Buffer.from(buffer.slice(index, index + 8)); slice.swap64(); return parseInt(`0x${slice.toString("hex")}`); }; Utils2.isWin = isWin; Utils2.crcTable = crcTable; } }); // node_modules/adm-zip/util/errors.js var require_errors = __commonJS({ "node_modules/adm-zip/util/errors.js"(exports, module2) { module2.exports = { INVALID_LOC: "Invalid LOC header (bad signature)", INVALID_CEN: "Invalid CEN header (bad signature)", INVALID_END: "Invalid END header (bad signature)", NO_DATA: "Nothing to decompress", BAD_CRC: "CRC32 checksum failed", FILE_IN_THE_WAY: "There is a file in the way: %s", UNKNOWN_METHOD: "Invalid/unsupported compression method", AVAIL_DATA: "inflate::Available inflate data did not terminate", INVALID_DISTANCE: "inflate::Invalid literal/length or distance code in fixed or dynamic block", TO_MANY_CODES: "inflate::Dynamic block code description: too many length or distance codes", INVALID_REPEAT_LEN: "inflate::Dynamic block code description: repeat more than specified lengths", INVALID_REPEAT_FIRST: "inflate::Dynamic block code description: repeat lengths with no first length", INCOMPLETE_CODES: "inflate::Dynamic block code description: code lengths codes incomplete", INVALID_DYN_DISTANCE: "inflate::Dynamic block code description: invalid distance code lengths", INVALID_CODES_LEN: "inflate::Dynamic block code description: invalid literal/length code lengths", INVALID_STORE_BLOCK: "inflate::Stored block length did not match one's complement", INVALID_BLOCK_TYPE: "inflate::Invalid block type (type == 3)", CANT_EXTRACT_FILE: "Could not extract the file", CANT_OVERRIDE: "Target file already exists", NO_ZIP: "No zip file was loaded", NO_ENTRY: "Entry doesn't exist", DIRECTORY_CONTENT_ERROR: "A directory cannot have content", FILE_NOT_FOUND: "File not found: %s", NOT_IMPLEMENTED: "Not implemented", INVALID_FILENAME: "Invalid filename", INVALID_FORMAT: "Invalid or unsupported zip format. No END header found" }; } }); // node_modules/adm-zip/util/fattr.js var require_fattr = __commonJS({ "node_modules/adm-zip/util/fattr.js"(exports, module2) { var fs4 = require_fileSystem().require(); var pth = require("path"); fs4.existsSync = fs4.existsSync || pth.existsSync; module2.exports = function(path3) { var _path = path3 || "", _obj = newAttr(), _stat = null; function newAttr() { return { directory: false, readonly: false, hidden: false, executable: false, mtime: 0, atime: 0 }; } if (_path && fs4.existsSync(_path)) { _stat = fs4.statSync(_path); _obj.directory = _stat.isDirectory(); _obj.mtime = _stat.mtime; _obj.atime = _stat.atime; _obj.executable = (73 & _stat.mode) !== 0; _obj.readonly = (128 & _stat.mode) === 0; _obj.hidden = pth.basename(_path)[0] === "."; } else { console.warn("Invalid path: " + _path); } return { get directory() { return _obj.directory; }, get readOnly() { return _obj.readonly; }, get hidden() { return _obj.hidden; }, get mtime() { return _obj.mtime; }, get atime() { return _obj.atime; }, get executable() { return _obj.executable; }, decodeAttributes: function() { }, encodeAttributes: function() { }, toJSON: function() { return { path: _path, isDirectory: _obj.directory, isReadOnly: _obj.readonly, isHidden: _obj.hidden, isExecutable: _obj.executable, mTime: _obj.mtime, aTime: _obj.atime }; }, toString: function() { return JSON.stringify(this.toJSON(), null, " "); } }; }; } }); // node_modules/adm-zip/util/index.js var require_util = __commonJS({ "node_modules/adm-zip/util/index.js"(exports, module2) { module2.exports = require_utils(); module2.exports.Constants = require_constants(); module2.exports.Errors = require_errors(); module2.exports.FileAttr = require_fattr(); } }); // node_modules/adm-zip/headers/entryHeader.js var require_entryHeader = __commonJS({ "node_modules/adm-zip/headers/entryHeader.js"(exports, module2) { var Utils2 = require_util(); var Constants = Utils2.Constants; module2.exports = function() { var _verMade = 20, _version = 10, _flags = 0, _method = 0, _time = 0, _crc = 0, _compressedSize = 0, _size = 0, _fnameLen = 0, _extraLen = 0, _comLen = 0, _diskStart = 0, _inattr = 0, _attr = 0, _offset = 0; _verMade |= Utils2.isWin ? 2560 : 768; _flags |= Constants.FLG_EFS; var _dataHeader = {}; function setTime(val) { val = new Date(val); _time = (val.getFullYear() - 1980 & 127) << 25 | val.getMonth() + 1 << 21 | val.getDate() << 16 | val.getHours() << 11 | val.getMinutes() << 5 | val.getSeconds() >> 1; } setTime(+new Date()); return { get made() { return _verMade; }, set made(val) { _verMade = val; }, get version() { return _version; }, set version(val) { _version = val; }, get flags() { return _flags; }, set flags(val) { _flags = val; }, get method() { return _method; }, set method(val) { switch (val) { case Constants.STORED: this.version = 10; case Constants.DEFLATED: default: this.version = 20; } _method = val; }, get time() { return new Date((_time >> 25 & 127) + 1980, (_time >> 21 & 15) - 1, _time >> 16 & 31, _time >> 11 & 31, _time >> 5 & 63, (_time & 31) << 1); }, set time(val) { setTime(val); }, get crc() { return _crc; }, set crc(val) { _crc = Math.max(0, val) >>> 0; }, get compressedSize() { return _compressedSize; }, set compressedSize(val) { _compressedSize = Math.max(0, val) >>> 0; }, get size() { return _size; }, set size(val) { _size = Math.max(0, val) >>> 0; }, get fileNameLength() { return _fnameLen; }, set fileNameLength(val) { _fnameLen = val; }, get extraLength() { return _extraLen; }, set extraLength(val) { _extraLen = val; }, get commentLength() { return _comLen; }, set commentLength(val) { _comLen = val; }, get diskNumStart() { return _diskStart; }, set diskNumStart(val) { _diskStart = Math.max(0, val) >>> 0; }, get inAttr() { return _inattr; }, set inAttr(val) { _inattr = Math.max(0, val) >>> 0; }, get attr() { return _attr; }, set attr(val) { _attr = Math.max(0, val) >>> 0; }, get fileAttr() { return _attr ? (_attr >>> 0 | 0) >> 16 & 4095 : 0; }, get offset() { return _offset; }, set offset(val) { _offset = Math.max(0, val) >>> 0; }, get encripted() { return (_flags & 1) === 1; }, get entryHeaderSize() { return Constants.CENHDR + _fnameLen + _extraLen + _comLen; }, get realDataOffset() { return _offset + Constants.LOCHDR + _dataHeader.fnameLen + _dataHeader.extraLen; }, get dataHeader() { return _dataHeader; }, loadDataHeaderFromBinary: function(input) { var data = input.slice(_offset, _offset + Constants.LOCHDR); if (data.readUInt32LE(0) !== Constants.LOCSIG) { throw new Error(Utils2.Errors.INVALID_LOC); } _dataHeader = { version: data.readUInt16LE(Constants.LOCVER), flags: data.readUInt16LE(Constants.LOCFLG), method: data.readUInt16LE(Constants.LOCHOW), time: data.readUInt32LE(Constants.LOCTIM), crc: data.readUInt32LE(Constants.LOCCRC), compressedSize: data.readUInt32LE(Constants.LOCSIZ), size: data.readUInt32LE(Constants.LOCLEN), fnameLen: data.readUInt16LE(Constants.LOCNAM), extraLen: data.readUInt16LE(Constants.LOCEXT) }; }, loadFromBinary: function(data) { if (data.length !== Constants.CENHDR || data.readUInt32LE(0) !== Constants.CENSIG) { throw new Error(Utils2.Errors.INVALID_CEN); } _verMade = data.readUInt16LE(Constants.CENVEM); _version = data.readUInt16LE(Constants.CENVER); _flags = data.readUInt16LE(Constants.CENFLG); _method = data.readUInt16LE(Constants.CENHOW); _time = data.readUInt32LE(Constants.CENTIM); _crc = data.readUInt32LE(Constants.CENCRC); _compressedSize = data.readUInt32LE(Constants.CENSIZ); _size = data.readUInt32LE(Constants.CENLEN); _fnameLen = data.readUInt16LE(Constants.CENNAM); _extraLen = data.readUInt16LE(Constants.CENEXT); _comLen = data.readUInt16LE(Constants.CENCOM); _diskStart = data.readUInt16LE(Constants.CENDSK); _inattr = data.readUInt16LE(Constants.CENATT); _attr = data.readUInt32LE(Constants.CENATX); _offset = data.readUInt32LE(Constants.CENOFF); }, dataHeaderToBinary: function() { var data = Buffer.alloc(Constants.LOCHDR); data.writeUInt32LE(Constants.LOCSIG, 0); data.writeUInt16LE(_version, Constants.LOCVER); data.writeUInt16LE(_flags, Constants.LOCFLG); data.writeUInt16LE(_method, Constants.LOCHOW); data.writeUInt32LE(_time, Constants.LOCTIM); data.writeUInt32LE(_crc, Constants.LOCCRC); data.writeUInt32LE(_compressedSize, Constants.LOCSIZ); data.writeUInt32LE(_size, Constants.LOCLEN); data.writeUInt16LE(_fnameLen, Constants.LOCNAM); data.writeUInt16LE(_extraLen, Constants.LOCEXT); return data; }, entryHeaderToBinary: function() { var data = Buffer.alloc(Constants.CENHDR + _fnameLen + _extraLen + _comLen); data.writeUInt32LE(Constants.CENSIG, 0); data.writeUInt16LE(_verMade, Constants.CENVEM); data.writeUInt16LE(_version, Constants.CENVER); data.writeUInt16LE(_flags, Constants.CENFLG); data.writeUInt16LE(_method, Constants.CENHOW); data.writeUInt32LE(_time, Constants.CENTIM); data.writeUInt32LE(_crc, Constants.CENCRC); data.writeUInt32LE(_compressedSize, Constants.CENSIZ); data.writeUInt32LE(_size, Constants.CENLEN); data.writeUInt16LE(_fnameLen, Constants.CENNAM); data.writeUInt16LE(_extraLen, Constants.CENEXT); data.writeUInt16LE(_comLen, Constants.CENCOM); data.writeUInt16LE(_diskStart, Constants.CENDSK); data.writeUInt16LE(_inattr, Constants.CENATT); data.writeUInt32LE(_attr, Constants.CENATX); data.writeUInt32LE(_offset, Constants.CENOFF); data.fill(0, Constants.CENHDR); return data; }, toJSON: function() { const bytes = function(nr) { return nr + " bytes"; }; return { made: _verMade, version: _version, flags: _flags, method: Utils2.methodToString(_method), time: this.time, crc: "0x" + _crc.toString(16).toUpperCase(), compressedSize: bytes(_compressedSize), size: bytes(_size), fileNameLength: bytes(_fnameLen), extraLength: bytes(_extraLen), commentLength: bytes(_comLen), diskNumStart: _diskStart, inAttr: _inattr, attr: _attr, offset: _offset, entryHeaderSize: bytes(Constants.CENHDR + _fnameLen + _extraLen + _comLen) }; }, toString: function() { return JSON.stringify(this.toJSON(), null, " "); } }; }; } }); // node_modules/adm-zip/headers/mainHeader.js var require_mainHeader = __commonJS({ "node_modules/adm-zip/headers/mainHeader.js"(exports, module2) { var Utils2 = require_util(); var Constants = Utils2.Constants; module2.exports = function() { var _volumeEntries = 0, _totalEntries = 0, _size = 0, _offset = 0, _commentLength = 0; return { get diskEntries() { return _volumeEntries; }, set diskEntries(val) { _volumeEntries = _totalEntries = val; }, get totalEntries() { return _totalEntries; }, set totalEntries(val) { _totalEntries = _volumeEntries = val; }, get size() { return _size; }, set size(val) { _size = val; }, get offset() { return _offset; }, set offset(val) { _offset = val; }, get commentLength() { return _commentLength; }, set commentLength(val) { _commentLength = val; }, get mainHeaderSize() { return Constants.ENDHDR + _commentLength; }, loadFromBinary: function(data) { if ((data.length !== Constants.ENDHDR || data.readUInt32LE(0) !== Constants.ENDSIG) && (data.length < Constants.ZIP64HDR || data.readUInt32LE(0) !== Constants.ZIP64SIG)) { throw new Error(Utils2.Errors.INVALID_END); } if (data.readUInt32LE(0) === Constants.ENDSIG) { _volumeEntries = data.readUInt16LE(Constants.ENDSUB); _totalEntries = data.readUInt16LE(Constants.ENDTOT); _size = data.readUInt32LE(Constants.ENDSIZ); _offset = data.readUInt32LE(Constants.ENDOFF); _commentLength = data.readUInt16LE(Constants.ENDCOM); } else { _volumeEntries = Utils2.readBigUInt64LE(data, Constants.ZIP64SUB); _totalEntries = Utils2.readBigUInt64LE(data, Constants.ZIP64TOT); _size = Utils2.readBigUInt64LE(data, Constants.ZIP64SIZ); _offset = Utils2.readBigUInt64LE(data, Constants.ZIP64OFF); _commentLength = 0; } }, toBinary: function() { var b = Buffer.alloc(Constants.ENDHDR + _commentLength); b.writeUInt32LE(Constants.ENDSIG, 0); b.writeUInt32LE(0, 4); b.writeUInt16LE(_volumeEntries, Constants.ENDSUB); b.writeUInt16LE(_totalEntries, Constants.ENDTOT); b.writeUInt32LE(_size, Constants.ENDSIZ); b.writeUInt32LE(_offset, Constants.ENDOFF); b.writeUInt16LE(_commentLength, Constants.ENDCOM); b.fill(" ", Constants.ENDHDR); return b; }, toJSON: function() { const offset = function(nr, len) { let offs = nr.toString(16).toUpperCase(); while (offs.length < len) offs = "0" + offs; return "0x" + offs; }; return { diskEntries: _volumeEntries, totalEntries: _totalEntries, size: _size + " bytes", offset: offset(_offset, 4), commentLength: _commentLength }; }, toString: function() { return JSON.stringify(this.toJSON(), null, " "); } }; }; } }); // node_modules/adm-zip/headers/index.js var require_headers = __commonJS({ "node_modules/adm-zip/headers/index.js"(exports) { exports.EntryHeader = require_entryHeader(); exports.MainHeader = require_mainHeader(); } }); // node_modules/adm-zip/methods/deflater.js var require_deflater = __commonJS({ "node_modules/adm-zip/methods/deflater.js"(exports, module2) { module2.exports = function(inbuf) { var zlib = require("zlib"); var opts = { chunkSize: (parseInt(inbuf.length / 1024) + 1) * 1024 }; return { deflate: function() { return zlib.deflateRawSync(inbuf, opts); }, deflateAsync: function(callback) { var tmp = zlib.createDeflateRaw(opts), parts = [], total = 0; tmp.on("data", function(data) { parts.push(data); total += data.length; }); tmp.on("end", function() { var buf = Buffer.alloc(total), written = 0; buf.fill(0); for (var i = 0; i < parts.length; i++) { var part = parts[i]; part.copy(buf, written); written += part.length; } callback && callback(buf); }); tmp.end(inbuf); } }; }; } }); // node_modules/adm-zip/methods/inflater.js var require_inflater = __commonJS({ "node_modules/adm-zip/methods/inflater.js"(exports, module2) { module2.exports = function(inbuf) { var zlib = require("zlib"); return { inflate: function() { return zlib.inflateRawSync(inbuf); }, inflateAsync: function(callback) { var tmp = zlib.createInflateRaw(), parts = [], total = 0; tmp.on("data", function(data) { parts.push(data); total += data.length; }); tmp.on("end", function() { var buf = Buffer.alloc(total), written = 0; buf.fill(0); for (var i = 0; i < parts.length; i++) { var part = parts[i]; part.copy(buf, written); written += part.length; } callback && callback(buf); }); tmp.end(inbuf); } }; }; } }); // node_modules/adm-zip/methods/zipcrypto.js var require_zipcrypto = __commonJS({ "node_modules/adm-zip/methods/zipcrypto.js"(exports, module2) { "use strict"; var { randomFillSync } = require("crypto"); var crctable = new Uint32Array(256).map((t, crc) => { for (let j = 0; j < 8; j++) { if ((crc & 1) !== 0) { crc = crc >>> 1 ^ 3988292384; } else { crc >>>= 1; } } return crc >>> 0; }); var uMul = (a, b) => Math.imul(a, b) >>> 0; var crc32update = (pCrc32, bval) => { return crctable[(pCrc32 ^ bval) & 255] ^ pCrc32 >>> 8; }; var genSalt = () => { if (typeof randomFillSync === "function") { return randomFillSync(Buffer.alloc(12)); } else { return genSalt.node(); } }; genSalt.node = () => { const salt = Buffer.alloc(12); const len = salt.length; for (let i = 0; i < len; i++) salt[i] = Math.random() * 256 & 255; return salt; }; var config = { genSalt }; function Initkeys(pw) { const pass = Buffer.isBuffer(pw) ? pw : Buffer.from(pw); this.keys = new Uint32Array([305419896, 591751049, 878082192]); for (let i = 0; i < pass.length; i++) { this.updateKeys(pass[i]); } } Initkeys.prototype.updateKeys = function(byteValue) { const keys = this.keys; keys[0] = crc32update(keys[0], byteValue); keys[1] += keys[0] & 255; keys[1] = uMul(keys[1], 134775813) + 1; keys[2] = crc32update(keys[2], keys[1] >>> 24); return byteValue; }; Initkeys.prototype.next = function() { const k = (this.keys[2] | 2) >>> 0; return uMul(k, k ^ 1) >> 8 & 255; }; function make_decrypter(pwd) { const keys = new Initkeys(pwd); return function(data) { const result = Buffer.alloc(data.length); let pos = 0; for (let c of data) { result[pos++] = keys.updateKeys(c ^ keys.next()); } return result; }; } function make_encrypter(pwd) { const keys = new Initkeys(pwd); return function(data, result, pos = 0) { if (!result) result = Buffer.alloc(data.length); for (let c of data) { const k = keys.next(); result[pos++] = c ^ k; keys.updateKeys(c); } return result; }; } function decrypt(data, header, pwd) { if (!data || !Buffer.isBuffer(data) || data.length < 12) { return Buffer.alloc(0); } const decrypter = make_decrypter(pwd); const salt = decrypter(data.slice(0, 12)); if (salt[11] !== header.crc >>> 24) { throw "ADM-ZIP: Wrong Password"; } return decrypter(data.slice(12)); } function _salter(data) { if (Buffer.isBuffer(data) && data.length >= 12) { config.genSalt = function() { return data.slice(0, 12); }; } else if (data === "node") { config.genSalt = genSalt.node; } else { config.genSalt = genSalt; } } function encrypt(data, header, pwd, oldlike = false) { if (data == null) data = Buffer.alloc(0); if (!Buffer.isBuffer(data)) data = Buffer.from(data.toString()); const encrypter = make_encrypter(pwd); const salt = config.genSalt(); salt[11] = header.crc >>> 24 & 255; if (oldlike) salt[10] = header.crc >>> 16 & 255; const result = Buffer.alloc(data.length + 12); encrypter(salt, result); return encrypter(data, result, 12); } module2.exports = { decrypt, encrypt, _salter }; } }); // node_modules/adm-zip/methods/index.js var require_methods = __commonJS({ "node_modules/adm-zip/methods/index.js"(exports) { exports.Deflater = require_deflater(); exports.Inflater = require_inflater(); exports.ZipCrypto = require_zipcrypto(); } }); // node_modules/adm-zip/zipEntry.js var require_zipEntry = __commonJS({ "node_modules/adm-zip/zipEntry.js"(exports, module2) { var Utils2 = require_util(); var Headers = require_headers(); var Constants = Utils2.Constants; var Methods = require_methods(); module2.exports = function(input) { var _entryHeader = new Headers.EntryHeader(), _entryName = Buffer.alloc(0), _comment = Buffer.alloc(0), _isDirectory = false, uncompressedData = null, _extra = Buffer.alloc(0); function getCompressedDataFromZip() { if (!input || !Buffer.isBuffer(input)) { return Buffer.alloc(0); } _entryHeader.loadDataHeaderFromBinary(input); return input.slice(_entryHeader.realDataOffset, _entryHeader.realDataOffset + _entryHeader.compressedSize); } function crc32OK(data) { if ((_entryHeader.flags & 8) !== 8) { if (Utils2.crc32(data) !== _entryHeader.dataHeader.crc) { return false; } } else { } return true; } function decompress(async, callback, pass) { if (typeof callback === "undefined" && typeof async === "string") { pass = async; async = void 0; } if (_isDirectory) { if (async && callback) { callback(Buffer.alloc(0), Utils2.Errors.DIRECTORY_CONTENT_ERROR); } return Buffer.alloc(0); } var compressedData = getCompressedDataFromZip(); if (compressedData.length === 0) { if (async && callback) callback(compressedData); return compressedData; } if (_entryHeader.encripted) { if (typeof pass !== "string" && !Buffer.isBuffer(pass)) { throw new Error("ADM-ZIP: Incompatible password parameter"); } compressedData = Methods.ZipCrypto.decrypt(compressedData, _entryHeader, pass); } var data = Buffer.alloc(_entryHeader.size); switch (_entryHeader.method) { case Utils2.Constants.STORED: compressedData.copy(data); if (!crc32OK(data)) { if (async && callback) callback(data, Utils2.Errors.BAD_CRC); throw new Error(Utils2.Errors.BAD_CRC); } else { if (async && callback) callback(data); return data; } case Utils2.Constants.DEFLATED: var inflater = new Methods.Inflater(compressedData); if (!async) { const result = inflater.inflate(data); result.copy(data, 0); if (!crc32OK(data)) { throw new Error(Utils2.Errors.BAD_CRC + " " + _entryName.toString()); } return data; } else { inflater.inflateAsync(function(result) { result.copy(result, 0); if (callback) { if (!crc32OK(result)) { callback(result, Utils2.Errors.BAD_CRC); } else { callback(result); } } }); } break; default: if (async && callback) callback(Buffer.alloc(0), Utils2.Errors.UNKNOWN_METHOD); throw new Error(Utils2.Errors.UNKNOWN_METHOD); } } function compress(async, callback) { if ((!uncompressedData || !uncompressedData.length) && Buffer.isBuffer(input)) { if (async && callback) callback(getCompressedDataFromZip()); return getCompressedDataFromZip(); } if (uncompressedData.length && !_isDirectory) { var compressedData; switch (_entryHeader.method) { case Utils2.Constants.STORED: _entryHeader.compressedSize = _entryHeader.size; compressedData = Buffer.alloc(uncompressedData.length); uncompressedData.copy(compressedData); if (async && callback) callback(compressedData); return compressedData; default: case Utils2.Constants.DEFLATED: var deflater = new Methods.Deflater(uncompressedData); if (!async) { var deflated = deflater.deflate(); _entryHeader.compressedSize = deflated.length; return deflated; } else { deflater.deflateAsync(function(data) { compressedData = Buffer.alloc(data.length); _entryHeader.compressedSize = data.length; data.copy(compressedData); callback && callback(compressedData); }); } deflater = null; break; } } else if (async && callback) { callback(Buffer.alloc(0)); } else { return Buffer.alloc(0); } } function readUInt64LE(buffer, offset) { return (buffer.readUInt32LE(offset + 4) << 4) + buffer.readUInt32LE(offset); } function parseExtra(data) { var offset = 0; var signature, size, part; while (offset < data.length) { signature = data.readUInt16LE(offset); offset += 2; size = data.readUInt16LE(offset); offset += 2; part = data.slice(offset, offset + size); offset += size; if (Constants.ID_ZIP64 === signature) { parseZip64ExtendedInformation(part); } } } function parseZip64ExtendedInformation(data) { var size, compressedSize, offset, diskNumStart; if (data.length >= Constants.EF_ZIP64_SCOMP) { size = readUInt64LE(data, Constants.EF_ZIP64_SUNCOMP); if (_entryHeader.size === Constants.EF_ZIP64_OR_32) { _entryHeader.size = size; } } if (data.length >= Constants.EF_ZIP64_RHO) { compressedSize = readUInt64LE(data, Constants.EF_ZIP64_SCOMP); if (_entryHeader.compressedSize === Constants.EF_ZIP64_OR_32) { _entryHeader.compressedSize = compressedSize; } } if (data.length >= Constants.EF_ZIP64_DSN) { offset = readUInt64LE(data, Constants.EF_ZIP64_RHO); if (_entryHeader.offset === Constants.EF_ZIP64_OR_32) { _entryHeader.offset = offset; } } if (data.length >= Constants.EF_ZIP64_DSN + 4) { diskNumStart = data.readUInt32LE(Constants.EF_ZIP64_DSN); if (_entryHeader.diskNumStart === Constants.EF_ZIP64_OR_16) { _entryHeader.diskNumStart = diskNumStart; } } } return { get entryName() { return _entryName.toString(); }, get rawEntryName() { return _entryName; }, set entryName(val) { _entryName = Utils2.toBuffer(val); var lastChar = _entryName[_entryName.length - 1]; _isDirectory = lastChar === 47 || lastChar === 92; _entryHeader.fileNameLength = _entryName.length; }, get extra() { return _extra; }, set extra(val) { _extra = val; _entryHeader.extraLength = val.length; parseExtra(val); }, get comment() { return _comment.toString(); }, set comment(val) { _comment = Utils2.toBuffer(val); _entryHeader.commentLength = _comment.length; }, get name() { var n = _entryName.toString(); return _isDirectory ? n.substr(n.length - 1).split("/").pop() : n.split("/").pop(); }, get isDirectory() { return _isDirectory; }, getCompressedData: function() { return compress(false, null); }, getCompressedDataAsync: function(callback) { compress(true, callback); }, setData: function(value) { uncompressedData = Utils2.toBuffer(value); if (!_isDirectory && uncompressedData.length) { _entryHeader.size = uncompressedData.length; _entryHeader.method = Utils2.Constants.DEFLATED; _entryHeader.crc = Utils2.crc32(value); _entryHeader.changed = true; } else { _entryHeader.method = Utils2.Constants.STORED; } }, getData: function(pass) { if (_entryHeader.changed) { return uncompressedData; } else { return decompress(false, null, pass); } }, getDataAsync: function(callback, pass) { if (_entryHeader.changed) { callback(uncompressedData); } else { decompress(true, callback, pass); } }, set attr(attr) { _entryHeader.attr = attr; }, get attr() { return _entryHeader.attr; }, set header(data) { _entryHeader.loadFromBinary(data); }, get header() { return _entryHeader; }, packHeader: function() { var header = _entryHeader.entryHeaderToBinary(); var addpos = Utils2.Constants.CENHDR; _entryName.copy(header, addpos); addpos += _entryName.length; if (_entryHeader.extraLength) { _extra.copy(header, addpos); addpos += _entryHeader.extraLength; } if (_entryHeader.commentLength) { _comment.copy(header, addpos); } return header; }, toJSON: function() { const bytes = function(nr) { return "<" + (nr && nr.length + " bytes buffer" || "null") + ">"; }; return { entryName: this.entryName, name: this.name, comment: this.comment, isDirectory: this.isDirectory, header: _entryHeader.toJSON(), compressedData: bytes(input), data: bytes(uncompressedData) }; }, toString: function() { return JSON.stringify(this.toJSON(), null, " "); } }; }; } }); // node_modules/adm-zip/zipFile.js var require_zipFile = __commonJS({ "node_modules/adm-zip/zipFile.js"(exports, module2) { var ZipEntry = require_zipEntry(); var Headers = require_headers(); var Utils2 = require_util(); module2.exports = function(inBuffer, options) { var entryList = [], entryTable = {}, _comment = Buffer.alloc(0), mainHeader = new Headers.MainHeader(), loadedEntries = false; const opts = Object.assign(/* @__PURE__ */ Object.create(null), options); const { noSort } = opts; if (inBuffer) { readMainHeader(opts.readEntries); } else { loadedEntries = true; } function iterateEntries(callback) { const totalEntries = mainHeader.diskEntries; let index = mainHeader.offset; for (let i = 0; i < totalEntries; i++) { let tmp = index; const entry = new ZipEntry(inBuffer); entry.header = inBuffer.slice(tmp, tmp += Utils2.Constants.CENHDR); entry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength); index += entry.header.entryHeaderSize; callback(entry); } } function readEntries() { loadedEntries = true; entryTable = {}; entryList = new Array(mainHeader.diskEntries); var index = mainHeader.offset; for (var i = 0; i < entryList.length; i++) { var tmp = index, entry = new ZipEntry(inBuffer); entry.header = inBuffer.slice(tmp, tmp += Utils2.Constants.CENHDR); entry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength); if (entry.header.extraLength) { entry.extra = inBuffer.slice(tmp, tmp += entry.header.extraLength); } if (entry.header.commentLength) entry.comment = inBuffer.slice(tmp, tmp + entry.header.commentLength); index += entry.header.entryHeaderSize; entryList[i] = entry; entryTable[entry.entryName] = entry; } } function readMainHeader(readNow) { var i = inBuffer.length - Utils2.Constants.ENDHDR, max = Math.max(0, i - 65535), n = max, endStart = inBuffer.length, endOffset = -1, commentEnd = 0; for (i; i >= n; i--) { if (inBuffer[i] !== 80) continue; if (inBuffer.readUInt32LE(i) === Utils2.Constants.ENDSIG) { endOffset = i; commentEnd = i; endStart = i + Utils2.Constants.ENDHDR; n = i - Utils2.Constants.END64HDR; continue; } if (inBuffer.readUInt32LE(i) === Utils2.Constants.END64SIG) { n = max; continue; } if (inBuffer.readUInt32LE(i) === Utils2.Constants.ZIP64SIG) { endOffset = i; endStart = i + Utils2.readBigUInt64LE(inBuffer, i + Utils2.Constants.ZIP64SIZE) + Utils2.Constants.ZIP64LEAD; break; } } if (!~endOffset) throw new Error(Utils2.Errors.INVALID_FORMAT); mainHeader.loadFromBinary(inBuffer.slice(endOffset, endStart)); if (mainHeader.commentLength) { _comment = inBuffer.slice(commentEnd + Utils2.Constants.ENDHDR); } if (readNow) readEntries(); } function sortEntries() { if (entryList.length > 1 && !noSort) { entryList.sort((a, b) => a.entryName.toLowerCase().localeCompare(b.entryName.toLowerCase())); } } return { get entries() { if (!loadedEntries) { readEntries(); } return entryList; }, get comment() { return _comment.toString(); }, set comment(val) { _comment = Utils2.toBuffer(val); mainHeader.commentLength = _comment.length; }, getEntryCount: function() { if (!loadedEntries) { return mainHeader.diskEntries; } return entryList.length; }, forEach: function(callback) { if (!loadedEntries) { iterateEntries(callback); return; } entryList.forEach(callback); }, getEntry: function(entryName) { if (!loadedEntries) { readEntries(); } return entryTable[entryName] || null; }, setEntry: function(entry) { if (!loadedEntries) { readEntries(); } entryList.push(entry); entryTable[entry.entryName] = entry; mainHeader.totalEntries = entryList.length; }, deleteEntry: function(entryName) { if (!loadedEntries) { readEntries(); } var entry = entryTable[entryName]; if (entry && entry.isDirectory) { var _self = this; this.getEntryChildren(entry).forEach(function(child) { if (child.entryName !== entryName) { _self.deleteEntry(child.entryName); } }); } entryList.splice(entryList.indexOf(entry), 1); delete entryTable[entryName]; mainHeader.totalEntries = entryList.length; }, getEntryChildren: function(entry) { if (!loadedEntries) { readEntries(); } if (entry && entry.isDirectory) { const list = []; const name = entry.entryName; const len = name.length; entryList.forEach(function(zipEntry) { if (zipEntry.entryName.substr(0, len) === name) { list.push(zipEntry); } }); return list; } return []; }, compressToBuffer: function() { if (!loadedEntries) { readEntries(); } sortEntries(); const dataBlock = []; const entryHeaders = []; let totalSize = 0; let dindex = 0; mainHeader.size = 0; mainHeader.offset = 0; for (const entry of entryList) { const compressedData = entry.getCompressedData(); entry.header.offset = dindex; const dataHeader = entry.header.dataHeaderToBinary(); const entryNameLen = entry.rawEntryName.length; const postHeader = Buffer.alloc(entryNameLen + entry.extra.length); entry.rawEntryName.copy(postHeader, 0); postHeader.copy(entry.extra, entryNameLen); const dataLength = dataHeader.length + postHeader.length + compressedData.length; dindex += dataLength; dataBlock.push(dataHeader); dataBlock.push(postHeader); dataBlock.push(compressedData); const entryHeader = entry.packHeader(); entryHeaders.push(entryHeader); mainHeader.size += entryHeader.length; totalSize += dataLength + entryHeader.length; } totalSize += mainHeader.mainHeaderSize; mainHeader.offset = dindex; dindex = 0; const outBuffer = Buffer.alloc(totalSize); for (const content of dataBlock) { content.copy(outBuffer, dindex); dindex += content.length; } for (const content of entryHeaders) { content.copy(outBuffer, dindex); dindex += content.length; } const mh = mainHeader.toBinary(); if (_comment) { _comment.copy(mh, Utils2.Constants.ENDHDR); } mh.copy(outBuffer, dindex); return outBuffer; }, toAsyncBuffer: function(onSuccess, onFail, onItemStart, onItemEnd) { try { if (!loadedEntries) { readEntries(); } sortEntries(); const dataBlock = []; const entryHeaders = []; let totalSize = 0; let dindex = 0; mainHeader.size = 0; mainHeader.offset = 0; const compress2Buffer = function(entryLists) { if (entryLists.length) { const entry = entryLists.pop(); const name = entry.entryName + entry.extra.toString(); if (onItemStart) onItemStart(name); entry.getCompressedDataAsync(function(compressedData) { if (onItemEnd) onItemEnd(name); entry.header.offset = dindex; const dataHeader = entry.header.dataHeaderToBinary(); const postHeader = Buffer.alloc(name.length, name); const dataLength = dataHeader.length + postHeader.length + compressedData.length; dindex += dataLength; dataBlock.push(dataHeader); dataBlock.push(postHeader); dataBlock.push(compressedData); const entryHeader = entry.packHeader(); entryHeaders.push(entryHeader); mainHeader.size += entryHeader.length; totalSize += dataLength + entryHeader.length; compress2Buffer(entryLists); }); } else { totalSize += mainHeader.mainHeaderSize; mainHeader.offset = dindex; dindex = 0; const outBuffer = Buffer.alloc(totalSize); dataBlock.forEach(function(content) { content.copy(outBuffer, dindex); dindex += content.length; }); entryHeaders.forEach(function(content) { content.copy(outBuffer, dindex); dindex += content.length; }); const mh = mainHeader.toBinary(); if (_comment) { _comment.copy(mh, Utils2.Constants.ENDHDR); } mh.copy(outBuffer, dindex); onSuccess(outBuffer); } }; compress2Buffer(entryList); } catch (e) { onFail(e); } } }; }; } }); // node_modules/adm-zip/adm-zip.js var require_adm_zip = __commonJS({ "node_modules/adm-zip/adm-zip.js"(exports, module2) { var Utils2 = require_util(); var pth = require("path"); var ZipEntry = require_zipEntry(); var ZipFile = require_zipFile(); var get_Bool = (val, def) => typeof val === "boolean" ? val : def; var get_Str = (val, def) => typeof val === "string" ? val : def; var defaultOptions = { noSort: false, readEntries: false, method: Utils2.Constants.NONE, fs: null }; module2.exports = function(input, options) { let inBuffer = null; const opts = Object.assign(/* @__PURE__ */ Object.create(null), defaultOptions); if (input && typeof input === "object") { if (!(input instanceof Uint8Array)) { Object.assign(opts, input); input = opts.input ? opts.input : void 0; if (opts.input) delete opts.input; } if (Buffer.isBuffer(input)) { inBuffer = input; opts.method = Utils2.Constants.BUFFER; input = void 0; } } Object.assign(opts, options); const filetools = new Utils2(opts); if (input && typeof input === "string") { if (filetools.fs.existsSync(input)) { opts.method = Utils2.Constants.FILE; opts.filename = input; inBuffer = filetools.fs.readFileSync(input); } else { throw new Error(Utils2.Errors.INVALID_FILENAME); } } const _zip = new ZipFile(inBuffer, opts); const { canonical, sanitize } = Utils2; function getEntry(entry) { if (entry && _zip) { var item; if (typeof entry === "string") item = _zip.getEntry(entry); if (typeof entry === "object" && typeof entry.entryName !== "undefined" && typeof entry.header !== "undefined") item = _zip.getEntry(entry.entryName); if (item) { return item; } } return null; } function fixPath(zipPath) { const { join: join3, normalize, sep } = pth.posix; return join3(".", normalize(sep + zipPath.split("\\").join(sep) + sep)); } return { readFile: function(entry, pass) { var item = getEntry(entry); return item && item.getData(pass) || null; }, readFileAsync: function(entry, callback) { var item = getEntry(entry); if (item) { item.getDataAsync(callback); } else { callback(null, "getEntry failed for:" + entry); } }, readAsText: function(entry, encoding) { var item = getEntry(entry); if (item) { var data = item.getData(); if (data && data.length) { return data.toString(encoding || "utf8"); } } return ""; }, readAsTextAsync: function(entry, callback, encoding) { var item = getEntry(entry); if (item) { item.getDataAsync(function(data, err) { if (err) { callback(data, err); return; } if (data && data.length) { callback(data.toString(encoding || "utf8")); } else { callback(""); } }); } else { callback(""); } }, deleteFile: function(entry) { var item = getEntry(entry); if (item) { _zip.deleteEntry(item.entryName); } }, addZipComment: function(comment) { _zip.comment = comment; }, getZipComment: function() { return _zip.comment || ""; }, addZipEntryComment: function(entry, comment) { var item = getEntry(entry); if (item) { item.comment = comment; } }, getZipEntryComment: function(entry) { var item = getEntry(entry); if (item) { return item.comment || ""; } return ""; }, updateFile: function(entry, content) { var item = getEntry(entry); if (item) { item.setData(content); } }, addLocalFile: function(localPath, zipPath, zipName, comment) { if (filetools.fs.existsSync(localPath)) { zipPath = zipPath ? fixPath(zipPath) : ""; var p = localPath.split("\\").join("/").split("/").pop(); zipPath += zipName ? zipName : p; const _attr = filetools.fs.statSync(localPath); this.addFile(zipPath, filetools.fs.readFileSync(localPath), comment, _attr); } else { throw new Error(Utils2.Errors.FILE_NOT_FOUND.replace("%s", localPath)); } }, addLocalFolder: function(localPath, zipPath, filter) { if (filter instanceof RegExp) { filter = function(rx) { return function(filename) { return rx.test(filename); }; }(filter); } else if (typeof filter !== "function") { filter = function() { return true; }; } zipPath = zipPath ? fixPath(zipPath) : ""; localPath = pth.normalize(localPath); if (filetools.fs.existsSync(localPath)) { const items = filetools.findFiles(localPath); const self2 = this; if (items.length) { items.forEach(function(filepath) { var p = pth.relative(localPath, filepath).split("\\").join("/"); if (filter(p)) { var stats = filetools.fs.statSync(filepath); if (stats.isFile()) { self2.addFile(zipPath + p, filetools.fs.readFileSync(filepath), "", stats); } else { self2.addFile(zipPath + p + "/", Buffer.alloc(0), "", stats); } } }); } } else { throw new Error(Utils2.Errors.FILE_NOT_FOUND.replace("%s", localPath)); } }, addLocalFolderAsync: function(localPath, callback, zipPath, filter) { if (filter instanceof RegExp) { filter = function(rx) { return function(filename) { return rx.test(filename); }; }(filter); } else if (typeof filter !== "function") { filter = function() { return true; }; } zipPath = zipPath ? fixPath(zipPath) : ""; localPath = pth.normalize(localPath); var self2 = this; filetools.fs.open(localPath, "r", function(err) { if (err && err.code === "ENOENT") { callback(void 0, Utils2.Errors.FILE_NOT_FOUND.replace("%s", localPath)); } else if (err) { callback(void 0, err); } else { var items = filetools.findFiles(localPath); var i = -1; var next = function() { i += 1; if (i < items.length) { var filepath = items[i]; var p = pth.relative(localPath, filepath).split("\\").join("/"); p = p.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^\x20-\x7E]/g, ""); if (filter(p)) { filetools.fs.stat(filepath, function(er0, stats) { if (er0) callback(void 0, er0); if (stats.isFile()) { filetools.fs.readFile(filepath, function(er1, data) { if (er1) { callback(void 0, er1); } else { self2.addFile(zipPath + p, data, "", stats); next(); } }); } else { self2.addFile(zipPath + p + "/", Buffer.alloc(0), "", stats); next(); } }); } else { next(); } } else { callback(true, void 0); } }; next(); } }); }, addLocalFolderPromise: function(localPath, props) { return new Promise((resolve, reject) => { const { filter, zipPath } = Object.assign({}, props); this.addLocalFolderAsync(localPath, (done, err) => { if (err) reject(err); if (done) resolve(this); }, zipPath, filter); }); }, addFile: function(entryName, content, comment, attr) { let entry = getEntry(entryName); const update = entry != null; if (!update) { entry = new ZipEntry(); entry.entryName = entryName; } entry.comment = comment || ""; const isStat = typeof attr === "object" && attr instanceof filetools.fs.Stats; if (isStat) { entry.header.time = attr.mtime; } var fileattr = entry.isDirectory ? 16 : 0; if (!Utils2.isWin) { let unix = entry.isDirectory ? 16384 : 32768; if (isStat) { unix |= 4095 & attr.mode; } else if (typeof attr === "number") { unix |= 4095 & attr; } else { unix |= entry.isDirectory ? 493 : 420; } fileattr = (fileattr | unix << 16) >>> 0; } entry.attr = fileattr; entry.setData(content); if (!update) _zip.setEntry(entry); }, getEntries: function() { return _zip ? _zip.entries : []; }, getEntry: function(name) { return getEntry(name); }, getEntryCount: function() { return _zip.getEntryCount(); }, forEach: function(callback) { return _zip.forEach(callback); }, extractEntryTo: function(entry, targetPath, maintainEntryPath, overwrite, keepOriginalPermission, outFileName) { overwrite = get_Bool(overwrite, false); keepOriginalPermission = get_Bool(keepOriginalPermission, false); maintainEntryPath = get_Bool(maintainEntryPath, true); outFileName = get_Str(outFileName, get_Str(keepOriginalPermission, void 0)); var item = getEntry(entry); if (!item) { throw new Error(Utils2.Errors.NO_ENTRY); } var entryName = canonical(item.entryName); var target = sanitize(targetPath, outFileName && !item.isDirectory ? outFileName : maintainEntryPath ? entryName : pth.basename(entryName)); if (item.isDirectory) { var children = _zip.getEntryChildren(item); children.forEach(function(child) { if (child.isDirectory) return; var content2 = child.getData(); if (!content2) { throw new Error(Utils2.Errors.CANT_EXTRACT_FILE); } var name = canonical(child.entryName); var childName = sanitize(targetPath, maintainEntryPath ? name : pth.basename(name)); const fileAttr2 = keepOriginalPermission ? child.header.fileAttr : void 0; filetools.writeFileTo(childName, content2, overwrite, fileAttr2); }); return true; } var content = item.getData(); if (!content) throw new Error(Utils2.Errors.CANT_EXTRACT_FILE); if (filetools.fs.existsSync(target) && !overwrite) { throw new Error(Utils2.Errors.CANT_OVERRIDE); } const fileAttr = keepOriginalPermission ? entry.header.fileAttr : void 0; filetools.writeFileTo(target, content, overwrite, fileAttr); return true; }, test: function(pass) { if (!_zip) { return false; } for (var entry in _zip.entries) { try { if (entry.isDirectory) { continue; } var content = _zip.entries[entry].getData(pass); if (!content) { return false; } } catch (err) { return false; } } return true; }, extractAllTo: function(targetPath, overwrite, keepOriginalPermission, pass) { overwrite = get_Bool(overwrite, false); pass = get_Str(keepOriginalPermission, pass); keepOriginalPermission = get_Bool(keepOriginalPermission, false); if (!_zip) { throw new Error(Utils2.Errors.NO_ZIP); } _zip.entries.forEach(function(entry) { var entryName = sanitize(targetPath, canonical(entry.entryName.toString())); if (entry.isDirectory) { filetools.makeDir(entryName); return; } var content = entry.getData(pass); if (!content) { throw new Error(Utils2.Errors.CANT_EXTRACT_FILE); } const fileAttr = keepOriginalPermission ? entry.header.fileAttr : void 0; filetools.writeFileTo(entryName, content, overwrite, fileAttr); try { filetools.fs.utimesSync(entryName, entry.header.time, entry.header.time); } catch (err) { throw new Error(Utils2.Errors.CANT_EXTRACT_FILE); } }); }, extractAllToAsync: function(targetPath, overwrite, keepOriginalPermission, callback) { if (!callback) { callback = function() { }; } overwrite = get_Bool(overwrite, false); if (typeof keepOriginalPermission === "function" && !callback) callback = keepOriginalPermission; keepOriginalPermission = get_Bool(keepOriginalPermission, false); if (!_zip) { callback(new Error(Utils2.Errors.NO_ZIP)); return; } targetPath = pth.resolve(targetPath); const getPath = (entry) => sanitize(targetPath, pth.normalize(canonical(entry.entryName.toString()))); const getError = (msg, file) => new Error(msg + ': "' + file + '"'); const dirEntries = []; const fileEntries = /* @__PURE__ */ new Set(); _zip.entries.forEach((e) => { if (e.isDirectory) { dirEntries.push(e); } else { fileEntries.add(e); } }); for (const entry of dirEntries) { const dirPath = getPath(entry); const dirAttr = keepOriginalPermission ? entry.header.fileAttr : void 0; try { filetools.makeDir(dirPath); if (dirAttr) filetools.fs.chmodSync(dirPath, dirAttr); filetools.fs.utimesSync(dirPath, entry.header.time, entry.header.time); } catch (er) { callback(getError("Unable to create folder", dirPath)); } } const done = () => { if (fileEntries.size === 0) { callback(); } }; for (const entry of fileEntries.values()) { const entryName = pth.normalize(canonical(entry.entryName.toString())); const filePath = sanitize(targetPath, entryName); entry.getDataAsync(function(content, err_1) { if (err_1) { callback(new Error(err_1)); return; } if (!content) { callback(new Error(Utils2.Errors.CANT_EXTRACT_FILE)); } else { const fileAttr = keepOriginalPermission ? entry.header.fileAttr : void 0; filetools.writeFileToAsync(filePath, content, overwrite, fileAttr, function(succ) { if (!succ) { callback(getError("Unable to write file", filePath)); return; } filetools.fs.utimes(filePath, entry.header.time, entry.header.time, function(err_2) { if (err_2) { callback(getError("Unable to set times", filePath)); return; } fileEntries.delete(entry); done(); }); }); } }); } done(); }, writeZip: function(targetFileName, callback) { if (arguments.length === 1) { if (typeof targetFileName === "function") { callback = targetFileName; targetFileName = ""; } } if (!targetFileName && opts.filename) { targetFileName = opts.filename; } if (!targetFileName) return; var zipData = _zip.compressToBuffer(); if (zipData) { var ok = filetools.writeFileTo(targetFileName, zipData, true); if (typeof callback === "function") callback(!ok ? new Error("failed") : null, ""); } }, writeZipPromise: function(targetFileName, props) { const { overwrite, perm } = Object.assign({ overwrite: true }, props); return new Promise((resolve, reject) => { if (!targetFileName && opts.filename) targetFileName = opts.filename; if (!targetFileName) reject("ADM-ZIP: ZIP File Name Missing"); this.toBufferPromise().then((zipData) => { const ret = (done) => done ? resolve(done) : reject("ADM-ZIP: Wasn't able to write zip file"); filetools.writeFileToAsync(targetFileName, zipData, overwrite, perm, ret); }, reject); }); }, toBufferPromise: function() { return new Promise((resolve, reject) => { _zip.toAsyncBuffer(resolve, reject); }); }, toBuffer: function(onSuccess, onFail, onItemStart, onItemEnd) { this.valueOf = 2; if (typeof onSuccess === "function") { _zip.toAsyncBuffer(onSuccess, onFail, onItemStart, onItemEnd); return null; } return _zip.compressToBuffer(); } }; }; } }); // node_modules/extend/index.js var require_extend = __commonJS({ "node_modules/extend/index.js"(exports, module2) { "use strict"; var hasOwn = Object.prototype.hasOwnProperty; var toStr = Object.prototype.toString; var defineProperty = Object.defineProperty; var gOPD = Object.getOwnPropertyDescriptor; var isArray = function isArray2(arr) { if (typeof Array.isArray === "function") { return Array.isArray(arr); } return toStr.call(arr) === "[object Array]"; }; var isPlainObject = function isPlainObject2(obj) { if (!obj || toStr.call(obj) !== "[object Object]") { return false; } var hasOwnConstructor = hasOwn.call(obj, "constructor"); var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, "isPrototypeOf"); if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { return false; } var key; for (key in obj) { } return typeof key === "undefined" || hasOwn.call(obj, key); }; var setProperty = function setProperty2(target, options) { if (defineProperty && options.name === "__proto__") { defineProperty(target, options.name, { enumerable: true, configurable: true, value: options.newValue, writable: true }); } else { target[options.name] = options.newValue; } }; var getProperty = function getProperty2(obj, name) { if (name === "__proto__") { if (!hasOwn.call(obj, name)) { return void 0; } else if (gOPD) { return gOPD(obj, name).value; } } return obj[name]; }; module2.exports = function extend() { var options, name, src, copy, copyIsArray, clone; var target = arguments[0]; var i = 1; var length = arguments.length; var deep = false; if (typeof target === "boolean") { deep = target; target = arguments[1] || {}; i = 2; } if (target == null || typeof target !== "object" && typeof target !== "function") { target = {}; } for (; i < length; ++i) { options = arguments[i]; if (options != null) { for (name in options) { src = getProperty(target, name); copy = getProperty(options, name); if (target !== copy) { if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { if (copyIsArray) { copyIsArray = false; clone = src && isArray(src) ? src : []; } else { clone = src && isPlainObject(src) ? src : {}; } setProperty(target, { name, newValue: extend(deep, clone, copy) }); } else if (typeof copy !== "undefined") { setProperty(target, { name, newValue: copy }); } } } } } return target; }; } }); // node_modules/psl/data/rules.json var require_rules = __commonJS({ "node_modules/psl/data/rules.json"(exports, module2) { module2.exports = [ "ac", "com.ac", "edu.ac", "gov.ac", "net.ac", "mil.ac", "org.ac", "ad", "nom.ad", "ae", "co.ae", "net.ae", "org.ae", "sch.ae", "ac.ae", "gov.ae", "mil.ae", "aero", "accident-investigation.aero", "accident-prevention.aero", "aerobatic.aero", "aeroclub.aero", "aerodrome.aero", "agents.aero", "aircraft.aero", "airline.aero", "airport.aero", "air-surveillance.aero", "airtraffic.aero", "air-traffic-control.aero", "ambulance.aero", "amusement.aero", "association.aero", "author.aero", "ballooning.aero", "broker.aero", "caa.aero", "cargo.aero", "catering.aero", "certification.aero", "championship.aero", "charter.aero", "civilaviation.aero", "club.aero", "conference.aero", "consultant.aero", "consulting.aero", "control.aero", "council.aero", "crew.aero", "design.aero", "dgca.aero", "educator.aero", "emergency.aero", "engine.aero", "engineer.aero", "entertainment.aero", "equipment.aero", "exchange.aero", "express.aero", "federation.aero", "flight.aero", "fuel.aero", "gliding.aero", "government.aero", "groundhandling.aero", "group.aero", "hanggliding.aero", "homebuilt.aero", "insurance.aero", "journal.aero", "journalist.aero", "leasing.aero", "logistics.aero", "magazine.aero", "maintenance.aero", "media.aero", "microlight.aero", "modelling.aero", "navigation.aero", "parachuting.aero", "paragliding.aero", "passenger-association.aero", "pilot.aero", "press.aero", "production.aero", "recreation.aero", "repbody.aero", "res.aero", "research.aero", "rotorcraft.aero", "safety.aero", "scientist.aero", "services.aero", "show.aero", "skydiving.aero", "software.aero", "student.aero", "trader.aero", "trading.aero", "trainer.aero", "union.aero", "workinggroup.aero", "works.aero", "af", "gov.af", "com.af", "org.af", "net.af", "edu.af", "ag", "com.ag", "org.ag", "net.ag", "co.ag", "nom.ag", "ai", "off.ai", "com.ai", "net.ai", "org.ai", "al", "com.al", "edu.al", "gov.al", "mil.al", "net.al", "org.al", "am", "co.am", "com.am", "commune.am", "net.am", "org.am", "ao", "ed.ao", "gv.ao", "og.ao", "co.ao", "pb.ao", "it.ao", "aq", "ar", "bet.ar", "com.ar", "coop.ar", "edu.ar", "gob.ar", "gov.ar", "int.ar", "mil.ar", "musica.ar", "mutual.ar", "net.ar", "org.ar", "senasa.ar", "tur.ar", "arpa", "e164.arpa", "in-addr.arpa", "ip6.arpa", "iris.arpa", "uri.arpa", "urn.arpa", "as", "gov.as", "asia", "at", "ac.at", "co.at", "gv.at", "or.at", "sth.ac.at", "au", "com.au", "net.au", "org.au", "edu.au", "gov.au", "asn.au", "id.au", "info.au", "conf.au", "oz.au", "act.au", "nsw.au", "nt.au", "qld.au", "sa.au", "tas.au", "vic.au", "wa.au", "act.edu.au", "catholic.edu.au", "nsw.edu.au", "nt.edu.au", "qld.edu.au", "sa.edu.au", "tas.edu.au", "vic.edu.au", "wa.edu.au", "qld.gov.au", "sa.gov.au", "tas.gov.au", "vic.gov.au", "wa.gov.au", "schools.nsw.edu.au", "aw", "com.aw", "ax", "az", "com.az", "net.az", "int.az", "gov.az", "org.az", "edu.az", "info.az", "pp.az", "mil.az", "name.az", "pro.az", "biz.az", "ba", "com.ba", "edu.ba", "gov.ba", "mil.ba", "net.ba", "org.ba", "bb", "biz.bb", "co.bb", "com.bb", "edu.bb", "gov.bb", "info.bb", "net.bb", "org.bb", "store.bb", "tv.bb", "*.bd", "be", "ac.be", "bf", "gov.bf", "bg", "a.bg", "b.bg", "c.bg", "d.bg", "e.bg", "f.bg", "g.bg", "h.bg", "i.bg", "j.bg", "k.bg", "l.bg", "m.bg", "n.bg", "o.bg", "p.bg", "q.bg", "r.bg", "s.bg", "t.bg", "u.bg", "v.bg", "w.bg", "x.bg", "y.bg", "z.bg", "0.bg", "1.bg", "2.bg", "3.bg", "4.bg", "5.bg", "6.bg", "7.bg", "8.bg", "9.bg", "bh", "com.bh", "edu.bh", "net.bh", "org.bh", "gov.bh", "bi", "co.bi", "com.bi", "edu.bi", "or.bi", "org.bi", "biz", "bj", "asso.bj", "barreau.bj", "gouv.bj", "bm", "com.bm", "edu.bm", "gov.bm", "net.bm", "org.bm", "bn", "com.bn", "edu.bn", "gov.bn", "net.bn", "org.bn", "bo", "com.bo", "edu.bo", "gob.bo", "int.bo", "org.bo", "net.bo", "mil.bo", "tv.bo", "web.bo", "academia.bo", "agro.bo", "arte.bo", "blog.bo", "bolivia.bo", "ciencia.bo", "cooperativa.bo", "democracia.bo", "deporte.bo", "ecologia.bo", "economia.bo", "empresa.bo", "indigena.bo", "industria.bo", "info.bo", "medicina.bo", "movimiento.bo", "musica.bo", "natural.bo", "nombre.bo", "noticias.bo", "patria.bo", "politica.bo", "profesional.bo", "plurinacional.bo", "pueblo.bo", "revista.bo", "salud.bo", "tecnologia.bo", "tksat.bo", "transporte.bo", "wiki.bo", "br", "9guacu.br", "abc.br", "adm.br", "adv.br", "agr.br", "aju.br", "am.br", "anani.br", "aparecida.br", "app.br", "arq.br", "art.br", "ato.br", "b.br", "barueri.br", "belem.br", "bhz.br", "bib.br", "bio.br", "blog.br", "bmd.br", "boavista.br", "bsb.br", "campinagrande.br", "campinas.br", "caxias.br", "cim.br", "cng.br", "cnt.br", "com.br", "contagem.br", "coop.br", "coz.br", "cri.br", "cuiaba.br", "curitiba.br", "def.br", "des.br", "det.br", "dev.br", "ecn.br", "eco.br", "edu.br", "emp.br", "enf.br", "eng.br", "esp.br", "etc.br", "eti.br", "far.br", "feira.br", "flog.br", "floripa.br", "fm.br", "fnd.br", "fortal.br", "fot.br", "foz.br", "fst.br", "g12.br", "geo.br", "ggf.br", "goiania.br", "gov.br", "ac.gov.br", "al.gov.br", "am.gov.br", "ap.gov.br", "ba.gov.br", "ce.gov.br", "df.gov.br", "es.gov.br", "go.gov.br", "ma.gov.br", "mg.gov.br", "ms.gov.br", "mt.gov.br", "pa.gov.br", "pb.gov.br", "pe.gov.br", "pi.gov.br", "pr.gov.br", "rj.gov.br", "rn.gov.br", "ro.gov.br", "rr.gov.br", "rs.gov.br", "sc.gov.br", "se.gov.br", "sp.gov.br", "to.gov.br", "gru.br", "imb.br", "ind.br", "inf.br", "jab.br", "jampa.br", "jdf.br", "joinville.br", "jor.br", "jus.br", "leg.br", "lel.br", "log.br", "londrina.br", "macapa.br", "maceio.br", "manaus.br", "maringa.br", "mat.br", "med.br", "mil.br", "morena.br", "mp.br", "mus.br", "natal.br", "net.br", "niteroi.br", "*.nom.br", "not.br", "ntr.br", "odo.br", "ong.br", "org.br", "osasco.br", "palmas.br", "poa.br", "ppg.br", "pro.br", "psc.br", "psi.br", "pvh.br", "qsl.br", "radio.br", "rec.br", "recife.br", "rep.br", "ribeirao.br", "rio.br", "riobranco.br", "riopreto.br", "salvador.br", "sampa.br", "santamaria.br", "santoandre.br", "saobernardo.br", "saogonca.br", "seg.br", "sjc.br", "slg.br", "slz.br", "sorocaba.br", "srv.br", "taxi.br", "tc.br", "tec.br", "teo.br", "the.br", "tmp.br", "trd.br", "tur.br", "tv.br", "udi.br", "vet.br", "vix.br", "vlog.br", "wiki.br", "zlg.br", "bs", "com.bs", "net.bs", "org.bs", "edu.bs", "gov.bs", "bt", "com.bt", "edu.bt", "gov.bt", "net.bt", "org.bt", "bv", "bw", "co.bw", "org.bw", "by", "gov.by", "mil.by", "com.by", "of.by", "bz", "com.bz", "net.bz", "org.bz", "edu.bz", "gov.bz", "ca", "ab.ca", "bc.ca", "mb.ca", "nb.ca", "nf.ca", "nl.ca", "ns.ca", "nt.ca", "nu.ca", "on.ca", "pe.ca", "qc.ca", "sk.ca", "yk.ca", "gc.ca", "cat", "cc", "cd", "gov.cd", "cf", "cg", "ch", "ci", "org.ci", "or.ci", "com.ci", "co.ci", "edu.ci", "ed.ci", "ac.ci", "net.ci", "go.ci", "asso.ci", "a\xE9roport.ci", "int.ci", "presse.ci", "md.ci", "gouv.ci", "*.ck", "!www.ck", "cl", "co.cl", "gob.cl", "gov.cl", "mil.cl", "cm", "co.cm", "com.cm", "gov.cm", "net.cm", "cn", "ac.cn", "com.cn", "edu.cn", "gov.cn", "net.cn", "org.cn", "mil.cn", "\u516C\u53F8.cn", "\u7F51\u7EDC.cn", "\u7DB2\u7D61.cn", "ah.cn", "bj.cn", "cq.cn", "fj.cn", "gd.cn", "gs.cn", "gz.cn", "gx.cn", "ha.cn", "hb.cn", "he.cn", "hi.cn", "hl.cn", "hn.cn", "jl.cn", "js.cn", "jx.cn", "ln.cn", "nm.cn", "nx.cn", "qh.cn", "sc.cn", "sd.cn", "sh.cn", "sn.cn", "sx.cn", "tj.cn", "xj.cn", "xz.cn", "yn.cn", "zj.cn", "hk.cn", "mo.cn", "tw.cn", "co", "arts.co", "com.co", "edu.co", "firm.co", "gov.co", "info.co", "int.co", "mil.co", "net.co", "nom.co", "org.co", "rec.co", "web.co", "com", "coop", "cr", "ac.cr", "co.cr", "ed.cr", "fi.cr", "go.cr", "or.cr", "sa.cr", "cu", "com.cu", "edu.cu", "org.cu", "net.cu", "gov.cu", "inf.cu", "cv", "com.cv", "edu.cv", "int.cv", "nome.cv", "org.cv", "cw", "com.cw", "edu.cw", "net.cw", "org.cw", "cx", "gov.cx", "cy", "ac.cy", "biz.cy", "com.cy", "ekloges.cy", "gov.cy", "ltd.cy", "mil.cy", "net.cy", "org.cy", "press.cy", "pro.cy", "tm.cy", "cz", "de", "dj", "dk", "dm", "com.dm", "net.dm", "org.dm", "edu.dm", "gov.dm", "do", "art.do", "com.do", "edu.do", "gob.do", "gov.do", "mil.do", "net.do", "org.do", "sld.do", "web.do", "dz", "art.dz", "asso.dz", "com.dz", "edu.dz", "gov.dz", "org.dz", "net.dz", "pol.dz", "soc.dz", "tm.dz", "ec", "com.ec", "info.ec", "net.ec", "fin.ec", "k12.ec", "med.ec", "pro.ec", "org.ec", "edu.ec", "gov.ec", "gob.ec", "mil.ec", "edu", "ee", "edu.ee", "gov.ee", "riik.ee", "lib.ee", "med.ee", "com.ee", "pri.ee", "aip.ee", "org.ee", "fie.ee", "eg", "com.eg", "edu.eg", "eun.eg", "gov.eg", "mil.eg", "name.eg", "net.eg", "org.eg", "sci.eg", "*.er", "es", "com.es", "nom.es", "org.es", "gob.es", "edu.es", "et", "com.et", "gov.et", "org.et", "edu.et", "biz.et", "name.et", "info.et", "net.et", "eu", "fi", "aland.fi", "fj", "ac.fj", "biz.fj", "com.fj", "gov.fj", "info.fj", "mil.fj", "name.fj", "net.fj", "org.fj", "pro.fj", "*.fk", "com.fm", "edu.fm", "net.fm", "org.fm", "fm", "fo", "fr", "asso.fr", "com.fr", "gouv.fr", "nom.fr", "prd.fr", "tm.fr", "aeroport.fr", "avocat.fr", "avoues.fr", "cci.fr", "chambagri.fr", "chirurgiens-dentistes.fr", "experts-comptables.fr", "geometre-expert.fr", "greta.fr", "huissier-justice.fr", "medecin.fr", "notaires.fr", "pharmacien.fr", "port.fr", "veterinaire.fr", "ga", "gb", "edu.gd", "gov.gd", "gd", "ge", "com.ge", "edu.ge", "gov.ge", "org.ge", "mil.ge", "net.ge", "pvt.ge", "gf", "gg", "co.gg", "net.gg", "org.gg", "gh", "com.gh", "edu.gh", "gov.gh", "org.gh", "mil.gh", "gi", "com.gi", "ltd.gi", "gov.gi", "mod.gi", "edu.gi", "org.gi", "gl", "co.gl", "com.gl", "edu.gl", "net.gl", "org.gl", "gm", "gn", "ac.gn", "com.gn", "edu.gn", "gov.gn", "org.gn", "net.gn", "gov", "gp", "com.gp", "net.gp", "mobi.gp", "edu.gp", "org.gp", "asso.gp", "gq", "gr", "com.gr", "edu.gr", "net.gr", "org.gr", "gov.gr", "gs", "gt", "com.gt", "edu.gt", "gob.gt", "ind.gt", "mil.gt", "net.gt", "org.gt", "gu", "com.gu", "edu.gu", "gov.gu", "guam.gu", "info.gu", "net.gu", "org.gu", "web.gu", "gw", "gy", "co.gy", "com.gy", "edu.gy", "gov.gy", "net.gy", "org.gy", "hk", "com.hk", "edu.hk", "gov.hk", "idv.hk", "net.hk", "org.hk", "\u516C\u53F8.hk", "\u6559\u80B2.hk", "\u654E\u80B2.hk", "\u653F\u5E9C.hk", "\u500B\u4EBA.hk", "\u4E2A\uFFFD\uFFFD.hk", "\u7B87\u4EBA.hk", "\u7DB2\u7EDC.hk", "\u7F51\u7EDC.hk", "\u7EC4\u7E54.hk", "\u7DB2\u7D61.hk", "\u7F51\u7D61.hk", "\u7EC4\u7EC7.hk", "\u7D44\u7E54.hk", "\u7D44\u7EC7.hk", "hm", "hn", "com.hn", "edu.hn", "org.hn", "net.hn", "mil.hn", "gob.hn", "hr", "iz.hr", "from.hr", "name.hr", "com.hr", "ht", "com.ht", "shop.ht", "firm.ht", "info.ht", "adult.ht", "net.ht", "pro.ht", "org.ht", "med.ht", "art.ht", "coop.ht", "pol.ht", "asso.ht", "edu.ht", "rel.ht", "gouv.ht", "perso.ht", "hu", "co.hu", "info.hu", "org.hu", "priv.hu", "sport.hu", "tm.hu", "2000.hu", "agrar.hu", "bolt.hu", "casino.hu", "city.hu", "erotica.hu", "erotika.hu", "film.hu", "forum.hu", "games.hu", "hotel.hu", "ingatlan.hu", "jogasz.hu", "konyvelo.hu", "lakas.hu", "media.hu", "news.hu", "reklam.hu", "sex.hu", "shop.hu", "suli.hu", "szex.hu", "tozsde.hu", "utazas.hu", "video.hu", "id", "ac.id", "biz.id", "co.id", "desa.id", "go.id", "mil.id", "my.id", "net.id", "or.id", "ponpes.id", "sch.id", "web.id", "ie", "gov.ie", "il", "ac.il", "co.il", "gov.il", "idf.il", "k12.il", "muni.il", "net.il", "org.il", "im", "ac.im", "co.im", "com.im", "ltd.co.im", "net.im", "org.im", "plc.co.im", "tt.im", "tv.im", "in", "co.in", "firm.in", "net.in", "org.in", "gen.in", "ind.in", "nic.in", "ac.in", "edu.in", "res.in", "gov.in", "mil.in", "info", "int", "eu.int", "io", "com.io", "iq", "gov.iq", "edu.iq", "mil.iq", "com.iq", "org.iq", "net.iq", "ir", "ac.ir", "co.ir", "gov.ir", "id.ir", "net.ir", "org.ir", "sch.ir", "\u0627\u06CC\u0631\u0627\u0646.ir", "\u0627\u064A\u0631\u0627\u0646.ir", "is", "net.is", "com.is", "edu.is", "gov.is", "org.is", "int.is", "it", "gov.it", "edu.it", "abr.it", "abruzzo.it", "aosta-valley.it", "aostavalley.it", "bas.it", "basilicata.it", "cal.it", "calabria.it", "cam.it", "campania.it", "emilia-romagna.it", "emiliaromagna.it", "emr.it", "friuli-v-giulia.it", "friuli-ve-giulia.it", "friuli-vegiulia.it", "friuli-venezia-giulia.it", "friuli-veneziagiulia.it", "friuli-vgiulia.it", "friuliv-giulia.it", "friulive-giulia.it", "friulivegiulia.it", "friulivenezia-giulia.it", "friuliveneziagiulia.it", "friulivgiulia.it", "fvg.it", "laz.it", "lazio.it", "lig.it", "liguria.it", "lom.it", "lombardia.it", "lombardy.it", "lucania.it", "mar.it", "marche.it", "mol.it", "molise.it", "piedmont.it", "piemonte.it", "pmn.it", "pug.it", "puglia.it", "sar.it", "sardegna.it", "sardinia.it", "sic.it", "sicilia.it", "sicily.it", "taa.it", "tos.it", "toscana.it", "trentin-sud-tirol.it", "trentin-s\xFCd-tirol.it", "trentin-sudtirol.it", "trentin-s\xFCdtirol.it", "trentin-sued-tirol.it", "trentin-suedtirol.it", "trentino-a-adige.it", "trentino-aadige.it", "trentino-alto-adige.it", "trentino-altoadige.it", "trentino-s-tirol.it", "trentino-stirol.it", "trentino-sud-tirol.it", "trentino-s\xFCd-tirol.it", "trentino-sudtirol.it", "trentino-s\xFCdtirol.it", "trentino-sued-tirol.it", "trentino-suedtirol.it", "trentino.it", "trentinoa-adige.it", "trentinoaadige.it", "trentinoalto-adige.it", "trentinoaltoadige.it", "trentinos-tirol.it", "trentinostirol.it", "trentinosud-tirol.it", "trentinos\xFCd-tirol.it", "trentinosudtirol.it", "trentinos\xFCdtirol.it", "trentinosued-tirol.it", "trentinosuedtirol.it", "trentinsud-tirol.it", "trentins\xFCd-tirol.it", "trentinsudtirol.it", "trentins\xFCdtirol.it", "trentinsued-tirol.it", "trentinsuedtirol.it", "tuscany.it", "umb.it", "umbria.it", "val-d-aosta.it", "val-daosta.it", "vald-aosta.it", "valdaosta.it", "valle-aosta.it", "valle-d-aosta.it", "valle-daosta.it", "valleaosta.it", "valled-aosta.it", "valledaosta.it", "vallee-aoste.it", "vall\xE9e-aoste.it", "vallee-d-aoste.it", "vall\xE9e-d-aoste.it", "valleeaoste.it", "vall\xE9eaoste.it", "valleedaoste.it", "vall\xE9edaoste.it", "vao.it", "vda.it", "ven.it", "veneto.it", "ag.it", "agrigento.it", "al.it", "alessandria.it", "alto-adige.it", "altoadige.it", "an.it", "ancona.it", "andria-barletta-trani.it", "andria-trani-barletta.it", "andriabarlettatrani.it", "andriatranibarletta.it", "ao.it", "aosta.it", "aoste.it", "ap.it", "aq.it", "aquila.it", "ar.it", "arezzo.it", "ascoli-piceno.it", "ascolipiceno.it", "asti.it", "at.it", "av.it", "avellino.it", "ba.it", "balsan-sudtirol.it", "balsan-s\xFCdtirol.it", "balsan-suedtirol.it", "balsan.it", "bari.it", "barletta-trani-andria.it", "barlettatraniandria.it", "belluno.it", "benevento.it", "bergamo.it", "bg.it", "bi.it", "biella.it", "bl.it", "bn.it", "bo.it", "bologna.it", "bolzano-altoadige.it", "bolzano.it", "bozen-sudtirol.it", "bozen-s\xFCdtirol.it", "bozen-suedtirol.it", "bozen.it", "br.it", "brescia.it", "brindisi.it", "bs.it", "bt.it", "bulsan-sudtirol.it", "bulsan-s\xFCdtirol.it", "bulsan-suedtirol.it", "bulsan.it", "bz.it", "ca.it", "cagliari.it", "caltanissetta.it", "campidano-medio.it", "campidanomedio.it", "campobasso.it", "carbonia-iglesias.it", "carboniaiglesias.it", "carrara-massa.it", "carraramassa.it", "caserta.it", "catania.it", "catanzaro.it", "cb.it", "ce.it", "cesena-forli.it", "cesena-forl\xEC.it", "cesenaforli.it", "cesenaforl\xEC.it", "ch.it", "chieti.it", "ci.it", "cl.it", "cn.it", "co.it", "como.it", "cosenza.it", "cr.it", "cremona.it", "crotone.it", "cs.it", "ct.it", "cuneo.it", "cz.it", "dell-ogliastra.it", "dellogliastra.it", "en.it", "enna.it", "fc.it", "fe.it", "fermo.it", "ferrara.it", "fg.it", "fi.it", "firenze.it", "florence.it", "fm.it", "foggia.it", "forli-cesena.it", "forl\xEC-cesena.it", "forlicesena.it", "forl\xECcesena.it", "fr.it", "frosinone.it", "ge.it", "genoa.it", "genova.it", "go.it", "gorizia.it", "gr.it", "grosseto.it", "iglesias-carbonia.it", "iglesiascarbonia.it", "im.it", "imperia.it", "is.it", "isernia.it", "kr.it", "la-spezia.it", "laquila.it", "laspezia.it", "latina.it", "lc.it", "le.it", "lecce.it", "lecco.it", "li.it", "livorno.it", "lo.it", "lodi.it", "lt.it", "lu.it", "lucca.it", "macerata.it", "mantova.it", "massa-carrara.it", "massacarrara.it", "matera.it", "mb.it", "mc.it", "me.it", "medio-campidano.it", "mediocampidano.it", "messina.it", "mi.it", "milan.it", "milano.it", "mn.it", "mo.it", "modena.it", "monza-brianza.it", "monza-e-della-brianza.it", "monza.it", "monzabrianza.it", "monzaebrianza.it", "monzaedellabrianza.it", "ms.it", "mt.it", "na.it", "naples.it", "napoli.it", "no.it", "novara.it", "nu.it", "nuoro.it", "og.it", "ogliastra.it", "olbia-tempio.it", "olbiatempio.it", "or.it", "oristano.it", "ot.it", "pa.it", "padova.it", "padua.it", "palermo.it", "parma.it", "pavia.it", "pc.it", "pd.it", "pe.it", "perugia.it", "pesaro-urbino.it", "pesarourbino.it", "pescara.it", "pg.it", "pi.it", "piacenza.it", "pisa.it", "pistoia.it", "pn.it", "po.it", "pordenone.it", "potenza.it", "pr.it", "prato.it", "pt.it", "pu.it", "pv.it", "pz.it", "ra.it", "ragusa.it", "ravenna.it", "rc.it", "re.it", "reggio-calabria.it", "reggio-emilia.it", "reggiocalabria.it", "reggioemilia.it", "rg.it", "ri.it", "rieti.it", "rimini.it", "rm.it", "rn.it", "ro.it", "roma.it", "rome.it", "rovigo.it", "sa.it", "salerno.it", "sassari.it", "savona.it", "si.it", "siena.it", "siracusa.it", "so.it", "sondrio.it", "sp.it", "sr.it", "ss.it", "suedtirol.it", "s\xFCdtirol.it", "sv.it", "ta.it", "taranto.it", "te.it", "tempio-olbia.it", "tempioolbia.it", "teramo.it", "terni.it", "tn.it", "to.it", "torino.it", "tp.it", "tr.it", "trani-andria-barletta.it", "trani-barletta-andria.it", "traniandriabarletta.it", "tranibarlettaandria.it", "trapani.it", "trento.it", "treviso.it", "trieste.it", "ts.it", "turin.it", "tv.it", "ud.it", "udine.it", "urbino-pesaro.it", "urbinopesaro.it", "va.it", "varese.it", "vb.it", "vc.it", "ve.it", "venezia.it", "venice.it", "verbania.it", "vercelli.it", "verona.it", "vi.it", "vibo-valentia.it", "vibovalentia.it", "vicenza.it", "viterbo.it", "vr.it", "vs.it", "vt.it", "vv.it", "je", "co.je", "net.je", "org.je", "*.jm", "jo", "com.jo", "org.jo", "net.jo", "edu.jo", "sch.jo", "gov.jo", "mil.jo", "name.jo", "jobs", "jp", "ac.jp", "ad.jp", "co.jp", "ed.jp", "go.jp", "gr.jp", "lg.jp", "ne.jp", "or.jp", "aichi.jp", "akita.jp", "aomori.jp", "chiba.jp", "ehime.jp", "fukui.jp", "fukuoka.jp", "fukushima.jp", "gifu.jp", "gunma.jp", "hiroshima.jp", "hokkaido.jp", "hyogo.jp", "ibaraki.jp", "ishikawa.jp", "iwate.jp", "kagawa.jp", "kagoshima.jp", "kanagawa.jp", "kochi.jp", "kumamoto.jp", "kyoto.jp", "mie.jp", "miyagi.jp", "miyazaki.jp", "nagano.jp", "nagasaki.jp", "nara.jp", "niigata.jp", "oita.jp", "okayama.jp", "okinawa.jp", "osaka.jp", "saga.jp", "saitama.jp", "shiga.jp", "shimane.jp", "shizuoka.jp", "tochigi.jp", "tokushima.jp", "tokyo.jp", "tottori.jp", "toyama.jp", "wakayama.jp", "yamagata.jp", "yamaguchi.jp", "yamanashi.jp", "\u6803\u6728.jp", "\u611B\u77E5.jp", "\u611B\u5A9B.jp", "\u5175\u5EAB.jp", "\u718A\u672C.jp", "\u8328\u57CE.jp", "\u5317\u6D77\u9053.jp", "\u5343\u8449.jp", "\u548C\u6B4C\u5C71.jp", "\u9577\u5D0E.jp", "\u9577\u91CE.jp", "\u65B0\u6F5F.jp", "\u9752\u68EE.jp", "\u9759\u5CA1.jp", "\u6771\u4EAC.jp", "\u77F3\u5DDD.jp", "\u57FC\u7389.jp", "\u4E09\u91CD.jp", "\u4EAC\u90FD.jp", "\u4F50\u8CC0.jp", "\u5927\u5206.jp", "\u5927\u962A.jp", "\u5948\u826F.jp", "\u5BAE\u57CE.jp", "\u5BAE\u5D0E.jp", "\u5BCC\u5C71.jp", "\u5C71\u53E3.jp", "\u5C71\u5F62.jp", "\u5C71\u68A8.jp", "\u5CA9\u624B.jp", "\u5C90\u961C.jp", "\u5CA1\u5C71.jp", "\u5CF6\u6839.jp", "\u5E83\u5CF6.jp", "\u5FB3\u5CF6.jp", "\u6C96\u7E04.jp", "\u6ECB\u8CC0.jp", "\u795E\u5948\u5DDD.jp", "\u798F\u4E95.jp", "\u798F\u5CA1.jp", "\u798F\u5CF6.jp", "\u79CB\u7530.jp", "\u7FA4\u99AC.jp", "\u9999\u5DDD.jp", "\u9AD8\u77E5.jp", "\u9CE5\u53D6.jp", "\u9E7F\u5150\u5CF6.jp", "*.kawasaki.jp", "*.kitakyushu.jp", "*.kobe.jp", "*.nagoya.jp", "*.sapporo.jp", "*.sendai.jp", "*.yokohama.jp", "!city.kawasaki.jp", "!city.kitakyushu.jp", "!city.kobe.jp", "!city.nagoya.jp", "!city.sapporo.jp", "!city.sendai.jp", "!city.yokohama.jp", "aisai.aichi.jp", "ama.aichi.jp", "anjo.aichi.jp", "asuke.aichi.jp", "chiryu.aichi.jp", "chita.aichi.jp", "fuso.aichi.jp", "gamagori.aichi.jp", "handa.aichi.jp", "hazu.aichi.jp", "hekinan.aichi.jp", "higashiura.aichi.jp", "ichinomiya.aichi.jp", "inazawa.aichi.jp", "inuyama.aichi.jp", "isshiki.aichi.jp", "iwakura.aichi.jp", "kanie.aichi.jp", "kariya.aichi.jp", "kasugai.aichi.jp", "kira.aichi.jp", "kiyosu.aichi.jp", "komaki.aichi.jp", "konan.aichi.jp", "kota.aichi.jp", "mihama.aichi.jp", "miyoshi.aichi.jp", "nishio.aichi.jp", "nisshin.aichi.jp", "obu.aichi.jp", "oguchi.aichi.jp", "oharu.aichi.jp", "okazaki.aichi.jp", "owariasahi.aichi.jp", "seto.aichi.jp", "shikatsu.aichi.jp", "shinshiro.aichi.jp", "shitara.aichi.jp", "tahara.aichi.jp", "takahama.aichi.jp", "tobishima.aichi.jp", "toei.aichi.jp", "togo.aichi.jp", "tokai.aichi.jp", "tokoname.aichi.jp", "toyoake.aichi.jp", "toyohashi.aichi.jp", "toyokawa.aichi.jp", "toyone.aichi.jp", "toyota.aichi.jp", "tsushima.aichi.jp", "yatomi.aichi.jp", "akita.akita.jp", "daisen.akita.jp", "fujisato.akita.jp", "gojome.akita.jp", "hachirogata.akita.jp", "happou.akita.jp", "higashinaruse.akita.jp", "honjo.akita.jp", "honjyo.akita.jp", "ikawa.akita.jp", "kamikoani.akita.jp", "kamioka.akita.jp", "katagami.akita.jp", "kazuno.akita.jp", "kitaakita.akita.jp", "kosaka.akita.jp", "kyowa.akita.jp", "misato.akita.jp", "mitane.akita.jp", "moriyoshi.akita.jp", "nikaho.akita.jp", "noshiro.akita.jp", "odate.akita.jp", "oga.akita.jp", "ogata.akita.jp", "semboku.akita.jp", "yokote.akita.jp", "yurihonjo.akita.jp", "aomori.aomori.jp", "gonohe.aomori.jp", "hachinohe.aomori.jp", "hashikami.aomori.jp", "hiranai.aomori.jp", "hirosaki.aomori.jp", "itayanagi.aomori.jp", "kuroishi.aomori.jp", "misawa.aomori.jp", "mutsu.aomori.jp", "nakadomari.aomori.jp", "noheji.aomori.jp", "oirase.aomori.jp", "owani.aomori.jp", "rokunohe.aomori.jp", "sannohe.aomori.jp", "shichinohe.aomori.jp", "shingo.aomori.jp", "takko.aomori.jp", "towada.aomori.jp", "tsugaru.aomori.jp", "tsuruta.aomori.jp", "abiko.chiba.jp", "asahi.chiba.jp", "chonan.chiba.jp", "chosei.chiba.jp", "choshi.chiba.jp", "chuo.chiba.jp", "funabashi.chiba.jp", "futtsu.chiba.jp", "hanamigawa.chiba.jp", "ichihara.chiba.jp", "ichikawa.chiba.jp", "ichinomiya.chiba.jp", "inzai.chiba.jp", "isumi.chiba.jp", "kamagaya.chiba.jp", "kamogawa.chiba.jp", "kashiwa.chiba.jp", "katori.chiba.jp", "katsuura.chiba.jp", "kimitsu.chiba.jp", "kisarazu.chiba.jp", "kozaki.chiba.jp", "kujukuri.chiba.jp", "kyonan.chiba.jp", "matsudo.chiba.jp", "midori.chiba.jp", "mihama.chiba.jp", "minamiboso.chiba.jp", "mobara.chiba.jp", "mutsuzawa.chiba.jp", "nagara.chiba.jp", "nagareyama.chiba.jp", "narashino.chiba.jp", "narita.chiba.jp", "noda.chiba.jp", "oamishirasato.chiba.jp", "omigawa.chiba.jp", "onjuku.chiba.jp", "otaki.chiba.jp", "sakae.chiba.jp", "sakura.chiba.jp", "shimofusa.chiba.jp", "shirako.chiba.jp", "shiroi.chiba.jp", "shisui.chiba.jp", "sodegaura.chiba.jp", "sosa.chiba.jp", "tako.chiba.jp", "tateyama.chiba.jp", "togane.chiba.jp", "tohnosho.chiba.jp", "tomisato.chiba.jp", "urayasu.chiba.jp", "yachimata.chiba.jp", "yachiyo.chiba.jp", "yokaichiba.chiba.jp", "yokoshibahikari.chiba.jp", "yotsukaido.chiba.jp", "ainan.ehime.jp", "honai.ehime.jp", "ikata.ehime.jp", "imabari.ehime.jp", "iyo.ehime.jp", "kamijima.ehime.jp", "kihoku.ehime.jp", "kumakogen.ehime.jp", "masaki.ehime.jp", "matsuno.ehime.jp", "matsuyama.ehime.jp", "namikata.ehime.jp", "niihama.ehime.jp", "ozu.ehime.jp", "saijo.ehime.jp", "seiyo.ehime.jp", "shikokuchuo.ehime.jp", "tobe.ehime.jp", "toon.ehime.jp", "uchiko.ehime.jp", "uwajima.ehime.jp", "yawatahama.ehime.jp", "echizen.fukui.jp", "eiheiji.fukui.jp", "fukui.fukui.jp", "ikeda.fukui.jp", "katsuyama.fukui.jp", "mihama.fukui.jp", "minamiechizen.fukui.jp", "obama.fukui.jp", "ohi.fukui.jp", "ono.fukui.jp", "sabae.fukui.jp", "sakai.fukui.jp", "takahama.fukui.jp", "tsuruga.fukui.jp", "wakasa.fukui.jp", "ashiya.fukuoka.jp", "buzen.fukuoka.jp", "chikugo.fukuoka.jp", "chikuho.fukuoka.jp", "chikujo.fukuoka.jp", "chikushino.fukuoka.jp", "chikuzen.fukuoka.jp", "chuo.fukuoka.jp", "dazaifu.fukuoka.jp", "fukuchi.fukuoka.jp", "hakata.fukuoka.jp", "higashi.fukuoka.jp", "hirokawa.fukuoka.jp", "hisayama.fukuoka.jp", "iizuka.fukuoka.jp", "inatsuki.fukuoka.jp", "kaho.fukuoka.jp", "kasuga.fukuoka.jp", "kasuya.fukuoka.jp", "kawara.fukuoka.jp", "keisen.fukuoka.jp", "koga.fukuoka.jp", "kurate.fukuoka.jp", "kurogi.fukuoka.jp", "kurume.fukuoka.jp", "minami.fukuoka.jp", "miyako.fukuoka.jp", "miyama.fukuoka.jp", "miyawaka.fukuoka.jp", "mizumaki.fukuoka.jp", "munakata.fukuoka.jp", "nakagawa.fukuoka.jp", "nakama.fukuoka.jp", "nishi.fukuoka.jp", "nogata.fukuoka.jp", "ogori.fukuoka.jp", "okagaki.fukuoka.jp", "okawa.fukuoka.jp", "oki.fukuoka.jp", "omuta.fukuoka.jp", "onga.fukuoka.jp", "onojo.fukuoka.jp", "oto.fukuoka.jp", "saigawa.fukuoka.jp", "sasaguri.fukuoka.jp", "shingu.fukuoka.jp", "shinyoshitomi.fukuoka.jp", "shonai.fukuoka.jp", "soeda.fukuoka.jp", "sue.fukuoka.jp", "tachiarai.fukuoka.jp", "tagawa.fukuoka.jp", "takata.fukuoka.jp", "toho.fukuoka.jp", "toyotsu.fukuoka.jp", "tsuiki.fukuoka.jp", "ukiha.fukuoka.jp", "umi.fukuoka.jp", "usui.fukuoka.jp", "yamada.fukuoka.jp", "yame.fukuoka.jp", "yanagawa.fukuoka.jp", "yukuhashi.fukuoka.jp", "aizubange.fukushima.jp", "aizumisato.fukushima.jp", "aizuwakamatsu.fukushima.jp", "asakawa.fukushima.jp", "bandai.fukushima.jp", "date.fukushima.jp", "fukushima.fukushima.jp", "furudono.fukushima.jp", "futaba.fukushima.jp", "hanawa.fukushima.jp", "higashi.fukushima.jp", "hirata.fukushima.jp", "hirono.fukushima.jp", "iitate.fukushima.jp", "inawashiro.fukushima.jp", "ishikawa.fukushima.jp", "iwaki.fukushima.jp", "izumizaki.fukushima.jp", "kagamiishi.fukushima.jp", "kaneyama.fukushima.jp", "kawamata.fukushima.jp", "kitakata.fukushima.jp", "kitashiobara.fukushima.jp", "koori.fukushima.jp", "koriyama.fukushima.jp", "kunimi.fukushima.jp", "miharu.fukushima.jp", "mishima.fukushima.jp", "namie.fukushima.jp", "nango.fukushima.jp", "nishiaizu.fukushima.jp", "nishigo.fukushima.jp", "okuma.fukushima.jp", "omotego.fukushima.jp", "ono.fukushima.jp", "otama.fukushima.jp", "samegawa.fukushima.jp", "shimogo.fukushima.jp", "shirakawa.fukushima.jp", "showa.fukushima.jp", "soma.fukushima.jp", "sukagawa.fukushima.jp", "taishin.fukushima.jp", "tamakawa.fukushima.jp", "tanagura.fukushima.jp", "tenei.fukushima.jp", "yabuki.fukushima.jp", "yamato.fukushima.jp", "yamatsuri.fukushima.jp", "yanaizu.fukushima.jp", "yugawa.fukushima.jp", "anpachi.gifu.jp", "ena.gifu.jp", "gifu.gifu.jp", "ginan.gifu.jp", "godo.gifu.jp", "gujo.gifu.jp", "hashima.gifu.jp", "hichiso.gifu.jp", "hida.gifu.jp", "higashishirakawa.gifu.jp", "ibigawa.gifu.jp", "ikeda.gifu.jp", "kakamigahara.gifu.jp", "kani.gifu.jp", "kasahara.gifu.jp", "kasamatsu.gifu.jp", "kawaue.gifu.jp", "kitagata.gifu.jp", "mino.gifu.jp", "minokamo.gifu.jp", "mitake.gifu.jp", "mizunami.gifu.jp", "motosu.gifu.jp", "nakatsugawa.gifu.jp", "ogaki.gifu.jp", "sakahogi.gifu.jp", "seki.gifu.jp", "sekigahara.gifu.jp", "shirakawa.gifu.jp", "tajimi.gifu.jp", "takayama.gifu.jp", "tarui.gifu.jp", "toki.gifu.jp", "tomika.gifu.jp", "wanouchi.gifu.jp", "yamagata.gifu.jp", "yaotsu.gifu.jp", "yoro.gifu.jp", "annaka.gunma.jp", "chiyoda.gunma.jp", "fujioka.gunma.jp", "higashiagatsuma.gunma.jp", "isesaki.gunma.jp", "itakura.gunma.jp", "kanna.gunma.jp", "kanra.gunma.jp", "katashina.gunma.jp", "kawaba.gunma.jp", "kiryu.gunma.jp", "kusatsu.gunma.jp", "maebashi.gunma.jp", "meiwa.gunma.jp", "midori.gunma.jp", "minakami.gunma.jp", "naganohara.gunma.jp", "nakanojo.gunma.jp", "nanmoku.gunma.jp", "numata.gunma.jp", "oizumi.gunma.jp", "ora.gunma.jp", "ota.gunma.jp", "shibukawa.gunma.jp", "shimonita.gunma.jp", "shinto.gunma.jp", "showa.gunma.jp", "takasaki.gunma.jp", "takayama.gunma.jp", "tamamura.gunma.jp", "tatebayashi.gunma.jp", "tomioka.gunma.jp", "tsukiyono.gunma.jp", "tsumagoi.gunma.jp", "ueno.gunma.jp", "yoshioka.gunma.jp", "asaminami.hiroshima.jp", "daiwa.hiroshima.jp", "etajima.hiroshima.jp", "fuchu.hiroshima.jp", "fukuyama.hiroshima.jp", "hatsukaichi.hiroshima.jp", "higashihiroshima.hiroshima.jp", "hongo.hiroshima.jp", "jinsekikogen.hiroshima.jp", "kaita.hiroshima.jp", "kui.hiroshima.jp", "kumano.hiroshima.jp", "kure.hiroshima.jp", "mihara.hiroshima.jp", "miyoshi.hiroshima.jp", "naka.hiroshima.jp", "onomichi.hiroshima.jp", "osakikamijima.hiroshima.jp", "otake.hiroshima.jp", "saka.hiroshima.jp", "sera.hiroshima.jp", "seranishi.hiroshima.jp", "shinichi.hiroshima.jp", "shobara.hiroshima.jp", "takehara.hiroshima.jp", "abashiri.hokkaido.jp", "abira.hokkaido.jp", "aibetsu.hokkaido.jp", "akabira.hokkaido.jp", "akkeshi.hokkaido.jp", "asahikawa.hokkaido.jp", "ashibetsu.hokkaido.jp", "ashoro.hokkaido.jp", "assabu.hokkaido.jp", "atsuma.hokkaido.jp", "bibai.hokkaido.jp", "biei.hokkaido.jp", "bifuka.hokkaido.jp", "bihoro.hokkaido.jp", "biratori.hokkaido.jp", "chippubetsu.hokkaido.jp", "chitose.hokkaido.jp", "date.hokkaido.jp", "ebetsu.hokkaido.jp", "embetsu.hokkaido.jp", "eniwa.hokkaido.jp", "erimo.hokkaido.jp", "esan.hokkaido.jp", "esashi.hokkaido.jp", "fukagawa.hokkaido.jp", "fukushima.hokkaido.jp", "furano.hokkaido.jp", "furubira.hokkaido.jp", "haboro.hokkaido.jp", "hakodate.hokkaido.jp", "hamatonbetsu.hokkaido.jp", "hidaka.hokkaido.jp", "higashikagura.hokkaido.jp", "higashikawa.hokkaido.jp", "hiroo.hokkaido.jp", "hokuryu.hokkaido.jp", "hokuto.hokkaido.jp", "honbetsu.hokkaido.jp", "horokanai.hokkaido.jp", "horonobe.hokkaido.jp", "ikeda.hokkaido.jp", "imakane.hokkaido.jp", "ishikari.hokkaido.jp", "iwamizawa.hokkaido.jp", "iwanai.hokkaido.jp", "kamifurano.hokkaido.jp", "kamikawa.hokkaido.jp", "kamishihoro.hokkaido.jp", "kamisunagawa.hokkaido.jp", "kamoenai.hokkaido.jp", "kayabe.hokkaido.jp", "kembuchi.hokkaido.jp", "kikonai.hokkaido.jp", "kimobetsu.hokkaido.jp", "kitahiroshima.hokkaido.jp", "kitami.hokkaido.jp", "kiyosato.hokkaido.jp", "koshimizu.hokkaido.jp", "kunneppu.hokkaido.jp", "kuriyama.hokkaido.jp", "kuromatsunai.hokkaido.jp", "kushiro.hokkaido.jp", "kutchan.hokkaido.jp", "kyowa.hokkaido.jp", "mashike.hokkaido.jp", "matsumae.hokkaido.jp", "mikasa.hokkaido.jp", "minamifurano.hokkaido.jp", "mombetsu.hokkaido.jp", "moseushi.hokkaido.jp", "mukawa.hokkaido.jp", "muroran.hokkaido.jp", "naie.hokkaido.jp", "nakagawa.hokkaido.jp", "nakasatsunai.hokkaido.jp", "nakatombetsu.hokkaido.jp", "nanae.hokkaido.jp", "nanporo.hokkaido.jp", "nayoro.hokkaido.jp", "nemuro.hokkaido.jp", "niikappu.hokkaido.jp", "niki.hokkaido.jp", "nishiokoppe.hokkaido.jp", "noboribetsu.hokkaido.jp", "numata.hokkaido.jp", "obihiro.hokkaido.jp", "obira.hokkaido.jp", "oketo.hokkaido.jp", "okoppe.hokkaido.jp", "otaru.hokkaido.jp", "otobe.hokkaido.jp", "otofuke.hokkaido.jp", "otoineppu.hokkaido.jp", "oumu.hokkaido.jp", "ozora.hokkaido.jp", "pippu.hokkaido.jp", "rankoshi.hokkaido.jp", "rebun.hokkaido.jp", "rikubetsu.hokkaido.jp", "rishiri.hokkaido.jp", "rishirifuji.hokkaido.jp", "saroma.hokkaido.jp", "sarufutsu.hokkaido.jp", "shakotan.hokkaido.jp", "shari.hokkaido.jp", "shibecha.hokkaido.jp", "shibetsu.hokkaido.jp", "shikabe.hokkaido.jp", "shikaoi.hokkaido.jp", "shimamaki.hokkaido.jp", "shimizu.hokkaido.jp", "shimokawa.hokkaido.jp", "shinshinotsu.hokkaido.jp", "shintoku.hokkaido.jp", "shiranuka.hokkaido.jp", "shiraoi.hokkaido.jp", "shiriuchi.hokkaido.jp", "sobetsu.hokkaido.jp", "sunagawa.hokkaido.jp", "taiki.hokkaido.jp", "takasu.hokkaido.jp", "takikawa.hokkaido.jp", "takinoue.hokkaido.jp", "teshikaga.hokkaido.jp", "tobetsu.hokkaido.jp", "tohma.hokkaido.jp", "tomakomai.hokkaido.jp", "tomari.hokkaido.jp", "toya.hokkaido.jp", "toyako.hokkaido.jp", "toyotomi.hokkaido.jp", "toyoura.hokkaido.jp", "tsubetsu.hokkaido.jp", "tsukigata.hokkaido.jp", "urakawa.hokkaido.jp", "urausu.hokkaido.jp", "uryu.hokkaido.jp", "utashinai.hokkaido.jp", "wakkanai.hokkaido.jp", "wassamu.hokkaido.jp", "yakumo.hokkaido.jp", "yoichi.hokkaido.jp", "aioi.hyogo.jp", "akashi.hyogo.jp", "ako.hyogo.jp", "amagasaki.hyogo.jp", "aogaki.hyogo.jp", "asago.hyogo.jp", "ashiya.hyogo.jp", "awaji.hyogo.jp", "fukusaki.hyogo.jp", "goshiki.hyogo.jp", "harima.hyogo.jp", "himeji.hyogo.jp", "ichikawa.hyogo.jp", "inagawa.hyogo.jp", "itami.hyogo.jp", "kakogawa.hyogo.jp", "kamigori.hyogo.jp", "kamikawa.hyogo.jp", "kasai.hyogo.jp", "kasuga.hyogo.jp", "kawanishi.hyogo.jp", "miki.hyogo.jp", "minamiawaji.hyogo.jp", "nishinomiya.hyogo.jp", "nishiwaki.hyogo.jp", "ono.hyogo.jp", "sanda.hyogo.jp", "sannan.hyogo.jp", "sasayama.hyogo.jp", "sayo.hyogo.jp", "shingu.hyogo.jp", "shinonsen.hyogo.jp", "shiso.hyogo.jp", "sumoto.hyogo.jp", "taishi.hyogo.jp", "taka.hyogo.jp", "takarazuka.hyogo.jp", "takasago.hyogo.jp", "takino.hyogo.jp", "tamba.hyogo.jp", "tatsuno.hyogo.jp", "toyooka.hyogo.jp", "yabu.hyogo.jp", "yashiro.hyogo.jp", "yoka.hyogo.jp", "yokawa.hyogo.jp", "ami.ibaraki.jp", "asahi.ibaraki.jp", "bando.ibaraki.jp", "chikusei.ibaraki.jp", "daigo.ibaraki.jp", "fujishiro.ibaraki.jp", "hitachi.ibaraki.jp", "hitachinaka.ibaraki.jp", "hitachiomiya.ibaraki.jp", "hitachiota.ibaraki.jp", "ibaraki.ibaraki.jp", "ina.ibaraki.jp", "inashiki.ibaraki.jp", "itako.ibaraki.jp", "iwama.ibaraki.jp", "joso.ibaraki.jp", "kamisu.ibaraki.jp", "kasama.ibaraki.jp", "kashima.ibaraki.jp", "kasumigaura.ibaraki.jp", "koga.ibaraki.jp", "miho.ibaraki.jp", "mito.ibaraki.jp", "moriya.ibaraki.jp", "naka.ibaraki.jp", "namegata.ibaraki.jp", "oarai.ibaraki.jp", "ogawa.ibaraki.jp", "omitama.ibaraki.jp", "ryugasaki.ibaraki.jp", "sakai.ibaraki.jp", "sakuragawa.ibaraki.jp", "shimodate.ibaraki.jp", "shimotsuma.ibaraki.jp", "shirosato.ibaraki.jp", "sowa.ibaraki.jp", "suifu.ibaraki.jp", "takahagi.ibaraki.jp", "tamatsukuri.ibaraki.jp", "tokai.ibaraki.jp", "tomobe.ibaraki.jp", "tone.ibaraki.jp", "toride.ibaraki.jp", "tsuchiura.ibaraki.jp", "tsukuba.ibaraki.jp", "uchihara.ibaraki.jp", "ushiku.ibaraki.jp", "yachiyo.ibaraki.jp", "yamagata.ibaraki.jp", "yawara.ibaraki.jp", "yuki.ibaraki.jp", "anamizu.ishikawa.jp", "hakui.ishikawa.jp", "hakusan.ishikawa.jp", "kaga.ishikawa.jp", "kahoku.ishikawa.jp", "kanazawa.ishikawa.jp", "kawakita.ishikawa.jp", "komatsu.ishikawa.jp", "nakanoto.ishikawa.jp", "nanao.ishikawa.jp", "nomi.ishikawa.jp", "nonoichi.ishikawa.jp", "noto.ishikawa.jp", "shika.ishikawa.jp", "suzu.ishikawa.jp", "tsubata.ishikawa.jp", "tsurugi.ishikawa.jp", "uchinada.ishikawa.jp", "wajima.ishikawa.jp", "fudai.iwate.jp", "fujisawa.iwate.jp", "hanamaki.iwate.jp", "hiraizumi.iwate.jp", "hirono.iwate.jp", "ichinohe.iwate.jp", "ichinoseki.iwate.jp", "iwaizumi.iwate.jp", "iwate.iwate.jp", "joboji.iwate.jp", "kamaishi.iwate.jp", "kanegasaki.iwate.jp", "karumai.iwate.jp", "kawai.iwate.jp", "kitakami.iwate.jp", "kuji.iwate.jp", "kunohe.iwate.jp", "kuzumaki.iwate.jp", "miyako.iwate.jp", "mizusawa.iwate.jp", "morioka.iwate.jp", "ninohe.iwate.jp", "noda.iwate.jp", "ofunato.iwate.jp", "oshu.iwate.jp", "otsuchi.iwate.jp", "rikuzentakata.iwate.jp", "shiwa.iwate.jp", "shizukuishi.iwate.jp", "sumita.iwate.jp", "tanohata.iwate.jp", "tono.iwate.jp", "yahaba.iwate.jp", "yamada.iwate.jp", "ayagawa.kagawa.jp", "higashikagawa.kagawa.jp", "kanonji.kagawa.jp", "kotohira.kagawa.jp", "manno.kagawa.jp", "marugame.kagawa.jp", "mitoyo.kagawa.jp", "naoshima.kagawa.jp", "sanuki.kagawa.jp", "tadotsu.kagawa.jp", "takamatsu.kagawa.jp", "tonosho.kagawa.jp", "uchinomi.kagawa.jp", "utazu.kagawa.jp", "zentsuji.kagawa.jp", "akune.kagoshima.jp", "amami.kagoshima.jp", "hioki.kagoshima.jp", "isa.kagoshima.jp", "isen.kagoshima.jp", "izumi.kagoshima.jp", "kagoshima.kagoshima.jp", "kanoya.kagoshima.jp", "kawanabe.kagoshima.jp", "kinko.kagoshima.jp", "kouyama.kagoshima.jp", "makurazaki.kagoshima.jp", "matsumoto.kagoshima.jp", "minamitane.kagoshima.jp", "nakatane.kagoshima.jp", "nishinoomote.kagoshima.jp", "satsumasendai.kagoshima.jp", "soo.kagoshima.jp", "tarumizu.kagoshima.jp", "yusui.kagoshima.jp", "aikawa.kanagawa.jp", "atsugi.kanagawa.jp", "ayase.kanagawa.jp", "chigasaki.kanagawa.jp", "ebina.kanagawa.jp", "fujisawa.kanagawa.jp", "hadano.kanagawa.jp", "hakone.kanagawa.jp", "hiratsuka.kanagawa.jp", "isehara.kanagawa.jp", "kaisei.kanagawa.jp", "kamakura.kanagawa.jp", "kiyokawa.kanagawa.jp", "matsuda.kanagawa.jp", "minamiashigara.kanagawa.jp", "miura.kanagawa.jp", "nakai.kanagawa.jp", "ninomiya.kanagawa.jp", "odawara.kanagawa.jp", "oi.kanagawa.jp", "oiso.kanagawa.jp", "sagamihara.kanagawa.jp", "samukawa.kanagawa.jp", "tsukui.kanagawa.jp", "yamakita.kanagawa.jp", "yamato.kanagawa.jp", "yokosuka.kanagawa.jp", "yugawara.kanagawa.jp", "zama.kanagawa.jp", "zushi.kanagawa.jp", "aki.kochi.jp", "geisei.kochi.jp", "hidaka.kochi.jp", "higashitsuno.kochi.jp", "ino.kochi.jp", "kagami.kochi.jp", "kami.kochi.jp", "kitagawa.kochi.jp", "kochi.kochi.jp", "mihara.kochi.jp", "motoyama.kochi.jp", "muroto.kochi.jp", "nahari.kochi.jp", "nakamura.kochi.jp", "nankoku.kochi.jp", "nishitosa.kochi.jp", "niyodogawa.kochi.jp", "ochi.kochi.jp", "okawa.kochi.jp", "otoyo.kochi.jp", "otsuki.kochi.jp", "sakawa.kochi.jp", "sukumo.kochi.jp", "susaki.kochi.jp", "tosa.kochi.jp", "tosashimizu.kochi.jp", "toyo.kochi.jp", "tsuno.kochi.jp", "umaji.kochi.jp", "yasuda.kochi.jp", "yusuhara.kochi.jp", "amakusa.kumamoto.jp", "arao.kumamoto.jp", "aso.kumamoto.jp", "choyo.kumamoto.jp", "gyokuto.kumamoto.jp", "kamiamakusa.kumamoto.jp", "kikuchi.kumamoto.jp", "kumamoto.kumamoto.jp", "mashiki.kumamoto.jp", "mifune.kumamoto.jp", "minamata.kumamoto.jp", "minamioguni.kumamoto.jp", "nagasu.kumamoto.jp", "nishihara.kumamoto.jp", "oguni.kumamoto.jp", "ozu.kumamoto.jp", "sumoto.kumamoto.jp", "takamori.kumamoto.jp", "uki.kumamoto.jp", "uto.kumamoto.jp", "yamaga.kumamoto.jp", "yamato.kumamoto.jp", "yatsushiro.kumamoto.jp", "ayabe.kyoto.jp", "fukuchiyama.kyoto.jp", "higashiyama.kyoto.jp", "ide.kyoto.jp", "ine.kyoto.jp", "joyo.kyoto.jp", "kameoka.kyoto.jp", "kamo.kyoto.jp", "kita.kyoto.jp", "kizu.kyoto.jp", "kumiyama.kyoto.jp", "kyotamba.kyoto.jp", "kyotanabe.kyoto.jp", "kyotango.kyoto.jp", "maizuru.kyoto.jp", "minami.kyoto.jp", "minamiyamashiro.kyoto.jp", "miyazu.kyoto.jp", "muko.kyoto.jp", "nagaokakyo.kyoto.jp", "nakagyo.kyoto.jp", "nantan.kyoto.jp", "oyamazaki.kyoto.jp", "sakyo.kyoto.jp", "seika.kyoto.jp", "tanabe.kyoto.jp", "uji.kyoto.jp", "ujitawara.kyoto.jp", "wazuka.kyoto.jp", "yamashina.kyoto.jp", "yawata.kyoto.jp", "asahi.mie.jp", "inabe.mie.jp", "ise.mie.jp", "kameyama.mie.jp", "kawagoe.mie.jp", "kiho.mie.jp", "kisosaki.mie.jp", "kiwa.mie.jp", "komono.mie.jp", "kumano.mie.jp", "kuwana.mie.jp", "matsusaka.mie.jp", "meiwa.mie.jp", "mihama.mie.jp", "minamiise.mie.jp", "misugi.mie.jp", "miyama.mie.jp", "nabari.mie.jp", "shima.mie.jp", "suzuka.mie.jp", "tado.mie.jp", "taiki.mie.jp", "taki.mie.jp", "tamaki.mie.jp", "toba.mie.jp", "tsu.mie.jp", "udono.mie.jp", "ureshino.mie.jp", "watarai.mie.jp", "yokkaichi.mie.jp", "furukawa.miyagi.jp", "higashimatsushima.miyagi.jp", "ishinomaki.miyagi.jp", "iwanuma.miyagi.jp", "kakuda.miyagi.jp", "kami.miyagi.jp", "kawasaki.miyagi.jp", "marumori.miyagi.jp", "matsushima.miyagi.jp", "minamisanriku.miyagi.jp", "misato.miyagi.jp", "murata.miyagi.jp", "natori.miyagi.jp", "ogawara.miyagi.jp", "ohira.miyagi.jp", "onagawa.miyagi.jp", "osaki.miyagi.jp", "rifu.miyagi.jp", "semine.miyagi.jp", "shibata.miyagi.jp", "shichikashuku.miyagi.jp", "shikama.miyagi.jp", "shiogama.miyagi.jp", "shiroishi.miyagi.jp", "tagajo.miyagi.jp", "taiwa.miyagi.jp", "tome.miyagi.jp", "tomiya.miyagi.jp", "wakuya.miyagi.jp", "watari.miyagi.jp", "yamamoto.miyagi.jp", "zao.miyagi.jp", "aya.miyazaki.jp", "ebino.miyazaki.jp", "gokase.miyazaki.jp", "hyuga.miyazaki.jp", "kadogawa.miyazaki.jp", "kawaminami.miyazaki.jp", "kijo.miyazaki.jp", "kitagawa.miyazaki.jp", "kitakata.miyazaki.jp", "kitaura.miyazaki.jp", "kobayashi.miyazaki.jp", "kunitomi.miyazaki.jp", "kushima.miyazaki.jp", "mimata.miyazaki.jp", "miyakonojo.miyazaki.jp", "miyazaki.miyazaki.jp", "morotsuka.miyazaki.jp", "nichinan.miyazaki.jp", "nishimera.miyazaki.jp", "nobeoka.miyazaki.jp", "saito.miyazaki.jp", "shiiba.miyazaki.jp", "shintomi.miyazaki.jp", "takaharu.miyazaki.jp", "takanabe.miyazaki.jp", "takazaki.miyazaki.jp", "tsuno.miyazaki.jp", "achi.nagano.jp", "agematsu.nagano.jp", "anan.nagano.jp", "aoki.nagano.jp", "asahi.nagano.jp", "azumino.nagano.jp", "chikuhoku.nagano.jp", "chikuma.nagano.jp", "chino.nagano.jp", "fujimi.nagano.jp", "hakuba.nagano.jp", "hara.nagano.jp", "hiraya.nagano.jp", "iida.nagano.jp", "iijima.nagano.jp", "iiyama.nagano.jp", "iizuna.nagano.jp", "ikeda.nagano.jp", "ikusaka.nagano.jp", "ina.nagano.jp", "karuizawa.nagano.jp", "kawakami.nagano.jp", "kiso.nagano.jp", "kisofukushima.nagano.jp", "kitaaiki.nagano.jp", "komagane.nagano.jp", "komoro.nagano.jp", "matsukawa.nagano.jp", "matsumoto.nagano.jp", "miasa.nagano.jp", "minamiaiki.nagano.jp", "minamimaki.nagano.jp", "minamiminowa.nagano.jp", "minowa.nagano.jp", "miyada.nagano.jp", "miyota.nagano.jp", "mochizuki.nagano.jp", "nagano.nagano.jp", "nagawa.nagano.jp", "nagiso.nagano.jp", "nakagawa.nagano.jp", "nakano.nagano.jp", "nozawaonsen.nagano.jp", "obuse.nagano.jp", "ogawa.nagano.jp", "okaya.nagano.jp", "omachi.nagano.jp", "omi.nagano.jp", "ookuwa.nagano.jp", "ooshika.nagano.jp", "otaki.nagano.jp", "otari.nagano.jp", "sakae.nagano.jp", "sakaki.nagano.jp", "saku.nagano.jp", "sakuho.nagano.jp", "shimosuwa.nagano.jp", "shinanomachi.nagano.jp", "shiojiri.nagano.jp", "suwa.nagano.jp", "suzaka.nagano.jp", "takagi.nagano.jp", "takamori.nagano.jp", "takayama.nagano.jp", "tateshina.nagano.jp", "tatsuno.nagano.jp", "togakushi.nagano.jp", "togura.nagano.jp", "tomi.nagano.jp", "ueda.nagano.jp", "wada.nagano.jp", "yamagata.nagano.jp", "yamanouchi.nagano.jp", "yasaka.nagano.jp", "yasuoka.nagano.jp", "chijiwa.nagasaki.jp", "futsu.nagasaki.jp", "goto.nagasaki.jp", "hasami.nagasaki.jp", "hirado.nagasaki.jp", "iki.nagasaki.jp", "isahaya.nagasaki.jp", "kawatana.nagasaki.jp", "kuchinotsu.nagasaki.jp", "matsuura.nagasaki.jp", "nagasaki.nagasaki.jp", "obama.nagasaki.jp", "omura.nagasaki.jp", "oseto.nagasaki.jp", "saikai.nagasaki.jp", "sasebo.nagasaki.jp", "seihi.nagasaki.jp", "shimabara.nagasaki.jp", "shinkamigoto.nagasaki.jp", "togitsu.nagasaki.jp", "tsushima.nagasaki.jp", "unzen.nagasaki.jp", "ando.nara.jp", "gose.nara.jp", "heguri.nara.jp", "higashiyoshino.nara.jp", "ikaruga.nara.jp", "ikoma.nara.jp", "kamikitayama.nara.jp", "kanmaki.nara.jp", "kashiba.nara.jp", "kashihara.nara.jp", "katsuragi.nara.jp", "kawai.nara.jp", "kawakami.nara.jp", "kawanishi.nara.jp", "koryo.nara.jp", "kurotaki.nara.jp", "mitsue.nara.jp", "miyake.nara.jp", "nara.nara.jp", "nosegawa.nara.jp", "oji.nara.jp", "ouda.nara.jp", "oyodo.nara.jp", "sakurai.nara.jp", "sango.nara.jp", "shimoichi.nara.jp", "shimokitayama.nara.jp", "shinjo.nara.jp", "soni.nara.jp", "takatori.nara.jp", "tawaramoto.nara.jp", "tenkawa.nara.jp", "tenri.nara.jp", "uda.nara.jp", "yamatokoriyama.nara.jp", "yamatotakada.nara.jp", "yamazoe.nara.jp", "yoshino.nara.jp", "aga.niigata.jp", "agano.niigata.jp", "gosen.niigata.jp", "itoigawa.niigata.jp", "izumozaki.niigata.jp", "joetsu.niigata.jp", "kamo.niigata.jp", "kariwa.niigata.jp", "kashiwazaki.niigata.jp", "minamiuonuma.niigata.jp", "mitsuke.niigata.jp", "muika.niigata.jp", "murakami.niigata.jp", "myoko.niigata.jp", "nagaoka.niigata.jp", "niigata.niigata.jp", "ojiya.niigata.jp", "omi.niigata.jp", "sado.niigata.jp", "sanjo.niigata.jp", "seiro.niigata.jp", "seirou.niigata.jp", "sekikawa.niigata.jp", "shibata.niigata.jp", "tagami.niigata.jp", "tainai.niigata.jp", "tochio.niigata.jp", "tokamachi.niigata.jp", "tsubame.niigata.jp", "tsunan.niigata.jp", "uonuma.niigata.jp", "yahiko.niigata.jp", "yoita.niigata.jp", "yuzawa.niigata.jp", "beppu.oita.jp", "bungoono.oita.jp", "bungotakada.oita.jp", "hasama.oita.jp", "hiji.oita.jp", "himeshima.oita.jp", "hita.oita.jp", "kamitsue.oita.jp", "kokonoe.oita.jp", "kuju.oita.jp", "kunisaki.oita.jp", "kusu.oita.jp", "oita.oita.jp", "saiki.oita.jp", "taketa.oita.jp", "tsukumi.oita.jp", "usa.oita.jp", "usuki.oita.jp", "yufu.oita.jp", "akaiwa.okayama.jp", "asakuchi.okayama.jp", "bizen.okayama.jp", "hayashima.okayama.jp", "ibara.okayama.jp", "kagamino.okayama.jp", "kasaoka.okayama.jp", "kibichuo.okayama.jp", "kumenan.okayama.jp", "kurashiki.okayama.jp", "maniwa.okayama.jp", "misaki.okayama.jp", "nagi.okayama.jp", "niimi.okayama.jp", "nishiawakura.okayama.jp", "okayama.okayama.jp", "satosho.okayama.jp", "setouchi.okayama.jp", "shinjo.okayama.jp", "shoo.okayama.jp", "soja.okayama.jp", "takahashi.okayama.jp", "tamano.okayama.jp", "tsuyama.okayama.jp", "wake.okayama.jp", "yakage.okayama.jp", "aguni.okinawa.jp", "ginowan.okinawa.jp", "ginoza.okinawa.jp", "gushikami.okinawa.jp", "haebaru.okinawa.jp", "higashi.okinawa.jp", "hirara.okinawa.jp", "iheya.okinawa.jp", "ishigaki.okinawa.jp", "ishikawa.okinawa.jp", "itoman.okinawa.jp", "izena.okinawa.jp", "kadena.okinawa.jp", "kin.okinawa.jp", "kitadaito.okinawa.jp", "kitanakagusuku.okinawa.jp", "kumejima.okinawa.jp", "kunigami.okinawa.jp", "minamidaito.okinawa.jp", "motobu.okinawa.jp", "nago.okinawa.jp", "naha.okinawa.jp", "nakagusuku.okinawa.jp", "nakijin.okinawa.jp", "nanjo.okinawa.jp", "nishihara.okinawa.jp", "ogimi.okinawa.jp", "okinawa.okinawa.jp", "onna.okinawa.jp", "shimoji.okinawa.jp", "taketomi.okinawa.jp", "tarama.okinawa.jp", "tokashiki.okinawa.jp", "tomigusuku.okinawa.jp", "tonaki.okinawa.jp", "urasoe.okinawa.jp", "uruma.okinawa.jp", "yaese.okinawa.jp", "yomitan.okinawa.jp", "yonabaru.okinawa.jp", "yonaguni.okinawa.jp", "zamami.okinawa.jp", "abeno.osaka.jp", "chihayaakasaka.osaka.jp", "chuo.osaka.jp", "daito.osaka.jp", "fujiidera.osaka.jp", "habikino.osaka.jp", "hannan.osaka.jp", "higashiosaka.osaka.jp", "higashisumiyoshi.osaka.jp", "higashiyodogawa.osaka.jp", "hirakata.osaka.jp", "ibaraki.osaka.jp", "ikeda.osaka.jp", "izumi.osaka.jp", "izumiotsu.osaka.jp", "izumisano.osaka.jp", "kadoma.osaka.jp", "kaizuka.osaka.jp", "kanan.osaka.jp", "kashiwara.osaka.jp", "katano.osaka.jp", "kawachinagano.osaka.jp", "kishiwada.osaka.jp", "kita.osaka.jp", "kumatori.osaka.jp", "matsubara.osaka.jp", "minato.osaka.jp", "minoh.osaka.jp", "misaki.osaka.jp", "moriguchi.osaka.jp", "neyagawa.osaka.jp", "nishi.osaka.jp", "nose.osaka.jp", "osakasayama.osaka.jp", "sakai.osaka.jp", "sayama.osaka.jp", "sennan.osaka.jp", "settsu.osaka.jp", "shijonawate.osaka.jp", "shimamoto.osaka.jp", "suita.osaka.jp", "tadaoka.osaka.jp", "taishi.osaka.jp", "tajiri.osaka.jp", "takaishi.osaka.jp", "takatsuki.osaka.jp", "tondabayashi.osaka.jp", "toyonaka.osaka.jp", "toyono.osaka.jp", "yao.osaka.jp", "ariake.saga.jp", "arita.saga.jp", "fukudomi.saga.jp", "genkai.saga.jp", "hamatama.saga.jp", "hizen.saga.jp", "imari.saga.jp", "kamimine.saga.jp", "kanzaki.saga.jp", "karatsu.saga.jp", "kashima.saga.jp", "kitagata.saga.jp", "kitahata.saga.jp", "kiyama.saga.jp", "kouhoku.saga.jp", "kyuragi.saga.jp", "nishiarita.saga.jp", "ogi.saga.jp", "omachi.saga.jp", "ouchi.saga.jp", "saga.saga.jp", "shiroishi.saga.jp", "taku.saga.jp", "tara.saga.jp", "tosu.saga.jp", "yoshinogari.saga.jp", "arakawa.saitama.jp", "asaka.saitama.jp", "chichibu.saitama.jp", "fujimi.saitama.jp", "fujimino.saitama.jp", "fukaya.saitama.jp", "hanno.saitama.jp", "hanyu.saitama.jp", "hasuda.saitama.jp", "hatogaya.saitama.jp", "hatoyama.saitama.jp", "hidaka.saitama.jp", "higashichichibu.saitama.jp", "higashimatsuyama.saitama.jp", "honjo.saitama.jp", "ina.saitama.jp", "iruma.saitama.jp", "iwatsuki.saitama.jp", "kamiizumi.saitama.jp", "kamikawa.saitama.jp", "kamisato.saitama.jp", "kasukabe.saitama.jp", "kawagoe.saitama.jp", "kawaguchi.saitama.jp", "kawajima.saitama.jp", "kazo.saitama.jp", "kitamoto.saitama.jp", "koshigaya.saitama.jp", "kounosu.saitama.jp", "kuki.saitama.jp", "kumagaya.saitama.jp", "matsubushi.saitama.jp", "minano.saitama.jp", "misato.saitama.jp", "miyashiro.saitama.jp", "miyoshi.saitama.jp", "moroyama.saitama.jp", "nagatoro.saitama.jp", "namegawa.saitama.jp", "niiza.saitama.jp", "ogano.saitama.jp", "ogawa.saitama.jp", "ogose.saitama.jp", "okegawa.saitama.jp", "omiya.saitama.jp", "otaki.saitama.jp", "ranzan.saitama.jp", "ryokami.saitama.jp", "saitama.saitama.jp", "sakado.saitama.jp", "satte.saitama.jp", "sayama.saitama.jp", "shiki.saitama.jp", "shiraoka.saitama.jp", "soka.saitama.jp", "sugito.saitama.jp", "toda.saitama.jp", "tokigawa.saitama.jp", "tokorozawa.saitama.jp", "tsurugashima.saitama.jp", "urawa.saitama.jp", "warabi.saitama.jp", "yashio.saitama.jp", "yokoze.saitama.jp", "yono.saitama.jp", "yorii.saitama.jp", "yoshida.saitama.jp", "yoshikawa.saitama.jp", "yoshimi.saitama.jp", "aisho.shiga.jp", "gamo.shiga.jp", "higashiomi.shiga.jp", "hikone.shiga.jp", "koka.shiga.jp", "konan.shiga.jp", "kosei.shiga.jp", "koto.shiga.jp", "kusatsu.shiga.jp", "maibara.shiga.jp", "moriyama.shiga.jp", "nagahama.shiga.jp", "nishiazai.shiga.jp", "notogawa.shiga.jp", "omihachiman.shiga.jp", "otsu.shiga.jp", "ritto.shiga.jp", "ryuoh.shiga.jp", "takashima.shiga.jp", "takatsuki.shiga.jp", "torahime.shiga.jp", "toyosato.shiga.jp", "yasu.shiga.jp", "akagi.shimane.jp", "ama.shimane.jp", "gotsu.shimane.jp", "hamada.shimane.jp", "higashiizumo.shimane.jp", "hikawa.shimane.jp", "hikimi.shimane.jp", "izumo.shimane.jp", "kakinoki.shimane.jp", "masuda.shimane.jp", "matsue.shimane.jp", "misato.shimane.jp", "nishinoshima.shimane.jp", "ohda.shimane.jp", "okinoshima.shimane.jp", "okuizumo.shimane.jp", "shimane.shimane.jp", "tamayu.shimane.jp", "tsuwano.shimane.jp", "unnan.shimane.jp", "yakumo.shimane.jp", "yasugi.shimane.jp", "yatsuka.shimane.jp", "arai.shizuoka.jp", "atami.shizuoka.jp", "fuji.shizuoka.jp", "fujieda.shizuoka.jp", "fujikawa.shizuoka.jp", "fujinomiya.shizuoka.jp", "fukuroi.shizuoka.jp", "gotemba.shizuoka.jp", "haibara.shizuoka.jp", "hamamatsu.shizuoka.jp", "higashiizu.shizuoka.jp", "ito.shizuoka.jp", "iwata.shizuoka.jp", "izu.shizuoka.jp", "izunokuni.shizuoka.jp", "kakegawa.shizuoka.jp", "kannami.shizuoka.jp", "kawanehon.shizuoka.jp", "kawazu.shizuoka.jp", "kikugawa.shizuoka.jp", "kosai.shizuoka.jp", "makinohara.shizuoka.jp", "matsuzaki.shizuoka.jp", "minamiizu.shizuoka.jp", "mishima.shizuoka.jp", "morimachi.shizuoka.jp", "nishiizu.shizuoka.jp", "numazu.shizuoka.jp", "omaezaki.shizuoka.jp", "shimada.shizuoka.jp", "shimizu.shizuoka.jp", "shimoda.shizuoka.jp", "shizuoka.shizuoka.jp", "susono.shizuoka.jp", "yaizu.shizuoka.jp", "yoshida.shizuoka.jp", "ashikaga.tochigi.jp", "bato.tochigi.jp", "haga.tochigi.jp", "ichikai.tochigi.jp", "iwafune.tochigi.jp", "kaminokawa.tochigi.jp", "kanuma.tochigi.jp", "karasuyama.tochigi.jp", "kuroiso.tochigi.jp", "mashiko.tochigi.jp", "mibu.tochigi.jp", "moka.tochigi.jp", "motegi.tochigi.jp", "nasu.tochigi.jp", "nasushiobara.tochigi.jp", "nikko.tochigi.jp", "nishikata.tochigi.jp", "nogi.tochigi.jp", "ohira.tochigi.jp", "ohtawara.tochigi.jp", "oyama.tochigi.jp", "sakura.tochigi.jp", "sano.tochigi.jp", "shimotsuke.tochigi.jp", "shioya.tochigi.jp", "takanezawa.tochigi.jp", "tochigi.tochigi.jp", "tsuga.tochigi.jp", "ujiie.tochigi.jp", "utsunomiya.tochigi.jp", "yaita.tochigi.jp", "aizumi.tokushima.jp", "anan.tokushima.jp", "ichiba.tokushima.jp", "itano.tokushima.jp", "kainan.tokushima.jp", "komatsushima.tokushima.jp", "matsushige.tokushima.jp", "mima.tokushima.jp", "minami.tokushima.jp", "miyoshi.tokushima.jp", "mugi.tokushima.jp", "nakagawa.tokushima.jp", "naruto.tokushima.jp", "sanagochi.tokushima.jp", "shishikui.tokushima.jp", "tokushima.tokushima.jp", "wajiki.tokushima.jp", "adachi.tokyo.jp", "akiruno.tokyo.jp", "akishima.tokyo.jp", "aogashima.tokyo.jp", "arakawa.tokyo.jp", "bunkyo.tokyo.jp", "chiyoda.tokyo.jp", "chofu.tokyo.jp", "chuo.tokyo.jp", "edogawa.tokyo.jp", "fuchu.tokyo.jp", "fussa.tokyo.jp", "hachijo.tokyo.jp", "hachioji.tokyo.jp", "hamura.tokyo.jp", "higashikurume.tokyo.jp", "higashimurayama.tokyo.jp", "higashiyamato.tokyo.jp", "hino.tokyo.jp", "hinode.tokyo.jp", "hinohara.tokyo.jp", "inagi.tokyo.jp", "itabashi.tokyo.jp", "katsushika.tokyo.jp", "kita.tokyo.jp", "kiyose.tokyo.jp", "kodaira.tokyo.jp", "koganei.tokyo.jp", "kokubunji.tokyo.jp", "komae.tokyo.jp", "koto.tokyo.jp", "kouzushima.tokyo.jp", "kunitachi.tokyo.jp", "machida.tokyo.jp", "meguro.tokyo.jp", "minato.tokyo.jp", "mitaka.tokyo.jp", "mizuho.tokyo.jp", "musashimurayama.tokyo.jp", "musashino.tokyo.jp", "nakano.tokyo.jp", "nerima.tokyo.jp", "ogasawara.tokyo.jp", "okutama.tokyo.jp", "ome.tokyo.jp", "oshima.tokyo.jp", "ota.tokyo.jp", "setagaya.tokyo.jp", "shibuya.tokyo.jp", "shinagawa.tokyo.jp", "shinjuku.tokyo.jp", "suginami.tokyo.jp", "sumida.tokyo.jp", "tachikawa.tokyo.jp", "taito.tokyo.jp", "tama.tokyo.jp", "toshima.tokyo.jp", "chizu.tottori.jp", "hino.tottori.jp", "kawahara.tottori.jp", "koge.tottori.jp", "kotoura.tottori.jp", "misasa.tottori.jp", "nanbu.tottori.jp", "nichinan.tottori.jp", "sakaiminato.tottori.jp", "tottori.tottori.jp", "wakasa.tottori.jp", "yazu.tottori.jp", "yonago.tottori.jp", "asahi.toyama.jp", "fuchu.toyama.jp", "fukumitsu.toyama.jp", "funahashi.toyama.jp", "himi.toyama.jp", "imizu.toyama.jp", "inami.toyama.jp", "johana.toyama.jp", "kamiichi.toyama.jp", "kurobe.toyama.jp", "nakaniikawa.toyama.jp", "namerikawa.toyama.jp", "nanto.toyama.jp", "nyuzen.toyama.jp", "oyabe.toyama.jp", "taira.toyama.jp", "takaoka.toyama.jp", "tateyama.toyama.jp", "toga.toyama.jp", "tonami.toyama.jp", "toyama.toyama.jp", "unazuki.toyama.jp", "uozu.toyama.jp", "yamada.toyama.jp", "arida.wakayama.jp", "aridagawa.wakayama.jp", "gobo.wakayama.jp", "hashimoto.wakayama.jp", "hidaka.wakayama.jp", "hirogawa.wakayama.jp", "inami.wakayama.jp", "iwade.wakayama.jp", "kainan.wakayama.jp", "kamitonda.wakayama.jp", "katsuragi.wakayama.jp", "kimino.wakayama.jp", "kinokawa.wakayama.jp", "kitayama.wakayama.jp", "koya.wakayama.jp", "koza.wakayama.jp", "kozagawa.wakayama.jp", "kudoyama.wakayama.jp", "kushimoto.wakayama.jp", "mihama.wakayama.jp", "misato.wakayama.jp", "nachikatsuura.wakayama.jp", "shingu.wakayama.jp", "shirahama.wakayama.jp", "taiji.wakayama.jp", "tanabe.wakayama.jp", "wakayama.wakayama.jp", "yuasa.wakayama.jp", "yura.wakayama.jp", "asahi.yamagata.jp", "funagata.yamagata.jp", "higashine.yamagata.jp", "iide.yamagata.jp", "kahoku.yamagata.jp", "kaminoyama.yamagata.jp", "kaneyama.yamagata.jp", "kawanishi.yamagata.jp", "mamurogawa.yamagata.jp", "mikawa.yamagata.jp", "murayama.yamagata.jp", "nagai.yamagata.jp", "nakayama.yamagata.jp", "nanyo.yamagata.jp", "nishikawa.yamagata.jp", "obanazawa.yamagata.jp", "oe.yamagata.jp", "oguni.yamagata.jp", "ohkura.yamagata.jp", "oishida.yamagata.jp", "sagae.yamagata.jp", "sakata.yamagata.jp", "sakegawa.yamagata.jp", "shinjo.yamagata.jp", "shirataka.yamagata.jp", "shonai.yamagata.jp", "takahata.yamagata.jp", "tendo.yamagata.jp", "tozawa.yamagata.jp", "tsuruoka.yamagata.jp", "yamagata.yamagata.jp", "yamanobe.yamagata.jp", "yonezawa.yamagata.jp", "yuza.yamagata.jp", "abu.yamaguchi.jp", "hagi.yamaguchi.jp", "hikari.yamaguchi.jp", "hofu.yamaguchi.jp", "iwakuni.yamaguchi.jp", "kudamatsu.yamaguchi.jp", "mitou.yamaguchi.jp", "nagato.yamaguchi.jp", "oshima.yamaguchi.jp", "shimonoseki.yamaguchi.jp", "shunan.yamaguchi.jp", "tabuse.yamaguchi.jp", "tokuyama.yamaguchi.jp", "toyota.yamaguchi.jp", "ube.yamaguchi.jp", "yuu.yamaguchi.jp", "chuo.yamanashi.jp", "doshi.yamanashi.jp", "fuefuki.yamanashi.jp", "fujikawa.yamanashi.jp", "fujikawaguchiko.yamanashi.jp", "fujiyoshida.yamanashi.jp", "hayakawa.yamanashi.jp", "hokuto.yamanashi.jp", "ichikawamisato.yamanashi.jp", "kai.yamanashi.jp", "kofu.yamanashi.jp", "koshu.yamanashi.jp", "kosuge.yamanashi.jp", "minami-alps.yamanashi.jp", "minobu.yamanashi.jp", "nakamichi.yamanashi.jp", "nanbu.yamanashi.jp", "narusawa.yamanashi.jp", "nirasaki.yamanashi.jp", "nishikatsura.yamanashi.jp", "oshino.yamanashi.jp", "otsuki.yamanashi.jp", "showa.yamanashi.jp", "tabayama.yamanashi.jp", "tsuru.yamanashi.jp", "uenohara.yamanashi.jp", "yamanakako.yamanashi.jp", "yamanashi.yamanashi.jp", "ke", "ac.ke", "co.ke", "go.ke", "info.ke", "me.ke", "mobi.ke", "ne.ke", "or.ke", "sc.ke", "kg", "org.kg", "net.kg", "com.kg", "edu.kg", "gov.kg", "mil.kg", "*.kh", "ki", "edu.ki", "biz.ki", "net.ki", "org.ki", "gov.ki", "info.ki", "com.ki", "km", "org.km", "nom.km", "gov.km", "prd.km", "tm.km", "edu.km", "mil.km", "ass.km", "com.km", "coop.km", "asso.km", "presse.km", "medecin.km", "notaires.km", "pharmaciens.km", "veterinaire.km", "gouv.km", "kn", "net.kn", "org.kn", "edu.kn", "gov.kn", "kp", "com.kp", "edu.kp", "gov.kp", "org.kp", "rep.kp", "tra.kp", "kr", "ac.kr", "co.kr", "es.kr", "go.kr", "hs.kr", "kg.kr", "mil.kr", "ms.kr", "ne.kr", "or.kr", "pe.kr", "re.kr", "sc.kr", "busan.kr", "chungbuk.kr", "chungnam.kr", "daegu.kr", "daejeon.kr", "gangwon.kr", "gwangju.kr", "gyeongbuk.kr", "gyeonggi.kr", "gyeongnam.kr", "incheon.kr", "jeju.kr", "jeonbuk.kr", "jeonnam.kr", "seoul.kr", "ulsan.kr", "kw", "com.kw", "edu.kw", "emb.kw", "gov.kw", "ind.kw", "net.kw", "org.kw", "ky", "com.ky", "edu.ky", "net.ky", "org.ky", "kz", "org.kz", "edu.kz", "net.kz", "gov.kz", "mil.kz", "com.kz", "la", "int.la", "net.la", "info.la", "edu.la", "gov.la", "per.la", "com.la", "org.la", "lb", "com.lb", "edu.lb", "gov.lb", "net.lb", "org.lb", "lc", "com.lc", "net.lc", "co.lc", "org.lc", "edu.lc", "gov.lc", "li", "lk", "gov.lk", "sch.lk", "net.lk", "int.lk", "com.lk", "org.lk", "edu.lk", "ngo.lk", "soc.lk", "web.lk", "ltd.lk", "assn.lk", "grp.lk", "hotel.lk", "ac.lk", "lr", "com.lr", "edu.lr", "gov.lr", "org.lr", "net.lr", "ls", "ac.ls", "biz.ls", "co.ls", "edu.ls", "gov.ls", "info.ls", "net.ls", "org.ls", "sc.ls", "lt", "gov.lt", "lu", "lv", "com.lv", "edu.lv", "gov.lv", "org.lv", "mil.lv", "id.lv", "net.lv", "asn.lv", "conf.lv", "ly", "com.ly", "net.ly", "gov.ly", "plc.ly", "edu.ly", "sch.ly", "med.ly", "org.ly", "id.ly", "ma", "co.ma", "net.ma", "gov.ma", "org.ma", "ac.ma", "press.ma", "mc", "tm.mc", "asso.mc", "md", "me", "co.me", "net.me", "org.me", "edu.me", "ac.me", "gov.me", "its.me", "priv.me", "mg", "org.mg", "nom.mg", "gov.mg", "prd.mg", "tm.mg", "edu.mg", "mil.mg", "com.mg", "co.mg", "mh", "mil", "mk", "com.mk", "org.mk", "net.mk", "edu.mk", "gov.mk", "inf.mk", "name.mk", "ml", "com.ml", "edu.ml", "gouv.ml", "gov.ml", "net.ml", "org.ml", "presse.ml", "*.mm", "mn", "gov.mn", "edu.mn", "org.mn", "mo", "com.mo", "net.mo", "org.mo", "edu.mo", "gov.mo", "mobi", "mp", "mq", "mr", "gov.mr", "ms", "com.ms", "edu.ms", "gov.ms", "net.ms", "org.ms", "mt", "com.mt", "edu.mt", "net.mt", "org.mt", "mu", "com.mu", "net.mu", "org.mu", "gov.mu", "ac.mu", "co.mu", "or.mu", "museum", "academy.museum", "agriculture.museum", "air.museum", "airguard.museum", "alabama.museum", "alaska.museum", "amber.museum", "ambulance.museum", "american.museum", "americana.museum", "americanantiques.museum", "americanart.museum", "amsterdam.museum", "and.museum", "annefrank.museum", "anthro.museum", "anthropology.museum", "antiques.museum", "aquarium.museum", "arboretum.museum", "archaeological.museum", "archaeology.museum", "architecture.museum", "art.museum", "artanddesign.museum", "artcenter.museum", "artdeco.museum", "arteducation.museum", "artgallery.museum", "arts.museum", "artsandcrafts.museum", "asmatart.museum", "assassination.museum", "assisi.museum", "association.museum", "astronomy.museum", "atlanta.museum", "austin.museum", "australia.museum", "automotive.museum", "aviation.museum", "axis.museum", "badajoz.museum", "baghdad.museum", "bahn.museum", "bale.museum", "baltimore.museum", "barcelona.museum", "baseball.museum", "basel.museum", "baths.museum", "bauern.museum", "beauxarts.museum", "beeldengeluid.museum", "bellevue.museum", "bergbau.museum", "berkeley.museum", "berlin.museum", "bern.museum", "bible.museum", "bilbao.museum", "bill.museum", "birdart.museum", "birthplace.museum", "bonn.museum", "boston.museum", "botanical.museum", "botanicalgarden.museum", "botanicgarden.museum", "botany.museum", "brandywinevalley.museum", "brasil.museum", "bristol.museum", "british.museum", "britishcolumbia.museum", "broadcast.museum", "brunel.museum", "brussel.museum", "brussels.museum", "bruxelles.museum", "building.museum", "burghof.museum", "bus.museum", "bushey.museum", "cadaques.museum", "california.museum", "cambridge.museum", "can.museum", "canada.museum", "capebreton.museum", "carrier.museum", "cartoonart.museum", "casadelamoneda.museum", "castle.museum", "castres.museum", "celtic.museum", "center.museum", "chattanooga.museum", "cheltenham.museum", "chesapeakebay.museum", "chicago.museum", "children.museum", "childrens.museum", "childrensgarden.museum", "chiropractic.museum", "chocolate.museum", "christiansburg.museum", "cincinnati.museum", "cinema.museum", "circus.museum", "civilisation.museum", "civilization.museum", "civilwar.museum", "clinton.museum", "clock.museum", "coal.museum", "coastaldefence.museum", "cody.museum", "coldwar.museum", "collection.museum", "colonialwilliamsburg.museum", "coloradoplateau.museum", "columbia.museum", "columbus.museum", "communication.museum", "communications.museum", "community.museum", "computer.museum", "computerhistory.museum", "comunica\xE7\xF5es.museum", "contemporary.museum", "contemporaryart.museum", "convent.museum", "copenhagen.museum", "corporation.museum", "correios-e-telecomunica\xE7\xF5es.museum", "corvette.museum", "costume.museum", "countryestate.museum", "county.museum", "crafts.museum", "cranbrook.museum", "creation.museum", "cultural.museum", "culturalcenter.museum", "culture.museum", "cyber.museum", "cymru.museum", "dali.museum", "dallas.museum", "database.museum", "ddr.museum", "decorativearts.museum", "delaware.museum", "delmenhorst.museum", "denmark.museum", "depot.museum", "design.museum", "detroit.museum", "dinosaur.museum", "discovery.museum", "dolls.museum", "donostia.museum", "durham.museum", "eastafrica.museum", "eastcoast.museum", "education.museum", "educational.museum", "egyptian.museum", "eisenbahn.museum", "elburg.museum", "elvendrell.museum", "embroidery.museum", "encyclopedic.museum", "england.museum", "entomology.museum", "environment.museum", "environmentalconservation.museum", "epilepsy.museum", "essex.museum", "estate.museum", "ethnology.museum", "exeter.museum", "exhibition.museum", "family.museum", "farm.museum", "farmequipment.museum", "farmers.museum", "farmstead.museum", "field.museum", "figueres.museum", "filatelia.museum", "film.museum", "fineart.museum", "finearts.museum", "finland.museum", "flanders.museum", "florida.museum", "force.museum", "fortmissoula.museum", "fortworth.museum", "foundation.museum", "francaise.museum", "frankfurt.museum", "franziskaner.museum", "freemasonry.museum", "freiburg.museum", "fribourg.museum", "frog.museum", "fundacio.museum", "furniture.museum", "gallery.museum", "garden.museum", "gateway.museum", "geelvinck.museum", "gemological.museum", "geology.museum", "georgia.museum", "giessen.museum", "glas.museum", "glass.museum", "gorge.museum", "grandrapids.museum", "graz.museum", "guernsey.museum", "halloffame.museum", "hamburg.museum", "handson.museum", "harvestcelebration.museum", "hawaii.museum", "health.museum", "heimatunduhren.museum", "hellas.museum", "helsinki.museum", "hembygdsforbund.museum", "heritage.museum", "histoire.museum", "historical.museum", "historicalsociety.museum", "historichouses.museum", "historisch.museum", "historisches.museum", "history.museum", "historyofscience.museum", "horology.museum", "house.museum", "humanities.museum", "illustration.museum", "imageandsound.museum", "indian.museum", "indiana.museum", "indianapolis.museum", "indianmarket.museum", "intelligence.museum", "interactive.museum", "iraq.museum", "iron.museum", "isleofman.museum", "jamison.museum", "jefferson.museum", "jerusalem.museum", "jewelry.museum", "jewish.museum", "jewishart.museum", "jfk.museum", "journalism.museum", "judaica.museum", "judygarland.museum", "juedisches.museum", "juif.museum", "karate.museum", "karikatur.museum", "kids.museum", "koebenhavn.museum", "koeln.museum", "kunst.museum", "kunstsammlung.museum", "kunstunddesign.museum", "labor.museum", "labour.museum", "lajolla.museum", "lancashire.museum", "landes.museum", "lans.museum", "l\xE4ns.museum", "larsson.museum", "lewismiller.museum", "lincoln.museum", "linz.museum", "living.museum", "livinghistory.museum", "localhistory.museum", "london.museum", "losangeles.museum", "louvre.museum", "loyalist.museum", "lucerne.museum", "luxembourg.museum", "luzern.museum", "mad.museum", "madrid.museum", "mallorca.museum", "manchester.museum", "mansion.museum", "mansions.museum", "manx.museum", "marburg.museum", "maritime.museum", "maritimo.museum", "maryland.museum", "marylhurst.museum", "media.museum", "medical.museum", "medizinhistorisches.museum", "meeres.museum", "memorial.museum", "mesaverde.museum", "michigan.museum", "midatlantic.museum", "military.museum", "mill.museum", "miners.museum", "mining.museum", "minnesota.museum", "missile.museum", "missoula.museum", "modern.museum", "moma.museum", "money.museum", "monmouth.museum", "monticello.museum", "montreal.museum", "moscow.museum", "motorcycle.museum", "muenchen.museum", "muenster.museum", "mulhouse.museum", "muncie.museum", "museet.museum", "museumcenter.museum", "museumvereniging.museum", "music.museum", "national.museum", "nationalfirearms.museum", "nationalheritage.museum", "nativeamerican.museum", "naturalhistory.museum", "naturalhistorymuseum.museum", "naturalsciences.museum", "nature.museum", "naturhistorisches.museum", "natuurwetenschappen.museum", "naumburg.museum", "naval.museum", "nebraska.museum", "neues.museum", "newhampshire.museum", "newjersey.museum", "newmexico.museum", "newport.museum", "newspaper.museum", "newyork.museum", "niepce.museum", "norfolk.museum", "north.museum", "nrw.museum", "nyc.museum", "nyny.museum", "oceanographic.museum", "oceanographique.museum", "omaha.museum", "online.museum", "ontario.museum", "openair.museum", "oregon.museum", "oregontrail.museum", "otago.museum", "oxford.museum", "pacific.museum", "paderborn.museum", "palace.museum", "paleo.museum", "palmsprings.museum", "panama.museum", "paris.museum", "pasadena.museum", "pharmacy.museum", "philadelphia.museum", "philadelphiaarea.museum", "philately.museum", "phoenix.museum", "photography.museum", "pilots.museum", "pittsburgh.museum", "planetarium.museum", "plantation.museum", "plants.museum", "plaza.museum", "portal.museum", "portland.museum", "portlligat.museum", "posts-and-telecommunications.museum", "preservation.museum", "presidio.museum", "press.museum", "project.museum", "public.museum", "pubol.museum", "quebec.museum", "railroad.museum", "railway.museum", "research.museum", "resistance.museum", "riodejaneiro.museum", "rochester.museum", "rockart.museum", "roma.museum", "russia.museum", "saintlouis.museum", "salem.museum", "salvadordali.museum", "salzburg.museum", "sandiego.museum", "sanfrancisco.museum", "santabarbara.museum", "santacruz.museum", "santafe.museum", "saskatchewan.museum", "satx.museum", "savannahga.museum", "schlesisches.museum", "schoenbrunn.museum", "schokoladen.museum", "school.museum", "schweiz.museum", "science.museum", "scienceandhistory.museum", "scienceandindustry.museum", "sciencecenter.museum", "sciencecenters.museum", "science-fiction.museum", "sciencehistory.museum", "sciences.museum", "sciencesnaturelles.museum", "scotland.museum", "seaport.museum", "settlement.museum", "settlers.museum", "shell.museum", "sherbrooke.museum", "sibenik.museum", "silk.museum", "ski.museum", "skole.museum", "society.museum", "sologne.museum", "soundandvision.museum", "southcarolina.museum", "southwest.museum", "space.museum", "spy.museum", "square.museum", "stadt.museum", "stalbans.museum", "starnberg.museum", "state.museum", "stateofdelaware.museum", "station.museum", "steam.museum", "steiermark.museum", "stjohn.museum", "stockholm.museum", "stpetersburg.museum", "stuttgart.museum", "suisse.museum", "surgeonshall.museum", "surrey.museum", "svizzera.museum", "sweden.museum", "sydney.museum", "tank.museum", "tcm.museum", "technology.museum", "telekommunikation.museum", "television.museum", "texas.museum", "textile.museum", "theater.museum", "time.museum", "timekeeping.museum", "topology.museum", "torino.museum", "touch.museum", "town.museum", "transport.museum", "tree.museum", "trolley.museum", "trust.museum", "trustee.museum", "uhren.museum", "ulm.museum", "undersea.museum", "university.museum", "usa.museum", "usantiques.museum", "usarts.museum", "uscountryestate.museum", "usculture.museum", "usdecorativearts.museum", "usgarden.museum", "ushistory.museum", "ushuaia.museum", "uslivinghistory.museum", "utah.museum", "uvic.museum", "valley.museum", "vantaa.museum", "versailles.museum", "viking.museum", "village.museum", "virginia.museum", "virtual.museum", "virtuel.museum", "vlaanderen.museum", "volkenkunde.museum", "wales.museum", "wallonie.museum", "war.museum", "washingtondc.museum", "watchandclock.museum", "watch-and-clock.museum", "western.museum", "westfalen.museum", "whaling.museum", "wildlife.museum", "williamsburg.museum", "windmill.museum", "workshop.museum", "york.museum", "yorkshire.museum", "yosemite.museum", "youth.museum", "zoological.museum", "zoology.museum", "\u05D9\u05E8\u05D5\u05E9\u05DC\u05D9\u05DD.museum", "\u0438\u043A\u043E\u043C.museum", "mv", "aero.mv", "biz.mv", "com.mv", "coop.mv", "edu.mv", "gov.mv", "info.mv", "int.mv", "mil.mv", "museum.mv", "name.mv", "net.mv", "org.mv", "pro.mv", "mw", "ac.mw", "biz.mw", "co.mw", "com.mw", "coop.mw", "edu.mw", "gov.mw", "int.mw", "museum.mw", "net.mw", "org.mw", "mx", "com.mx", "org.mx", "gob.mx", "edu.mx", "net.mx", "my", "biz.my", "com.my", "edu.my", "gov.my", "mil.my", "name.my", "net.my", "org.my", "mz", "ac.mz", "adv.mz", "co.mz", "edu.mz", "gov.mz", "mil.mz", "net.mz", "org.mz", "na", "info.na", "pro.na", "name.na", "school.na", "or.na", "dr.na", "us.na", "mx.na", "ca.na", "in.na", "cc.na", "tv.na", "ws.na", "mobi.na", "co.na", "com.na", "org.na", "name", "nc", "asso.nc", "nom.nc", "ne", "net", "nf", "com.nf", "net.nf", "per.nf", "rec.nf", "web.nf", "arts.nf", "firm.nf", "info.nf", "other.nf", "store.nf", "ng", "com.ng", "edu.ng", "gov.ng", "i.ng", "mil.ng", "mobi.ng", "name.ng", "net.ng", "org.ng", "sch.ng", "ni", "ac.ni", "biz.ni", "co.ni", "com.ni", "edu.ni", "gob.ni", "in.ni", "info.ni", "int.ni", "mil.ni", "net.ni", "nom.ni", "org.ni", "web.ni", "nl", "no", "fhs.no", "vgs.no", "fylkesbibl.no", "folkebibl.no", "museum.no", "idrett.no", "priv.no", "mil.no", "stat.no", "dep.no", "kommune.no", "herad.no", "aa.no", "ah.no", "bu.no", "fm.no", "hl.no", "hm.no", "jan-mayen.no", "mr.no", "nl.no", "nt.no", "of.no", "ol.no", "oslo.no", "rl.no", "sf.no", "st.no", "svalbard.no", "tm.no", "tr.no", "va.no", "vf.no", "gs.aa.no", "gs.ah.no", "gs.bu.no", "gs.fm.no", "gs.hl.no", "gs.hm.no", "gs.jan-mayen.no", "gs.mr.no", "gs.nl.no", "gs.nt.no", "gs.of.no", "gs.ol.no", "gs.oslo.no", "gs.rl.no", "gs.sf.no", "gs.st.no", "gs.svalbard.no", "gs.tm.no", "gs.tr.no", "gs.va.no", "gs.vf.no", "akrehamn.no", "\xE5krehamn.no", "algard.no", "\xE5lg\xE5rd.no", "arna.no", "brumunddal.no", "bryne.no", "bronnoysund.no", "br\xF8nn\xF8ysund.no", "drobak.no", "dr\xF8bak.no", "egersund.no", "fetsund.no", "floro.no", "flor\xF8.no", "fredrikstad.no", "hokksund.no", "honefoss.no", "h\xF8nefoss.no", "jessheim.no", "jorpeland.no", "j\xF8rpeland.no", "kirkenes.no", "kopervik.no", "krokstadelva.no", "langevag.no", "langev\xE5g.no", "leirvik.no", "mjondalen.no", "mj\xF8ndalen.no", "mo-i-rana.no", "mosjoen.no", "mosj\xF8en.no", "nesoddtangen.no", "orkanger.no", "osoyro.no", "os\xF8yro.no", "raholt.no", "r\xE5holt.no", "sandnessjoen.no", "sandnessj\xF8en.no", "skedsmokorset.no", "slattum.no", "spjelkavik.no", "stathelle.no", "stavern.no", "stjordalshalsen.no", "stj\xF8rdalshalsen.no", "tananger.no", "tranby.no", "vossevangen.no", "afjord.no", "\xE5fjord.no", "agdenes.no", "al.no", "\xE5l.no", "alesund.no", "\xE5lesund.no", "alstahaug.no", "alta.no", "\xE1lt\xE1.no", "alaheadju.no", "\xE1laheadju.no", "alvdal.no", "amli.no", "\xE5mli.no", "amot.no", "\xE5mot.no", "andebu.no", "andoy.no", "and\xF8y.no", "andasuolo.no", "ardal.no", "\xE5rdal.no", "aremark.no", "arendal.no", "\xE5s.no", "aseral.no", "\xE5seral.no", "asker.no", "askim.no", "askvoll.no", "askoy.no", "ask\xF8y.no", "asnes.no", "\xE5snes.no", "audnedaln.no", "aukra.no", "aure.no", "aurland.no", "aurskog-holand.no", "aurskog-h\xF8land.no", "austevoll.no", "austrheim.no", "averoy.no", "aver\xF8y.no", "balestrand.no", "ballangen.no", "balat.no", "b\xE1l\xE1t.no", "balsfjord.no", "bahccavuotna.no", "b\xE1hccavuotna.no", "bamble.no", "bardu.no", "beardu.no", "beiarn.no", "bajddar.no", "b\xE1jddar.no", "baidar.no", "b\xE1id\xE1r.no", "berg.no", "bergen.no", "berlevag.no", "berlev\xE5g.no", "bearalvahki.no", "bearalv\xE1hki.no", "bindal.no", "birkenes.no", "bjarkoy.no", "bjark\xF8y.no", "bjerkreim.no", "bjugn.no", "bodo.no", "bod\xF8.no", "badaddja.no", "b\xE5d\xE5ddj\xE5.no", "budejju.no", "bokn.no", "bremanger.no", "bronnoy.no", "br\xF8nn\xF8y.no", "bygland.no", "bykle.no", "barum.no", "b\xE6rum.no", "bo.telemark.no", "b\xF8.telemark.no", "bo.nordland.no", "b\xF8.nordland.no", "bievat.no", "biev\xE1t.no", "bomlo.no", "b\xF8mlo.no", "batsfjord.no", "b\xE5tsfjord.no", "bahcavuotna.no", "b\xE1hcavuotna.no", "dovre.no", "drammen.no", "drangedal.no", "dyroy.no", "dyr\xF8y.no", "donna.no", "d\xF8nna.no", "eid.no", "eidfjord.no", "eidsberg.no", "eidskog.no", "eidsvoll.no", "eigersund.no", "elverum.no", "enebakk.no", "engerdal.no", "etne.no", "etnedal.no", "evenes.no", "evenassi.no", "even\xE1\u0161\u0161i.no", "evje-og-hornnes.no", "farsund.no", "fauske.no", "fuossko.no", "fuoisku.no", "fedje.no", "fet.no", "finnoy.no", "finn\xF8y.no", "fitjar.no", "fjaler.no", "fjell.no", "flakstad.no", "flatanger.no", "flekkefjord.no", "flesberg.no", "flora.no", "fla.no", "fl\xE5.no", "folldal.no", "forsand.no", "fosnes.no", "frei.no", "frogn.no", "froland.no", "frosta.no", "frana.no", "fr\xE6na.no", "froya.no", "fr\xF8ya.no", "fusa.no", "fyresdal.no", "forde.no", "f\xF8rde.no", "gamvik.no", "gangaviika.no", "g\xE1\u014Bgaviika.no", "gaular.no", "gausdal.no", "gildeskal.no", "gildesk\xE5l.no", "giske.no", "gjemnes.no", "gjerdrum.no", "gjerstad.no", "gjesdal.no", "gjovik.no", "gj\xF8vik.no", "gloppen.no", "gol.no", "gran.no", "grane.no", "granvin.no", "gratangen.no", "grimstad.no", "grong.no", "kraanghke.no", "kr\xE5anghke.no", "grue.no", "gulen.no", "hadsel.no", "halden.no", "halsa.no", "hamar.no", "hamaroy.no", "habmer.no", "h\xE1bmer.no", "hapmir.no", "h\xE1pmir.no", "hammerfest.no", "hammarfeasta.no", "h\xE1mm\xE1rfeasta.no", "haram.no", "hareid.no", "harstad.no", "hasvik.no", "aknoluokta.no", "\xE1k\u014Boluokta.no", "hattfjelldal.no", "aarborte.no", "haugesund.no", "hemne.no", "hemnes.no", "hemsedal.no", "heroy.more-og-romsdal.no", "her\xF8y.m\xF8re-og-romsdal.no", "heroy.nordland.no", "her\xF8y.nordland.no", "hitra.no", "hjartdal.no", "hjelmeland.no", "hobol.no", "hob\xF8l.no", "hof.no", "hol.no", "hole.no", "holmestrand.no", "holtalen.no", "holt\xE5len.no", "hornindal.no", "horten.no", "hurdal.no", "hurum.no", "hvaler.no", "hyllestad.no", "hagebostad.no", "h\xE6gebostad.no", "hoyanger.no", "h\xF8yanger.no", "hoylandet.no", "h\xF8ylandet.no", "ha.no", "h\xE5.no", "ibestad.no", "inderoy.no", "inder\xF8y.no", "iveland.no", "jevnaker.no", "jondal.no", "jolster.no", "j\xF8lster.no", "karasjok.no", "karasjohka.no", "k\xE1r\xE1\u0161johka.no", "karlsoy.no", "galsa.no", "g\xE1ls\xE1.no", "karmoy.no", "karm\xF8y.no", "kautokeino.no", "guovdageaidnu.no", "klepp.no", "klabu.no", "kl\xE6bu.no", "kongsberg.no", "kongsvinger.no", "kragero.no", "krager\xF8.no", "kristiansand.no", "kristiansund.no", "krodsherad.no", "kr\xF8dsherad.no", "kvalsund.no", "rahkkeravju.no", "r\xE1hkker\xE1vju.no", "kvam.no", "kvinesdal.no", "kvinnherad.no", "kviteseid.no", "kvitsoy.no", "kvits\xF8y.no", "kvafjord.no", "kv\xE6fjord.no", "giehtavuoatna.no", "kvanangen.no", "kv\xE6nangen.no", "navuotna.no", "n\xE1vuotna.no", "kafjord.no", "k\xE5fjord.no", "gaivuotna.no", "g\xE1ivuotna.no", "larvik.no", "lavangen.no", "lavagis.no", "loabat.no", "loab\xE1t.no", "lebesby.no", "davvesiida.no", "leikanger.no", "leirfjord.no", "leka.no", "leksvik.no", "lenvik.no", "leangaviika.no", "lea\u014Bgaviika.no", "lesja.no", "levanger.no", "lier.no", "lierne.no", "lillehammer.no", "lillesand.no", "lindesnes.no", "lindas.no", "lind\xE5s.no", "lom.no", "loppa.no", "lahppi.no", "l\xE1hppi.no", "lund.no", "lunner.no", "luroy.no", "lur\xF8y.no", "luster.no", "lyngdal.no", "lyngen.no", "ivgu.no", "lardal.no", "lerdal.no", "l\xE6rdal.no", "lodingen.no", "l\xF8dingen.no", "lorenskog.no", "l\xF8renskog.no", "loten.no", "l\xF8ten.no", "malvik.no", "masoy.no", "m\xE5s\xF8y.no", "muosat.no", "muos\xE1t.no", "mandal.no", "marker.no", "marnardal.no", "masfjorden.no", "meland.no", "meldal.no", "melhus.no", "meloy.no", "mel\xF8y.no", "meraker.no", "mer\xE5ker.no", "moareke.no", "mo\xE5reke.no", "midsund.no", "midtre-gauldal.no", "modalen.no", "modum.no", "molde.no", "moskenes.no", "moss.no", "mosvik.no", "malselv.no", "m\xE5lselv.no", "malatvuopmi.no", "m\xE1latvuopmi.no", "namdalseid.no", "aejrie.no", "namsos.no", "namsskogan.no", "naamesjevuemie.no", "n\xE5\xE5mesjevuemie.no", "laakesvuemie.no", "nannestad.no", "narvik.no", "narviika.no", "naustdal.no", "nedre-eiker.no", "nes.akershus.no", "nes.buskerud.no", "nesna.no", "nesodden.no", "nesseby.no", "unjarga.no", "unj\xE1rga.no", "nesset.no", "nissedal.no", "nittedal.no", "nord-aurdal.no", "nord-fron.no", "nord-odal.no", "norddal.no", "nordkapp.no", "davvenjarga.no", "davvenj\xE1rga.no", "nordre-land.no", "nordreisa.no", "raisa.no", "r\xE1isa.no", "nore-og-uvdal.no", "notodden.no", "naroy.no", "n\xE6r\xF8y.no", "notteroy.no", "n\xF8tter\xF8y.no", "odda.no", "oksnes.no", "\xF8ksnes.no", "oppdal.no", "oppegard.no", "oppeg\xE5rd.no", "orkdal.no", "orland.no", "\xF8rland.no", "orskog.no", "\xF8rskog.no", "orsta.no", "\xF8rsta.no", "os.hedmark.no", "os.hordaland.no", "osen.no", "osteroy.no", "oster\xF8y.no", "ostre-toten.no", "\xF8stre-toten.no", "overhalla.no", "ovre-eiker.no", "\xF8vre-eiker.no", "oyer.no", "\xF8yer.no", "oygarden.no", "\xF8ygarden.no", "oystre-slidre.no", "\xF8ystre-slidre.no", "porsanger.no", "porsangu.no", "pors\xE1\u014Bgu.no", "porsgrunn.no", "radoy.no", "rad\xF8y.no", "rakkestad.no", "rana.no", "ruovat.no", "randaberg.no", "rauma.no", "rendalen.no", "rennebu.no", "rennesoy.no", "rennes\xF8y.no", "rindal.no", "ringebu.no", "ringerike.no", "ringsaker.no", "rissa.no", "risor.no", "ris\xF8r.no", "roan.no", "rollag.no", "rygge.no", "ralingen.no", "r\xE6lingen.no", "rodoy.no", "r\xF8d\xF8y.no", "romskog.no", "r\xF8mskog.no", "roros.no", "r\xF8ros.no", "rost.no", "r\xF8st.no", "royken.no", "r\xF8yken.no", "royrvik.no", "r\xF8yrvik.no", "rade.no", "r\xE5de.no", "salangen.no", "siellak.no", "saltdal.no", "salat.no", "s\xE1l\xE1t.no", "s\xE1lat.no", "samnanger.no", "sande.more-og-romsdal.no", "sande.m\xF8re-og-romsdal.no", "sande.vestfold.no", "sandefjord.no", "sandnes.no", "sandoy.no", "sand\xF8y.no", "sarpsborg.no", "sauda.no", "sauherad.no", "sel.no", "selbu.no", "selje.no", "seljord.no", "sigdal.no", "siljan.no", "sirdal.no", "skaun.no", "skedsmo.no", "ski.no", "skien.no", "skiptvet.no", "skjervoy.no", "skjerv\xF8y.no", "skierva.no", "skierv\xE1.no", "skjak.no", "skj\xE5k.no", "skodje.no", "skanland.no", "sk\xE5nland.no", "skanit.no", "sk\xE1nit.no", "smola.no", "sm\xF8la.no", "snillfjord.no", "snasa.no", "sn\xE5sa.no", "snoasa.no", "snaase.no", "sn\xE5ase.no", "sogndal.no", "sokndal.no", "sola.no", "solund.no", "songdalen.no", "sortland.no", "spydeberg.no", "stange.no", "stavanger.no", "steigen.no", "steinkjer.no", "stjordal.no", "stj\xF8rdal.no", "stokke.no", "stor-elvdal.no", "stord.no", "stordal.no", "storfjord.no", "omasvuotna.no", "strand.no", "stranda.no", "stryn.no", "sula.no", "suldal.no", "sund.no", "sunndal.no", "surnadal.no", "sveio.no", "svelvik.no", "sykkylven.no", "sogne.no", "s\xF8gne.no", "somna.no", "s\xF8mna.no", "sondre-land.no", "s\xF8ndre-land.no", "sor-aurdal.no", "s\xF8r-aurdal.no", "sor-fron.no", "s\xF8r-fron.no", "sor-odal.no", "s\xF8r-odal.no", "sor-varanger.no", "s\xF8r-varanger.no", "matta-varjjat.no", "m\xE1tta-v\xE1rjjat.no", "sorfold.no", "s\xF8rfold.no", "sorreisa.no", "s\xF8rreisa.no", "sorum.no", "s\xF8rum.no", "tana.no", "deatnu.no", "time.no", "tingvoll.no", "tinn.no", "tjeldsund.no", "dielddanuorri.no", "tjome.no", "tj\xF8me.no", "tokke.no", "tolga.no", "torsken.no", "tranoy.no", "tran\xF8y.no", "tromso.no", "troms\xF8.no", "tromsa.no", "romsa.no", "trondheim.no", "troandin.no", "trysil.no", "trana.no", "tr\xE6na.no", "trogstad.no", "tr\xF8gstad.no", "tvedestrand.no", "tydal.no", "tynset.no", "tysfjord.no", "divtasvuodna.no", "divttasvuotna.no", "tysnes.no", "tysvar.no", "tysv\xE6r.no", "tonsberg.no", "t\xF8nsberg.no", "ullensaker.no", "ullensvang.no", "ulvik.no", "utsira.no", "vadso.no", "vads\xF8.no", "cahcesuolo.no", "\u010D\xE1hcesuolo.no", "vaksdal.no", "valle.no", "vang.no", "vanylven.no", "vardo.no", "vard\xF8.no", "varggat.no", "v\xE1rgg\xE1t.no", "vefsn.no", "vaapste.no", "vega.no", "vegarshei.no", "veg\xE5rshei.no", "vennesla.no", "verdal.no", "verran.no", "vestby.no", "vestnes.no", "vestre-slidre.no", "vestre-toten.no", "vestvagoy.no", "vestv\xE5g\xF8y.no", "vevelstad.no", "vik.no", "vikna.no", "vindafjord.no", "volda.no", "voss.no", "varoy.no", "v\xE6r\xF8y.no", "vagan.no", "v\xE5gan.no", "voagat.no", "vagsoy.no", "v\xE5gs\xF8y.no", "vaga.no", "v\xE5g\xE5.no", "valer.ostfold.no", "v\xE5ler.\xF8stfold.no", "valer.hedmark.no", "v\xE5ler.hedmark.no", "*.np", "nr", "biz.nr", "info.nr", "gov.nr", "edu.nr", "org.nr", "net.nr", "com.nr", "nu", "nz", "ac.nz", "co.nz", "cri.nz", "geek.nz", "gen.nz", "govt.nz", "health.nz", "iwi.nz", "kiwi.nz", "maori.nz", "mil.nz", "m\u0101ori.nz", "net.nz", "org.nz", "parliament.nz", "school.nz", "om", "co.om", "com.om", "edu.om", "gov.om", "med.om", "museum.om", "net.om", "org.om", "pro.om", "onion", "org", "pa", "ac.pa", "gob.pa", "com.pa", "org.pa", "sld.pa", "edu.pa", "net.pa", "ing.pa", "abo.pa", "med.pa", "nom.pa", "pe", "edu.pe", "gob.pe", "nom.pe", "mil.pe", "org.pe", "com.pe", "net.pe", "pf", "com.pf", "org.pf", "edu.pf", "*.pg", "ph", "com.ph", "net.ph", "org.ph", "gov.ph", "edu.ph", "ngo.ph", "mil.ph", "i.ph", "pk", "com.pk", "net.pk", "edu.pk", "org.pk", "fam.pk", "biz.pk", "web.pk", "gov.pk", "gob.pk", "gok.pk", "gon.pk", "gop.pk", "gos.pk", "info.pk", "pl", "com.pl", "net.pl", "org.pl", "aid.pl", "agro.pl", "atm.pl", "auto.pl", "biz.pl", "edu.pl", "gmina.pl", "gsm.pl", "info.pl", "mail.pl", "miasta.pl", "media.pl", "mil.pl", "nieruchomosci.pl", "nom.pl", "pc.pl", "powiat.pl", "priv.pl", "realestate.pl", "rel.pl", "sex.pl", "shop.pl", "sklep.pl", "sos.pl", "szkola.pl", "targi.pl", "tm.pl", "tourism.pl", "travel.pl", "turystyka.pl", "gov.pl", "ap.gov.pl", "ic.gov.pl", "is.gov.pl", "us.gov.pl", "kmpsp.gov.pl", "kppsp.gov.pl", "kwpsp.gov.pl", "psp.gov.pl", "wskr.gov.pl", "kwp.gov.pl", "mw.gov.pl", "ug.gov.pl", "um.gov.pl", "umig.gov.pl", "ugim.gov.pl", "upow.gov.pl", "uw.gov.pl", "starostwo.gov.pl", "pa.gov.pl", "po.gov.pl", "psse.gov.pl", "pup.gov.pl", "rzgw.gov.pl", "sa.gov.pl", "so.gov.pl", "sr.gov.pl", "wsa.gov.pl", "sko.gov.pl", "uzs.gov.pl", "wiih.gov.pl", "winb.gov.pl", "pinb.gov.pl", "wios.gov.pl", "witd.gov.pl", "wzmiuw.gov.pl", "piw.gov.pl", "wiw.gov.pl", "griw.gov.pl", "wif.gov.pl", "oum.gov.pl", "sdn.gov.pl", "zp.gov.pl", "uppo.gov.pl", "mup.gov.pl", "wuoz.gov.pl", "konsulat.gov.pl", "oirm.gov.pl", "augustow.pl", "babia-gora.pl", "bedzin.pl", "beskidy.pl", "bialowieza.pl", "bialystok.pl", "bielawa.pl", "bieszczady.pl", "boleslawiec.pl", "bydgoszcz.pl", "bytom.pl", "cieszyn.pl", "czeladz.pl", "czest.pl", "dlugoleka.pl", "elblag.pl", "elk.pl", "glogow.pl", "gniezno.pl", "gorlice.pl", "grajewo.pl", "ilawa.pl", "jaworzno.pl", "jelenia-gora.pl", "jgora.pl", "kalisz.pl", "kazimierz-dolny.pl", "karpacz.pl", "kartuzy.pl", "kaszuby.pl", "katowice.pl", "kepno.pl", "ketrzyn.pl", "klodzko.pl", "kobierzyce.pl", "kolobrzeg.pl", "konin.pl", "konskowola.pl", "kutno.pl", "lapy.pl", "lebork.pl", "legnica.pl", "lezajsk.pl", "limanowa.pl", "lomza.pl", "lowicz.pl", "lubin.pl", "lukow.pl", "malbork.pl", "malopolska.pl", "mazowsze.pl", "mazury.pl", "mielec.pl", "mielno.pl", "mragowo.pl", "naklo.pl", "nowaruda.pl", "nysa.pl", "olawa.pl", "olecko.pl", "olkusz.pl", "olsztyn.pl", "opoczno.pl", "opole.pl", "ostroda.pl", "ostroleka.pl", "ostrowiec.pl", "ostrowwlkp.pl", "pila.pl", "pisz.pl", "podhale.pl", "podlasie.pl", "polkowice.pl", "pomorze.pl", "pomorskie.pl", "prochowice.pl", "pruszkow.pl", "przeworsk.pl", "pulawy.pl", "radom.pl", "rawa-maz.pl", "rybnik.pl", "rzeszow.pl", "sanok.pl", "sejny.pl", "slask.pl", "slupsk.pl", "sosnowiec.pl", "stalowa-wola.pl", "skoczow.pl", "starachowice.pl", "stargard.pl", "suwalki.pl", "swidnica.pl", "swiebodzin.pl", "swinoujscie.pl", "szczecin.pl", "szczytno.pl", "tarnobrzeg.pl", "tgory.pl", "turek.pl", "tychy.pl", "ustka.pl", "walbrzych.pl", "warmia.pl", "warszawa.pl", "waw.pl", "wegrow.pl", "wielun.pl", "wlocl.pl", "wloclawek.pl", "wodzislaw.pl", "wolomin.pl", "wroclaw.pl", "zachpomor.pl", "zagan.pl", "zarow.pl", "zgora.pl", "zgorzelec.pl", "pm", "pn", "gov.pn", "co.pn", "org.pn", "edu.pn", "net.pn", "post", "pr", "com.pr", "net.pr", "org.pr", "gov.pr", "edu.pr", "isla.pr", "pro.pr", "biz.pr", "info.pr", "name.pr", "est.pr", "prof.pr", "ac.pr", "pro", "aaa.pro", "aca.pro", "acct.pro", "avocat.pro", "bar.pro", "cpa.pro", "eng.pro", "jur.pro", "law.pro", "med.pro", "recht.pro", "ps", "edu.ps", "gov.ps", "sec.ps", "plo.ps", "com.ps", "org.ps", "net.ps", "pt", "net.pt", "gov.pt", "org.pt", "edu.pt", "int.pt", "publ.pt", "com.pt", "nome.pt", "pw", "co.pw", "ne.pw", "or.pw", "ed.pw", "go.pw", "belau.pw", "py", "com.py", "coop.py", "edu.py", "gov.py", "mil.py", "net.py", "org.py", "qa", "com.qa", "edu.qa", "gov.qa", "mil.qa", "name.qa", "net.qa", "org.qa", "sch.qa", "re", "asso.re", "com.re", "nom.re", "ro", "arts.ro", "com.ro", "firm.ro", "info.ro", "nom.ro", "nt.ro", "org.ro", "rec.ro", "store.ro", "tm.ro", "www.ro", "rs", "ac.rs", "co.rs", "edu.rs", "gov.rs", "in.rs", "org.rs", "ru", "rw", "ac.rw", "co.rw", "coop.rw", "gov.rw", "mil.rw", "net.rw", "org.rw", "sa", "com.sa", "net.sa", "org.sa", "gov.sa", "med.sa", "pub.sa", "edu.sa", "sch.sa", "sb", "com.sb", "edu.sb", "gov.sb", "net.sb", "org.sb", "sc", "com.sc", "gov.sc", "net.sc", "org.sc", "edu.sc", "sd", "com.sd", "net.sd", "org.sd", "edu.sd", "med.sd", "tv.sd", "gov.sd", "info.sd", "se", "a.se", "ac.se", "b.se", "bd.se", "brand.se", "c.se", "d.se", "e.se", "f.se", "fh.se", "fhsk.se", "fhv.se", "g.se", "h.se", "i.se", "k.se", "komforb.se", "kommunalforbund.se", "komvux.se", "l.se", "lanbib.se", "m.se", "n.se", "naturbruksgymn.se", "o.se", "org.se", "p.se", "parti.se", "pp.se", "press.se", "r.se", "s.se", "t.se", "tm.se", "u.se", "w.se", "x.se", "y.se", "z.se", "sg", "com.sg", "net.sg", "org.sg", "gov.sg", "edu.sg", "per.sg", "sh", "com.sh", "net.sh", "gov.sh", "org.sh", "mil.sh", "si", "sj", "sk", "sl", "com.sl", "net.sl", "edu.sl", "gov.sl", "org.sl", "sm", "sn", "art.sn", "com.sn", "edu.sn", "gouv.sn", "org.sn", "perso.sn", "univ.sn", "so", "com.so", "edu.so", "gov.so", "me.so", "net.so", "org.so", "sr", "ss", "biz.ss", "com.ss", "edu.ss", "gov.ss", "me.ss", "net.ss", "org.ss", "sch.ss", "st", "co.st", "com.st", "consulado.st", "edu.st", "embaixada.st", "mil.st", "net.st", "org.st", "principe.st", "saotome.st", "store.st", "su", "sv", "com.sv", "edu.sv", "gob.sv", "org.sv", "red.sv", "sx", "gov.sx", "sy", "edu.sy", "gov.sy", "net.sy", "mil.sy", "com.sy", "org.sy", "sz", "co.sz", "ac.sz", "org.sz", "tc", "td", "tel", "tf", "tg", "th", "ac.th", "co.th", "go.th", "in.th", "mi.th", "net.th", "or.th", "tj", "ac.tj", "biz.tj", "co.tj", "com.tj", "edu.tj", "go.tj", "gov.tj", "int.tj", "mil.tj", "name.tj", "net.tj", "nic.tj", "org.tj", "test.tj", "web.tj", "tk", "tl", "gov.tl", "tm", "com.tm", "co.tm", "org.tm", "net.tm", "nom.tm", "gov.tm", "mil.tm", "edu.tm", "tn", "com.tn", "ens.tn", "fin.tn", "gov.tn", "ind.tn", "info.tn", "intl.tn", "mincom.tn", "nat.tn", "net.tn", "org.tn", "perso.tn", "tourism.tn", "to", "com.to", "gov.to", "net.to", "org.to", "edu.to", "mil.to", "tr", "av.tr", "bbs.tr", "bel.tr", "biz.tr", "com.tr", "dr.tr", "edu.tr", "gen.tr", "gov.tr", "info.tr", "mil.tr", "k12.tr", "kep.tr", "name.tr", "net.tr", "org.tr", "pol.tr", "tel.tr", "tsk.tr", "tv.tr", "web.tr", "nc.tr", "gov.nc.tr", "tt", "co.tt", "com.tt", "org.tt", "net.tt", "biz.tt", "info.tt", "pro.tt", "int.tt", "coop.tt", "jobs.tt", "mobi.tt", "travel.tt", "museum.tt", "aero.tt", "name.tt", "gov.tt", "edu.tt", "tv", "tw", "edu.tw", "gov.tw", "mil.tw", "com.tw", "net.tw", "org.tw", "idv.tw", "game.tw", "ebiz.tw", "club.tw", "\u7DB2\u8DEF.tw", "\u7D44\u7E54.tw", "\u5546\u696D.tw", "tz", "ac.tz", "co.tz", "go.tz", "hotel.tz", "info.tz", "me.tz", "mil.tz", "mobi.tz", "ne.tz", "or.tz", "sc.tz", "tv.tz", "ua", "com.ua", "edu.ua", "gov.ua", "in.ua", "net.ua", "org.ua", "cherkassy.ua", "cherkasy.ua", "chernigov.ua", "chernihiv.ua", "chernivtsi.ua", "chernovtsy.ua", "ck.ua", "cn.ua", "cr.ua", "crimea.ua", "cv.ua", "dn.ua", "dnepropetrovsk.ua", "dnipropetrovsk.ua", "donetsk.ua", "dp.ua", "if.ua", "ivano-frankivsk.ua", "kh.ua", "kharkiv.ua", "kharkov.ua", "kherson.ua", "khmelnitskiy.ua", "khmelnytskyi.ua", "kiev.ua", "kirovograd.ua", "km.ua", "kr.ua", "krym.ua", "ks.ua", "kv.ua", "kyiv.ua", "lg.ua", "lt.ua", "lugansk.ua", "lutsk.ua", "lv.ua", "lviv.ua", "mk.ua", "mykolaiv.ua", "nikolaev.ua", "od.ua", "odesa.ua", "odessa.ua", "pl.ua", "poltava.ua", "rivne.ua", "rovno.ua", "rv.ua", "sb.ua", "sebastopol.ua", "sevastopol.ua", "sm.ua", "sumy.ua", "te.ua", "ternopil.ua", "uz.ua", "uzhgorod.ua", "vinnica.ua", "vinnytsia.ua", "vn.ua", "volyn.ua", "yalta.ua", "zaporizhzhe.ua", "zaporizhzhia.ua", "zhitomir.ua", "zhytomyr.ua", "zp.ua", "zt.ua", "ug", "co.ug", "or.ug", "ac.ug", "sc.ug", "go.ug", "ne.ug", "com.ug", "org.ug", "uk", "ac.uk", "co.uk", "gov.uk", "ltd.uk", "me.uk", "net.uk", "nhs.uk", "org.uk", "plc.uk", "police.uk", "*.sch.uk", "us", "dni.us", "fed.us", "isa.us", "kids.us", "nsn.us", "ak.us", "al.us", "ar.us", "as.us", "az.us", "ca.us", "co.us", "ct.us", "dc.us", "de.us", "fl.us", "ga.us", "gu.us", "hi.us", "ia.us", "id.us", "il.us", "in.us", "ks.us", "ky.us", "la.us", "ma.us", "md.us", "me.us", "mi.us", "mn.us", "mo.us", "ms.us", "mt.us", "nc.us", "nd.us", "ne.us", "nh.us", "nj.us", "nm.us", "nv.us", "ny.us", "oh.us", "ok.us", "or.us", "pa.us", "pr.us", "ri.us", "sc.us", "sd.us", "tn.us", "tx.us", "ut.us", "vi.us", "vt.us", "va.us", "wa.us", "wi.us", "wv.us", "wy.us", "k12.ak.us", "k12.al.us", "k12.ar.us", "k12.as.us", "k12.az.us", "k12.ca.us", "k12.co.us", "k12.ct.us", "k12.dc.us", "k12.de.us", "k12.fl.us", "k12.ga.us", "k12.gu.us", "k12.ia.us", "k12.id.us", "k12.il.us", "k12.in.us", "k12.ks.us", "k12.ky.us", "k12.la.us", "k12.ma.us", "k12.md.us", "k12.me.us", "k12.mi.us", "k12.mn.us", "k12.mo.us", "k12.ms.us", "k12.mt.us", "k12.nc.us", "k12.ne.us", "k12.nh.us", "k12.nj.us", "k12.nm.us", "k12.nv.us", "k12.ny.us", "k12.oh.us", "k12.ok.us", "k12.or.us", "k12.pa.us", "k12.pr.us", "k12.sc.us", "k12.tn.us", "k12.tx.us", "k12.ut.us", "k12.vi.us", "k12.vt.us", "k12.va.us", "k12.wa.us", "k12.wi.us", "k12.wy.us", "cc.ak.us", "cc.al.us", "cc.ar.us", "cc.as.us", "cc.az.us", "cc.ca.us", "cc.co.us", "cc.ct.us", "cc.dc.us", "cc.de.us", "cc.fl.us", "cc.ga.us", "cc.gu.us", "cc.hi.us", "cc.ia.us", "cc.id.us", "cc.il.us", "cc.in.us", "cc.ks.us", "cc.ky.us", "cc.la.us", "cc.ma.us", "cc.md.us", "cc.me.us", "cc.mi.us", "cc.mn.us", "cc.mo.us", "cc.ms.us", "cc.mt.us", "cc.nc.us", "cc.nd.us", "cc.ne.us", "cc.nh.us", "cc.nj.us", "cc.nm.us", "cc.nv.us", "cc.ny.us", "cc.oh.us", "cc.ok.us", "cc.or.us", "cc.pa.us", "cc.pr.us", "cc.ri.us", "cc.sc.us", "cc.sd.us", "cc.tn.us", "cc.tx.us", "cc.ut.us", "cc.vi.us", "cc.vt.us", "cc.va.us", "cc.wa.us", "cc.wi.us", "cc.wv.us", "cc.wy.us", "lib.ak.us", "lib.al.us", "lib.ar.us", "lib.as.us", "lib.az.us", "lib.ca.us", "lib.co.us", "lib.ct.us", "lib.dc.us", "lib.fl.us", "lib.ga.us", "lib.gu.us", "lib.hi.us", "lib.ia.us", "lib.id.us", "lib.il.us", "lib.in.us", "lib.ks.us", "lib.ky.us", "lib.la.us", "lib.ma.us", "lib.md.us", "lib.me.us", "lib.mi.us", "lib.mn.us", "lib.mo.us", "lib.ms.us", "lib.mt.us", "lib.nc.us", "lib.nd.us", "lib.ne.us", "lib.nh.us", "lib.nj.us", "lib.nm.us", "lib.nv.us", "lib.ny.us", "lib.oh.us", "lib.ok.us", "lib.or.us", "lib.pa.us", "lib.pr.us", "lib.ri.us", "lib.sc.us", "lib.sd.us", "lib.tn.us", "lib.tx.us", "lib.ut.us", "lib.vi.us", "lib.vt.us", "lib.va.us", "lib.wa.us", "lib.wi.us", "lib.wy.us", "pvt.k12.ma.us", "chtr.k12.ma.us", "paroch.k12.ma.us", "ann-arbor.mi.us", "cog.mi.us", "dst.mi.us", "eaton.mi.us", "gen.mi.us", "mus.mi.us", "tec.mi.us", "washtenaw.mi.us", "uy", "com.uy", "edu.uy", "gub.uy", "mil.uy", "net.uy", "org.uy", "uz", "co.uz", "com.uz", "net.uz", "org.uz", "va", "vc", "com.vc", "net.vc", "org.vc", "gov.vc", "mil.vc", "edu.vc", "ve", "arts.ve", "bib.ve", "co.ve", "com.ve", "e12.ve", "edu.ve", "firm.ve", "gob.ve", "gov.ve", "info.ve", "int.ve", "mil.ve", "net.ve", "nom.ve", "org.ve", "rar.ve", "rec.ve", "store.ve", "tec.ve", "web.ve", "vg", "vi", "co.vi", "com.vi", "k12.vi", "net.vi", "org.vi", "vn", "com.vn", "net.vn", "org.vn", "edu.vn", "gov.vn", "int.vn", "ac.vn", "biz.vn", "info.vn", "name.vn", "pro.vn", "health.vn", "vu", "com.vu", "edu.vu", "net.vu", "org.vu", "wf", "ws", "com.ws", "net.ws", "org.ws", "gov.ws", "edu.ws", "yt", "\u0627\u0645\u0627\u0631\u0627\u062A", "\u0570\u0561\u0575", "\u09AC\u09BE\u0982\u09B2\u09BE", "\u0431\u0433", "\u0627\u0644\u0628\u062D\u0631\u064A\u0646", "\u0431\u0435\u043B", "\u4E2D\u56FD", "\u4E2D\u570B", "\u0627\u0644\u062C\u0632\u0627\u0626\u0631", "\u0645\u0635\u0631", "\u0435\u044E", "\u03B5\u03C5", "\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627", "\u10D2\u10D4", "\u03B5\u03BB", "\u9999\u6E2F", "\u516C\u53F8.\u9999\u6E2F", "\u6559\u80B2.\u9999\u6E2F", "\u653F\u5E9C.\u9999\u6E2F", "\u500B\u4EBA.\u9999\u6E2F", "\u7DB2\u7D61.\u9999\u6E2F", "\u7D44\u7E54.\u9999\u6E2F", "\u0CAD\u0CBE\u0CB0\u0CA4", "\u0B2D\u0B3E\u0B30\u0B24", "\u09AD\u09BE\u09F0\u09A4", "\u092D\u093E\u0930\u0924\u092E\u094D", "\u092D\u093E\u0930\u094B\u0924", "\u0680\u0627\u0631\u062A", "\u0D2D\u0D3E\u0D30\u0D24\u0D02", "\u092D\u093E\u0930\u0924", "\u0628\u0627\u0631\u062A", "\u0628\u06BE\u0627\u0631\u062A", "\u0C2D\u0C3E\u0C30\u0C24\u0C4D", "\u0AAD\u0ABE\u0AB0\u0AA4", "\u0A2D\u0A3E\u0A30\u0A24", "\u09AD\u09BE\u09B0\u09A4", "\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE", "\u0627\u06CC\u0631\u0627\u0646", "\u0627\u064A\u0631\u0627\u0646", "\u0639\u0631\u0627\u0642", "\u0627\u0644\u0627\u0631\u062F\u0646", "\uD55C\uAD6D", "\u049B\u0430\u0437", "\u0EA5\u0EB2\u0EA7", "\u0DBD\u0D82\u0D9A\u0DCF", "\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8", "\u0627\u0644\u0645\u063A\u0631\u0628", "\u043C\u043A\u0434", "\u043C\u043E\u043D", "\u6FB3\u9580", "\u6FB3\u95E8", "\u0645\u0644\u064A\u0633\u064A\u0627", "\u0639\u0645\u0627\u0646", "\u067E\u0627\u06A9\u0633\u062A\u0627\u0646", "\u067E\u0627\u0643\u0633\u062A\u0627\u0646", "\u0641\u0644\u0633\u0637\u064A\u0646", "\u0441\u0440\u0431", "\u043F\u0440.\u0441\u0440\u0431", "\u043E\u0440\u0433.\u0441\u0440\u0431", "\u043E\u0431\u0440.\u0441\u0440\u0431", "\u043E\u0434.\u0441\u0440\u0431", "\u0443\u043F\u0440.\u0441\u0440\u0431", "\u0430\u043A.\u0441\u0440\u0431", "\u0440\u0444", "\u0642\u0637\u0631", "\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629", "\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u0629", "\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u06C3", "\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0647", "\u0633\u0648\u062F\u0627\u0646", "\u65B0\u52A0\u5761", "\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD", "\u0633\u0648\u0631\u064A\u0629", "\u0633\u0648\u0631\u064A\u0627", "\u0E44\u0E17\u0E22", "\u0E28\u0E36\u0E01\u0E29\u0E32.\u0E44\u0E17\u0E22", "\u0E18\u0E38\u0E23\u0E01\u0E34\u0E08.\u0E44\u0E17\u0E22", "\u0E23\u0E31\u0E10\u0E1A\u0E32\u0E25.\u0E44\u0E17\u0E22", "\u0E17\u0E2B\u0E32\u0E23.\u0E44\u0E17\u0E22", "\u0E40\u0E19\u0E47\u0E15.\u0E44\u0E17\u0E22", "\u0E2D\u0E07\u0E04\u0E4C\u0E01\u0E23.\u0E44\u0E17\u0E22", "\u062A\u0648\u0646\u0633", "\u53F0\u7063", "\u53F0\u6E7E", "\u81FA\u7063", "\u0443\u043A\u0440", "\u0627\u0644\u064A\u0645\u0646", "xxx", "ye", "com.ye", "edu.ye", "gov.ye", "net.ye", "mil.ye", "org.ye", "ac.za", "agric.za", "alt.za", "co.za", "edu.za", "gov.za", "grondar.za", "law.za", "mil.za", "net.za", "ngo.za", "nic.za", "nis.za", "nom.za", "org.za", "school.za", "tm.za", "web.za", "zm", "ac.zm", "biz.zm", "co.zm", "com.zm", "edu.zm", "gov.zm", "info.zm", "mil.zm", "net.zm", "org.zm", "sch.zm", "zw", "ac.zw", "co.zw", "gov.zw", "mil.zw", "org.zw", "aaa", "aarp", "abarth", "abb", "abbott", "abbvie", "abc", "able", "abogado", "abudhabi", "academy", "accenture", "accountant", "accountants", "aco", "actor", "adac", "ads", "adult", "aeg", "aetna", "afl", "africa", "agakhan", "agency", "aig", "airbus", "airforce", "airtel", "akdn", "alfaromeo", "alibaba", "alipay", "allfinanz", "allstate", "ally", "alsace", "alstom", "amazon", "americanexpress", "americanfamily", "amex", "amfam", "amica", "amsterdam", "analytics", "android", "anquan", "anz", "aol", "apartments", "app", "apple", "aquarelle", "arab", "aramco", "archi", "army", "art", "arte", "asda", "associates", "athleta", "attorney", "auction", "audi", "audible", "audio", "auspost", "author", "auto", "autos", "avianca", "aws", "axa", "azure", "baby", "baidu", "banamex", "bananarepublic", "band", "bank", "bar", "barcelona", "barclaycard", "barclays", "barefoot", "bargains", "baseball", "basketball", "bauhaus", "bayern", "bbc", "bbt", "bbva", "bcg", "bcn", "beats", "beauty", "beer", "bentley", "berlin", "best", "bestbuy", "bet", "bharti", "bible", "bid", "bike", "bing", "bingo", "bio", "black", "blackfriday", "blockbuster", "blog", "bloomberg", "blue", "bms", "bmw", "bnpparibas", "boats", "boehringer", "bofa", "bom", "bond", "boo", "book", "booking", "bosch", "bostik", "boston", "bot", "boutique", "box", "bradesco", "bridgestone", "broadway", "broker", "brother", "brussels", "bugatti", "build", "builders", "business", "buy", "buzz", "bzh", "cab", "cafe", "cal", "call", "calvinklein", "cam", "camera", "camp", "cancerresearch", "canon", "capetown", "capital", "capitalone", "car", "caravan", "cards", "care", "career", "careers", "cars", "casa", "case", "cash", "casino", "catering", "catholic", "cba", "cbn", "cbre", "cbs", "center", "ceo", "cern", "cfa", "cfd", "chanel", "channel", "charity", "chase", "chat", "cheap", "chintai", "christmas", "chrome", "church", "cipriani", "circle", "cisco", "citadel", "citi", "citic", "city", "cityeats", "claims", "cleaning", "click", "clinic", "clinique", "clothing", "cloud", "club", "clubmed", "coach", "codes", "coffee", "college", "cologne", "comcast", "commbank", "community", "company", "compare", "computer", "comsec", "condos", "construction", "consulting", "contact", "contractors", "cooking", "cookingchannel", "cool", "corsica", "country", "coupon", "coupons", "courses", "cpa", "credit", "creditcard", "creditunion", "cricket", "crown", "crs", "cruise", "cruises", "cuisinella", "cymru", "cyou", "dabur", "dad", "dance", "data", "date", "dating", "datsun", "day", "dclk", "dds", "deal", "dealer", "deals", "degree", "delivery", "dell", "deloitte", "delta", "democrat", "dental", "dentist", "desi", "design", "dev", "dhl", "diamonds", "diet", "digital", "direct", "directory", "discount", "discover", "dish", "diy", "dnp", "docs", "doctor", "dog", "domains", "dot", "download", "drive", "dtv", "dubai", "dunlop", "dupont", "durban", "dvag", "dvr", "earth", "eat", "eco", "edeka", "education", "email", "emerck", "energy", "engineer", "engineering", "enterprises", "epson", "equipment", "ericsson", "erni", "esq", "estate", "etisalat", "eurovision", "eus", "events", "exchange", "expert", "exposed", "express", "extraspace", "fage", "fail", "fairwinds", "faith", "family", "fan", "fans", "farm", "farmers", "fashion", "fast", "fedex", "feedback", "ferrari", "ferrero", "fiat", "fidelity", "fido", "film", "final", "finance", "financial", "fire", "firestone", "firmdale", "fish", "fishing", "fit", "fitness", "flickr", "flights", "flir", "florist", "flowers", "fly", "foo", "food", "foodnetwork", "football", "ford", "forex", "forsale", "forum", "foundation", "fox", "free", "fresenius", "frl", "frogans", "frontdoor", "frontier", "ftr", "fujitsu", "fun", "fund", "furniture", "futbol", "fyi", "gal", "gallery", "gallo", "gallup", "game", "games", "gap", "garden", "gay", "gbiz", "gdn", "gea", "gent", "genting", "george", "ggee", "gift", "gifts", "gives", "giving", "glass", "gle", "global", "globo", "gmail", "gmbh", "gmo", "gmx", "godaddy", "gold", "goldpoint", "golf", "goo", "goodyear", "goog", "google", "gop", "got", "grainger", "graphics", "gratis", "green", "gripe", "grocery", "group", "guardian", "gucci", "guge", "guide", "guitars", "guru", "hair", "hamburg", "hangout", "haus", "hbo", "hdfc", "hdfcbank", "health", "healthcare", "help", "helsinki", "here", "hermes", "hgtv", "hiphop", "hisamitsu", "hitachi", "hiv", "hkt", "hockey", "holdings", "holiday", "homedepot", "homegoods", "homes", "homesense", "honda", "horse", "hospital", "host", "hosting", "hot", "hoteles", "hotels", "hotmail", "house", "how", "hsbc", "hughes", "hyatt", "hyundai", "ibm", "icbc", "ice", "icu", "ieee", "ifm", "ikano", "imamat", "imdb", "immo", "immobilien", "inc", "industries", "infiniti", "ing", "ink", "institute", "insurance", "insure", "international", "intuit", "investments", "ipiranga", "irish", "ismaili", "ist", "istanbul", "itau", "itv", "jaguar", "java", "jcb", "jeep", "jetzt", "jewelry", "jio", "jll", "jmp", "jnj", "joburg", "jot", "joy", "jpmorgan", "jprs", "juegos", "juniper", "kaufen", "kddi", "kerryhotels", "kerrylogistics", "kerryproperties", "kfh", "kia", "kids", "kim", "kinder", "kindle", "kitchen", "kiwi", "koeln", "komatsu", "kosher", "kpmg", "kpn", "krd", "kred", "kuokgroup", "kyoto", "lacaixa", "lamborghini", "lamer", "lancaster", "lancia", "land", "landrover", "lanxess", "lasalle", "lat", "latino", "latrobe", "law", "lawyer", "lds", "lease", "leclerc", "lefrak", "legal", "lego", "lexus", "lgbt", "lidl", "life", "lifeinsurance", "lifestyle", "lighting", "like", "lilly", "limited", "limo", "lincoln", "linde", "link", "lipsy", "live", "living", "llc", "llp", "loan", "loans", "locker", "locus", "loft", "lol", "london", "lotte", "lotto", "love", "lpl", "lplfinancial", "ltd", "ltda", "lundbeck", "luxe", "luxury", "macys", "madrid", "maif", "maison", "makeup", "man", "management", "mango", "map", "market", "marketing", "markets", "marriott", "marshalls", "maserati", "mattel", "mba", "mckinsey", "med", "media", "meet", "melbourne", "meme", "memorial", "men", "menu", "merckmsd", "miami", "microsoft", "mini", "mint", "mit", "mitsubishi", "mlb", "mls", "mma", "mobile", "moda", "moe", "moi", "mom", "monash", "money", "monster", "mormon", "mortgage", "moscow", "moto", "motorcycles", "mov", "movie", "msd", "mtn", "mtr", "music", "mutual", "nab", "nagoya", "natura", "navy", "nba", "nec", "netbank", "netflix", "network", "neustar", "new", "news", "next", "nextdirect", "nexus", "nfl", "ngo", "nhk", "nico", "nike", "nikon", "ninja", "nissan", "nissay", "nokia", "northwesternmutual", "norton", "now", "nowruz", "nowtv", "nra", "nrw", "ntt", "nyc", "obi", "observer", "office", "okinawa", "olayan", "olayangroup", "oldnavy", "ollo", "omega", "one", "ong", "onl", "online", "ooo", "open", "oracle", "orange", "organic", "origins", "osaka", "otsuka", "ott", "ovh", "page", "panasonic", "paris", "pars", "partners", "parts", "party", "passagens", "pay", "pccw", "pet", "pfizer", "pharmacy", "phd", "philips", "phone", "photo", "photography", "photos", "physio", "pics", "pictet", "pictures", "pid", "pin", "ping", "pink", "pioneer", "pizza", "place", "play", "playstation", "plumbing", "plus", "pnc", "pohl", "poker", "politie", "porn", "pramerica", "praxi", "press", "prime", "prod", "productions", "prof", "progressive", "promo", "properties", "property", "protection", "pru", "prudential", "pub", "pwc", "qpon", "quebec", "quest", "racing", "radio", "read", "realestate", "realtor", "realty", "recipes", "red", "redstone", "redumbrella", "rehab", "reise", "reisen", "reit", "reliance", "ren", "rent", "rentals", "repair", "report", "republican", "rest", "restaurant", "review", "reviews", "rexroth", "rich", "richardli", "ricoh", "ril", "rio", "rip", "rocher", "rocks", "rodeo", "rogers", "room", "rsvp", "rugby", "ruhr", "run", "rwe", "ryukyu", "saarland", "safe", "safety", "sakura", "sale", "salon", "samsclub", "samsung", "sandvik", "sandvikcoromant", "sanofi", "sap", "sarl", "sas", "save", "saxo", "sbi", "sbs", "sca", "scb", "schaeffler", "schmidt", "scholarships", "school", "schule", "schwarz", "science", "scot", "search", "seat", "secure", "security", "seek", "select", "sener", "services", "ses", "seven", "sew", "sex", "sexy", "sfr", "shangrila", "sharp", "shaw", "shell", "shia", "shiksha", "shoes", "shop", "shopping", "shouji", "show", "showtime", "silk", "sina", "singles", "site", "ski", "skin", "sky", "skype", "sling", "smart", "smile", "sncf", "soccer", "social", "softbank", "software", "sohu", "solar", "solutions", "song", "sony", "soy", "spa", "space", "sport", "spot", "srl", "stada", "staples", "star", "statebank", "statefarm", "stc", "stcgroup", "stockholm", "storage", "store", "stream", "studio", "study", "style", "sucks", "supplies", "supply", "support", "surf", "surgery", "suzuki", "swatch", "swiss", "sydney", "systems", "tab", "taipei", "talk", "taobao", "target", "tatamotors", "tatar", "tattoo", "tax", "taxi", "tci", "tdk", "team", "tech", "technology", "temasek", "tennis", "teva", "thd", "theater", "theatre", "tiaa", "tickets", "tienda", "tiffany", "tips", "tires", "tirol", "tjmaxx", "tjx", "tkmaxx", "tmall", "today", "tokyo", "tools", "top", "toray", "toshiba", "total", "tours", "town", "toyota", "toys", "trade", "trading", "training", "travel", "travelchannel", "travelers", "travelersinsurance", "trust", "trv", "tube", "tui", "tunes", "tushu", "tvs", "ubank", "ubs", "unicom", "university", "uno", "uol", "ups", "vacations", "vana", "vanguard", "vegas", "ventures", "verisign", "versicherung", "vet", "viajes", "video", "vig", "viking", "villas", "vin", "vip", "virgin", "visa", "vision", "viva", "vivo", "vlaanderen", "vodka", "volkswagen", "volvo", "vote", "voting", "voto", "voyage", "vuelos", "wales", "walmart", "walter", "wang", "wanggou", "watch", "watches", "weather", "weatherchannel", "webcam", "weber", "website", "wedding", "weibo", "weir", "whoswho", "wien", "wiki", "williamhill", "win", "windows", "wine", "winners", "wme", "wolterskluwer", "woodside", "work", "works", "world", "wow", "wtc", "wtf", "xbox", "xerox", "xfinity", "xihuan", "xin", "\u0915\u0949\u092E", "\u30BB\u30FC\u30EB", "\u4F5B\u5C71", "\u6148\u5584", "\u96C6\u56E2", "\u5728\u7EBF", "\u70B9\u770B", "\u0E04\u0E2D\u0E21", "\u516B\u5366", "\u0645\u0648\u0642\u0639", "\u516C\u76CA", "\u516C\u53F8", "\u9999\u683C\u91CC\u62C9", "\u7F51\u7AD9", "\u79FB\u52A8", "\u6211\u7231\u4F60", "\u043C\u043E\u0441\u043A\u0432\u0430", "\u043A\u0430\u0442\u043E\u043B\u0438\u043A", "\u043E\u043D\u043B\u0430\u0439\u043D", "\u0441\u0430\u0439\u0442", "\u8054\u901A", "\u05E7\u05D5\u05DD", "\u65F6\u5C1A", "\u5FAE\u535A", "\u6DE1\u9A6C\u9521", "\u30D5\u30A1\u30C3\u30B7\u30E7\u30F3", "\u043E\u0440\u0433", "\u0928\u0947\u091F", "\u30B9\u30C8\u30A2", "\u30A2\u30DE\u30BE\u30F3", "\uC0BC\uC131", "\u5546\u6807", "\u5546\u5E97", "\u5546\u57CE", "\u0434\u0435\u0442\u0438", "\u30DD\u30A4\u30F3\u30C8", "\u65B0\u95FB", "\u5BB6\u96FB", "\u0643\u0648\u0645", "\u4E2D\u6587\u7F51", "\u4E2D\u4FE1", "\u5A31\u4E50", "\u8C37\u6B4C", "\u96FB\u8A0A\u76C8\u79D1", "\u8D2D\u7269", "\u30AF\u30E9\u30A6\u30C9", "\u901A\u8CA9", "\u7F51\u5E97", "\u0938\u0902\u0917\u0920\u0928", "\u9910\u5385", "\u7F51\u7EDC", "\u043A\u043E\u043C", "\u4E9A\u9A6C\u900A", "\u8BFA\u57FA\u4E9A", "\u98DF\u54C1", "\u98DE\u5229\u6D66", "\u624B\u673A", "\u0627\u0631\u0627\u0645\u0643\u0648", "\u0627\u0644\u0639\u0644\u064A\u0627\u0646", "\u0627\u062A\u0635\u0627\u0644\u0627\u062A", "\u0628\u0627\u0632\u0627\u0631", "\u0627\u0628\u0648\u0638\u0628\u064A", "\u0643\u0627\u062B\u0648\u0644\u064A\u0643", "\u0647\u0645\u0631\u0627\u0647", "\uB2F7\uCEF4", "\u653F\u5E9C", "\u0634\u0628\u0643\u0629", "\u0628\u064A\u062A\u0643", "\u0639\u0631\u0628", "\u673A\u6784", "\u7EC4\u7EC7\u673A\u6784", "\u5065\u5EB7", "\u62DB\u8058", "\u0440\u0443\u0441", "\u5927\u62FF", "\u307F\u3093\u306A", "\u30B0\u30FC\u30B0\u30EB", "\u4E16\u754C", "\u66F8\u7C4D", "\u7F51\u5740", "\uB2F7\uB137", "\u30B3\u30E0", "\u5929\u4E3B\u6559", "\u6E38\u620F", "verm\xF6gensberater", "verm\xF6gensberatung", "\u4F01\u4E1A", "\u4FE1\u606F", "\u5609\u91CC\u5927\u9152\u5E97", "\u5609\u91CC", "\u5E7F\u4E1C", "\u653F\u52A1", "xyz", "yachts", "yahoo", "yamaxun", "yandex", "yodobashi", "yoga", "yokohama", "you", "youtube", "yun", "zappos", "zara", "zero", "zip", "zone", "zuerich", "cc.ua", "inf.ua", "ltd.ua", "611.to", "graphox.us", "*.devcdnaccesso.com", "adobeaemcloud.com", "*.dev.adobeaemcloud.com", "hlx.live", "adobeaemcloud.net", "hlx.page", "hlx3.page", "beep.pl", "airkitapps.com", "airkitapps-au.com", "airkitapps.eu", "aivencloud.com", "barsy.ca", "*.compute.estate", "*.alces.network", "kasserver.com", "altervista.org", "alwaysdata.net", "cloudfront.net", "*.compute.amazonaws.com", "*.compute-1.amazonaws.com", "*.compute.amazonaws.com.cn", "us-east-1.amazonaws.com", "cn-north-1.eb.amazonaws.com.cn", "cn-northwest-1.eb.amazonaws.com.cn", "elasticbeanstalk.com", "ap-northeast-1.elasticbeanstalk.com", "ap-northeast-2.elasticbeanstalk.com", "ap-northeast-3.elasticbeanstalk.com", "ap-south-1.elasticbeanstalk.com", "ap-southeast-1.elasticbeanstalk.com", "ap-southeast-2.elasticbeanstalk.com", "ca-central-1.elasticbeanstalk.com", "eu-central-1.elasticbeanstalk.com", "eu-west-1.elasticbeanstalk.com", "eu-west-2.elasticbeanstalk.com", "eu-west-3.elasticbeanstalk.com", "sa-east-1.elasticbeanstalk.com", "us-east-1.elasticbeanstalk.com", "us-east-2.elasticbeanstalk.com", "us-gov-west-1.elasticbeanstalk.com", "us-west-1.elasticbeanstalk.com", "us-west-2.elasticbeanstalk.com", "*.elb.amazonaws.com", "*.elb.amazonaws.com.cn", "awsglobalaccelerator.com", "s3.amazonaws.com", "s3-ap-northeast-1.amazonaws.com", "s3-ap-northeast-2.amazonaws.com", "s3-ap-south-1.amazonaws.com", "s3-ap-southeast-1.amazonaws.com", "s3-ap-southeast-2.amazonaws.com", "s3-ca-central-1.amazonaws.com", "s3-eu-central-1.amazonaws.com", "s3-eu-west-1.amazonaws.com", "s3-eu-west-2.amazonaws.com", "s3-eu-west-3.amazonaws.com", "s3-external-1.amazonaws.com", "s3-fips-us-gov-west-1.amazonaws.com", "s3-sa-east-1.amazonaws.com", "s3-us-gov-west-1.amazonaws.com", "s3-us-east-2.amazonaws.com", "s3-us-west-1.amazonaws.com", "s3-us-west-2.amazonaws.com", "s3.ap-northeast-2.amazonaws.com", "s3.ap-south-1.amazonaws.com", "s3.cn-north-1.amazonaws.com.cn", "s3.ca-central-1.amazonaws.com", "s3.eu-central-1.amazonaws.com", "s3.eu-west-2.amazonaws.com", "s3.eu-west-3.amazonaws.com", "s3.us-east-2.amazonaws.com", "s3.dualstack.ap-northeast-1.amazonaws.com", "s3.dualstack.ap-northeast-2.amazonaws.com", "s3.dualstack.ap-south-1.amazonaws.com", "s3.dualstack.ap-southeast-1.amazonaws.com", "s3.dualstack.ap-southeast-2.amazonaws.com", "s3.dualstack.ca-central-1.amazonaws.com", "s3.dualstack.eu-central-1.amazonaws.com", "s3.dualstack.eu-west-1.amazonaws.com", "s3.dualstack.eu-west-2.amazonaws.com", "s3.dualstack.eu-west-3.amazonaws.com", "s3.dualstack.sa-east-1.amazonaws.com", "s3.dualstack.us-east-1.amazonaws.com", "s3.dualstack.us-east-2.amazonaws.com", "s3-website-us-east-1.amazonaws.com", "s3-website-us-west-1.amazonaws.com", "s3-website-us-west-2.amazonaws.com", "s3-website-ap-northeast-1.amazonaws.com", "s3-website-ap-southeast-1.amazonaws.com", "s3-website-ap-southeast-2.amazonaws.com", "s3-website-eu-west-1.amazonaws.com", "s3-website-sa-east-1.amazonaws.com", "s3-website.ap-northeast-2.amazonaws.com", "s3-website.ap-south-1.amazonaws.com", "s3-website.ca-central-1.amazonaws.com", "s3-website.eu-central-1.amazonaws.com", "s3-website.eu-west-2.amazonaws.com", "s3-website.eu-west-3.amazonaws.com", "s3-website.us-east-2.amazonaws.com", "t3l3p0rt.net", "tele.amune.org", "apigee.io", "siiites.com", "appspacehosted.com", "appspaceusercontent.com", "appudo.net", "on-aptible.com", "user.aseinet.ne.jp", "gv.vc", "d.gv.vc", "user.party.eus", "pimienta.org", "poivron.org", "potager.org", "sweetpepper.org", "myasustor.com", "cdn.prod.atlassian-dev.net", "translated.page", "myfritz.net", "onavstack.net", "*.awdev.ca", "*.advisor.ws", "ecommerce-shop.pl", "b-data.io", "backplaneapp.io", "balena-devices.com", "rs.ba", "*.banzai.cloud", "app.banzaicloud.io", "*.backyards.banzaicloud.io", "base.ec", "official.ec", "buyshop.jp", "fashionstore.jp", "handcrafted.jp", "kawaiishop.jp", "supersale.jp", "theshop.jp", "shopselect.net", "base.shop", "*.beget.app", "betainabox.com", "bnr.la", "bitbucket.io", "blackbaudcdn.net", "of.je", "bluebite.io", "boomla.net", "boutir.com", "boxfuse.io", "square7.ch", "bplaced.com", "bplaced.de", "square7.de", "bplaced.net", "square7.net", "shop.brendly.rs", "browsersafetymark.io", "uk0.bigv.io", "dh.bytemark.co.uk", "vm.bytemark.co.uk", "cafjs.com", "mycd.eu", "drr.ac", "uwu.ai", "carrd.co", "crd.co", "ju.mp", "ae.org", "br.com", "cn.com", "com.de", "com.se", "de.com", "eu.com", "gb.net", "hu.net", "jp.net", "jpn.com", "mex.com", "ru.com", "sa.com", "se.net", "uk.com", "uk.net", "us.com", "za.bz", "za.com", "ar.com", "hu.com", "kr.com", "no.com", "qc.com", "uy.com", "africa.com", "gr.com", "in.net", "web.in", "us.org", "co.com", "aus.basketball", "nz.basketball", "radio.am", "radio.fm", "c.la", "certmgr.org", "cx.ua", "discourse.group", "discourse.team", "cleverapps.io", "clerk.app", "clerkstage.app", "*.lcl.dev", "*.lclstage.dev", "*.stg.dev", "*.stgstage.dev", "clickrising.net", "c66.me", "cloud66.ws", "cloud66.zone", "jdevcloud.com", "wpdevcloud.com", "cloudaccess.host", "freesite.host", "cloudaccess.net", "cloudcontrolled.com", "cloudcontrolapp.com", "*.cloudera.site", "pages.dev", "trycloudflare.com", "workers.dev", "wnext.app", "co.ca", "*.otap.co", "co.cz", "c.cdn77.org", "cdn77-ssl.net", "r.cdn77.net", "rsc.cdn77.org", "ssl.origin.cdn77-secure.org", "cloudns.asia", "cloudns.biz", "cloudns.club", "cloudns.cc", "cloudns.eu", "cloudns.in", "cloudns.info", "cloudns.org", "cloudns.pro", "cloudns.pw", "cloudns.us", "cnpy.gdn", "codeberg.page", "co.nl", "co.no", "webhosting.be", "hosting-cluster.nl", "ac.ru", "edu.ru", "gov.ru", "int.ru", "mil.ru", "test.ru", "dyn.cosidns.de", "dynamisches-dns.de", "dnsupdater.de", "internet-dns.de", "l-o-g-i-n.de", "dynamic-dns.info", "feste-ip.net", "knx-server.net", "static-access.net", "realm.cz", "*.cryptonomic.net", "cupcake.is", "curv.dev", "*.customer-oci.com", "*.oci.customer-oci.com", "*.ocp.customer-oci.com", "*.ocs.customer-oci.com", "cyon.link", "cyon.site", "fnwk.site", "folionetwork.site", "platform0.app", "daplie.me", "localhost.daplie.me", "dattolocal.com", "dattorelay.com", "dattoweb.com", "mydatto.com", "dattolocal.net", "mydatto.net", "biz.dk", "co.dk", "firm.dk", "reg.dk", "store.dk", "dyndns.dappnode.io", "*.dapps.earth", "*.bzz.dapps.earth", "builtwithdark.com", "demo.datadetect.com", "instance.datadetect.com", "edgestack.me", "ddns5.com", "debian.net", "deno.dev", "deno-staging.dev", "dedyn.io", "deta.app", "deta.dev", "*.rss.my.id", "*.diher.solutions", "discordsays.com", "discordsez.com", "jozi.biz", "dnshome.de", "online.th", "shop.th", "drayddns.com", "shoparena.pl", "dreamhosters.com", "mydrobo.com", "drud.io", "drud.us", "duckdns.org", "bip.sh", "bitbridge.net", "dy.fi", "tunk.org", "dyndns-at-home.com", "dyndns-at-work.com", "dyndns-blog.com", "dyndns-free.com", "dyndns-home.com", "dyndns-ip.com", "dyndns-mail.com", "dyndns-office.com", "dyndns-pics.com", "dyndns-remote.com", "dyndns-server.com", "dyndns-web.com", "dyndns-wiki.com", "dyndns-work.com", "dyndns.biz", "dyndns.info", "dyndns.org", "dyndns.tv", "at-band-camp.net", "ath.cx", "barrel-of-knowledge.info", "barrell-of-knowledge.info", "better-than.tv", "blogdns.com", "blogdns.net", "blogdns.org", "blogsite.org", "boldlygoingnowhere.org", "broke-it.net", "buyshouses.net", "cechire.com", "dnsalias.com", "dnsalias.net", "dnsalias.org", "dnsdojo.com", "dnsdojo.net", "dnsdojo.org", "does-it.net", "doesntexist.com", "doesntexist.org", "dontexist.com", "dontexist.net", "dontexist.org", "doomdns.com", "doomdns.org", "dvrdns.org", "dyn-o-saur.com", "dynalias.com", "dynalias.net", "dynalias.org", "dynathome.net", "dyndns.ws", "endofinternet.net", "endofinternet.org", "endoftheinternet.org", "est-a-la-maison.com", "est-a-la-masion.com", "est-le-patron.com", "est-mon-blogueur.com", "for-better.biz", "for-more.biz", "for-our.info", "for-some.biz", "for-the.biz", "forgot.her.name", "forgot.his.name", "from-ak.com", "from-al.com", "from-ar.com", "from-az.net", "from-ca.com", "from-co.net", "from-ct.com", "from-dc.com", "from-de.com", "from-fl.com", "from-ga.com", "from-hi.com", "from-ia.com", "from-id.com", "from-il.com", "from-in.com", "from-ks.com", "from-ky.com", "from-la.net", "from-ma.com", "from-md.com", "from-me.org", "from-mi.com", "from-mn.com", "from-mo.com", "from-ms.com", "from-mt.com", "from-nc.com", "from-nd.com", "from-ne.com", "from-nh.com", "from-nj.com", "from-nm.com", "from-nv.com", "from-ny.net", "from-oh.com", "from-ok.com", "from-or.com", "from-pa.com", "from-pr.com", "from-ri.com", "from-sc.com", "from-sd.com", "from-tn.com", "from-tx.com", "from-ut.com", "from-va.com", "from-vt.com", "from-wa.com", "from-wi.com", "from-wv.com", "from-wy.com", "ftpaccess.cc", "fuettertdasnetz.de", "game-host.org", "game-server.cc", "getmyip.com", "gets-it.net", "go.dyndns.org", "gotdns.com", "gotdns.org", "groks-the.info", "groks-this.info", "ham-radio-op.net", "here-for-more.info", "hobby-site.com", "hobby-site.org", "home.dyndns.org", "homedns.org", "homeftp.net", "homeftp.org", "homeip.net", "homelinux.com", "homelinux.net", "homelinux.org", "homeunix.com", "homeunix.net", "homeunix.org", "iamallama.com", "in-the-band.net", "is-a-anarchist.com", "is-a-blogger.com", "is-a-bookkeeper.com", "is-a-bruinsfan.org", "is-a-bulls-fan.com", "is-a-candidate.org", "is-a-caterer.com", "is-a-celticsfan.org", "is-a-chef.com", "is-a-chef.net", "is-a-chef.org", "is-a-conservative.com", "is-a-cpa.com", "is-a-cubicle-slave.com", "is-a-democrat.com", "is-a-designer.com", "is-a-doctor.com", "is-a-financialadvisor.com", "is-a-geek.com", "is-a-geek.net", "is-a-geek.org", "is-a-green.com", "is-a-guru.com", "is-a-hard-worker.com", "is-a-hunter.com", "is-a-knight.org", "is-a-landscaper.com", "is-a-lawyer.com", "is-a-liberal.com", "is-a-libertarian.com", "is-a-linux-user.org", "is-a-llama.com", "is-a-musician.com", "is-a-nascarfan.com", "is-a-nurse.com", "is-a-painter.com", "is-a-patsfan.org", "is-a-personaltrainer.com", "is-a-photographer.com", "is-a-player.com", "is-a-republican.com", "is-a-rockstar.com", "is-a-socialist.com", "is-a-soxfan.org", "is-a-student.com", "is-a-teacher.com", "is-a-techie.com", "is-a-therapist.com", "is-an-accountant.com", "is-an-actor.com", "is-an-actress.com", "is-an-anarchist.com", "is-an-artist.com", "is-an-engineer.com", "is-an-entertainer.com", "is-by.us", "is-certified.com", "is-found.org", "is-gone.com", "is-into-anime.com", "is-into-cars.com", "is-into-cartoons.com", "is-into-games.com", "is-leet.com", "is-lost.org", "is-not-certified.com", "is-saved.org", "is-slick.com", "is-uberleet.com", "is-very-bad.org", "is-very-evil.org", "is-very-good.org", "is-very-nice.org", "is-very-sweet.org", "is-with-theband.com", "isa-geek.com", "isa-geek.net", "isa-geek.org", "isa-hockeynut.com", "issmarterthanyou.com", "isteingeek.de", "istmein.de", "kicks-ass.net", "kicks-ass.org", "knowsitall.info", "land-4-sale.us", "lebtimnetz.de", "leitungsen.de", "likes-pie.com", "likescandy.com", "merseine.nu", "mine.nu", "misconfused.org", "mypets.ws", "myphotos.cc", "neat-url.com", "office-on-the.net", "on-the-web.tv", "podzone.net", "podzone.org", "readmyblog.org", "saves-the-whales.com", "scrapper-site.net", "scrapping.cc", "selfip.biz", "selfip.com", "selfip.info", "selfip.net", "selfip.org", "sells-for-less.com", "sells-for-u.com", "sells-it.net", "sellsyourhome.org", "servebbs.com", "servebbs.net", "servebbs.org", "serveftp.net", "serveftp.org", "servegame.org", "shacknet.nu", "simple-url.com", "space-to-rent.com", "stuff-4-sale.org", "stuff-4-sale.us", "teaches-yoga.com", "thruhere.net", "traeumtgerade.de", "webhop.biz", "webhop.info", "webhop.net", "webhop.org", "worse-than.tv", "writesthisblog.com", "ddnss.de", "dyn.ddnss.de", "dyndns.ddnss.de", "dyndns1.de", "dyn-ip24.de", "home-webserver.de", "dyn.home-webserver.de", "myhome-server.de", "ddnss.org", "definima.net", "definima.io", "ondigitalocean.app", "*.digitaloceanspaces.com", "bci.dnstrace.pro", "ddnsfree.com", "ddnsgeek.com", "giize.com", "gleeze.com", "kozow.com", "loseyourip.com", "ooguy.com", "theworkpc.com", "casacam.net", "dynu.net", "accesscam.org", "camdvr.org", "freeddns.org", "mywire.org", "webredirect.org", "myddns.rocks", "blogsite.xyz", "dynv6.net", "e4.cz", "eero.online", "eero-stage.online", "elementor.cloud", "elementor.cool", "en-root.fr", "mytuleap.com", "tuleap-partners.com", "encr.app", "encoreapi.com", "onred.one", "staging.onred.one", "eu.encoway.cloud", "eu.org", "al.eu.org", "asso.eu.org", "at.eu.org", "au.eu.org", "be.eu.org", "bg.eu.org", "ca.eu.org", "cd.eu.org", "ch.eu.org", "cn.eu.org", "cy.eu.org", "cz.eu.org", "de.eu.org", "dk.eu.org", "edu.eu.org", "ee.eu.org", "es.eu.org", "fi.eu.org", "fr.eu.org", "gr.eu.org", "hr.eu.org", "hu.eu.org", "ie.eu.org", "il.eu.org", "in.eu.org", "int.eu.org", "is.eu.org", "it.eu.org", "jp.eu.org", "kr.eu.org", "lt.eu.org", "lu.eu.org", "lv.eu.org", "mc.eu.org", "me.eu.org", "mk.eu.org", "mt.eu.org", "my.eu.org", "net.eu.org", "ng.eu.org", "nl.eu.org", "no.eu.org", "nz.eu.org", "paris.eu.org", "pl.eu.org", "pt.eu.org", "q-a.eu.org", "ro.eu.org", "ru.eu.org", "se.eu.org", "si.eu.org", "sk.eu.org", "tr.eu.org", "uk.eu.org", "us.eu.org", "eurodir.ru", "eu-1.evennode.com", "eu-2.evennode.com", "eu-3.evennode.com", "eu-4.evennode.com", "us-1.evennode.com", "us-2.evennode.com", "us-3.evennode.com", "us-4.evennode.com", "twmail.cc", "twmail.net", "twmail.org", "mymailer.com.tw", "url.tw", "onfabrica.com", "apps.fbsbx.com", "ru.net", "adygeya.ru", "bashkiria.ru", "bir.ru", "cbg.ru", "com.ru", "dagestan.ru", "grozny.ru", "kalmykia.ru", "kustanai.ru", "marine.ru", "mordovia.ru", "msk.ru", "mytis.ru", "nalchik.ru", "nov.ru", "pyatigorsk.ru", "spb.ru", "vladikavkaz.ru", "vladimir.ru", "abkhazia.su", "adygeya.su", "aktyubinsk.su", "arkhangelsk.su", "armenia.su", "ashgabad.su", "azerbaijan.su", "balashov.su", "bashkiria.su", "bryansk.su", "bukhara.su", "chimkent.su", "dagestan.su", "east-kazakhstan.su", "exnet.su", "georgia.su", "grozny.su", "ivanovo.su", "jambyl.su", "kalmykia.su", "kaluga.su", "karacol.su", "karaganda.su", "karelia.su", "khakassia.su", "krasnodar.su", "kurgan.su", "kustanai.su", "lenug.su", "mangyshlak.su", "mordovia.su", "msk.su", "murmansk.su", "nalchik.su", "navoi.su", "north-kazakhstan.su", "nov.su", "obninsk.su", "penza.su", "pokrovsk.su", "sochi.su", "spb.su", "tashkent.su", "termez.su", "togliatti.su", "troitsk.su", "tselinograd.su", "tula.su", "tuva.su", "vladikavkaz.su", "vladimir.su", "vologda.su", "channelsdvr.net", "u.channelsdvr.net", "edgecompute.app", "fastly-terrarium.com", "fastlylb.net", "map.fastlylb.net", "freetls.fastly.net", "map.fastly.net", "a.prod.fastly.net", "global.prod.fastly.net", "a.ssl.fastly.net", "b.ssl.fastly.net", "global.ssl.fastly.net", "fastvps-server.com", "fastvps.host", "myfast.host", "fastvps.site", "myfast.space", "fedorainfracloud.org", "fedorapeople.org", "cloud.fedoraproject.org", "app.os.fedoraproject.org", "app.os.stg.fedoraproject.org", "conn.uk", "copro.uk", "hosp.uk", "mydobiss.com", "fh-muenster.io", "filegear.me", "filegear-au.me", "filegear-de.me", "filegear-gb.me", "filegear-ie.me", "filegear-jp.me", "filegear-sg.me", "firebaseapp.com", "fireweb.app", "flap.id", "onflashdrive.app", "fldrv.com", "fly.dev", "edgeapp.net", "shw.io", "flynnhosting.net", "forgeblocks.com", "id.forgerock.io", "framer.app", "framercanvas.com", "*.frusky.de", "ravpage.co.il", "0e.vc", "freebox-os.com", "freeboxos.com", "fbx-os.fr", "fbxos.fr", "freebox-os.fr", "freeboxos.fr", "freedesktop.org", "freemyip.com", "wien.funkfeuer.at", "*.futurecms.at", "*.ex.futurecms.at", "*.in.futurecms.at", "futurehosting.at", "futuremailing.at", "*.ex.ortsinfo.at", "*.kunden.ortsinfo.at", "*.statics.cloud", "independent-commission.uk", "independent-inquest.uk", "independent-inquiry.uk", "independent-panel.uk", "independent-review.uk", "public-inquiry.uk", "royal-commission.uk", "campaign.gov.uk", "service.gov.uk", "api.gov.uk", "gehirn.ne.jp", "usercontent.jp", "gentapps.com", "gentlentapis.com", "lab.ms", "cdn-edges.net", "ghost.io", "gsj.bz", "githubusercontent.com", "githubpreview.dev", "github.io", "gitlab.io", "gitapp.si", "gitpage.si", "glitch.me", "nog.community", "co.ro", "shop.ro", "lolipop.io", "angry.jp", "babyblue.jp", "babymilk.jp", "backdrop.jp", "bambina.jp", "bitter.jp", "blush.jp", "boo.jp", "boy.jp", "boyfriend.jp", "but.jp", "candypop.jp", "capoo.jp", "catfood.jp", "cheap.jp", "chicappa.jp", "chillout.jp", "chips.jp", "chowder.jp", "chu.jp", "ciao.jp", "cocotte.jp", "coolblog.jp", "cranky.jp", "cutegirl.jp", "daa.jp", "deca.jp", "deci.jp", "digick.jp", "egoism.jp", "fakefur.jp", "fem.jp", "flier.jp", "floppy.jp", "fool.jp", "frenchkiss.jp", "girlfriend.jp", "girly.jp", "gloomy.jp", "gonna.jp", "greater.jp", "hacca.jp", "heavy.jp", "her.jp", "hiho.jp", "hippy.jp", "holy.jp", "hungry.jp", "icurus.jp", "itigo.jp", "jellybean.jp", "kikirara.jp", "kill.jp", "kilo.jp", "kuron.jp", "littlestar.jp", "lolipopmc.jp", "lolitapunk.jp", "lomo.jp", "lovepop.jp", "lovesick.jp", "main.jp", "mods.jp", "mond.jp", "mongolian.jp", "moo.jp", "namaste.jp", "nikita.jp", "nobushi.jp", "noor.jp", "oops.jp", "parallel.jp", "parasite.jp", "pecori.jp", "peewee.jp", "penne.jp", "pepper.jp", "perma.jp", "pigboat.jp", "pinoko.jp", "punyu.jp", "pupu.jp", "pussycat.jp", "pya.jp", "raindrop.jp", "readymade.jp", "sadist.jp", "schoolbus.jp", "secret.jp", "staba.jp", "stripper.jp", "sub.jp", "sunnyday.jp", "thick.jp", "tonkotsu.jp", "under.jp", "upper.jp", "velvet.jp", "verse.jp", "versus.jp", "vivian.jp", "watson.jp", "weblike.jp", "whitesnow.jp", "zombie.jp", "heteml.net", "cloudapps.digital", "london.cloudapps.digital", "pymnt.uk", "homeoffice.gov.uk", "ro.im", "goip.de", "run.app", "a.run.app", "web.app", "*.0emm.com", "appspot.com", "*.r.appspot.com", "codespot.com", "googleapis.com", "googlecode.com", "pagespeedmobilizer.com", "publishproxy.com", "withgoogle.com", "withyoutube.com", "*.gateway.dev", "cloud.goog", "translate.goog", "*.usercontent.goog", "cloudfunctions.net", "blogspot.ae", "blogspot.al", "blogspot.am", "blogspot.ba", "blogspot.be", "blogspot.bg", "blogspot.bj", "blogspot.ca", "blogspot.cf", "blogspot.ch", "blogspot.cl", "blogspot.co.at", "blogspot.co.id", "blogspot.co.il", "blogspot.co.ke", "blogspot.co.nz", "blogspot.co.uk", "blogspot.co.za", "blogspot.com", "blogspot.com.ar", "blogspot.com.au", "blogspot.com.br", "blogspot.com.by", "blogspot.com.co", "blogspot.com.cy", "blogspot.com.ee", "blogspot.com.eg", "blogspot.com.es", "blogspot.com.mt", "blogspot.com.ng", "blogspot.com.tr", "blogspot.com.uy", "blogspot.cv", "blogspot.cz", "blogspot.de", "blogspot.dk", "blogspot.fi", "blogspot.fr", "blogspot.gr", "blogspot.hk", "blogspot.hr", "blogspot.hu", "blogspot.ie", "blogspot.in", "blogspot.is", "blogspot.it", "blogspot.jp", "blogspot.kr", "blogspot.li", "blogspot.lt", "blogspot.lu", "blogspot.md", "blogspot.mk", "blogspot.mr", "blogspot.mx", "blogspot.my", "blogspot.nl", "blogspot.no", "blogspot.pe", "blogspot.pt", "blogspot.qa", "blogspot.re", "blogspot.ro", "blogspot.rs", "blogspot.ru", "blogspot.se", "blogspot.sg", "blogspot.si", "blogspot.sk", "blogspot.sn", "blogspot.td", "blogspot.tw", "blogspot.ug", "blogspot.vn", "goupile.fr", "gov.nl", "awsmppl.com", "g\xFCnstigbestellen.de", "g\xFCnstigliefern.de", "fin.ci", "free.hr", "caa.li", "ua.rs", "conf.se", "hs.zone", "hs.run", "hashbang.sh", "hasura.app", "hasura-app.io", "pages.it.hs-heilbronn.de", "hepforge.org", "herokuapp.com", "herokussl.com", "ravendb.cloud", "myravendb.com", "ravendb.community", "ravendb.me", "development.run", "ravendb.run", "homesklep.pl", "secaas.hk", "hoplix.shop", "orx.biz", "biz.gl", "col.ng", "firm.ng", "gen.ng", "ltd.ng", "ngo.ng", "edu.scot", "sch.so", "hostyhosting.io", "h\xE4kkinen.fi", "*.moonscale.io", "moonscale.net", "iki.fi", "ibxos.it", "iliadboxos.it", "impertrixcdn.com", "impertrix.com", "smushcdn.com", "wphostedmail.com", "wpmucdn.com", "tempurl.host", "wpmudev.host", "dyn-berlin.de", "in-berlin.de", "in-brb.de", "in-butter.de", "in-dsl.de", "in-dsl.net", "in-dsl.org", "in-vpn.de", "in-vpn.net", "in-vpn.org", "biz.at", "info.at", "info.cx", "ac.leg.br", "al.leg.br", "am.leg.br", "ap.leg.br", "ba.leg.br", "ce.leg.br", "df.leg.br", "es.leg.br", "go.leg.br", "ma.leg.br", "mg.leg.br", "ms.leg.br", "mt.leg.br", "pa.leg.br", "pb.leg.br", "pe.leg.br", "pi.leg.br", "pr.leg.br", "rj.leg.br", "rn.leg.br", "ro.leg.br", "rr.leg.br", "rs.leg.br", "sc.leg.br", "se.leg.br", "sp.leg.br", "to.leg.br", "pixolino.com", "na4u.ru", "iopsys.se", "ipifony.net", "iservschule.de", "mein-iserv.de", "schulplattform.de", "schulserver.de", "test-iserv.de", "iserv.dev", "iobb.net", "mel.cloudlets.com.au", "cloud.interhostsolutions.be", "users.scale.virtualcloud.com.br", "mycloud.by", "alp1.ae.flow.ch", "appengine.flow.ch", "es-1.axarnet.cloud", "diadem.cloud", "vip.jelastic.cloud", "jele.cloud", "it1.eur.aruba.jenv-aruba.cloud", "it1.jenv-aruba.cloud", "keliweb.cloud", "cs.keliweb.cloud", "oxa.cloud", "tn.oxa.cloud", "uk.oxa.cloud", "primetel.cloud", "uk.primetel.cloud", "ca.reclaim.cloud", "uk.reclaim.cloud", "us.reclaim.cloud", "ch.trendhosting.cloud", "de.trendhosting.cloud", "jele.club", "amscompute.com", "clicketcloud.com", "dopaas.com", "hidora.com", "paas.hosted-by-previder.com", "rag-cloud.hosteur.com", "rag-cloud-ch.hosteur.com", "jcloud.ik-server.com", "jcloud-ver-jpc.ik-server.com", "demo.jelastic.com", "kilatiron.com", "paas.massivegrid.com", "jed.wafaicloud.com", "lon.wafaicloud.com", "ryd.wafaicloud.com", "j.scaleforce.com.cy", "jelastic.dogado.eu", "fi.cloudplatform.fi", "demo.datacenter.fi", "paas.datacenter.fi", "jele.host", "mircloud.host", "paas.beebyte.io", "sekd1.beebyteapp.io", "jele.io", "cloud-fr1.unispace.io", "jc.neen.it", "cloud.jelastic.open.tim.it", "jcloud.kz", "upaas.kazteleport.kz", "cloudjiffy.net", "fra1-de.cloudjiffy.net", "west1-us.cloudjiffy.net", "jls-sto1.elastx.net", "jls-sto2.elastx.net", "jls-sto3.elastx.net", "faststacks.net", "fr-1.paas.massivegrid.net", "lon-1.paas.massivegrid.net", "lon-2.paas.massivegrid.net", "ny-1.paas.massivegrid.net", "ny-2.paas.massivegrid.net", "sg-1.paas.massivegrid.net", "jelastic.saveincloud.net", "nordeste-idc.saveincloud.net", "j.scaleforce.net", "jelastic.tsukaeru.net", "sdscloud.pl", "unicloud.pl", "mircloud.ru", "jelastic.regruhosting.ru", "enscaled.sg", "jele.site", "jelastic.team", "orangecloud.tn", "j.layershift.co.uk", "phx.enscaled.us", "mircloud.us", "myjino.ru", "*.hosting.myjino.ru", "*.landing.myjino.ru", "*.spectrum.myjino.ru", "*.vps.myjino.ru", "jotelulu.cloud", "*.triton.zone", "*.cns.joyent.com", "js.org", "kaas.gg", "khplay.nl", "ktistory.com", "kapsi.fi", "keymachine.de", "kinghost.net", "uni5.net", "knightpoint.systems", "koobin.events", "oya.to", "kuleuven.cloud", "ezproxy.kuleuven.be", "co.krd", "edu.krd", "krellian.net", "webthings.io", "git-repos.de", "lcube-server.de", "svn-repos.de", "leadpages.co", "lpages.co", "lpusercontent.com", "lelux.site", "co.business", "co.education", "co.events", "co.financial", "co.network", "co.place", "co.technology", "app.lmpm.com", "linkyard.cloud", "linkyard-cloud.ch", "members.linode.com", "*.nodebalancer.linode.com", "*.linodeobjects.com", "ip.linodeusercontent.com", "we.bs", "*.user.localcert.dev", "localzone.xyz", "loginline.app", "loginline.dev", "loginline.io", "loginline.services", "loginline.site", "servers.run", "lohmus.me", "krasnik.pl", "leczna.pl", "lubartow.pl", "lublin.pl", "poniatowa.pl", "swidnik.pl", "glug.org.uk", "lug.org.uk", "lugs.org.uk", "barsy.bg", "barsy.co.uk", "barsyonline.co.uk", "barsycenter.com", "barsyonline.com", "barsy.club", "barsy.de", "barsy.eu", "barsy.in", "barsy.info", "barsy.io", "barsy.me", "barsy.menu", "barsy.mobi", "barsy.net", "barsy.online", "barsy.org", "barsy.pro", "barsy.pub", "barsy.ro", "barsy.shop", "barsy.site", "barsy.support", "barsy.uk", "*.magentosite.cloud", "mayfirst.info", "mayfirst.org", "hb.cldmail.ru", "cn.vu", "mazeplay.com", "mcpe.me", "mcdir.me", "mcdir.ru", "mcpre.ru", "vps.mcdir.ru", "mediatech.by", "mediatech.dev", "hra.health", "miniserver.com", "memset.net", "messerli.app", "*.cloud.metacentrum.cz", "custom.metacentrum.cz", "flt.cloud.muni.cz", "usr.cloud.muni.cz", "meteorapp.com", "eu.meteorapp.com", "co.pl", "*.azurecontainer.io", "azurewebsites.net", "azure-mobile.net", "cloudapp.net", "azurestaticapps.net", "1.azurestaticapps.net", "centralus.azurestaticapps.net", "eastasia.azurestaticapps.net", "eastus2.azurestaticapps.net", "westeurope.azurestaticapps.net", "westus2.azurestaticapps.net", "csx.cc", "mintere.site", "forte.id", "mozilla-iot.org", "bmoattachments.org", "net.ru", "org.ru", "pp.ru", "hostedpi.com", "customer.mythic-beasts.com", "caracal.mythic-beasts.com", "fentiger.mythic-beasts.com", "lynx.mythic-beasts.com", "ocelot.mythic-beasts.com", "oncilla.mythic-beasts.com", "onza.mythic-beasts.com", "sphinx.mythic-beasts.com", "vs.mythic-beasts.com", "x.mythic-beasts.com", "yali.mythic-beasts.com", "cust.retrosnub.co.uk", "ui.nabu.casa", "pony.club", "of.fashion", "in.london", "of.london", "from.marketing", "with.marketing", "for.men", "repair.men", "and.mom", "for.mom", "for.one", "under.one", "for.sale", "that.win", "from.work", "to.work", "cloud.nospamproxy.com", "netlify.app", "4u.com", "ngrok.io", "nh-serv.co.uk", "nfshost.com", "*.developer.app", "noop.app", "*.northflank.app", "*.build.run", "*.code.run", "*.database.run", "*.migration.run", "noticeable.news", "dnsking.ch", "mypi.co", "n4t.co", "001www.com", "ddnslive.com", "myiphost.com", "forumz.info", "16-b.it", "32-b.it", "64-b.it", "soundcast.me", "tcp4.me", "dnsup.net", "hicam.net", "now-dns.net", "ownip.net", "vpndns.net", "dynserv.org", "now-dns.org", "x443.pw", "now-dns.top", "ntdll.top", "freeddns.us", "crafting.xyz", "zapto.xyz", "nsupdate.info", "nerdpol.ovh", "blogsyte.com", "brasilia.me", "cable-modem.org", "ciscofreak.com", "collegefan.org", "couchpotatofries.org", "damnserver.com", "ddns.me", "ditchyourip.com", "dnsfor.me", "dnsiskinky.com", "dvrcam.info", "dynns.com", "eating-organic.net", "fantasyleague.cc", "geekgalaxy.com", "golffan.us", "health-carereform.com", "homesecuritymac.com", "homesecuritypc.com", "hopto.me", "ilovecollege.info", "loginto.me", "mlbfan.org", "mmafan.biz", "myactivedirectory.com", "mydissent.net", "myeffect.net", "mymediapc.net", "mypsx.net", "mysecuritycamera.com", "mysecuritycamera.net", "mysecuritycamera.org", "net-freaks.com", "nflfan.org", "nhlfan.net", "no-ip.ca", "no-ip.co.uk", "no-ip.net", "noip.us", "onthewifi.com", "pgafan.net", "point2this.com", "pointto.us", "privatizehealthinsurance.net", "quicksytes.com", "read-books.org", "securitytactics.com", "serveexchange.com", "servehumour.com", "servep2p.com", "servesarcasm.com", "stufftoread.com", "ufcfan.org", "unusualperson.com", "workisboring.com", "3utilities.com", "bounceme.net", "ddns.net", "ddnsking.com", "gotdns.ch", "hopto.org", "myftp.biz", "myftp.org", "myvnc.com", "no-ip.biz", "no-ip.info", "no-ip.org", "noip.me", "redirectme.net", "servebeer.com", "serveblog.net", "servecounterstrike.com", "serveftp.com", "servegame.com", "servehalflife.com", "servehttp.com", "serveirc.com", "serveminecraft.net", "servemp3.com", "servepics.com", "servequake.com", "sytes.net", "webhop.me", "zapto.org", "stage.nodeart.io", "pcloud.host", "nyc.mn", "static.observableusercontent.com", "cya.gg", "omg.lol", "cloudycluster.net", "omniwe.site", "service.one", "nid.io", "opensocial.site", "opencraft.hosting", "orsites.com", "operaunite.com", "tech.orange", "authgear-staging.com", "authgearapps.com", "skygearapp.com", "outsystemscloud.com", "*.webpaas.ovh.net", "*.hosting.ovh.net", "ownprovider.com", "own.pm", "*.owo.codes", "ox.rs", "oy.lc", "pgfog.com", "pagefrontapp.com", "pagexl.com", "*.paywhirl.com", "bar0.net", "bar1.net", "bar2.net", "rdv.to", "art.pl", "gliwice.pl", "krakow.pl", "poznan.pl", "wroc.pl", "zakopane.pl", "pantheonsite.io", "gotpantheon.com", "mypep.link", "perspecta.cloud", "lk3.ru", "on-web.fr", "bc.platform.sh", "ent.platform.sh", "eu.platform.sh", "us.platform.sh", "*.platformsh.site", "*.tst.site", "platter-app.com", "platter-app.dev", "platterp.us", "pdns.page", "plesk.page", "pleskns.com", "dyn53.io", "onporter.run", "co.bn", "postman-echo.com", "pstmn.io", "mock.pstmn.io", "httpbin.org", "prequalifyme.today", "xen.prgmr.com", "priv.at", "prvcy.page", "*.dweb.link", "protonet.io", "chirurgiens-dentistes-en-france.fr", "byen.site", "pubtls.org", "pythonanywhere.com", "eu.pythonanywhere.com", "qoto.io", "qualifioapp.com", "qbuser.com", "cloudsite.builders", "instances.spawn.cc", "instantcloud.cn", "ras.ru", "qa2.com", "qcx.io", "*.sys.qcx.io", "dev-myqnapcloud.com", "alpha-myqnapcloud.com", "myqnapcloud.com", "*.quipelements.com", "vapor.cloud", "vaporcloud.io", "rackmaze.com", "rackmaze.net", "g.vbrplsbx.io", "*.on-k3s.io", "*.on-rancher.cloud", "*.on-rio.io", "readthedocs.io", "rhcloud.com", "app.render.com", "onrender.com", "repl.co", "id.repl.co", "repl.run", "resindevice.io", "devices.resinstaging.io", "hzc.io", "wellbeingzone.eu", "wellbeingzone.co.uk", "adimo.co.uk", "itcouldbewor.se", "git-pages.rit.edu", "rocky.page", "\u0431\u0438\u0437.\u0440\u0443\u0441", "\u043A\u043E\u043C.\u0440\u0443\u0441", "\u043A\u0440\u044B\u043C.\u0440\u0443\u0441", "\u043C\u0438\u0440.\u0440\u0443\u0441", "\u043C\u0441\u043A.\u0440\u0443\u0441", "\u043E\u0440\u0433.\u0440\u0443\u0441", "\u0441\u0430\u043C\u0430\u0440\u0430.\u0440\u0443\u0441", "\u0441\u043E\u0447\u0438.\u0440\u0443\u0441", "\u0441\u043F\u0431.\u0440\u0443\u0441", "\u044F.\u0440\u0443\u0441", "*.builder.code.com", "*.dev-builder.code.com", "*.stg-builder.code.com", "sandcats.io", "logoip.de", "logoip.com", "fr-par-1.baremetal.scw.cloud", "fr-par-2.baremetal.scw.cloud", "nl-ams-1.baremetal.scw.cloud", "fnc.fr-par.scw.cloud", "functions.fnc.fr-par.scw.cloud", "k8s.fr-par.scw.cloud", "nodes.k8s.fr-par.scw.cloud", "s3.fr-par.scw.cloud", "s3-website.fr-par.scw.cloud", "whm.fr-par.scw.cloud", "priv.instances.scw.cloud", "pub.instances.scw.cloud", "k8s.scw.cloud", "k8s.nl-ams.scw.cloud", "nodes.k8s.nl-ams.scw.cloud", "s3.nl-ams.scw.cloud", "s3-website.nl-ams.scw.cloud", "whm.nl-ams.scw.cloud", "k8s.pl-waw.scw.cloud", "nodes.k8s.pl-waw.scw.cloud", "s3.pl-waw.scw.cloud", "s3-website.pl-waw.scw.cloud", "scalebook.scw.cloud", "smartlabeling.scw.cloud", "dedibox.fr", "schokokeks.net", "gov.scot", "service.gov.scot", "scrysec.com", "firewall-gateway.com", "firewall-gateway.de", "my-gateway.de", "my-router.de", "spdns.de", "spdns.eu", "firewall-gateway.net", "my-firewall.org", "myfirewall.org", "spdns.org", "seidat.net", "sellfy.store", "senseering.net", "minisite.ms", "magnet.page", "biz.ua", "co.ua", "pp.ua", "shiftcrypto.dev", "shiftcrypto.io", "shiftedit.io", "myshopblocks.com", "myshopify.com", "shopitsite.com", "shopware.store", "mo-siemens.io", "1kapp.com", "appchizi.com", "applinzi.com", "sinaapp.com", "vipsinaapp.com", "siteleaf.net", "bounty-full.com", "alpha.bounty-full.com", "beta.bounty-full.com", "small-web.org", "vp4.me", "try-snowplow.com", "srht.site", "stackhero-network.com", "musician.io", "novecore.site", "static.land", "dev.static.land", "sites.static.land", "storebase.store", "vps-host.net", "atl.jelastic.vps-host.net", "njs.jelastic.vps-host.net", "ric.jelastic.vps-host.net", "playstation-cloud.com", "apps.lair.io", "*.stolos.io", "spacekit.io", "customer.speedpartner.de", "myspreadshop.at", "myspreadshop.com.au", "myspreadshop.be", "myspreadshop.ca", "myspreadshop.ch", "myspreadshop.com", "myspreadshop.de", "myspreadshop.dk", "myspreadshop.es", "myspreadshop.fi", "myspreadshop.fr", "myspreadshop.ie", "myspreadshop.it", "myspreadshop.net", "myspreadshop.nl", "myspreadshop.no", "myspreadshop.pl", "myspreadshop.se", "myspreadshop.co.uk", "api.stdlib.com", "storj.farm", "utwente.io", "soc.srcf.net", "user.srcf.net", "temp-dns.com", "supabase.co", "supabase.in", "supabase.net", "su.paba.se", "*.s5y.io", "*.sensiosite.cloud", "syncloud.it", "dscloud.biz", "direct.quickconnect.cn", "dsmynas.com", "familyds.com", "diskstation.me", "dscloud.me", "i234.me", "myds.me", "synology.me", "dscloud.mobi", "dsmynas.net", "familyds.net", "dsmynas.org", "familyds.org", "vpnplus.to", "direct.quickconnect.to", "tabitorder.co.il", "taifun-dns.de", "beta.tailscale.net", "ts.net", "gda.pl", "gdansk.pl", "gdynia.pl", "med.pl", "sopot.pl", "site.tb-hosting.com", "edugit.io", "s3.teckids.org", "telebit.app", "telebit.io", "*.telebit.xyz", "gwiddle.co.uk", "*.firenet.ch", "*.svc.firenet.ch", "reservd.com", "thingdustdata.com", "cust.dev.thingdust.io", "cust.disrec.thingdust.io", "cust.prod.thingdust.io", "cust.testing.thingdust.io", "reservd.dev.thingdust.io", "reservd.disrec.thingdust.io", "reservd.testing.thingdust.io", "tickets.io", "arvo.network", "azimuth.network", "tlon.network", "torproject.net", "pages.torproject.net", "bloxcms.com", "townnews-staging.com", "tbits.me", "12hp.at", "2ix.at", "4lima.at", "lima-city.at", "12hp.ch", "2ix.ch", "4lima.ch", "lima-city.ch", "trafficplex.cloud", "de.cool", "12hp.de", "2ix.de", "4lima.de", "lima-city.de", "1337.pictures", "clan.rip", "lima-city.rocks", "webspace.rocks", "lima.zone", "*.transurl.be", "*.transurl.eu", "*.transurl.nl", "site.transip.me", "tuxfamily.org", "dd-dns.de", "diskstation.eu", "diskstation.org", "dray-dns.de", "draydns.de", "dyn-vpn.de", "dynvpn.de", "mein-vigor.de", "my-vigor.de", "my-wan.de", "syno-ds.de", "synology-diskstation.de", "synology-ds.de", "typedream.app", "pro.typeform.com", "uber.space", "*.uberspace.de", "hk.com", "hk.org", "ltd.hk", "inc.hk", "name.pm", "sch.tf", "biz.wf", "sch.wf", "org.yt", "virtualuser.de", "virtual-user.de", "upli.io", "urown.cloud", "dnsupdate.info", "lib.de.us", "2038.io", "vercel.app", "vercel.dev", "now.sh", "router.management", "v-info.info", "voorloper.cloud", "neko.am", "nyaa.am", "be.ax", "cat.ax", "es.ax", "eu.ax", "gg.ax", "mc.ax", "us.ax", "xy.ax", "nl.ci", "xx.gl", "app.gp", "blog.gt", "de.gt", "to.gt", "be.gy", "cc.hn", "blog.kg", "io.kg", "jp.kg", "tv.kg", "uk.kg", "us.kg", "de.ls", "at.md", "de.md", "jp.md", "to.md", "indie.porn", "vxl.sh", "ch.tc", "me.tc", "we.tc", "nyan.to", "at.vg", "blog.vu", "dev.vu", "me.vu", "v.ua", "*.vultrobjects.com", "wafflecell.com", "*.webhare.dev", "reserve-online.net", "reserve-online.com", "bookonline.app", "hotelwithflight.com", "wedeploy.io", "wedeploy.me", "wedeploy.sh", "remotewd.com", "pages.wiardweb.com", "wmflabs.org", "toolforge.org", "wmcloud.org", "panel.gg", "daemon.panel.gg", "messwithdns.com", "woltlab-demo.com", "myforum.community", "community-pro.de", "diskussionsbereich.de", "community-pro.net", "meinforum.net", "affinitylottery.org.uk", "raffleentry.org.uk", "weeklylottery.org.uk", "wpenginepowered.com", "js.wpenginepowered.com", "wixsite.com", "editorx.io", "half.host", "xnbay.com", "u2.xnbay.com", "u2-local.xnbay.com", "cistron.nl", "demon.nl", "xs4all.space", "yandexcloud.net", "storage.yandexcloud.net", "website.yandexcloud.net", "official.academy", "yolasite.com", "ybo.faith", "yombo.me", "homelink.one", "ybo.party", "ybo.review", "ybo.science", "ybo.trade", "ynh.fr", "nohost.me", "noho.st", "za.net", "za.org", "bss.design", "basicserver.io", "virtualserver.io", "enterprisecloud.nu" ]; } }); // node_modules/psl/index.js var require_psl = __commonJS({ "node_modules/psl/index.js"(exports) { "use strict"; var Punycode = require("punycode"); var internals = {}; internals.rules = require_rules().map(function(rule) { return { rule, suffix: rule.replace(/^(\*\.|\!)/, ""), punySuffix: -1, wildcard: rule.charAt(0) === "*", exception: rule.charAt(0) === "!" }; }); internals.endsWith = function(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; }; internals.findRule = function(domain) { var punyDomain = Punycode.toASCII(domain); return internals.rules.reduce(function(memo, rule) { if (rule.punySuffix === -1) { rule.punySuffix = Punycode.toASCII(rule.suffix); } if (!internals.endsWith(punyDomain, "." + rule.punySuffix) && punyDomain !== rule.punySuffix) { return memo; } return rule; }, null); }; exports.errorCodes = { DOMAIN_TOO_SHORT: "Domain name too short.", DOMAIN_TOO_LONG: "Domain name too long. It should be no more than 255 chars.", LABEL_STARTS_WITH_DASH: "Domain name label can not start with a dash.", LABEL_ENDS_WITH_DASH: "Domain name label can not end with a dash.", LABEL_TOO_LONG: "Domain name label should be at most 63 chars long.", LABEL_TOO_SHORT: "Domain name label should be at least 1 character long.", LABEL_INVALID_CHARS: "Domain name label can only contain alphanumeric characters or dashes." }; internals.validate = function(input) { var ascii = Punycode.toASCII(input); if (ascii.length < 1) { return "DOMAIN_TOO_SHORT"; } if (ascii.length > 255) { return "DOMAIN_TOO_LONG"; } var labels = ascii.split("."); var label; for (var i = 0; i < labels.length; ++i) { label = labels[i]; if (!label.length) { return "LABEL_TOO_SHORT"; } if (label.length > 63) { return "LABEL_TOO_LONG"; } if (label.charAt(0) === "-") { return "LABEL_STARTS_WITH_DASH"; } if (label.charAt(label.length - 1) === "-") { return "LABEL_ENDS_WITH_DASH"; } if (!/^[a-z0-9\-]+$/.test(label)) { return "LABEL_INVALID_CHARS"; } } }; exports.parse = function(input) { if (typeof input !== "string") { throw new TypeError("Domain name must be a string."); } var domain = input.slice(0).toLowerCase(); if (domain.charAt(domain.length - 1) === ".") { domain = domain.slice(0, domain.length - 1); } var error = internals.validate(domain); if (error) { return { input, error: { message: exports.errorCodes[error], code: error } }; } var parsed = { input, tld: null, sld: null, domain: null, subdomain: null, listed: false }; var domainParts = domain.split("."); if (domainParts[domainParts.length - 1] === "local") { return parsed; } var handlePunycode = function() { if (!/xn--/.test(domain)) { return parsed; } if (parsed.domain) { parsed.domain = Punycode.toASCII(parsed.domain); } if (parsed.subdomain) { parsed.subdomain = Punycode.toASCII(parsed.subdomain); } return parsed; }; var rule = internals.findRule(domain); if (!rule) { if (domainParts.length < 2) { return parsed; } parsed.tld = domainParts.pop(); parsed.sld = domainParts.pop(); parsed.domain = [parsed.sld, parsed.tld].join("."); if (domainParts.length) { parsed.subdomain = domainParts.pop(); } return handlePunycode(); } parsed.listed = true; var tldParts = rule.suffix.split("."); var privateParts = domainParts.slice(0, domainParts.length - tldParts.length); if (rule.exception) { privateParts.push(tldParts.shift()); } parsed.tld = tldParts.join("."); if (!privateParts.length) { return handlePunycode(); } if (rule.wildcard) { tldParts.unshift(privateParts.pop()); parsed.tld = tldParts.join("."); } if (!privateParts.length) { return handlePunycode(); } parsed.sld = privateParts.pop(); parsed.domain = [parsed.sld, parsed.tld].join("."); if (privateParts.length) { parsed.subdomain = privateParts.join("."); } return handlePunycode(); }; exports.get = function(domain) { if (!domain) { return null; } return exports.parse(domain).domain || null; }; exports.isValid = function(domain) { var parsed = exports.parse(domain); return Boolean(parsed.domain && parsed.listed); }; } }); // node_modules/tough-cookie/lib/pubsuffix-psl.js var require_pubsuffix_psl = __commonJS({ "node_modules/tough-cookie/lib/pubsuffix-psl.js"(exports) { "use strict"; var psl = require_psl(); function getPublicSuffix(domain) { return psl.get(domain); } exports.getPublicSuffix = getPublicSuffix; } }); // node_modules/tough-cookie/lib/store.js var require_store = __commonJS({ "node_modules/tough-cookie/lib/store.js"(exports) { "use strict"; function Store() { } exports.Store = Store; Store.prototype.synchronous = false; Store.prototype.findCookie = function(domain, path3, key, cb) { throw new Error("findCookie is not implemented"); }; Store.prototype.findCookies = function(domain, path3, cb) { throw new Error("findCookies is not implemented"); }; Store.prototype.putCookie = function(cookie, cb) { throw new Error("putCookie is not implemented"); }; Store.prototype.updateCookie = function(oldCookie, newCookie, cb) { throw new Error("updateCookie is not implemented"); }; Store.prototype.removeCookie = function(domain, path3, key, cb) { throw new Error("removeCookie is not implemented"); }; Store.prototype.removeCookies = function(domain, path3, cb) { throw new Error("removeCookies is not implemented"); }; Store.prototype.removeAllCookies = function(cb) { throw new Error("removeAllCookies is not implemented"); }; Store.prototype.getAllCookies = function(cb) { throw new Error("getAllCookies is not implemented (therefore jar cannot be serialized)"); }; } }); // node_modules/tough-cookie/lib/permuteDomain.js var require_permuteDomain = __commonJS({ "node_modules/tough-cookie/lib/permuteDomain.js"(exports) { "use strict"; var pubsuffix = require_pubsuffix_psl(); function permuteDomain(domain) { var pubSuf = pubsuffix.getPublicSuffix(domain); if (!pubSuf) { return null; } if (pubSuf == domain) { return [domain]; } var prefix = domain.slice(0, -(pubSuf.length + 1)); var parts = prefix.split(".").reverse(); var cur = pubSuf; var permutations = [cur]; while (parts.length) { cur = parts.shift() + "." + cur; permutations.push(cur); } return permutations; } exports.permuteDomain = permuteDomain; } }); // node_modules/tough-cookie/lib/pathMatch.js var require_pathMatch = __commonJS({ "node_modules/tough-cookie/lib/pathMatch.js"(exports) { "use strict"; function pathMatch(reqPath, cookiePath) { if (cookiePath === reqPath) { return true; } var idx = reqPath.indexOf(cookiePath); if (idx === 0) { if (cookiePath.substr(-1) === "/") { return true; } if (reqPath.substr(cookiePath.length, 1) === "/") { return true; } } return false; } exports.pathMatch = pathMatch; } }); // node_modules/tough-cookie/lib/memstore.js var require_memstore = __commonJS({ "node_modules/tough-cookie/lib/memstore.js"(exports) { "use strict"; var Store = require_store().Store; var permuteDomain = require_permuteDomain().permuteDomain; var pathMatch = require_pathMatch().pathMatch; var util = require("util"); function MemoryCookieStore() { Store.call(this); this.idx = {}; } util.inherits(MemoryCookieStore, Store); exports.MemoryCookieStore = MemoryCookieStore; MemoryCookieStore.prototype.idx = null; MemoryCookieStore.prototype.synchronous = true; MemoryCookieStore.prototype.inspect = function() { return "{ idx: " + util.inspect(this.idx, false, 2) + " }"; }; if (util.inspect.custom) { MemoryCookieStore.prototype[util.inspect.custom] = MemoryCookieStore.prototype.inspect; } MemoryCookieStore.prototype.findCookie = function(domain, path3, key, cb) { if (!this.idx[domain]) { return cb(null, void 0); } if (!this.idx[domain][path3]) { return cb(null, void 0); } return cb(null, this.idx[domain][path3][key] || null); }; MemoryCookieStore.prototype.findCookies = function(domain, path3, cb) { var results = []; if (!domain) { return cb(null, []); } var pathMatcher; if (!path3) { pathMatcher = function matchAll(domainIndex) { for (var curPath in domainIndex) { var pathIndex = domainIndex[curPath]; for (var key in pathIndex) { results.push(pathIndex[key]); } } }; } else { pathMatcher = function matchRFC(domainIndex) { Object.keys(domainIndex).forEach(function(cookiePath) { if (pathMatch(path3, cookiePath)) { var pathIndex = domainIndex[cookiePath]; for (var key in pathIndex) { results.push(pathIndex[key]); } } }); }; } var domains = permuteDomain(domain) || [domain]; var idx = this.idx; domains.forEach(function(curDomain) { var domainIndex = idx[curDomain]; if (!domainIndex) { return; } pathMatcher(domainIndex); }); cb(null, results); }; MemoryCookieStore.prototype.putCookie = function(cookie, cb) { if (!this.idx[cookie.domain]) { this.idx[cookie.domain] = {}; } if (!this.idx[cookie.domain][cookie.path]) { this.idx[cookie.domain][cookie.path] = {}; } this.idx[cookie.domain][cookie.path][cookie.key] = cookie; cb(null); }; MemoryCookieStore.prototype.updateCookie = function(oldCookie, newCookie, cb) { this.putCookie(newCookie, cb); }; MemoryCookieStore.prototype.removeCookie = function(domain, path3, key, cb) { if (this.idx[domain] && this.idx[domain][path3] && this.idx[domain][path3][key]) { delete this.idx[domain][path3][key]; } cb(null); }; MemoryCookieStore.prototype.removeCookies = function(domain, path3, cb) { if (this.idx[domain]) { if (path3) { delete this.idx[domain][path3]; } else { delete this.idx[domain]; } } return cb(null); }; MemoryCookieStore.prototype.removeAllCookies = function(cb) { this.idx = {}; return cb(null); }; MemoryCookieStore.prototype.getAllCookies = function(cb) { var cookies = []; var idx = this.idx; var domains = Object.keys(idx); domains.forEach(function(domain) { var paths = Object.keys(idx[domain]); paths.forEach(function(path3) { var keys = Object.keys(idx[domain][path3]); keys.forEach(function(key) { if (key !== null) { cookies.push(idx[domain][path3][key]); } }); }); }); cookies.sort(function(a, b) { return (a.creationIndex || 0) - (b.creationIndex || 0); }); cb(null, cookies); }; } }); // node_modules/tough-cookie/lib/version.js var require_version = __commonJS({ "node_modules/tough-cookie/lib/version.js"(exports, module2) { module2.exports = "2.5.0"; } }); // node_modules/tough-cookie/lib/cookie.js var require_cookie = __commonJS({ "node_modules/tough-cookie/lib/cookie.js"(exports) { "use strict"; var net = require("net"); var urlParse = require("url").parse; var util = require("util"); var pubsuffix = require_pubsuffix_psl(); var Store = require_store().Store; var MemoryCookieStore = require_memstore().MemoryCookieStore; var pathMatch = require_pathMatch().pathMatch; var VERSION = require_version(); var punycode; try { punycode = require("punycode"); } catch (e) { console.warn("tough-cookie: can't load punycode; won't use punycode for domain normalization"); } var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/; var CONTROL_CHARS = /[\x00-\x1F]/; var TERMINATORS = ["\n", "\r", "\0"]; var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; var MONTH_TO_NUM = { jan: 0, feb: 1, mar: 2, apr: 3, may: 4, jun: 5, jul: 6, aug: 7, sep: 8, oct: 9, nov: 10, dec: 11 }; var NUM_TO_MONTH = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; var NUM_TO_DAY = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]; var MAX_TIME = 2147483647e3; var MIN_TIME = 0; function parseDigits(token, minDigits, maxDigits, trailingOK) { var count = 0; while (count < token.length) { var c = token.charCodeAt(count); if (c <= 47 || c >= 58) { break; } count++; } if (count < minDigits || count > maxDigits) { return null; } if (!trailingOK && count != token.length) { return null; } return parseInt(token.substr(0, count), 10); } function parseTime(token) { var parts = token.split(":"); var result = [0, 0, 0]; if (parts.length !== 3) { return null; } for (var i = 0; i < 3; i++) { var trailingOK = i == 2; var num = parseDigits(parts[i], 1, 2, trailingOK); if (num === null) { return null; } result[i] = num; } return result; } function parseMonth(token) { token = String(token).substr(0, 3).toLowerCase(); var num = MONTH_TO_NUM[token]; return num >= 0 ? num : null; } function parseDate(str) { if (!str) { return; } var tokens = str.split(DATE_DELIM); if (!tokens) { return; } var hour = null; var minute = null; var second = null; var dayOfMonth = null; var month = null; var year = null; for (var i = 0; i < tokens.length; i++) { var token = tokens[i].trim(); if (!token.length) { continue; } var result; if (second === null) { result = parseTime(token); if (result) { hour = result[0]; minute = result[1]; second = result[2]; continue; } } if (dayOfMonth === null) { result = parseDigits(token, 1, 2, true); if (result !== null) { dayOfMonth = result; continue; } } if (month === null) { result = parseMonth(token); if (result !== null) { month = result; continue; } } if (year === null) { result = parseDigits(token, 2, 4, true); if (result !== null) { year = result; if (year >= 70 && year <= 99) { year += 1900; } else if (year >= 0 && year <= 69) { year += 2e3; } } } } if (dayOfMonth === null || month === null || year === null || second === null || dayOfMonth < 1 || dayOfMonth > 31 || year < 1601 || hour > 23 || minute > 59 || second > 59) { return; } return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second)); } function formatDate(date) { var d = date.getUTCDate(); d = d >= 10 ? d : "0" + d; var h = date.getUTCHours(); h = h >= 10 ? h : "0" + h; var m = date.getUTCMinutes(); m = m >= 10 ? m : "0" + m; var s = date.getUTCSeconds(); s = s >= 10 ? s : "0" + s; return NUM_TO_DAY[date.getUTCDay()] + ", " + d + " " + NUM_TO_MONTH[date.getUTCMonth()] + " " + date.getUTCFullYear() + " " + h + ":" + m + ":" + s + " GMT"; } function canonicalDomain(str) { if (str == null) { return null; } str = str.trim().replace(/^\./, ""); if (punycode && /[^\u0001-\u007f]/.test(str)) { str = punycode.toASCII(str); } return str.toLowerCase(); } function domainMatch(str, domStr, canonicalize) { if (str == null || domStr == null) { return null; } if (canonicalize !== false) { str = canonicalDomain(str); domStr = canonicalDomain(domStr); } if (str == domStr) { return true; } if (net.isIP(str)) { return false; } var idx = str.indexOf(domStr); if (idx <= 0) { return false; } if (str.length !== domStr.length + idx) { return false; } if (str.substr(idx - 1, 1) !== ".") { return false; } return true; } function defaultPath(path3) { if (!path3 || path3.substr(0, 1) !== "/") { return "/"; } if (path3 === "/") { return path3; } var rightSlash = path3.lastIndexOf("/"); if (rightSlash === 0) { return "/"; } return path3.slice(0, rightSlash); } function trimTerminator(str) { for (var t = 0; t < TERMINATORS.length; t++) { var terminatorIdx = str.indexOf(TERMINATORS[t]); if (terminatorIdx !== -1) { str = str.substr(0, terminatorIdx); } } return str; } function parseCookiePair(cookiePair, looseMode) { cookiePair = trimTerminator(cookiePair); var firstEq = cookiePair.indexOf("="); if (looseMode) { if (firstEq === 0) { cookiePair = cookiePair.substr(1); firstEq = cookiePair.indexOf("="); } } else { if (firstEq <= 0) { return; } } var cookieName, cookieValue; if (firstEq <= 0) { cookieName = ""; cookieValue = cookiePair.trim(); } else { cookieName = cookiePair.substr(0, firstEq).trim(); cookieValue = cookiePair.substr(firstEq + 1).trim(); } if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) { return; } var c = new Cookie(); c.key = cookieName; c.value = cookieValue; return c; } function parse(str, options) { if (!options || typeof options !== "object") { options = {}; } str = str.trim(); var firstSemi = str.indexOf(";"); var cookiePair = firstSemi === -1 ? str : str.substr(0, firstSemi); var c = parseCookiePair(cookiePair, !!options.loose); if (!c) { return; } if (firstSemi === -1) { return c; } var unparsed = str.slice(firstSemi + 1).trim(); if (unparsed.length === 0) { return c; } var cookie_avs = unparsed.split(";"); while (cookie_avs.length) { var av = cookie_avs.shift().trim(); if (av.length === 0) { continue; } var av_sep = av.indexOf("="); var av_key, av_value; if (av_sep === -1) { av_key = av; av_value = null; } else { av_key = av.substr(0, av_sep); av_value = av.substr(av_sep + 1); } av_key = av_key.trim().toLowerCase(); if (av_value) { av_value = av_value.trim(); } switch (av_key) { case "expires": if (av_value) { var exp = parseDate(av_value); if (exp) { c.expires = exp; } } break; case "max-age": if (av_value) { if (/^-?[0-9]+$/.test(av_value)) { var delta = parseInt(av_value, 10); c.setMaxAge(delta); } } break; case "domain": if (av_value) { var domain = av_value.trim().replace(/^\./, ""); if (domain) { c.domain = domain.toLowerCase(); } } break; case "path": c.path = av_value && av_value[0] === "/" ? av_value : null; break; case "secure": c.secure = true; break; case "httponly": c.httpOnly = true; break; default: c.extensions = c.extensions || []; c.extensions.push(av); break; } } return c; } function jsonParse(str) { var obj; try { obj = JSON.parse(str); } catch (e) { return e; } return obj; } function fromJSON(str) { if (!str) { return null; } var obj; if (typeof str === "string") { obj = jsonParse(str); if (obj instanceof Error) { return null; } } else { obj = str; } var c = new Cookie(); for (var i = 0; i < Cookie.serializableProperties.length; i++) { var prop = Cookie.serializableProperties[i]; if (obj[prop] === void 0 || obj[prop] === Cookie.prototype[prop]) { continue; } if (prop === "expires" || prop === "creation" || prop === "lastAccessed") { if (obj[prop] === null) { c[prop] = null; } else { c[prop] = obj[prop] == "Infinity" ? "Infinity" : new Date(obj[prop]); } } else { c[prop] = obj[prop]; } } return c; } function cookieCompare(a, b) { var cmp = 0; var aPathLen = a.path ? a.path.length : 0; var bPathLen = b.path ? b.path.length : 0; cmp = bPathLen - aPathLen; if (cmp !== 0) { return cmp; } var aTime = a.creation ? a.creation.getTime() : MAX_TIME; var bTime = b.creation ? b.creation.getTime() : MAX_TIME; cmp = aTime - bTime; if (cmp !== 0) { return cmp; } cmp = a.creationIndex - b.creationIndex; return cmp; } function permutePath(path3) { if (path3 === "/") { return ["/"]; } if (path3.lastIndexOf("/") === path3.length - 1) { path3 = path3.substr(0, path3.length - 1); } var permutations = [path3]; while (path3.length > 1) { var lindex = path3.lastIndexOf("/"); if (lindex === 0) { break; } path3 = path3.substr(0, lindex); permutations.push(path3); } permutations.push("/"); return permutations; } function getCookieContext(url) { if (url instanceof Object) { return url; } try { url = decodeURI(url); } catch (err) { } return urlParse(url); } function Cookie(options) { options = options || {}; Object.keys(options).forEach(function(prop) { if (Cookie.prototype.hasOwnProperty(prop) && Cookie.prototype[prop] !== options[prop] && prop.substr(0, 1) !== "_") { this[prop] = options[prop]; } }, this); this.creation = this.creation || new Date(); Object.defineProperty(this, "creationIndex", { configurable: false, enumerable: false, writable: true, value: ++Cookie.cookiesCreated }); } Cookie.cookiesCreated = 0; Cookie.parse = parse; Cookie.fromJSON = fromJSON; Cookie.prototype.key = ""; Cookie.prototype.value = ""; Cookie.prototype.expires = "Infinity"; Cookie.prototype.maxAge = null; Cookie.prototype.domain = null; Cookie.prototype.path = null; Cookie.prototype.secure = false; Cookie.prototype.httpOnly = false; Cookie.prototype.extensions = null; Cookie.prototype.hostOnly = null; Cookie.prototype.pathIsDefault = null; Cookie.prototype.creation = null; Cookie.prototype.lastAccessed = null; Object.defineProperty(Cookie.prototype, "creationIndex", { configurable: true, enumerable: false, writable: true, value: 0 }); Cookie.serializableProperties = Object.keys(Cookie.prototype).filter(function(prop) { return !(Cookie.prototype[prop] instanceof Function || prop === "creationIndex" || prop.substr(0, 1) === "_"); }); Cookie.prototype.inspect = function inspect() { var now = Date.now(); return 'Cookie="' + this.toString() + "; hostOnly=" + (this.hostOnly != null ? this.hostOnly : "?") + "; aAge=" + (this.lastAccessed ? now - this.lastAccessed.getTime() + "ms" : "?") + "; cAge=" + (this.creation ? now - this.creation.getTime() + "ms" : "?") + '"'; }; if (util.inspect.custom) { Cookie.prototype[util.inspect.custom] = Cookie.prototype.inspect; } Cookie.prototype.toJSON = function() { var obj = {}; var props = Cookie.serializableProperties; for (var i = 0; i < props.length; i++) { var prop = props[i]; if (this[prop] === Cookie.prototype[prop]) { continue; } if (prop === "expires" || prop === "creation" || prop === "lastAccessed") { if (this[prop] === null) { obj[prop] = null; } else { obj[prop] = this[prop] == "Infinity" ? "Infinity" : this[prop].toISOString(); } } else if (prop === "maxAge") { if (this[prop] !== null) { obj[prop] = this[prop] == Infinity || this[prop] == -Infinity ? this[prop].toString() : this[prop]; } } else { if (this[prop] !== Cookie.prototype[prop]) { obj[prop] = this[prop]; } } } return obj; }; Cookie.prototype.clone = function() { return fromJSON(this.toJSON()); }; Cookie.prototype.validate = function validate() { if (!COOKIE_OCTETS.test(this.value)) { return false; } if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires)) { return false; } if (this.maxAge != null && this.maxAge <= 0) { return false; } if (this.path != null && !PATH_VALUE.test(this.path)) { return false; } var cdomain = this.cdomain(); if (cdomain) { if (cdomain.match(/\.$/)) { return false; } var suffix = pubsuffix.getPublicSuffix(cdomain); if (suffix == null) { return false; } } return true; }; Cookie.prototype.setExpires = function setExpires(exp) { if (exp instanceof Date) { this.expires = exp; } else { this.expires = parseDate(exp) || "Infinity"; } }; Cookie.prototype.setMaxAge = function setMaxAge(age) { if (age === Infinity || age === -Infinity) { this.maxAge = age.toString(); } else { this.maxAge = age; } }; Cookie.prototype.cookieString = function cookieString() { var val = this.value; if (val == null) { val = ""; } if (this.key === "") { return val; } return this.key + "=" + val; }; Cookie.prototype.toString = function toString() { var str = this.cookieString(); if (this.expires != Infinity) { if (this.expires instanceof Date) { str += "; Expires=" + formatDate(this.expires); } else { str += "; Expires=" + this.expires; } } if (this.maxAge != null && this.maxAge != Infinity) { str += "; Max-Age=" + this.maxAge; } if (this.domain && !this.hostOnly) { str += "; Domain=" + this.domain; } if (this.path) { str += "; Path=" + this.path; } if (this.secure) { str += "; Secure"; } if (this.httpOnly) { str += "; HttpOnly"; } if (this.extensions) { this.extensions.forEach(function(ext) { str += "; " + ext; }); } return str; }; Cookie.prototype.TTL = function TTL(now) { if (this.maxAge != null) { return this.maxAge <= 0 ? 0 : this.maxAge * 1e3; } var expires = this.expires; if (expires != Infinity) { if (!(expires instanceof Date)) { expires = parseDate(expires) || Infinity; } if (expires == Infinity) { return Infinity; } return expires.getTime() - (now || Date.now()); } return Infinity; }; Cookie.prototype.expiryTime = function expiryTime(now) { if (this.maxAge != null) { var relativeTo = now || this.creation || new Date(); var age = this.maxAge <= 0 ? -Infinity : this.maxAge * 1e3; return relativeTo.getTime() + age; } if (this.expires == Infinity) { return Infinity; } return this.expires.getTime(); }; Cookie.prototype.expiryDate = function expiryDate(now) { var millisec = this.expiryTime(now); if (millisec == Infinity) { return new Date(MAX_TIME); } else if (millisec == -Infinity) { return new Date(MIN_TIME); } else { return new Date(millisec); } }; Cookie.prototype.isPersistent = function isPersistent() { return this.maxAge != null || this.expires != Infinity; }; Cookie.prototype.cdomain = Cookie.prototype.canonicalizedDomain = function canonicalizedDomain() { if (this.domain == null) { return null; } return canonicalDomain(this.domain); }; function CookieJar(store, options) { if (typeof options === "boolean") { options = { rejectPublicSuffixes: options }; } else if (options == null) { options = {}; } if (options.rejectPublicSuffixes != null) { this.rejectPublicSuffixes = options.rejectPublicSuffixes; } if (options.looseMode != null) { this.enableLooseMode = options.looseMode; } if (!store) { store = new MemoryCookieStore(); } this.store = store; } CookieJar.prototype.store = null; CookieJar.prototype.rejectPublicSuffixes = true; CookieJar.prototype.enableLooseMode = false; var CAN_BE_SYNC = []; CAN_BE_SYNC.push("setCookie"); CookieJar.prototype.setCookie = function(cookie, url, options, cb) { var err; var context = getCookieContext(url); if (options instanceof Function) { cb = options; options = {}; } var host = canonicalDomain(context.hostname); var loose = this.enableLooseMode; if (options.loose != null) { loose = options.loose; } if (!(cookie instanceof Cookie)) { cookie = Cookie.parse(cookie, { loose }); } if (!cookie) { err = new Error("Cookie failed to parse"); return cb(options.ignoreError ? null : err); } var now = options.now || new Date(); if (this.rejectPublicSuffixes && cookie.domain) { var suffix = pubsuffix.getPublicSuffix(cookie.cdomain()); if (suffix == null) { err = new Error("Cookie has domain set to a public suffix"); return cb(options.ignoreError ? null : err); } } if (cookie.domain) { if (!domainMatch(host, cookie.cdomain(), false)) { err = new Error("Cookie not in this host's domain. Cookie:" + cookie.cdomain() + " Request:" + host); return cb(options.ignoreError ? null : err); } if (cookie.hostOnly == null) { cookie.hostOnly = false; } } else { cookie.hostOnly = true; cookie.domain = host; } if (!cookie.path || cookie.path[0] !== "/") { cookie.path = defaultPath(context.pathname); cookie.pathIsDefault = true; } if (options.http === false && cookie.httpOnly) { err = new Error("Cookie is HttpOnly and this isn't an HTTP API"); return cb(options.ignoreError ? null : err); } var store = this.store; if (!store.updateCookie) { store.updateCookie = function(oldCookie, newCookie, cb2) { this.putCookie(newCookie, cb2); }; } function withCookie(err2, oldCookie) { if (err2) { return cb(err2); } var next = function(err3) { if (err3) { return cb(err3); } else { cb(null, cookie); } }; if (oldCookie) { if (options.http === false && oldCookie.httpOnly) { err2 = new Error("old Cookie is HttpOnly and this isn't an HTTP API"); return cb(options.ignoreError ? null : err2); } cookie.creation = oldCookie.creation; cookie.creationIndex = oldCookie.creationIndex; cookie.lastAccessed = now; store.updateCookie(oldCookie, cookie, next); } else { cookie.creation = cookie.lastAccessed = now; store.putCookie(cookie, next); } } store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie); }; CAN_BE_SYNC.push("getCookies"); CookieJar.prototype.getCookies = function(url, options, cb) { var context = getCookieContext(url); if (options instanceof Function) { cb = options; options = {}; } var host = canonicalDomain(context.hostname); var path3 = context.pathname || "/"; var secure = options.secure; if (secure == null && context.protocol && (context.protocol == "https:" || context.protocol == "wss:")) { secure = true; } var http = options.http; if (http == null) { http = true; } var now = options.now || Date.now(); var expireCheck = options.expire !== false; var allPaths = !!options.allPaths; var store = this.store; function matchingCookie(c) { if (c.hostOnly) { if (c.domain != host) { return false; } } else { if (!domainMatch(host, c.domain, false)) { return false; } } if (!allPaths && !pathMatch(path3, c.path)) { return false; } if (c.secure && !secure) { return false; } if (c.httpOnly && !http) { return false; } if (expireCheck && c.expiryTime() <= now) { store.removeCookie(c.domain, c.path, c.key, function() { }); return false; } return true; } store.findCookies(host, allPaths ? null : path3, function(err, cookies) { if (err) { return cb(err); } cookies = cookies.filter(matchingCookie); if (options.sort !== false) { cookies = cookies.sort(cookieCompare); } var now2 = new Date(); cookies.forEach(function(c) { c.lastAccessed = now2; }); cb(null, cookies); }); }; CAN_BE_SYNC.push("getCookieString"); CookieJar.prototype.getCookieString = function() { var args = Array.prototype.slice.call(arguments, 0); var cb = args.pop(); var next = function(err, cookies) { if (err) { cb(err); } else { cb(null, cookies.sort(cookieCompare).map(function(c) { return c.cookieString(); }).join("; ")); } }; args.push(next); this.getCookies.apply(this, args); }; CAN_BE_SYNC.push("getSetCookieStrings"); CookieJar.prototype.getSetCookieStrings = function() { var args = Array.prototype.slice.call(arguments, 0); var cb = args.pop(); var next = function(err, cookies) { if (err) { cb(err); } else { cb(null, cookies.map(function(c) { return c.toString(); })); } }; args.push(next); this.getCookies.apply(this, args); }; CAN_BE_SYNC.push("serialize"); CookieJar.prototype.serialize = function(cb) { var type = this.store.constructor.name; if (type === "Object") { type = null; } var serialized = { version: "tough-cookie@" + VERSION, storeType: type, rejectPublicSuffixes: !!this.rejectPublicSuffixes, cookies: [] }; if (!(this.store.getAllCookies && typeof this.store.getAllCookies === "function")) { return cb(new Error("store does not support getAllCookies and cannot be serialized")); } this.store.getAllCookies(function(err, cookies) { if (err) { return cb(err); } serialized.cookies = cookies.map(function(cookie) { cookie = cookie instanceof Cookie ? cookie.toJSON() : cookie; delete cookie.creationIndex; return cookie; }); return cb(null, serialized); }); }; CookieJar.prototype.toJSON = function() { return this.serializeSync(); }; CAN_BE_SYNC.push("_importCookies"); CookieJar.prototype._importCookies = function(serialized, cb) { var jar = this; var cookies = serialized.cookies; if (!cookies || !Array.isArray(cookies)) { return cb(new Error("serialized jar has no cookies array")); } cookies = cookies.slice(); function putNext(err) { if (err) { return cb(err); } if (!cookies.length) { return cb(err, jar); } var cookie; try { cookie = fromJSON(cookies.shift()); } catch (e) { return cb(e); } if (cookie === null) { return putNext(null); } jar.store.putCookie(cookie, putNext); } putNext(); }; CookieJar.deserialize = function(strOrObj, store, cb) { if (arguments.length !== 3) { cb = store; store = null; } var serialized; if (typeof strOrObj === "string") { serialized = jsonParse(strOrObj); if (serialized instanceof Error) { return cb(serialized); } } else { serialized = strOrObj; } var jar = new CookieJar(store, serialized.rejectPublicSuffixes); jar._importCookies(serialized, function(err) { if (err) { return cb(err); } cb(null, jar); }); }; CookieJar.deserializeSync = function(strOrObj, store) { var serialized = typeof strOrObj === "string" ? JSON.parse(strOrObj) : strOrObj; var jar = new CookieJar(store, serialized.rejectPublicSuffixes); if (!jar.store.synchronous) { throw new Error("CookieJar store is not synchronous; use async API instead."); } jar._importCookiesSync(serialized); return jar; }; CookieJar.fromJSON = CookieJar.deserializeSync; CookieJar.prototype.clone = function(newStore, cb) { if (arguments.length === 1) { cb = newStore; newStore = null; } this.serialize(function(err, serialized) { if (err) { return cb(err); } CookieJar.deserialize(serialized, newStore, cb); }); }; CAN_BE_SYNC.push("removeAllCookies"); CookieJar.prototype.removeAllCookies = function(cb) { var store = this.store; if (store.removeAllCookies instanceof Function && store.removeAllCookies !== Store.prototype.removeAllCookies) { return store.removeAllCookies(cb); } store.getAllCookies(function(err, cookies) { if (err) { return cb(err); } if (cookies.length === 0) { return cb(null); } var completedCount = 0; var removeErrors = []; function removeCookieCb(removeErr) { if (removeErr) { removeErrors.push(removeErr); } completedCount++; if (completedCount === cookies.length) { return cb(removeErrors.length ? removeErrors[0] : null); } } cookies.forEach(function(cookie) { store.removeCookie(cookie.domain, cookie.path, cookie.key, removeCookieCb); }); }); }; CookieJar.prototype._cloneSync = syncWrap("clone"); CookieJar.prototype.cloneSync = function(newStore) { if (!newStore.synchronous) { throw new Error("CookieJar clone destination store is not synchronous; use async API instead."); } return this._cloneSync(newStore); }; function syncWrap(method) { return function() { if (!this.store.synchronous) { throw new Error("CookieJar store is not synchronous; use async API instead."); } var args = Array.prototype.slice.call(arguments); var syncErr, syncResult; args.push(function syncCb(err, result) { syncErr = err; syncResult = result; }); this[method].apply(this, args); if (syncErr) { throw syncErr; } return syncResult; }; } CAN_BE_SYNC.forEach(function(method) { CookieJar.prototype[method + "Sync"] = syncWrap(method); }); exports.version = VERSION; exports.CookieJar = CookieJar; exports.Cookie = Cookie; exports.Store = Store; exports.MemoryCookieStore = MemoryCookieStore; exports.parseDate = parseDate; exports.formatDate = formatDate; exports.parse = parse; exports.fromJSON = fromJSON; exports.domainMatch = domainMatch; exports.defaultPath = defaultPath; exports.pathMatch = pathMatch; exports.getPublicSuffix = pubsuffix.getPublicSuffix; exports.cookieCompare = cookieCompare; exports.permuteDomain = require_permuteDomain().permuteDomain; exports.permutePath = permutePath; exports.canonicalDomain = canonicalDomain; } }); // node_modules/request/lib/cookies.js var require_cookies = __commonJS({ "node_modules/request/lib/cookies.js"(exports) { "use strict"; var tough = require_cookie(); var Cookie = tough.Cookie; var CookieJar = tough.CookieJar; exports.parse = function(str) { if (str && str.uri) { str = str.uri; } if (typeof str !== "string") { throw new Error("The cookie function only accepts STRING as param"); } return Cookie.parse(str, { loose: true }); }; function RequestJar(store) { var self2 = this; self2._jar = new CookieJar(store, { looseMode: true }); } RequestJar.prototype.setCookie = function(cookieOrStr, uri, options) { var self2 = this; return self2._jar.setCookieSync(cookieOrStr, uri, options || {}); }; RequestJar.prototype.getCookieString = function(uri) { var self2 = this; return self2._jar.getCookieStringSync(uri); }; RequestJar.prototype.getCookies = function(uri) { var self2 = this; return self2._jar.getCookiesSync(uri); }; exports.jar = function(store) { return new RequestJar(store); }; } }); // node_modules/json-stringify-safe/stringify.js var require_stringify = __commonJS({ "node_modules/json-stringify-safe/stringify.js"(exports, module2) { exports = module2.exports = stringify; exports.getSerialize = serializer; function stringify(obj, replacer, spaces, cycleReplacer) { return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces); } function serializer(replacer, cycleReplacer) { var stack = [], keys = []; if (cycleReplacer == null) cycleReplacer = function(key, value) { if (stack[0] === value) return "[Circular ~]"; return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]"; }; return function(key, value) { if (stack.length > 0) { var thisPos = stack.indexOf(this); ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); if (~stack.indexOf(value)) value = cycleReplacer.call(this, key, value); } else stack.push(value); return replacer == null ? value : replacer.call(this, key, value); }; } } }); // node_modules/safe-buffer/index.js var require_safe_buffer = __commonJS({ "node_modules/safe-buffer/index.js"(exports, module2) { var buffer = require("buffer"); var Buffer2 = buffer.Buffer; function copyProps(src, dst) { for (var key in src) { dst[key] = src[key]; } } if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) { module2.exports = buffer; } else { copyProps(buffer, exports); exports.Buffer = SafeBuffer; } function SafeBuffer(arg, encodingOrOffset, length) { return Buffer2(arg, encodingOrOffset, length); } SafeBuffer.prototype = Object.create(Buffer2.prototype); copyProps(Buffer2, SafeBuffer); SafeBuffer.from = function(arg, encodingOrOffset, length) { if (typeof arg === "number") { throw new TypeError("Argument must not be a number"); } return Buffer2(arg, encodingOrOffset, length); }; SafeBuffer.alloc = function(size, fill, encoding) { if (typeof size !== "number") { throw new TypeError("Argument must be a number"); } var buf = Buffer2(size); if (fill !== void 0) { if (typeof encoding === "string") { buf.fill(fill, encoding); } else { buf.fill(fill); } } else { buf.fill(0); } return buf; }; SafeBuffer.allocUnsafe = function(size) { if (typeof size !== "number") { throw new TypeError("Argument must be a number"); } return Buffer2(size); }; SafeBuffer.allocUnsafeSlow = function(size) { if (typeof size !== "number") { throw new TypeError("Argument must be a number"); } return buffer.SlowBuffer(size); }; } }); // node_modules/request/lib/helpers.js var require_helpers = __commonJS({ "node_modules/request/lib/helpers.js"(exports) { "use strict"; var jsonSafeStringify = require_stringify(); var crypto2 = require("crypto"); var Buffer2 = require_safe_buffer().Buffer; var defer = typeof setImmediate === "undefined" ? process.nextTick : setImmediate; function paramsHaveRequestBody(params) { return params.body || params.requestBodyStream || params.json && typeof params.json !== "boolean" || params.multipart; } function safeStringify(obj, replacer) { var ret; try { ret = JSON.stringify(obj, replacer); } catch (e) { ret = jsonSafeStringify(obj, replacer); } return ret; } function md5(str) { return crypto2.createHash("md5").update(str).digest("hex"); } function isReadStream(rs) { return rs.readable && rs.path && rs.mode; } function toBase64(str) { return Buffer2.from(str || "", "utf8").toString("base64"); } function copy(obj) { var o = {}; Object.keys(obj).forEach(function(i) { o[i] = obj[i]; }); return o; } function version() { var numbers = process.version.replace("v", "").split("."); return { major: parseInt(numbers[0], 10), minor: parseInt(numbers[1], 10), patch: parseInt(numbers[2], 10) }; } exports.paramsHaveRequestBody = paramsHaveRequestBody; exports.safeStringify = safeStringify; exports.md5 = md5; exports.isReadStream = isReadStream; exports.toBase64 = toBase64; exports.copy = copy; exports.version = version; exports.defer = defer; } }); // node_modules/aws-sign2/index.js var require_aws_sign2 = __commonJS({ "node_modules/aws-sign2/index.js"(exports, module2) { var crypto2 = require("crypto"); var parse = require("url").parse; var keys = [ "acl", "location", "logging", "notification", "partNumber", "policy", "requestPayment", "torrent", "uploadId", "uploads", "versionId", "versioning", "versions", "website" ]; function authorization(options) { return "AWS " + options.key + ":" + sign(options); } module2.exports = authorization; module2.exports.authorization = authorization; function hmacSha1(options) { return crypto2.createHmac("sha1", options.secret).update(options.message).digest("base64"); } module2.exports.hmacSha1 = hmacSha1; function sign(options) { options.message = stringToSign(options); return hmacSha1(options); } module2.exports.sign = sign; function signQuery(options) { options.message = queryStringToSign(options); return hmacSha1(options); } module2.exports.signQuery = signQuery; function stringToSign(options) { var headers = options.amazonHeaders || ""; if (headers) headers += "\n"; var r = [ options.verb, options.md5, options.contentType, options.date ? options.date.toUTCString() : "", headers + options.resource ]; return r.join("\n"); } module2.exports.stringToSign = stringToSign; function queryStringToSign(options) { return "GET\n\n\n" + options.date + "\n" + options.resource; } module2.exports.queryStringToSign = queryStringToSign; function canonicalizeHeaders(headers) { var buf = [], fields = Object.keys(headers); for (var i = 0, len = fields.length; i < len; ++i) { var field = fields[i], val = headers[field], field = field.toLowerCase(); if (field.indexOf("x-amz") !== 0) continue; buf.push(field + ":" + val); } return buf.sort().join("\n"); } module2.exports.canonicalizeHeaders = canonicalizeHeaders; function canonicalizeResource(resource) { var url = parse(resource, true), path3 = url.pathname, buf = []; Object.keys(url.query).forEach(function(key) { if (!~keys.indexOf(key)) return; var val = url.query[key] == "" ? "" : "=" + encodeURIComponent(url.query[key]); buf.push(key + val); }); return path3 + (buf.length ? "?" + buf.sort().join("&") : ""); } module2.exports.canonicalizeResource = canonicalizeResource; } }); // node_modules/aws4/lru.js var require_lru = __commonJS({ "node_modules/aws4/lru.js"(exports, module2) { module2.exports = function(size) { return new LruCache(size); }; function LruCache(size) { this.capacity = size | 0; this.map = /* @__PURE__ */ Object.create(null); this.list = new DoublyLinkedList(); } LruCache.prototype.get = function(key) { var node = this.map[key]; if (node == null) return void 0; this.used(node); return node.val; }; LruCache.prototype.set = function(key, val) { var node = this.map[key]; if (node != null) { node.val = val; } else { if (!this.capacity) this.prune(); if (!this.capacity) return false; node = new DoublyLinkedNode(key, val); this.map[key] = node; this.capacity--; } this.used(node); return true; }; LruCache.prototype.used = function(node) { this.list.moveToFront(node); }; LruCache.prototype.prune = function() { var node = this.list.pop(); if (node != null) { delete this.map[node.key]; this.capacity++; } }; function DoublyLinkedList() { this.firstNode = null; this.lastNode = null; } DoublyLinkedList.prototype.moveToFront = function(node) { if (this.firstNode == node) return; this.remove(node); if (this.firstNode == null) { this.firstNode = node; this.lastNode = node; node.prev = null; node.next = null; } else { node.prev = null; node.next = this.firstNode; node.next.prev = node; this.firstNode = node; } }; DoublyLinkedList.prototype.pop = function() { var lastNode = this.lastNode; if (lastNode != null) { this.remove(lastNode); } return lastNode; }; DoublyLinkedList.prototype.remove = function(node) { if (this.firstNode == node) { this.firstNode = node.next; } else if (node.prev != null) { node.prev.next = node.next; } if (this.lastNode == node) { this.lastNode = node.prev; } else if (node.next != null) { node.next.prev = node.prev; } }; function DoublyLinkedNode(key, val) { this.key = key; this.val = val; this.prev = null; this.next = null; } } }); // node_modules/aws4/aws4.js var require_aws4 = __commonJS({ "node_modules/aws4/aws4.js"(exports) { var aws4 = exports; var url = require("url"); var querystring = require("querystring"); var crypto2 = require("crypto"); var lru = require_lru(); var credentialsCache = lru(1e3); function hmac(key, string, encoding) { return crypto2.createHmac("sha256", key).update(string, "utf8").digest(encoding); } function hash(string, encoding) { return crypto2.createHash("sha256").update(string, "utf8").digest(encoding); } function encodeRfc3986(urlEncodedString) { return urlEncodedString.replace(/[!'()*]/g, function(c) { return "%" + c.charCodeAt(0).toString(16).toUpperCase(); }); } function encodeRfc3986Full(str) { return encodeRfc3986(encodeURIComponent(str)); } var HEADERS_TO_IGNORE = { "authorization": true, "connection": true, "x-amzn-trace-id": true, "user-agent": true, "expect": true, "presigned-expires": true, "range": true }; function RequestSigner(request2, credentials) { if (typeof request2 === "string") request2 = url.parse(request2); var headers = request2.headers = request2.headers || {}, hostParts = (!this.service || !this.region) && this.matchHost(request2.hostname || request2.host || headers.Host || headers.host); this.request = request2; this.credentials = credentials || this.defaultCredentials(); this.service = request2.service || hostParts[0] || ""; this.region = request2.region || hostParts[1] || "us-east-1"; if (this.service === "email") this.service = "ses"; if (!request2.method && request2.body) request2.method = "POST"; if (!headers.Host && !headers.host) { headers.Host = request2.hostname || request2.host || this.createHost(); if (request2.port) headers.Host += ":" + request2.port; } if (!request2.hostname && !request2.host) request2.hostname = headers.Host || headers.host; this.isCodeCommitGit = this.service === "codecommit" && request2.method === "GIT"; } RequestSigner.prototype.matchHost = function(host) { var match = (host || "").match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(\.cn)?$/); var hostParts = (match || []).slice(1, 3); if (hostParts[1] === "es") hostParts = hostParts.reverse(); if (hostParts[1] == "s3") { hostParts[0] = "s3"; hostParts[1] = "us-east-1"; } else { for (var i = 0; i < 2; i++) { if (/^s3-/.test(hostParts[i])) { hostParts[1] = hostParts[i].slice(3); hostParts[0] = "s3"; break; } } } return hostParts; }; RequestSigner.prototype.isSingleRegion = function() { if (["s3", "sdb"].indexOf(this.service) >= 0 && this.region === "us-east-1") return true; return ["cloudfront", "ls", "route53", "iam", "importexport", "sts"].indexOf(this.service) >= 0; }; RequestSigner.prototype.createHost = function() { var region = this.isSingleRegion() ? "" : "." + this.region, subdomain = this.service === "ses" ? "email" : this.service; return subdomain + region + ".amazonaws.com"; }; RequestSigner.prototype.prepareRequest = function() { this.parsePath(); var request2 = this.request, headers = request2.headers, query; if (request2.signQuery) { this.parsedPath.query = query = this.parsedPath.query || {}; if (this.credentials.sessionToken) query["X-Amz-Security-Token"] = this.credentials.sessionToken; if (this.service === "s3" && !query["X-Amz-Expires"]) query["X-Amz-Expires"] = 86400; if (query["X-Amz-Date"]) this.datetime = query["X-Amz-Date"]; else query["X-Amz-Date"] = this.getDateTime(); query["X-Amz-Algorithm"] = "AWS4-HMAC-SHA256"; query["X-Amz-Credential"] = this.credentials.accessKeyId + "/" + this.credentialString(); query["X-Amz-SignedHeaders"] = this.signedHeaders(); } else { if (!request2.doNotModifyHeaders && !this.isCodeCommitGit) { if (request2.body && !headers["Content-Type"] && !headers["content-type"]) headers["Content-Type"] = "application/x-www-form-urlencoded; charset=utf-8"; if (request2.body && !headers["Content-Length"] && !headers["content-length"]) headers["Content-Length"] = Buffer.byteLength(request2.body); if (this.credentials.sessionToken && !headers["X-Amz-Security-Token"] && !headers["x-amz-security-token"]) headers["X-Amz-Security-Token"] = this.credentials.sessionToken; if (this.service === "s3" && !headers["X-Amz-Content-Sha256"] && !headers["x-amz-content-sha256"]) headers["X-Amz-Content-Sha256"] = hash(this.request.body || "", "hex"); if (headers["X-Amz-Date"] || headers["x-amz-date"]) this.datetime = headers["X-Amz-Date"] || headers["x-amz-date"]; else headers["X-Amz-Date"] = this.getDateTime(); } delete headers.Authorization; delete headers.authorization; } }; RequestSigner.prototype.sign = function() { if (!this.parsedPath) this.prepareRequest(); if (this.request.signQuery) { this.parsedPath.query["X-Amz-Signature"] = this.signature(); } else { this.request.headers.Authorization = this.authHeader(); } this.request.path = this.formatPath(); return this.request; }; RequestSigner.prototype.getDateTime = function() { if (!this.datetime) { var headers = this.request.headers, date = new Date(headers.Date || headers.date || new Date()); this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, ""); if (this.isCodeCommitGit) this.datetime = this.datetime.slice(0, -1); } return this.datetime; }; RequestSigner.prototype.getDate = function() { return this.getDateTime().substr(0, 8); }; RequestSigner.prototype.authHeader = function() { return [ "AWS4-HMAC-SHA256 Credential=" + this.credentials.accessKeyId + "/" + this.credentialString(), "SignedHeaders=" + this.signedHeaders(), "Signature=" + this.signature() ].join(", "); }; RequestSigner.prototype.signature = function() { var date = this.getDate(), cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(), kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey); if (!kCredentials) { kDate = hmac("AWS4" + this.credentials.secretAccessKey, date); kRegion = hmac(kDate, this.region); kService = hmac(kRegion, this.service); kCredentials = hmac(kService, "aws4_request"); credentialsCache.set(cacheKey, kCredentials); } return hmac(kCredentials, this.stringToSign(), "hex"); }; RequestSigner.prototype.stringToSign = function() { return [ "AWS4-HMAC-SHA256", this.getDateTime(), this.credentialString(), hash(this.canonicalString(), "hex") ].join("\n"); }; RequestSigner.prototype.canonicalString = function() { if (!this.parsedPath) this.prepareRequest(); var pathStr = this.parsedPath.path, query = this.parsedPath.query, headers = this.request.headers, queryStr = "", normalizePath = this.service !== "s3", decodePath = this.service === "s3" || this.request.doNotEncodePath, decodeSlashesInPath = this.service === "s3", firstValOnly = this.service === "s3", bodyHash; if (this.service === "s3" && this.request.signQuery) { bodyHash = "UNSIGNED-PAYLOAD"; } else if (this.isCodeCommitGit) { bodyHash = ""; } else { bodyHash = headers["X-Amz-Content-Sha256"] || headers["x-amz-content-sha256"] || hash(this.request.body || "", "hex"); } if (query) { var reducedQuery = Object.keys(query).reduce(function(obj, key) { if (!key) return obj; obj[encodeRfc3986Full(key)] = !Array.isArray(query[key]) ? query[key] : firstValOnly ? query[key][0] : query[key]; return obj; }, {}); var encodedQueryPieces = []; Object.keys(reducedQuery).sort().forEach(function(key) { if (!Array.isArray(reducedQuery[key])) { encodedQueryPieces.push(key + "=" + encodeRfc3986Full(reducedQuery[key])); } else { reducedQuery[key].map(encodeRfc3986Full).sort().forEach(function(val) { encodedQueryPieces.push(key + "=" + val); }); } }); queryStr = encodedQueryPieces.join("&"); } if (pathStr !== "/") { if (normalizePath) pathStr = pathStr.replace(/\/{2,}/g, "/"); pathStr = pathStr.split("/").reduce(function(path3, piece) { if (normalizePath && piece === "..") { path3.pop(); } else if (!normalizePath || piece !== ".") { if (decodePath) piece = decodeURIComponent(piece.replace(/\+/g, " ")); path3.push(encodeRfc3986Full(piece)); } return path3; }, []).join("/"); if (pathStr[0] !== "/") pathStr = "/" + pathStr; if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, "/"); } return [ this.request.method || "GET", pathStr, queryStr, this.canonicalHeaders() + "\n", this.signedHeaders(), bodyHash ].join("\n"); }; RequestSigner.prototype.canonicalHeaders = function() { var headers = this.request.headers; function trimAll(header) { return header.toString().trim().replace(/\s+/g, " "); } return Object.keys(headers).filter(function(key) { return HEADERS_TO_IGNORE[key.toLowerCase()] == null; }).sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1; }).map(function(key) { return key.toLowerCase() + ":" + trimAll(headers[key]); }).join("\n"); }; RequestSigner.prototype.signedHeaders = function() { return Object.keys(this.request.headers).map(function(key) { return key.toLowerCase(); }).filter(function(key) { return HEADERS_TO_IGNORE[key] == null; }).sort().join(";"); }; RequestSigner.prototype.credentialString = function() { return [ this.getDate(), this.region, this.service, "aws4_request" ].join("/"); }; RequestSigner.prototype.defaultCredentials = function() { var env = process.env; return { accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY, secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY, sessionToken: env.AWS_SESSION_TOKEN }; }; RequestSigner.prototype.parsePath = function() { var path3 = this.request.path || "/"; if (/[^0-9A-Za-z;,/?:@&=+$\-_.!~*'()#%]/.test(path3)) { path3 = encodeURI(decodeURI(path3)); } var queryIx = path3.indexOf("?"), query = null; if (queryIx >= 0) { query = querystring.parse(path3.slice(queryIx + 1)); path3 = path3.slice(0, queryIx); } this.parsedPath = { path: path3, query }; }; RequestSigner.prototype.formatPath = function() { var path3 = this.parsedPath.path, query = this.parsedPath.query; if (!query) return path3; if (query[""] != null) delete query[""]; return path3 + "?" + encodeRfc3986(querystring.stringify(query)); }; aws4.RequestSigner = RequestSigner; aws4.sign = function(request2, credentials) { return new RequestSigner(request2, credentials).sign(); }; } }); // node_modules/assert-plus/assert.js var require_assert = __commonJS({ "node_modules/assert-plus/assert.js"(exports, module2) { var assert = require("assert"); var Stream = require("stream").Stream; var util = require("util"); var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; function _capitalize(str) { return str.charAt(0).toUpperCase() + str.slice(1); } function _toss(name, expected, oper, arg, actual) { throw new assert.AssertionError({ message: util.format("%s (%s) is required", name, expected), actual: actual === void 0 ? typeof arg : actual(arg), expected, operator: oper || "===", stackStartFunction: _toss.caller }); } function _getClass(arg) { return Object.prototype.toString.call(arg).slice(8, -1); } function noop() { } var types = { bool: { check: function(arg) { return typeof arg === "boolean"; } }, func: { check: function(arg) { return typeof arg === "function"; } }, string: { check: function(arg) { return typeof arg === "string"; } }, object: { check: function(arg) { return typeof arg === "object" && arg !== null; } }, number: { check: function(arg) { return typeof arg === "number" && !isNaN(arg); } }, finite: { check: function(arg) { return typeof arg === "number" && !isNaN(arg) && isFinite(arg); } }, buffer: { check: function(arg) { return Buffer.isBuffer(arg); }, operator: "Buffer.isBuffer" }, array: { check: function(arg) { return Array.isArray(arg); }, operator: "Array.isArray" }, stream: { check: function(arg) { return arg instanceof Stream; }, operator: "instanceof", actual: _getClass }, date: { check: function(arg) { return arg instanceof Date; }, operator: "instanceof", actual: _getClass }, regexp: { check: function(arg) { return arg instanceof RegExp; }, operator: "instanceof", actual: _getClass }, uuid: { check: function(arg) { return typeof arg === "string" && UUID_REGEXP.test(arg); }, operator: "isUUID" } }; function _setExports(ndebug) { var keys = Object.keys(types); var out; if (process.env.NODE_NDEBUG) { out = noop; } else { out = function(arg, msg) { if (!arg) { _toss(msg, "true", arg); } }; } keys.forEach(function(k) { if (ndebug) { out[k] = noop; return; } var type = types[k]; out[k] = function(arg, msg) { if (!type.check(arg)) { _toss(msg, k, type.operator, arg, type.actual); } }; }); keys.forEach(function(k) { var name = "optional" + _capitalize(k); if (ndebug) { out[name] = noop; return; } var type = types[k]; out[name] = function(arg, msg) { if (arg === void 0 || arg === null) { return; } if (!type.check(arg)) { _toss(msg, k, type.operator, arg, type.actual); } }; }); keys.forEach(function(k) { var name = "arrayOf" + _capitalize(k); if (ndebug) { out[name] = noop; return; } var type = types[k]; var expected = "[" + k + "]"; out[name] = function(arg, msg) { if (!Array.isArray(arg)) { _toss(msg, expected, type.operator, arg, type.actual); } var i; for (i = 0; i < arg.length; i++) { if (!type.check(arg[i])) { _toss(msg, expected, type.operator, arg, type.actual); } } }; }); keys.forEach(function(k) { var name = "optionalArrayOf" + _capitalize(k); if (ndebug) { out[name] = noop; return; } var type = types[k]; var expected = "[" + k + "]"; out[name] = function(arg, msg) { if (arg === void 0 || arg === null) { return; } if (!Array.isArray(arg)) { _toss(msg, expected, type.operator, arg, type.actual); } var i; for (i = 0; i < arg.length; i++) { if (!type.check(arg[i])) { _toss(msg, expected, type.operator, arg, type.actual); } } }; }); Object.keys(assert).forEach(function(k) { if (k === "AssertionError") { out[k] = assert[k]; return; } if (ndebug) { out[k] = noop; return; } out[k] = assert[k]; }); out._setExports = _setExports; return out; } module2.exports = _setExports(process.env.NODE_NDEBUG); } }); // node_modules/safer-buffer/safer.js var require_safer = __commonJS({ "node_modules/safer-buffer/safer.js"(exports, module2) { "use strict"; var buffer = require("buffer"); var Buffer2 = buffer.Buffer; var safer = {}; var key; for (key in buffer) { if (!buffer.hasOwnProperty(key)) continue; if (key === "SlowBuffer" || key === "Buffer") continue; safer[key] = buffer[key]; } var Safer = safer.Buffer = {}; for (key in Buffer2) { if (!Buffer2.hasOwnProperty(key)) continue; if (key === "allocUnsafe" || key === "allocUnsafeSlow") continue; Safer[key] = Buffer2[key]; } safer.Buffer.prototype = Buffer2.prototype; if (!Safer.from || Safer.from === Uint8Array.from) { Safer.from = function(value, encodingOrOffset, length) { if (typeof value === "number") { throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value); } if (value && typeof value.length === "undefined") { throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value); } return Buffer2(value, encodingOrOffset, length); }; } if (!Safer.alloc) { Safer.alloc = function(size, fill, encoding) { if (typeof size !== "number") { throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size); } if (size < 0 || size >= 2 * (1 << 30)) { throw new RangeError('The value "' + size + '" is invalid for option "size"'); } var buf = Buffer2(size); if (!fill || fill.length === 0) { buf.fill(0); } else if (typeof encoding === "string") { buf.fill(fill, encoding); } else { buf.fill(fill); } return buf; }; } if (!safer.kStringMaxLength) { try { safer.kStringMaxLength = process.binding("buffer").kStringMaxLength; } catch (e) { } } if (!safer.constants) { safer.constants = { MAX_LENGTH: safer.kMaxLength }; if (safer.kStringMaxLength) { safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength; } } module2.exports = safer; } }); // node_modules/sshpk/lib/algs.js var require_algs = __commonJS({ "node_modules/sshpk/lib/algs.js"(exports, module2) { var Buffer2 = require_safer().Buffer; var algInfo = { "dsa": { parts: ["p", "q", "g", "y"], sizePart: "p" }, "rsa": { parts: ["e", "n"], sizePart: "n" }, "ecdsa": { parts: ["curve", "Q"], sizePart: "Q" }, "ed25519": { parts: ["A"], sizePart: "A" } }; algInfo["curve25519"] = algInfo["ed25519"]; var algPrivInfo = { "dsa": { parts: ["p", "q", "g", "y", "x"] }, "rsa": { parts: ["n", "e", "d", "iqmp", "p", "q"] }, "ecdsa": { parts: ["curve", "Q", "d"] }, "ed25519": { parts: ["A", "k"] } }; algPrivInfo["curve25519"] = algPrivInfo["ed25519"]; var hashAlgs = { "md5": true, "sha1": true, "sha256": true, "sha384": true, "sha512": true }; var curves = { "nistp256": { size: 256, pkcs8oid: "1.2.840.10045.3.1.7", p: Buffer2.from("00ffffffff 00000001 00000000 0000000000000000 ffffffff ffffffff ffffffff".replace(/ /g, ""), "hex"), a: Buffer2.from("00FFFFFFFF 00000001 00000000 0000000000000000 FFFFFFFF FFFFFFFF FFFFFFFC".replace(/ /g, ""), "hex"), b: Buffer2.from("5ac635d8 aa3a93e7 b3ebbd55 769886bc651d06b0 cc53b0f6 3bce3c3e 27d2604b".replace(/ /g, ""), "hex"), s: Buffer2.from("00c49d3608 86e70493 6a6678e1 139d26b7819f7e90".replace(/ /g, ""), "hex"), n: Buffer2.from("00ffffffff 00000000 ffffffff ffffffffbce6faad a7179e84 f3b9cac2 fc632551".replace(/ /g, ""), "hex"), G: Buffer2.from("046b17d1f2 e12c4247 f8bce6e5 63a440f277037d81 2deb33a0 f4a13945 d898c2964fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e162bce3357 6b315ece cbb64068 37bf51f5".replace(/ /g, ""), "hex") }, "nistp384": { size: 384, pkcs8oid: "1.3.132.0.34", p: Buffer2.from("00ffffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff fffffffeffffffff 00000000 00000000 ffffffff".replace(/ /g, ""), "hex"), a: Buffer2.from("00FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFEFFFFFFFF 00000000 00000000 FFFFFFFC".replace(/ /g, ""), "hex"), b: Buffer2.from("b3312fa7 e23ee7e4 988e056b e3f82d19181d9c6e fe814112 0314088f 5013875ac656398d 8a2ed19d 2a85c8ed d3ec2aef".replace(/ /g, ""), "hex"), s: Buffer2.from("00a335926a a319a27a 1d00896a 6773a4827acdac73".replace(/ /g, ""), "hex"), n: Buffer2.from("00ffffffff ffffffff ffffffff ffffffffffffffff ffffffff c7634d81 f4372ddf581a0db2 48b0a77a ecec196a ccc52973".replace(/ /g, ""), "hex"), G: Buffer2.from("04aa87ca22 be8b0537 8eb1c71e f320ad746e1d3b62 8ba79b98 59f741e0 82542a385502f25d bf55296c 3a545e38 72760ab73617de4a 96262c6f 5d9e98bf 9292dc29f8f41dbd 289a147c e9da3113 b5f0b8c00a60b1ce 1d7e819d 7a431d7c 90ea0e5f".replace(/ /g, ""), "hex") }, "nistp521": { size: 521, pkcs8oid: "1.3.132.0.35", p: Buffer2.from("01ffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff ffffffffffff".replace(/ /g, ""), "hex"), a: Buffer2.from("01FFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC".replace(/ /g, ""), "hex"), b: Buffer2.from("51953eb961 8e1c9a1f 929a21a0 b68540eea2da725b 99b315f3 b8b48991 8ef109e156193951 ec7e937b 1652c0bd 3bb1bf073573df88 3d2c34f1 ef451fd4 6b503f00".replace(/ /g, ""), "hex"), s: Buffer2.from("00d09e8800 291cb853 96cc6717 393284aaa0da64ba".replace(/ /g, ""), "hex"), n: Buffer2.from("01ffffffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff fffffffa51868783 bf2f966b 7fcc0148 f709a5d03bb5c9b8 899c47ae bb6fb71e 91386409".replace(/ /g, ""), "hex"), G: Buffer2.from("0400c6 858e06b7 0404e9cd 9e3ecb66 2395b4429c648139 053fb521 f828af60 6b4d3dbaa14b5e77 efe75928 fe1dc127 a2ffa8de3348b3c1 856a429b f97e7e31 c2e5bd660118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd998f54449 579b4468 17afbd17 273e662c97ee7299 5ef42640 c550b901 3fad0761353c7086 a272c240 88be9476 9fd16650".replace(/ /g, ""), "hex") } }; module2.exports = { info: algInfo, privInfo: algPrivInfo, hashAlgs, curves }; } }); // node_modules/sshpk/lib/errors.js var require_errors2 = __commonJS({ "node_modules/sshpk/lib/errors.js"(exports, module2) { var assert = require_assert(); var util = require("util"); function FingerprintFormatError(fp, format) { if (Error.captureStackTrace) Error.captureStackTrace(this, FingerprintFormatError); this.name = "FingerprintFormatError"; this.fingerprint = fp; this.format = format; this.message = "Fingerprint format is not supported, or is invalid: "; if (fp !== void 0) this.message += " fingerprint = " + fp; if (format !== void 0) this.message += " format = " + format; } util.inherits(FingerprintFormatError, Error); function InvalidAlgorithmError(alg) { if (Error.captureStackTrace) Error.captureStackTrace(this, InvalidAlgorithmError); this.name = "InvalidAlgorithmError"; this.algorithm = alg; this.message = 'Algorithm "' + alg + '" is not supported'; } util.inherits(InvalidAlgorithmError, Error); function KeyParseError(name, format, innerErr) { if (Error.captureStackTrace) Error.captureStackTrace(this, KeyParseError); this.name = "KeyParseError"; this.format = format; this.keyName = name; this.innerErr = innerErr; this.message = "Failed to parse " + name + " as a valid " + format + " format key: " + innerErr.message; } util.inherits(KeyParseError, Error); function SignatureParseError(type, format, innerErr) { if (Error.captureStackTrace) Error.captureStackTrace(this, SignatureParseError); this.name = "SignatureParseError"; this.type = type; this.format = format; this.innerErr = innerErr; this.message = "Failed to parse the given data as a " + type + " signature in " + format + " format: " + innerErr.message; } util.inherits(SignatureParseError, Error); function CertificateParseError(name, format, innerErr) { if (Error.captureStackTrace) Error.captureStackTrace(this, CertificateParseError); this.name = "CertificateParseError"; this.format = format; this.certName = name; this.innerErr = innerErr; this.message = "Failed to parse " + name + " as a valid " + format + " format certificate: " + innerErr.message; } util.inherits(CertificateParseError, Error); function KeyEncryptedError(name, format) { if (Error.captureStackTrace) Error.captureStackTrace(this, KeyEncryptedError); this.name = "KeyEncryptedError"; this.format = format; this.keyName = name; this.message = "The " + format + " format key " + name + " is encrypted (password-protected), and no passphrase was provided in `options`"; } util.inherits(KeyEncryptedError, Error); module2.exports = { FingerprintFormatError, InvalidAlgorithmError, KeyParseError, SignatureParseError, KeyEncryptedError, CertificateParseError }; } }); // node_modules/asn1/lib/ber/errors.js var require_errors3 = __commonJS({ "node_modules/asn1/lib/ber/errors.js"(exports, module2) { module2.exports = { newInvalidAsn1Error: function(msg) { var e = new Error(); e.name = "InvalidAsn1Error"; e.message = msg || ""; return e; } }; } }); // node_modules/asn1/lib/ber/types.js var require_types = __commonJS({ "node_modules/asn1/lib/ber/types.js"(exports, module2) { module2.exports = { EOC: 0, Boolean: 1, Integer: 2, BitString: 3, OctetString: 4, Null: 5, OID: 6, ObjectDescriptor: 7, External: 8, Real: 9, Enumeration: 10, PDV: 11, Utf8String: 12, RelativeOID: 13, Sequence: 16, Set: 17, NumericString: 18, PrintableString: 19, T61String: 20, VideotexString: 21, IA5String: 22, UTCTime: 23, GeneralizedTime: 24, GraphicString: 25, VisibleString: 26, GeneralString: 28, UniversalString: 29, CharacterString: 30, BMPString: 31, Constructor: 32, Context: 128 }; } }); // node_modules/asn1/lib/ber/reader.js var require_reader = __commonJS({ "node_modules/asn1/lib/ber/reader.js"(exports, module2) { var assert = require("assert"); var Buffer2 = require_safer().Buffer; var ASN1 = require_types(); var errors = require_errors3(); var newInvalidAsn1Error = errors.newInvalidAsn1Error; function Reader(data) { if (!data || !Buffer2.isBuffer(data)) throw new TypeError("data must be a node Buffer"); this._buf = data; this._size = data.length; this._len = 0; this._offset = 0; } Object.defineProperty(Reader.prototype, "length", { enumerable: true, get: function() { return this._len; } }); Object.defineProperty(Reader.prototype, "offset", { enumerable: true, get: function() { return this._offset; } }); Object.defineProperty(Reader.prototype, "remain", { get: function() { return this._size - this._offset; } }); Object.defineProperty(Reader.prototype, "buffer", { get: function() { return this._buf.slice(this._offset); } }); Reader.prototype.readByte = function(peek) { if (this._size - this._offset < 1) return null; var b = this._buf[this._offset] & 255; if (!peek) this._offset += 1; return b; }; Reader.prototype.peek = function() { return this.readByte(true); }; Reader.prototype.readLength = function(offset) { if (offset === void 0) offset = this._offset; if (offset >= this._size) return null; var lenB = this._buf[offset++] & 255; if (lenB === null) return null; if ((lenB & 128) === 128) { lenB &= 127; if (lenB === 0) throw newInvalidAsn1Error("Indefinite length not supported"); if (lenB > 4) throw newInvalidAsn1Error("encoding too long"); if (this._size - offset < lenB) return null; this._len = 0; for (var i = 0; i < lenB; i++) this._len = (this._len << 8) + (this._buf[offset++] & 255); } else { this._len = lenB; } return offset; }; Reader.prototype.readSequence = function(tag) { var seq = this.peek(); if (seq === null) return null; if (tag !== void 0 && tag !== seq) throw newInvalidAsn1Error("Expected 0x" + tag.toString(16) + ": got 0x" + seq.toString(16)); var o = this.readLength(this._offset + 1); if (o === null) return null; this._offset = o; return seq; }; Reader.prototype.readInt = function() { return this._readTag(ASN1.Integer); }; Reader.prototype.readBoolean = function() { return this._readTag(ASN1.Boolean) === 0 ? false : true; }; Reader.prototype.readEnumeration = function() { return this._readTag(ASN1.Enumeration); }; Reader.prototype.readString = function(tag, retbuf) { if (!tag) tag = ASN1.OctetString; var b = this.peek(); if (b === null) return null; if (b !== tag) throw newInvalidAsn1Error("Expected 0x" + tag.toString(16) + ": got 0x" + b.toString(16)); var o = this.readLength(this._offset + 1); if (o === null) return null; if (this.length > this._size - o) return null; this._offset = o; if (this.length === 0) return retbuf ? Buffer2.alloc(0) : ""; var str = this._buf.slice(this._offset, this._offset + this.length); this._offset += this.length; return retbuf ? str : str.toString("utf8"); }; Reader.prototype.readOID = function(tag) { if (!tag) tag = ASN1.OID; var b = this.readString(tag, true); if (b === null) return null; var values = []; var value = 0; for (var i = 0; i < b.length; i++) { var byte = b[i] & 255; value <<= 7; value += byte & 127; if ((byte & 128) === 0) { values.push(value); value = 0; } } value = values.shift(); values.unshift(value % 40); values.unshift(value / 40 >> 0); return values.join("."); }; Reader.prototype._readTag = function(tag) { assert.ok(tag !== void 0); var b = this.peek(); if (b === null) return null; if (b !== tag) throw newInvalidAsn1Error("Expected 0x" + tag.toString(16) + ": got 0x" + b.toString(16)); var o = this.readLength(this._offset + 1); if (o === null) return null; if (this.length > 4) throw newInvalidAsn1Error("Integer too long: " + this.length); if (this.length > this._size - o) return null; this._offset = o; var fb = this._buf[this._offset]; var value = 0; for (var i = 0; i < this.length; i++) { value <<= 8; value |= this._buf[this._offset++] & 255; } if ((fb & 128) === 128 && i !== 4) value -= 1 << i * 8; return value >> 0; }; module2.exports = Reader; } }); // node_modules/asn1/lib/ber/writer.js var require_writer = __commonJS({ "node_modules/asn1/lib/ber/writer.js"(exports, module2) { var assert = require("assert"); var Buffer2 = require_safer().Buffer; var ASN1 = require_types(); var errors = require_errors3(); var newInvalidAsn1Error = errors.newInvalidAsn1Error; var DEFAULT_OPTS = { size: 1024, growthFactor: 8 }; function merge(from, to) { assert.ok(from); assert.equal(typeof from, "object"); assert.ok(to); assert.equal(typeof to, "object"); var keys = Object.getOwnPropertyNames(from); keys.forEach(function(key) { if (to[key]) return; var value = Object.getOwnPropertyDescriptor(from, key); Object.defineProperty(to, key, value); }); return to; } function Writer(options) { options = merge(DEFAULT_OPTS, options || {}); this._buf = Buffer2.alloc(options.size || 1024); this._size = this._buf.length; this._offset = 0; this._options = options; this._seq = []; } Object.defineProperty(Writer.prototype, "buffer", { get: function() { if (this._seq.length) throw newInvalidAsn1Error(this._seq.length + " unended sequence(s)"); return this._buf.slice(0, this._offset); } }); Writer.prototype.writeByte = function(b) { if (typeof b !== "number") throw new TypeError("argument must be a Number"); this._ensure(1); this._buf[this._offset++] = b; }; Writer.prototype.writeInt = function(i, tag) { if (typeof i !== "number") throw new TypeError("argument must be a Number"); if (typeof tag !== "number") tag = ASN1.Integer; var sz = 4; while (((i & 4286578688) === 0 || (i & 4286578688) === 4286578688 >> 0) && sz > 1) { sz--; i <<= 8; } if (sz > 4) throw newInvalidAsn1Error("BER ints cannot be > 0xffffffff"); this._ensure(2 + sz); this._buf[this._offset++] = tag; this._buf[this._offset++] = sz; while (sz-- > 0) { this._buf[this._offset++] = (i & 4278190080) >>> 24; i <<= 8; } }; Writer.prototype.writeNull = function() { this.writeByte(ASN1.Null); this.writeByte(0); }; Writer.prototype.writeEnumeration = function(i, tag) { if (typeof i !== "number") throw new TypeError("argument must be a Number"); if (typeof tag !== "number") tag = ASN1.Enumeration; return this.writeInt(i, tag); }; Writer.prototype.writeBoolean = function(b, tag) { if (typeof b !== "boolean") throw new TypeError("argument must be a Boolean"); if (typeof tag !== "number") tag = ASN1.Boolean; this._ensure(3); this._buf[this._offset++] = tag; this._buf[this._offset++] = 1; this._buf[this._offset++] = b ? 255 : 0; }; Writer.prototype.writeString = function(s, tag) { if (typeof s !== "string") throw new TypeError("argument must be a string (was: " + typeof s + ")"); if (typeof tag !== "number") tag = ASN1.OctetString; var len = Buffer2.byteLength(s); this.writeByte(tag); this.writeLength(len); if (len) { this._ensure(len); this._buf.write(s, this._offset); this._offset += len; } }; Writer.prototype.writeBuffer = function(buf, tag) { if (typeof tag !== "number") throw new TypeError("tag must be a number"); if (!Buffer2.isBuffer(buf)) throw new TypeError("argument must be a buffer"); this.writeByte(tag); this.writeLength(buf.length); this._ensure(buf.length); buf.copy(this._buf, this._offset, 0, buf.length); this._offset += buf.length; }; Writer.prototype.writeStringArray = function(strings) { if (!strings instanceof Array) throw new TypeError("argument must be an Array[String]"); var self2 = this; strings.forEach(function(s) { self2.writeString(s); }); }; Writer.prototype.writeOID = function(s, tag) { if (typeof s !== "string") throw new TypeError("argument must be a string"); if (typeof tag !== "number") tag = ASN1.OID; if (!/^([0-9]+\.){3,}[0-9]+$/.test(s)) throw new Error("argument is not a valid OID string"); function encodeOctet(bytes2, octet) { if (octet < 128) { bytes2.push(octet); } else if (octet < 16384) { bytes2.push(octet >>> 7 | 128); bytes2.push(octet & 127); } else if (octet < 2097152) { bytes2.push(octet >>> 14 | 128); bytes2.push((octet >>> 7 | 128) & 255); bytes2.push(octet & 127); } else if (octet < 268435456) { bytes2.push(octet >>> 21 | 128); bytes2.push((octet >>> 14 | 128) & 255); bytes2.push((octet >>> 7 | 128) & 255); bytes2.push(octet & 127); } else { bytes2.push((octet >>> 28 | 128) & 255); bytes2.push((octet >>> 21 | 128) & 255); bytes2.push((octet >>> 14 | 128) & 255); bytes2.push((octet >>> 7 | 128) & 255); bytes2.push(octet & 127); } } var tmp = s.split("."); var bytes = []; bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10)); tmp.slice(2).forEach(function(b) { encodeOctet(bytes, parseInt(b, 10)); }); var self2 = this; this._ensure(2 + bytes.length); this.writeByte(tag); this.writeLength(bytes.length); bytes.forEach(function(b) { self2.writeByte(b); }); }; Writer.prototype.writeLength = function(len) { if (typeof len !== "number") throw new TypeError("argument must be a Number"); this._ensure(4); if (len <= 127) { this._buf[this._offset++] = len; } else if (len <= 255) { this._buf[this._offset++] = 129; this._buf[this._offset++] = len; } else if (len <= 65535) { this._buf[this._offset++] = 130; this._buf[this._offset++] = len >> 8; this._buf[this._offset++] = len; } else if (len <= 16777215) { this._buf[this._offset++] = 131; this._buf[this._offset++] = len >> 16; this._buf[this._offset++] = len >> 8; this._buf[this._offset++] = len; } else { throw newInvalidAsn1Error("Length too long (> 4 bytes)"); } }; Writer.prototype.startSequence = function(tag) { if (typeof tag !== "number") tag = ASN1.Sequence | ASN1.Constructor; this.writeByte(tag); this._seq.push(this._offset); this._ensure(3); this._offset += 3; }; Writer.prototype.endSequence = function() { var seq = this._seq.pop(); var start = seq + 3; var len = this._offset - start; if (len <= 127) { this._shift(start, len, -2); this._buf[seq] = len; } else if (len <= 255) { this._shift(start, len, -1); this._buf[seq] = 129; this._buf[seq + 1] = len; } else if (len <= 65535) { this._buf[seq] = 130; this._buf[seq + 1] = len >> 8; this._buf[seq + 2] = len; } else if (len <= 16777215) { this._shift(start, len, 1); this._buf[seq] = 131; this._buf[seq + 1] = len >> 16; this._buf[seq + 2] = len >> 8; this._buf[seq + 3] = len; } else { throw newInvalidAsn1Error("Sequence too long"); } }; Writer.prototype._shift = function(start, len, shift) { assert.ok(start !== void 0); assert.ok(len !== void 0); assert.ok(shift); this._buf.copy(this._buf, start + shift, start, start + len); this._offset += shift; }; Writer.prototype._ensure = function(len) { assert.ok(len); if (this._size - this._offset < len) { var sz = this._size * this._options.growthFactor; if (sz - this._offset < len) sz += len; var buf = Buffer2.alloc(sz); this._buf.copy(buf, 0, 0, this._offset); this._buf = buf; this._size = sz; } }; module2.exports = Writer; } }); // node_modules/asn1/lib/ber/index.js var require_ber = __commonJS({ "node_modules/asn1/lib/ber/index.js"(exports, module2) { var errors = require_errors3(); var types = require_types(); var Reader = require_reader(); var Writer = require_writer(); module2.exports = { Reader, Writer }; for (t in types) { if (types.hasOwnProperty(t)) module2.exports[t] = types[t]; } var t; for (e in errors) { if (errors.hasOwnProperty(e)) module2.exports[e] = errors[e]; } var e; } }); // node_modules/asn1/lib/index.js var require_lib = __commonJS({ "node_modules/asn1/lib/index.js"(exports, module2) { var Ber = require_ber(); module2.exports = { Ber, BerReader: Ber.Reader, BerWriter: Ber.Writer }; } }); // node_modules/jsbn/index.js var require_jsbn = __commonJS({ "node_modules/jsbn/index.js"(exports, module2) { (function() { var dbits; var canary = 244837814094590; var j_lm = (canary & 16777215) == 15715070; function BigInteger(a, b, c) { if (a != null) if (typeof a == "number") this.fromNumber(a, b, c); else if (b == null && typeof a != "string") this.fromString(a, 256); else this.fromString(a, b); } function nbi() { return new BigInteger(null); } function am1(i, x, w, j, c, n) { while (--n >= 0) { var v = x * this[i++] + w[j] + c; c = Math.floor(v / 67108864); w[j++] = v & 67108863; } return c; } function am2(i, x, w, j, c, n) { var xl = x & 32767, xh = x >> 15; while (--n >= 0) { var l = this[i] & 32767; var h = this[i++] >> 15; var m = xh * l + h * xl; l = xl * l + ((m & 32767) << 15) + w[j] + (c & 1073741823); c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); w[j++] = l & 1073741823; } return c; } function am3(i, x, w, j, c, n) { var xl = x & 16383, xh = x >> 14; while (--n >= 0) { var l = this[i] & 16383; var h = this[i++] >> 14; var m = xh * l + h * xl; l = xl * l + ((m & 16383) << 14) + w[j] + c; c = (l >> 28) + (m >> 14) + xh * h; w[j++] = l & 268435455; } return c; } var inBrowser = typeof navigator !== "undefined"; if (inBrowser && j_lm && navigator.appName == "Microsoft Internet Explorer") { BigInteger.prototype.am = am2; dbits = 30; } else if (inBrowser && j_lm && navigator.appName != "Netscape") { BigInteger.prototype.am = am1; dbits = 26; } else { BigInteger.prototype.am = am3; dbits = 28; } BigInteger.prototype.DB = dbits; BigInteger.prototype.DM = (1 << dbits) - 1; BigInteger.prototype.DV = 1 << dbits; var BI_FP = 52; BigInteger.prototype.FV = Math.pow(2, BI_FP); BigInteger.prototype.F1 = BI_FP - dbits; BigInteger.prototype.F2 = 2 * dbits - BI_FP; var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; var BI_RC = new Array(); var rr, vv; rr = "0".charCodeAt(0); for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; rr = "a".charCodeAt(0); for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; rr = "A".charCodeAt(0); for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; function int2char(n) { return BI_RM.charAt(n); } function intAt(s, i) { var c = BI_RC[s.charCodeAt(i)]; return c == null ? -1 : c; } function bnpCopyTo(r) { for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; r.t = this.t; r.s = this.s; } function bnpFromInt(x) { this.t = 1; this.s = x < 0 ? -1 : 0; if (x > 0) this[0] = x; else if (x < -1) this[0] = x + this.DV; else this.t = 0; } function nbv(i) { var r = nbi(); r.fromInt(i); return r; } function bnpFromString(s, b) { var k; if (b == 16) k = 4; else if (b == 8) k = 3; else if (b == 256) k = 8; else if (b == 2) k = 1; else if (b == 32) k = 5; else if (b == 4) k = 2; else { this.fromRadix(s, b); return; } this.t = 0; this.s = 0; var i = s.length, mi = false, sh = 0; while (--i >= 0) { var x = k == 8 ? s[i] & 255 : intAt(s, i); if (x < 0) { if (s.charAt(i) == "-") mi = true; continue; } mi = false; if (sh == 0) this[this.t++] = x; else if (sh + k > this.DB) { this[this.t - 1] |= (x & (1 << this.DB - sh) - 1) << sh; this[this.t++] = x >> this.DB - sh; } else this[this.t - 1] |= x << sh; sh += k; if (sh >= this.DB) sh -= this.DB; } if (k == 8 && (s[0] & 128) != 0) { this.s = -1; if (sh > 0) this[this.t - 1] |= (1 << this.DB - sh) - 1 << sh; } this.clamp(); if (mi) BigInteger.ZERO.subTo(this, this); } function bnpClamp() { var c = this.s & this.DM; while (this.t > 0 && this[this.t - 1] == c) --this.t; } function bnToString(b) { if (this.s < 0) return "-" + this.negate().toString(b); var k; if (b == 16) k = 4; else if (b == 8) k = 3; else if (b == 2) k = 1; else if (b == 32) k = 5; else if (b == 4) k = 2; else return this.toRadix(b); var km = (1 << k) - 1, d, m = false, r = "", i = this.t; var p = this.DB - i * this.DB % k; if (i-- > 0) { if (p < this.DB && (d = this[i] >> p) > 0) { m = true; r = int2char(d); } while (i >= 0) { if (p < k) { d = (this[i] & (1 << p) - 1) << k - p; d |= this[--i] >> (p += this.DB - k); } else { d = this[i] >> (p -= k) & km; if (p <= 0) { p += this.DB; --i; } } if (d > 0) m = true; if (m) r += int2char(d); } } return m ? r : "0"; } function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this, r); return r; } function bnAbs() { return this.s < 0 ? this.negate() : this; } function bnCompareTo(a) { var r = this.s - a.s; if (r != 0) return r; var i = this.t; r = i - a.t; if (r != 0) return this.s < 0 ? -r : r; while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; return 0; } function nbits(x) { var r = 1, t2; if ((t2 = x >>> 16) != 0) { x = t2; r += 16; } if ((t2 = x >> 8) != 0) { x = t2; r += 8; } if ((t2 = x >> 4) != 0) { x = t2; r += 4; } if ((t2 = x >> 2) != 0) { x = t2; r += 2; } if ((t2 = x >> 1) != 0) { x = t2; r += 1; } return r; } function bnBitLength() { if (this.t <= 0) return 0; return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM); } function bnpDLShiftTo(n, r) { var i; for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; for (i = n - 1; i >= 0; --i) r[i] = 0; r.t = this.t + n; r.s = this.s; } function bnpDRShiftTo(n, r) { for (var i = n; i < this.t; ++i) r[i - n] = this[i]; r.t = Math.max(this.t - n, 0); r.s = this.s; } function bnpLShiftTo(n, r) { var bs = n % this.DB; var cbs = this.DB - bs; var bm = (1 << cbs) - 1; var ds = Math.floor(n / this.DB), c = this.s << bs & this.DM, i; for (i = this.t - 1; i >= 0; --i) { r[i + ds + 1] = this[i] >> cbs | c; c = (this[i] & bm) << bs; } for (i = ds - 1; i >= 0; --i) r[i] = 0; r[ds] = c; r.t = this.t + ds + 1; r.s = this.s; r.clamp(); } function bnpRShiftTo(n, r) { r.s = this.s; var ds = Math.floor(n / this.DB); if (ds >= this.t) { r.t = 0; return; } var bs = n % this.DB; var cbs = this.DB - bs; var bm = (1 << bs) - 1; r[0] = this[ds] >> bs; for (var i = ds + 1; i < this.t; ++i) { r[i - ds - 1] |= (this[i] & bm) << cbs; r[i - ds] = this[i] >> bs; } if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; r.t = this.t - ds; r.clamp(); } function bnpSubTo(a, r) { var i = 0, c = 0, m = Math.min(a.t, this.t); while (i < m) { c += this[i] - a[i]; r[i++] = c & this.DM; c >>= this.DB; } if (a.t < this.t) { c -= a.s; while (i < this.t) { c += this[i]; r[i++] = c & this.DM; c >>= this.DB; } c += this.s; } else { c += this.s; while (i < a.t) { c -= a[i]; r[i++] = c & this.DM; c >>= this.DB; } c -= a.s; } r.s = c < 0 ? -1 : 0; if (c < -1) r[i++] = this.DV + c; else if (c > 0) r[i++] = c; r.t = i; r.clamp(); } function bnpMultiplyTo(a, r) { var x = this.abs(), y = a.abs(); var i = x.t; r.t = i + y.t; while (--i >= 0) r[i] = 0; for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); r.s = 0; r.clamp(); if (this.s != a.s) BigInteger.ZERO.subTo(r, r); } function bnpSquareTo(r) { var x = this.abs(); var i = r.t = 2 * x.t; while (--i >= 0) r[i] = 0; for (i = 0; i < x.t - 1; ++i) { var c = x.am(i, x[i], r, 2 * i, 0, 1); if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { r[i + x.t] -= x.DV; r[i + x.t + 1] = 1; } } if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); r.s = 0; r.clamp(); } function bnpDivRemTo(m, q2, r) { var pm = m.abs(); if (pm.t <= 0) return; var pt = this.abs(); if (pt.t < pm.t) { if (q2 != null) q2.fromInt(0); if (r != null) this.copyTo(r); return; } if (r == null) r = nbi(); var y = nbi(), ts = this.s, ms = m.s; var nsh = this.DB - nbits(pm[pm.t - 1]); if (nsh > 0) { pm.lShiftTo(nsh, y); pt.lShiftTo(nsh, r); } else { pm.copyTo(y); pt.copyTo(r); } var ys = y.t; var y0 = y[ys - 1]; if (y0 == 0) return; var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0); var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2; var i = r.t, j = i - ys, t2 = q2 == null ? nbi() : q2; y.dlShiftTo(j, t2); if (r.compareTo(t2) >= 0) { r[r.t++] = 1; r.subTo(t2, r); } BigInteger.ONE.dlShiftTo(ys, t2); t2.subTo(y, y); while (y.t < ys) y[y.t++] = 0; while (--j >= 0) { var qd = r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { y.dlShiftTo(j, t2); r.subTo(t2, r); while (r[i] < --qd) r.subTo(t2, r); } } if (q2 != null) { r.drShiftTo(ys, q2); if (ts != ms) BigInteger.ZERO.subTo(q2, q2); } r.t = ys; r.clamp(); if (nsh > 0) r.rShiftTo(nsh, r); if (ts < 0) BigInteger.ZERO.subTo(r, r); } function bnMod(a) { var r = nbi(); this.abs().divRemTo(a, null, r); if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); return r; } function Classic(m) { this.m = m; } function cConvert(x) { if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); else return x; } function cRevert(x) { return x; } function cReduce(x) { x.divRemTo(this.m, null, x); } function cMulTo(x, y, r) { x.multiplyTo(y, r); this.reduce(r); } function cSqrTo(x, r) { x.squareTo(r); this.reduce(r); } Classic.prototype.convert = cConvert; Classic.prototype.revert = cRevert; Classic.prototype.reduce = cReduce; Classic.prototype.mulTo = cMulTo; Classic.prototype.sqrTo = cSqrTo; function bnpInvDigit() { if (this.t < 1) return 0; var x = this[0]; if ((x & 1) == 0) return 0; var y = x & 3; y = y * (2 - (x & 15) * y) & 15; y = y * (2 - (x & 255) * y) & 255; y = y * (2 - ((x & 65535) * y & 65535)) & 65535; y = y * (2 - x * y % this.DV) % this.DV; return y > 0 ? this.DV - y : -y; } function Montgomery(m) { this.m = m; this.mp = m.invDigit(); this.mpl = this.mp & 32767; this.mph = this.mp >> 15; this.um = (1 << m.DB - 15) - 1; this.mt2 = 2 * m.t; } function montConvert(x) { var r = nbi(); x.abs().dlShiftTo(this.m.t, r); r.divRemTo(this.m, null, r); if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); return r; } function montRevert(x) { var r = nbi(); x.copyTo(r); this.reduce(r); return r; } function montReduce(x) { while (x.t <= this.mt2) x[x.t++] = 0; for (var i = 0; i < this.m.t; ++i) { var j = x[i] & 32767; var u0 = j * this.mpl + ((j * this.mph + (x[i] >> 15) * this.mpl & this.um) << 15) & x.DM; j = i + this.m.t; x[j] += this.m.am(0, u0, x, i, 0, this.m.t); while (x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; } } x.clamp(); x.drShiftTo(this.m.t, x); if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); } function montSqrTo(x, r) { x.squareTo(r); this.reduce(r); } function montMulTo(x, y, r) { x.multiplyTo(y, r); this.reduce(r); } Montgomery.prototype.convert = montConvert; Montgomery.prototype.revert = montRevert; Montgomery.prototype.reduce = montReduce; Montgomery.prototype.mulTo = montMulTo; Montgomery.prototype.sqrTo = montSqrTo; function bnpIsEven() { return (this.t > 0 ? this[0] & 1 : this.s) == 0; } function bnpExp(e, z2) { if (e > 4294967295 || e < 1) return BigInteger.ONE; var r = nbi(), r2 = nbi(), g = z2.convert(this), i = nbits(e) - 1; g.copyTo(r); while (--i >= 0) { z2.sqrTo(r, r2); if ((e & 1 << i) > 0) z2.mulTo(r2, g, r); else { var t2 = r; r = r2; r2 = t2; } } return z2.revert(r); } function bnModPowInt(e, m) { var z2; if (e < 256 || m.isEven()) z2 = new Classic(m); else z2 = new Montgomery(m); return this.exp(e, z2); } BigInteger.prototype.copyTo = bnpCopyTo; BigInteger.prototype.fromInt = bnpFromInt; BigInteger.prototype.fromString = bnpFromString; BigInteger.prototype.clamp = bnpClamp; BigInteger.prototype.dlShiftTo = bnpDLShiftTo; BigInteger.prototype.drShiftTo = bnpDRShiftTo; BigInteger.prototype.lShiftTo = bnpLShiftTo; BigInteger.prototype.rShiftTo = bnpRShiftTo; BigInteger.prototype.subTo = bnpSubTo; BigInteger.prototype.multiplyTo = bnpMultiplyTo; BigInteger.prototype.squareTo = bnpSquareTo; BigInteger.prototype.divRemTo = bnpDivRemTo; BigInteger.prototype.invDigit = bnpInvDigit; BigInteger.prototype.isEven = bnpIsEven; BigInteger.prototype.exp = bnpExp; BigInteger.prototype.toString = bnToString; BigInteger.prototype.negate = bnNegate; BigInteger.prototype.abs = bnAbs; BigInteger.prototype.compareTo = bnCompareTo; BigInteger.prototype.bitLength = bnBitLength; BigInteger.prototype.mod = bnMod; BigInteger.prototype.modPowInt = bnModPowInt; BigInteger.ZERO = nbv(0); BigInteger.ONE = nbv(1); function bnClone() { var r = nbi(); this.copyTo(r); return r; } function bnIntValue() { if (this.s < 0) { if (this.t == 1) return this[0] - this.DV; else if (this.t == 0) return -1; } else if (this.t == 1) return this[0]; else if (this.t == 0) return 0; return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]; } function bnByteValue() { return this.t == 0 ? this.s : this[0] << 24 >> 24; } function bnShortValue() { return this.t == 0 ? this.s : this[0] << 16 >> 16; } function bnpChunkSize(r) { return Math.floor(Math.LN2 * this.DB / Math.log(r)); } function bnSigNum() { if (this.s < 0) return -1; else if (this.t <= 0 || this.t == 1 && this[0] <= 0) return 0; else return 1; } function bnpToRadix(b) { if (b == null) b = 10; if (this.signum() == 0 || b < 2 || b > 36) return "0"; var cs = this.chunkSize(b); var a = Math.pow(b, cs); var d = nbv(a), y = nbi(), z2 = nbi(), r = ""; this.divRemTo(d, y, z2); while (y.signum() > 0) { r = (a + z2.intValue()).toString(b).substr(1) + r; y.divRemTo(d, y, z2); } return z2.intValue().toString(b) + r; } function bnpFromRadix(s, b) { this.fromInt(0); if (b == null) b = 10; var cs = this.chunkSize(b); var d = Math.pow(b, cs), mi = false, j = 0, w = 0; for (var i = 0; i < s.length; ++i) { var x = intAt(s, i); if (x < 0) { if (s.charAt(i) == "-" && this.signum() == 0) mi = true; continue; } w = b * w + x; if (++j >= cs) { this.dMultiply(d); this.dAddOffset(w, 0); j = 0; w = 0; } } if (j > 0) { this.dMultiply(Math.pow(b, j)); this.dAddOffset(w, 0); } if (mi) BigInteger.ZERO.subTo(this, this); } function bnpFromNumber(a, b, c) { if (typeof b == "number") { if (a < 2) this.fromInt(1); else { this.fromNumber(a, c); if (!this.testBit(a - 1)) this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); if (this.isEven()) this.dAddOffset(1, 0); while (!this.isProbablePrime(b)) { this.dAddOffset(2, 0); if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); } } } else { var x = new Array(), t2 = a & 7; x.length = (a >> 3) + 1; b.nextBytes(x); if (t2 > 0) x[0] &= (1 << t2) - 1; else x[0] = 0; this.fromString(x, 256); } } function bnToByteArray() { var i = this.t, r = new Array(); r[0] = this.s; var p = this.DB - i * this.DB % 8, d, k = 0; if (i-- > 0) { if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) r[k++] = d | this.s << this.DB - p; while (i >= 0) { if (p < 8) { d = (this[i] & (1 << p) - 1) << 8 - p; d |= this[--i] >> (p += this.DB - 8); } else { d = this[i] >> (p -= 8) & 255; if (p <= 0) { p += this.DB; --i; } } if ((d & 128) != 0) d |= -256; if (k == 0 && (this.s & 128) != (d & 128)) ++k; if (k > 0 || d != this.s) r[k++] = d; } } return r; } function bnEquals(a) { return this.compareTo(a) == 0; } function bnMin(a) { return this.compareTo(a) < 0 ? this : a; } function bnMax(a) { return this.compareTo(a) > 0 ? this : a; } function bnpBitwiseTo(a, op, r) { var i, f, m = Math.min(a.t, this.t); for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); if (a.t < this.t) { f = a.s & this.DM; for (i = m; i < this.t; ++i) r[i] = op(this[i], f); r.t = this.t; } else { f = this.s & this.DM; for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); r.t = a.t; } r.s = op(this.s, a.s); r.clamp(); } function op_and(x, y) { return x & y; } function bnAnd(a) { var r = nbi(); this.bitwiseTo(a, op_and, r); return r; } function op_or(x, y) { return x | y; } function bnOr(a) { var r = nbi(); this.bitwiseTo(a, op_or, r); return r; } function op_xor(x, y) { return x ^ y; } function bnXor(a) { var r = nbi(); this.bitwiseTo(a, op_xor, r); return r; } function op_andnot(x, y) { return x & ~y; } function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a, op_andnot, r); return r; } function bnNot() { var r = nbi(); for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; r.t = this.t; r.s = ~this.s; return r; } function bnShiftLeft(n) { var r = nbi(); if (n < 0) this.rShiftTo(-n, r); else this.lShiftTo(n, r); return r; } function bnShiftRight(n) { var r = nbi(); if (n < 0) this.lShiftTo(-n, r); else this.rShiftTo(n, r); return r; } function lbit(x) { if (x == 0) return -1; var r = 0; if ((x & 65535) == 0) { x >>= 16; r += 16; } if ((x & 255) == 0) { x >>= 8; r += 8; } if ((x & 15) == 0) { x >>= 4; r += 4; } if ((x & 3) == 0) { x >>= 2; r += 2; } if ((x & 1) == 0) ++r; return r; } function bnGetLowestSetBit() { for (var i = 0; i < this.t; ++i) if (this[i] != 0) return i * this.DB + lbit(this[i]); if (this.s < 0) return this.t * this.DB; return -1; } function cbit(x) { var r = 0; while (x != 0) { x &= x - 1; ++r; } return r; } function bnBitCount() { var r = 0, x = this.s & this.DM; for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); return r; } function bnTestBit(n) { var j = Math.floor(n / this.DB); if (j >= this.t) return this.s != 0; return (this[j] & 1 << n % this.DB) != 0; } function bnpChangeBit(n, op) { var r = BigInteger.ONE.shiftLeft(n); this.bitwiseTo(r, op, r); return r; } function bnSetBit(n) { return this.changeBit(n, op_or); } function bnClearBit(n) { return this.changeBit(n, op_andnot); } function bnFlipBit(n) { return this.changeBit(n, op_xor); } function bnpAddTo(a, r) { var i = 0, c = 0, m = Math.min(a.t, this.t); while (i < m) { c += this[i] + a[i]; r[i++] = c & this.DM; c >>= this.DB; } if (a.t < this.t) { c += a.s; while (i < this.t) { c += this[i]; r[i++] = c & this.DM; c >>= this.DB; } c += this.s; } else { c += this.s; while (i < a.t) { c += a[i]; r[i++] = c & this.DM; c >>= this.DB; } c += a.s; } r.s = c < 0 ? -1 : 0; if (c > 0) r[i++] = c; else if (c < -1) r[i++] = this.DV + c; r.t = i; r.clamp(); } function bnAdd(a) { var r = nbi(); this.addTo(a, r); return r; } function bnSubtract(a) { var r = nbi(); this.subTo(a, r); return r; } function bnMultiply(a) { var r = nbi(); this.multiplyTo(a, r); return r; } function bnSquare() { var r = nbi(); this.squareTo(r); return r; } function bnDivide(a) { var r = nbi(); this.divRemTo(a, r, null); return r; } function bnRemainder(a) { var r = nbi(); this.divRemTo(a, null, r); return r; } function bnDivideAndRemainder(a) { var q2 = nbi(), r = nbi(); this.divRemTo(a, q2, r); return new Array(q2, r); } function bnpDMultiply(n) { this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); ++this.t; this.clamp(); } function bnpDAddOffset(n, w) { if (n == 0) return; while (this.t <= w) this[this.t++] = 0; this[w] += n; while (this[w] >= this.DV) { this[w] -= this.DV; if (++w >= this.t) this[this.t++] = 0; ++this[w]; } } function NullExp() { } function nNop(x) { return x; } function nMulTo(x, y, r) { x.multiplyTo(y, r); } function nSqrTo(x, r) { x.squareTo(r); } NullExp.prototype.convert = nNop; NullExp.prototype.revert = nNop; NullExp.prototype.mulTo = nMulTo; NullExp.prototype.sqrTo = nSqrTo; function bnPow(e) { return this.exp(e, new NullExp()); } function bnpMultiplyLowerTo(a, n, r) { var i = Math.min(this.t + a.t, n); r.s = 0; r.t = i; while (i > 0) r[--i] = 0; var j; for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); r.clamp(); } function bnpMultiplyUpperTo(a, n, r) { --n; var i = r.t = this.t + a.t - n; r.s = 0; while (--i >= 0) r[i] = 0; for (i = Math.max(n - this.t, 0); i < a.t; ++i) r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); r.clamp(); r.drShiftTo(1, r); } function Barrett(m) { this.r2 = nbi(); this.q3 = nbi(); BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); this.mu = this.r2.divide(m); this.m = m; } function barrettConvert(x) { if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); else if (x.compareTo(this.m) < 0) return x; else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; } } function barrettRevert(x) { return x; } function barrettReduce(x) { x.drShiftTo(this.m.t - 1, this.r2); if (x.t > this.m.t + 1) { x.t = this.m.t + 1; x.clamp(); } this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); x.subTo(this.r2, x); while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); } function barrettSqrTo(x, r) { x.squareTo(r); this.reduce(r); } function barrettMulTo(x, y, r) { x.multiplyTo(y, r); this.reduce(r); } Barrett.prototype.convert = barrettConvert; Barrett.prototype.revert = barrettRevert; Barrett.prototype.reduce = barrettReduce; Barrett.prototype.mulTo = barrettMulTo; Barrett.prototype.sqrTo = barrettSqrTo; function bnModPow(e, m) { var i = e.bitLength(), k, r = nbv(1), z2; if (i <= 0) return r; else if (i < 18) k = 1; else if (i < 48) k = 3; else if (i < 144) k = 4; else if (i < 768) k = 5; else k = 6; if (i < 8) z2 = new Classic(m); else if (m.isEven()) z2 = new Barrett(m); else z2 = new Montgomery(m); var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1; g[1] = z2.convert(this); if (k > 1) { var g2 = nbi(); z2.sqrTo(g[1], g2); while (n <= km) { g[n] = nbi(); z2.mulTo(g2, g[n - 2], g[n]); n += 2; } } var j = e.t - 1, w, is1 = true, r2 = nbi(), t2; i = nbits(e[j]) - 1; while (j >= 0) { if (i >= k1) w = e[j] >> i - k1 & km; else { w = (e[j] & (1 << i + 1) - 1) << k1 - i; if (j > 0) w |= e[j - 1] >> this.DB + i - k1; } n = k; while ((w & 1) == 0) { w >>= 1; --n; } if ((i -= n) < 0) { i += this.DB; --j; } if (is1) { g[w].copyTo(r); is1 = false; } else { while (n > 1) { z2.sqrTo(r, r2); z2.sqrTo(r2, r); n -= 2; } if (n > 0) z2.sqrTo(r, r2); else { t2 = r; r = r2; r2 = t2; } z2.mulTo(r2, g[w], r); } while (j >= 0 && (e[j] & 1 << i) == 0) { z2.sqrTo(r, r2); t2 = r; r = r2; r2 = t2; if (--i < 0) { i = this.DB - 1; --j; } } } return z2.revert(r); } function bnGCD(a) { var x = this.s < 0 ? this.negate() : this.clone(); var y = a.s < 0 ? a.negate() : a.clone(); if (x.compareTo(y) < 0) { var t2 = x; x = y; y = t2; } var i = x.getLowestSetBit(), g = y.getLowestSetBit(); if (g < 0) return x; if (i < g) g = i; if (g > 0) { x.rShiftTo(g, x); y.rShiftTo(g, y); } while (x.signum() > 0) { if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); if (x.compareTo(y) >= 0) { x.subTo(y, x); x.rShiftTo(1, x); } else { y.subTo(x, y); y.rShiftTo(1, y); } } if (g > 0) y.lShiftTo(g, y); return y; } function bnpModInt(n) { if (n <= 0) return 0; var d = this.DV % n, r = this.s < 0 ? n - 1 : 0; if (this.t > 0) if (d == 0) r = this[0] % n; else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; return r; } function bnModInverse(m) { var ac = m.isEven(); if (this.isEven() && ac || m.signum() == 0) return BigInteger.ZERO; var u = m.clone(), v = this.clone(); var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); while (u.signum() != 0) { while (u.isEven()) { u.rShiftTo(1, u); if (ac) { if (!a.isEven() || !b.isEven()) { a.addTo(this, a); b.subTo(m, b); } a.rShiftTo(1, a); } else if (!b.isEven()) b.subTo(m, b); b.rShiftTo(1, b); } while (v.isEven()) { v.rShiftTo(1, v); if (ac) { if (!c.isEven() || !d.isEven()) { c.addTo(this, c); d.subTo(m, d); } c.rShiftTo(1, c); } else if (!d.isEven()) d.subTo(m, d); d.rShiftTo(1, d); } if (u.compareTo(v) >= 0) { u.subTo(v, u); if (ac) a.subTo(c, a); b.subTo(d, b); } else { v.subTo(u, v); if (ac) c.subTo(a, c); d.subTo(b, d); } } if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; if (d.compareTo(m) >= 0) return d.subtract(m); if (d.signum() < 0) d.addTo(m, d); else return d; if (d.signum() < 0) return d.add(m); else return d; } var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]; var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; function bnIsProbablePrime(t2) { var i, x = this.abs(); if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { for (i = 0; i < lowprimes.length; ++i) if (x[0] == lowprimes[i]) return true; return false; } if (x.isEven()) return false; i = 1; while (i < lowprimes.length) { var m = lowprimes[i], j = i + 1; while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; m = x.modInt(m); while (i < j) if (m % lowprimes[i++] == 0) return false; } return x.millerRabin(t2); } function bnpMillerRabin(t2) { var n1 = this.subtract(BigInteger.ONE); var k = n1.getLowestSetBit(); if (k <= 0) return false; var r = n1.shiftRight(k); t2 = t2 + 1 >> 1; if (t2 > lowprimes.length) t2 = lowprimes.length; var a = nbi(); for (var i = 0; i < t2; ++i) { a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); var y = a.modPow(r, this); if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { var j = 1; while (j++ < k && y.compareTo(n1) != 0) { y = y.modPowInt(2, this); if (y.compareTo(BigInteger.ONE) == 0) return false; } if (y.compareTo(n1) != 0) return false; } } return true; } BigInteger.prototype.chunkSize = bnpChunkSize; BigInteger.prototype.toRadix = bnpToRadix; BigInteger.prototype.fromRadix = bnpFromRadix; BigInteger.prototype.fromNumber = bnpFromNumber; BigInteger.prototype.bitwiseTo = bnpBitwiseTo; BigInteger.prototype.changeBit = bnpChangeBit; BigInteger.prototype.addTo = bnpAddTo; BigInteger.prototype.dMultiply = bnpDMultiply; BigInteger.prototype.dAddOffset = bnpDAddOffset; BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; BigInteger.prototype.modInt = bnpModInt; BigInteger.prototype.millerRabin = bnpMillerRabin; BigInteger.prototype.clone = bnClone; BigInteger.prototype.intValue = bnIntValue; BigInteger.prototype.byteValue = bnByteValue; BigInteger.prototype.shortValue = bnShortValue; BigInteger.prototype.signum = bnSigNum; BigInteger.prototype.toByteArray = bnToByteArray; BigInteger.prototype.equals = bnEquals; BigInteger.prototype.min = bnMin; BigInteger.prototype.max = bnMax; BigInteger.prototype.and = bnAnd; BigInteger.prototype.or = bnOr; BigInteger.prototype.xor = bnXor; BigInteger.prototype.andNot = bnAndNot; BigInteger.prototype.not = bnNot; BigInteger.prototype.shiftLeft = bnShiftLeft; BigInteger.prototype.shiftRight = bnShiftRight; BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; BigInteger.prototype.bitCount = bnBitCount; BigInteger.prototype.testBit = bnTestBit; BigInteger.prototype.setBit = bnSetBit; BigInteger.prototype.clearBit = bnClearBit; BigInteger.prototype.flipBit = bnFlipBit; BigInteger.prototype.add = bnAdd; BigInteger.prototype.subtract = bnSubtract; BigInteger.prototype.multiply = bnMultiply; BigInteger.prototype.divide = bnDivide; BigInteger.prototype.remainder = bnRemainder; BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; BigInteger.prototype.modPow = bnModPow; BigInteger.prototype.modInverse = bnModInverse; BigInteger.prototype.pow = bnPow; BigInteger.prototype.gcd = bnGCD; BigInteger.prototype.isProbablePrime = bnIsProbablePrime; BigInteger.prototype.square = bnSquare; BigInteger.prototype.Barrett = Barrett; var rng_state; var rng_pool; var rng_pptr; function rng_seed_int(x) { rng_pool[rng_pptr++] ^= x & 255; rng_pool[rng_pptr++] ^= x >> 8 & 255; rng_pool[rng_pptr++] ^= x >> 16 & 255; rng_pool[rng_pptr++] ^= x >> 24 & 255; if (rng_pptr >= rng_psize) rng_pptr -= rng_psize; } function rng_seed_time() { rng_seed_int(new Date().getTime()); } if (rng_pool == null) { rng_pool = new Array(); rng_pptr = 0; var t; if (typeof window !== "undefined" && window.crypto) { if (window.crypto.getRandomValues) { var ua = new Uint8Array(32); window.crypto.getRandomValues(ua); for (t = 0; t < 32; ++t) rng_pool[rng_pptr++] = ua[t]; } else if (navigator.appName == "Netscape" && navigator.appVersion < "5") { var z = window.crypto.random(32); for (t = 0; t < z.length; ++t) rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; } } while (rng_pptr < rng_psize) { t = Math.floor(65536 * Math.random()); rng_pool[rng_pptr++] = t >>> 8; rng_pool[rng_pptr++] = t & 255; } rng_pptr = 0; rng_seed_time(); } function rng_get_byte() { if (rng_state == null) { rng_seed_time(); rng_state = prng_newstate(); rng_state.init(rng_pool); for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) rng_pool[rng_pptr] = 0; rng_pptr = 0; } return rng_state.next(); } function rng_get_bytes(ba) { var i; for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); } function SecureRandom2() { } SecureRandom2.prototype.nextBytes = rng_get_bytes; function Arcfour() { this.i = 0; this.j = 0; this.S = new Array(); } function ARC4init(key) { var i, j, t2; for (i = 0; i < 256; ++i) this.S[i] = i; j = 0; for (i = 0; i < 256; ++i) { j = j + this.S[i] + key[i % key.length] & 255; t2 = this.S[i]; this.S[i] = this.S[j]; this.S[j] = t2; } this.i = 0; this.j = 0; } function ARC4next() { var t2; this.i = this.i + 1 & 255; this.j = this.j + this.S[this.i] & 255; t2 = this.S[this.i]; this.S[this.i] = this.S[this.j]; this.S[this.j] = t2; return this.S[t2 + this.S[this.i] & 255]; } Arcfour.prototype.init = ARC4init; Arcfour.prototype.next = ARC4next; function prng_newstate() { return new Arcfour(); } var rng_psize = 256; BigInteger.SecureRandom = SecureRandom2; BigInteger.BigInteger = BigInteger; if (typeof exports !== "undefined") { exports = module2.exports = BigInteger; } else { this.BigInteger = BigInteger; this.SecureRandom = SecureRandom2; } }).call(exports); } }); // node_modules/ecc-jsbn/lib/ec.js var require_ec = __commonJS({ "node_modules/ecc-jsbn/lib/ec.js"(exports, module2) { var BigInteger = require_jsbn().BigInteger; var Barrett = BigInteger.prototype.Barrett; function ECFieldElementFp(q2, x) { this.x = x; this.q = q2; } function feFpEquals(other) { if (other == this) return true; return this.q.equals(other.q) && this.x.equals(other.x); } function feFpToBigInteger() { return this.x; } function feFpNegate() { return new ECFieldElementFp(this.q, this.x.negate().mod(this.q)); } function feFpAdd(b) { return new ECFieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q)); } function feFpSubtract(b) { return new ECFieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q)); } function feFpMultiply(b) { return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q)); } function feFpSquare() { return new ECFieldElementFp(this.q, this.x.square().mod(this.q)); } function feFpDivide(b) { return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q)); } ECFieldElementFp.prototype.equals = feFpEquals; ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger; ECFieldElementFp.prototype.negate = feFpNegate; ECFieldElementFp.prototype.add = feFpAdd; ECFieldElementFp.prototype.subtract = feFpSubtract; ECFieldElementFp.prototype.multiply = feFpMultiply; ECFieldElementFp.prototype.square = feFpSquare; ECFieldElementFp.prototype.divide = feFpDivide; function ECPointFp(curve, x, y, z) { this.curve = curve; this.x = x; this.y = y; if (z == null) { this.z = BigInteger.ONE; } else { this.z = z; } this.zinv = null; } function pointFpGetX() { if (this.zinv == null) { this.zinv = this.z.modInverse(this.curve.q); } var r = this.x.toBigInteger().multiply(this.zinv); this.curve.reduce(r); return this.curve.fromBigInteger(r); } function pointFpGetY() { if (this.zinv == null) { this.zinv = this.z.modInverse(this.curve.q); } var r = this.y.toBigInteger().multiply(this.zinv); this.curve.reduce(r); return this.curve.fromBigInteger(r); } function pointFpEquals(other) { if (other == this) return true; if (this.isInfinity()) return other.isInfinity(); if (other.isInfinity()) return this.isInfinity(); var u, v; u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q); if (!u.equals(BigInteger.ZERO)) return false; v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q); return v.equals(BigInteger.ZERO); } function pointFpIsInfinity() { if (this.x == null && this.y == null) return true; return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO); } function pointFpNegate() { return new ECPointFp(this.curve, this.x, this.y.negate(), this.z); } function pointFpAdd(b) { if (this.isInfinity()) return b; if (b.isInfinity()) return this; var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q); var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q); if (BigInteger.ZERO.equals(v)) { if (BigInteger.ZERO.equals(u)) { return this.twice(); } return this.curve.getInfinity(); } var THREE = new BigInteger("3"); var x1 = this.x.toBigInteger(); var y1 = this.y.toBigInteger(); var x2 = b.x.toBigInteger(); var y2 = b.y.toBigInteger(); var v2 = v.square(); var v3 = v2.multiply(v); var x1v2 = x1.multiply(v2); var zu2 = u.square().multiply(this.z); var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q); var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q); var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q); return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3); } function pointFpTwice() { if (this.isInfinity()) return this; if (this.y.toBigInteger().signum() == 0) return this.curve.getInfinity(); var THREE = new BigInteger("3"); var x1 = this.x.toBigInteger(); var y1 = this.y.toBigInteger(); var y1z1 = y1.multiply(this.z); var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q); var a = this.curve.a.toBigInteger(); var w = x1.square().multiply(THREE); if (!BigInteger.ZERO.equals(a)) { w = w.add(this.z.square().multiply(a)); } w = w.mod(this.curve.q); var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q); var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q); var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q); return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3); } function pointFpMultiply(k) { if (this.isInfinity()) return this; if (k.signum() == 0) return this.curve.getInfinity(); var e = k; var h = e.multiply(new BigInteger("3")); var neg = this.negate(); var R = this; var i; for (i = h.bitLength() - 2; i > 0; --i) { R = R.twice(); var hBit = h.testBit(i); var eBit = e.testBit(i); if (hBit != eBit) { R = R.add(hBit ? this : neg); } } return R; } function pointFpMultiplyTwo(j, x, k) { var i; if (j.bitLength() > k.bitLength()) i = j.bitLength() - 1; else i = k.bitLength() - 1; var R = this.curve.getInfinity(); var both = this.add(x); while (i >= 0) { R = R.twice(); if (j.testBit(i)) { if (k.testBit(i)) { R = R.add(both); } else { R = R.add(this); } } else { if (k.testBit(i)) { R = R.add(x); } } --i; } return R; } ECPointFp.prototype.getX = pointFpGetX; ECPointFp.prototype.getY = pointFpGetY; ECPointFp.prototype.equals = pointFpEquals; ECPointFp.prototype.isInfinity = pointFpIsInfinity; ECPointFp.prototype.negate = pointFpNegate; ECPointFp.prototype.add = pointFpAdd; ECPointFp.prototype.twice = pointFpTwice; ECPointFp.prototype.multiply = pointFpMultiply; ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo; function ECCurveFp(q2, a, b) { this.q = q2; this.a = this.fromBigInteger(a); this.b = this.fromBigInteger(b); this.infinity = new ECPointFp(this, null, null); this.reducer = new Barrett(this.q); } function curveFpGetQ() { return this.q; } function curveFpGetA() { return this.a; } function curveFpGetB() { return this.b; } function curveFpEquals(other) { if (other == this) return true; return this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b); } function curveFpGetInfinity() { return this.infinity; } function curveFpFromBigInteger(x) { return new ECFieldElementFp(this.q, x); } function curveReduce(x) { this.reducer.reduce(x); } function curveFpEncodePointHex(p) { if (p.isInfinity()) return "00"; var xHex = p.getX().toBigInteger().toString(16); var yHex = p.getY().toBigInteger().toString(16); var oLen = this.getQ().toString(16).length; if (oLen % 2 != 0) oLen++; while (xHex.length < oLen) { xHex = "0" + xHex; } while (yHex.length < oLen) { yHex = "0" + yHex; } return "04" + xHex + yHex; } ECCurveFp.prototype.getQ = curveFpGetQ; ECCurveFp.prototype.getA = curveFpGetA; ECCurveFp.prototype.getB = curveFpGetB; ECCurveFp.prototype.equals = curveFpEquals; ECCurveFp.prototype.getInfinity = curveFpGetInfinity; ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger; ECCurveFp.prototype.reduce = curveReduce; ECCurveFp.prototype.encodePointHex = curveFpEncodePointHex; ECCurveFp.prototype.decodePointHex = function(s) { var yIsEven; switch (parseInt(s.substr(0, 2), 16)) { case 0: return this.infinity; case 2: yIsEven = false; case 3: if (yIsEven == void 0) yIsEven = true; var len = s.length - 2; var xHex = s.substr(2, len); var x = this.fromBigInteger(new BigInteger(xHex, 16)); var alpha = x.multiply(x.square().add(this.getA())).add(this.getB()); var beta = alpha.sqrt(); if (beta == null) throw "Invalid point compression"; var betaValue = beta.toBigInteger(); if (betaValue.testBit(0) != yIsEven) { beta = this.fromBigInteger(this.getQ().subtract(betaValue)); } return new ECPointFp(this, x, beta); case 4: case 6: case 7: var len = (s.length - 2) / 2; var xHex = s.substr(2, len); var yHex = s.substr(len + 2, len); return new ECPointFp(this, this.fromBigInteger(new BigInteger(xHex, 16)), this.fromBigInteger(new BigInteger(yHex, 16))); default: return null; } }; ECCurveFp.prototype.encodeCompressedPointHex = function(p) { if (p.isInfinity()) return "00"; var xHex = p.getX().toBigInteger().toString(16); var oLen = this.getQ().toString(16).length; if (oLen % 2 != 0) oLen++; while (xHex.length < oLen) xHex = "0" + xHex; var yPrefix; if (p.getY().toBigInteger().isEven()) yPrefix = "02"; else yPrefix = "03"; return yPrefix + xHex; }; ECFieldElementFp.prototype.getR = function() { if (this.r != void 0) return this.r; this.r = null; var bitLength = this.q.bitLength(); if (bitLength > 128) { var firstWord = this.q.shiftRight(bitLength - 64); if (firstWord.intValue() == -1) { this.r = BigInteger.ONE.shiftLeft(bitLength).subtract(this.q); } } return this.r; }; ECFieldElementFp.prototype.modMult = function(x1, x2) { return this.modReduce(x1.multiply(x2)); }; ECFieldElementFp.prototype.modReduce = function(x) { if (this.getR() != null) { var qLen = q.bitLength(); while (x.bitLength() > qLen + 1) { var u = x.shiftRight(qLen); var v = x.subtract(u.shiftLeft(qLen)); if (!this.getR().equals(BigInteger.ONE)) { u = u.multiply(this.getR()); } x = u.add(v); } while (x.compareTo(q) >= 0) { x = x.subtract(q); } } else { x = x.mod(q); } return x; }; ECFieldElementFp.prototype.sqrt = function() { if (!this.q.testBit(0)) throw "unsupported"; if (this.q.testBit(1)) { var z = new ECFieldElementFp(this.q, this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE), this.q)); return z.square().equals(this) ? z : null; } var qMinusOne = this.q.subtract(BigInteger.ONE); var legendreExponent = qMinusOne.shiftRight(1); if (!this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE)) { return null; } var u = qMinusOne.shiftRight(2); var k = u.shiftLeft(1).add(BigInteger.ONE); var Q = this.x; var fourQ = modDouble(modDouble(Q)); var U, V; do { var P; do { P = new BigInteger(this.q.bitLength(), new SecureRandom()); } while (P.compareTo(this.q) >= 0 || !P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne)); var result = this.lucasSequence(P, Q, k); U = result[0]; V = result[1]; if (this.modMult(V, V).equals(fourQ)) { if (V.testBit(0)) { V = V.add(q); } V = V.shiftRight(1); return new ECFieldElementFp(q, V); } } while (U.equals(BigInteger.ONE) || U.equals(qMinusOne)); return null; }; ECFieldElementFp.prototype.lucasSequence = function(P, Q, k) { var n = k.bitLength(); var s = k.getLowestSetBit(); var Uh = BigInteger.ONE; var Vl = BigInteger.TWO; var Vh = P; var Ql = BigInteger.ONE; var Qh = BigInteger.ONE; for (var j = n - 1; j >= s + 1; --j) { Ql = this.modMult(Ql, Qh); if (k.testBit(j)) { Qh = this.modMult(Ql, Q); Uh = this.modMult(Uh, Vh); Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql))); Vh = this.modReduce(Vh.multiply(Vh).subtract(Qh.shiftLeft(1))); } else { Qh = Ql; Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql)); Vh = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql))); Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1))); } } Ql = this.modMult(Ql, Qh); Qh = this.modMult(Ql, Q); Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql)); Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql))); Ql = this.modMult(Ql, Qh); for (var j = 1; j <= s; ++j) { Uh = this.modMult(Uh, Vl); Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1))); Ql = this.modMult(Ql, Ql); } return [Uh, Vl]; }; var exports = { ECCurveFp, ECPointFp, ECFieldElementFp }; module2.exports = exports; } }); // node_modules/tweetnacl/nacl-fast.js var require_nacl_fast = __commonJS({ "node_modules/tweetnacl/nacl-fast.js"(exports, module2) { (function(nacl) { "use strict"; var gf = function(init) { var i, r = new Float64Array(16); if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; return r; }; var randombytes = function() { throw new Error("no PRNG"); }; var _0 = new Uint8Array(16); var _9 = new Uint8Array(32); _9[0] = 9; var gf0 = gf(), gf1 = gf([1]), _121665 = gf([56129, 1]), D = gf([30883, 4953, 19914, 30187, 55467, 16705, 2637, 112, 59544, 30585, 16505, 36039, 65139, 11119, 27886, 20995]), D2 = gf([61785, 9906, 39828, 60374, 45398, 33411, 5274, 224, 53552, 61171, 33010, 6542, 64743, 22239, 55772, 9222]), X = gf([54554, 36645, 11616, 51542, 42930, 38181, 51040, 26924, 56412, 64982, 57905, 49316, 21502, 52590, 14035, 8553]), Y = gf([26200, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214]), I = gf([41136, 18958, 6951, 50414, 58488, 44335, 6150, 12099, 55207, 15867, 153, 11085, 57099, 20417, 9344, 11139]); function ts64(x, i, h, l) { x[i] = h >> 24 & 255; x[i + 1] = h >> 16 & 255; x[i + 2] = h >> 8 & 255; x[i + 3] = h & 255; x[i + 4] = l >> 24 & 255; x[i + 5] = l >> 16 & 255; x[i + 6] = l >> 8 & 255; x[i + 7] = l & 255; } function vn(x, xi, y, yi, n) { var i, d = 0; for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]; return (1 & d - 1 >>> 8) - 1; } function crypto_verify_16(x, xi, y, yi) { return vn(x, xi, y, yi, 16); } function crypto_verify_32(x, xi, y, yi) { return vn(x, xi, y, yi, 32); } function core_salsa20(o, p, k, c) { var j0 = c[0] & 255 | (c[1] & 255) << 8 | (c[2] & 255) << 16 | (c[3] & 255) << 24, j1 = k[0] & 255 | (k[1] & 255) << 8 | (k[2] & 255) << 16 | (k[3] & 255) << 24, j2 = k[4] & 255 | (k[5] & 255) << 8 | (k[6] & 255) << 16 | (k[7] & 255) << 24, j3 = k[8] & 255 | (k[9] & 255) << 8 | (k[10] & 255) << 16 | (k[11] & 255) << 24, j4 = k[12] & 255 | (k[13] & 255) << 8 | (k[14] & 255) << 16 | (k[15] & 255) << 24, j5 = c[4] & 255 | (c[5] & 255) << 8 | (c[6] & 255) << 16 | (c[7] & 255) << 24, j6 = p[0] & 255 | (p[1] & 255) << 8 | (p[2] & 255) << 16 | (p[3] & 255) << 24, j7 = p[4] & 255 | (p[5] & 255) << 8 | (p[6] & 255) << 16 | (p[7] & 255) << 24, j8 = p[8] & 255 | (p[9] & 255) << 8 | (p[10] & 255) << 16 | (p[11] & 255) << 24, j9 = p[12] & 255 | (p[13] & 255) << 8 | (p[14] & 255) << 16 | (p[15] & 255) << 24, j10 = c[8] & 255 | (c[9] & 255) << 8 | (c[10] & 255) << 16 | (c[11] & 255) << 24, j11 = k[16] & 255 | (k[17] & 255) << 8 | (k[18] & 255) << 16 | (k[19] & 255) << 24, j12 = k[20] & 255 | (k[21] & 255) << 8 | (k[22] & 255) << 16 | (k[23] & 255) << 24, j13 = k[24] & 255 | (k[25] & 255) << 8 | (k[26] & 255) << 16 | (k[27] & 255) << 24, j14 = k[28] & 255 | (k[29] & 255) << 8 | (k[30] & 255) << 16 | (k[31] & 255) << 24, j15 = c[12] & 255 | (c[13] & 255) << 8 | (c[14] & 255) << 16 | (c[15] & 255) << 24; var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15, u; for (var i = 0; i < 20; i += 2) { u = x0 + x12 | 0; x4 ^= u << 7 | u >>> 32 - 7; u = x4 + x0 | 0; x8 ^= u << 9 | u >>> 32 - 9; u = x8 + x4 | 0; x12 ^= u << 13 | u >>> 32 - 13; u = x12 + x8 | 0; x0 ^= u << 18 | u >>> 32 - 18; u = x5 + x1 | 0; x9 ^= u << 7 | u >>> 32 - 7; u = x9 + x5 | 0; x13 ^= u << 9 | u >>> 32 - 9; u = x13 + x9 | 0; x1 ^= u << 13 | u >>> 32 - 13; u = x1 + x13 | 0; x5 ^= u << 18 | u >>> 32 - 18; u = x10 + x6 | 0; x14 ^= u << 7 | u >>> 32 - 7; u = x14 + x10 | 0; x2 ^= u << 9 | u >>> 32 - 9; u = x2 + x14 | 0; x6 ^= u << 13 | u >>> 32 - 13; u = x6 + x2 | 0; x10 ^= u << 18 | u >>> 32 - 18; u = x15 + x11 | 0; x3 ^= u << 7 | u >>> 32 - 7; u = x3 + x15 | 0; x7 ^= u << 9 | u >>> 32 - 9; u = x7 + x3 | 0; x11 ^= u << 13 | u >>> 32 - 13; u = x11 + x7 | 0; x15 ^= u << 18 | u >>> 32 - 18; u = x0 + x3 | 0; x1 ^= u << 7 | u >>> 32 - 7; u = x1 + x0 | 0; x2 ^= u << 9 | u >>> 32 - 9; u = x2 + x1 | 0; x3 ^= u << 13 | u >>> 32 - 13; u = x3 + x2 | 0; x0 ^= u << 18 | u >>> 32 - 18; u = x5 + x4 | 0; x6 ^= u << 7 | u >>> 32 - 7; u = x6 + x5 | 0; x7 ^= u << 9 | u >>> 32 - 9; u = x7 + x6 | 0; x4 ^= u << 13 | u >>> 32 - 13; u = x4 + x7 | 0; x5 ^= u << 18 | u >>> 32 - 18; u = x10 + x9 | 0; x11 ^= u << 7 | u >>> 32 - 7; u = x11 + x10 | 0; x8 ^= u << 9 | u >>> 32 - 9; u = x8 + x11 | 0; x9 ^= u << 13 | u >>> 32 - 13; u = x9 + x8 | 0; x10 ^= u << 18 | u >>> 32 - 18; u = x15 + x14 | 0; x12 ^= u << 7 | u >>> 32 - 7; u = x12 + x15 | 0; x13 ^= u << 9 | u >>> 32 - 9; u = x13 + x12 | 0; x14 ^= u << 13 | u >>> 32 - 13; u = x14 + x13 | 0; x15 ^= u << 18 | u >>> 32 - 18; } x0 = x0 + j0 | 0; x1 = x1 + j1 | 0; x2 = x2 + j2 | 0; x3 = x3 + j3 | 0; x4 = x4 + j4 | 0; x5 = x5 + j5 | 0; x6 = x6 + j6 | 0; x7 = x7 + j7 | 0; x8 = x8 + j8 | 0; x9 = x9 + j9 | 0; x10 = x10 + j10 | 0; x11 = x11 + j11 | 0; x12 = x12 + j12 | 0; x13 = x13 + j13 | 0; x14 = x14 + j14 | 0; x15 = x15 + j15 | 0; o[0] = x0 >>> 0 & 255; o[1] = x0 >>> 8 & 255; o[2] = x0 >>> 16 & 255; o[3] = x0 >>> 24 & 255; o[4] = x1 >>> 0 & 255; o[5] = x1 >>> 8 & 255; o[6] = x1 >>> 16 & 255; o[7] = x1 >>> 24 & 255; o[8] = x2 >>> 0 & 255; o[9] = x2 >>> 8 & 255; o[10] = x2 >>> 16 & 255; o[11] = x2 >>> 24 & 255; o[12] = x3 >>> 0 & 255; o[13] = x3 >>> 8 & 255; o[14] = x3 >>> 16 & 255; o[15] = x3 >>> 24 & 255; o[16] = x4 >>> 0 & 255; o[17] = x4 >>> 8 & 255; o[18] = x4 >>> 16 & 255; o[19] = x4 >>> 24 & 255; o[20] = x5 >>> 0 & 255; o[21] = x5 >>> 8 & 255; o[22] = x5 >>> 16 & 255; o[23] = x5 >>> 24 & 255; o[24] = x6 >>> 0 & 255; o[25] = x6 >>> 8 & 255; o[26] = x6 >>> 16 & 255; o[27] = x6 >>> 24 & 255; o[28] = x7 >>> 0 & 255; o[29] = x7 >>> 8 & 255; o[30] = x7 >>> 16 & 255; o[31] = x7 >>> 24 & 255; o[32] = x8 >>> 0 & 255; o[33] = x8 >>> 8 & 255; o[34] = x8 >>> 16 & 255; o[35] = x8 >>> 24 & 255; o[36] = x9 >>> 0 & 255; o[37] = x9 >>> 8 & 255; o[38] = x9 >>> 16 & 255; o[39] = x9 >>> 24 & 255; o[40] = x10 >>> 0 & 255; o[41] = x10 >>> 8 & 255; o[42] = x10 >>> 16 & 255; o[43] = x10 >>> 24 & 255; o[44] = x11 >>> 0 & 255; o[45] = x11 >>> 8 & 255; o[46] = x11 >>> 16 & 255; o[47] = x11 >>> 24 & 255; o[48] = x12 >>> 0 & 255; o[49] = x12 >>> 8 & 255; o[50] = x12 >>> 16 & 255; o[51] = x12 >>> 24 & 255; o[52] = x13 >>> 0 & 255; o[53] = x13 >>> 8 & 255; o[54] = x13 >>> 16 & 255; o[55] = x13 >>> 24 & 255; o[56] = x14 >>> 0 & 255; o[57] = x14 >>> 8 & 255; o[58] = x14 >>> 16 & 255; o[59] = x14 >>> 24 & 255; o[60] = x15 >>> 0 & 255; o[61] = x15 >>> 8 & 255; o[62] = x15 >>> 16 & 255; o[63] = x15 >>> 24 & 255; } function core_hsalsa20(o, p, k, c) { var j0 = c[0] & 255 | (c[1] & 255) << 8 | (c[2] & 255) << 16 | (c[3] & 255) << 24, j1 = k[0] & 255 | (k[1] & 255) << 8 | (k[2] & 255) << 16 | (k[3] & 255) << 24, j2 = k[4] & 255 | (k[5] & 255) << 8 | (k[6] & 255) << 16 | (k[7] & 255) << 24, j3 = k[8] & 255 | (k[9] & 255) << 8 | (k[10] & 255) << 16 | (k[11] & 255) << 24, j4 = k[12] & 255 | (k[13] & 255) << 8 | (k[14] & 255) << 16 | (k[15] & 255) << 24, j5 = c[4] & 255 | (c[5] & 255) << 8 | (c[6] & 255) << 16 | (c[7] & 255) << 24, j6 = p[0] & 255 | (p[1] & 255) << 8 | (p[2] & 255) << 16 | (p[3] & 255) << 24, j7 = p[4] & 255 | (p[5] & 255) << 8 | (p[6] & 255) << 16 | (p[7] & 255) << 24, j8 = p[8] & 255 | (p[9] & 255) << 8 | (p[10] & 255) << 16 | (p[11] & 255) << 24, j9 = p[12] & 255 | (p[13] & 255) << 8 | (p[14] & 255) << 16 | (p[15] & 255) << 24, j10 = c[8] & 255 | (c[9] & 255) << 8 | (c[10] & 255) << 16 | (c[11] & 255) << 24, j11 = k[16] & 255 | (k[17] & 255) << 8 | (k[18] & 255) << 16 | (k[19] & 255) << 24, j12 = k[20] & 255 | (k[21] & 255) << 8 | (k[22] & 255) << 16 | (k[23] & 255) << 24, j13 = k[24] & 255 | (k[25] & 255) << 8 | (k[26] & 255) << 16 | (k[27] & 255) << 24, j14 = k[28] & 255 | (k[29] & 255) << 8 | (k[30] & 255) << 16 | (k[31] & 255) << 24, j15 = c[12] & 255 | (c[13] & 255) << 8 | (c[14] & 255) << 16 | (c[15] & 255) << 24; var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15, u; for (var i = 0; i < 20; i += 2) { u = x0 + x12 | 0; x4 ^= u << 7 | u >>> 32 - 7; u = x4 + x0 | 0; x8 ^= u << 9 | u >>> 32 - 9; u = x8 + x4 | 0; x12 ^= u << 13 | u >>> 32 - 13; u = x12 + x8 | 0; x0 ^= u << 18 | u >>> 32 - 18; u = x5 + x1 | 0; x9 ^= u << 7 | u >>> 32 - 7; u = x9 + x5 | 0; x13 ^= u << 9 | u >>> 32 - 9; u = x13 + x9 | 0; x1 ^= u << 13 | u >>> 32 - 13; u = x1 + x13 | 0; x5 ^= u << 18 | u >>> 32 - 18; u = x10 + x6 | 0; x14 ^= u << 7 | u >>> 32 - 7; u = x14 + x10 | 0; x2 ^= u << 9 | u >>> 32 - 9; u = x2 + x14 | 0; x6 ^= u << 13 | u >>> 32 - 13; u = x6 + x2 | 0; x10 ^= u << 18 | u >>> 32 - 18; u = x15 + x11 | 0; x3 ^= u << 7 | u >>> 32 - 7; u = x3 + x15 | 0; x7 ^= u << 9 | u >>> 32 - 9; u = x7 + x3 | 0; x11 ^= u << 13 | u >>> 32 - 13; u = x11 + x7 | 0; x15 ^= u << 18 | u >>> 32 - 18; u = x0 + x3 | 0; x1 ^= u << 7 | u >>> 32 - 7; u = x1 + x0 | 0; x2 ^= u << 9 | u >>> 32 - 9; u = x2 + x1 | 0; x3 ^= u << 13 | u >>> 32 - 13; u = x3 + x2 | 0; x0 ^= u << 18 | u >>> 32 - 18; u = x5 + x4 | 0; x6 ^= u << 7 | u >>> 32 - 7; u = x6 + x5 | 0; x7 ^= u << 9 | u >>> 32 - 9; u = x7 + x6 | 0; x4 ^= u << 13 | u >>> 32 - 13; u = x4 + x7 | 0; x5 ^= u << 18 | u >>> 32 - 18; u = x10 + x9 | 0; x11 ^= u << 7 | u >>> 32 - 7; u = x11 + x10 | 0; x8 ^= u << 9 | u >>> 32 - 9; u = x8 + x11 | 0; x9 ^= u << 13 | u >>> 32 - 13; u = x9 + x8 | 0; x10 ^= u << 18 | u >>> 32 - 18; u = x15 + x14 | 0; x12 ^= u << 7 | u >>> 32 - 7; u = x12 + x15 | 0; x13 ^= u << 9 | u >>> 32 - 9; u = x13 + x12 | 0; x14 ^= u << 13 | u >>> 32 - 13; u = x14 + x13 | 0; x15 ^= u << 18 | u >>> 32 - 18; } o[0] = x0 >>> 0 & 255; o[1] = x0 >>> 8 & 255; o[2] = x0 >>> 16 & 255; o[3] = x0 >>> 24 & 255; o[4] = x5 >>> 0 & 255; o[5] = x5 >>> 8 & 255; o[6] = x5 >>> 16 & 255; o[7] = x5 >>> 24 & 255; o[8] = x10 >>> 0 & 255; o[9] = x10 >>> 8 & 255; o[10] = x10 >>> 16 & 255; o[11] = x10 >>> 24 & 255; o[12] = x15 >>> 0 & 255; o[13] = x15 >>> 8 & 255; o[14] = x15 >>> 16 & 255; o[15] = x15 >>> 24 & 255; o[16] = x6 >>> 0 & 255; o[17] = x6 >>> 8 & 255; o[18] = x6 >>> 16 & 255; o[19] = x6 >>> 24 & 255; o[20] = x7 >>> 0 & 255; o[21] = x7 >>> 8 & 255; o[22] = x7 >>> 16 & 255; o[23] = x7 >>> 24 & 255; o[24] = x8 >>> 0 & 255; o[25] = x8 >>> 8 & 255; o[26] = x8 >>> 16 & 255; o[27] = x8 >>> 24 & 255; o[28] = x9 >>> 0 & 255; o[29] = x9 >>> 8 & 255; o[30] = x9 >>> 16 & 255; o[31] = x9 >>> 24 & 255; } function crypto_core_salsa20(out, inp, k, c) { core_salsa20(out, inp, k, c); } function crypto_core_hsalsa20(out, inp, k, c) { core_hsalsa20(out, inp, k, c); } var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) { var z = new Uint8Array(16), x = new Uint8Array(64); var u, i; for (i = 0; i < 16; i++) z[i] = 0; for (i = 0; i < 8; i++) z[i] = n[i]; while (b >= 64) { crypto_core_salsa20(x, z, k, sigma); for (i = 0; i < 64; i++) c[cpos + i] = m[mpos + i] ^ x[i]; u = 1; for (i = 8; i < 16; i++) { u = u + (z[i] & 255) | 0; z[i] = u & 255; u >>>= 8; } b -= 64; cpos += 64; mpos += 64; } if (b > 0) { crypto_core_salsa20(x, z, k, sigma); for (i = 0; i < b; i++) c[cpos + i] = m[mpos + i] ^ x[i]; } return 0; } function crypto_stream_salsa20(c, cpos, b, n, k) { var z = new Uint8Array(16), x = new Uint8Array(64); var u, i; for (i = 0; i < 16; i++) z[i] = 0; for (i = 0; i < 8; i++) z[i] = n[i]; while (b >= 64) { crypto_core_salsa20(x, z, k, sigma); for (i = 0; i < 64; i++) c[cpos + i] = x[i]; u = 1; for (i = 8; i < 16; i++) { u = u + (z[i] & 255) | 0; z[i] = u & 255; u >>>= 8; } b -= 64; cpos += 64; } if (b > 0) { crypto_core_salsa20(x, z, k, sigma); for (i = 0; i < b; i++) c[cpos + i] = x[i]; } return 0; } function crypto_stream(c, cpos, d, n, k) { var s = new Uint8Array(32); crypto_core_hsalsa20(s, n, k, sigma); var sn = new Uint8Array(8); for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; return crypto_stream_salsa20(c, cpos, d, sn, s); } function crypto_stream_xor(c, cpos, m, mpos, d, n, k) { var s = new Uint8Array(32); crypto_core_hsalsa20(s, n, k, sigma); var sn = new Uint8Array(8); for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, sn, s); } var poly1305 = function(key) { this.buffer = new Uint8Array(16); this.r = new Uint16Array(10); this.h = new Uint16Array(10); this.pad = new Uint16Array(8); this.leftover = 0; this.fin = 0; var t0, t1, t2, t3, t4, t5, t6, t7; t0 = key[0] & 255 | (key[1] & 255) << 8; this.r[0] = t0 & 8191; t1 = key[2] & 255 | (key[3] & 255) << 8; this.r[1] = (t0 >>> 13 | t1 << 3) & 8191; t2 = key[4] & 255 | (key[5] & 255) << 8; this.r[2] = (t1 >>> 10 | t2 << 6) & 7939; t3 = key[6] & 255 | (key[7] & 255) << 8; this.r[3] = (t2 >>> 7 | t3 << 9) & 8191; t4 = key[8] & 255 | (key[9] & 255) << 8; this.r[4] = (t3 >>> 4 | t4 << 12) & 255; this.r[5] = t4 >>> 1 & 8190; t5 = key[10] & 255 | (key[11] & 255) << 8; this.r[6] = (t4 >>> 14 | t5 << 2) & 8191; t6 = key[12] & 255 | (key[13] & 255) << 8; this.r[7] = (t5 >>> 11 | t6 << 5) & 8065; t7 = key[14] & 255 | (key[15] & 255) << 8; this.r[8] = (t6 >>> 8 | t7 << 8) & 8191; this.r[9] = t7 >>> 5 & 127; this.pad[0] = key[16] & 255 | (key[17] & 255) << 8; this.pad[1] = key[18] & 255 | (key[19] & 255) << 8; this.pad[2] = key[20] & 255 | (key[21] & 255) << 8; this.pad[3] = key[22] & 255 | (key[23] & 255) << 8; this.pad[4] = key[24] & 255 | (key[25] & 255) << 8; this.pad[5] = key[26] & 255 | (key[27] & 255) << 8; this.pad[6] = key[28] & 255 | (key[29] & 255) << 8; this.pad[7] = key[30] & 255 | (key[31] & 255) << 8; }; poly1305.prototype.blocks = function(m, mpos, bytes) { var hibit = this.fin ? 0 : 1 << 11; var t0, t1, t2, t3, t4, t5, t6, t7, c; var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; var h0 = this.h[0], h1 = this.h[1], h2 = this.h[2], h3 = this.h[3], h4 = this.h[4], h5 = this.h[5], h6 = this.h[6], h7 = this.h[7], h8 = this.h[8], h9 = this.h[9]; var r0 = this.r[0], r1 = this.r[1], r2 = this.r[2], r3 = this.r[3], r4 = this.r[4], r5 = this.r[5], r6 = this.r[6], r7 = this.r[7], r8 = this.r[8], r9 = this.r[9]; while (bytes >= 16) { t0 = m[mpos + 0] & 255 | (m[mpos + 1] & 255) << 8; h0 += t0 & 8191; t1 = m[mpos + 2] & 255 | (m[mpos + 3] & 255) << 8; h1 += (t0 >>> 13 | t1 << 3) & 8191; t2 = m[mpos + 4] & 255 | (m[mpos + 5] & 255) << 8; h2 += (t1 >>> 10 | t2 << 6) & 8191; t3 = m[mpos + 6] & 255 | (m[mpos + 7] & 255) << 8; h3 += (t2 >>> 7 | t3 << 9) & 8191; t4 = m[mpos + 8] & 255 | (m[mpos + 9] & 255) << 8; h4 += (t3 >>> 4 | t4 << 12) & 8191; h5 += t4 >>> 1 & 8191; t5 = m[mpos + 10] & 255 | (m[mpos + 11] & 255) << 8; h6 += (t4 >>> 14 | t5 << 2) & 8191; t6 = m[mpos + 12] & 255 | (m[mpos + 13] & 255) << 8; h7 += (t5 >>> 11 | t6 << 5) & 8191; t7 = m[mpos + 14] & 255 | (m[mpos + 15] & 255) << 8; h8 += (t6 >>> 8 | t7 << 8) & 8191; h9 += t7 >>> 5 | hibit; c = 0; d0 = c; d0 += h0 * r0; d0 += h1 * (5 * r9); d0 += h2 * (5 * r8); d0 += h3 * (5 * r7); d0 += h4 * (5 * r6); c = d0 >>> 13; d0 &= 8191; d0 += h5 * (5 * r5); d0 += h6 * (5 * r4); d0 += h7 * (5 * r3); d0 += h8 * (5 * r2); d0 += h9 * (5 * r1); c += d0 >>> 13; d0 &= 8191; d1 = c; d1 += h0 * r1; d1 += h1 * r0; d1 += h2 * (5 * r9); d1 += h3 * (5 * r8); d1 += h4 * (5 * r7); c = d1 >>> 13; d1 &= 8191; d1 += h5 * (5 * r6); d1 += h6 * (5 * r5); d1 += h7 * (5 * r4); d1 += h8 * (5 * r3); d1 += h9 * (5 * r2); c += d1 >>> 13; d1 &= 8191; d2 = c; d2 += h0 * r2; d2 += h1 * r1; d2 += h2 * r0; d2 += h3 * (5 * r9); d2 += h4 * (5 * r8); c = d2 >>> 13; d2 &= 8191; d2 += h5 * (5 * r7); d2 += h6 * (5 * r6); d2 += h7 * (5 * r5); d2 += h8 * (5 * r4); d2 += h9 * (5 * r3); c += d2 >>> 13; d2 &= 8191; d3 = c; d3 += h0 * r3; d3 += h1 * r2; d3 += h2 * r1; d3 += h3 * r0; d3 += h4 * (5 * r9); c = d3 >>> 13; d3 &= 8191; d3 += h5 * (5 * r8); d3 += h6 * (5 * r7); d3 += h7 * (5 * r6); d3 += h8 * (5 * r5); d3 += h9 * (5 * r4); c += d3 >>> 13; d3 &= 8191; d4 = c; d4 += h0 * r4; d4 += h1 * r3; d4 += h2 * r2; d4 += h3 * r1; d4 += h4 * r0; c = d4 >>> 13; d4 &= 8191; d4 += h5 * (5 * r9); d4 += h6 * (5 * r8); d4 += h7 * (5 * r7); d4 += h8 * (5 * r6); d4 += h9 * (5 * r5); c += d4 >>> 13; d4 &= 8191; d5 = c; d5 += h0 * r5; d5 += h1 * r4; d5 += h2 * r3; d5 += h3 * r2; d5 += h4 * r1; c = d5 >>> 13; d5 &= 8191; d5 += h5 * r0; d5 += h6 * (5 * r9); d5 += h7 * (5 * r8); d5 += h8 * (5 * r7); d5 += h9 * (5 * r6); c += d5 >>> 13; d5 &= 8191; d6 = c; d6 += h0 * r6; d6 += h1 * r5; d6 += h2 * r4; d6 += h3 * r3; d6 += h4 * r2; c = d6 >>> 13; d6 &= 8191; d6 += h5 * r1; d6 += h6 * r0; d6 += h7 * (5 * r9); d6 += h8 * (5 * r8); d6 += h9 * (5 * r7); c += d6 >>> 13; d6 &= 8191; d7 = c; d7 += h0 * r7; d7 += h1 * r6; d7 += h2 * r5; d7 += h3 * r4; d7 += h4 * r3; c = d7 >>> 13; d7 &= 8191; d7 += h5 * r2; d7 += h6 * r1; d7 += h7 * r0; d7 += h8 * (5 * r9); d7 += h9 * (5 * r8); c += d7 >>> 13; d7 &= 8191; d8 = c; d8 += h0 * r8; d8 += h1 * r7; d8 += h2 * r6; d8 += h3 * r5; d8 += h4 * r4; c = d8 >>> 13; d8 &= 8191; d8 += h5 * r3; d8 += h6 * r2; d8 += h7 * r1; d8 += h8 * r0; d8 += h9 * (5 * r9); c += d8 >>> 13; d8 &= 8191; d9 = c; d9 += h0 * r9; d9 += h1 * r8; d9 += h2 * r7; d9 += h3 * r6; d9 += h4 * r5; c = d9 >>> 13; d9 &= 8191; d9 += h5 * r4; d9 += h6 * r3; d9 += h7 * r2; d9 += h8 * r1; d9 += h9 * r0; c += d9 >>> 13; d9 &= 8191; c = (c << 2) + c | 0; c = c + d0 | 0; d0 = c & 8191; c = c >>> 13; d1 += c; h0 = d0; h1 = d1; h2 = d2; h3 = d3; h4 = d4; h5 = d5; h6 = d6; h7 = d7; h8 = d8; h9 = d9; mpos += 16; bytes -= 16; } this.h[0] = h0; this.h[1] = h1; this.h[2] = h2; this.h[3] = h3; this.h[4] = h4; this.h[5] = h5; this.h[6] = h6; this.h[7] = h7; this.h[8] = h8; this.h[9] = h9; }; poly1305.prototype.finish = function(mac, macpos) { var g = new Uint16Array(10); var c, mask, f, i; if (this.leftover) { i = this.leftover; this.buffer[i++] = 1; for (; i < 16; i++) this.buffer[i] = 0; this.fin = 1; this.blocks(this.buffer, 0, 16); } c = this.h[1] >>> 13; this.h[1] &= 8191; for (i = 2; i < 10; i++) { this.h[i] += c; c = this.h[i] >>> 13; this.h[i] &= 8191; } this.h[0] += c * 5; c = this.h[0] >>> 13; this.h[0] &= 8191; this.h[1] += c; c = this.h[1] >>> 13; this.h[1] &= 8191; this.h[2] += c; g[0] = this.h[0] + 5; c = g[0] >>> 13; g[0] &= 8191; for (i = 1; i < 10; i++) { g[i] = this.h[i] + c; c = g[i] >>> 13; g[i] &= 8191; } g[9] -= 1 << 13; mask = (c ^ 1) - 1; for (i = 0; i < 10; i++) g[i] &= mask; mask = ~mask; for (i = 0; i < 10; i++) this.h[i] = this.h[i] & mask | g[i]; this.h[0] = (this.h[0] | this.h[1] << 13) & 65535; this.h[1] = (this.h[1] >>> 3 | this.h[2] << 10) & 65535; this.h[2] = (this.h[2] >>> 6 | this.h[3] << 7) & 65535; this.h[3] = (this.h[3] >>> 9 | this.h[4] << 4) & 65535; this.h[4] = (this.h[4] >>> 12 | this.h[5] << 1 | this.h[6] << 14) & 65535; this.h[5] = (this.h[6] >>> 2 | this.h[7] << 11) & 65535; this.h[6] = (this.h[7] >>> 5 | this.h[8] << 8) & 65535; this.h[7] = (this.h[8] >>> 8 | this.h[9] << 5) & 65535; f = this.h[0] + this.pad[0]; this.h[0] = f & 65535; for (i = 1; i < 8; i++) { f = (this.h[i] + this.pad[i] | 0) + (f >>> 16) | 0; this.h[i] = f & 65535; } mac[macpos + 0] = this.h[0] >>> 0 & 255; mac[macpos + 1] = this.h[0] >>> 8 & 255; mac[macpos + 2] = this.h[1] >>> 0 & 255; mac[macpos + 3] = this.h[1] >>> 8 & 255; mac[macpos + 4] = this.h[2] >>> 0 & 255; mac[macpos + 5] = this.h[2] >>> 8 & 255; mac[macpos + 6] = this.h[3] >>> 0 & 255; mac[macpos + 7] = this.h[3] >>> 8 & 255; mac[macpos + 8] = this.h[4] >>> 0 & 255; mac[macpos + 9] = this.h[4] >>> 8 & 255; mac[macpos + 10] = this.h[5] >>> 0 & 255; mac[macpos + 11] = this.h[5] >>> 8 & 255; mac[macpos + 12] = this.h[6] >>> 0 & 255; mac[macpos + 13] = this.h[6] >>> 8 & 255; mac[macpos + 14] = this.h[7] >>> 0 & 255; mac[macpos + 15] = this.h[7] >>> 8 & 255; }; poly1305.prototype.update = function(m, mpos, bytes) { var i, want; if (this.leftover) { want = 16 - this.leftover; if (want > bytes) want = bytes; for (i = 0; i < want; i++) this.buffer[this.leftover + i] = m[mpos + i]; bytes -= want; mpos += want; this.leftover += want; if (this.leftover < 16) return; this.blocks(this.buffer, 0, 16); this.leftover = 0; } if (bytes >= 16) { want = bytes - bytes % 16; this.blocks(m, mpos, want); mpos += want; bytes -= want; } if (bytes) { for (i = 0; i < bytes; i++) this.buffer[this.leftover + i] = m[mpos + i]; this.leftover += bytes; } }; function crypto_onetimeauth(out, outpos, m, mpos, n, k) { var s = new poly1305(k); s.update(m, mpos, n); s.finish(out, outpos); return 0; } function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { var x = new Uint8Array(16); crypto_onetimeauth(x, 0, m, mpos, n, k); return crypto_verify_16(h, hpos, x, 0); } function crypto_secretbox(c, m, d, n, k) { var i; if (d < 32) return -1; crypto_stream_xor(c, 0, m, 0, d, n, k); crypto_onetimeauth(c, 16, c, 32, d - 32, c); for (i = 0; i < 16; i++) c[i] = 0; return 0; } function crypto_secretbox_open(m, c, d, n, k) { var i; var x = new Uint8Array(32); if (d < 32) return -1; crypto_stream(x, 0, 32, n, k); if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1; crypto_stream_xor(m, 0, c, 0, d, n, k); for (i = 0; i < 32; i++) m[i] = 0; return 0; } function set25519(r, a) { var i; for (i = 0; i < 16; i++) r[i] = a[i] | 0; } function car25519(o) { var i, v, c = 1; for (i = 0; i < 16; i++) { v = o[i] + c + 65535; c = Math.floor(v / 65536); o[i] = v - c * 65536; } o[0] += c - 1 + 37 * (c - 1); } function sel25519(p, q2, b) { var t, c = ~(b - 1); for (var i = 0; i < 16; i++) { t = c & (p[i] ^ q2[i]); p[i] ^= t; q2[i] ^= t; } } function pack25519(o, n) { var i, j, b; var m = gf(), t = gf(); for (i = 0; i < 16; i++) t[i] = n[i]; car25519(t); car25519(t); car25519(t); for (j = 0; j < 2; j++) { m[0] = t[0] - 65517; for (i = 1; i < 15; i++) { m[i] = t[i] - 65535 - (m[i - 1] >> 16 & 1); m[i - 1] &= 65535; } m[15] = t[15] - 32767 - (m[14] >> 16 & 1); b = m[15] >> 16 & 1; m[14] &= 65535; sel25519(t, m, 1 - b); } for (i = 0; i < 16; i++) { o[2 * i] = t[i] & 255; o[2 * i + 1] = t[i] >> 8; } } function neq25519(a, b) { var c = new Uint8Array(32), d = new Uint8Array(32); pack25519(c, a); pack25519(d, b); return crypto_verify_32(c, 0, d, 0); } function par25519(a) { var d = new Uint8Array(32); pack25519(d, a); return d[0] & 1; } function unpack25519(o, n) { var i; for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8); o[15] &= 32767; } function A(o, a, b) { for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; } function Z(o, a, b) { for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; } function M(o, a, b) { var v, c, t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11], b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; v = a[0]; t0 += v * b0; t1 += v * b1; t2 += v * b2; t3 += v * b3; t4 += v * b4; t5 += v * b5; t6 += v * b6; t7 += v * b7; t8 += v * b8; t9 += v * b9; t10 += v * b10; t11 += v * b11; t12 += v * b12; t13 += v * b13; t14 += v * b14; t15 += v * b15; v = a[1]; t1 += v * b0; t2 += v * b1; t3 += v * b2; t4 += v * b3; t5 += v * b4; t6 += v * b5; t7 += v * b6; t8 += v * b7; t9 += v * b8; t10 += v * b9; t11 += v * b10; t12 += v * b11; t13 += v * b12; t14 += v * b13; t15 += v * b14; t16 += v * b15; v = a[2]; t2 += v * b0; t3 += v * b1; t4 += v * b2; t5 += v * b3; t6 += v * b4; t7 += v * b5; t8 += v * b6; t9 += v * b7; t10 += v * b8; t11 += v * b9; t12 += v * b10; t13 += v * b11; t14 += v * b12; t15 += v * b13; t16 += v * b14; t17 += v * b15; v = a[3]; t3 += v * b0; t4 += v * b1; t5 += v * b2; t6 += v * b3; t7 += v * b4; t8 += v * b5; t9 += v * b6; t10 += v * b7; t11 += v * b8; t12 += v * b9; t13 += v * b10; t14 += v * b11; t15 += v * b12; t16 += v * b13; t17 += v * b14; t18 += v * b15; v = a[4]; t4 += v * b0; t5 += v * b1; t6 += v * b2; t7 += v * b3; t8 += v * b4; t9 += v * b5; t10 += v * b6; t11 += v * b7; t12 += v * b8; t13 += v * b9; t14 += v * b10; t15 += v * b11; t16 += v * b12; t17 += v * b13; t18 += v * b14; t19 += v * b15; v = a[5]; t5 += v * b0; t6 += v * b1; t7 += v * b2; t8 += v * b3; t9 += v * b4; t10 += v * b5; t11 += v * b6; t12 += v * b7; t13 += v * b8; t14 += v * b9; t15 += v * b10; t16 += v * b11; t17 += v * b12; t18 += v * b13; t19 += v * b14; t20 += v * b15; v = a[6]; t6 += v * b0; t7 += v * b1; t8 += v * b2; t9 += v * b3; t10 += v * b4; t11 += v * b5; t12 += v * b6; t13 += v * b7; t14 += v * b8; t15 += v * b9; t16 += v * b10; t17 += v * b11; t18 += v * b12; t19 += v * b13; t20 += v * b14; t21 += v * b15; v = a[7]; t7 += v * b0; t8 += v * b1; t9 += v * b2; t10 += v * b3; t11 += v * b4; t12 += v * b5; t13 += v * b6; t14 += v * b7; t15 += v * b8; t16 += v * b9; t17 += v * b10; t18 += v * b11; t19 += v * b12; t20 += v * b13; t21 += v * b14; t22 += v * b15; v = a[8]; t8 += v * b0; t9 += v * b1; t10 += v * b2; t11 += v * b3; t12 += v * b4; t13 += v * b5; t14 += v * b6; t15 += v * b7; t16 += v * b8; t17 += v * b9; t18 += v * b10; t19 += v * b11; t20 += v * b12; t21 += v * b13; t22 += v * b14; t23 += v * b15; v = a[9]; t9 += v * b0; t10 += v * b1; t11 += v * b2; t12 += v * b3; t13 += v * b4; t14 += v * b5; t15 += v * b6; t16 += v * b7; t17 += v * b8; t18 += v * b9; t19 += v * b10; t20 += v * b11; t21 += v * b12; t22 += v * b13; t23 += v * b14; t24 += v * b15; v = a[10]; t10 += v * b0; t11 += v * b1; t12 += v * b2; t13 += v * b3; t14 += v * b4; t15 += v * b5; t16 += v * b6; t17 += v * b7; t18 += v * b8; t19 += v * b9; t20 += v * b10; t21 += v * b11; t22 += v * b12; t23 += v * b13; t24 += v * b14; t25 += v * b15; v = a[11]; t11 += v * b0; t12 += v * b1; t13 += v * b2; t14 += v * b3; t15 += v * b4; t16 += v * b5; t17 += v * b6; t18 += v * b7; t19 += v * b8; t20 += v * b9; t21 += v * b10; t22 += v * b11; t23 += v * b12; t24 += v * b13; t25 += v * b14; t26 += v * b15; v = a[12]; t12 += v * b0; t13 += v * b1; t14 += v * b2; t15 += v * b3; t16 += v * b4; t17 += v * b5; t18 += v * b6; t19 += v * b7; t20 += v * b8; t21 += v * b9; t22 += v * b10; t23 += v * b11; t24 += v * b12; t25 += v * b13; t26 += v * b14; t27 += v * b15; v = a[13]; t13 += v * b0; t14 += v * b1; t15 += v * b2; t16 += v * b3; t17 += v * b4; t18 += v * b5; t19 += v * b6; t20 += v * b7; t21 += v * b8; t22 += v * b9; t23 += v * b10; t24 += v * b11; t25 += v * b12; t26 += v * b13; t27 += v * b14; t28 += v * b15; v = a[14]; t14 += v * b0; t15 += v * b1; t16 += v * b2; t17 += v * b3; t18 += v * b4; t19 += v * b5; t20 += v * b6; t21 += v * b7; t22 += v * b8; t23 += v * b9; t24 += v * b10; t25 += v * b11; t26 += v * b12; t27 += v * b13; t28 += v * b14; t29 += v * b15; v = a[15]; t15 += v * b0; t16 += v * b1; t17 += v * b2; t18 += v * b3; t19 += v * b4; t20 += v * b5; t21 += v * b6; t22 += v * b7; t23 += v * b8; t24 += v * b9; t25 += v * b10; t26 += v * b11; t27 += v * b12; t28 += v * b13; t29 += v * b14; t30 += v * b15; t0 += 38 * t16; t1 += 38 * t17; t2 += 38 * t18; t3 += 38 * t19; t4 += 38 * t20; t5 += 38 * t21; t6 += 38 * t22; t7 += 38 * t23; t8 += 38 * t24; t9 += 38 * t25; t10 += 38 * t26; t11 += 38 * t27; t12 += 38 * t28; t13 += 38 * t29; t14 += 38 * t30; c = 1; v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; t0 += c - 1 + 37 * (c - 1); c = 1; v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; t0 += c - 1 + 37 * (c - 1); o[0] = t0; o[1] = t1; o[2] = t2; o[3] = t3; o[4] = t4; o[5] = t5; o[6] = t6; o[7] = t7; o[8] = t8; o[9] = t9; o[10] = t10; o[11] = t11; o[12] = t12; o[13] = t13; o[14] = t14; o[15] = t15; } function S(o, a) { M(o, a, a); } function inv25519(o, i) { var c = gf(); var a; for (a = 0; a < 16; a++) c[a] = i[a]; for (a = 253; a >= 0; a--) { S(c, c); if (a !== 2 && a !== 4) M(c, c, i); } for (a = 0; a < 16; a++) o[a] = c[a]; } function pow2523(o, i) { var c = gf(); var a; for (a = 0; a < 16; a++) c[a] = i[a]; for (a = 250; a >= 0; a--) { S(c, c); if (a !== 1) M(c, c, i); } for (a = 0; a < 16; a++) o[a] = c[a]; } function crypto_scalarmult(q2, n, p) { var z = new Uint8Array(32); var x = new Float64Array(80), r, i; var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(); for (i = 0; i < 31; i++) z[i] = n[i]; z[31] = n[31] & 127 | 64; z[0] &= 248; unpack25519(x, p); for (i = 0; i < 16; i++) { b[i] = x[i]; d[i] = a[i] = c[i] = 0; } a[0] = d[0] = 1; for (i = 254; i >= 0; --i) { r = z[i >>> 3] >>> (i & 7) & 1; sel25519(a, b, r); sel25519(c, d, r); A(e, a, c); Z(a, a, c); A(c, b, d); Z(b, b, d); S(d, e); S(f, a); M(a, c, a); M(c, b, e); A(e, a, c); Z(a, a, c); S(b, a); Z(c, d, f); M(a, c, _121665); A(a, a, d); M(c, c, a); M(a, d, f); M(d, b, x); S(b, e); sel25519(a, b, r); sel25519(c, d, r); } for (i = 0; i < 16; i++) { x[i + 16] = a[i]; x[i + 32] = c[i]; x[i + 48] = b[i]; x[i + 64] = d[i]; } var x32 = x.subarray(32); var x16 = x.subarray(16); inv25519(x32, x32); M(x16, x16, x32); pack25519(q2, x16); return 0; } function crypto_scalarmult_base(q2, n) { return crypto_scalarmult(q2, n, _9); } function crypto_box_keypair(y, x) { randombytes(x, 32); return crypto_scalarmult_base(y, x); } function crypto_box_beforenm(k, y, x) { var s = new Uint8Array(32); crypto_scalarmult(s, x, y); return crypto_core_hsalsa20(k, _0, s, sigma); } var crypto_box_afternm = crypto_secretbox; var crypto_box_open_afternm = crypto_secretbox_open; function crypto_box(c, m, d, n, y, x) { var k = new Uint8Array(32); crypto_box_beforenm(k, y, x); return crypto_box_afternm(c, m, d, n, k); } function crypto_box_open(m, c, d, n, y, x) { var k = new Uint8Array(32); crypto_box_beforenm(k, y, x); return crypto_box_open_afternm(m, c, d, n, k); } var K = [ 1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591 ]; function crypto_hashblocks_hl(hh, hl, m, n) { var wh = new Int32Array(16), wl = new Int32Array(16), bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, th, tl, i, j, h, l, a, b, c, d; var ah0 = hh[0], ah1 = hh[1], ah2 = hh[2], ah3 = hh[3], ah4 = hh[4], ah5 = hh[5], ah6 = hh[6], ah7 = hh[7], al0 = hl[0], al1 = hl[1], al2 = hl[2], al3 = hl[3], al4 = hl[4], al5 = hl[5], al6 = hl[6], al7 = hl[7]; var pos = 0; while (n >= 128) { for (i = 0; i < 16; i++) { j = 8 * i + pos; wh[i] = m[j + 0] << 24 | m[j + 1] << 16 | m[j + 2] << 8 | m[j + 3]; wl[i] = m[j + 4] << 24 | m[j + 5] << 16 | m[j + 6] << 8 | m[j + 7]; } for (i = 0; i < 80; i++) { bh0 = ah0; bh1 = ah1; bh2 = ah2; bh3 = ah3; bh4 = ah4; bh5 = ah5; bh6 = ah6; bh7 = ah7; bl0 = al0; bl1 = al1; bl2 = al2; bl3 = al3; bl4 = al4; bl5 = al5; bl6 = al6; bl7 = al7; h = ah7; l = al7; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = (ah4 >>> 14 | al4 << 32 - 14) ^ (ah4 >>> 18 | al4 << 32 - 18) ^ (al4 >>> 41 - 32 | ah4 << 32 - (41 - 32)); l = (al4 >>> 14 | ah4 << 32 - 14) ^ (al4 >>> 18 | ah4 << 32 - 18) ^ (ah4 >>> 41 - 32 | al4 << 32 - (41 - 32)); a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; h = ah4 & ah5 ^ ~ah4 & ah6; l = al4 & al5 ^ ~al4 & al6; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; h = K[i * 2]; l = K[i * 2 + 1]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; h = wh[i % 16]; l = wl[i % 16]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; th = c & 65535 | d << 16; tl = a & 65535 | b << 16; h = th; l = tl; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = (ah0 >>> 28 | al0 << 32 - 28) ^ (al0 >>> 34 - 32 | ah0 << 32 - (34 - 32)) ^ (al0 >>> 39 - 32 | ah0 << 32 - (39 - 32)); l = (al0 >>> 28 | ah0 << 32 - 28) ^ (ah0 >>> 34 - 32 | al0 << 32 - (34 - 32)) ^ (ah0 >>> 39 - 32 | al0 << 32 - (39 - 32)); a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; h = ah0 & ah1 ^ ah0 & ah2 ^ ah1 & ah2; l = al0 & al1 ^ al0 & al2 ^ al1 & al2; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; bh7 = c & 65535 | d << 16; bl7 = a & 65535 | b << 16; h = bh3; l = bl3; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = th; l = tl; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; bh3 = c & 65535 | d << 16; bl3 = a & 65535 | b << 16; ah1 = bh0; ah2 = bh1; ah3 = bh2; ah4 = bh3; ah5 = bh4; ah6 = bh5; ah7 = bh6; ah0 = bh7; al1 = bl0; al2 = bl1; al3 = bl2; al4 = bl3; al5 = bl4; al6 = bl5; al7 = bl6; al0 = bl7; if (i % 16 === 15) { for (j = 0; j < 16; j++) { h = wh[j]; l = wl[j]; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = wh[(j + 9) % 16]; l = wl[(j + 9) % 16]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; th = wh[(j + 1) % 16]; tl = wl[(j + 1) % 16]; h = (th >>> 1 | tl << 32 - 1) ^ (th >>> 8 | tl << 32 - 8) ^ th >>> 7; l = (tl >>> 1 | th << 32 - 1) ^ (tl >>> 8 | th << 32 - 8) ^ (tl >>> 7 | th << 32 - 7); a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; th = wh[(j + 14) % 16]; tl = wl[(j + 14) % 16]; h = (th >>> 19 | tl << 32 - 19) ^ (tl >>> 61 - 32 | th << 32 - (61 - 32)) ^ th >>> 6; l = (tl >>> 19 | th << 32 - 19) ^ (th >>> 61 - 32 | tl << 32 - (61 - 32)) ^ (tl >>> 6 | th << 32 - 6); a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; wh[j] = c & 65535 | d << 16; wl[j] = a & 65535 | b << 16; } } } h = ah0; l = al0; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = hh[0]; l = hl[0]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[0] = ah0 = c & 65535 | d << 16; hl[0] = al0 = a & 65535 | b << 16; h = ah1; l = al1; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = hh[1]; l = hl[1]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[1] = ah1 = c & 65535 | d << 16; hl[1] = al1 = a & 65535 | b << 16; h = ah2; l = al2; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = hh[2]; l = hl[2]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[2] = ah2 = c & 65535 | d << 16; hl[2] = al2 = a & 65535 | b << 16; h = ah3; l = al3; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = hh[3]; l = hl[3]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[3] = ah3 = c & 65535 | d << 16; hl[3] = al3 = a & 65535 | b << 16; h = ah4; l = al4; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = hh[4]; l = hl[4]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[4] = ah4 = c & 65535 | d << 16; hl[4] = al4 = a & 65535 | b << 16; h = ah5; l = al5; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = hh[5]; l = hl[5]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[5] = ah5 = c & 65535 | d << 16; hl[5] = al5 = a & 65535 | b << 16; h = ah6; l = al6; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = hh[6]; l = hl[6]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[6] = ah6 = c & 65535 | d << 16; hl[6] = al6 = a & 65535 | b << 16; h = ah7; l = al7; a = l & 65535; b = l >>> 16; c = h & 65535; d = h >>> 16; h = hh[7]; l = hl[7]; a += l & 65535; b += l >>> 16; c += h & 65535; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[7] = ah7 = c & 65535 | d << 16; hl[7] = al7 = a & 65535 | b << 16; pos += 128; n -= 128; } return n; } function crypto_hash(out, m, n) { var hh = new Int32Array(8), hl = new Int32Array(8), x = new Uint8Array(256), i, b = n; hh[0] = 1779033703; hh[1] = 3144134277; hh[2] = 1013904242; hh[3] = 2773480762; hh[4] = 1359893119; hh[5] = 2600822924; hh[6] = 528734635; hh[7] = 1541459225; hl[0] = 4089235720; hl[1] = 2227873595; hl[2] = 4271175723; hl[3] = 1595750129; hl[4] = 2917565137; hl[5] = 725511199; hl[6] = 4215389547; hl[7] = 327033209; crypto_hashblocks_hl(hh, hl, m, n); n %= 128; for (i = 0; i < n; i++) x[i] = m[b - n + i]; x[n] = 128; n = 256 - 128 * (n < 112 ? 1 : 0); x[n - 9] = 0; ts64(x, n - 8, b / 536870912 | 0, b << 3); crypto_hashblocks_hl(hh, hl, x, n); for (i = 0; i < 8; i++) ts64(out, 8 * i, hh[i], hl[i]); return 0; } function add(p, q2) { var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(), g = gf(), h = gf(), t = gf(); Z(a, p[1], p[0]); Z(t, q2[1], q2[0]); M(a, a, t); A(b, p[0], p[1]); A(t, q2[0], q2[1]); M(b, b, t); M(c, p[3], q2[3]); M(c, c, D2); M(d, p[2], q2[2]); A(d, d, d); Z(e, b, a); Z(f, d, c); A(g, d, c); A(h, b, a); M(p[0], e, f); M(p[1], h, g); M(p[2], g, f); M(p[3], e, h); } function cswap(p, q2, b) { var i; for (i = 0; i < 4; i++) { sel25519(p[i], q2[i], b); } } function pack(r, p) { var tx = gf(), ty = gf(), zi = gf(); inv25519(zi, p[2]); M(tx, p[0], zi); M(ty, p[1], zi); pack25519(r, ty); r[31] ^= par25519(tx) << 7; } function scalarmult(p, q2, s) { var b, i; set25519(p[0], gf0); set25519(p[1], gf1); set25519(p[2], gf1); set25519(p[3], gf0); for (i = 255; i >= 0; --i) { b = s[i / 8 | 0] >> (i & 7) & 1; cswap(p, q2, b); add(q2, p); add(p, p); cswap(p, q2, b); } } function scalarbase(p, s) { var q2 = [gf(), gf(), gf(), gf()]; set25519(q2[0], X); set25519(q2[1], Y); set25519(q2[2], gf1); M(q2[3], X, Y); scalarmult(p, q2, s); } function crypto_sign_keypair(pk, sk, seeded) { var d = new Uint8Array(64); var p = [gf(), gf(), gf(), gf()]; var i; if (!seeded) randombytes(sk, 32); crypto_hash(d, sk, 32); d[0] &= 248; d[31] &= 127; d[31] |= 64; scalarbase(p, d); pack(pk, p); for (i = 0; i < 32; i++) sk[i + 32] = pk[i]; return 0; } var L = new Float64Array([237, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16]); function modL(r, x) { var carry, i, j, k; for (i = 63; i >= 32; --i) { carry = 0; for (j = i - 32, k = i - 12; j < k; ++j) { x[j] += carry - 16 * x[i] * L[j - (i - 32)]; carry = x[j] + 128 >> 8; x[j] -= carry * 256; } x[j] += carry; x[i] = 0; } carry = 0; for (j = 0; j < 32; j++) { x[j] += carry - (x[31] >> 4) * L[j]; carry = x[j] >> 8; x[j] &= 255; } for (j = 0; j < 32; j++) x[j] -= carry * L[j]; for (i = 0; i < 32; i++) { x[i + 1] += x[i] >> 8; r[i] = x[i] & 255; } } function reduce(r) { var x = new Float64Array(64), i; for (i = 0; i < 64; i++) x[i] = r[i]; for (i = 0; i < 64; i++) r[i] = 0; modL(r, x); } function crypto_sign(sm, m, n, sk) { var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); var i, j, x = new Float64Array(64); var p = [gf(), gf(), gf(), gf()]; crypto_hash(d, sk, 32); d[0] &= 248; d[31] &= 127; d[31] |= 64; var smlen = n + 64; for (i = 0; i < n; i++) sm[64 + i] = m[i]; for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; crypto_hash(r, sm.subarray(32), n + 32); reduce(r); scalarbase(p, r); pack(sm, p); for (i = 32; i < 64; i++) sm[i] = sk[i]; crypto_hash(h, sm, n + 64); reduce(h); for (i = 0; i < 64; i++) x[i] = 0; for (i = 0; i < 32; i++) x[i] = r[i]; for (i = 0; i < 32; i++) { for (j = 0; j < 32; j++) { x[i + j] += h[i] * d[j]; } } modL(sm.subarray(32), x); return smlen; } function unpackneg(r, p) { var t = gf(), chk = gf(), num = gf(), den = gf(), den2 = gf(), den4 = gf(), den6 = gf(); set25519(r[2], gf1); unpack25519(r[1], p); S(num, r[1]); M(den, num, D); Z(num, num, r[2]); A(den, r[2], den); S(den2, den); S(den4, den2); M(den6, den4, den2); M(t, den6, num); M(t, t, den); pow2523(t, t); M(t, t, num); M(t, t, den); M(t, t, den); M(r[0], t, den); S(chk, r[0]); M(chk, chk, den); if (neq25519(chk, num)) M(r[0], r[0], I); S(chk, r[0]); M(chk, chk, den); if (neq25519(chk, num)) return -1; if (par25519(r[0]) === p[31] >> 7) Z(r[0], gf0, r[0]); M(r[3], r[0], r[1]); return 0; } function crypto_sign_open(m, sm, n, pk) { var i, mlen; var t = new Uint8Array(32), h = new Uint8Array(64); var p = [gf(), gf(), gf(), gf()], q2 = [gf(), gf(), gf(), gf()]; mlen = -1; if (n < 64) return -1; if (unpackneg(q2, pk)) return -1; for (i = 0; i < n; i++) m[i] = sm[i]; for (i = 0; i < 32; i++) m[i + 32] = pk[i]; crypto_hash(h, m, n); reduce(h); scalarmult(p, q2, h); scalarbase(q2, sm.subarray(32)); add(p, q2); pack(t, p); n -= 64; if (crypto_verify_32(sm, 0, t, 0)) { for (i = 0; i < n; i++) m[i] = 0; return -1; } for (i = 0; i < n; i++) m[i] = sm[i + 64]; mlen = n; return mlen; } var crypto_secretbox_KEYBYTES = 32, crypto_secretbox_NONCEBYTES = 24, crypto_secretbox_ZEROBYTES = 32, crypto_secretbox_BOXZEROBYTES = 16, crypto_scalarmult_BYTES = 32, crypto_scalarmult_SCALARBYTES = 32, crypto_box_PUBLICKEYBYTES = 32, crypto_box_SECRETKEYBYTES = 32, crypto_box_BEFORENMBYTES = 32, crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, crypto_sign_BYTES = 64, crypto_sign_PUBLICKEYBYTES = 32, crypto_sign_SECRETKEYBYTES = 64, crypto_sign_SEEDBYTES = 32, crypto_hash_BYTES = 64; nacl.lowlevel = { crypto_core_hsalsa20, crypto_stream_xor, crypto_stream, crypto_stream_salsa20_xor, crypto_stream_salsa20, crypto_onetimeauth, crypto_onetimeauth_verify, crypto_verify_16, crypto_verify_32, crypto_secretbox, crypto_secretbox_open, crypto_scalarmult, crypto_scalarmult_base, crypto_box_beforenm, crypto_box_afternm, crypto_box, crypto_box_open, crypto_box_keypair, crypto_hash, crypto_sign, crypto_sign_keypair, crypto_sign_open, crypto_secretbox_KEYBYTES, crypto_secretbox_NONCEBYTES, crypto_secretbox_ZEROBYTES, crypto_secretbox_BOXZEROBYTES, crypto_scalarmult_BYTES, crypto_scalarmult_SCALARBYTES, crypto_box_PUBLICKEYBYTES, crypto_box_SECRETKEYBYTES, crypto_box_BEFORENMBYTES, crypto_box_NONCEBYTES, crypto_box_ZEROBYTES, crypto_box_BOXZEROBYTES, crypto_sign_BYTES, crypto_sign_PUBLICKEYBYTES, crypto_sign_SECRETKEYBYTES, crypto_sign_SEEDBYTES, crypto_hash_BYTES }; function checkLengths(k, n) { if (k.length !== crypto_secretbox_KEYBYTES) throw new Error("bad key size"); if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error("bad nonce size"); } function checkBoxLengths(pk, sk) { if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error("bad public key size"); if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error("bad secret key size"); } function checkArrayTypes() { var t, i; for (i = 0; i < arguments.length; i++) { if ((t = Object.prototype.toString.call(arguments[i])) !== "[object Uint8Array]") throw new TypeError("unexpected type " + t + ", use Uint8Array"); } } function cleanup(arr) { for (var i = 0; i < arr.length; i++) arr[i] = 0; } if (!nacl.util) { nacl.util = {}; nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { throw new Error("nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js"); }; } nacl.randomBytes = function(n) { var b = new Uint8Array(n); randombytes(b, n); return b; }; nacl.secretbox = function(msg, nonce, key) { checkArrayTypes(msg, nonce, key); checkLengths(key, nonce); var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); var c = new Uint8Array(m.length); for (var i = 0; i < msg.length; i++) m[i + crypto_secretbox_ZEROBYTES] = msg[i]; crypto_secretbox(c, m, m.length, nonce, key); return c.subarray(crypto_secretbox_BOXZEROBYTES); }; nacl.secretbox.open = function(box, nonce, key) { checkArrayTypes(box, nonce, key); checkLengths(key, nonce); var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); var m = new Uint8Array(c.length); for (var i = 0; i < box.length; i++) c[i + crypto_secretbox_BOXZEROBYTES] = box[i]; if (c.length < 32) return false; if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; return m.subarray(crypto_secretbox_ZEROBYTES); }; nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; nacl.scalarMult = function(n, p) { checkArrayTypes(n, p); if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n size"); if (p.length !== crypto_scalarmult_BYTES) throw new Error("bad p size"); var q2 = new Uint8Array(crypto_scalarmult_BYTES); crypto_scalarmult(q2, n, p); return q2; }; nacl.scalarMult.base = function(n) { checkArrayTypes(n); if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n size"); var q2 = new Uint8Array(crypto_scalarmult_BYTES); crypto_scalarmult_base(q2, n); return q2; }; nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; nacl.box = function(msg, nonce, publicKey, secretKey) { var k = nacl.box.before(publicKey, secretKey); return nacl.secretbox(msg, nonce, k); }; nacl.box.before = function(publicKey, secretKey) { checkArrayTypes(publicKey, secretKey); checkBoxLengths(publicKey, secretKey); var k = new Uint8Array(crypto_box_BEFORENMBYTES); crypto_box_beforenm(k, publicKey, secretKey); return k; }; nacl.box.after = nacl.secretbox; nacl.box.open = function(msg, nonce, publicKey, secretKey) { var k = nacl.box.before(publicKey, secretKey); return nacl.secretbox.open(msg, nonce, k); }; nacl.box.open.after = nacl.secretbox.open; nacl.box.keyPair = function() { var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); crypto_box_keypair(pk, sk); return { publicKey: pk, secretKey: sk }; }; nacl.box.keyPair.fromSecretKey = function(secretKey) { checkArrayTypes(secretKey); if (secretKey.length !== crypto_box_SECRETKEYBYTES) throw new Error("bad secret key size"); var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); crypto_scalarmult_base(pk, secretKey); return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; }; nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; nacl.box.nonceLength = crypto_box_NONCEBYTES; nacl.box.overheadLength = nacl.secretbox.overheadLength; nacl.sign = function(msg, secretKey) { checkArrayTypes(msg, secretKey); if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error("bad secret key size"); var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length); crypto_sign(signedMsg, msg, msg.length, secretKey); return signedMsg; }; nacl.sign.open = function(signedMsg, publicKey) { if (arguments.length !== 2) throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?"); checkArrayTypes(signedMsg, publicKey); if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error("bad public key size"); var tmp = new Uint8Array(signedMsg.length); var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); if (mlen < 0) return null; var m = new Uint8Array(mlen); for (var i = 0; i < m.length; i++) m[i] = tmp[i]; return m; }; nacl.sign.detached = function(msg, secretKey) { var signedMsg = nacl.sign(msg, secretKey); var sig = new Uint8Array(crypto_sign_BYTES); for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; return sig; }; nacl.sign.detached.verify = function(msg, sig, publicKey) { checkArrayTypes(msg, sig, publicKey); if (sig.length !== crypto_sign_BYTES) throw new Error("bad signature size"); if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error("bad public key size"); var sm = new Uint8Array(crypto_sign_BYTES + msg.length); var m = new Uint8Array(crypto_sign_BYTES + msg.length); var i; for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i]; return crypto_sign_open(m, sm, sm.length, publicKey) >= 0; }; nacl.sign.keyPair = function() { var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); crypto_sign_keypair(pk, sk); return { publicKey: pk, secretKey: sk }; }; nacl.sign.keyPair.fromSecretKey = function(secretKey) { checkArrayTypes(secretKey); if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error("bad secret key size"); var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32 + i]; return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; }; nacl.sign.keyPair.fromSeed = function(seed) { checkArrayTypes(seed); if (seed.length !== crypto_sign_SEEDBYTES) throw new Error("bad seed size"); var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); for (var i = 0; i < 32; i++) sk[i] = seed[i]; crypto_sign_keypair(pk, sk, true); return { publicKey: pk, secretKey: sk }; }; nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; nacl.sign.seedLength = crypto_sign_SEEDBYTES; nacl.sign.signatureLength = crypto_sign_BYTES; nacl.hash = function(msg) { checkArrayTypes(msg); var h = new Uint8Array(crypto_hash_BYTES); crypto_hash(h, msg, msg.length); return h; }; nacl.hash.hashLength = crypto_hash_BYTES; nacl.verify = function(x, y) { checkArrayTypes(x, y); if (x.length === 0 || y.length === 0) return false; if (x.length !== y.length) return false; return vn(x, 0, y, 0, x.length) === 0 ? true : false; }; nacl.setPRNG = function(fn) { randombytes = fn; }; (function() { var crypto2 = typeof self !== "undefined" ? self.crypto || self.msCrypto : null; if (crypto2 && crypto2.getRandomValues) { var QUOTA = 65536; nacl.setPRNG(function(x, n) { var i, v = new Uint8Array(n); for (i = 0; i < n; i += QUOTA) { crypto2.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); } for (i = 0; i < n; i++) x[i] = v[i]; cleanup(v); }); } else if (typeof require !== "undefined") { crypto2 = require("crypto"); if (crypto2 && crypto2.randomBytes) { nacl.setPRNG(function(x, n) { var i, v = crypto2.randomBytes(n); for (i = 0; i < n; i++) x[i] = v[i]; cleanup(v); }); } } })(); })(typeof module2 !== "undefined" && module2.exports ? module2.exports : self.nacl = self.nacl || {}); } }); // node_modules/sshpk/lib/utils.js var require_utils2 = __commonJS({ "node_modules/sshpk/lib/utils.js"(exports, module2) { module2.exports = { bufferSplit, addRSAMissing, calculateDSAPublic, calculateED25519Public, calculateX25519Public, mpNormalize, mpDenormalize, ecNormalize, countZeros, assertCompatible, isCompatible, opensslKeyDeriv, opensshCipherInfo, publicFromPrivateECDSA, zeroPadToLength, writeBitString, readBitString, pbkdf2 }; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var PrivateKey = require_private_key(); var Key = require_key(); var crypto2 = require("crypto"); var algs = require_algs(); var asn1 = require_lib(); var ec = require_ec(); var jsbn = require_jsbn().BigInteger; var nacl = require_nacl_fast(); var MAX_CLASS_DEPTH = 3; function isCompatible(obj, klass, needVer) { if (obj === null || typeof obj !== "object") return false; if (needVer === void 0) needVer = klass.prototype._sshpkApiVersion; if (obj instanceof klass && klass.prototype._sshpkApiVersion[0] == needVer[0]) return true; var proto = Object.getPrototypeOf(obj); var depth = 0; while (proto.constructor.name !== klass.name) { proto = Object.getPrototypeOf(proto); if (!proto || ++depth > MAX_CLASS_DEPTH) return false; } if (proto.constructor.name !== klass.name) return false; var ver = proto._sshpkApiVersion; if (ver === void 0) ver = klass._oldVersionDetect(obj); if (ver[0] != needVer[0] || ver[1] < needVer[1]) return false; return true; } function assertCompatible(obj, klass, needVer, name) { if (name === void 0) name = "object"; assert.ok(obj, name + " must not be null"); assert.object(obj, name + " must be an object"); if (needVer === void 0) needVer = klass.prototype._sshpkApiVersion; if (obj instanceof klass && klass.prototype._sshpkApiVersion[0] == needVer[0]) return; var proto = Object.getPrototypeOf(obj); var depth = 0; while (proto.constructor.name !== klass.name) { proto = Object.getPrototypeOf(proto); assert.ok(proto && ++depth <= MAX_CLASS_DEPTH, name + " must be a " + klass.name + " instance"); } assert.strictEqual(proto.constructor.name, klass.name, name + " must be a " + klass.name + " instance"); var ver = proto._sshpkApiVersion; if (ver === void 0) ver = klass._oldVersionDetect(obj); assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1], name + " must be compatible with " + klass.name + " klass version " + needVer[0] + "." + needVer[1]); } var CIPHER_LEN = { "des-ede3-cbc": { key: 24, iv: 8 }, "aes-128-cbc": { key: 16, iv: 16 }, "aes-256-cbc": { key: 32, iv: 16 } }; var PKCS5_SALT_LEN = 8; function opensslKeyDeriv(cipher, salt, passphrase, count) { assert.buffer(salt, "salt"); assert.buffer(passphrase, "passphrase"); assert.number(count, "iteration count"); var clen = CIPHER_LEN[cipher]; assert.object(clen, "supported cipher"); salt = salt.slice(0, PKCS5_SALT_LEN); var D, D_prev, bufs; var material = Buffer2.alloc(0); while (material.length < clen.key + clen.iv) { bufs = []; if (D_prev) bufs.push(D_prev); bufs.push(passphrase); bufs.push(salt); D = Buffer2.concat(bufs); for (var j = 0; j < count; ++j) D = crypto2.createHash("md5").update(D).digest(); material = Buffer2.concat([material, D]); D_prev = D; } return { key: material.slice(0, clen.key), iv: material.slice(clen.key, clen.key + clen.iv) }; } function pbkdf2(hashAlg, salt, iterations, size, passphrase) { var hkey = Buffer2.alloc(salt.length + 4); salt.copy(hkey); var gen = 0, ts = []; var i = 1; while (gen < size) { var t = T(i++); gen += t.length; ts.push(t); } return Buffer2.concat(ts).slice(0, size); function T(I) { hkey.writeUInt32BE(I, hkey.length - 4); var hmac = crypto2.createHmac(hashAlg, passphrase); hmac.update(hkey); var Ti = hmac.digest(); var Uc = Ti; var c = 1; while (c++ < iterations) { hmac = crypto2.createHmac(hashAlg, passphrase); hmac.update(Uc); Uc = hmac.digest(); for (var x = 0; x < Ti.length; ++x) Ti[x] ^= Uc[x]; } return Ti; } } function countZeros(buf) { var o = 0, obit = 8; while (o < buf.length) { var mask = 1 << obit; if ((buf[o] & mask) === mask) break; obit--; if (obit < 0) { o++; obit = 8; } } return o * 8 + (8 - obit) - 1; } function bufferSplit(buf, chr) { assert.buffer(buf); assert.string(chr); var parts = []; var lastPart = 0; var matches = 0; for (var i = 0; i < buf.length; ++i) { if (buf[i] === chr.charCodeAt(matches)) ++matches; else if (buf[i] === chr.charCodeAt(0)) matches = 1; else matches = 0; if (matches >= chr.length) { var newPart = i + 1; parts.push(buf.slice(lastPart, newPart - matches)); lastPart = newPart; matches = 0; } } if (lastPart <= buf.length) parts.push(buf.slice(lastPart, buf.length)); return parts; } function ecNormalize(buf, addZero) { assert.buffer(buf); if (buf[0] === 0 && buf[1] === 4) { if (addZero) return buf; return buf.slice(1); } else if (buf[0] === 4) { if (!addZero) return buf; } else { while (buf[0] === 0) buf = buf.slice(1); if (buf[0] === 2 || buf[0] === 3) throw new Error("Compressed elliptic curve points are not supported"); if (buf[0] !== 4) throw new Error("Not a valid elliptic curve point"); if (!addZero) return buf; } var b = Buffer2.alloc(buf.length + 1); b[0] = 0; buf.copy(b, 1); return b; } function readBitString(der, tag) { if (tag === void 0) tag = asn1.Ber.BitString; var buf = der.readString(tag, true); assert.strictEqual(buf[0], 0, "bit strings with unused bits are not supported (0x" + buf[0].toString(16) + ")"); return buf.slice(1); } function writeBitString(der, buf, tag) { if (tag === void 0) tag = asn1.Ber.BitString; var b = Buffer2.alloc(buf.length + 1); b[0] = 0; buf.copy(b, 1); der.writeBuffer(b, tag); } function mpNormalize(buf) { assert.buffer(buf); while (buf.length > 1 && buf[0] === 0 && (buf[1] & 128) === 0) buf = buf.slice(1); if ((buf[0] & 128) === 128) { var b = Buffer2.alloc(buf.length + 1); b[0] = 0; buf.copy(b, 1); buf = b; } return buf; } function mpDenormalize(buf) { assert.buffer(buf); while (buf.length > 1 && buf[0] === 0) buf = buf.slice(1); return buf; } function zeroPadToLength(buf, len) { assert.buffer(buf); assert.number(len); while (buf.length > len) { assert.equal(buf[0], 0); buf = buf.slice(1); } while (buf.length < len) { var b = Buffer2.alloc(buf.length + 1); b[0] = 0; buf.copy(b, 1); buf = b; } return buf; } function bigintToMpBuf(bigint) { var buf = Buffer2.from(bigint.toByteArray()); buf = mpNormalize(buf); return buf; } function calculateDSAPublic(g, p, x) { assert.buffer(g); assert.buffer(p); assert.buffer(x); g = new jsbn(g); p = new jsbn(p); x = new jsbn(x); var y = g.modPow(x, p); var ybuf = bigintToMpBuf(y); return ybuf; } function calculateED25519Public(k) { assert.buffer(k); var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); return Buffer2.from(kp.publicKey); } function calculateX25519Public(k) { assert.buffer(k); var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); return Buffer2.from(kp.publicKey); } function addRSAMissing(key) { assert.object(key); assertCompatible(key, PrivateKey, [1, 1]); var d = new jsbn(key.part.d.data); var buf; if (!key.part.dmodp) { var p = new jsbn(key.part.p.data); var dmodp = d.mod(p.subtract(1)); buf = bigintToMpBuf(dmodp); key.part.dmodp = { name: "dmodp", data: buf }; key.parts.push(key.part.dmodp); } if (!key.part.dmodq) { var q2 = new jsbn(key.part.q.data); var dmodq = d.mod(q2.subtract(1)); buf = bigintToMpBuf(dmodq); key.part.dmodq = { name: "dmodq", data: buf }; key.parts.push(key.part.dmodq); } } function publicFromPrivateECDSA(curveName, priv) { assert.string(curveName, "curveName"); assert.buffer(priv); var params = algs.curves[curveName]; var p = new jsbn(params.p); var a = new jsbn(params.a); var b = new jsbn(params.b); var curve = new ec.ECCurveFp(p, a, b); var G = curve.decodePointHex(params.G.toString("hex")); var d = new jsbn(mpNormalize(priv)); var pub = G.multiply(d); pub = Buffer2.from(curve.encodePointHex(pub), "hex"); var parts = []; parts.push({ name: "curve", data: Buffer2.from(curveName) }); parts.push({ name: "Q", data: pub }); var key = new Key({ type: "ecdsa", curve, parts }); return key; } function opensshCipherInfo(cipher) { var inf = {}; switch (cipher) { case "3des-cbc": inf.keySize = 24; inf.blockSize = 8; inf.opensslName = "des-ede3-cbc"; break; case "blowfish-cbc": inf.keySize = 16; inf.blockSize = 8; inf.opensslName = "bf-cbc"; break; case "aes128-cbc": case "aes128-ctr": case "aes128-gcm@openssh.com": inf.keySize = 16; inf.blockSize = 16; inf.opensslName = "aes-128-" + cipher.slice(7, 10); break; case "aes192-cbc": case "aes192-ctr": case "aes192-gcm@openssh.com": inf.keySize = 24; inf.blockSize = 16; inf.opensslName = "aes-192-" + cipher.slice(7, 10); break; case "aes256-cbc": case "aes256-ctr": case "aes256-gcm@openssh.com": inf.keySize = 32; inf.blockSize = 16; inf.opensslName = "aes-256-" + cipher.slice(7, 10); break; default: throw new Error('Unsupported openssl cipher "' + cipher + '"'); } return inf; } } }); // node_modules/sshpk/lib/ssh-buffer.js var require_ssh_buffer = __commonJS({ "node_modules/sshpk/lib/ssh-buffer.js"(exports, module2) { module2.exports = SSHBuffer; var assert = require_assert(); var Buffer2 = require_safer().Buffer; function SSHBuffer(opts) { assert.object(opts, "options"); if (opts.buffer !== void 0) assert.buffer(opts.buffer, "options.buffer"); this._size = opts.buffer ? opts.buffer.length : 1024; this._buffer = opts.buffer || Buffer2.alloc(this._size); this._offset = 0; } SSHBuffer.prototype.toBuffer = function() { return this._buffer.slice(0, this._offset); }; SSHBuffer.prototype.atEnd = function() { return this._offset >= this._buffer.length; }; SSHBuffer.prototype.remainder = function() { return this._buffer.slice(this._offset); }; SSHBuffer.prototype.skip = function(n) { this._offset += n; }; SSHBuffer.prototype.expand = function() { this._size *= 2; var buf = Buffer2.alloc(this._size); this._buffer.copy(buf, 0); this._buffer = buf; }; SSHBuffer.prototype.readPart = function() { return { data: this.readBuffer() }; }; SSHBuffer.prototype.readBuffer = function() { var len = this._buffer.readUInt32BE(this._offset); this._offset += 4; assert.ok(this._offset + len <= this._buffer.length, "length out of bounds at +0x" + this._offset.toString(16) + " (data truncated?)"); var buf = this._buffer.slice(this._offset, this._offset + len); this._offset += len; return buf; }; SSHBuffer.prototype.readString = function() { return this.readBuffer().toString(); }; SSHBuffer.prototype.readCString = function() { var offset = this._offset; while (offset < this._buffer.length && this._buffer[offset] !== 0) offset++; assert.ok(offset < this._buffer.length, "c string does not terminate"); var str = this._buffer.slice(this._offset, offset).toString(); this._offset = offset + 1; return str; }; SSHBuffer.prototype.readInt = function() { var v = this._buffer.readUInt32BE(this._offset); this._offset += 4; return v; }; SSHBuffer.prototype.readInt64 = function() { assert.ok(this._offset + 8 < this._buffer.length, "buffer not long enough to read Int64"); var v = this._buffer.slice(this._offset, this._offset + 8); this._offset += 8; return v; }; SSHBuffer.prototype.readChar = function() { var v = this._buffer[this._offset++]; return v; }; SSHBuffer.prototype.writeBuffer = function(buf) { while (this._offset + 4 + buf.length > this._size) this.expand(); this._buffer.writeUInt32BE(buf.length, this._offset); this._offset += 4; buf.copy(this._buffer, this._offset); this._offset += buf.length; }; SSHBuffer.prototype.writeString = function(str) { this.writeBuffer(Buffer2.from(str, "utf8")); }; SSHBuffer.prototype.writeCString = function(str) { while (this._offset + 1 + str.length > this._size) this.expand(); this._buffer.write(str, this._offset); this._offset += str.length; this._buffer[this._offset++] = 0; }; SSHBuffer.prototype.writeInt = function(v) { while (this._offset + 4 > this._size) this.expand(); this._buffer.writeUInt32BE(v, this._offset); this._offset += 4; }; SSHBuffer.prototype.writeInt64 = function(v) { assert.buffer(v, "value"); if (v.length > 8) { var lead = v.slice(0, v.length - 8); for (var i = 0; i < lead.length; ++i) { assert.strictEqual(lead[i], 0, "must fit in 64 bits of precision"); } v = v.slice(v.length - 8, v.length); } while (this._offset + 8 > this._size) this.expand(); v.copy(this._buffer, this._offset); this._offset += 8; }; SSHBuffer.prototype.writeChar = function(v) { while (this._offset + 1 > this._size) this.expand(); this._buffer[this._offset++] = v; }; SSHBuffer.prototype.writePart = function(p) { this.writeBuffer(p.data); }; SSHBuffer.prototype.write = function(buf) { while (this._offset + buf.length > this._size) this.expand(); buf.copy(this._buffer, this._offset); this._offset += buf.length; }; } }); // node_modules/sshpk/lib/signature.js var require_signature = __commonJS({ "node_modules/sshpk/lib/signature.js"(exports, module2) { module2.exports = Signature; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var crypto2 = require("crypto"); var errs = require_errors2(); var utils = require_utils2(); var asn1 = require_lib(); var SSHBuffer = require_ssh_buffer(); var InvalidAlgorithmError = errs.InvalidAlgorithmError; var SignatureParseError = errs.SignatureParseError; function Signature(opts) { assert.object(opts, "options"); assert.arrayOfObject(opts.parts, "options.parts"); assert.string(opts.type, "options.type"); var partLookup = {}; for (var i = 0; i < opts.parts.length; ++i) { var part = opts.parts[i]; partLookup[part.name] = part; } this.type = opts.type; this.hashAlgorithm = opts.hashAlgo; this.curve = opts.curve; this.parts = opts.parts; this.part = partLookup; } Signature.prototype.toBuffer = function(format) { if (format === void 0) format = "asn1"; assert.string(format, "format"); var buf; var stype = "ssh-" + this.type; switch (this.type) { case "rsa": switch (this.hashAlgorithm) { case "sha256": stype = "rsa-sha2-256"; break; case "sha512": stype = "rsa-sha2-512"; break; case "sha1": case void 0: break; default: throw new Error("SSH signature format does not support hash algorithm " + this.hashAlgorithm); } if (format === "ssh") { buf = new SSHBuffer({}); buf.writeString(stype); buf.writePart(this.part.sig); return buf.toBuffer(); } else { return this.part.sig.data; } break; case "ed25519": if (format === "ssh") { buf = new SSHBuffer({}); buf.writeString(stype); buf.writePart(this.part.sig); return buf.toBuffer(); } else { return this.part.sig.data; } break; case "dsa": case "ecdsa": var r, s; if (format === "asn1") { var der = new asn1.BerWriter(); der.startSequence(); r = utils.mpNormalize(this.part.r.data); s = utils.mpNormalize(this.part.s.data); der.writeBuffer(r, asn1.Ber.Integer); der.writeBuffer(s, asn1.Ber.Integer); der.endSequence(); return der.buffer; } else if (format === "ssh" && this.type === "dsa") { buf = new SSHBuffer({}); buf.writeString("ssh-dss"); r = this.part.r.data; if (r.length > 20 && r[0] === 0) r = r.slice(1); s = this.part.s.data; if (s.length > 20 && s[0] === 0) s = s.slice(1); if (this.hashAlgorithm && this.hashAlgorithm !== "sha1" || r.length + s.length !== 40) { throw new Error("OpenSSH only supports DSA signatures with SHA1 hash"); } buf.writeBuffer(Buffer2.concat([r, s])); return buf.toBuffer(); } else if (format === "ssh" && this.type === "ecdsa") { var inner = new SSHBuffer({}); r = this.part.r.data; inner.writeBuffer(r); inner.writePart(this.part.s); buf = new SSHBuffer({}); var curve; if (r[0] === 0) r = r.slice(1); var sz = r.length * 8; if (sz === 256) curve = "nistp256"; else if (sz === 384) curve = "nistp384"; else if (sz === 528) curve = "nistp521"; buf.writeString("ecdsa-sha2-" + curve); buf.writeBuffer(inner.toBuffer()); return buf.toBuffer(); } throw new Error("Invalid signature format"); default: throw new Error("Invalid signature data"); } }; Signature.prototype.toString = function(format) { assert.optionalString(format, "format"); return this.toBuffer(format).toString("base64"); }; Signature.parse = function(data, type, format) { if (typeof data === "string") data = Buffer2.from(data, "base64"); assert.buffer(data, "data"); assert.string(format, "format"); assert.string(type, "type"); var opts = {}; opts.type = type.toLowerCase(); opts.parts = []; try { assert.ok(data.length > 0, "signature must not be empty"); switch (opts.type) { case "rsa": return parseOneNum(data, type, format, opts); case "ed25519": return parseOneNum(data, type, format, opts); case "dsa": case "ecdsa": if (format === "asn1") return parseDSAasn1(data, type, format, opts); else if (opts.type === "dsa") return parseDSA(data, type, format, opts); else return parseECDSA(data, type, format, opts); default: throw new InvalidAlgorithmError(type); } } catch (e) { if (e instanceof InvalidAlgorithmError) throw e; throw new SignatureParseError(type, format, e); } }; function parseOneNum(data, type, format, opts) { if (format === "ssh") { try { var buf = new SSHBuffer({ buffer: data }); var head = buf.readString(); } catch (e) { } if (buf !== void 0) { var msg = "SSH signature does not match expected type (expected " + type + ", got " + head + ")"; switch (head) { case "ssh-rsa": assert.strictEqual(type, "rsa", msg); opts.hashAlgo = "sha1"; break; case "rsa-sha2-256": assert.strictEqual(type, "rsa", msg); opts.hashAlgo = "sha256"; break; case "rsa-sha2-512": assert.strictEqual(type, "rsa", msg); opts.hashAlgo = "sha512"; break; case "ssh-ed25519": assert.strictEqual(type, "ed25519", msg); opts.hashAlgo = "sha512"; break; default: throw new Error("Unknown SSH signature type: " + head); } var sig = buf.readPart(); assert.ok(buf.atEnd(), "extra trailing bytes"); sig.name = "sig"; opts.parts.push(sig); return new Signature(opts); } } opts.parts.push({ name: "sig", data }); return new Signature(opts); } function parseDSAasn1(data, type, format, opts) { var der = new asn1.BerReader(data); der.readSequence(); var r = der.readString(asn1.Ber.Integer, true); var s = der.readString(asn1.Ber.Integer, true); opts.parts.push({ name: "r", data: utils.mpNormalize(r) }); opts.parts.push({ name: "s", data: utils.mpNormalize(s) }); return new Signature(opts); } function parseDSA(data, type, format, opts) { if (data.length != 40) { var buf = new SSHBuffer({ buffer: data }); var d = buf.readBuffer(); if (d.toString("ascii") === "ssh-dss") d = buf.readBuffer(); assert.ok(buf.atEnd(), "extra trailing bytes"); assert.strictEqual(d.length, 40, "invalid inner length"); data = d; } opts.parts.push({ name: "r", data: data.slice(0, 20) }); opts.parts.push({ name: "s", data: data.slice(20, 40) }); return new Signature(opts); } function parseECDSA(data, type, format, opts) { var buf = new SSHBuffer({ buffer: data }); var r, s; var inner = buf.readBuffer(); var stype = inner.toString("ascii"); if (stype.slice(0, 6) === "ecdsa-") { var parts = stype.split("-"); assert.strictEqual(parts[0], "ecdsa"); assert.strictEqual(parts[1], "sha2"); opts.curve = parts[2]; switch (opts.curve) { case "nistp256": opts.hashAlgo = "sha256"; break; case "nistp384": opts.hashAlgo = "sha384"; break; case "nistp521": opts.hashAlgo = "sha512"; break; default: throw new Error("Unsupported ECDSA curve: " + opts.curve); } inner = buf.readBuffer(); assert.ok(buf.atEnd(), "extra trailing bytes on outer"); buf = new SSHBuffer({ buffer: inner }); r = buf.readPart(); } else { r = { data: inner }; } s = buf.readPart(); assert.ok(buf.atEnd(), "extra trailing bytes"); r.name = "r"; s.name = "s"; opts.parts.push(r); opts.parts.push(s); return new Signature(opts); } Signature.isSignature = function(obj, ver) { return utils.isCompatible(obj, Signature, ver); }; Signature.prototype._sshpkApiVersion = [2, 1]; Signature._oldVersionDetect = function(obj) { assert.func(obj.toBuffer); if (obj.hasOwnProperty("hashAlgorithm")) return [2, 0]; return [1, 0]; }; } }); // node_modules/ecc-jsbn/lib/sec.js var require_sec = __commonJS({ "node_modules/ecc-jsbn/lib/sec.js"(exports, module2) { var BigInteger = require_jsbn().BigInteger; var ECCurveFp = require_ec().ECCurveFp; function X9ECParameters(curve, g, n, h) { this.curve = curve; this.g = g; this.n = n; this.h = h; } function x9getCurve() { return this.curve; } function x9getG() { return this.g; } function x9getN() { return this.n; } function x9getH() { return this.h; } X9ECParameters.prototype.getCurve = x9getCurve; X9ECParameters.prototype.getG = x9getG; X9ECParameters.prototype.getN = x9getN; X9ECParameters.prototype.getH = x9getH; function fromHex(s) { return new BigInteger(s, 16); } function secp128r1() { var p = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF"); var a = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC"); var b = fromHex("E87579C11079F43DD824993C2CEE5ED3"); var n = fromHex("FFFFFFFE0000000075A30D1B9038A115"); var h = BigInteger.ONE; var curve = new ECCurveFp(p, a, b); var G = curve.decodePointHex("04161FF7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83"); return new X9ECParameters(curve, G, n, h); } function secp160k1() { var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"); var a = BigInteger.ZERO; var b = fromHex("7"); var n = fromHex("0100000000000000000001B8FA16DFAB9ACA16B6B3"); var h = BigInteger.ONE; var curve = new ECCurveFp(p, a, b); var G = curve.decodePointHex("043B4C382CE37AA192A4019E763036F4F5DD4D7EBB938CF935318FDCED6BC28286531733C3F03C4FEE"); return new X9ECParameters(curve, G, n, h); } function secp160r1() { var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"); var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC"); var b = fromHex("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45"); var n = fromHex("0100000000000000000001F4C8F927AED3CA752257"); var h = BigInteger.ONE; var curve = new ECCurveFp(p, a, b); var G = curve.decodePointHex("044A96B5688EF573284664698968C38BB913CBFC8223A628553168947D59DCC912042351377AC5FB32"); return new X9ECParameters(curve, G, n, h); } function secp192k1() { var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37"); var a = BigInteger.ZERO; var b = fromHex("3"); var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D"); var h = BigInteger.ONE; var curve = new ECCurveFp(p, a, b); var G = curve.decodePointHex("04DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D"); return new X9ECParameters(curve, G, n, h); } function secp192r1() { var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"); var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"); var b = fromHex("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1"); var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831"); var h = BigInteger.ONE; var curve = new ECCurveFp(p, a, b); var G = curve.decodePointHex("04188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF101207192B95FFC8DA78631011ED6B24CDD573F977A11E794811"); return new X9ECParameters(curve, G, n, h); } function secp224r1() { var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001"); var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"); var b = fromHex("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4"); var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D"); var h = BigInteger.ONE; var curve = new ECCurveFp(p, a, b); var G = curve.decodePointHex("04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34"); return new X9ECParameters(curve, G, n, h); } function secp256r1() { var p = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"); var a = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC"); var b = fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"); var n = fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"); var h = BigInteger.ONE; var curve = new ECCurveFp(p, a, b); var G = curve.decodePointHex("046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"); return new X9ECParameters(curve, G, n, h); } module2.exports = { "secp128r1": secp128r1, "secp160k1": secp160k1, "secp160r1": secp160r1, "secp192k1": secp192k1, "secp192r1": secp192r1, "secp224r1": secp224r1, "secp256r1": secp256r1 }; } }); // node_modules/ecc-jsbn/index.js var require_ecc_jsbn = __commonJS({ "node_modules/ecc-jsbn/index.js"(exports) { var crypto2 = require("crypto"); var BigInteger = require_jsbn().BigInteger; var ECPointFp = require_ec().ECPointFp; var Buffer2 = require_safer().Buffer; exports.ECCurves = require_sec(); function unstupid(hex, len) { return hex.length >= len ? hex : unstupid("0" + hex, len); } exports.ECKey = function(curve, key, isPublic) { var priv; var c = curve(); var n = c.getN(); var bytes = Math.floor(n.bitLength() / 8); if (key) { if (isPublic) { var curve = c.getCurve(); this.P = curve.decodePointHex(key.toString("hex")); } else { if (key.length != bytes) return false; priv = new BigInteger(key.toString("hex"), 16); } } else { var n1 = n.subtract(BigInteger.ONE); var r = new BigInteger(crypto2.randomBytes(n.bitLength())); priv = r.mod(n1).add(BigInteger.ONE); this.P = c.getG().multiply(priv); } if (this.P) { this.PublicKey = Buffer2.from(c.getCurve().encodeCompressedPointHex(this.P), "hex"); } if (priv) { this.PrivateKey = Buffer2.from(unstupid(priv.toString(16), bytes * 2), "hex"); this.deriveSharedSecret = function(key2) { if (!key2 || !key2.P) return false; var S = key2.P.multiply(priv); return Buffer2.from(unstupid(S.getX().toBigInteger().toString(16), bytes * 2), "hex"); }; } }; } }); // node_modules/sshpk/lib/dhe.js var require_dhe = __commonJS({ "node_modules/sshpk/lib/dhe.js"(exports, module2) { module2.exports = { DiffieHellman, generateECDSA, generateED25519 }; var assert = require_assert(); var crypto2 = require("crypto"); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var utils = require_utils2(); var nacl = require_nacl_fast(); var Key = require_key(); var PrivateKey = require_private_key(); var CRYPTO_HAVE_ECDH = crypto2.createECDH !== void 0; var ecdh = require_ecc_jsbn(); var ec = require_ec(); var jsbn = require_jsbn().BigInteger; function DiffieHellman(key) { utils.assertCompatible(key, Key, [1, 4], "key"); this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]); this._algo = key.type; this._curve = key.curve; this._key = key; if (key.type === "dsa") { if (!CRYPTO_HAVE_ECDH) { throw new Error("Due to bugs in the node 0.10 crypto API, node 0.12.x or later is required to use DH"); } this._dh = crypto2.createDiffieHellman(key.part.p.data, void 0, key.part.g.data, void 0); this._p = key.part.p; this._g = key.part.g; if (this._isPriv) this._dh.setPrivateKey(key.part.x.data); this._dh.setPublicKey(key.part.y.data); } else if (key.type === "ecdsa") { if (!CRYPTO_HAVE_ECDH) { this._ecParams = new X9ECParameters(this._curve); if (this._isPriv) { this._priv = new ECPrivate(this._ecParams, key.part.d.data); } return; } var curve = { "nistp256": "prime256v1", "nistp384": "secp384r1", "nistp521": "secp521r1" }[key.curve]; this._dh = crypto2.createECDH(curve); if (typeof this._dh !== "object" || typeof this._dh.setPrivateKey !== "function") { CRYPTO_HAVE_ECDH = false; DiffieHellman.call(this, key); return; } if (this._isPriv) this._dh.setPrivateKey(key.part.d.data); this._dh.setPublicKey(key.part.Q.data); } else if (key.type === "curve25519") { if (this._isPriv) { utils.assertCompatible(key, PrivateKey, [1, 5], "key"); this._priv = key.part.k.data; } } else { throw new Error("DH not supported for " + key.type + " keys"); } } DiffieHellman.prototype.getPublicKey = function() { if (this._isPriv) return this._key.toPublic(); return this._key; }; DiffieHellman.prototype.getPrivateKey = function() { if (this._isPriv) return this._key; else return void 0; }; DiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey; DiffieHellman.prototype._keyCheck = function(pk, isPub) { assert.object(pk, "key"); if (!isPub) utils.assertCompatible(pk, PrivateKey, [1, 3], "key"); utils.assertCompatible(pk, Key, [1, 4], "key"); if (pk.type !== this._algo) { throw new Error("A " + pk.type + " key cannot be used in " + this._algo + " Diffie-Hellman"); } if (pk.curve !== this._curve) { throw new Error("A key from the " + pk.curve + " curve cannot be used with a " + this._curve + " Diffie-Hellman"); } if (pk.type === "dsa") { assert.deepEqual(pk.part.p, this._p, "DSA key prime does not match"); assert.deepEqual(pk.part.g, this._g, "DSA key generator does not match"); } }; DiffieHellman.prototype.setKey = function(pk) { this._keyCheck(pk); if (pk.type === "dsa") { this._dh.setPrivateKey(pk.part.x.data); this._dh.setPublicKey(pk.part.y.data); } else if (pk.type === "ecdsa") { if (CRYPTO_HAVE_ECDH) { this._dh.setPrivateKey(pk.part.d.data); this._dh.setPublicKey(pk.part.Q.data); } else { this._priv = new ECPrivate(this._ecParams, pk.part.d.data); } } else if (pk.type === "curve25519") { var k = pk.part.k; if (!pk.part.k) k = pk.part.r; this._priv = k.data; if (this._priv[0] === 0) this._priv = this._priv.slice(1); this._priv = this._priv.slice(0, 32); } this._key = pk; this._isPriv = true; }; DiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey; DiffieHellman.prototype.computeSecret = function(otherpk) { this._keyCheck(otherpk, true); if (!this._isPriv) throw new Error("DH exchange has not been initialized with a private key yet"); var pub; if (this._algo === "dsa") { return this._dh.computeSecret(otherpk.part.y.data); } else if (this._algo === "ecdsa") { if (CRYPTO_HAVE_ECDH) { return this._dh.computeSecret(otherpk.part.Q.data); } else { pub = new ECPublic(this._ecParams, otherpk.part.Q.data); return this._priv.deriveSharedSecret(pub); } } else if (this._algo === "curve25519") { pub = otherpk.part.A.data; while (pub[0] === 0 && pub.length > 32) pub = pub.slice(1); var priv = this._priv; assert.strictEqual(pub.length, 32); assert.strictEqual(priv.length, 32); var secret = nacl.box.before(new Uint8Array(pub), new Uint8Array(priv)); return Buffer2.from(secret); } throw new Error("Invalid algorithm: " + this._algo); }; DiffieHellman.prototype.generateKey = function() { var parts = []; var priv, pub; if (this._algo === "dsa") { this._dh.generateKeys(); parts.push({ name: "p", data: this._p.data }); parts.push({ name: "q", data: this._key.part.q.data }); parts.push({ name: "g", data: this._g.data }); parts.push({ name: "y", data: this._dh.getPublicKey() }); parts.push({ name: "x", data: this._dh.getPrivateKey() }); this._key = new PrivateKey({ type: "dsa", parts }); this._isPriv = true; return this._key; } else if (this._algo === "ecdsa") { if (CRYPTO_HAVE_ECDH) { this._dh.generateKeys(); parts.push({ name: "curve", data: Buffer2.from(this._curve) }); parts.push({ name: "Q", data: this._dh.getPublicKey() }); parts.push({ name: "d", data: this._dh.getPrivateKey() }); this._key = new PrivateKey({ type: "ecdsa", curve: this._curve, parts }); this._isPriv = true; return this._key; } else { var n = this._ecParams.getN(); var r = new jsbn(crypto2.randomBytes(n.bitLength())); var n1 = n.subtract(jsbn.ONE); priv = r.mod(n1).add(jsbn.ONE); pub = this._ecParams.getG().multiply(priv); priv = Buffer2.from(priv.toByteArray()); pub = Buffer2.from(this._ecParams.getCurve().encodePointHex(pub), "hex"); this._priv = new ECPrivate(this._ecParams, priv); parts.push({ name: "curve", data: Buffer2.from(this._curve) }); parts.push({ name: "Q", data: pub }); parts.push({ name: "d", data: priv }); this._key = new PrivateKey({ type: "ecdsa", curve: this._curve, parts }); this._isPriv = true; return this._key; } } else if (this._algo === "curve25519") { var pair = nacl.box.keyPair(); priv = Buffer2.from(pair.secretKey); pub = Buffer2.from(pair.publicKey); priv = Buffer2.concat([priv, pub]); assert.strictEqual(priv.length, 64); assert.strictEqual(pub.length, 32); parts.push({ name: "A", data: pub }); parts.push({ name: "k", data: priv }); this._key = new PrivateKey({ type: "curve25519", parts }); this._isPriv = true; return this._key; } throw new Error("Invalid algorithm: " + this._algo); }; DiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey; function X9ECParameters(name) { var params = algs.curves[name]; assert.object(params); var p = new jsbn(params.p); var a = new jsbn(params.a); var b = new jsbn(params.b); var n = new jsbn(params.n); var h = jsbn.ONE; var curve = new ec.ECCurveFp(p, a, b); var G = curve.decodePointHex(params.G.toString("hex")); this.curve = curve; this.g = G; this.n = n; this.h = h; } X9ECParameters.prototype.getCurve = function() { return this.curve; }; X9ECParameters.prototype.getG = function() { return this.g; }; X9ECParameters.prototype.getN = function() { return this.n; }; X9ECParameters.prototype.getH = function() { return this.h; }; function ECPublic(params, buffer) { this._params = params; if (buffer[0] === 0) buffer = buffer.slice(1); this._pub = params.getCurve().decodePointHex(buffer.toString("hex")); } function ECPrivate(params, buffer) { this._params = params; this._priv = new jsbn(utils.mpNormalize(buffer)); } ECPrivate.prototype.deriveSharedSecret = function(pubKey) { assert.ok(pubKey instanceof ECPublic); var S = pubKey._pub.multiply(this._priv); return Buffer2.from(S.getX().toBigInteger().toByteArray()); }; function generateED25519() { var pair = nacl.sign.keyPair(); var priv = Buffer2.from(pair.secretKey); var pub = Buffer2.from(pair.publicKey); assert.strictEqual(priv.length, 64); assert.strictEqual(pub.length, 32); var parts = []; parts.push({ name: "A", data: pub }); parts.push({ name: "k", data: priv.slice(0, 32) }); var key = new PrivateKey({ type: "ed25519", parts }); return key; } function generateECDSA(curve) { var parts = []; var key; if (CRYPTO_HAVE_ECDH) { var osCurve = { "nistp256": "prime256v1", "nistp384": "secp384r1", "nistp521": "secp521r1" }[curve]; var dh = crypto2.createECDH(osCurve); dh.generateKeys(); parts.push({ name: "curve", data: Buffer2.from(curve) }); parts.push({ name: "Q", data: dh.getPublicKey() }); parts.push({ name: "d", data: dh.getPrivateKey() }); key = new PrivateKey({ type: "ecdsa", curve, parts }); return key; } else { var ecParams = new X9ECParameters(curve); var n = ecParams.getN(); var cByteLen = Math.ceil((n.bitLength() + 64) / 8); var c = new jsbn(crypto2.randomBytes(cByteLen)); var n1 = n.subtract(jsbn.ONE); var priv = c.mod(n1).add(jsbn.ONE); var pub = ecParams.getG().multiply(priv); priv = Buffer2.from(priv.toByteArray()); pub = Buffer2.from(ecParams.getCurve().encodePointHex(pub), "hex"); parts.push({ name: "curve", data: Buffer2.from(curve) }); parts.push({ name: "Q", data: pub }); parts.push({ name: "d", data: priv }); key = new PrivateKey({ type: "ecdsa", curve, parts }); return key; } } } }); // node_modules/sshpk/lib/ed-compat.js var require_ed_compat = __commonJS({ "node_modules/sshpk/lib/ed-compat.js"(exports, module2) { module2.exports = { Verifier, Signer }; var nacl = require_nacl_fast(); var stream = require("stream"); var util = require("util"); var assert = require_assert(); var Buffer2 = require_safer().Buffer; var Signature = require_signature(); function Verifier(key, hashAlgo) { if (hashAlgo.toLowerCase() !== "sha512") throw new Error("ED25519 only supports the use of SHA-512 hashes"); this.key = key; this.chunks = []; stream.Writable.call(this, {}); } util.inherits(Verifier, stream.Writable); Verifier.prototype._write = function(chunk, enc, cb) { this.chunks.push(chunk); cb(); }; Verifier.prototype.update = function(chunk) { if (typeof chunk === "string") chunk = Buffer2.from(chunk, "binary"); this.chunks.push(chunk); }; Verifier.prototype.verify = function(signature, fmt) { var sig; if (Signature.isSignature(signature, [2, 0])) { if (signature.type !== "ed25519") return false; sig = signature.toBuffer("raw"); } else if (typeof signature === "string") { sig = Buffer2.from(signature, "base64"); } else if (Signature.isSignature(signature, [1, 0])) { throw new Error("signature was created by too old a version of sshpk and cannot be verified"); } assert.buffer(sig); return nacl.sign.detached.verify(new Uint8Array(Buffer2.concat(this.chunks)), new Uint8Array(sig), new Uint8Array(this.key.part.A.data)); }; function Signer(key, hashAlgo) { if (hashAlgo.toLowerCase() !== "sha512") throw new Error("ED25519 only supports the use of SHA-512 hashes"); this.key = key; this.chunks = []; stream.Writable.call(this, {}); } util.inherits(Signer, stream.Writable); Signer.prototype._write = function(chunk, enc, cb) { this.chunks.push(chunk); cb(); }; Signer.prototype.update = function(chunk) { if (typeof chunk === "string") chunk = Buffer2.from(chunk, "binary"); this.chunks.push(chunk); }; Signer.prototype.sign = function() { var sig = nacl.sign.detached(new Uint8Array(Buffer2.concat(this.chunks)), new Uint8Array(Buffer2.concat([ this.key.part.k.data, this.key.part.A.data ]))); var sigBuf = Buffer2.from(sig); var sigObj = Signature.parse(sigBuf, "ed25519", "raw"); sigObj.hashAlgorithm = "sha512"; return sigObj; }; } }); // node_modules/sshpk/lib/formats/pkcs8.js var require_pkcs8 = __commonJS({ "node_modules/sshpk/lib/formats/pkcs8.js"(exports, module2) { module2.exports = { read, readPkcs8, write, writePkcs8, pkcs8ToBuffer, readECDSACurve, writeECDSACurve }; var assert = require_assert(); var asn1 = require_lib(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var pem = require_pem(); function read(buf, options) { return pem.read(buf, options, "pkcs8"); } function write(key, options) { return pem.write(key, options, "pkcs8"); } function readMPInt(der, nm) { assert.strictEqual(der.peek(), asn1.Ber.Integer, nm + " is not an Integer"); return utils.mpNormalize(der.readString(asn1.Ber.Integer, true)); } function readPkcs8(alg, type, der) { if (der.peek() === asn1.Ber.Integer) { assert.strictEqual(type, "private", "unexpected Integer at start of public key"); der.readString(asn1.Ber.Integer, true); } der.readSequence(); var next = der.offset + der.length; var oid = der.readOID(); switch (oid) { case "1.2.840.113549.1.1.1": der._offset = next; if (type === "public") return readPkcs8RSAPublic(der); else return readPkcs8RSAPrivate(der); case "1.2.840.10040.4.1": if (type === "public") return readPkcs8DSAPublic(der); else return readPkcs8DSAPrivate(der); case "1.2.840.10045.2.1": if (type === "public") return readPkcs8ECDSAPublic(der); else return readPkcs8ECDSAPrivate(der); case "1.3.101.112": if (type === "public") { return readPkcs8EdDSAPublic(der); } else { return readPkcs8EdDSAPrivate(der); } case "1.3.101.110": if (type === "public") { return readPkcs8X25519Public(der); } else { return readPkcs8X25519Private(der); } default: throw new Error("Unknown key type OID " + oid); } } function readPkcs8RSAPublic(der) { der.readSequence(asn1.Ber.BitString); der.readByte(); der.readSequence(); var n = readMPInt(der, "modulus"); var e = readMPInt(der, "exponent"); var key = { type: "rsa", source: der.originalInput, parts: [ { name: "e", data: e }, { name: "n", data: n } ] }; return new Key(key); } function readPkcs8RSAPrivate(der) { der.readSequence(asn1.Ber.OctetString); der.readSequence(); var ver = readMPInt(der, "version"); assert.equal(ver[0], 0, "unknown RSA private key version"); var n = readMPInt(der, "modulus"); var e = readMPInt(der, "public exponent"); var d = readMPInt(der, "private exponent"); var p = readMPInt(der, "prime1"); var q2 = readMPInt(der, "prime2"); var dmodp = readMPInt(der, "exponent1"); var dmodq = readMPInt(der, "exponent2"); var iqmp = readMPInt(der, "iqmp"); var key = { type: "rsa", parts: [ { name: "n", data: n }, { name: "e", data: e }, { name: "d", data: d }, { name: "iqmp", data: iqmp }, { name: "p", data: p }, { name: "q", data: q2 }, { name: "dmodp", data: dmodp }, { name: "dmodq", data: dmodq } ] }; return new PrivateKey(key); } function readPkcs8DSAPublic(der) { der.readSequence(); var p = readMPInt(der, "p"); var q2 = readMPInt(der, "q"); var g = readMPInt(der, "g"); der.readSequence(asn1.Ber.BitString); der.readByte(); var y = readMPInt(der, "y"); var key = { type: "dsa", parts: [ { name: "p", data: p }, { name: "q", data: q2 }, { name: "g", data: g }, { name: "y", data: y } ] }; return new Key(key); } function readPkcs8DSAPrivate(der) { der.readSequence(); var p = readMPInt(der, "p"); var q2 = readMPInt(der, "q"); var g = readMPInt(der, "g"); der.readSequence(asn1.Ber.OctetString); var x = readMPInt(der, "x"); var y = utils.calculateDSAPublic(g, p, x); var key = { type: "dsa", parts: [ { name: "p", data: p }, { name: "q", data: q2 }, { name: "g", data: g }, { name: "y", data: y }, { name: "x", data: x } ] }; return new PrivateKey(key); } function readECDSACurve(der) { var curveName, curveNames; var j, c, cd; if (der.peek() === asn1.Ber.OID) { var oid = der.readOID(); curveNames = Object.keys(algs.curves); for (j = 0; j < curveNames.length; ++j) { c = curveNames[j]; cd = algs.curves[c]; if (cd.pkcs8oid === oid) { curveName = c; break; } } } else { der.readSequence(); var version = der.readString(asn1.Ber.Integer, true); assert.strictEqual(version[0], 1, "ECDSA key not version 1"); var curve = {}; der.readSequence(); var fieldTypeOid = der.readOID(); assert.strictEqual(fieldTypeOid, "1.2.840.10045.1.1", "ECDSA key is not from a prime-field"); var p = curve.p = utils.mpNormalize(der.readString(asn1.Ber.Integer, true)); curve.size = p.length * 8 - utils.countZeros(p); der.readSequence(); curve.a = utils.mpNormalize(der.readString(asn1.Ber.OctetString, true)); curve.b = utils.mpNormalize(der.readString(asn1.Ber.OctetString, true)); if (der.peek() === asn1.Ber.BitString) curve.s = der.readString(asn1.Ber.BitString, true); curve.G = der.readString(asn1.Ber.OctetString, true); assert.strictEqual(curve.G[0], 4, "uncompressed G is required"); curve.n = utils.mpNormalize(der.readString(asn1.Ber.Integer, true)); curve.h = utils.mpNormalize(der.readString(asn1.Ber.Integer, true)); assert.strictEqual(curve.h[0], 1, "a cofactor=1 curve is required"); curveNames = Object.keys(algs.curves); var ks = Object.keys(curve); for (j = 0; j < curveNames.length; ++j) { c = curveNames[j]; cd = algs.curves[c]; var equal = true; for (var i = 0; i < ks.length; ++i) { var k = ks[i]; if (cd[k] === void 0) continue; if (typeof cd[k] === "object" && cd[k].equals !== void 0) { if (!cd[k].equals(curve[k])) { equal = false; break; } } else if (Buffer2.isBuffer(cd[k])) { if (cd[k].toString("binary") !== curve[k].toString("binary")) { equal = false; break; } } else { if (cd[k] !== curve[k]) { equal = false; break; } } } if (equal) { curveName = c; break; } } } return curveName; } function readPkcs8ECDSAPrivate(der) { var curveName = readECDSACurve(der); assert.string(curveName, "a known elliptic curve"); der.readSequence(asn1.Ber.OctetString); der.readSequence(); var version = readMPInt(der, "version"); assert.equal(version[0], 1, "unknown version of ECDSA key"); var d = der.readString(asn1.Ber.OctetString, true); var Q; if (der.peek() == 160) { der.readSequence(160); der._offset += der.length; } if (der.peek() == 161) { der.readSequence(161); Q = der.readString(asn1.Ber.BitString, true); Q = utils.ecNormalize(Q); } if (Q === void 0) { var pub = utils.publicFromPrivateECDSA(curveName, d); Q = pub.part.Q.data; } var key = { type: "ecdsa", parts: [ { name: "curve", data: Buffer2.from(curveName) }, { name: "Q", data: Q }, { name: "d", data: d } ] }; return new PrivateKey(key); } function readPkcs8ECDSAPublic(der) { var curveName = readECDSACurve(der); assert.string(curveName, "a known elliptic curve"); var Q = der.readString(asn1.Ber.BitString, true); Q = utils.ecNormalize(Q); var key = { type: "ecdsa", parts: [ { name: "curve", data: Buffer2.from(curveName) }, { name: "Q", data: Q } ] }; return new Key(key); } function readPkcs8EdDSAPublic(der) { if (der.peek() === 0) der.readByte(); var A = utils.readBitString(der); var key = { type: "ed25519", parts: [ { name: "A", data: utils.zeroPadToLength(A, 32) } ] }; return new Key(key); } function readPkcs8X25519Public(der) { var A = utils.readBitString(der); var key = { type: "curve25519", parts: [ { name: "A", data: utils.zeroPadToLength(A, 32) } ] }; return new Key(key); } function readPkcs8EdDSAPrivate(der) { if (der.peek() === 0) der.readByte(); der.readSequence(asn1.Ber.OctetString); var k = der.readString(asn1.Ber.OctetString, true); k = utils.zeroPadToLength(k, 32); var A; if (der.peek() === asn1.Ber.BitString) { A = utils.readBitString(der); A = utils.zeroPadToLength(A, 32); } else { A = utils.calculateED25519Public(k); } var key = { type: "ed25519", parts: [ { name: "A", data: utils.zeroPadToLength(A, 32) }, { name: "k", data: utils.zeroPadToLength(k, 32) } ] }; return new PrivateKey(key); } function readPkcs8X25519Private(der) { if (der.peek() === 0) der.readByte(); der.readSequence(asn1.Ber.OctetString); var k = der.readString(asn1.Ber.OctetString, true); k = utils.zeroPadToLength(k, 32); var A = utils.calculateX25519Public(k); var key = { type: "curve25519", parts: [ { name: "A", data: utils.zeroPadToLength(A, 32) }, { name: "k", data: utils.zeroPadToLength(k, 32) } ] }; return new PrivateKey(key); } function pkcs8ToBuffer(key) { var der = new asn1.BerWriter(); writePkcs8(der, key); return der.buffer; } function writePkcs8(der, key) { der.startSequence(); if (PrivateKey.isPrivateKey(key)) { var sillyInt = Buffer2.from([0]); der.writeBuffer(sillyInt, asn1.Ber.Integer); } der.startSequence(); switch (key.type) { case "rsa": der.writeOID("1.2.840.113549.1.1.1"); if (PrivateKey.isPrivateKey(key)) writePkcs8RSAPrivate(key, der); else writePkcs8RSAPublic(key, der); break; case "dsa": der.writeOID("1.2.840.10040.4.1"); if (PrivateKey.isPrivateKey(key)) writePkcs8DSAPrivate(key, der); else writePkcs8DSAPublic(key, der); break; case "ecdsa": der.writeOID("1.2.840.10045.2.1"); if (PrivateKey.isPrivateKey(key)) writePkcs8ECDSAPrivate(key, der); else writePkcs8ECDSAPublic(key, der); break; case "ed25519": der.writeOID("1.3.101.112"); if (PrivateKey.isPrivateKey(key)) throw new Error("Ed25519 private keys in pkcs8 format are not supported"); writePkcs8EdDSAPublic(key, der); break; default: throw new Error("Unsupported key type: " + key.type); } der.endSequence(); } function writePkcs8RSAPrivate(key, der) { der.writeNull(); der.endSequence(); der.startSequence(asn1.Ber.OctetString); der.startSequence(); var version = Buffer2.from([0]); der.writeBuffer(version, asn1.Ber.Integer); der.writeBuffer(key.part.n.data, asn1.Ber.Integer); der.writeBuffer(key.part.e.data, asn1.Ber.Integer); der.writeBuffer(key.part.d.data, asn1.Ber.Integer); der.writeBuffer(key.part.p.data, asn1.Ber.Integer); der.writeBuffer(key.part.q.data, asn1.Ber.Integer); if (!key.part.dmodp || !key.part.dmodq) utils.addRSAMissing(key); der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); der.endSequence(); der.endSequence(); } function writePkcs8RSAPublic(key, der) { der.writeNull(); der.endSequence(); der.startSequence(asn1.Ber.BitString); der.writeByte(0); der.startSequence(); der.writeBuffer(key.part.n.data, asn1.Ber.Integer); der.writeBuffer(key.part.e.data, asn1.Ber.Integer); der.endSequence(); der.endSequence(); } function writePkcs8DSAPrivate(key, der) { der.startSequence(); der.writeBuffer(key.part.p.data, asn1.Ber.Integer); der.writeBuffer(key.part.q.data, asn1.Ber.Integer); der.writeBuffer(key.part.g.data, asn1.Ber.Integer); der.endSequence(); der.endSequence(); der.startSequence(asn1.Ber.OctetString); der.writeBuffer(key.part.x.data, asn1.Ber.Integer); der.endSequence(); } function writePkcs8DSAPublic(key, der) { der.startSequence(); der.writeBuffer(key.part.p.data, asn1.Ber.Integer); der.writeBuffer(key.part.q.data, asn1.Ber.Integer); der.writeBuffer(key.part.g.data, asn1.Ber.Integer); der.endSequence(); der.endSequence(); der.startSequence(asn1.Ber.BitString); der.writeByte(0); der.writeBuffer(key.part.y.data, asn1.Ber.Integer); der.endSequence(); } function writeECDSACurve(key, der) { var curve = algs.curves[key.curve]; if (curve.pkcs8oid) { der.writeOID(curve.pkcs8oid); } else { der.startSequence(); var version = Buffer2.from([1]); der.writeBuffer(version, asn1.Ber.Integer); der.startSequence(); der.writeOID("1.2.840.10045.1.1"); der.writeBuffer(curve.p, asn1.Ber.Integer); der.endSequence(); der.startSequence(); var a = curve.p; if (a[0] === 0) a = a.slice(1); der.writeBuffer(a, asn1.Ber.OctetString); der.writeBuffer(curve.b, asn1.Ber.OctetString); der.writeBuffer(curve.s, asn1.Ber.BitString); der.endSequence(); der.writeBuffer(curve.G, asn1.Ber.OctetString); der.writeBuffer(curve.n, asn1.Ber.Integer); var h = curve.h; if (!h) { h = Buffer2.from([1]); } der.writeBuffer(h, asn1.Ber.Integer); der.endSequence(); } } function writePkcs8ECDSAPublic(key, der) { writeECDSACurve(key, der); der.endSequence(); var Q = utils.ecNormalize(key.part.Q.data, true); der.writeBuffer(Q, asn1.Ber.BitString); } function writePkcs8ECDSAPrivate(key, der) { writeECDSACurve(key, der); der.endSequence(); der.startSequence(asn1.Ber.OctetString); der.startSequence(); var version = Buffer2.from([1]); der.writeBuffer(version, asn1.Ber.Integer); der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); der.startSequence(161); var Q = utils.ecNormalize(key.part.Q.data, true); der.writeBuffer(Q, asn1.Ber.BitString); der.endSequence(); der.endSequence(); der.endSequence(); } function writePkcs8EdDSAPublic(key, der) { der.endSequence(); utils.writeBitString(der, key.part.A.data); } } }); // node_modules/sshpk/lib/formats/pkcs1.js var require_pkcs1 = __commonJS({ "node_modules/sshpk/lib/formats/pkcs1.js"(exports, module2) { module2.exports = { read, readPkcs1, write, writePkcs1 }; var assert = require_assert(); var asn1 = require_lib(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var pem = require_pem(); var pkcs8 = require_pkcs8(); var readECDSACurve = pkcs8.readECDSACurve; function read(buf, options) { return pem.read(buf, options, "pkcs1"); } function write(key, options) { return pem.write(key, options, "pkcs1"); } function readMPInt(der, nm) { assert.strictEqual(der.peek(), asn1.Ber.Integer, nm + " is not an Integer"); return utils.mpNormalize(der.readString(asn1.Ber.Integer, true)); } function readPkcs1(alg, type, der) { switch (alg) { case "RSA": if (type === "public") return readPkcs1RSAPublic(der); else if (type === "private") return readPkcs1RSAPrivate(der); throw new Error("Unknown key type: " + type); case "DSA": if (type === "public") return readPkcs1DSAPublic(der); else if (type === "private") return readPkcs1DSAPrivate(der); throw new Error("Unknown key type: " + type); case "EC": case "ECDSA": if (type === "private") return readPkcs1ECDSAPrivate(der); else if (type === "public") return readPkcs1ECDSAPublic(der); throw new Error("Unknown key type: " + type); case "EDDSA": case "EdDSA": if (type === "private") return readPkcs1EdDSAPrivate(der); throw new Error(type + " keys not supported with EdDSA"); default: throw new Error("Unknown key algo: " + alg); } } function readPkcs1RSAPublic(der) { var n = readMPInt(der, "modulus"); var e = readMPInt(der, "exponent"); var key = { type: "rsa", parts: [ { name: "e", data: e }, { name: "n", data: n } ] }; return new Key(key); } function readPkcs1RSAPrivate(der) { var version = readMPInt(der, "version"); assert.strictEqual(version[0], 0); var n = readMPInt(der, "modulus"); var e = readMPInt(der, "public exponent"); var d = readMPInt(der, "private exponent"); var p = readMPInt(der, "prime1"); var q2 = readMPInt(der, "prime2"); var dmodp = readMPInt(der, "exponent1"); var dmodq = readMPInt(der, "exponent2"); var iqmp = readMPInt(der, "iqmp"); var key = { type: "rsa", parts: [ { name: "n", data: n }, { name: "e", data: e }, { name: "d", data: d }, { name: "iqmp", data: iqmp }, { name: "p", data: p }, { name: "q", data: q2 }, { name: "dmodp", data: dmodp }, { name: "dmodq", data: dmodq } ] }; return new PrivateKey(key); } function readPkcs1DSAPrivate(der) { var version = readMPInt(der, "version"); assert.strictEqual(version.readUInt8(0), 0); var p = readMPInt(der, "p"); var q2 = readMPInt(der, "q"); var g = readMPInt(der, "g"); var y = readMPInt(der, "y"); var x = readMPInt(der, "x"); var key = { type: "dsa", parts: [ { name: "p", data: p }, { name: "q", data: q2 }, { name: "g", data: g }, { name: "y", data: y }, { name: "x", data: x } ] }; return new PrivateKey(key); } function readPkcs1EdDSAPrivate(der) { var version = readMPInt(der, "version"); assert.strictEqual(version.readUInt8(0), 1); var k = der.readString(asn1.Ber.OctetString, true); der.readSequence(160); var oid = der.readOID(); assert.strictEqual(oid, "1.3.101.112", "the ed25519 curve identifier"); der.readSequence(161); var A = utils.readBitString(der); var key = { type: "ed25519", parts: [ { name: "A", data: utils.zeroPadToLength(A, 32) }, { name: "k", data: k } ] }; return new PrivateKey(key); } function readPkcs1DSAPublic(der) { var y = readMPInt(der, "y"); var p = readMPInt(der, "p"); var q2 = readMPInt(der, "q"); var g = readMPInt(der, "g"); var key = { type: "dsa", parts: [ { name: "y", data: y }, { name: "p", data: p }, { name: "q", data: q2 }, { name: "g", data: g } ] }; return new Key(key); } function readPkcs1ECDSAPublic(der) { der.readSequence(); var oid = der.readOID(); assert.strictEqual(oid, "1.2.840.10045.2.1", "must be ecPublicKey"); var curveOid = der.readOID(); var curve; var curves = Object.keys(algs.curves); for (var j = 0; j < curves.length; ++j) { var c = curves[j]; var cd = algs.curves[c]; if (cd.pkcs8oid === curveOid) { curve = c; break; } } assert.string(curve, "a known ECDSA named curve"); var Q = der.readString(asn1.Ber.BitString, true); Q = utils.ecNormalize(Q); var key = { type: "ecdsa", parts: [ { name: "curve", data: Buffer2.from(curve) }, { name: "Q", data: Q } ] }; return new Key(key); } function readPkcs1ECDSAPrivate(der) { var version = readMPInt(der, "version"); assert.strictEqual(version.readUInt8(0), 1); var d = der.readString(asn1.Ber.OctetString, true); der.readSequence(160); var curve = readECDSACurve(der); assert.string(curve, "a known elliptic curve"); der.readSequence(161); var Q = der.readString(asn1.Ber.BitString, true); Q = utils.ecNormalize(Q); var key = { type: "ecdsa", parts: [ { name: "curve", data: Buffer2.from(curve) }, { name: "Q", data: Q }, { name: "d", data: d } ] }; return new PrivateKey(key); } function writePkcs1(der, key) { der.startSequence(); switch (key.type) { case "rsa": if (PrivateKey.isPrivateKey(key)) writePkcs1RSAPrivate(der, key); else writePkcs1RSAPublic(der, key); break; case "dsa": if (PrivateKey.isPrivateKey(key)) writePkcs1DSAPrivate(der, key); else writePkcs1DSAPublic(der, key); break; case "ecdsa": if (PrivateKey.isPrivateKey(key)) writePkcs1ECDSAPrivate(der, key); else writePkcs1ECDSAPublic(der, key); break; case "ed25519": if (PrivateKey.isPrivateKey(key)) writePkcs1EdDSAPrivate(der, key); else writePkcs1EdDSAPublic(der, key); break; default: throw new Error("Unknown key algo: " + key.type); } der.endSequence(); } function writePkcs1RSAPublic(der, key) { der.writeBuffer(key.part.n.data, asn1.Ber.Integer); der.writeBuffer(key.part.e.data, asn1.Ber.Integer); } function writePkcs1RSAPrivate(der, key) { var ver = Buffer2.from([0]); der.writeBuffer(ver, asn1.Ber.Integer); der.writeBuffer(key.part.n.data, asn1.Ber.Integer); der.writeBuffer(key.part.e.data, asn1.Ber.Integer); der.writeBuffer(key.part.d.data, asn1.Ber.Integer); der.writeBuffer(key.part.p.data, asn1.Ber.Integer); der.writeBuffer(key.part.q.data, asn1.Ber.Integer); if (!key.part.dmodp || !key.part.dmodq) utils.addRSAMissing(key); der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); } function writePkcs1DSAPrivate(der, key) { var ver = Buffer2.from([0]); der.writeBuffer(ver, asn1.Ber.Integer); der.writeBuffer(key.part.p.data, asn1.Ber.Integer); der.writeBuffer(key.part.q.data, asn1.Ber.Integer); der.writeBuffer(key.part.g.data, asn1.Ber.Integer); der.writeBuffer(key.part.y.data, asn1.Ber.Integer); der.writeBuffer(key.part.x.data, asn1.Ber.Integer); } function writePkcs1DSAPublic(der, key) { der.writeBuffer(key.part.y.data, asn1.Ber.Integer); der.writeBuffer(key.part.p.data, asn1.Ber.Integer); der.writeBuffer(key.part.q.data, asn1.Ber.Integer); der.writeBuffer(key.part.g.data, asn1.Ber.Integer); } function writePkcs1ECDSAPublic(der, key) { der.startSequence(); der.writeOID("1.2.840.10045.2.1"); var curve = key.part.curve.data.toString(); var curveOid = algs.curves[curve].pkcs8oid; assert.string(curveOid, "a known ECDSA named curve"); der.writeOID(curveOid); der.endSequence(); var Q = utils.ecNormalize(key.part.Q.data, true); der.writeBuffer(Q, asn1.Ber.BitString); } function writePkcs1ECDSAPrivate(der, key) { var ver = Buffer2.from([1]); der.writeBuffer(ver, asn1.Ber.Integer); der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); der.startSequence(160); var curve = key.part.curve.data.toString(); var curveOid = algs.curves[curve].pkcs8oid; assert.string(curveOid, "a known ECDSA named curve"); der.writeOID(curveOid); der.endSequence(); der.startSequence(161); var Q = utils.ecNormalize(key.part.Q.data, true); der.writeBuffer(Q, asn1.Ber.BitString); der.endSequence(); } function writePkcs1EdDSAPrivate(der, key) { var ver = Buffer2.from([1]); der.writeBuffer(ver, asn1.Ber.Integer); der.writeBuffer(key.part.k.data, asn1.Ber.OctetString); der.startSequence(160); der.writeOID("1.3.101.112"); der.endSequence(); der.startSequence(161); utils.writeBitString(der, key.part.A.data); der.endSequence(); } function writePkcs1EdDSAPublic(der, key) { throw new Error("Public keys are not supported for EdDSA PKCS#1"); } } }); // node_modules/sshpk/lib/formats/rfc4253.js var require_rfc4253 = __commonJS({ "node_modules/sshpk/lib/formats/rfc4253.js"(exports, module2) { module2.exports = { read: read.bind(void 0, false, void 0), readType: read.bind(void 0, false), write, readPartial: read.bind(void 0, true), readInternal: read, keyTypeToAlg, algToKeyType }; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var SSHBuffer = require_ssh_buffer(); function algToKeyType(alg) { assert.string(alg); if (alg === "ssh-dss") return "dsa"; else if (alg === "ssh-rsa") return "rsa"; else if (alg === "ssh-ed25519") return "ed25519"; else if (alg === "ssh-curve25519") return "curve25519"; else if (alg.match(/^ecdsa-sha2-/)) return "ecdsa"; else throw new Error("Unknown algorithm " + alg); } function keyTypeToAlg(key) { assert.object(key); if (key.type === "dsa") return "ssh-dss"; else if (key.type === "rsa") return "ssh-rsa"; else if (key.type === "ed25519") return "ssh-ed25519"; else if (key.type === "curve25519") return "ssh-curve25519"; else if (key.type === "ecdsa") return "ecdsa-sha2-" + key.part.curve.data.toString(); else throw new Error("Unknown key type " + key.type); } function read(partial, type, buf, options) { if (typeof buf === "string") buf = Buffer2.from(buf); assert.buffer(buf, "buf"); var key = {}; var parts = key.parts = []; var sshbuf = new SSHBuffer({ buffer: buf }); var alg = sshbuf.readString(); assert.ok(!sshbuf.atEnd(), "key must have at least one part"); key.type = algToKeyType(alg); var partCount = algs.info[key.type].parts.length; if (type && type === "private") partCount = algs.privInfo[key.type].parts.length; while (!sshbuf.atEnd() && parts.length < partCount) parts.push(sshbuf.readPart()); while (!partial && !sshbuf.atEnd()) parts.push(sshbuf.readPart()); assert.ok(parts.length >= 1, "key must have at least one part"); assert.ok(partial || sshbuf.atEnd(), "leftover bytes at end of key"); var Constructor = Key; var algInfo = algs.info[key.type]; if (type === "private" || algInfo.parts.length !== parts.length) { algInfo = algs.privInfo[key.type]; Constructor = PrivateKey; } assert.strictEqual(algInfo.parts.length, parts.length); if (key.type === "ecdsa") { var res = /^ecdsa-sha2-(.+)$/.exec(alg); assert.ok(res !== null); assert.strictEqual(res[1], parts[0].data.toString()); } var normalized = true; for (var i = 0; i < algInfo.parts.length; ++i) { var p = parts[i]; p.name = algInfo.parts[i]; if (key.type === "ed25519" && p.name === "k") p.data = p.data.slice(0, 32); if (p.name !== "curve" && algInfo.normalize !== false) { var nd; if (key.type === "ed25519") { nd = utils.zeroPadToLength(p.data, 32); } else { nd = utils.mpNormalize(p.data); } if (nd.toString("binary") !== p.data.toString("binary")) { p.data = nd; normalized = false; } } } if (normalized) key._rfc4253Cache = sshbuf.toBuffer(); if (partial && typeof partial === "object") { partial.remainder = sshbuf.remainder(); partial.consumed = sshbuf._offset; } return new Constructor(key); } function write(key, options) { assert.object(key); var alg = keyTypeToAlg(key); var i; var algInfo = algs.info[key.type]; if (PrivateKey.isPrivateKey(key)) algInfo = algs.privInfo[key.type]; var parts = algInfo.parts; var buf = new SSHBuffer({}); buf.writeString(alg); for (i = 0; i < parts.length; ++i) { var data = key.part[parts[i]].data; if (algInfo.normalize !== false) { if (key.type === "ed25519") data = utils.zeroPadToLength(data, 32); else data = utils.mpNormalize(data); } if (key.type === "ed25519" && parts[i] === "k") data = Buffer2.concat([data, key.part.A.data]); buf.writeBuffer(data); } return buf.toBuffer(); } } }); // node_modules/bcrypt-pbkdf/index.js var require_bcrypt_pbkdf = __commonJS({ "node_modules/bcrypt-pbkdf/index.js"(exports, module2) { "use strict"; var crypto_hash_sha512 = require_nacl_fast().lowlevel.crypto_hash; var BLF_J = 0; var Blowfish = function() { this.S = [ new Uint32Array([ 3509652390, 2564797868, 805139163, 3491422135, 3101798381, 1780907670, 3128725573, 4046225305, 614570311, 3012652279, 134345442, 2240740374, 1667834072, 1901547113, 2757295779, 4103290238, 227898511, 1921955416, 1904987480, 2182433518, 2069144605, 3260701109, 2620446009, 720527379, 3318853667, 677414384, 3393288472, 3101374703, 2390351024, 1614419982, 1822297739, 2954791486, 3608508353, 3174124327, 2024746970, 1432378464, 3864339955, 2857741204, 1464375394, 1676153920, 1439316330, 715854006, 3033291828, 289532110, 2706671279, 2087905683, 3018724369, 1668267050, 732546397, 1947742710, 3462151702, 2609353502, 2950085171, 1814351708, 2050118529, 680887927, 999245976, 1800124847, 3300911131, 1713906067, 1641548236, 4213287313, 1216130144, 1575780402, 4018429277, 3917837745, 3693486850, 3949271944, 596196993, 3549867205, 258830323, 2213823033, 772490370, 2760122372, 1774776394, 2652871518, 566650946, 4142492826, 1728879713, 2882767088, 1783734482, 3629395816, 2517608232, 2874225571, 1861159788, 326777828, 3124490320, 2130389656, 2716951837, 967770486, 1724537150, 2185432712, 2364442137, 1164943284, 2105845187, 998989502, 3765401048, 2244026483, 1075463327, 1455516326, 1322494562, 910128902, 469688178, 1117454909, 936433444, 3490320968, 3675253459, 1240580251, 122909385, 2157517691, 634681816, 4142456567, 3825094682, 3061402683, 2540495037, 79693498, 3249098678, 1084186820, 1583128258, 426386531, 1761308591, 1047286709, 322548459, 995290223, 1845252383, 2603652396, 3431023940, 2942221577, 3202600964, 3727903485, 1712269319, 422464435, 3234572375, 1170764815, 3523960633, 3117677531, 1434042557, 442511882, 3600875718, 1076654713, 1738483198, 4213154764, 2393238008, 3677496056, 1014306527, 4251020053, 793779912, 2902807211, 842905082, 4246964064, 1395751752, 1040244610, 2656851899, 3396308128, 445077038, 3742853595, 3577915638, 679411651, 2892444358, 2354009459, 1767581616, 3150600392, 3791627101, 3102740896, 284835224, 4246832056, 1258075500, 768725851, 2589189241, 3069724005, 3532540348, 1274779536, 3789419226, 2764799539, 1660621633, 3471099624, 4011903706, 913787905, 3497959166, 737222580, 2514213453, 2928710040, 3937242737, 1804850592, 3499020752, 2949064160, 2386320175, 2390070455, 2415321851, 4061277028, 2290661394, 2416832540, 1336762016, 1754252060, 3520065937, 3014181293, 791618072, 3188594551, 3933548030, 2332172193, 3852520463, 3043980520, 413987798, 3465142937, 3030929376, 4245938359, 2093235073, 3534596313, 375366246, 2157278981, 2479649556, 555357303, 3870105701, 2008414854, 3344188149, 4221384143, 3956125452, 2067696032, 3594591187, 2921233993, 2428461, 544322398, 577241275, 1471733935, 610547355, 4027169054, 1432588573, 1507829418, 2025931657, 3646575487, 545086370, 48609733, 2200306550, 1653985193, 298326376, 1316178497, 3007786442, 2064951626, 458293330, 2589141269, 3591329599, 3164325604, 727753846, 2179363840, 146436021, 1461446943, 4069977195, 705550613, 3059967265, 3887724982, 4281599278, 3313849956, 1404054877, 2845806497, 146425753, 1854211946 ]), new Uint32Array([ 1266315497, 3048417604, 3681880366, 3289982499, 290971e4, 1235738493, 2632868024, 2414719590, 3970600049, 1771706367, 1449415276, 3266420449, 422970021, 1963543593, 2690192192, 3826793022, 1062508698, 1531092325, 1804592342, 2583117782, 2714934279, 4024971509, 1294809318, 4028980673, 1289560198, 2221992742, 1669523910, 35572830, 157838143, 1052438473, 1016535060, 1802137761, 1753167236, 1386275462, 3080475397, 2857371447, 1040679964, 2145300060, 2390574316, 1461121720, 2956646967, 4031777805, 4028374788, 33600511, 2920084762, 1018524850, 629373528, 3691585981, 3515945977, 2091462646, 2486323059, 586499841, 988145025, 935516892, 3367335476, 2599673255, 2839830854, 265290510, 3972581182, 2759138881, 3795373465, 1005194799, 847297441, 406762289, 1314163512, 1332590856, 1866599683, 4127851711, 750260880, 613907577, 1450815602, 3165620655, 3734664991, 3650291728, 3012275730, 3704569646, 1427272223, 778793252, 1343938022, 2676280711, 2052605720, 1946737175, 3164576444, 3914038668, 3967478842, 3682934266, 1661551462, 3294938066, 4011595847, 840292616, 3712170807, 616741398, 312560963, 711312465, 1351876610, 322626781, 1910503582, 271666773, 2175563734, 1594956187, 70604529, 3617834859, 1007753275, 1495573769, 4069517037, 2549218298, 2663038764, 504708206, 2263041392, 3941167025, 2249088522, 1514023603, 1998579484, 1312622330, 694541497, 2582060303, 2151582166, 1382467621, 776784248, 2618340202, 3323268794, 2497899128, 2784771155, 503983604, 4076293799, 907881277, 423175695, 432175456, 1378068232, 4145222326, 3954048622, 3938656102, 3820766613, 2793130115, 2977904593, 26017576, 3274890735, 3194772133, 1700274565, 1756076034, 4006520079, 3677328699, 720338349, 1533947780, 354530856, 688349552, 3973924725, 1637815568, 332179504, 3949051286, 53804574, 2852348879, 3044236432, 1282449977, 3583942155, 3416972820, 4006381244, 1617046695, 2628476075, 3002303598, 1686838959, 431878346, 2686675385, 1700445008, 1080580658, 1009431731, 832498133, 3223435511, 2605976345, 2271191193, 2516031870, 1648197032, 4164389018, 2548247927, 300782431, 375919233, 238389289, 3353747414, 2531188641, 2019080857, 1475708069, 455242339, 2609103871, 448939670, 3451063019, 1395535956, 2413381860, 1841049896, 1491858159, 885456874, 4264095073, 4001119347, 1565136089, 3898914787, 1108368660, 540939232, 1173283510, 2745871338, 3681308437, 4207628240, 3343053890, 4016749493, 1699691293, 1103962373, 3625875870, 2256883143, 3830138730, 1031889488, 3479347698, 1535977030, 4236805024, 3251091107, 2132092099, 1774941330, 1199868427, 1452454533, 157007616, 2904115357, 342012276, 595725824, 1480756522, 206960106, 497939518, 591360097, 863170706, 2375253569, 3596610801, 1814182875, 2094937945, 3421402208, 1082520231, 3463918190, 2785509508, 435703966, 3908032597, 1641649973, 2842273706, 3305899714, 1510255612, 2148256476, 2655287854, 3276092548, 4258621189, 236887753, 3681803219, 274041037, 1734335097, 3815195456, 3317970021, 1899903192, 1026095262, 4050517792, 356393447, 2410691914, 3873677099, 3682840055 ]), new Uint32Array([ 3913112168, 2491498743, 4132185628, 2489919796, 1091903735, 1979897079, 3170134830, 3567386728, 3557303409, 857797738, 1136121015, 1342202287, 507115054, 2535736646, 337727348, 3213592640, 1301675037, 2528481711, 1895095763, 1721773893, 3216771564, 62756741, 2142006736, 835421444, 2531993523, 1442658625, 3659876326, 2882144922, 676362277, 1392781812, 170690266, 3921047035, 1759253602, 3611846912, 1745797284, 664899054, 1329594018, 3901205900, 3045908486, 2062866102, 2865634940, 3543621612, 3464012697, 1080764994, 553557557, 3656615353, 3996768171, 991055499, 499776247, 1265440854, 648242737, 3940784050, 980351604, 3713745714, 1749149687, 3396870395, 4211799374, 3640570775, 1161844396, 3125318951, 1431517754, 545492359, 4268468663, 3499529547, 1437099964, 2702547544, 3433638243, 2581715763, 2787789398, 1060185593, 1593081372, 2418618748, 4260947970, 69676912, 2159744348, 86519011, 2512459080, 3838209314, 1220612927, 3339683548, 133810670, 1090789135, 1078426020, 1569222167, 845107691, 3583754449, 4072456591, 1091646820, 628848692, 1613405280, 3757631651, 526609435, 236106946, 48312990, 2942717905, 3402727701, 1797494240, 859738849, 992217954, 4005476642, 2243076622, 3870952857, 3732016268, 765654824, 3490871365, 2511836413, 1685915746, 3888969200, 1414112111, 2273134842, 3281911079, 4080962846, 172450625, 2569994100, 980381355, 4109958455, 2819808352, 2716589560, 2568741196, 3681446669, 3329971472, 1835478071, 660984891, 3704678404, 4045999559, 3422617507, 3040415634, 1762651403, 1719377915, 3470491036, 2693910283, 3642056355, 3138596744, 1364962596, 2073328063, 1983633131, 926494387, 3423689081, 2150032023, 4096667949, 1749200295, 3328846651, 309677260, 2016342300, 1779581495, 3079819751, 111262694, 1274766160, 443224088, 298511866, 1025883608, 3806446537, 1145181785, 168956806, 3641502830, 3584813610, 1689216846, 3666258015, 3200248200, 1692713982, 2646376535, 4042768518, 1618508792, 1610833997, 3523052358, 4130873264, 2001055236, 3610705100, 2202168115, 4028541809, 2961195399, 1006657119, 2006996926, 3186142756, 1430667929, 3210227297, 1314452623, 4074634658, 4101304120, 2273951170, 1399257539, 3367210612, 3027628629, 1190975929, 2062231137, 2333990788, 2221543033, 2438960610, 1181637006, 548689776, 2362791313, 3372408396, 3104550113, 3145860560, 296247880, 1970579870, 3078560182, 3769228297, 1714227617, 3291629107, 3898220290, 166772364, 1251581989, 493813264, 448347421, 195405023, 2709975567, 677966185, 3703036547, 1463355134, 2715995803, 1338867538, 1343315457, 2802222074, 2684532164, 233230375, 2599980071, 2000651841, 3277868038, 1638401717, 4028070440, 3237316320, 6314154, 819756386, 300326615, 590932579, 1405279636, 3267499572, 3150704214, 2428286686, 3959192993, 3461946742, 1862657033, 1266418056, 963775037, 2089974820, 2263052895, 1917689273, 448879540, 3550394620, 3981727096, 150775221, 3627908307, 1303187396, 508620638, 2975983352, 2726630617, 1817252668, 1876281319, 1457606340, 908771278, 3720792119, 3617206836, 2455994898, 1729034894, 1080033504 ]), new Uint32Array([ 976866871, 3556439503, 2881648439, 1522871579, 1555064734, 1336096578, 3548522304, 2579274686, 3574697629, 3205460757, 3593280638, 3338716283, 3079412587, 564236357, 2993598910, 1781952180, 1464380207, 3163844217, 3332601554, 1699332808, 1393555694, 1183702653, 3581086237, 1288719814, 691649499, 2847557200, 2895455976, 3193889540, 2717570544, 1781354906, 1676643554, 2592534050, 3230253752, 1126444790, 2770207658, 2633158820, 2210423226, 2615765581, 2414155088, 3127139286, 673620729, 2805611233, 1269405062, 4015350505, 3341807571, 4149409754, 1057255273, 2012875353, 2162469141, 2276492801, 2601117357, 993977747, 3918593370, 2654263191, 753973209, 36408145, 2530585658, 25011837, 3520020182, 2088578344, 530523599, 2918365339, 1524020338, 1518925132, 3760827505, 3759777254, 1202760957, 3985898139, 3906192525, 674977740, 4174734889, 2031300136, 2019492241, 3983892565, 4153806404, 3822280332, 352677332, 2297720250, 60907813, 90501309, 3286998549, 1016092578, 2535922412, 2839152426, 457141659, 509813237, 4120667899, 652014361, 1966332200, 2975202805, 55981186, 2327461051, 676427537, 3255491064, 2882294119, 3433927263, 1307055953, 942726286, 933058658, 2468411793, 3933900994, 4215176142, 1361170020, 2001714738, 2830558078, 3274259782, 1222529897, 1679025792, 2729314320, 3714953764, 1770335741, 151462246, 3013232138, 1682292957, 1483529935, 471910574, 1539241949, 458788160, 3436315007, 1807016891, 3718408830, 978976581, 1043663428, 3165965781, 1927990952, 4200891579, 2372276910, 3208408903, 3533431907, 1412390302, 2931980059, 4132332400, 1947078029, 3881505623, 4168226417, 2941484381, 1077988104, 1320477388, 886195818, 18198404, 3786409e3, 2509781533, 112762804, 3463356488, 1866414978, 891333506, 18488651, 661792760, 1628790961, 3885187036, 3141171499, 876946877, 2693282273, 1372485963, 791857591, 2686433993, 3759982718, 3167212022, 3472953795, 2716379847, 445679433, 3561995674, 3504004811, 3574258232, 54117162, 3331405415, 2381918588, 3769707343, 4154350007, 1140177722, 4074052095, 668550556, 3214352940, 367459370, 261225585, 2610173221, 4209349473, 3468074219, 3265815641, 314222801, 3066103646, 3808782860, 282218597, 3406013506, 3773591054, 379116347, 1285071038, 846784868, 2669647154, 3771962079, 3550491691, 2305946142, 453669953, 1268987020, 3317592352, 3279303384, 3744833421, 2610507566, 3859509063, 266596637, 3847019092, 517658769, 3462560207, 3443424879, 370717030, 4247526661, 2224018117, 4143653529, 4112773975, 2788324899, 2477274417, 1456262402, 2901442914, 1517677493, 1846949527, 2295493580, 3734397586, 2176403920, 1280348187, 1908823572, 3871786941, 846861322, 1172426758, 3287448474, 3383383037, 1655181056, 3139813346, 901632758, 1897031941, 2986607138, 3066810236, 3447102507, 1393639104, 373351379, 950779232, 625454576, 3124240540, 4148612726, 2007998917, 544563296, 2244738638, 2330496472, 2058025392, 1291430526, 424198748, 50039436, 29584100, 3605783033, 2429876329, 2791104160, 1057563949, 3255363231, 3075367218, 3463963227, 1469046755, 985887462 ]) ]; this.P = new Uint32Array([ 608135816, 2242054355, 320440878, 57701188, 2752067618, 698298832, 137296536, 3964562569, 1160258022, 953160567, 3193202383, 887688300, 3232508343, 3380367581, 1065670069, 3041331479, 2450970073, 2306472731 ]); }; function F(S, x8, i) { return (S[0][x8[i + 3]] + S[1][x8[i + 2]] ^ S[2][x8[i + 1]]) + S[3][x8[i]]; } Blowfish.prototype.encipher = function(x, x8) { if (x8 === void 0) { x8 = new Uint8Array(x.buffer); if (x.byteOffset !== 0) x8 = x8.subarray(x.byteOffset); } x[0] ^= this.P[0]; for (var i = 1; i < 16; i += 2) { x[1] ^= F(this.S, x8, 0) ^ this.P[i]; x[0] ^= F(this.S, x8, 4) ^ this.P[i + 1]; } var t = x[0]; x[0] = x[1] ^ this.P[17]; x[1] = t; }; Blowfish.prototype.decipher = function(x) { var x8 = new Uint8Array(x.buffer); if (x.byteOffset !== 0) x8 = x8.subarray(x.byteOffset); x[0] ^= this.P[17]; for (var i = 16; i > 0; i -= 2) { x[1] ^= F(this.S, x8, 0) ^ this.P[i]; x[0] ^= F(this.S, x8, 4) ^ this.P[i - 1]; } var t = x[0]; x[0] = x[1] ^ this.P[0]; x[1] = t; }; function stream2word(data, databytes) { var i, temp = 0; for (i = 0; i < 4; i++, BLF_J++) { if (BLF_J >= databytes) BLF_J = 0; temp = temp << 8 | data[BLF_J]; } return temp; } Blowfish.prototype.expand0state = function(key, keybytes) { var d = new Uint32Array(2), i, k; var d8 = new Uint8Array(d.buffer); for (i = 0, BLF_J = 0; i < 18; i++) { this.P[i] ^= stream2word(key, keybytes); } BLF_J = 0; for (i = 0; i < 18; i += 2) { this.encipher(d, d8); this.P[i] = d[0]; this.P[i + 1] = d[1]; } for (i = 0; i < 4; i++) { for (k = 0; k < 256; k += 2) { this.encipher(d, d8); this.S[i][k] = d[0]; this.S[i][k + 1] = d[1]; } } }; Blowfish.prototype.expandstate = function(data, databytes, key, keybytes) { var d = new Uint32Array(2), i, k; for (i = 0, BLF_J = 0; i < 18; i++) { this.P[i] ^= stream2word(key, keybytes); } for (i = 0, BLF_J = 0; i < 18; i += 2) { d[0] ^= stream2word(data, databytes); d[1] ^= stream2word(data, databytes); this.encipher(d); this.P[i] = d[0]; this.P[i + 1] = d[1]; } for (i = 0; i < 4; i++) { for (k = 0; k < 256; k += 2) { d[0] ^= stream2word(data, databytes); d[1] ^= stream2word(data, databytes); this.encipher(d); this.S[i][k] = d[0]; this.S[i][k + 1] = d[1]; } } BLF_J = 0; }; Blowfish.prototype.enc = function(data, blocks) { for (var i = 0; i < blocks; i++) { this.encipher(data.subarray(i * 2)); } }; Blowfish.prototype.dec = function(data, blocks) { for (var i = 0; i < blocks; i++) { this.decipher(data.subarray(i * 2)); } }; var BCRYPT_BLOCKS = 8; var BCRYPT_HASHSIZE = 32; function bcrypt_hash(sha2pass, sha2salt, out) { var state = new Blowfish(), cdata = new Uint32Array(BCRYPT_BLOCKS), i, ciphertext = new Uint8Array([ 79, 120, 121, 99, 104, 114, 111, 109, 97, 116, 105, 99, 66, 108, 111, 119, 102, 105, 115, 104, 83, 119, 97, 116, 68, 121, 110, 97, 109, 105, 116, 101 ]); state.expandstate(sha2salt, 64, sha2pass, 64); for (i = 0; i < 64; i++) { state.expand0state(sha2salt, 64); state.expand0state(sha2pass, 64); } for (i = 0; i < BCRYPT_BLOCKS; i++) cdata[i] = stream2word(ciphertext, ciphertext.byteLength); for (i = 0; i < 64; i++) state.enc(cdata, cdata.byteLength / 8); for (i = 0; i < BCRYPT_BLOCKS; i++) { out[4 * i + 3] = cdata[i] >>> 24; out[4 * i + 2] = cdata[i] >>> 16; out[4 * i + 1] = cdata[i] >>> 8; out[4 * i + 0] = cdata[i]; } } function bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) { var sha2pass = new Uint8Array(64), sha2salt = new Uint8Array(64), out = new Uint8Array(BCRYPT_HASHSIZE), tmpout = new Uint8Array(BCRYPT_HASHSIZE), countsalt = new Uint8Array(saltlen + 4), i, j, amt, stride, dest, count, origkeylen = keylen; if (rounds < 1) return -1; if (passlen === 0 || saltlen === 0 || keylen === 0 || keylen > out.byteLength * out.byteLength || saltlen > 1 << 20) return -1; stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength); amt = Math.floor((keylen + stride - 1) / stride); for (i = 0; i < saltlen; i++) countsalt[i] = salt[i]; crypto_hash_sha512(sha2pass, pass, passlen); for (count = 1; keylen > 0; count++) { countsalt[saltlen + 0] = count >>> 24; countsalt[saltlen + 1] = count >>> 16; countsalt[saltlen + 2] = count >>> 8; countsalt[saltlen + 3] = count; crypto_hash_sha512(sha2salt, countsalt, saltlen + 4); bcrypt_hash(sha2pass, sha2salt, tmpout); for (i = out.byteLength; i--; ) out[i] = tmpout[i]; for (i = 1; i < rounds; i++) { crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength); bcrypt_hash(sha2pass, sha2salt, tmpout); for (j = 0; j < out.byteLength; j++) out[j] ^= tmpout[j]; } amt = Math.min(amt, keylen); for (i = 0; i < amt; i++) { dest = i * stride + (count - 1); if (dest >= origkeylen) break; key[dest] = out[i]; } keylen -= i; } return 0; } module2.exports = { BLOCKS: BCRYPT_BLOCKS, HASHSIZE: BCRYPT_HASHSIZE, hash: bcrypt_hash, pbkdf: bcrypt_pbkdf }; } }); // node_modules/sshpk/lib/formats/ssh-private.js var require_ssh_private = __commonJS({ "node_modules/sshpk/lib/formats/ssh-private.js"(exports, module2) { module2.exports = { read, readSSHPrivate, write }; var assert = require_assert(); var asn1 = require_lib(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var utils = require_utils2(); var crypto2 = require("crypto"); var Key = require_key(); var PrivateKey = require_private_key(); var pem = require_pem(); var rfc4253 = require_rfc4253(); var SSHBuffer = require_ssh_buffer(); var errors = require_errors2(); var bcrypt; function read(buf, options) { return pem.read(buf, options); } var MAGIC = "openssh-key-v1"; function readSSHPrivate(type, buf, options) { buf = new SSHBuffer({ buffer: buf }); var magic = buf.readCString(); assert.strictEqual(magic, MAGIC, "bad magic string"); var cipher = buf.readString(); var kdf = buf.readString(); var kdfOpts = buf.readBuffer(); var nkeys = buf.readInt(); if (nkeys !== 1) { throw new Error("OpenSSH-format key file contains multiple keys: this is unsupported."); } var pubKey = buf.readBuffer(); if (type === "public") { assert.ok(buf.atEnd(), "excess bytes left after key"); return rfc4253.read(pubKey); } var privKeyBlob = buf.readBuffer(); assert.ok(buf.atEnd(), "excess bytes left after key"); var kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts }); switch (kdf) { case "none": if (cipher !== "none") { throw new Error('OpenSSH-format key uses KDF "none" but specifies a cipher other than "none"'); } break; case "bcrypt": var salt = kdfOptsBuf.readBuffer(); var rounds = kdfOptsBuf.readInt(); var cinf = utils.opensshCipherInfo(cipher); if (bcrypt === void 0) { bcrypt = require_bcrypt_pbkdf(); } if (typeof options.passphrase === "string") { options.passphrase = Buffer2.from(options.passphrase, "utf-8"); } if (!Buffer2.isBuffer(options.passphrase)) { throw new errors.KeyEncryptedError(options.filename, "OpenSSH"); } var pass = new Uint8Array(options.passphrase); var salti = new Uint8Array(salt); var out = new Uint8Array(cinf.keySize + cinf.blockSize); var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, out, out.length, rounds); if (res !== 0) { throw new Error("bcrypt_pbkdf function returned failure, parameters invalid"); } out = Buffer2.from(out); var ckey = out.slice(0, cinf.keySize); var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); var cipherStream = crypto2.createDecipheriv(cinf.opensslName, ckey, iv); cipherStream.setAutoPadding(false); var chunk, chunks = []; cipherStream.once("error", function(e) { if (e.toString().indexOf("bad decrypt") !== -1) { throw new Error("Incorrect passphrase supplied, could not decrypt key"); } throw e; }); cipherStream.write(privKeyBlob); cipherStream.end(); while ((chunk = cipherStream.read()) !== null) chunks.push(chunk); privKeyBlob = Buffer2.concat(chunks); break; default: throw new Error('OpenSSH-format key uses unknown KDF "' + kdf + '"'); } buf = new SSHBuffer({ buffer: privKeyBlob }); var checkInt1 = buf.readInt(); var checkInt2 = buf.readInt(); if (checkInt1 !== checkInt2) { throw new Error("Incorrect passphrase supplied, could not decrypt key"); } var ret = {}; var key = rfc4253.readInternal(ret, "private", buf.remainder()); buf.skip(ret.consumed); var comment = buf.readString(); key.comment = comment; return key; } function write(key, options) { var pubKey; if (PrivateKey.isPrivateKey(key)) pubKey = key.toPublic(); else pubKey = key; var cipher = "none"; var kdf = "none"; var kdfopts = Buffer2.alloc(0); var cinf = { blockSize: 8 }; var passphrase; if (options !== void 0) { passphrase = options.passphrase; if (typeof passphrase === "string") passphrase = Buffer2.from(passphrase, "utf-8"); if (passphrase !== void 0) { assert.buffer(passphrase, "options.passphrase"); assert.optionalString(options.cipher, "options.cipher"); cipher = options.cipher; if (cipher === void 0) cipher = "aes128-ctr"; cinf = utils.opensshCipherInfo(cipher); kdf = "bcrypt"; } } var privBuf; if (PrivateKey.isPrivateKey(key)) { privBuf = new SSHBuffer({}); var checkInt = crypto2.randomBytes(4).readUInt32BE(0); privBuf.writeInt(checkInt); privBuf.writeInt(checkInt); privBuf.write(key.toBuffer("rfc4253")); privBuf.writeString(key.comment || ""); var n = 1; while (privBuf._offset % cinf.blockSize !== 0) privBuf.writeChar(n++); privBuf = privBuf.toBuffer(); } switch (kdf) { case "none": break; case "bcrypt": var salt = crypto2.randomBytes(16); var rounds = 16; var kdfssh = new SSHBuffer({}); kdfssh.writeBuffer(salt); kdfssh.writeInt(rounds); kdfopts = kdfssh.toBuffer(); if (bcrypt === void 0) { bcrypt = require_bcrypt_pbkdf(); } var pass = new Uint8Array(passphrase); var salti = new Uint8Array(salt); var out = new Uint8Array(cinf.keySize + cinf.blockSize); var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, out, out.length, rounds); if (res !== 0) { throw new Error("bcrypt_pbkdf function returned failure, parameters invalid"); } out = Buffer2.from(out); var ckey = out.slice(0, cinf.keySize); var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); var cipherStream = crypto2.createCipheriv(cinf.opensslName, ckey, iv); cipherStream.setAutoPadding(false); var chunk, chunks = []; cipherStream.once("error", function(e) { throw e; }); cipherStream.write(privBuf); cipherStream.end(); while ((chunk = cipherStream.read()) !== null) chunks.push(chunk); privBuf = Buffer2.concat(chunks); break; default: throw new Error("Unsupported kdf " + kdf); } var buf = new SSHBuffer({}); buf.writeCString(MAGIC); buf.writeString(cipher); buf.writeString(kdf); buf.writeBuffer(kdfopts); buf.writeInt(1); buf.writeBuffer(pubKey.toBuffer("rfc4253")); if (privBuf) buf.writeBuffer(privBuf); buf = buf.toBuffer(); var header; if (PrivateKey.isPrivateKey(key)) header = "OPENSSH PRIVATE KEY"; else header = "OPENSSH PUBLIC KEY"; var tmp = buf.toString("base64"); var len = tmp.length + tmp.length / 70 + 18 + 16 + header.length * 2 + 10; buf = Buffer2.alloc(len); var o = 0; o += buf.write("-----BEGIN " + header + "-----\n", o); for (var i = 0; i < tmp.length; ) { var limit = i + 70; if (limit > tmp.length) limit = tmp.length; o += buf.write(tmp.slice(i, limit), o); buf[o++] = 10; i = limit; } o += buf.write("-----END " + header + "-----\n", o); return buf.slice(0, o); } } }); // node_modules/sshpk/lib/formats/pem.js var require_pem = __commonJS({ "node_modules/sshpk/lib/formats/pem.js"(exports, module2) { module2.exports = { read, write }; var assert = require_assert(); var asn1 = require_lib(); var crypto2 = require("crypto"); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var pkcs1 = require_pkcs1(); var pkcs8 = require_pkcs8(); var sshpriv = require_ssh_private(); var rfc4253 = require_rfc4253(); var errors = require_errors2(); var OID_PBES2 = "1.2.840.113549.1.5.13"; var OID_PBKDF2 = "1.2.840.113549.1.5.12"; var OID_TO_CIPHER = { "1.2.840.113549.3.7": "3des-cbc", "2.16.840.1.101.3.4.1.2": "aes128-cbc", "2.16.840.1.101.3.4.1.42": "aes256-cbc" }; var CIPHER_TO_OID = {}; Object.keys(OID_TO_CIPHER).forEach(function(k) { CIPHER_TO_OID[OID_TO_CIPHER[k]] = k; }); var OID_TO_HASH = { "1.2.840.113549.2.7": "sha1", "1.2.840.113549.2.9": "sha256", "1.2.840.113549.2.11": "sha512" }; var HASH_TO_OID = {}; Object.keys(OID_TO_HASH).forEach(function(k) { HASH_TO_OID[OID_TO_HASH[k]] = k; }); function read(buf, options, forceType) { var input = buf; if (typeof buf !== "string") { assert.buffer(buf, "buf"); buf = buf.toString("ascii"); } var lines = buf.trim().split(/[\r\n]+/g); var m; var si = -1; while (!m && si < lines.length) { m = lines[++si].match(/[-]+[ ]*BEGIN ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); } assert.ok(m, "invalid PEM header"); var m2; var ei = lines.length; while (!m2 && ei > 0) { m2 = lines[--ei].match(/[-]+[ ]*END ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); } assert.ok(m2, "invalid PEM footer"); assert.equal(m[2], m2[2]); var type = m[2].toLowerCase(); var alg; if (m[1]) { assert.equal(m[1], m2[1], "PEM header and footer mismatch"); alg = m[1].trim(); } lines = lines.slice(si, ei + 1); var headers = {}; while (true) { lines = lines.slice(1); m = lines[0].match(/^([A-Za-z0-9-]+): (.+)$/); if (!m) break; headers[m[1].toLowerCase()] = m[2]; } lines = lines.slice(0, -1).join(""); buf = Buffer2.from(lines, "base64"); var cipher, key, iv; if (headers["proc-type"]) { var parts = headers["proc-type"].split(","); if (parts[0] === "4" && parts[1] === "ENCRYPTED") { if (typeof options.passphrase === "string") { options.passphrase = Buffer2.from(options.passphrase, "utf-8"); } if (!Buffer2.isBuffer(options.passphrase)) { throw new errors.KeyEncryptedError(options.filename, "PEM"); } else { parts = headers["dek-info"].split(","); assert.ok(parts.length === 2); cipher = parts[0].toLowerCase(); iv = Buffer2.from(parts[1], "hex"); key = utils.opensslKeyDeriv(cipher, iv, options.passphrase, 1).key; } } } if (alg && alg.toLowerCase() === "encrypted") { var eder = new asn1.BerReader(buf); var pbesEnd; eder.readSequence(); eder.readSequence(); pbesEnd = eder.offset + eder.length; var method = eder.readOID(); if (method !== OID_PBES2) { throw new Error("Unsupported PEM/PKCS8 encryption scheme: " + method); } eder.readSequence(); eder.readSequence(); var kdfEnd = eder.offset + eder.length; var kdfOid = eder.readOID(); if (kdfOid !== OID_PBKDF2) throw new Error("Unsupported PBES2 KDF: " + kdfOid); eder.readSequence(); var salt = eder.readString(asn1.Ber.OctetString, true); var iterations = eder.readInt(); var hashAlg = "sha1"; if (eder.offset < kdfEnd) { eder.readSequence(); var hashAlgOid = eder.readOID(); hashAlg = OID_TO_HASH[hashAlgOid]; if (hashAlg === void 0) { throw new Error("Unsupported PBKDF2 hash: " + hashAlgOid); } } eder._offset = kdfEnd; eder.readSequence(); var cipherOid = eder.readOID(); cipher = OID_TO_CIPHER[cipherOid]; if (cipher === void 0) { throw new Error("Unsupported PBES2 cipher: " + cipherOid); } iv = eder.readString(asn1.Ber.OctetString, true); eder._offset = pbesEnd; buf = eder.readString(asn1.Ber.OctetString, true); if (typeof options.passphrase === "string") { options.passphrase = Buffer2.from(options.passphrase, "utf-8"); } if (!Buffer2.isBuffer(options.passphrase)) { throw new errors.KeyEncryptedError(options.filename, "PEM"); } var cinfo = utils.opensshCipherInfo(cipher); cipher = cinfo.opensslName; key = utils.pbkdf2(hashAlg, salt, iterations, cinfo.keySize, options.passphrase); alg = void 0; } if (cipher && key && iv) { var cipherStream = crypto2.createDecipheriv(cipher, key, iv); var chunk, chunks = []; cipherStream.once("error", function(e) { if (e.toString().indexOf("bad decrypt") !== -1) { throw new Error("Incorrect passphrase supplied, could not decrypt key"); } throw e; }); cipherStream.write(buf); cipherStream.end(); while ((chunk = cipherStream.read()) !== null) chunks.push(chunk); buf = Buffer2.concat(chunks); } if (alg && alg.toLowerCase() === "openssh") return sshpriv.readSSHPrivate(type, buf, options); if (alg && alg.toLowerCase() === "ssh2") return rfc4253.readType(type, buf, options); var der = new asn1.BerReader(buf); der.originalInput = input; der.readSequence(); if (alg) { if (forceType) assert.strictEqual(forceType, "pkcs1"); return pkcs1.readPkcs1(alg, type, der); } else { if (forceType) assert.strictEqual(forceType, "pkcs8"); return pkcs8.readPkcs8(alg, type, der); } } function write(key, options, type) { assert.object(key); var alg = { "ecdsa": "EC", "rsa": "RSA", "dsa": "DSA", "ed25519": "EdDSA" }[key.type]; var header; var der = new asn1.BerWriter(); if (PrivateKey.isPrivateKey(key)) { if (type && type === "pkcs8") { header = "PRIVATE KEY"; pkcs8.writePkcs8(der, key); } else { if (type) assert.strictEqual(type, "pkcs1"); header = alg + " PRIVATE KEY"; pkcs1.writePkcs1(der, key); } } else if (Key.isKey(key)) { if (type && type === "pkcs1") { header = alg + " PUBLIC KEY"; pkcs1.writePkcs1(der, key); } else { if (type) assert.strictEqual(type, "pkcs8"); header = "PUBLIC KEY"; pkcs8.writePkcs8(der, key); } } else { throw new Error("key is not a Key or PrivateKey"); } var tmp = der.buffer.toString("base64"); var len = tmp.length + tmp.length / 64 + 18 + 16 + header.length * 2 + 10; var buf = Buffer2.alloc(len); var o = 0; o += buf.write("-----BEGIN " + header + "-----\n", o); for (var i = 0; i < tmp.length; ) { var limit = i + 64; if (limit > tmp.length) limit = tmp.length; o += buf.write(tmp.slice(i, limit), o); buf[o++] = 10; i = limit; } o += buf.write("-----END " + header + "-----\n", o); return buf.slice(0, o); } } }); // node_modules/sshpk/lib/formats/ssh.js var require_ssh = __commonJS({ "node_modules/sshpk/lib/formats/ssh.js"(exports, module2) { module2.exports = { read, write }; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var rfc4253 = require_rfc4253(); var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var sshpriv = require_ssh_private(); var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([ \t]+([^ \t][^\n]*[\n]*)?)?$/; var SSHKEY_RE2 = /^([a-z0-9-]+)[ \t\n]+([a-zA-Z0-9+\/][a-zA-Z0-9+\/ \t\n=]*)([^a-zA-Z0-9+\/ \t\n=].*)?$/; function read(buf, options) { if (typeof buf !== "string") { assert.buffer(buf, "buf"); buf = buf.toString("ascii"); } var trimmed = buf.trim().replace(/[\\\r]/g, ""); var m = trimmed.match(SSHKEY_RE); if (!m) m = trimmed.match(SSHKEY_RE2); assert.ok(m, "key must match regex"); var type = rfc4253.algToKeyType(m[1]); var kbuf = Buffer2.from(m[2], "base64"); var key; var ret = {}; if (m[4]) { try { key = rfc4253.read(kbuf); } catch (e) { m = trimmed.match(SSHKEY_RE2); assert.ok(m, "key must match regex"); kbuf = Buffer2.from(m[2], "base64"); key = rfc4253.readInternal(ret, "public", kbuf); } } else { key = rfc4253.readInternal(ret, "public", kbuf); } assert.strictEqual(type, key.type); if (m[4] && m[4].length > 0) { key.comment = m[4]; } else if (ret.consumed) { var data = m[2] + (m[3] ? m[3] : ""); var realOffset = Math.ceil(ret.consumed / 3) * 4; data = data.slice(0, realOffset - 2).replace(/[^a-zA-Z0-9+\/=]/g, "") + data.slice(realOffset - 2); var padding = ret.consumed % 3; if (padding > 0 && data.slice(realOffset - 1, realOffset) !== "=") realOffset--; while (data.slice(realOffset, realOffset + 1) === "=") realOffset++; var trailer = data.slice(realOffset); trailer = trailer.replace(/[\r\n]/g, " ").replace(/^\s+/, ""); if (trailer.match(/^[a-zA-Z0-9]/)) key.comment = trailer; } return key; } function write(key, options) { assert.object(key); if (!Key.isKey(key)) throw new Error("Must be a public key"); var parts = []; var alg = rfc4253.keyTypeToAlg(key); parts.push(alg); var buf = rfc4253.write(key); parts.push(buf.toString("base64")); if (key.comment) parts.push(key.comment); return Buffer2.from(parts.join(" ")); } } }); // node_modules/sshpk/lib/formats/dnssec.js var require_dnssec = __commonJS({ "node_modules/sshpk/lib/formats/dnssec.js"(exports, module2) { module2.exports = { read, write }; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var Key = require_key(); var PrivateKey = require_private_key(); var utils = require_utils2(); var SSHBuffer = require_ssh_buffer(); var Dhe = require_dhe(); var supportedAlgos = { "rsa-sha1": 5, "rsa-sha256": 8, "rsa-sha512": 10, "ecdsa-p256-sha256": 13, "ecdsa-p384-sha384": 14 }; var supportedAlgosById = {}; Object.keys(supportedAlgos).forEach(function(k) { supportedAlgosById[supportedAlgos[k]] = k.toUpperCase(); }); function read(buf, options) { if (typeof buf !== "string") { assert.buffer(buf, "buf"); buf = buf.toString("ascii"); } var lines = buf.split("\n"); if (lines[0].match(/^Private-key-format\: v1/)) { var algElems = lines[1].split(" "); var algoNum = parseInt(algElems[1], 10); var algoName = algElems[2]; if (!supportedAlgosById[algoNum]) throw new Error("Unsupported algorithm: " + algoName); return readDNSSECPrivateKey(algoNum, lines.slice(2)); } var line = 0; while (lines[line].match(/^\;/)) line++; if ((lines[line].match(/\. IN KEY /) || lines[line].match(/\. IN DNSKEY /)) && lines[line + 1].length === 0) { return readRFC3110(lines[line]); } throw new Error("Cannot parse dnssec key"); } function readRFC3110(keyString) { var elems = keyString.split(" "); var algorithm = parseInt(elems[5], 10); if (!supportedAlgosById[algorithm]) throw new Error("Unsupported algorithm: " + algorithm); var base64key = elems.slice(6, elems.length).join(); var keyBuffer = Buffer2.from(base64key, "base64"); if (supportedAlgosById[algorithm].match(/^RSA-/)) { var publicExponentLen = keyBuffer.readUInt8(0); if (publicExponentLen != 3 && publicExponentLen != 1) throw new Error("Cannot parse dnssec key: unsupported exponent length"); var publicExponent = keyBuffer.slice(1, publicExponentLen + 1); publicExponent = utils.mpNormalize(publicExponent); var modulus = keyBuffer.slice(1 + publicExponentLen); modulus = utils.mpNormalize(modulus); var rsaKey = { type: "rsa", parts: [] }; rsaKey.parts.push({ name: "e", data: publicExponent }); rsaKey.parts.push({ name: "n", data: modulus }); return new Key(rsaKey); } if (supportedAlgosById[algorithm] === "ECDSA-P384-SHA384" || supportedAlgosById[algorithm] === "ECDSA-P256-SHA256") { var curve = "nistp384"; var size = 384; if (supportedAlgosById[algorithm].match(/^ECDSA-P256-SHA256/)) { curve = "nistp256"; size = 256; } var ecdsaKey = { type: "ecdsa", curve, size, parts: [ { name: "curve", data: Buffer2.from(curve) }, { name: "Q", data: utils.ecNormalize(keyBuffer) } ] }; return new Key(ecdsaKey); } throw new Error("Unsupported algorithm: " + supportedAlgosById[algorithm]); } function elementToBuf(e) { return Buffer2.from(e.split(" ")[1], "base64"); } function readDNSSECRSAPrivateKey(elements) { var rsaParams = {}; elements.forEach(function(element) { if (element.split(" ")[0] === "Modulus:") rsaParams["n"] = elementToBuf(element); else if (element.split(" ")[0] === "PublicExponent:") rsaParams["e"] = elementToBuf(element); else if (element.split(" ")[0] === "PrivateExponent:") rsaParams["d"] = elementToBuf(element); else if (element.split(" ")[0] === "Prime1:") rsaParams["p"] = elementToBuf(element); else if (element.split(" ")[0] === "Prime2:") rsaParams["q"] = elementToBuf(element); else if (element.split(" ")[0] === "Exponent1:") rsaParams["dmodp"] = elementToBuf(element); else if (element.split(" ")[0] === "Exponent2:") rsaParams["dmodq"] = elementToBuf(element); else if (element.split(" ")[0] === "Coefficient:") rsaParams["iqmp"] = elementToBuf(element); }); var key = { type: "rsa", parts: [ { name: "e", data: utils.mpNormalize(rsaParams["e"]) }, { name: "n", data: utils.mpNormalize(rsaParams["n"]) }, { name: "d", data: utils.mpNormalize(rsaParams["d"]) }, { name: "p", data: utils.mpNormalize(rsaParams["p"]) }, { name: "q", data: utils.mpNormalize(rsaParams["q"]) }, { name: "dmodp", data: utils.mpNormalize(rsaParams["dmodp"]) }, { name: "dmodq", data: utils.mpNormalize(rsaParams["dmodq"]) }, { name: "iqmp", data: utils.mpNormalize(rsaParams["iqmp"]) } ] }; return new PrivateKey(key); } function readDNSSECPrivateKey(alg, elements) { if (supportedAlgosById[alg].match(/^RSA-/)) { return readDNSSECRSAPrivateKey(elements); } if (supportedAlgosById[alg] === "ECDSA-P384-SHA384" || supportedAlgosById[alg] === "ECDSA-P256-SHA256") { var d = Buffer2.from(elements[0].split(" ")[1], "base64"); var curve = "nistp384"; var size = 384; if (supportedAlgosById[alg] === "ECDSA-P256-SHA256") { curve = "nistp256"; size = 256; } var publicKey = utils.publicFromPrivateECDSA(curve, d); var Q = publicKey.part["Q"].data; var ecdsaKey = { type: "ecdsa", curve, size, parts: [ { name: "curve", data: Buffer2.from(curve) }, { name: "d", data: d }, { name: "Q", data: Q } ] }; return new PrivateKey(ecdsaKey); } throw new Error("Unsupported algorithm: " + supportedAlgosById[alg]); } function dnssecTimestamp(date) { var year = date.getFullYear() + ""; var month = date.getMonth() + 1; var timestampStr = year + month + date.getUTCDate(); timestampStr += "" + date.getUTCHours() + date.getUTCMinutes(); timestampStr += date.getUTCSeconds(); return timestampStr; } function rsaAlgFromOptions(opts) { if (!opts || !opts.hashAlgo || opts.hashAlgo === "sha1") return "5 (RSASHA1)"; else if (opts.hashAlgo === "sha256") return "8 (RSASHA256)"; else if (opts.hashAlgo === "sha512") return "10 (RSASHA512)"; else throw new Error("Unknown or unsupported hash: " + opts.hashAlgo); } function writeRSA(key, options) { if (!key.part.dmodp || !key.part.dmodq) { utils.addRSAMissing(key); } var out = ""; out += "Private-key-format: v1.3\n"; out += "Algorithm: " + rsaAlgFromOptions(options) + "\n"; var n = utils.mpDenormalize(key.part["n"].data); out += "Modulus: " + n.toString("base64") + "\n"; var e = utils.mpDenormalize(key.part["e"].data); out += "PublicExponent: " + e.toString("base64") + "\n"; var d = utils.mpDenormalize(key.part["d"].data); out += "PrivateExponent: " + d.toString("base64") + "\n"; var p = utils.mpDenormalize(key.part["p"].data); out += "Prime1: " + p.toString("base64") + "\n"; var q2 = utils.mpDenormalize(key.part["q"].data); out += "Prime2: " + q2.toString("base64") + "\n"; var dmodp = utils.mpDenormalize(key.part["dmodp"].data); out += "Exponent1: " + dmodp.toString("base64") + "\n"; var dmodq = utils.mpDenormalize(key.part["dmodq"].data); out += "Exponent2: " + dmodq.toString("base64") + "\n"; var iqmp = utils.mpDenormalize(key.part["iqmp"].data); out += "Coefficient: " + iqmp.toString("base64") + "\n"; var timestamp = new Date(); out += "Created: " + dnssecTimestamp(timestamp) + "\n"; out += "Publish: " + dnssecTimestamp(timestamp) + "\n"; out += "Activate: " + dnssecTimestamp(timestamp) + "\n"; return Buffer2.from(out, "ascii"); } function writeECDSA(key, options) { var out = ""; out += "Private-key-format: v1.3\n"; if (key.curve === "nistp256") { out += "Algorithm: 13 (ECDSAP256SHA256)\n"; } else if (key.curve === "nistp384") { out += "Algorithm: 14 (ECDSAP384SHA384)\n"; } else { throw new Error("Unsupported curve"); } var base64Key = key.part["d"].data.toString("base64"); out += "PrivateKey: " + base64Key + "\n"; var timestamp = new Date(); out += "Created: " + dnssecTimestamp(timestamp) + "\n"; out += "Publish: " + dnssecTimestamp(timestamp) + "\n"; out += "Activate: " + dnssecTimestamp(timestamp) + "\n"; return Buffer2.from(out, "ascii"); } function write(key, options) { if (PrivateKey.isPrivateKey(key)) { if (key.type === "rsa") { return writeRSA(key, options); } else if (key.type === "ecdsa") { return writeECDSA(key, options); } else { throw new Error("Unsupported algorithm: " + key.type); } } else if (Key.isKey(key)) { throw new Error('Format "dnssec" only supports writing private keys'); } else { throw new Error("key is not a Key or PrivateKey"); } } } }); // node_modules/sshpk/lib/formats/putty.js var require_putty = __commonJS({ "node_modules/sshpk/lib/formats/putty.js"(exports, module2) { module2.exports = { read, write }; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var rfc4253 = require_rfc4253(); var Key = require_key(); var SSHBuffer = require_ssh_buffer(); var crypto2 = require("crypto"); var PrivateKey = require_private_key(); var errors = require_errors2(); function read(buf, options) { var lines = buf.toString("ascii").split(/[\r\n]+/); var found = false; var parts; var si = 0; var formatVersion; while (si < lines.length) { parts = splitHeader(lines[si++]); if (parts) { formatVersion = { "putty-user-key-file-2": 2, "putty-user-key-file-3": 3 }[parts[0].toLowerCase()]; if (formatVersion) { found = true; break; } } } if (!found) { throw new Error("No PuTTY format first line found"); } var alg = parts[1]; parts = splitHeader(lines[si++]); assert.equal(parts[0].toLowerCase(), "encryption"); var encryption = parts[1]; parts = splitHeader(lines[si++]); assert.equal(parts[0].toLowerCase(), "comment"); var comment = parts[1]; parts = splitHeader(lines[si++]); assert.equal(parts[0].toLowerCase(), "public-lines"); var publicLines = parseInt(parts[1], 10); if (!isFinite(publicLines) || publicLines < 0 || publicLines > lines.length) { throw new Error("Invalid public-lines count"); } var publicBuf = Buffer2.from(lines.slice(si, si + publicLines).join(""), "base64"); var keyType = rfc4253.algToKeyType(alg); var key = rfc4253.read(publicBuf); if (key.type !== keyType) { throw new Error("Outer key algorithm mismatch"); } si += publicLines; if (lines[si]) { parts = splitHeader(lines[si++]); assert.equal(parts[0].toLowerCase(), "private-lines"); var privateLines = parseInt(parts[1], 10); if (!isFinite(privateLines) || privateLines < 0 || privateLines > lines.length) { throw new Error("Invalid private-lines count"); } var privateBuf = Buffer2.from(lines.slice(si, si + privateLines).join(""), "base64"); if (encryption !== "none" && formatVersion === 3) { throw new Error("Encrypted keys arenot supported for PuTTY format version 3"); } if (encryption === "aes256-cbc") { if (!options.passphrase) { throw new errors.KeyEncryptedError(options.filename, "PEM"); } var iv = Buffer2.alloc(16, 0); var decipher = crypto2.createDecipheriv("aes-256-cbc", derivePPK2EncryptionKey(options.passphrase), iv); decipher.setAutoPadding(false); privateBuf = Buffer2.concat([ decipher.update(privateBuf), decipher.final() ]); } key = new PrivateKey(key); if (key.type !== keyType) { throw new Error("Outer key algorithm mismatch"); } var sshbuf = new SSHBuffer({ buffer: privateBuf }); var privateKeyParts; if (alg === "ssh-dss") { privateKeyParts = [{ name: "x", data: sshbuf.readBuffer() }]; } else if (alg === "ssh-rsa") { privateKeyParts = [ { name: "d", data: sshbuf.readBuffer() }, { name: "p", data: sshbuf.readBuffer() }, { name: "q", data: sshbuf.readBuffer() }, { name: "iqmp", data: sshbuf.readBuffer() } ]; } else if (alg.match(/^ecdsa-sha2-nistp/)) { privateKeyParts = [{ name: "d", data: sshbuf.readBuffer() }]; } else if (alg === "ssh-ed25519") { privateKeyParts = [{ name: "k", data: sshbuf.readBuffer() }]; } else { throw new Error("Unsupported PPK key type: " + alg); } key = new PrivateKey({ type: key.type, parts: key.parts.concat(privateKeyParts) }); } key.comment = comment; return key; } function derivePPK2EncryptionKey(passphrase) { var hash1 = crypto2.createHash("sha1").update(Buffer2.concat([ Buffer2.from([0, 0, 0, 0]), Buffer2.from(passphrase) ])).digest(); var hash2 = crypto2.createHash("sha1").update(Buffer2.concat([ Buffer2.from([0, 0, 0, 1]), Buffer2.from(passphrase) ])).digest(); return Buffer2.concat([hash1, hash2]).slice(0, 32); } function splitHeader(line) { var idx = line.indexOf(":"); if (idx === -1) return null; var header = line.slice(0, idx); ++idx; while (line[idx] === " ") ++idx; var rest = line.slice(idx); return [header, rest]; } function write(key, options) { assert.object(key); if (!Key.isKey(key)) throw new Error("Must be a public key"); var alg = rfc4253.keyTypeToAlg(key); var buf = rfc4253.write(key); var comment = key.comment || ""; var b64 = buf.toString("base64"); var lines = wrap(b64, 64); lines.unshift("Public-Lines: " + lines.length); lines.unshift("Comment: " + comment); lines.unshift("Encryption: none"); lines.unshift("PuTTY-User-Key-File-2: " + alg); return Buffer2.from(lines.join("\n") + "\n"); } function wrap(txt, len) { var lines = []; var pos = 0; while (pos < txt.length) { lines.push(txt.slice(pos, pos + 64)); pos += 64; } return lines; } } }); // node_modules/sshpk/lib/formats/auto.js var require_auto = __commonJS({ "node_modules/sshpk/lib/formats/auto.js"(exports, module2) { module2.exports = { read, write }; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var pem = require_pem(); var ssh = require_ssh(); var rfc4253 = require_rfc4253(); var dnssec = require_dnssec(); var putty = require_putty(); var DNSSEC_PRIVKEY_HEADER_PREFIX = "Private-key-format: v1"; function read(buf, options) { if (typeof buf === "string") { if (buf.trim().match(/^[-]+[ ]*BEGIN/)) return pem.read(buf, options); if (buf.match(/^\s*ssh-[a-z]/)) return ssh.read(buf, options); if (buf.match(/^\s*ecdsa-/)) return ssh.read(buf, options); if (buf.match(/^putty-user-key-file-2:/i)) return putty.read(buf, options); if (findDNSSECHeader(buf)) return dnssec.read(buf, options); buf = Buffer2.from(buf, "binary"); } else { assert.buffer(buf); if (findPEMHeader(buf)) return pem.read(buf, options); if (findSSHHeader(buf)) return ssh.read(buf, options); if (findPuTTYHeader(buf)) return putty.read(buf, options); if (findDNSSECHeader(buf)) return dnssec.read(buf, options); } if (buf.readUInt32BE(0) < buf.length) return rfc4253.read(buf, options); throw new Error("Failed to auto-detect format of key"); } function findPuTTYHeader(buf) { var offset = 0; while (offset < buf.length && (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) ++offset; if (offset + 22 <= buf.length && buf.slice(offset, offset + 22).toString("ascii").toLowerCase() === "putty-user-key-file-2:") return true; return false; } function findSSHHeader(buf) { var offset = 0; while (offset < buf.length && (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) ++offset; if (offset + 4 <= buf.length && buf.slice(offset, offset + 4).toString("ascii") === "ssh-") return true; if (offset + 6 <= buf.length && buf.slice(offset, offset + 6).toString("ascii") === "ecdsa-") return true; return false; } function findPEMHeader(buf) { var offset = 0; while (offset < buf.length && (buf[offset] === 32 || buf[offset] === 10)) ++offset; if (buf[offset] !== 45) return false; while (offset < buf.length && buf[offset] === 45) ++offset; while (offset < buf.length && buf[offset] === 32) ++offset; if (offset + 5 > buf.length || buf.slice(offset, offset + 5).toString("ascii") !== "BEGIN") return false; return true; } function findDNSSECHeader(buf) { if (buf.length <= DNSSEC_PRIVKEY_HEADER_PREFIX.length) return false; var headerCheck = buf.slice(0, DNSSEC_PRIVKEY_HEADER_PREFIX.length); if (headerCheck.toString("ascii") === DNSSEC_PRIVKEY_HEADER_PREFIX) return true; if (typeof buf !== "string") { buf = buf.toString("ascii"); } var lines = buf.split("\n"); var line = 0; while (lines[line].match(/^\;/)) line++; if (lines[line].toString("ascii").match(/\. IN KEY /)) return true; if (lines[line].toString("ascii").match(/\. IN DNSKEY /)) return true; return false; } function write(key, options) { throw new Error('"auto" format cannot be used for writing'); } } }); // node_modules/sshpk/lib/private-key.js var require_private_key = __commonJS({ "node_modules/sshpk/lib/private-key.js"(exports, module2) { module2.exports = PrivateKey; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var crypto2 = require("crypto"); var Fingerprint = require_fingerprint(); var Signature = require_signature(); var errs = require_errors2(); var util = require("util"); var utils = require_utils2(); var dhe = require_dhe(); var generateECDSA = dhe.generateECDSA; var generateED25519 = dhe.generateED25519; var edCompat = require_ed_compat(); var nacl = require_nacl_fast(); var Key = require_key(); var InvalidAlgorithmError = errs.InvalidAlgorithmError; var KeyParseError = errs.KeyParseError; var KeyEncryptedError = errs.KeyEncryptedError; var formats = {}; formats["auto"] = require_auto(); formats["pem"] = require_pem(); formats["pkcs1"] = require_pkcs1(); formats["pkcs8"] = require_pkcs8(); formats["rfc4253"] = require_rfc4253(); formats["ssh-private"] = require_ssh_private(); formats["openssh"] = formats["ssh-private"]; formats["ssh"] = formats["ssh-private"]; formats["dnssec"] = require_dnssec(); formats["putty"] = require_putty(); function PrivateKey(opts) { assert.object(opts, "options"); Key.call(this, opts); this._pubCache = void 0; } util.inherits(PrivateKey, Key); PrivateKey.formats = formats; PrivateKey.prototype.toBuffer = function(format, options) { if (format === void 0) format = "pkcs1"; assert.string(format, "format"); assert.object(formats[format], "formats[format]"); assert.optionalObject(options, "options"); return formats[format].write(this, options); }; PrivateKey.prototype.hash = function(algo, type) { return this.toPublic().hash(algo, type); }; PrivateKey.prototype.fingerprint = function(algo, type) { return this.toPublic().fingerprint(algo, type); }; PrivateKey.prototype.toPublic = function() { if (this._pubCache) return this._pubCache; var algInfo = algs.info[this.type]; var pubParts = []; for (var i = 0; i < algInfo.parts.length; ++i) { var p = algInfo.parts[i]; pubParts.push(this.part[p]); } this._pubCache = new Key({ type: this.type, source: this, parts: pubParts }); if (this.comment) this._pubCache.comment = this.comment; return this._pubCache; }; PrivateKey.prototype.derive = function(newType) { assert.string(newType, "type"); var priv, pub, pair; if (this.type === "ed25519" && newType === "curve25519") { priv = this.part.k.data; if (priv[0] === 0) priv = priv.slice(1); pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); pub = Buffer2.from(pair.publicKey); return new PrivateKey({ type: "curve25519", parts: [ { name: "A", data: utils.mpNormalize(pub) }, { name: "k", data: utils.mpNormalize(priv) } ] }); } else if (this.type === "curve25519" && newType === "ed25519") { priv = this.part.k.data; if (priv[0] === 0) priv = priv.slice(1); pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); pub = Buffer2.from(pair.publicKey); return new PrivateKey({ type: "ed25519", parts: [ { name: "A", data: utils.mpNormalize(pub) }, { name: "k", data: utils.mpNormalize(priv) } ] }); } throw new Error("Key derivation not supported from " + this.type + " to " + newType); }; PrivateKey.prototype.createVerify = function(hashAlgo) { return this.toPublic().createVerify(hashAlgo); }; PrivateKey.prototype.createSign = function(hashAlgo) { if (hashAlgo === void 0) hashAlgo = this.defaultHashAlgorithm(); assert.string(hashAlgo, "hash algorithm"); if (this.type === "ed25519" && edCompat !== void 0) return new edCompat.Signer(this, hashAlgo); if (this.type === "curve25519") throw new Error("Curve25519 keys are not suitable for signing or verification"); var v, nm, err; try { nm = hashAlgo.toUpperCase(); v = crypto2.createSign(nm); } catch (e) { err = e; } if (v === void 0 || err instanceof Error && err.message.match(/Unknown message digest/)) { nm = "RSA-"; nm += hashAlgo.toUpperCase(); v = crypto2.createSign(nm); } assert.ok(v, "failed to create verifier"); var oldSign = v.sign.bind(v); var key = this.toBuffer("pkcs1"); var type = this.type; var curve = this.curve; v.sign = function() { var sig = oldSign(key); if (typeof sig === "string") sig = Buffer2.from(sig, "binary"); sig = Signature.parse(sig, type, "asn1"); sig.hashAlgorithm = hashAlgo; sig.curve = curve; return sig; }; return v; }; PrivateKey.parse = function(data, format, options) { if (typeof data !== "string") assert.buffer(data, "data"); if (format === void 0) format = "auto"; assert.string(format, "format"); if (typeof options === "string") options = { filename: options }; assert.optionalObject(options, "options"); if (options === void 0) options = {}; assert.optionalString(options.filename, "options.filename"); if (options.filename === void 0) options.filename = "(unnamed)"; assert.object(formats[format], "formats[format]"); try { var k = formats[format].read(data, options); assert.ok(k instanceof PrivateKey, "key is not a private key"); if (!k.comment) k.comment = options.filename; return k; } catch (e) { if (e.name === "KeyEncryptedError") throw e; throw new KeyParseError(options.filename, format, e); } }; PrivateKey.isPrivateKey = function(obj, ver) { return utils.isCompatible(obj, PrivateKey, ver); }; PrivateKey.generate = function(type, options) { if (options === void 0) options = {}; assert.object(options, "options"); switch (type) { case "ecdsa": if (options.curve === void 0) options.curve = "nistp256"; assert.string(options.curve, "options.curve"); return generateECDSA(options.curve); case "ed25519": return generateED25519(); default: throw new Error('Key generation not supported with key type "' + type + '"'); } }; PrivateKey.prototype._sshpkApiVersion = [1, 6]; PrivateKey._oldVersionDetect = function(obj) { assert.func(obj.toPublic); assert.func(obj.createSign); if (obj.derive) return [1, 3]; if (obj.defaultHashAlgorithm) return [1, 2]; if (obj.formats["auto"]) return [1, 1]; return [1, 0]; }; } }); // node_modules/sshpk/lib/identity.js var require_identity = __commonJS({ "node_modules/sshpk/lib/identity.js"(exports, module2) { module2.exports = Identity; var assert = require_assert(); var algs = require_algs(); var crypto2 = require("crypto"); var Fingerprint = require_fingerprint(); var Signature = require_signature(); var errs = require_errors2(); var util = require("util"); var utils = require_utils2(); var asn1 = require_lib(); var Buffer2 = require_safer().Buffer; var DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\-]{0,62})(?:\.([*]|[a-z0-9][a-z0-9\-]{0,62}))*$/i; var oids = {}; oids.cn = "2.5.4.3"; oids.o = "2.5.4.10"; oids.ou = "2.5.4.11"; oids.l = "2.5.4.7"; oids.s = "2.5.4.8"; oids.c = "2.5.4.6"; oids.sn = "2.5.4.4"; oids.postalCode = "2.5.4.17"; oids.serialNumber = "2.5.4.5"; oids.street = "2.5.4.9"; oids.x500UniqueIdentifier = "2.5.4.45"; oids.role = "2.5.4.72"; oids.telephoneNumber = "2.5.4.20"; oids.description = "2.5.4.13"; oids.dc = "0.9.2342.19200300.100.1.25"; oids.uid = "0.9.2342.19200300.100.1.1"; oids.mail = "0.9.2342.19200300.100.1.3"; oids.title = "2.5.4.12"; oids.gn = "2.5.4.42"; oids.initials = "2.5.4.43"; oids.pseudonym = "2.5.4.65"; oids.emailAddress = "1.2.840.113549.1.9.1"; var unoids = {}; Object.keys(oids).forEach(function(k) { unoids[oids[k]] = k; }); function Identity(opts) { var self2 = this; assert.object(opts, "options"); assert.arrayOfObject(opts.components, "options.components"); this.components = opts.components; this.componentLookup = {}; this.components.forEach(function(c) { if (c.name && !c.oid) c.oid = oids[c.name]; if (c.oid && !c.name) c.name = unoids[c.oid]; if (self2.componentLookup[c.name] === void 0) self2.componentLookup[c.name] = []; self2.componentLookup[c.name].push(c); }); if (this.componentLookup.cn && this.componentLookup.cn.length > 0) { this.cn = this.componentLookup.cn[0].value; } assert.optionalString(opts.type, "options.type"); if (opts.type === void 0) { if (this.components.length === 1 && this.componentLookup.cn && this.componentLookup.cn.length === 1 && this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { this.type = "host"; this.hostname = this.componentLookup.cn[0].value; } else if (this.componentLookup.dc && this.components.length === this.componentLookup.dc.length) { this.type = "host"; this.hostname = this.componentLookup.dc.map(function(c) { return c.value; }).join("."); } else if (this.componentLookup.uid && this.components.length === this.componentLookup.uid.length) { this.type = "user"; this.uid = this.componentLookup.uid[0].value; } else if (this.componentLookup.cn && this.componentLookup.cn.length === 1 && this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { this.type = "host"; this.hostname = this.componentLookup.cn[0].value; } else if (this.componentLookup.uid && this.componentLookup.uid.length === 1) { this.type = "user"; this.uid = this.componentLookup.uid[0].value; } else if (this.componentLookup.mail && this.componentLookup.mail.length === 1) { this.type = "email"; this.email = this.componentLookup.mail[0].value; } else if (this.componentLookup.cn && this.componentLookup.cn.length === 1) { this.type = "user"; this.uid = this.componentLookup.cn[0].value; } else { this.type = "unknown"; } } else { this.type = opts.type; if (this.type === "host") this.hostname = opts.hostname; else if (this.type === "user") this.uid = opts.uid; else if (this.type === "email") this.email = opts.email; else throw new Error("Unknown type " + this.type); } } Identity.prototype.toString = function() { return this.components.map(function(c) { var n = c.name.toUpperCase(); n = n.replace(/=/g, "\\="); var v = c.value; v = v.replace(/,/g, "\\,"); return n + "=" + v; }).join(", "); }; Identity.prototype.get = function(name, asArray) { assert.string(name, "name"); var arr = this.componentLookup[name]; if (arr === void 0 || arr.length === 0) return void 0; if (!asArray && arr.length > 1) throw new Error("Multiple values for attribute " + name); if (!asArray) return arr[0].value; return arr.map(function(c) { return c.value; }); }; Identity.prototype.toArray = function(idx) { return this.components.map(function(c) { return { name: c.name, value: c.value }; }); }; var NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\/:=?-]/; var NOT_IA5 = /[^\x00-\x7f]/; Identity.prototype.toAsn1 = function(der, tag) { der.startSequence(tag); this.components.forEach(function(c) { der.startSequence(asn1.Ber.Constructor | asn1.Ber.Set); der.startSequence(); der.writeOID(c.oid); if (c.asn1type === asn1.Ber.Utf8String || c.value.match(NOT_IA5)) { var v = Buffer2.from(c.value, "utf8"); der.writeBuffer(v, asn1.Ber.Utf8String); } else if (c.asn1type === asn1.Ber.IA5String || c.value.match(NOT_PRINTABLE)) { der.writeString(c.value, asn1.Ber.IA5String); } else { var type = asn1.Ber.PrintableString; if (c.asn1type !== void 0) type = c.asn1type; der.writeString(c.value, type); } der.endSequence(); der.endSequence(); }); der.endSequence(); }; function globMatch(a, b) { if (a === "**" || b === "**") return true; var aParts = a.split("."); var bParts = b.split("."); if (aParts.length !== bParts.length) return false; for (var i = 0; i < aParts.length; ++i) { if (aParts[i] === "*" || bParts[i] === "*") continue; if (aParts[i] !== bParts[i]) return false; } return true; } Identity.prototype.equals = function(other) { if (!Identity.isIdentity(other, [1, 0])) return false; if (other.components.length !== this.components.length) return false; for (var i = 0; i < this.components.length; ++i) { if (this.components[i].oid !== other.components[i].oid) return false; if (!globMatch(this.components[i].value, other.components[i].value)) { return false; } } return true; }; Identity.forHost = function(hostname) { assert.string(hostname, "hostname"); return new Identity({ type: "host", hostname, components: [{ name: "cn", value: hostname }] }); }; Identity.forUser = function(uid) { assert.string(uid, "uid"); return new Identity({ type: "user", uid, components: [{ name: "uid", value: uid }] }); }; Identity.forEmail = function(email) { assert.string(email, "email"); return new Identity({ type: "email", email, components: [{ name: "mail", value: email }] }); }; Identity.parseDN = function(dn) { assert.string(dn, "dn"); var parts = [""]; var idx = 0; var rem = dn; while (rem.length > 0) { var m; if ((m = /^,/.exec(rem)) !== null) { parts[++idx] = ""; rem = rem.slice(m[0].length); } else if ((m = /^\\,/.exec(rem)) !== null) { parts[idx] += ","; rem = rem.slice(m[0].length); } else if ((m = /^\\./.exec(rem)) !== null) { parts[idx] += m[0]; rem = rem.slice(m[0].length); } else if ((m = /^[^\\,]+/.exec(rem)) !== null) { parts[idx] += m[0]; rem = rem.slice(m[0].length); } else { throw new Error("Failed to parse DN"); } } var cmps = parts.map(function(c) { c = c.trim(); var eqPos = c.indexOf("="); while (eqPos > 0 && c.charAt(eqPos - 1) === "\\") eqPos = c.indexOf("=", eqPos + 1); if (eqPos === -1) { throw new Error("Failed to parse DN"); } var name = c.slice(0, eqPos).toLowerCase().replace(/\\=/g, "="); var value = c.slice(eqPos + 1); return { name, value }; }); return new Identity({ components: cmps }); }; Identity.fromArray = function(components) { assert.arrayOfObject(components, "components"); components.forEach(function(cmp) { assert.object(cmp, "component"); assert.string(cmp.name, "component.name"); if (!Buffer2.isBuffer(cmp.value) && !(typeof cmp.value === "string")) { throw new Error("Invalid component value"); } }); return new Identity({ components }); }; Identity.parseAsn1 = function(der, top) { var components = []; der.readSequence(top); var end = der.offset + der.length; while (der.offset < end) { der.readSequence(asn1.Ber.Constructor | asn1.Ber.Set); var after = der.offset + der.length; der.readSequence(); var oid = der.readOID(); var type = der.peek(); var value; switch (type) { case asn1.Ber.PrintableString: case asn1.Ber.IA5String: case asn1.Ber.OctetString: case asn1.Ber.T61String: value = der.readString(type); break; case asn1.Ber.Utf8String: value = der.readString(type, true); value = value.toString("utf8"); break; case asn1.Ber.CharacterString: case asn1.Ber.BMPString: value = der.readString(type, true); value = value.toString("utf16le"); break; default: throw new Error("Unknown asn1 type " + type); } components.push({ oid, asn1type: type, value }); der._offset = after; } der._offset = end; return new Identity({ components }); }; Identity.isIdentity = function(obj, ver) { return utils.isCompatible(obj, Identity, ver); }; Identity.prototype._sshpkApiVersion = [1, 0]; Identity._oldVersionDetect = function(obj) { return [1, 0]; }; } }); // node_modules/sshpk/lib/formats/openssh-cert.js var require_openssh_cert = __commonJS({ "node_modules/sshpk/lib/formats/openssh-cert.js"(exports, module2) { module2.exports = { read, verify, sign, signAsync, write, fromBuffer, toBuffer }; var assert = require_assert(); var SSHBuffer = require_ssh_buffer(); var crypto2 = require("crypto"); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var Key = require_key(); var PrivateKey = require_private_key(); var Identity = require_identity(); var rfc4253 = require_rfc4253(); var Signature = require_signature(); var utils = require_utils2(); var Certificate = require_certificate(); function verify(cert, key) { return false; } var TYPES = { "user": 1, "host": 2 }; Object.keys(TYPES).forEach(function(k) { TYPES[TYPES[k]] = k; }); var ECDSA_ALGO = /^ecdsa-sha2-([^@-]+)-cert-v01@openssh.com$/; function read(buf, options) { if (Buffer2.isBuffer(buf)) buf = buf.toString("ascii"); var parts = buf.trim().split(/[ \t\n]+/g); if (parts.length < 2 || parts.length > 3) throw new Error("Not a valid SSH certificate line"); var algo = parts[0]; var data = parts[1]; data = Buffer2.from(data, "base64"); return fromBuffer(data, algo); } function fromBuffer(data, algo, partial) { var sshbuf = new SSHBuffer({ buffer: data }); var innerAlgo = sshbuf.readString(); if (algo !== void 0 && innerAlgo !== algo) throw new Error("SSH certificate algorithm mismatch"); if (algo === void 0) algo = innerAlgo; var cert = {}; cert.signatures = {}; cert.signatures.openssh = {}; cert.signatures.openssh.nonce = sshbuf.readBuffer(); var key = {}; var parts = key.parts = []; key.type = getAlg(algo); var partCount = algs.info[key.type].parts.length; while (parts.length < partCount) parts.push(sshbuf.readPart()); assert.ok(parts.length >= 1, "key must have at least one part"); var algInfo = algs.info[key.type]; if (key.type === "ecdsa") { var res = ECDSA_ALGO.exec(algo); assert.ok(res !== null); assert.strictEqual(res[1], parts[0].data.toString()); } for (var i = 0; i < algInfo.parts.length; ++i) { parts[i].name = algInfo.parts[i]; if (parts[i].name !== "curve" && algInfo.normalize !== false) { var p = parts[i]; p.data = utils.mpNormalize(p.data); } } cert.subjectKey = new Key(key); cert.serial = sshbuf.readInt64(); var type = TYPES[sshbuf.readInt()]; assert.string(type, "valid cert type"); cert.signatures.openssh.keyId = sshbuf.readString(); var principals = []; var pbuf = sshbuf.readBuffer(); var psshbuf = new SSHBuffer({ buffer: pbuf }); while (!psshbuf.atEnd()) principals.push(psshbuf.readString()); if (principals.length === 0) principals = ["*"]; cert.subjects = principals.map(function(pr) { if (type === "user") return Identity.forUser(pr); else if (type === "host") return Identity.forHost(pr); throw new Error("Unknown identity type " + type); }); cert.validFrom = int64ToDate(sshbuf.readInt64()); cert.validUntil = int64ToDate(sshbuf.readInt64()); var exts = []; var extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); var ext; while (!extbuf.atEnd()) { ext = { critical: true }; ext.name = extbuf.readString(); ext.data = extbuf.readBuffer(); exts.push(ext); } extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); while (!extbuf.atEnd()) { ext = { critical: false }; ext.name = extbuf.readString(); ext.data = extbuf.readBuffer(); exts.push(ext); } cert.signatures.openssh.exts = exts; sshbuf.readBuffer(); var signingKeyBuf = sshbuf.readBuffer(); cert.issuerKey = rfc4253.read(signingKeyBuf); cert.issuer = Identity.forHost("**"); var sigBuf = sshbuf.readBuffer(); cert.signatures.openssh.signature = Signature.parse(sigBuf, cert.issuerKey.type, "ssh"); if (partial !== void 0) { partial.remainder = sshbuf.remainder(); partial.consumed = sshbuf._offset; } return new Certificate(cert); } function int64ToDate(buf) { var i = buf.readUInt32BE(0) * 4294967296; i += buf.readUInt32BE(4); var d = new Date(); d.setTime(i * 1e3); d.sourceInt64 = buf; return d; } function dateToInt64(date) { if (date.sourceInt64 !== void 0) return date.sourceInt64; var i = Math.round(date.getTime() / 1e3); var upper = Math.floor(i / 4294967296); var lower = Math.floor(i % 4294967296); var buf = Buffer2.alloc(8); buf.writeUInt32BE(upper, 0); buf.writeUInt32BE(lower, 4); return buf; } function sign(cert, key) { if (cert.signatures.openssh === void 0) cert.signatures.openssh = {}; try { var blob = toBuffer(cert, true); } catch (e) { delete cert.signatures.openssh; return false; } var sig = cert.signatures.openssh; var hashAlgo = void 0; if (key.type === "rsa" || key.type === "dsa") hashAlgo = "sha1"; var signer = key.createSign(hashAlgo); signer.write(blob); sig.signature = signer.sign(); return true; } function signAsync(cert, signer, done) { if (cert.signatures.openssh === void 0) cert.signatures.openssh = {}; try { var blob = toBuffer(cert, true); } catch (e) { delete cert.signatures.openssh; done(e); return; } var sig = cert.signatures.openssh; signer(blob, function(err, signature) { if (err) { done(err); return; } try { signature.toBuffer("ssh"); } catch (e) { done(e); return; } sig.signature = signature; done(); }); } function write(cert, options) { if (options === void 0) options = {}; var blob = toBuffer(cert); var out = getCertType(cert.subjectKey) + " " + blob.toString("base64"); if (options.comment) out = out + " " + options.comment; return out; } function toBuffer(cert, noSig) { assert.object(cert.signatures.openssh, "signature for openssh format"); var sig = cert.signatures.openssh; if (sig.nonce === void 0) sig.nonce = crypto2.randomBytes(16); var buf = new SSHBuffer({}); buf.writeString(getCertType(cert.subjectKey)); buf.writeBuffer(sig.nonce); var key = cert.subjectKey; var algInfo = algs.info[key.type]; algInfo.parts.forEach(function(part) { buf.writePart(key.part[part]); }); buf.writeInt64(cert.serial); var type = cert.subjects[0].type; assert.notStrictEqual(type, "unknown"); cert.subjects.forEach(function(id) { assert.strictEqual(id.type, type); }); type = TYPES[type]; buf.writeInt(type); if (sig.keyId === void 0) { sig.keyId = cert.subjects[0].type + "_" + (cert.subjects[0].uid || cert.subjects[0].hostname); } buf.writeString(sig.keyId); var sub = new SSHBuffer({}); cert.subjects.forEach(function(id) { if (type === TYPES.host) sub.writeString(id.hostname); else if (type === TYPES.user) sub.writeString(id.uid); }); buf.writeBuffer(sub.toBuffer()); buf.writeInt64(dateToInt64(cert.validFrom)); buf.writeInt64(dateToInt64(cert.validUntil)); var exts = sig.exts; if (exts === void 0) exts = []; var extbuf = new SSHBuffer({}); exts.forEach(function(ext) { if (ext.critical !== true) return; extbuf.writeString(ext.name); extbuf.writeBuffer(ext.data); }); buf.writeBuffer(extbuf.toBuffer()); extbuf = new SSHBuffer({}); exts.forEach(function(ext) { if (ext.critical === true) return; extbuf.writeString(ext.name); extbuf.writeBuffer(ext.data); }); buf.writeBuffer(extbuf.toBuffer()); buf.writeBuffer(Buffer2.alloc(0)); sub = rfc4253.write(cert.issuerKey); buf.writeBuffer(sub); if (!noSig) buf.writeBuffer(sig.signature.toBuffer("ssh")); return buf.toBuffer(); } function getAlg(certType) { if (certType === "ssh-rsa-cert-v01@openssh.com") return "rsa"; if (certType === "ssh-dss-cert-v01@openssh.com") return "dsa"; if (certType.match(ECDSA_ALGO)) return "ecdsa"; if (certType === "ssh-ed25519-cert-v01@openssh.com") return "ed25519"; throw new Error("Unsupported cert type " + certType); } function getCertType(key) { if (key.type === "rsa") return "ssh-rsa-cert-v01@openssh.com"; if (key.type === "dsa") return "ssh-dss-cert-v01@openssh.com"; if (key.type === "ecdsa") return "ecdsa-sha2-" + key.curve + "-cert-v01@openssh.com"; if (key.type === "ed25519") return "ssh-ed25519-cert-v01@openssh.com"; throw new Error("Unsupported key type " + key.type); } } }); // node_modules/sshpk/lib/formats/x509.js var require_x509 = __commonJS({ "node_modules/sshpk/lib/formats/x509.js"(exports, module2) { module2.exports = { read, verify, sign, signAsync, write }; var assert = require_assert(); var asn1 = require_lib(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var pem = require_pem(); var Identity = require_identity(); var Signature = require_signature(); var Certificate = require_certificate(); var pkcs8 = require_pkcs8(); function readMPInt(der, nm) { assert.strictEqual(der.peek(), asn1.Ber.Integer, nm + " is not an Integer"); return utils.mpNormalize(der.readString(asn1.Ber.Integer, true)); } function verify(cert, key) { var sig = cert.signatures.x509; assert.object(sig, "x509 signature"); var algParts = sig.algo.split("-"); if (algParts[0] !== key.type) return false; var blob = sig.cache; if (blob === void 0) { var der = new asn1.BerWriter(); writeTBSCert(cert, der); blob = der.buffer; } var verifier = key.createVerify(algParts[1]); verifier.write(blob); return verifier.verify(sig.signature); } function Local(i) { return asn1.Ber.Context | asn1.Ber.Constructor | i; } function Context(i) { return asn1.Ber.Context | i; } var SIGN_ALGS = { "rsa-md5": "1.2.840.113549.1.1.4", "rsa-sha1": "1.2.840.113549.1.1.5", "rsa-sha256": "1.2.840.113549.1.1.11", "rsa-sha384": "1.2.840.113549.1.1.12", "rsa-sha512": "1.2.840.113549.1.1.13", "dsa-sha1": "1.2.840.10040.4.3", "dsa-sha256": "2.16.840.1.101.3.4.3.2", "ecdsa-sha1": "1.2.840.10045.4.1", "ecdsa-sha256": "1.2.840.10045.4.3.2", "ecdsa-sha384": "1.2.840.10045.4.3.3", "ecdsa-sha512": "1.2.840.10045.4.3.4", "ed25519-sha512": "1.3.101.112" }; Object.keys(SIGN_ALGS).forEach(function(k) { SIGN_ALGS[SIGN_ALGS[k]] = k; }); SIGN_ALGS["1.3.14.3.2.3"] = "rsa-md5"; SIGN_ALGS["1.3.14.3.2.29"] = "rsa-sha1"; var EXTS = { "issuerKeyId": "2.5.29.35", "altName": "2.5.29.17", "basicConstraints": "2.5.29.19", "keyUsage": "2.5.29.15", "extKeyUsage": "2.5.29.37" }; function read(buf, options) { if (typeof buf === "string") { buf = Buffer2.from(buf, "binary"); } assert.buffer(buf, "buf"); var der = new asn1.BerReader(buf); der.readSequence(); if (Math.abs(der.length - der.remain) > 1) { throw new Error("DER sequence does not contain whole byte stream"); } var tbsStart = der.offset; der.readSequence(); var sigOffset = der.offset + der.length; var tbsEnd = sigOffset; if (der.peek() === Local(0)) { der.readSequence(Local(0)); var version = der.readInt(); assert.ok(version <= 3, "only x.509 versions up to v3 supported"); } var cert = {}; cert.signatures = {}; var sig = cert.signatures.x509 = {}; sig.extras = {}; cert.serial = readMPInt(der, "serial"); der.readSequence(); var after = der.offset + der.length; var certAlgOid = der.readOID(); var certAlg = SIGN_ALGS[certAlgOid]; if (certAlg === void 0) throw new Error("unknown signature algorithm " + certAlgOid); der._offset = after; cert.issuer = Identity.parseAsn1(der); der.readSequence(); cert.validFrom = readDate(der); cert.validUntil = readDate(der); cert.subjects = [Identity.parseAsn1(der)]; der.readSequence(); after = der.offset + der.length; cert.subjectKey = pkcs8.readPkcs8(void 0, "public", der); der._offset = after; if (der.peek() === Local(1)) { der.readSequence(Local(1)); sig.extras.issuerUniqueID = buf.slice(der.offset, der.offset + der.length); der._offset += der.length; } if (der.peek() === Local(2)) { der.readSequence(Local(2)); sig.extras.subjectUniqueID = buf.slice(der.offset, der.offset + der.length); der._offset += der.length; } if (der.peek() === Local(3)) { der.readSequence(Local(3)); var extEnd = der.offset + der.length; der.readSequence(); while (der.offset < extEnd) readExtension(cert, buf, der); assert.strictEqual(der.offset, extEnd); } assert.strictEqual(der.offset, sigOffset); der.readSequence(); after = der.offset + der.length; var sigAlgOid = der.readOID(); var sigAlg = SIGN_ALGS[sigAlgOid]; if (sigAlg === void 0) throw new Error("unknown signature algorithm " + sigAlgOid); der._offset = after; var sigData = der.readString(asn1.Ber.BitString, true); if (sigData[0] === 0) sigData = sigData.slice(1); var algParts = sigAlg.split("-"); sig.signature = Signature.parse(sigData, algParts[0], "asn1"); sig.signature.hashAlgorithm = algParts[1]; sig.algo = sigAlg; sig.cache = buf.slice(tbsStart, tbsEnd); return new Certificate(cert); } function readDate(der) { if (der.peek() === asn1.Ber.UTCTime) { return utcTimeToDate(der.readString(asn1.Ber.UTCTime)); } else if (der.peek() === asn1.Ber.GeneralizedTime) { return gTimeToDate(der.readString(asn1.Ber.GeneralizedTime)); } else { throw new Error("Unsupported date format"); } } function writeDate(der, date) { if (date.getUTCFullYear() >= 2050 || date.getUTCFullYear() < 1950) { der.writeString(dateToGTime(date), asn1.Ber.GeneralizedTime); } else { der.writeString(dateToUTCTime(date), asn1.Ber.UTCTime); } } var ALTNAME = { OtherName: Local(0), RFC822Name: Context(1), DNSName: Context(2), X400Address: Local(3), DirectoryName: Local(4), EDIPartyName: Local(5), URI: Context(6), IPAddress: Context(7), OID: Context(8) }; var EXTPURPOSE = { "serverAuth": "1.3.6.1.5.5.7.3.1", "clientAuth": "1.3.6.1.5.5.7.3.2", "codeSigning": "1.3.6.1.5.5.7.3.3", "joyentDocker": "1.3.6.1.4.1.38678.1.4.1", "joyentCmon": "1.3.6.1.4.1.38678.1.4.2" }; var EXTPURPOSE_REV = {}; Object.keys(EXTPURPOSE).forEach(function(k) { EXTPURPOSE_REV[EXTPURPOSE[k]] = k; }); var KEYUSEBITS = [ "signature", "identity", "keyEncryption", "encryption", "keyAgreement", "ca", "crl" ]; function readExtension(cert, buf, der) { der.readSequence(); var after = der.offset + der.length; var extId = der.readOID(); var id; var sig = cert.signatures.x509; if (!sig.extras.exts) sig.extras.exts = []; var critical; if (der.peek() === asn1.Ber.Boolean) critical = der.readBoolean(); switch (extId) { case EXTS.basicConstraints: der.readSequence(asn1.Ber.OctetString); der.readSequence(); var bcEnd = der.offset + der.length; var ca = false; if (der.peek() === asn1.Ber.Boolean) ca = der.readBoolean(); if (cert.purposes === void 0) cert.purposes = []; if (ca === true) cert.purposes.push("ca"); var bc = { oid: extId, critical }; if (der.offset < bcEnd && der.peek() === asn1.Ber.Integer) bc.pathLen = der.readInt(); sig.extras.exts.push(bc); break; case EXTS.extKeyUsage: der.readSequence(asn1.Ber.OctetString); der.readSequence(); if (cert.purposes === void 0) cert.purposes = []; var ekEnd = der.offset + der.length; while (der.offset < ekEnd) { var oid = der.readOID(); cert.purposes.push(EXTPURPOSE_REV[oid] || oid); } if (cert.purposes.indexOf("serverAuth") !== -1 && cert.purposes.indexOf("clientAuth") === -1) { cert.subjects.forEach(function(ide) { if (ide.type !== "host") { ide.type = "host"; ide.hostname = ide.uid || ide.email || ide.components[0].value; } }); } else if (cert.purposes.indexOf("clientAuth") !== -1 && cert.purposes.indexOf("serverAuth") === -1) { cert.subjects.forEach(function(ide) { if (ide.type !== "user") { ide.type = "user"; ide.uid = ide.hostname || ide.email || ide.components[0].value; } }); } sig.extras.exts.push({ oid: extId, critical }); break; case EXTS.keyUsage: der.readSequence(asn1.Ber.OctetString); var bits = der.readString(asn1.Ber.BitString, true); var setBits = readBitField(bits, KEYUSEBITS); setBits.forEach(function(bit) { if (cert.purposes === void 0) cert.purposes = []; if (cert.purposes.indexOf(bit) === -1) cert.purposes.push(bit); }); sig.extras.exts.push({ oid: extId, critical, bits }); break; case EXTS.altName: der.readSequence(asn1.Ber.OctetString); der.readSequence(); var aeEnd = der.offset + der.length; while (der.offset < aeEnd) { switch (der.peek()) { case ALTNAME.OtherName: case ALTNAME.EDIPartyName: der.readSequence(); der._offset += der.length; break; case ALTNAME.OID: der.readOID(ALTNAME.OID); break; case ALTNAME.RFC822Name: var email = der.readString(ALTNAME.RFC822Name); id = Identity.forEmail(email); if (!cert.subjects[0].equals(id)) cert.subjects.push(id); break; case ALTNAME.DirectoryName: der.readSequence(ALTNAME.DirectoryName); id = Identity.parseAsn1(der); if (!cert.subjects[0].equals(id)) cert.subjects.push(id); break; case ALTNAME.DNSName: var host = der.readString(ALTNAME.DNSName); id = Identity.forHost(host); if (!cert.subjects[0].equals(id)) cert.subjects.push(id); break; default: der.readString(der.peek()); break; } } sig.extras.exts.push({ oid: extId, critical }); break; default: sig.extras.exts.push({ oid: extId, critical, data: der.readString(asn1.Ber.OctetString, true) }); break; } der._offset = after; } var UTCTIME_RE = /^([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; function utcTimeToDate(t) { var m = t.match(UTCTIME_RE); assert.ok(m, "timestamps must be in UTC"); var d = new Date(); var thisYear = d.getUTCFullYear(); var century = Math.floor(thisYear / 100) * 100; var year = parseInt(m[1], 10); if (thisYear % 100 < 50 && year >= 60) year += century - 1; else year += century; d.setUTCFullYear(year, parseInt(m[2], 10) - 1, parseInt(m[3], 10)); d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); if (m[6] && m[6].length > 0) d.setUTCSeconds(parseInt(m[6], 10)); return d; } var GTIME_RE = /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; function gTimeToDate(t) { var m = t.match(GTIME_RE); assert.ok(m); var d = new Date(); d.setUTCFullYear(parseInt(m[1], 10), parseInt(m[2], 10) - 1, parseInt(m[3], 10)); d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); if (m[6] && m[6].length > 0) d.setUTCSeconds(parseInt(m[6], 10)); return d; } function zeroPad(n, m) { if (m === void 0) m = 2; var s = "" + n; while (s.length < m) s = "0" + s; return s; } function dateToUTCTime(d) { var s = ""; s += zeroPad(d.getUTCFullYear() % 100); s += zeroPad(d.getUTCMonth() + 1); s += zeroPad(d.getUTCDate()); s += zeroPad(d.getUTCHours()); s += zeroPad(d.getUTCMinutes()); s += zeroPad(d.getUTCSeconds()); s += "Z"; return s; } function dateToGTime(d) { var s = ""; s += zeroPad(d.getUTCFullYear(), 4); s += zeroPad(d.getUTCMonth() + 1); s += zeroPad(d.getUTCDate()); s += zeroPad(d.getUTCHours()); s += zeroPad(d.getUTCMinutes()); s += zeroPad(d.getUTCSeconds()); s += "Z"; return s; } function sign(cert, key) { if (cert.signatures.x509 === void 0) cert.signatures.x509 = {}; var sig = cert.signatures.x509; sig.algo = key.type + "-" + key.defaultHashAlgorithm(); if (SIGN_ALGS[sig.algo] === void 0) return false; var der = new asn1.BerWriter(); writeTBSCert(cert, der); var blob = der.buffer; sig.cache = blob; var signer = key.createSign(); signer.write(blob); cert.signatures.x509.signature = signer.sign(); return true; } function signAsync(cert, signer, done) { if (cert.signatures.x509 === void 0) cert.signatures.x509 = {}; var sig = cert.signatures.x509; var der = new asn1.BerWriter(); writeTBSCert(cert, der); var blob = der.buffer; sig.cache = blob; signer(blob, function(err, signature) { if (err) { done(err); return; } sig.algo = signature.type + "-" + signature.hashAlgorithm; if (SIGN_ALGS[sig.algo] === void 0) { done(new Error('Invalid signing algorithm "' + sig.algo + '"')); return; } sig.signature = signature; done(); }); } function write(cert, options) { var sig = cert.signatures.x509; assert.object(sig, "x509 signature"); var der = new asn1.BerWriter(); der.startSequence(); if (sig.cache) { der._ensure(sig.cache.length); sig.cache.copy(der._buf, der._offset); der._offset += sig.cache.length; } else { writeTBSCert(cert, der); } der.startSequence(); der.writeOID(SIGN_ALGS[sig.algo]); if (sig.algo.match(/^rsa-/)) der.writeNull(); der.endSequence(); var sigData = sig.signature.toBuffer("asn1"); var data = Buffer2.alloc(sigData.length + 1); data[0] = 0; sigData.copy(data, 1); der.writeBuffer(data, asn1.Ber.BitString); der.endSequence(); return der.buffer; } function writeTBSCert(cert, der) { var sig = cert.signatures.x509; assert.object(sig, "x509 signature"); der.startSequence(); der.startSequence(Local(0)); der.writeInt(2); der.endSequence(); der.writeBuffer(utils.mpNormalize(cert.serial), asn1.Ber.Integer); der.startSequence(); der.writeOID(SIGN_ALGS[sig.algo]); if (sig.algo.match(/^rsa-/)) der.writeNull(); der.endSequence(); cert.issuer.toAsn1(der); der.startSequence(); writeDate(der, cert.validFrom); writeDate(der, cert.validUntil); der.endSequence(); var subject = cert.subjects[0]; var altNames = cert.subjects.slice(1); subject.toAsn1(der); pkcs8.writePkcs8(der, cert.subjectKey); if (sig.extras && sig.extras.issuerUniqueID) { der.writeBuffer(sig.extras.issuerUniqueID, Local(1)); } if (sig.extras && sig.extras.subjectUniqueID) { der.writeBuffer(sig.extras.subjectUniqueID, Local(2)); } if (altNames.length > 0 || subject.type === "host" || cert.purposes !== void 0 && cert.purposes.length > 0 || sig.extras && sig.extras.exts) { der.startSequence(Local(3)); der.startSequence(); var exts = []; if (cert.purposes !== void 0 && cert.purposes.length > 0) { exts.push({ oid: EXTS.basicConstraints, critical: true }); exts.push({ oid: EXTS.keyUsage, critical: true }); exts.push({ oid: EXTS.extKeyUsage, critical: true }); } exts.push({ oid: EXTS.altName }); if (sig.extras && sig.extras.exts) exts = sig.extras.exts; for (var i = 0; i < exts.length; ++i) { der.startSequence(); der.writeOID(exts[i].oid); if (exts[i].critical !== void 0) der.writeBoolean(exts[i].critical); if (exts[i].oid === EXTS.altName) { der.startSequence(asn1.Ber.OctetString); der.startSequence(); if (subject.type === "host") { der.writeString(subject.hostname, Context(2)); } for (var j = 0; j < altNames.length; ++j) { if (altNames[j].type === "host") { der.writeString(altNames[j].hostname, ALTNAME.DNSName); } else if (altNames[j].type === "email") { der.writeString(altNames[j].email, ALTNAME.RFC822Name); } else { der.startSequence(ALTNAME.DirectoryName); altNames[j].toAsn1(der); der.endSequence(); } } der.endSequence(); der.endSequence(); } else if (exts[i].oid === EXTS.basicConstraints) { der.startSequence(asn1.Ber.OctetString); der.startSequence(); var ca = cert.purposes.indexOf("ca") !== -1; var pathLen = exts[i].pathLen; der.writeBoolean(ca); if (pathLen !== void 0) der.writeInt(pathLen); der.endSequence(); der.endSequence(); } else if (exts[i].oid === EXTS.extKeyUsage) { der.startSequence(asn1.Ber.OctetString); der.startSequence(); cert.purposes.forEach(function(purpose) { if (purpose === "ca") return; if (KEYUSEBITS.indexOf(purpose) !== -1) return; var oid = purpose; if (EXTPURPOSE[purpose] !== void 0) oid = EXTPURPOSE[purpose]; der.writeOID(oid); }); der.endSequence(); der.endSequence(); } else if (exts[i].oid === EXTS.keyUsage) { der.startSequence(asn1.Ber.OctetString); if (exts[i].bits !== void 0) { der.writeBuffer(exts[i].bits, asn1.Ber.BitString); } else { var bits = writeBitField(cert.purposes, KEYUSEBITS); der.writeBuffer(bits, asn1.Ber.BitString); } der.endSequence(); } else { der.writeBuffer(exts[i].data, asn1.Ber.OctetString); } der.endSequence(); } der.endSequence(); der.endSequence(); } der.endSequence(); } function readBitField(bits, bitIndex) { var bitLen = 8 * (bits.length - 1) - bits[0]; var setBits = {}; for (var i = 0; i < bitLen; ++i) { var byteN = 1 + Math.floor(i / 8); var bit = 7 - i % 8; var mask = 1 << bit; var bitVal = (bits[byteN] & mask) !== 0; var name = bitIndex[i]; if (bitVal && typeof name === "string") { setBits[name] = true; } } return Object.keys(setBits); } function writeBitField(setBits, bitIndex) { var bitLen = bitIndex.length; var blen = Math.ceil(bitLen / 8); var unused = blen * 8 - bitLen; var bits = Buffer2.alloc(1 + blen); bits[0] = unused; for (var i = 0; i < bitLen; ++i) { var byteN = 1 + Math.floor(i / 8); var bit = 7 - i % 8; var mask = 1 << bit; var name = bitIndex[i]; if (name === void 0) continue; var bitVal = setBits.indexOf(name) !== -1; if (bitVal) { bits[byteN] |= mask; } } return bits; } } }); // node_modules/sshpk/lib/formats/x509-pem.js var require_x509_pem = __commonJS({ "node_modules/sshpk/lib/formats/x509-pem.js"(exports, module2) { var x509 = require_x509(); module2.exports = { read, verify: x509.verify, sign: x509.sign, write }; var assert = require_assert(); var asn1 = require_lib(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var pem = require_pem(); var Identity = require_identity(); var Signature = require_signature(); var Certificate = require_certificate(); function read(buf, options) { if (typeof buf !== "string") { assert.buffer(buf, "buf"); buf = buf.toString("ascii"); } var lines = buf.trim().split(/[\r\n]+/g); var m; var si = -1; while (!m && si < lines.length) { m = lines[++si].match(/[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/); } assert.ok(m, "invalid PEM header"); var m2; var ei = lines.length; while (!m2 && ei > 0) { m2 = lines[--ei].match(/[-]+[ ]*END CERTIFICATE[ ]*[-]+/); } assert.ok(m2, "invalid PEM footer"); lines = lines.slice(si, ei + 1); var headers = {}; while (true) { lines = lines.slice(1); m = lines[0].match(/^([A-Za-z0-9-]+): (.+)$/); if (!m) break; headers[m[1].toLowerCase()] = m[2]; } lines = lines.slice(0, -1).join(""); buf = Buffer2.from(lines, "base64"); return x509.read(buf, options); } function write(cert, options) { var dbuf = x509.write(cert, options); var header = "CERTIFICATE"; var tmp = dbuf.toString("base64"); var len = tmp.length + tmp.length / 64 + 18 + 16 + header.length * 2 + 10; var buf = Buffer2.alloc(len); var o = 0; o += buf.write("-----BEGIN " + header + "-----\n", o); for (var i = 0; i < tmp.length; ) { var limit = i + 64; if (limit > tmp.length) limit = tmp.length; o += buf.write(tmp.slice(i, limit), o); buf[o++] = 10; i = limit; } o += buf.write("-----END " + header + "-----\n", o); return buf.slice(0, o); } } }); // node_modules/sshpk/lib/certificate.js var require_certificate = __commonJS({ "node_modules/sshpk/lib/certificate.js"(exports, module2) { module2.exports = Certificate; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var crypto2 = require("crypto"); var Fingerprint = require_fingerprint(); var Signature = require_signature(); var errs = require_errors2(); var util = require("util"); var utils = require_utils2(); var Key = require_key(); var PrivateKey = require_private_key(); var Identity = require_identity(); var formats = {}; formats["openssh"] = require_openssh_cert(); formats["x509"] = require_x509(); formats["pem"] = require_x509_pem(); var CertificateParseError = errs.CertificateParseError; var InvalidAlgorithmError = errs.InvalidAlgorithmError; function Certificate(opts) { assert.object(opts, "options"); assert.arrayOfObject(opts.subjects, "options.subjects"); utils.assertCompatible(opts.subjects[0], Identity, [1, 0], "options.subjects"); utils.assertCompatible(opts.subjectKey, Key, [1, 0], "options.subjectKey"); utils.assertCompatible(opts.issuer, Identity, [1, 0], "options.issuer"); if (opts.issuerKey !== void 0) { utils.assertCompatible(opts.issuerKey, Key, [1, 0], "options.issuerKey"); } assert.object(opts.signatures, "options.signatures"); assert.buffer(opts.serial, "options.serial"); assert.date(opts.validFrom, "options.validFrom"); assert.date(opts.validUntil, "optons.validUntil"); assert.optionalArrayOfString(opts.purposes, "options.purposes"); this._hashCache = {}; this.subjects = opts.subjects; this.issuer = opts.issuer; this.subjectKey = opts.subjectKey; this.issuerKey = opts.issuerKey; this.signatures = opts.signatures; this.serial = opts.serial; this.validFrom = opts.validFrom; this.validUntil = opts.validUntil; this.purposes = opts.purposes; } Certificate.formats = formats; Certificate.prototype.toBuffer = function(format, options) { if (format === void 0) format = "x509"; assert.string(format, "format"); assert.object(formats[format], "formats[format]"); assert.optionalObject(options, "options"); return formats[format].write(this, options); }; Certificate.prototype.toString = function(format, options) { if (format === void 0) format = "pem"; return this.toBuffer(format, options).toString(); }; Certificate.prototype.fingerprint = function(algo) { if (algo === void 0) algo = "sha256"; assert.string(algo, "algorithm"); var opts = { type: "certificate", hash: this.hash(algo), algorithm: algo }; return new Fingerprint(opts); }; Certificate.prototype.hash = function(algo) { assert.string(algo, "algorithm"); algo = algo.toLowerCase(); if (algs.hashAlgs[algo] === void 0) throw new InvalidAlgorithmError(algo); if (this._hashCache[algo]) return this._hashCache[algo]; var hash = crypto2.createHash(algo).update(this.toBuffer("x509")).digest(); this._hashCache[algo] = hash; return hash; }; Certificate.prototype.isExpired = function(when) { if (when === void 0) when = new Date(); return !(when.getTime() >= this.validFrom.getTime() && when.getTime() < this.validUntil.getTime()); }; Certificate.prototype.isSignedBy = function(issuerCert) { utils.assertCompatible(issuerCert, Certificate, [1, 0], "issuer"); if (!this.issuer.equals(issuerCert.subjects[0])) return false; if (this.issuer.purposes && this.issuer.purposes.length > 0 && this.issuer.purposes.indexOf("ca") === -1) { return false; } return this.isSignedByKey(issuerCert.subjectKey); }; Certificate.prototype.getExtension = function(keyOrOid) { assert.string(keyOrOid, "keyOrOid"); var ext = this.getExtensions().filter(function(maybeExt) { if (maybeExt.format === "x509") return maybeExt.oid === keyOrOid; if (maybeExt.format === "openssh") return maybeExt.name === keyOrOid; return false; })[0]; return ext; }; Certificate.prototype.getExtensions = function() { var exts = []; var x509 = this.signatures.x509; if (x509 && x509.extras && x509.extras.exts) { x509.extras.exts.forEach(function(ext) { ext.format = "x509"; exts.push(ext); }); } var openssh = this.signatures.openssh; if (openssh && openssh.exts) { openssh.exts.forEach(function(ext) { ext.format = "openssh"; exts.push(ext); }); } return exts; }; Certificate.prototype.isSignedByKey = function(issuerKey) { utils.assertCompatible(issuerKey, Key, [1, 2], "issuerKey"); if (this.issuerKey !== void 0) { return this.issuerKey.fingerprint("sha512").matches(issuerKey); } var fmt = Object.keys(this.signatures)[0]; var valid = formats[fmt].verify(this, issuerKey); if (valid) this.issuerKey = issuerKey; return valid; }; Certificate.prototype.signWith = function(key) { utils.assertCompatible(key, PrivateKey, [1, 2], "key"); var fmts = Object.keys(formats); var didOne = false; for (var i = 0; i < fmts.length; ++i) { if (fmts[i] !== "pem") { var ret = formats[fmts[i]].sign(this, key); if (ret === true) didOne = true; } } if (!didOne) { throw new Error("Failed to sign the certificate for any available certificate formats"); } }; Certificate.createSelfSigned = function(subjectOrSubjects, key, options) { var subjects; if (Array.isArray(subjectOrSubjects)) subjects = subjectOrSubjects; else subjects = [subjectOrSubjects]; assert.arrayOfObject(subjects); subjects.forEach(function(subject) { utils.assertCompatible(subject, Identity, [1, 0], "subject"); }); utils.assertCompatible(key, PrivateKey, [1, 2], "private key"); assert.optionalObject(options, "options"); if (options === void 0) options = {}; assert.optionalObject(options.validFrom, "options.validFrom"); assert.optionalObject(options.validUntil, "options.validUntil"); var validFrom = options.validFrom; var validUntil = options.validUntil; if (validFrom === void 0) validFrom = new Date(); if (validUntil === void 0) { assert.optionalNumber(options.lifetime, "options.lifetime"); var lifetime = options.lifetime; if (lifetime === void 0) lifetime = 10 * 365 * 24 * 3600; validUntil = new Date(); validUntil.setTime(validUntil.getTime() + lifetime * 1e3); } assert.optionalBuffer(options.serial, "options.serial"); var serial = options.serial; if (serial === void 0) serial = Buffer2.from("0000000000000001", "hex"); var purposes = options.purposes; if (purposes === void 0) purposes = []; if (purposes.indexOf("signature") === -1) purposes.push("signature"); if (purposes.indexOf("ca") === -1) purposes.push("ca"); if (purposes.indexOf("crl") === -1) purposes.push("crl"); if (purposes.length <= 3) { var hostSubjects = subjects.filter(function(subject) { return subject.type === "host"; }); var userSubjects = subjects.filter(function(subject) { return subject.type === "user"; }); if (hostSubjects.length > 0) { if (purposes.indexOf("serverAuth") === -1) purposes.push("serverAuth"); } if (userSubjects.length > 0) { if (purposes.indexOf("clientAuth") === -1) purposes.push("clientAuth"); } if (userSubjects.length > 0 || hostSubjects.length > 0) { if (purposes.indexOf("keyAgreement") === -1) purposes.push("keyAgreement"); if (key.type === "rsa" && purposes.indexOf("encryption") === -1) purposes.push("encryption"); } } var cert = new Certificate({ subjects, issuer: subjects[0], subjectKey: key.toPublic(), issuerKey: key.toPublic(), signatures: {}, serial, validFrom, validUntil, purposes }); cert.signWith(key); return cert; }; Certificate.create = function(subjectOrSubjects, key, issuer, issuerKey, options) { var subjects; if (Array.isArray(subjectOrSubjects)) subjects = subjectOrSubjects; else subjects = [subjectOrSubjects]; assert.arrayOfObject(subjects); subjects.forEach(function(subject) { utils.assertCompatible(subject, Identity, [1, 0], "subject"); }); utils.assertCompatible(key, Key, [1, 0], "key"); if (PrivateKey.isPrivateKey(key)) key = key.toPublic(); utils.assertCompatible(issuer, Identity, [1, 0], "issuer"); utils.assertCompatible(issuerKey, PrivateKey, [1, 2], "issuer key"); assert.optionalObject(options, "options"); if (options === void 0) options = {}; assert.optionalObject(options.validFrom, "options.validFrom"); assert.optionalObject(options.validUntil, "options.validUntil"); var validFrom = options.validFrom; var validUntil = options.validUntil; if (validFrom === void 0) validFrom = new Date(); if (validUntil === void 0) { assert.optionalNumber(options.lifetime, "options.lifetime"); var lifetime = options.lifetime; if (lifetime === void 0) lifetime = 10 * 365 * 24 * 3600; validUntil = new Date(); validUntil.setTime(validUntil.getTime() + lifetime * 1e3); } assert.optionalBuffer(options.serial, "options.serial"); var serial = options.serial; if (serial === void 0) serial = Buffer2.from("0000000000000001", "hex"); var purposes = options.purposes; if (purposes === void 0) purposes = []; if (purposes.indexOf("signature") === -1) purposes.push("signature"); if (options.ca === true) { if (purposes.indexOf("ca") === -1) purposes.push("ca"); if (purposes.indexOf("crl") === -1) purposes.push("crl"); } var hostSubjects = subjects.filter(function(subject) { return subject.type === "host"; }); var userSubjects = subjects.filter(function(subject) { return subject.type === "user"; }); if (hostSubjects.length > 0) { if (purposes.indexOf("serverAuth") === -1) purposes.push("serverAuth"); } if (userSubjects.length > 0) { if (purposes.indexOf("clientAuth") === -1) purposes.push("clientAuth"); } if (userSubjects.length > 0 || hostSubjects.length > 0) { if (purposes.indexOf("keyAgreement") === -1) purposes.push("keyAgreement"); if (key.type === "rsa" && purposes.indexOf("encryption") === -1) purposes.push("encryption"); } var cert = new Certificate({ subjects, issuer, subjectKey: key, issuerKey: issuerKey.toPublic(), signatures: {}, serial, validFrom, validUntil, purposes }); cert.signWith(issuerKey); return cert; }; Certificate.parse = function(data, format, options) { if (typeof data !== "string") assert.buffer(data, "data"); if (format === void 0) format = "auto"; assert.string(format, "format"); if (typeof options === "string") options = { filename: options }; assert.optionalObject(options, "options"); if (options === void 0) options = {}; assert.optionalString(options.filename, "options.filename"); if (options.filename === void 0) options.filename = "(unnamed)"; assert.object(formats[format], "formats[format]"); try { var k = formats[format].read(data, options); return k; } catch (e) { throw new CertificateParseError(options.filename, format, e); } }; Certificate.isCertificate = function(obj, ver) { return utils.isCompatible(obj, Certificate, ver); }; Certificate.prototype._sshpkApiVersion = [1, 1]; Certificate._oldVersionDetect = function(obj) { return [1, 0]; }; } }); // node_modules/sshpk/lib/fingerprint.js var require_fingerprint = __commonJS({ "node_modules/sshpk/lib/fingerprint.js"(exports, module2) { module2.exports = Fingerprint; var assert = require_assert(); var Buffer2 = require_safer().Buffer; var algs = require_algs(); var crypto2 = require("crypto"); var errs = require_errors2(); var Key = require_key(); var PrivateKey = require_private_key(); var Certificate = require_certificate(); var utils = require_utils2(); var FingerprintFormatError = errs.FingerprintFormatError; var InvalidAlgorithmError = errs.InvalidAlgorithmError; function Fingerprint(opts) { assert.object(opts, "options"); assert.string(opts.type, "options.type"); assert.buffer(opts.hash, "options.hash"); assert.string(opts.algorithm, "options.algorithm"); this.algorithm = opts.algorithm.toLowerCase(); if (algs.hashAlgs[this.algorithm] !== true) throw new InvalidAlgorithmError(this.algorithm); this.hash = opts.hash; this.type = opts.type; this.hashType = opts.hashType; } Fingerprint.prototype.toString = function(format) { if (format === void 0) { if (this.algorithm === "md5" || this.hashType === "spki") format = "hex"; else format = "base64"; } assert.string(format); switch (format) { case "hex": if (this.hashType === "spki") return this.hash.toString("hex"); return addColons(this.hash.toString("hex")); case "base64": if (this.hashType === "spki") return this.hash.toString("base64"); return sshBase64Format(this.algorithm, this.hash.toString("base64")); default: throw new FingerprintFormatError(void 0, format); } }; Fingerprint.prototype.matches = function(other) { assert.object(other, "key or certificate"); if (this.type === "key" && this.hashType !== "ssh") { utils.assertCompatible(other, Key, [1, 7], "key with spki"); if (PrivateKey.isPrivateKey(other)) { utils.assertCompatible(other, PrivateKey, [1, 6], "privatekey with spki support"); } } else if (this.type === "key") { utils.assertCompatible(other, Key, [1, 0], "key"); } else { utils.assertCompatible(other, Certificate, [1, 0], "certificate"); } var theirHash = other.hash(this.algorithm, this.hashType); var theirHash2 = crypto2.createHash(this.algorithm).update(theirHash).digest("base64"); if (this.hash2 === void 0) this.hash2 = crypto2.createHash(this.algorithm).update(this.hash).digest("base64"); return this.hash2 === theirHash2; }; var base64RE = /^[A-Za-z0-9+\/=]+$/; var hexRE = /^[a-fA-F0-9]+$/; Fingerprint.parse = function(fp, options) { assert.string(fp, "fingerprint"); var alg, hash, enAlgs; if (Array.isArray(options)) { enAlgs = options; options = {}; } assert.optionalObject(options, "options"); if (options === void 0) options = {}; if (options.enAlgs !== void 0) enAlgs = options.enAlgs; if (options.algorithms !== void 0) enAlgs = options.algorithms; assert.optionalArrayOfString(enAlgs, "algorithms"); var hashType = "ssh"; if (options.hashType !== void 0) hashType = options.hashType; assert.string(hashType, "options.hashType"); var parts = fp.split(":"); if (parts.length == 2) { alg = parts[0].toLowerCase(); if (!base64RE.test(parts[1])) throw new FingerprintFormatError(fp); try { hash = Buffer2.from(parts[1], "base64"); } catch (e) { throw new FingerprintFormatError(fp); } } else if (parts.length > 2) { alg = "md5"; if (parts[0].toLowerCase() === "md5") parts = parts.slice(1); parts = parts.map(function(p) { while (p.length < 2) p = "0" + p; if (p.length > 2) throw new FingerprintFormatError(fp); return p; }); parts = parts.join(""); if (!hexRE.test(parts) || parts.length % 2 !== 0) throw new FingerprintFormatError(fp); try { hash = Buffer2.from(parts, "hex"); } catch (e) { throw new FingerprintFormatError(fp); } } else { if (hexRE.test(fp)) { hash = Buffer2.from(fp, "hex"); } else if (base64RE.test(fp)) { hash = Buffer2.from(fp, "base64"); } else { throw new FingerprintFormatError(fp); } switch (hash.length) { case 32: alg = "sha256"; break; case 16: alg = "md5"; break; case 20: alg = "sha1"; break; case 64: alg = "sha512"; break; default: throw new FingerprintFormatError(fp); } if (options.hashType === void 0) hashType = "spki"; } if (alg === void 0) throw new FingerprintFormatError(fp); if (algs.hashAlgs[alg] === void 0) throw new InvalidAlgorithmError(alg); if (enAlgs !== void 0) { enAlgs = enAlgs.map(function(a) { return a.toLowerCase(); }); if (enAlgs.indexOf(alg) === -1) throw new InvalidAlgorithmError(alg); } return new Fingerprint({ algorithm: alg, hash, type: options.type || "key", hashType }); }; function addColons(s) { return s.replace(/(.{2})(?=.)/g, "$1:"); } function base64Strip(s) { return s.replace(/=*$/, ""); } function sshBase64Format(alg, h) { return alg.toUpperCase() + ":" + base64Strip(h); } Fingerprint.isFingerprint = function(obj, ver) { return utils.isCompatible(obj, Fingerprint, ver); }; Fingerprint.prototype._sshpkApiVersion = [1, 2]; Fingerprint._oldVersionDetect = function(obj) { assert.func(obj.toString); assert.func(obj.matches); return [1, 0]; }; } }); // node_modules/sshpk/lib/key.js var require_key = __commonJS({ "node_modules/sshpk/lib/key.js"(exports, module2) { module2.exports = Key; var assert = require_assert(); var algs = require_algs(); var crypto2 = require("crypto"); var Fingerprint = require_fingerprint(); var Signature = require_signature(); var DiffieHellman = require_dhe().DiffieHellman; var errs = require_errors2(); var utils = require_utils2(); var PrivateKey = require_private_key(); var edCompat; try { edCompat = require_ed_compat(); } catch (e) { } var InvalidAlgorithmError = errs.InvalidAlgorithmError; var KeyParseError = errs.KeyParseError; var formats = {}; formats["auto"] = require_auto(); formats["pem"] = require_pem(); formats["pkcs1"] = require_pkcs1(); formats["pkcs8"] = require_pkcs8(); formats["rfc4253"] = require_rfc4253(); formats["ssh"] = require_ssh(); formats["ssh-private"] = require_ssh_private(); formats["openssh"] = formats["ssh-private"]; formats["dnssec"] = require_dnssec(); formats["putty"] = require_putty(); formats["ppk"] = formats["putty"]; function Key(opts) { assert.object(opts, "options"); assert.arrayOfObject(opts.parts, "options.parts"); assert.string(opts.type, "options.type"); assert.optionalString(opts.comment, "options.comment"); var algInfo = algs.info[opts.type]; if (typeof algInfo !== "object") throw new InvalidAlgorithmError(opts.type); var partLookup = {}; for (var i = 0; i < opts.parts.length; ++i) { var part = opts.parts[i]; partLookup[part.name] = part; } this.type = opts.type; this.parts = opts.parts; this.part = partLookup; this.comment = void 0; this.source = opts.source; this._rfc4253Cache = opts._rfc4253Cache; this._hashCache = {}; var sz; this.curve = void 0; if (this.type === "ecdsa") { var curve = this.part.curve.data.toString(); this.curve = curve; sz = algs.curves[curve].size; } else if (this.type === "ed25519" || this.type === "curve25519") { sz = 256; this.curve = "curve25519"; } else { var szPart = this.part[algInfo.sizePart]; sz = szPart.data.length; sz = sz * 8 - utils.countZeros(szPart.data); } this.size = sz; } Key.formats = formats; Key.prototype.toBuffer = function(format, options) { if (format === void 0) format = "ssh"; assert.string(format, "format"); assert.object(formats[format], "formats[format]"); assert.optionalObject(options, "options"); if (format === "rfc4253") { if (this._rfc4253Cache === void 0) this._rfc4253Cache = formats["rfc4253"].write(this); return this._rfc4253Cache; } return formats[format].write(this, options); }; Key.prototype.toString = function(format, options) { return this.toBuffer(format, options).toString(); }; Key.prototype.hash = function(algo, type) { assert.string(algo, "algorithm"); assert.optionalString(type, "type"); if (type === void 0) type = "ssh"; algo = algo.toLowerCase(); if (algs.hashAlgs[algo] === void 0) throw new InvalidAlgorithmError(algo); var cacheKey = algo + "||" + type; if (this._hashCache[cacheKey]) return this._hashCache[cacheKey]; var buf; if (type === "ssh") { buf = this.toBuffer("rfc4253"); } else if (type === "spki") { buf = formats.pkcs8.pkcs8ToBuffer(this); } else { throw new Error("Hash type " + type + " not supported"); } var hash = crypto2.createHash(algo).update(buf).digest(); this._hashCache[cacheKey] = hash; return hash; }; Key.prototype.fingerprint = function(algo, type) { if (algo === void 0) algo = "sha256"; if (type === void 0) type = "ssh"; assert.string(algo, "algorithm"); assert.string(type, "type"); var opts = { type: "key", hash: this.hash(algo, type), algorithm: algo, hashType: type }; return new Fingerprint(opts); }; Key.prototype.defaultHashAlgorithm = function() { var hashAlgo = "sha1"; if (this.type === "rsa") hashAlgo = "sha256"; if (this.type === "dsa" && this.size > 1024) hashAlgo = "sha256"; if (this.type === "ed25519") hashAlgo = "sha512"; if (this.type === "ecdsa") { if (this.size <= 256) hashAlgo = "sha256"; else if (this.size <= 384) hashAlgo = "sha384"; else hashAlgo = "sha512"; } return hashAlgo; }; Key.prototype.createVerify = function(hashAlgo) { if (hashAlgo === void 0) hashAlgo = this.defaultHashAlgorithm(); assert.string(hashAlgo, "hash algorithm"); if (this.type === "ed25519" && edCompat !== void 0) return new edCompat.Verifier(this, hashAlgo); if (this.type === "curve25519") throw new Error("Curve25519 keys are not suitable for signing or verification"); var v, nm, err; try { nm = hashAlgo.toUpperCase(); v = crypto2.createVerify(nm); } catch (e) { err = e; } if (v === void 0 || err instanceof Error && err.message.match(/Unknown message digest/)) { nm = "RSA-"; nm += hashAlgo.toUpperCase(); v = crypto2.createVerify(nm); } assert.ok(v, "failed to create verifier"); var oldVerify = v.verify.bind(v); var key = this.toBuffer("pkcs8"); var curve = this.curve; var self2 = this; v.verify = function(signature, fmt) { if (Signature.isSignature(signature, [2, 0])) { if (signature.type !== self2.type) return false; if (signature.hashAlgorithm && signature.hashAlgorithm !== hashAlgo) return false; if (signature.curve && self2.type === "ecdsa" && signature.curve !== curve) return false; return oldVerify(key, signature.toBuffer("asn1")); } else if (typeof signature === "string" || Buffer.isBuffer(signature)) { return oldVerify(key, signature, fmt); } else if (Signature.isSignature(signature, [1, 0])) { throw new Error("signature was created by too old a version of sshpk and cannot be verified"); } else { throw new TypeError("signature must be a string, Buffer, or Signature object"); } }; return v; }; Key.prototype.createDiffieHellman = function() { if (this.type === "rsa") throw new Error("RSA keys do not support Diffie-Hellman"); return new DiffieHellman(this); }; Key.prototype.createDH = Key.prototype.createDiffieHellman; Key.parse = function(data, format, options) { if (typeof data !== "string") assert.buffer(data, "data"); if (format === void 0) format = "auto"; assert.string(format, "format"); if (typeof options === "string") options = { filename: options }; assert.optionalObject(options, "options"); if (options === void 0) options = {}; assert.optionalString(options.filename, "options.filename"); if (options.filename === void 0) options.filename = "(unnamed)"; assert.object(formats[format], "formats[format]"); try { var k = formats[format].read(data, options); if (k instanceof PrivateKey) k = k.toPublic(); if (!k.comment) k.comment = options.filename; return k; } catch (e) { if (e.name === "KeyEncryptedError") throw e; throw new KeyParseError(options.filename, format, e); } }; Key.isKey = function(obj, ver) { return utils.isCompatible(obj, Key, ver); }; Key.prototype._sshpkApiVersion = [1, 7]; Key._oldVersionDetect = function(obj) { assert.func(obj.toBuffer); assert.func(obj.fingerprint); if (obj.createDH) return [1, 4]; if (obj.defaultHashAlgorithm) return [1, 3]; if (obj.formats["auto"]) return [1, 2]; if (obj.formats["pkcs1"]) return [1, 1]; return [1, 0]; }; } }); // node_modules/sshpk/lib/index.js var require_lib2 = __commonJS({ "node_modules/sshpk/lib/index.js"(exports, module2) { var Key = require_key(); var Fingerprint = require_fingerprint(); var Signature = require_signature(); var PrivateKey = require_private_key(); var Certificate = require_certificate(); var Identity = require_identity(); var errs = require_errors2(); module2.exports = { Key, parseKey: Key.parse, Fingerprint, parseFingerprint: Fingerprint.parse, Signature, parseSignature: Signature.parse, PrivateKey, parsePrivateKey: PrivateKey.parse, generatePrivateKey: PrivateKey.generate, Certificate, parseCertificate: Certificate.parse, createSelfSignedCertificate: Certificate.createSelfSigned, createCertificate: Certificate.create, Identity, identityFromDN: Identity.parseDN, identityForHost: Identity.forHost, identityForUser: Identity.forUser, identityForEmail: Identity.forEmail, identityFromArray: Identity.fromArray, FingerprintFormatError: errs.FingerprintFormatError, InvalidAlgorithmError: errs.InvalidAlgorithmError, KeyParseError: errs.KeyParseError, SignatureParseError: errs.SignatureParseError, KeyEncryptedError: errs.KeyEncryptedError, CertificateParseError: errs.CertificateParseError }; } }); // node_modules/http-signature/lib/utils.js var require_utils3 = __commonJS({ "node_modules/http-signature/lib/utils.js"(exports, module2) { var assert = require_assert(); var sshpk = require_lib2(); var util = require("util"); var HASH_ALGOS = { "sha1": true, "sha256": true, "sha512": true }; var PK_ALGOS = { "rsa": true, "dsa": true, "ecdsa": true }; function HttpSignatureError(message, caller) { if (Error.captureStackTrace) Error.captureStackTrace(this, caller || HttpSignatureError); this.message = message; this.name = caller.name; } util.inherits(HttpSignatureError, Error); function InvalidAlgorithmError(message) { HttpSignatureError.call(this, message, InvalidAlgorithmError); } util.inherits(InvalidAlgorithmError, HttpSignatureError); function validateAlgorithm(algorithm) { var alg = algorithm.toLowerCase().split("-"); if (alg.length !== 2) { throw new InvalidAlgorithmError(alg[0].toUpperCase() + " is not a valid algorithm"); } if (alg[0] !== "hmac" && !PK_ALGOS[alg[0]]) { throw new InvalidAlgorithmError(alg[0].toUpperCase() + " type keys are not supported"); } if (!HASH_ALGOS[alg[1]]) { throw new InvalidAlgorithmError(alg[1].toUpperCase() + " is not a supported hash algorithm"); } return alg; } module2.exports = { HASH_ALGOS, PK_ALGOS, HttpSignatureError, InvalidAlgorithmError, validateAlgorithm, sshKeyToPEM: function sshKeyToPEM(key) { assert.string(key, "ssh_key"); var k = sshpk.parseKey(key, "ssh"); return k.toString("pem"); }, fingerprint: function fingerprint(key) { assert.string(key, "ssh_key"); var k = sshpk.parseKey(key, "ssh"); return k.fingerprint("md5").toString("hex"); }, pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) { assert.equal("string", typeof pem, "typeof pem"); var k = sshpk.parseKey(pem, "pem"); k.comment = comment; return k.toString("ssh"); } }; } }); // node_modules/http-signature/lib/parser.js var require_parser = __commonJS({ "node_modules/http-signature/lib/parser.js"(exports, module2) { var assert = require_assert(); var util = require("util"); var utils = require_utils3(); var HASH_ALGOS = utils.HASH_ALGOS; var PK_ALGOS = utils.PK_ALGOS; var HttpSignatureError = utils.HttpSignatureError; var InvalidAlgorithmError = utils.InvalidAlgorithmError; var validateAlgorithm = utils.validateAlgorithm; var State = { New: 0, Params: 1 }; var ParamsState = { Name: 0, Quote: 1, Value: 2, Comma: 3 }; function ExpiredRequestError(message) { HttpSignatureError.call(this, message, ExpiredRequestError); } util.inherits(ExpiredRequestError, HttpSignatureError); function InvalidHeaderError(message) { HttpSignatureError.call(this, message, InvalidHeaderError); } util.inherits(InvalidHeaderError, HttpSignatureError); function InvalidParamsError(message) { HttpSignatureError.call(this, message, InvalidParamsError); } util.inherits(InvalidParamsError, HttpSignatureError); function MissingHeaderError(message) { HttpSignatureError.call(this, message, MissingHeaderError); } util.inherits(MissingHeaderError, HttpSignatureError); function StrictParsingError(message) { HttpSignatureError.call(this, message, StrictParsingError); } util.inherits(StrictParsingError, HttpSignatureError); module2.exports = { parseRequest: function parseRequest(request2, options) { assert.object(request2, "request"); assert.object(request2.headers, "request.headers"); if (options === void 0) { options = {}; } if (options.headers === void 0) { options.headers = [request2.headers["x-date"] ? "x-date" : "date"]; } assert.object(options, "options"); assert.arrayOfString(options.headers, "options.headers"); assert.optionalFinite(options.clockSkew, "options.clockSkew"); var authzHeaderName = options.authorizationHeaderName || "authorization"; if (!request2.headers[authzHeaderName]) { throw new MissingHeaderError("no " + authzHeaderName + " header present in the request"); } options.clockSkew = options.clockSkew || 300; var i = 0; var state = State.New; var substate = ParamsState.Name; var tmpName = ""; var tmpValue = ""; var parsed = { scheme: "", params: {}, signingString: "" }; var authz = request2.headers[authzHeaderName]; for (i = 0; i < authz.length; i++) { var c = authz.charAt(i); switch (Number(state)) { case State.New: if (c !== " ") parsed.scheme += c; else state = State.Params; break; case State.Params: switch (Number(substate)) { case ParamsState.Name: var code = c.charCodeAt(0); if (code >= 65 && code <= 90 || code >= 97 && code <= 122) { tmpName += c; } else if (c === "=") { if (tmpName.length === 0) throw new InvalidHeaderError("bad param format"); substate = ParamsState.Quote; } else { throw new InvalidHeaderError("bad param format"); } break; case ParamsState.Quote: if (c === '"') { tmpValue = ""; substate = ParamsState.Value; } else { throw new InvalidHeaderError("bad param format"); } break; case ParamsState.Value: if (c === '"') { parsed.params[tmpName] = tmpValue; substate = ParamsState.Comma; } else { tmpValue += c; } break; case ParamsState.Comma: if (c === ",") { tmpName = ""; substate = ParamsState.Name; } else { throw new InvalidHeaderError("bad param format"); } break; default: throw new Error("Invalid substate"); } break; default: throw new Error("Invalid substate"); } } if (!parsed.params.headers || parsed.params.headers === "") { if (request2.headers["x-date"]) { parsed.params.headers = ["x-date"]; } else { parsed.params.headers = ["date"]; } } else { parsed.params.headers = parsed.params.headers.split(" "); } if (!parsed.scheme || parsed.scheme !== "Signature") throw new InvalidHeaderError('scheme was not "Signature"'); if (!parsed.params.keyId) throw new InvalidHeaderError("keyId was not specified"); if (!parsed.params.algorithm) throw new InvalidHeaderError("algorithm was not specified"); if (!parsed.params.signature) throw new InvalidHeaderError("signature was not specified"); parsed.params.algorithm = parsed.params.algorithm.toLowerCase(); try { validateAlgorithm(parsed.params.algorithm); } catch (e) { if (e instanceof InvalidAlgorithmError) throw new InvalidParamsError(parsed.params.algorithm + " is not supported"); else throw e; } for (i = 0; i < parsed.params.headers.length; i++) { var h = parsed.params.headers[i].toLowerCase(); parsed.params.headers[i] = h; if (h === "request-line") { if (!options.strict) { parsed.signingString += request2.method + " " + request2.url + " HTTP/" + request2.httpVersion; } else { throw new StrictParsingError("request-line is not a valid header with strict parsing enabled."); } } else if (h === "(request-target)") { parsed.signingString += "(request-target): " + request2.method.toLowerCase() + " " + request2.url; } else { var value = request2.headers[h]; if (value === void 0) throw new MissingHeaderError(h + " was not in the request"); parsed.signingString += h + ": " + value; } if (i + 1 < parsed.params.headers.length) parsed.signingString += "\n"; } var date; if (request2.headers.date || request2.headers["x-date"]) { if (request2.headers["x-date"]) { date = new Date(request2.headers["x-date"]); } else { date = new Date(request2.headers.date); } var now = new Date(); var skew = Math.abs(now.getTime() - date.getTime()); if (skew > options.clockSkew * 1e3) { throw new ExpiredRequestError("clock skew of " + skew / 1e3 + "s was greater than " + options.clockSkew + "s"); } } options.headers.forEach(function(hdr) { if (parsed.params.headers.indexOf(hdr.toLowerCase()) < 0) throw new MissingHeaderError(hdr + " was not a signed header"); }); if (options.algorithms) { if (options.algorithms.indexOf(parsed.params.algorithm) === -1) throw new InvalidParamsError(parsed.params.algorithm + " is not a supported algorithm"); } parsed.algorithm = parsed.params.algorithm.toUpperCase(); parsed.keyId = parsed.params.keyId; return parsed; } }; } }); // node_modules/extsprintf/lib/extsprintf.js var require_extsprintf = __commonJS({ "node_modules/extsprintf/lib/extsprintf.js"(exports) { var mod_assert = require("assert"); var mod_util = require("util"); exports.sprintf = jsSprintf; exports.printf = jsPrintf; exports.fprintf = jsFprintf; function jsSprintf(fmt) { var regex = [ "([^%]*)", "%", "(['\\-+ #0]*?)", "([1-9]\\d*)?", "(\\.([1-9]\\d*))?", "[lhjztL]*?", "([diouxXfFeEgGaAcCsSp%jr])" ].join(""); var re = new RegExp(regex); var args = Array.prototype.slice.call(arguments, 1); var flags, width, precision, conversion; var left, pad, sign, arg, match; var ret = ""; var argn = 1; mod_assert.equal("string", typeof fmt); while ((match = re.exec(fmt)) !== null) { ret += match[1]; fmt = fmt.substring(match[0].length); flags = match[2] || ""; width = match[3] || 0; precision = match[4] || ""; conversion = match[6]; left = false; sign = false; pad = " "; if (conversion == "%") { ret += "%"; continue; } if (args.length === 0) throw new Error("too few args to sprintf"); arg = args.shift(); argn++; if (flags.match(/[\' #]/)) throw new Error("unsupported flags: " + flags); if (precision.length > 0) throw new Error("non-zero precision not supported"); if (flags.match(/-/)) left = true; if (flags.match(/0/)) pad = "0"; if (flags.match(/\+/)) sign = true; switch (conversion) { case "s": if (arg === void 0 || arg === null) throw new Error("argument " + argn + ": attempted to print undefined or null as a string"); ret += doPad(pad, width, left, arg.toString()); break; case "d": arg = Math.floor(arg); case "f": sign = sign && arg > 0 ? "+" : ""; ret += sign + doPad(pad, width, left, arg.toString()); break; case "x": ret += doPad(pad, width, left, arg.toString(16)); break; case "j": if (width === 0) width = 10; ret += mod_util.inspect(arg, false, width); break; case "r": ret += dumpException(arg); break; default: throw new Error("unsupported conversion: " + conversion); } } ret += fmt; return ret; } function jsPrintf() { var args = Array.prototype.slice.call(arguments); args.unshift(process.stdout); jsFprintf.apply(null, args); } function jsFprintf(stream) { var args = Array.prototype.slice.call(arguments, 1); return stream.write(jsSprintf.apply(this, args)); } function doPad(chr, width, left, str) { var ret = str; while (ret.length < width) { if (left) ret += chr; else ret = chr + ret; } return ret; } function dumpException(ex) { var ret; if (!(ex instanceof Error)) throw new Error(jsSprintf("invalid type for %%r: %j", ex)); ret = "EXCEPTION: " + ex.constructor.name + ": " + ex.stack; if (ex.cause && typeof ex.cause === "function") { var cex = ex.cause(); if (cex) { ret += "\nCaused by: " + dumpException(cex); } } return ret; } } }); // node_modules/core-util-is/lib/util.js var require_util2 = __commonJS({ "node_modules/core-util-is/lib/util.js"(exports) { function isArray(arg) { if (Array.isArray) { return Array.isArray(arg); } return objectToString(arg) === "[object Array]"; } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === "boolean"; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === "number"; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === "string"; } exports.isString = isString; function isSymbol(arg) { return typeof arg === "symbol"; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return objectToString(re) === "[object RegExp]"; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === "object" && arg !== null; } exports.isObject = isObject; function isDate(d) { return objectToString(d) === "[object Date]"; } exports.isDate = isDate; function isError(e) { return objectToString(e) === "[object Error]" || e instanceof Error; } exports.isError = isError; function isFunction(arg) { return typeof arg === "function"; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || typeof arg === "undefined"; } exports.isPrimitive = isPrimitive; exports.isBuffer = Buffer.isBuffer; function objectToString(o) { return Object.prototype.toString.call(o); } } }); // node_modules/verror/lib/verror.js var require_verror = __commonJS({ "node_modules/verror/lib/verror.js"(exports, module2) { var mod_assertplus = require_assert(); var mod_util = require("util"); var mod_extsprintf = require_extsprintf(); var mod_isError = require_util2().isError; var sprintf = mod_extsprintf.sprintf; module2.exports = VError; VError.VError = VError; VError.SError = SError; VError.WError = WError; VError.MultiError = MultiError; function parseConstructorArguments(args) { var argv, options, sprintf_args, shortmessage, k; mod_assertplus.object(args, "args"); mod_assertplus.bool(args.strict, "args.strict"); mod_assertplus.array(args.argv, "args.argv"); argv = args.argv; if (argv.length === 0) { options = {}; sprintf_args = []; } else if (mod_isError(argv[0])) { options = { "cause": argv[0] }; sprintf_args = argv.slice(1); } else if (typeof argv[0] === "object") { options = {}; for (k in argv[0]) { options[k] = argv[0][k]; } sprintf_args = argv.slice(1); } else { mod_assertplus.string(argv[0], "first argument to VError, SError, or WError constructor must be a string, object, or Error"); options = {}; sprintf_args = argv; } mod_assertplus.object(options); if (!options.strict && !args.strict) { sprintf_args = sprintf_args.map(function(a) { return a === null ? "null" : a === void 0 ? "undefined" : a; }); } if (sprintf_args.length === 0) { shortmessage = ""; } else { shortmessage = sprintf.apply(null, sprintf_args); } return { "options": options, "shortmessage": shortmessage }; } function VError() { var args, obj, parsed, cause, ctor, message, k; args = Array.prototype.slice.call(arguments, 0); if (!(this instanceof VError)) { obj = Object.create(VError.prototype); VError.apply(obj, arguments); return obj; } parsed = parseConstructorArguments({ "argv": args, "strict": false }); if (parsed.options.name) { mod_assertplus.string(parsed.options.name, `error's "name" must be a string`); this.name = parsed.options.name; } this.jse_shortmsg = parsed.shortmessage; message = parsed.shortmessage; cause = parsed.options.cause; if (cause) { mod_assertplus.ok(mod_isError(cause), "cause is not an Error"); this.jse_cause = cause; if (!parsed.options.skipCauseMessage) { message += ": " + cause.message; } } this.jse_info = {}; if (parsed.options.info) { for (k in parsed.options.info) { this.jse_info[k] = parsed.options.info[k]; } } this.message = message; Error.call(this, message); if (Error.captureStackTrace) { ctor = parsed.options.constructorOpt || this.constructor; Error.captureStackTrace(this, ctor); } return this; } mod_util.inherits(VError, Error); VError.prototype.name = "VError"; VError.prototype.toString = function ve_toString() { var str = this.hasOwnProperty("name") && this.name || this.constructor.name || this.constructor.prototype.name; if (this.message) str += ": " + this.message; return str; }; VError.prototype.cause = function ve_cause() { var cause = VError.cause(this); return cause === null ? void 0 : cause; }; VError.cause = function(err) { mod_assertplus.ok(mod_isError(err), "err must be an Error"); return mod_isError(err.jse_cause) ? err.jse_cause : null; }; VError.info = function(err) { var rv, cause, k; mod_assertplus.ok(mod_isError(err), "err must be an Error"); cause = VError.cause(err); if (cause !== null) { rv = VError.info(cause); } else { rv = {}; } if (typeof err.jse_info == "object" && err.jse_info !== null) { for (k in err.jse_info) { rv[k] = err.jse_info[k]; } } return rv; }; VError.findCauseByName = function(err, name) { var cause; mod_assertplus.ok(mod_isError(err), "err must be an Error"); mod_assertplus.string(name, "name"); mod_assertplus.ok(name.length > 0, "name cannot be empty"); for (cause = err; cause !== null; cause = VError.cause(cause)) { mod_assertplus.ok(mod_isError(cause)); if (cause.name == name) { return cause; } } return null; }; VError.hasCauseWithName = function(err, name) { return VError.findCauseByName(err, name) !== null; }; VError.fullStack = function(err) { mod_assertplus.ok(mod_isError(err), "err must be an Error"); var cause = VError.cause(err); if (cause) { return err.stack + "\ncaused by: " + VError.fullStack(cause); } return err.stack; }; VError.errorFromList = function(errors) { mod_assertplus.arrayOfObject(errors, "errors"); if (errors.length === 0) { return null; } errors.forEach(function(e) { mod_assertplus.ok(mod_isError(e)); }); if (errors.length == 1) { return errors[0]; } return new MultiError(errors); }; VError.errorForEach = function(err, func) { mod_assertplus.ok(mod_isError(err), "err must be an Error"); mod_assertplus.func(func, "func"); if (err instanceof MultiError) { err.errors().forEach(function iterError(e) { func(e); }); } else { func(err); } }; function SError() { var args, obj, parsed, options; args = Array.prototype.slice.call(arguments, 0); if (!(this instanceof SError)) { obj = Object.create(SError.prototype); SError.apply(obj, arguments); return obj; } parsed = parseConstructorArguments({ "argv": args, "strict": true }); options = parsed.options; VError.call(this, options, "%s", parsed.shortmessage); return this; } mod_util.inherits(SError, VError); function MultiError(errors) { mod_assertplus.array(errors, "list of errors"); mod_assertplus.ok(errors.length > 0, "must be at least one error"); this.ase_errors = errors; VError.call(this, { "cause": errors[0] }, "first of %d error%s", errors.length, errors.length == 1 ? "" : "s"); } mod_util.inherits(MultiError, VError); MultiError.prototype.name = "MultiError"; MultiError.prototype.errors = function me_errors() { return this.ase_errors.slice(0); }; function WError() { var args, obj, parsed, options; args = Array.prototype.slice.call(arguments, 0); if (!(this instanceof WError)) { obj = Object.create(WError.prototype); WError.apply(obj, args); return obj; } parsed = parseConstructorArguments({ "argv": args, "strict": false }); options = parsed.options; options["skipCauseMessage"] = true; VError.call(this, options, "%s", parsed.shortmessage); return this; } mod_util.inherits(WError, VError); WError.prototype.name = "WError"; WError.prototype.toString = function we_toString() { var str = this.hasOwnProperty("name") && this.name || this.constructor.name || this.constructor.prototype.name; if (this.message) str += ": " + this.message; if (this.jse_cause && this.jse_cause.message) str += "; caused by " + this.jse_cause.toString(); return str; }; WError.prototype.cause = function we_cause(c) { if (mod_isError(c)) this.jse_cause = c; return this.jse_cause; }; } }); // node_modules/json-schema/lib/validate.js var require_validate = __commonJS({ "node_modules/json-schema/lib/validate.js"(exports, module2) { (function(root, factory) { if (typeof define === "function" && define.amd) { define([], function() { return factory(); }); } else if (typeof module2 === "object" && module2.exports) { module2.exports = factory(); } else { root.jsonSchema = factory(); } })(exports, function() { var exports2 = validate; exports2.Integer = { type: "integer" }; var primitiveConstructors = { String, Boolean, Number, Object, Array, Date }; exports2.validate = validate; function validate(instance, schema) { return validate(instance, schema, { changing: false }); } ; exports2.checkPropertyChange = function(value, schema, property) { return validate(value, schema, { changing: property || "property" }); }; var validate = exports2._validate = function(instance, schema, options) { if (!options) options = {}; var _changing = options.changing; function getType(schema2) { return schema2.type || primitiveConstructors[schema2.name] == schema2 && schema2.name.toLowerCase(); } var errors = []; function checkProp(value, schema2, path3, i) { var l; path3 += path3 ? typeof i == "number" ? "[" + i + "]" : typeof i == "undefined" ? "" : "." + i : i; function addError(message) { errors.push({ property: path3, message }); } if ((typeof schema2 != "object" || schema2 instanceof Array) && (path3 || typeof schema2 != "function") && !(schema2 && getType(schema2))) { if (typeof schema2 == "function") { if (!(value instanceof schema2)) { addError("is not an instance of the class/constructor " + schema2.name); } } else if (schema2) { addError("Invalid schema/property definition " + schema2); } return null; } if (_changing && schema2.readonly) { addError("is a readonly field, it can not be changed"); } if (schema2["extends"]) { checkProp(value, schema2["extends"], path3, i); } function checkType(type, value2) { if (type) { if (typeof type == "string" && type != "any" && (type == "null" ? value2 !== null : typeof value2 != type) && !(value2 instanceof Array && type == "array") && !(value2 instanceof Date && type == "date") && !(type == "integer" && value2 % 1 === 0)) { return [{ property: path3, message: value2 + " - " + typeof value2 + " value found, but a " + type + " is required" }]; } if (type instanceof Array) { var unionErrors = []; for (var j2 = 0; j2 < type.length; j2++) { if (!(unionErrors = checkType(type[j2], value2)).length) { break; } } if (unionErrors.length) { return unionErrors; } } else if (typeof type == "object") { var priorErrors = errors; errors = []; checkProp(value2, type, path3); var theseErrors = errors; errors = priorErrors; return theseErrors; } } return []; } if (value === void 0) { if (schema2.required) { addError("is missing and it is required"); } } else { errors = errors.concat(checkType(getType(schema2), value)); if (schema2.disallow && !checkType(schema2.disallow, value).length) { addError(" disallowed value was matched"); } if (value !== null) { if (value instanceof Array) { if (schema2.items) { var itemsIsArray = schema2.items instanceof Array; var propDef = schema2.items; for (i = 0, l = value.length; i < l; i += 1) { if (itemsIsArray) propDef = schema2.items[i]; if (options.coerce) value[i] = options.coerce(value[i], propDef); errors.concat(checkProp(value[i], propDef, path3, i)); } } if (schema2.minItems && value.length < schema2.minItems) { addError("There must be a minimum of " + schema2.minItems + " in the array"); } if (schema2.maxItems && value.length > schema2.maxItems) { addError("There must be a maximum of " + schema2.maxItems + " in the array"); } } else if (schema2.properties || schema2.additionalProperties) { errors.concat(checkObj(value, schema2.properties, path3, schema2.additionalProperties)); } if (schema2.pattern && typeof value == "string" && !value.match(schema2.pattern)) { addError("does not match the regex pattern " + schema2.pattern); } if (schema2.maxLength && typeof value == "string" && value.length > schema2.maxLength) { addError("may only be " + schema2.maxLength + " characters long"); } if (schema2.minLength && typeof value == "string" && value.length < schema2.minLength) { addError("must be at least " + schema2.minLength + " characters long"); } if (typeof schema2.minimum !== "undefined" && typeof value == typeof schema2.minimum && schema2.minimum > value) { addError("must have a minimum value of " + schema2.minimum); } if (typeof schema2.maximum !== "undefined" && typeof value == typeof schema2.maximum && schema2.maximum < value) { addError("must have a maximum value of " + schema2.maximum); } if (schema2["enum"]) { var enumer = schema2["enum"]; l = enumer.length; var found; for (var j = 0; j < l; j++) { if (enumer[j] === value) { found = 1; break; } } if (!found) { addError("does not have a value in the enumeration " + enumer.join(", ")); } } if (typeof schema2.maxDecimal == "number" && value.toString().match(new RegExp("\\.[0-9]{" + (schema2.maxDecimal + 1) + ",}"))) { addError("may only have " + schema2.maxDecimal + " digits of decimal places"); } } } return null; } function checkObj(instance2, objTypeDef, path3, additionalProp) { if (typeof objTypeDef == "object") { if (typeof instance2 != "object" || instance2 instanceof Array) { errors.push({ property: path3, message: "an object is required" }); } for (var i in objTypeDef) { if (objTypeDef.hasOwnProperty(i) && i != "__proto__" && i != "constructor") { var value = instance2.hasOwnProperty(i) ? instance2[i] : void 0; if (value === void 0 && options.existingOnly) continue; var propDef = objTypeDef[i]; if (value === void 0 && propDef["default"]) { value = instance2[i] = propDef["default"]; } if (options.coerce && i in instance2) { value = instance2[i] = options.coerce(value, propDef); } checkProp(value, propDef, path3, i); } } } for (i in instance2) { if (instance2.hasOwnProperty(i) && !(i.charAt(0) == "_" && i.charAt(1) == "_") && objTypeDef && !objTypeDef[i] && additionalProp === false) { if (options.filter) { delete instance2[i]; continue; } else { errors.push({ property: path3, message: "The property " + i + " is not defined in the schema and the schema does not allow additional properties" }); } } var requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires; if (requires && !(requires in instance2)) { errors.push({ property: path3, message: "the presence of the property " + i + " requires that " + requires + " also be present" }); } value = instance2[i]; if (additionalProp && (!(objTypeDef && typeof objTypeDef == "object") || !(i in objTypeDef))) { if (options.coerce) { value = instance2[i] = options.coerce(value, additionalProp); } checkProp(value, additionalProp, path3, i); } if (!_changing && value && value.$schema) { errors = errors.concat(checkProp(value, value.$schema, path3, i)); } } return errors; } if (schema) { checkProp(instance, schema, "", _changing || ""); } if (!_changing && instance && instance.$schema) { checkProp(instance, instance.$schema, "", ""); } return { valid: !errors.length, errors }; }; exports2.mustBeValid = function(result) { if (!result.valid) { throw new TypeError(result.errors.map(function(error) { return "for property " + error.property + ": " + error.message; }).join(", \n")); } }; return exports2; }); } }); // node_modules/jsprim/lib/jsprim.js var require_jsprim = __commonJS({ "node_modules/jsprim/lib/jsprim.js"(exports) { var mod_assert = require_assert(); var mod_util = require("util"); var mod_extsprintf = require_extsprintf(); var mod_verror = require_verror(); var mod_jsonschema = require_validate(); exports.deepCopy = deepCopy; exports.deepEqual = deepEqual; exports.isEmpty = isEmpty; exports.hasKey = hasKey; exports.forEachKey = forEachKey; exports.pluck = pluck; exports.flattenObject = flattenObject; exports.flattenIter = flattenIter; exports.validateJsonObject = validateJsonObjectJS; exports.validateJsonObjectJS = validateJsonObjectJS; exports.randElt = randElt; exports.extraProperties = extraProperties; exports.mergeObjects = mergeObjects; exports.startsWith = startsWith; exports.endsWith = endsWith; exports.parseInteger = parseInteger; exports.iso8601 = iso8601; exports.rfc1123 = rfc1123; exports.parseDateTime = parseDateTime; exports.hrtimediff = hrtimeDiff; exports.hrtimeDiff = hrtimeDiff; exports.hrtimeAccum = hrtimeAccum; exports.hrtimeAdd = hrtimeAdd; exports.hrtimeNanosec = hrtimeNanosec; exports.hrtimeMicrosec = hrtimeMicrosec; exports.hrtimeMillisec = hrtimeMillisec; function deepCopy(obj) { var ret, key; var marker = "__deepCopy"; if (obj && obj[marker]) throw new Error("attempted deep copy of cyclic object"); if (obj && obj.constructor == Object) { ret = {}; obj[marker] = true; for (key in obj) { if (key == marker) continue; ret[key] = deepCopy(obj[key]); } delete obj[marker]; return ret; } if (obj && obj.constructor == Array) { ret = []; obj[marker] = true; for (key = 0; key < obj.length; key++) ret.push(deepCopy(obj[key])); delete obj[marker]; return ret; } return obj; } function deepEqual(obj1, obj2) { if (typeof obj1 != typeof obj2) return false; if (obj1 === null || obj2 === null || typeof obj1 != "object") return obj1 === obj2; if (obj1.constructor != obj2.constructor) return false; var k; for (k in obj1) { if (!obj2.hasOwnProperty(k)) return false; if (!deepEqual(obj1[k], obj2[k])) return false; } for (k in obj2) { if (!obj1.hasOwnProperty(k)) return false; } return true; } function isEmpty(obj) { var key; for (key in obj) return false; return true; } function hasKey(obj, key) { mod_assert.equal(typeof key, "string"); return Object.prototype.hasOwnProperty.call(obj, key); } function forEachKey(obj, callback) { for (var key in obj) { if (hasKey(obj, key)) { callback(key, obj[key]); } } } function pluck(obj, key) { mod_assert.equal(typeof key, "string"); return pluckv(obj, key); } function pluckv(obj, key) { if (obj === null || typeof obj !== "object") return void 0; if (obj.hasOwnProperty(key)) return obj[key]; var i = key.indexOf("."); if (i == -1) return void 0; var key1 = key.substr(0, i); if (!obj.hasOwnProperty(key1)) return void 0; return pluckv(obj[key1], key.substr(i + 1)); } function flattenIter(data, depth, callback) { doFlattenIter(data, depth, [], callback); } function doFlattenIter(data, depth, accum, callback) { var each; var key; if (depth === 0) { each = accum.slice(0); each.push(data); callback(each); return; } mod_assert.ok(data !== null); mod_assert.equal(typeof data, "object"); mod_assert.equal(typeof depth, "number"); mod_assert.ok(depth >= 0); for (key in data) { each = accum.slice(0); each.push(key); doFlattenIter(data[key], depth - 1, each, callback); } } function flattenObject(data, depth) { if (depth === 0) return [data]; mod_assert.ok(data !== null); mod_assert.equal(typeof data, "object"); mod_assert.equal(typeof depth, "number"); mod_assert.ok(depth >= 0); var rv = []; var key; for (key in data) { flattenObject(data[key], depth - 1).forEach(function(p) { rv.push([key].concat(p)); }); } return rv; } function startsWith(str, prefix) { return str.substr(0, prefix.length) == prefix; } function endsWith(str, suffix) { return str.substr(str.length - suffix.length, suffix.length) == suffix; } function iso8601(d) { if (typeof d == "number") d = new Date(d); mod_assert.ok(d.constructor === Date); return mod_extsprintf.sprintf("%4d-%02d-%02dT%02d:%02d:%02d.%03dZ", d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds()); } var RFC1123_MONTHS = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; var RFC1123_DAYS = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]; function rfc1123(date) { return mod_extsprintf.sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", RFC1123_DAYS[date.getUTCDay()], date.getUTCDate(), RFC1123_MONTHS[date.getUTCMonth()], date.getUTCFullYear(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); } function parseDateTime(str) { var numeric = +str; if (!isNaN(numeric)) { return new Date(numeric); } else { return new Date(str); } } var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; var PI_DEFAULTS = { base: 10, allowSign: true, allowPrefix: false, allowTrailing: false, allowImprecise: false, trimWhitespace: false, leadingZeroIsOctal: false }; var CP_0 = 48; var CP_9 = 57; var CP_A = 65; var CP_B = 66; var CP_O = 79; var CP_T = 84; var CP_X = 88; var CP_Z = 90; var CP_a = 97; var CP_b = 98; var CP_o = 111; var CP_t = 116; var CP_x = 120; var CP_z = 122; var PI_CONV_DEC = 48; var PI_CONV_UC = 55; var PI_CONV_LC = 87; function parseInteger(str, uopts) { mod_assert.string(str, "str"); mod_assert.optionalObject(uopts, "options"); var baseOverride = false; var options = PI_DEFAULTS; if (uopts) { baseOverride = hasKey(uopts, "base"); options = mergeObjects(options, uopts); mod_assert.number(options.base, "options.base"); mod_assert.ok(options.base >= 2, "options.base >= 2"); mod_assert.ok(options.base <= 36, "options.base <= 36"); mod_assert.bool(options.allowSign, "options.allowSign"); mod_assert.bool(options.allowPrefix, "options.allowPrefix"); mod_assert.bool(options.allowTrailing, "options.allowTrailing"); mod_assert.bool(options.allowImprecise, "options.allowImprecise"); mod_assert.bool(options.trimWhitespace, "options.trimWhitespace"); mod_assert.bool(options.leadingZeroIsOctal, "options.leadingZeroIsOctal"); if (options.leadingZeroIsOctal) { mod_assert.ok(!baseOverride, '"base" and "leadingZeroIsOctal" are mutually exclusive'); } } var c; var pbase = -1; var base = options.base; var start; var mult = 1; var value = 0; var idx = 0; var len = str.length; if (options.trimWhitespace) { while (idx < len && isSpace(str.charCodeAt(idx))) { ++idx; } } if (options.allowSign) { if (str[idx] === "-") { idx += 1; mult = -1; } else if (str[idx] === "+") { idx += 1; } } if (str[idx] === "0") { if (options.allowPrefix) { pbase = prefixToBase(str.charCodeAt(idx + 1)); if (pbase !== -1 && (!baseOverride || pbase === base)) { base = pbase; idx += 2; } } if (pbase === -1 && options.leadingZeroIsOctal) { base = 8; } } for (start = idx; idx < len; ++idx) { c = translateDigit(str.charCodeAt(idx)); if (c !== -1 && c < base) { value *= base; value += c; } else { break; } } if (start === idx) { return new Error("invalid number: " + JSON.stringify(str)); } if (options.trimWhitespace) { while (idx < len && isSpace(str.charCodeAt(idx))) { ++idx; } } if (idx < len && !options.allowTrailing) { return new Error("trailing characters after number: " + JSON.stringify(str.slice(idx))); } if (value === 0) { return 0; } var result = value * mult; if (!options.allowImprecise && (value > MAX_SAFE_INTEGER || result < MIN_SAFE_INTEGER)) { return new Error("number is outside of the supported range: " + JSON.stringify(str.slice(start, idx))); } return result; } function translateDigit(d) { if (d >= CP_0 && d <= CP_9) { return d - PI_CONV_DEC; } else if (d >= CP_A && d <= CP_Z) { return d - PI_CONV_UC; } else if (d >= CP_a && d <= CP_z) { return d - PI_CONV_LC; } else { return -1; } } function isSpace(c) { return c === 32 || c >= 9 && c <= 13 || c === 160 || c === 5760 || c === 6158 || c >= 8192 && c <= 8202 || c === 8232 || c === 8233 || c === 8239 || c === 8287 || c === 12288 || c === 65279; } function prefixToBase(c) { if (c === CP_b || c === CP_B) { return 2; } else if (c === CP_o || c === CP_O) { return 8; } else if (c === CP_t || c === CP_T) { return 10; } else if (c === CP_x || c === CP_X) { return 16; } else { return -1; } } function validateJsonObjectJS(schema, input) { var report = mod_jsonschema.validate(input, schema); if (report.errors.length === 0) return null; var error = report.errors[0]; var propname = error["property"]; var reason = error["message"].toLowerCase(); var i, j; if ((i = reason.indexOf("the property ")) != -1 && (j = reason.indexOf(" is not defined in the schema and the schema does not allow additional properties")) != -1) { i += "the property ".length; if (propname === "") propname = reason.substr(i, j - i); else propname = propname + "." + reason.substr(i, j - i); reason = "unsupported property"; } var rv = new mod_verror.VError('property "%s": %s', propname, reason); rv.jsv_details = error; return rv; } function randElt(arr) { mod_assert.ok(Array.isArray(arr) && arr.length > 0, "randElt argument must be a non-empty array"); return arr[Math.floor(Math.random() * arr.length)]; } function assertHrtime(a) { mod_assert.ok(a[0] >= 0 && a[1] >= 0, "negative numbers not allowed in hrtimes"); mod_assert.ok(a[1] < 1e9, "nanoseconds column overflow"); } function hrtimeDiff(a, b) { assertHrtime(a); assertHrtime(b); mod_assert.ok(a[0] > b[0] || a[0] == b[0] && a[1] >= b[1], "negative differences not allowed"); var rv = [a[0] - b[0], 0]; if (a[1] >= b[1]) { rv[1] = a[1] - b[1]; } else { rv[0]--; rv[1] = 1e9 - (b[1] - a[1]); } return rv; } function hrtimeNanosec(a) { assertHrtime(a); return Math.floor(a[0] * 1e9 + a[1]); } function hrtimeMicrosec(a) { assertHrtime(a); return Math.floor(a[0] * 1e6 + a[1] / 1e3); } function hrtimeMillisec(a) { assertHrtime(a); return Math.floor(a[0] * 1e3 + a[1] / 1e6); } function hrtimeAccum(a, b) { assertHrtime(a); assertHrtime(b); a[1] += b[1]; if (a[1] >= 1e9) { a[0]++; a[1] -= 1e9; } a[0] += b[0]; return a; } function hrtimeAdd(a, b) { assertHrtime(a); var rv = [a[0], a[1]]; return hrtimeAccum(rv, b); } function extraProperties(obj, allowed) { mod_assert.ok(typeof obj === "object" && obj !== null, "obj argument must be a non-null object"); mod_assert.ok(Array.isArray(allowed), "allowed argument must be an array of strings"); for (var i = 0; i < allowed.length; i++) { mod_assert.ok(typeof allowed[i] === "string", "allowed argument must be an array of strings"); } return Object.keys(obj).filter(function(key) { return allowed.indexOf(key) === -1; }); } function mergeObjects(provided, overrides, defaults) { var rv, k; rv = {}; if (defaults) { for (k in defaults) rv[k] = defaults[k]; } if (provided) { for (k in provided) rv[k] = provided[k]; } if (overrides) { for (k in overrides) rv[k] = overrides[k]; } return rv; } } }); // node_modules/http-signature/lib/signer.js var require_signer = __commonJS({ "node_modules/http-signature/lib/signer.js"(exports, module2) { var assert = require_assert(); var crypto2 = require("crypto"); var http = require("http"); var util = require("util"); var sshpk = require_lib2(); var jsprim = require_jsprim(); var utils = require_utils3(); var sprintf = require("util").format; var HASH_ALGOS = utils.HASH_ALGOS; var PK_ALGOS = utils.PK_ALGOS; var InvalidAlgorithmError = utils.InvalidAlgorithmError; var HttpSignatureError = utils.HttpSignatureError; var validateAlgorithm = utils.validateAlgorithm; var AUTHZ_FMT = 'Signature keyId="%s",algorithm="%s",headers="%s",signature="%s"'; function MissingHeaderError(message) { HttpSignatureError.call(this, message, MissingHeaderError); } util.inherits(MissingHeaderError, HttpSignatureError); function StrictParsingError(message) { HttpSignatureError.call(this, message, StrictParsingError); } util.inherits(StrictParsingError, HttpSignatureError); function RequestSigner(options) { assert.object(options, "options"); var alg = []; if (options.algorithm !== void 0) { assert.string(options.algorithm, "options.algorithm"); alg = validateAlgorithm(options.algorithm); } this.rs_alg = alg; if (options.sign !== void 0) { assert.func(options.sign, "options.sign"); this.rs_signFunc = options.sign; } else if (alg[0] === "hmac" && options.key !== void 0) { assert.string(options.keyId, "options.keyId"); this.rs_keyId = options.keyId; if (typeof options.key !== "string" && !Buffer.isBuffer(options.key)) throw new TypeError("options.key for HMAC must be a string or Buffer"); this.rs_signer = crypto2.createHmac(alg[1].toUpperCase(), options.key); this.rs_signer.sign = function() { var digest = this.digest("base64"); return { hashAlgorithm: alg[1], toString: function() { return digest; } }; }; } else if (options.key !== void 0) { var key = options.key; if (typeof key === "string" || Buffer.isBuffer(key)) key = sshpk.parsePrivateKey(key); assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]), "options.key must be a sshpk.PrivateKey"); this.rs_key = key; assert.string(options.keyId, "options.keyId"); this.rs_keyId = options.keyId; if (!PK_ALGOS[key.type]) { throw new InvalidAlgorithmError(key.type.toUpperCase() + " type keys are not supported"); } if (alg[0] !== void 0 && key.type !== alg[0]) { throw new InvalidAlgorithmError("options.key must be a " + alg[0].toUpperCase() + " key, was given a " + key.type.toUpperCase() + " key instead"); } this.rs_signer = key.createSign(alg[1]); } else { throw new TypeError("options.sign (func) or options.key is required"); } this.rs_headers = []; this.rs_lines = []; } RequestSigner.prototype.writeHeader = function(header, value) { assert.string(header, "header"); header = header.toLowerCase(); assert.string(value, "value"); this.rs_headers.push(header); if (this.rs_signFunc) { this.rs_lines.push(header + ": " + value); } else { var line = header + ": " + value; if (this.rs_headers.length > 0) line = "\n" + line; this.rs_signer.update(line); } return value; }; RequestSigner.prototype.writeDateHeader = function() { return this.writeHeader("date", jsprim.rfc1123(new Date())); }; RequestSigner.prototype.writeTarget = function(method, path3) { assert.string(method, "method"); assert.string(path3, "path"); method = method.toLowerCase(); this.writeHeader("(request-target)", method + " " + path3); }; RequestSigner.prototype.sign = function(cb) { assert.func(cb, "callback"); if (this.rs_headers.length < 1) throw new Error("At least one header must be signed"); var alg, authz; if (this.rs_signFunc) { var data = this.rs_lines.join("\n"); var self2 = this; this.rs_signFunc(data, function(err, sig) { if (err) { cb(err); return; } try { assert.object(sig, "signature"); assert.string(sig.keyId, "signature.keyId"); assert.string(sig.algorithm, "signature.algorithm"); assert.string(sig.signature, "signature.signature"); alg = validateAlgorithm(sig.algorithm); authz = sprintf(AUTHZ_FMT, sig.keyId, sig.algorithm, self2.rs_headers.join(" "), sig.signature); } catch (e) { cb(e); return; } cb(null, authz); }); } else { try { var sigObj = this.rs_signer.sign(); } catch (e) { cb(e); return; } alg = (this.rs_alg[0] || this.rs_key.type) + "-" + sigObj.hashAlgorithm; var signature = sigObj.toString(); authz = sprintf(AUTHZ_FMT, this.rs_keyId, alg, this.rs_headers.join(" "), signature); cb(null, authz); } }; module2.exports = { isSigner: function(obj) { if (typeof obj === "object" && obj instanceof RequestSigner) return true; return false; }, createSigner: function createSigner(options) { return new RequestSigner(options); }, signRequest: function signRequest(request2, options) { assert.object(request2, "request"); assert.object(options, "options"); assert.optionalString(options.algorithm, "options.algorithm"); assert.string(options.keyId, "options.keyId"); assert.optionalArrayOfString(options.headers, "options.headers"); assert.optionalString(options.httpVersion, "options.httpVersion"); if (!request2.getHeader("Date")) request2.setHeader("Date", jsprim.rfc1123(new Date())); if (!options.headers) options.headers = ["date"]; if (!options.httpVersion) options.httpVersion = "1.1"; var alg = []; if (options.algorithm) { options.algorithm = options.algorithm.toLowerCase(); alg = validateAlgorithm(options.algorithm); } var i; var stringToSign = ""; for (i = 0; i < options.headers.length; i++) { if (typeof options.headers[i] !== "string") throw new TypeError("options.headers must be an array of Strings"); var h = options.headers[i].toLowerCase(); if (h === "request-line") { if (!options.strict) { stringToSign += request2.method + " " + request2.path + " HTTP/" + options.httpVersion; } else { throw new StrictParsingError("request-line is not a valid header with strict parsing enabled."); } } else if (h === "(request-target)") { stringToSign += "(request-target): " + request2.method.toLowerCase() + " " + request2.path; } else { var value = request2.getHeader(h); if (value === void 0 || value === "") { throw new MissingHeaderError(h + " was not in the request"); } stringToSign += h + ": " + value; } if (i + 1 < options.headers.length) stringToSign += "\n"; } if (request2.hasOwnProperty("_stringToSign")) { request2._stringToSign = stringToSign; } var signature; if (alg[0] === "hmac") { if (typeof options.key !== "string" && !Buffer.isBuffer(options.key)) throw new TypeError("options.key must be a string or Buffer"); var hmac = crypto2.createHmac(alg[1].toUpperCase(), options.key); hmac.update(stringToSign); signature = hmac.digest("base64"); } else { var key = options.key; if (typeof key === "string" || Buffer.isBuffer(key)) key = sshpk.parsePrivateKey(options.key); assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]), "options.key must be a sshpk.PrivateKey"); if (!PK_ALGOS[key.type]) { throw new InvalidAlgorithmError(key.type.toUpperCase() + " type keys are not supported"); } if (alg[0] !== void 0 && key.type !== alg[0]) { throw new InvalidAlgorithmError("options.key must be a " + alg[0].toUpperCase() + " key, was given a " + key.type.toUpperCase() + " key instead"); } var signer = key.createSign(alg[1]); signer.update(stringToSign); var sigObj = signer.sign(); if (!HASH_ALGOS[sigObj.hashAlgorithm]) { throw new InvalidAlgorithmError(sigObj.hashAlgorithm.toUpperCase() + " is not a supported hash algorithm"); } options.algorithm = key.type + "-" + sigObj.hashAlgorithm; signature = sigObj.toString(); assert.notStrictEqual(signature, "", "empty signature produced"); } var authzHeaderName = options.authorizationHeaderName || "Authorization"; request2.setHeader(authzHeaderName, sprintf(AUTHZ_FMT, options.keyId, options.algorithm, options.headers.join(" "), signature)); return true; } }; } }); // node_modules/http-signature/lib/verify.js var require_verify = __commonJS({ "node_modules/http-signature/lib/verify.js"(exports, module2) { var assert = require_assert(); var crypto2 = require("crypto"); var sshpk = require_lib2(); var utils = require_utils3(); var HASH_ALGOS = utils.HASH_ALGOS; var PK_ALGOS = utils.PK_ALGOS; var InvalidAlgorithmError = utils.InvalidAlgorithmError; var HttpSignatureError = utils.HttpSignatureError; var validateAlgorithm = utils.validateAlgorithm; module2.exports = { verifySignature: function verifySignature(parsedSignature, pubkey) { assert.object(parsedSignature, "parsedSignature"); if (typeof pubkey === "string" || Buffer.isBuffer(pubkey)) pubkey = sshpk.parseKey(pubkey); assert.ok(sshpk.Key.isKey(pubkey, [1, 1]), "pubkey must be a sshpk.Key"); var alg = validateAlgorithm(parsedSignature.algorithm); if (alg[0] === "hmac" || alg[0] !== pubkey.type) return false; var v = pubkey.createVerify(alg[1]); v.update(parsedSignature.signingString); return v.verify(parsedSignature.params.signature, "base64"); }, verifyHMAC: function verifyHMAC(parsedSignature, secret) { assert.object(parsedSignature, "parsedHMAC"); assert.string(secret, "secret"); var alg = validateAlgorithm(parsedSignature.algorithm); if (alg[0] !== "hmac") return false; var hashAlg = alg[1].toUpperCase(); var hmac = crypto2.createHmac(hashAlg, secret); hmac.update(parsedSignature.signingString); var h1 = crypto2.createHmac(hashAlg, secret); h1.update(hmac.digest()); h1 = h1.digest(); var h2 = crypto2.createHmac(hashAlg, secret); h2.update(new Buffer(parsedSignature.params.signature, "base64")); h2 = h2.digest(); if (typeof h1 === "string") return h1 === h2; if (Buffer.isBuffer(h1) && !h1.equals) return h1.toString("binary") === h2.toString("binary"); return h1.equals(h2); } }; } }); // node_modules/http-signature/lib/index.js var require_lib3 = __commonJS({ "node_modules/http-signature/lib/index.js"(exports, module2) { var parser = require_parser(); var signer = require_signer(); var verify = require_verify(); var utils = require_utils3(); module2.exports = { parse: parser.parseRequest, parseRequest: parser.parseRequest, sign: signer.signRequest, signRequest: signer.signRequest, createSigner: signer.createSigner, isSigner: signer.isSigner, sshKeyToPEM: utils.sshKeyToPEM, sshKeyFingerprint: utils.fingerprint, pemToRsaSSHKey: utils.pemToRsaSSHKey, verify: verify.verifySignature, verifySignature: verify.verifySignature, verifyHMAC: verify.verifyHMAC }; } }); // node_modules/mime-db/db.json var require_db = __commonJS({ "node_modules/mime-db/db.json"(exports, module2) { module2.exports = { "application/1d-interleaved-parityfec": { source: "iana" }, "application/3gpdash-qoe-report+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/3gpp-ims+xml": { source: "iana", compressible: true }, "application/3gpphal+json": { source: "iana", compressible: true }, "application/3gpphalforms+json": { source: "iana", compressible: true }, "application/a2l": { source: "iana" }, "application/ace+cbor": { source: "iana" }, "application/activemessage": { source: "iana" }, "application/activity+json": { source: "iana", compressible: true }, "application/alto-costmap+json": { source: "iana", compressible: true }, "application/alto-costmapfilter+json": { source: "iana", compressible: true }, "application/alto-directory+json": { source: "iana", compressible: true }, "application/alto-endpointcost+json": { source: "iana", compressible: true }, "application/alto-endpointcostparams+json": { source: "iana", compressible: true }, "application/alto-endpointprop+json": { source: "iana", compressible: true }, "application/alto-endpointpropparams+json": { source: "iana", compressible: true }, "application/alto-error+json": { source: "iana", compressible: true }, "application/alto-networkmap+json": { source: "iana", compressible: true }, "application/alto-networkmapfilter+json": { source: "iana", compressible: true }, "application/alto-updatestreamcontrol+json": { source: "iana", compressible: true }, "application/alto-updatestreamparams+json": { source: "iana", compressible: true }, "application/aml": { source: "iana" }, "application/andrew-inset": { source: "iana", extensions: ["ez"] }, "application/applefile": { source: "iana" }, "application/applixware": { source: "apache", extensions: ["aw"] }, "application/at+jwt": { source: "iana" }, "application/atf": { source: "iana" }, "application/atfx": { source: "iana" }, "application/atom+xml": { source: "iana", compressible: true, extensions: ["atom"] }, "application/atomcat+xml": { source: "iana", compressible: true, extensions: ["atomcat"] }, "application/atomdeleted+xml": { source: "iana", compressible: true, extensions: ["atomdeleted"] }, "application/atomicmail": { source: "iana" }, "application/atomsvc+xml": { source: "iana", compressible: true, extensions: ["atomsvc"] }, "application/atsc-dwd+xml": { source: "iana", compressible: true, extensions: ["dwd"] }, "application/atsc-dynamic-event-message": { source: "iana" }, "application/atsc-held+xml": { source: "iana", compressible: true, extensions: ["held"] }, "application/atsc-rdt+json": { source: "iana", compressible: true }, "application/atsc-rsat+xml": { source: "iana", compressible: true, extensions: ["rsat"] }, "application/atxml": { source: "iana" }, "application/auth-policy+xml": { source: "iana", compressible: true }, "application/bacnet-xdd+zip": { source: "iana", compressible: false }, "application/batch-smtp": { source: "iana" }, "application/bdoc": { compressible: false, extensions: ["bdoc"] }, "application/beep+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/calendar+json": { source: "iana", compressible: true }, "application/calendar+xml": { source: "iana", compressible: true, extensions: ["xcs"] }, "application/call-completion": { source: "iana" }, "application/cals-1840": { source: "iana" }, "application/captive+json": { source: "iana", compressible: true }, "application/cbor": { source: "iana" }, "application/cbor-seq": { source: "iana" }, "application/cccex": { source: "iana" }, "application/ccmp+xml": { source: "iana", compressible: true }, "application/ccxml+xml": { source: "iana", compressible: true, extensions: ["ccxml"] }, "application/cdfx+xml": { source: "iana", compressible: true, extensions: ["cdfx"] }, "application/cdmi-capability": { source: "iana", extensions: ["cdmia"] }, "application/cdmi-container": { source: "iana", extensions: ["cdmic"] }, "application/cdmi-domain": { source: "iana", extensions: ["cdmid"] }, "application/cdmi-object": { source: "iana", extensions: ["cdmio"] }, "application/cdmi-queue": { source: "iana", extensions: ["cdmiq"] }, "application/cdni": { source: "iana" }, "application/cea": { source: "iana" }, "application/cea-2018+xml": { source: "iana", compressible: true }, "application/cellml+xml": { source: "iana", compressible: true }, "application/cfw": { source: "iana" }, "application/city+json": { source: "iana", compressible: true }, "application/clr": { source: "iana" }, "application/clue+xml": { source: "iana", compressible: true }, "application/clue_info+xml": { source: "iana", compressible: true }, "application/cms": { source: "iana" }, "application/cnrp+xml": { source: "iana", compressible: true }, "application/coap-group+json": { source: "iana", compressible: true }, "application/coap-payload": { source: "iana" }, "application/commonground": { source: "iana" }, "application/conference-info+xml": { source: "iana", compressible: true }, "application/cose": { source: "iana" }, "application/cose-key": { source: "iana" }, "application/cose-key-set": { source: "iana" }, "application/cpl+xml": { source: "iana", compressible: true, extensions: ["cpl"] }, "application/csrattrs": { source: "iana" }, "application/csta+xml": { source: "iana", compressible: true }, "application/cstadata+xml": { source: "iana", compressible: true }, "application/csvm+json": { source: "iana", compressible: true }, "application/cu-seeme": { source: "apache", extensions: ["cu"] }, "application/cwt": { source: "iana" }, "application/cybercash": { source: "iana" }, "application/dart": { compressible: true }, "application/dash+xml": { source: "iana", compressible: true, extensions: ["mpd"] }, "application/dash-patch+xml": { source: "iana", compressible: true, extensions: ["mpp"] }, "application/dashdelta": { source: "iana" }, "application/davmount+xml": { source: "iana", compressible: true, extensions: ["davmount"] }, "application/dca-rft": { source: "iana" }, "application/dcd": { source: "iana" }, "application/dec-dx": { source: "iana" }, "application/dialog-info+xml": { source: "iana", compressible: true }, "application/dicom": { source: "iana" }, "application/dicom+json": { source: "iana", compressible: true }, "application/dicom+xml": { source: "iana", compressible: true }, "application/dii": { source: "iana" }, "application/dit": { source: "iana" }, "application/dns": { source: "iana" }, "application/dns+json": { source: "iana", compressible: true }, "application/dns-message": { source: "iana" }, "application/docbook+xml": { source: "apache", compressible: true, extensions: ["dbk"] }, "application/dots+cbor": { source: "iana" }, "application/dskpp+xml": { source: "iana", compressible: true }, "application/dssc+der": { source: "iana", extensions: ["dssc"] }, "application/dssc+xml": { source: "iana", compressible: true, extensions: ["xdssc"] }, "application/dvcs": { source: "iana" }, "application/ecmascript": { source: "iana", compressible: true, extensions: ["es", "ecma"] }, "application/edi-consent": { source: "iana" }, "application/edi-x12": { source: "iana", compressible: false }, "application/edifact": { source: "iana", compressible: false }, "application/efi": { source: "iana" }, "application/elm+json": { source: "iana", charset: "UTF-8", compressible: true }, "application/elm+xml": { source: "iana", compressible: true }, "application/emergencycalldata.cap+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/emergencycalldata.comment+xml": { source: "iana", compressible: true }, "application/emergencycalldata.control+xml": { source: "iana", compressible: true }, "application/emergencycalldata.deviceinfo+xml": { source: "iana", compressible: true }, "application/emergencycalldata.ecall.msd": { source: "iana" }, "application/emergencycalldata.providerinfo+xml": { source: "iana", compressible: true }, "application/emergencycalldata.serviceinfo+xml": { source: "iana", compressible: true }, "application/emergencycalldata.subscriberinfo+xml": { source: "iana", compressible: true }, "application/emergencycalldata.veds+xml": { source: "iana", compressible: true }, "application/emma+xml": { source: "iana", compressible: true, extensions: ["emma"] }, "application/emotionml+xml": { source: "iana", compressible: true, extensions: ["emotionml"] }, "application/encaprtp": { source: "iana" }, "application/epp+xml": { source: "iana", compressible: true }, "application/epub+zip": { source: "iana", compressible: false, extensions: ["epub"] }, "application/eshop": { source: "iana" }, "application/exi": { source: "iana", extensions: ["exi"] }, "application/expect-ct-report+json": { source: "iana", compressible: true }, "application/express": { source: "iana", extensions: ["exp"] }, "application/fastinfoset": { source: "iana" }, "application/fastsoap": { source: "iana" }, "application/fdt+xml": { source: "iana", compressible: true, extensions: ["fdt"] }, "application/fhir+json": { source: "iana", charset: "UTF-8", compressible: true }, "application/fhir+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/fido.trusted-apps+json": { compressible: true }, "application/fits": { source: "iana" }, "application/flexfec": { source: "iana" }, "application/font-sfnt": { source: "iana" }, "application/font-tdpfr": { source: "iana", extensions: ["pfr"] }, "application/font-woff": { source: "iana", compressible: false }, "application/framework-attributes+xml": { source: "iana", compressible: true }, "application/geo+json": { source: "iana", compressible: true, extensions: ["geojson"] }, "application/geo+json-seq": { source: "iana" }, "application/geopackage+sqlite3": { source: "iana" }, "application/geoxacml+xml": { source: "iana", compressible: true }, "application/gltf-buffer": { source: "iana" }, "application/gml+xml": { source: "iana", compressible: true, extensions: ["gml"] }, "application/gpx+xml": { source: "apache", compressible: true, extensions: ["gpx"] }, "application/gxf": { source: "apache", extensions: ["gxf"] }, "application/gzip": { source: "iana", compressible: false, extensions: ["gz"] }, "application/h224": { source: "iana" }, "application/held+xml": { source: "iana", compressible: true }, "application/hjson": { extensions: ["hjson"] }, "application/http": { source: "iana" }, "application/hyperstudio": { source: "iana", extensions: ["stk"] }, "application/ibe-key-request+xml": { source: "iana", compressible: true }, "application/ibe-pkg-reply+xml": { source: "iana", compressible: true }, "application/ibe-pp-data": { source: "iana" }, "application/iges": { source: "iana" }, "application/im-iscomposing+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/index": { source: "iana" }, "application/index.cmd": { source: "iana" }, "application/index.obj": { source: "iana" }, "application/index.response": { source: "iana" }, "application/index.vnd": { source: "iana" }, "application/inkml+xml": { source: "iana", compressible: true, extensions: ["ink", "inkml"] }, "application/iotp": { source: "iana" }, "application/ipfix": { source: "iana", extensions: ["ipfix"] }, "application/ipp": { source: "iana" }, "application/isup": { source: "iana" }, "application/its+xml": { source: "iana", compressible: true, extensions: ["its"] }, "application/java-archive": { source: "apache", compressible: false, extensions: ["jar", "war", "ear"] }, "application/java-serialized-object": { source: "apache", compressible: false, extensions: ["ser"] }, "application/java-vm": { source: "apache", compressible: false, extensions: ["class"] }, "application/javascript": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["js", "mjs"] }, "application/jf2feed+json": { source: "iana", compressible: true }, "application/jose": { source: "iana" }, "application/jose+json": { source: "iana", compressible: true }, "application/jrd+json": { source: "iana", compressible: true }, "application/jscalendar+json": { source: "iana", compressible: true }, "application/json": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["json", "map"] }, "application/json-patch+json": { source: "iana", compressible: true }, "application/json-seq": { source: "iana" }, "application/json5": { extensions: ["json5"] }, "application/jsonml+json": { source: "apache", compressible: true, extensions: ["jsonml"] }, "application/jwk+json": { source: "iana", compressible: true }, "application/jwk-set+json": { source: "iana", compressible: true }, "application/jwt": { source: "iana" }, "application/kpml-request+xml": { source: "iana", compressible: true }, "application/kpml-response+xml": { source: "iana", compressible: true }, "application/ld+json": { source: "iana", compressible: true, extensions: ["jsonld"] }, "application/lgr+xml": { source: "iana", compressible: true, extensions: ["lgr"] }, "application/link-format": { source: "iana" }, "application/load-control+xml": { source: "iana", compressible: true }, "application/lost+xml": { source: "iana", compressible: true, extensions: ["lostxml"] }, "application/lostsync+xml": { source: "iana", compressible: true }, "application/lpf+zip": { source: "iana", compressible: false }, "application/lxf": { source: "iana" }, "application/mac-binhex40": { source: "iana", extensions: ["hqx"] }, "application/mac-compactpro": { source: "apache", extensions: ["cpt"] }, "application/macwriteii": { source: "iana" }, "application/mads+xml": { source: "iana", compressible: true, extensions: ["mads"] }, "application/manifest+json": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["webmanifest"] }, "application/marc": { source: "iana", extensions: ["mrc"] }, "application/marcxml+xml": { source: "iana", compressible: true, extensions: ["mrcx"] }, "application/mathematica": { source: "iana", extensions: ["ma", "nb", "mb"] }, "application/mathml+xml": { source: "iana", compressible: true, extensions: ["mathml"] }, "application/mathml-content+xml": { source: "iana", compressible: true }, "application/mathml-presentation+xml": { source: "iana", compressible: true }, "application/mbms-associated-procedure-description+xml": { source: "iana", compressible: true }, "application/mbms-deregister+xml": { source: "iana", compressible: true }, "application/mbms-envelope+xml": { source: "iana", compressible: true }, "application/mbms-msk+xml": { source: "iana", compressible: true }, "application/mbms-msk-response+xml": { source: "iana", compressible: true }, "application/mbms-protection-description+xml": { source: "iana", compressible: true }, "application/mbms-reception-report+xml": { source: "iana", compressible: true }, "application/mbms-register+xml": { source: "iana", compressible: true }, "application/mbms-register-response+xml": { source: "iana", compressible: true }, "application/mbms-schedule+xml": { source: "iana", compressible: true }, "application/mbms-user-service-description+xml": { source: "iana", compressible: true }, "application/mbox": { source: "iana", extensions: ["mbox"] }, "application/media-policy-dataset+xml": { source: "iana", compressible: true, extensions: ["mpf"] }, "application/media_control+xml": { source: "iana", compressible: true }, "application/mediaservercontrol+xml": { source: "iana", compressible: true, extensions: ["mscml"] }, "application/merge-patch+json": { source: "iana", compressible: true }, "application/metalink+xml": { source: "apache", compressible: true, extensions: ["metalink"] }, "application/metalink4+xml": { source: "iana", compressible: true, extensions: ["meta4"] }, "application/mets+xml": { source: "iana", compressible: true, extensions: ["mets"] }, "application/mf4": { source: "iana" }, "application/mikey": { source: "iana" }, "application/mipc": { source: "iana" }, "application/missing-blocks+cbor-seq": { source: "iana" }, "application/mmt-aei+xml": { source: "iana", compressible: true, extensions: ["maei"] }, "application/mmt-usd+xml": { source: "iana", compressible: true, extensions: ["musd"] }, "application/mods+xml": { source: "iana", compressible: true, extensions: ["mods"] }, "application/moss-keys": { source: "iana" }, "application/moss-signature": { source: "iana" }, "application/mosskey-data": { source: "iana" }, "application/mosskey-request": { source: "iana" }, "application/mp21": { source: "iana", extensions: ["m21", "mp21"] }, "application/mp4": { source: "iana", extensions: ["mp4s", "m4p"] }, "application/mpeg4-generic": { source: "iana" }, "application/mpeg4-iod": { source: "iana" }, "application/mpeg4-iod-xmt": { source: "iana" }, "application/mrb-consumer+xml": { source: "iana", compressible: true }, "application/mrb-publish+xml": { source: "iana", compressible: true }, "application/msc-ivr+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/msc-mixer+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/msword": { source: "iana", compressible: false, extensions: ["doc", "dot"] }, "application/mud+json": { source: "iana", compressible: true }, "application/multipart-core": { source: "iana" }, "application/mxf": { source: "iana", extensions: ["mxf"] }, "application/n-quads": { source: "iana", extensions: ["nq"] }, "application/n-triples": { source: "iana", extensions: ["nt"] }, "application/nasdata": { source: "iana" }, "application/news-checkgroups": { source: "iana", charset: "US-ASCII" }, "application/news-groupinfo": { source: "iana", charset: "US-ASCII" }, "application/news-transmission": { source: "iana" }, "application/nlsml+xml": { source: "iana", compressible: true }, "application/node": { source: "iana", extensions: ["cjs"] }, "application/nss": { source: "iana" }, "application/oauth-authz-req+jwt": { source: "iana" }, "application/oblivious-dns-message": { source: "iana" }, "application/ocsp-request": { source: "iana" }, "application/ocsp-response": { source: "iana" }, "application/octet-stream": { source: "iana", compressible: false, extensions: ["bin", "dms", "lrf", "mar", "so", "dist", "distz", "pkg", "bpk", "dump", "elc", "deploy", "exe", "dll", "deb", "dmg", "iso", "img", "msi", "msp", "msm", "buffer"] }, "application/oda": { source: "iana", extensions: ["oda"] }, "application/odm+xml": { source: "iana", compressible: true }, "application/odx": { source: "iana" }, "application/oebps-package+xml": { source: "iana", compressible: true, extensions: ["opf"] }, "application/ogg": { source: "iana", compressible: false, extensions: ["ogx"] }, "application/omdoc+xml": { source: "apache", compressible: true, extensions: ["omdoc"] }, "application/onenote": { source: "apache", extensions: ["onetoc", "onetoc2", "onetmp", "onepkg"] }, "application/opc-nodeset+xml": { source: "iana", compressible: true }, "application/oscore": { source: "iana" }, "application/oxps": { source: "iana", extensions: ["oxps"] }, "application/p21": { source: "iana" }, "application/p21+zip": { source: "iana", compressible: false }, "application/p2p-overlay+xml": { source: "iana", compressible: true, extensions: ["relo"] }, "application/parityfec": { source: "iana" }, "application/passport": { source: "iana" }, "application/patch-ops-error+xml": { source: "iana", compressible: true, extensions: ["xer"] }, "application/pdf": { source: "iana", compressible: false, extensions: ["pdf"] }, "application/pdx": { source: "iana" }, "application/pem-certificate-chain": { source: "iana" }, "application/pgp-encrypted": { source: "iana", compressible: false, extensions: ["pgp"] }, "application/pgp-keys": { source: "iana", extensions: ["asc"] }, "application/pgp-signature": { source: "iana", extensions: ["asc", "sig"] }, "application/pics-rules": { source: "apache", extensions: ["prf"] }, "application/pidf+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/pidf-diff+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/pkcs10": { source: "iana", extensions: ["p10"] }, "application/pkcs12": { source: "iana" }, "application/pkcs7-mime": { source: "iana", extensions: ["p7m", "p7c"] }, "application/pkcs7-signature": { source: "iana", extensions: ["p7s"] }, "application/pkcs8": { source: "iana", extensions: ["p8"] }, "application/pkcs8-encrypted": { source: "iana" }, "application/pkix-attr-cert": { source: "iana", extensions: ["ac"] }, "application/pkix-cert": { source: "iana", extensions: ["cer"] }, "application/pkix-crl": { source: "iana", extensions: ["crl"] }, "application/pkix-pkipath": { source: "iana", extensions: ["pkipath"] }, "application/pkixcmp": { source: "iana", extensions: ["pki"] }, "application/pls+xml": { source: "iana", compressible: true, extensions: ["pls"] }, "application/poc-settings+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/postscript": { source: "iana", compressible: true, extensions: ["ai", "eps", "ps"] }, "application/ppsp-tracker+json": { source: "iana", compressible: true }, "application/problem+json": { source: "iana", compressible: true }, "application/problem+xml": { source: "iana", compressible: true }, "application/provenance+xml": { source: "iana", compressible: true, extensions: ["provx"] }, "application/prs.alvestrand.titrax-sheet": { source: "iana" }, "application/prs.cww": { source: "iana", extensions: ["cww"] }, "application/prs.cyn": { source: "iana", charset: "7-BIT" }, "application/prs.hpub+zip": { source: "iana", compressible: false }, "application/prs.nprend": { source: "iana" }, "application/prs.plucker": { source: "iana" }, "application/prs.rdf-xml-crypt": { source: "iana" }, "application/prs.xsf+xml": { source: "iana", compressible: true }, "application/pskc+xml": { source: "iana", compressible: true, extensions: ["pskcxml"] }, "application/pvd+json": { source: "iana", compressible: true }, "application/qsig": { source: "iana" }, "application/raml+yaml": { compressible: true, extensions: ["raml"] }, "application/raptorfec": { source: "iana" }, "application/rdap+json": { source: "iana", compressible: true }, "application/rdf+xml": { source: "iana", compressible: true, extensions: ["rdf", "owl"] }, "application/reginfo+xml": { source: "iana", compressible: true, extensions: ["rif"] }, "application/relax-ng-compact-syntax": { source: "iana", extensions: ["rnc"] }, "application/remote-printing": { source: "iana" }, "application/reputon+json": { source: "iana", compressible: true }, "application/resource-lists+xml": { source: "iana", compressible: true, extensions: ["rl"] }, "application/resource-lists-diff+xml": { source: "iana", compressible: true, extensions: ["rld"] }, "application/rfc+xml": { source: "iana", compressible: true }, "application/riscos": { source: "iana" }, "application/rlmi+xml": { source: "iana", compressible: true }, "application/rls-services+xml": { source: "iana", compressible: true, extensions: ["rs"] }, "application/route-apd+xml": { source: "iana", compressible: true, extensions: ["rapd"] }, "application/route-s-tsid+xml": { source: "iana", compressible: true, extensions: ["sls"] }, "application/route-usd+xml": { source: "iana", compressible: true, extensions: ["rusd"] }, "application/rpki-ghostbusters": { source: "iana", extensions: ["gbr"] }, "application/rpki-manifest": { source: "iana", extensions: ["mft"] }, "application/rpki-publication": { source: "iana" }, "application/rpki-roa": { source: "iana", extensions: ["roa"] }, "application/rpki-updown": { source: "iana" }, "application/rsd+xml": { source: "apache", compressible: true, extensions: ["rsd"] }, "application/rss+xml": { source: "apache", compressible: true, extensions: ["rss"] }, "application/rtf": { source: "iana", compressible: true, extensions: ["rtf"] }, "application/rtploopback": { source: "iana" }, "application/rtx": { source: "iana" }, "application/samlassertion+xml": { source: "iana", compressible: true }, "application/samlmetadata+xml": { source: "iana", compressible: true }, "application/sarif+json": { source: "iana", compressible: true }, "application/sarif-external-properties+json": { source: "iana", compressible: true }, "application/sbe": { source: "iana" }, "application/sbml+xml": { source: "iana", compressible: true, extensions: ["sbml"] }, "application/scaip+xml": { source: "iana", compressible: true }, "application/scim+json": { source: "iana", compressible: true }, "application/scvp-cv-request": { source: "iana", extensions: ["scq"] }, "application/scvp-cv-response": { source: "iana", extensions: ["scs"] }, "application/scvp-vp-request": { source: "iana", extensions: ["spq"] }, "application/scvp-vp-response": { source: "iana", extensions: ["spp"] }, "application/sdp": { source: "iana", extensions: ["sdp"] }, "application/secevent+jwt": { source: "iana" }, "application/senml+cbor": { source: "iana" }, "application/senml+json": { source: "iana", compressible: true }, "application/senml+xml": { source: "iana", compressible: true, extensions: ["senmlx"] }, "application/senml-etch+cbor": { source: "iana" }, "application/senml-etch+json": { source: "iana", compressible: true }, "application/senml-exi": { source: "iana" }, "application/sensml+cbor": { source: "iana" }, "application/sensml+json": { source: "iana", compressible: true }, "application/sensml+xml": { source: "iana", compressible: true, extensions: ["sensmlx"] }, "application/sensml-exi": { source: "iana" }, "application/sep+xml": { source: "iana", compressible: true }, "application/sep-exi": { source: "iana" }, "application/session-info": { source: "iana" }, "application/set-payment": { source: "iana" }, "application/set-payment-initiation": { source: "iana", extensions: ["setpay"] }, "application/set-registration": { source: "iana" }, "application/set-registration-initiation": { source: "iana", extensions: ["setreg"] }, "application/sgml": { source: "iana" }, "application/sgml-open-catalog": { source: "iana" }, "application/shf+xml": { source: "iana", compressible: true, extensions: ["shf"] }, "application/sieve": { source: "iana", extensions: ["siv", "sieve"] }, "application/simple-filter+xml": { source: "iana", compressible: true }, "application/simple-message-summary": { source: "iana" }, "application/simplesymbolcontainer": { source: "iana" }, "application/sipc": { source: "iana" }, "application/slate": { source: "iana" }, "application/smil": { source: "iana" }, "application/smil+xml": { source: "iana", compressible: true, extensions: ["smi", "smil"] }, "application/smpte336m": { source: "iana" }, "application/soap+fastinfoset": { source: "iana" }, "application/soap+xml": { source: "iana", compressible: true }, "application/sparql-query": { source: "iana", extensions: ["rq"] }, "application/sparql-results+xml": { source: "iana", compressible: true, extensions: ["srx"] }, "application/spdx+json": { source: "iana", compressible: true }, "application/spirits-event+xml": { source: "iana", compressible: true }, "application/sql": { source: "iana" }, "application/srgs": { source: "iana", extensions: ["gram"] }, "application/srgs+xml": { source: "iana", compressible: true, extensions: ["grxml"] }, "application/sru+xml": { source: "iana", compressible: true, extensions: ["sru"] }, "application/ssdl+xml": { source: "apache", compressible: true, extensions: ["ssdl"] }, "application/ssml+xml": { source: "iana", compressible: true, extensions: ["ssml"] }, "application/stix+json": { source: "iana", compressible: true }, "application/swid+xml": { source: "iana", compressible: true, extensions: ["swidtag"] }, "application/tamp-apex-update": { source: "iana" }, "application/tamp-apex-update-confirm": { source: "iana" }, "application/tamp-community-update": { source: "iana" }, "application/tamp-community-update-confirm": { source: "iana" }, "application/tamp-error": { source: "iana" }, "application/tamp-sequence-adjust": { source: "iana" }, "application/tamp-sequence-adjust-confirm": { source: "iana" }, "application/tamp-status-query": { source: "iana" }, "application/tamp-status-response": { source: "iana" }, "application/tamp-update": { source: "iana" }, "application/tamp-update-confirm": { source: "iana" }, "application/tar": { compressible: true }, "application/taxii+json": { source: "iana", compressible: true }, "application/td+json": { source: "iana", compressible: true }, "application/tei+xml": { source: "iana", compressible: true, extensions: ["tei", "teicorpus"] }, "application/tetra_isi": { source: "iana" }, "application/thraud+xml": { source: "iana", compressible: true, extensions: ["tfi"] }, "application/timestamp-query": { source: "iana" }, "application/timestamp-reply": { source: "iana" }, "application/timestamped-data": { source: "iana", extensions: ["tsd"] }, "application/tlsrpt+gzip": { source: "iana" }, "application/tlsrpt+json": { source: "iana", compressible: true }, "application/tnauthlist": { source: "iana" }, "application/token-introspection+jwt": { source: "iana" }, "application/toml": { compressible: true, extensions: ["toml"] }, "application/trickle-ice-sdpfrag": { source: "iana" }, "application/trig": { source: "iana", extensions: ["trig"] }, "application/ttml+xml": { source: "iana", compressible: true, extensions: ["ttml"] }, "application/tve-trigger": { source: "iana" }, "application/tzif": { source: "iana" }, "application/tzif-leap": { source: "iana" }, "application/ubjson": { compressible: false, extensions: ["ubj"] }, "application/ulpfec": { source: "iana" }, "application/urc-grpsheet+xml": { source: "iana", compressible: true }, "application/urc-ressheet+xml": { source: "iana", compressible: true, extensions: ["rsheet"] }, "application/urc-targetdesc+xml": { source: "iana", compressible: true, extensions: ["td"] }, "application/urc-uisocketdesc+xml": { source: "iana", compressible: true }, "application/vcard+json": { source: "iana", compressible: true }, "application/vcard+xml": { source: "iana", compressible: true }, "application/vemmi": { source: "iana" }, "application/vividence.scriptfile": { source: "apache" }, "application/vnd.1000minds.decision-model+xml": { source: "iana", compressible: true, extensions: ["1km"] }, "application/vnd.3gpp-prose+xml": { source: "iana", compressible: true }, "application/vnd.3gpp-prose-pc3ch+xml": { source: "iana", compressible: true }, "application/vnd.3gpp-v2x-local-service-information": { source: "iana" }, "application/vnd.3gpp.5gnas": { source: "iana" }, "application/vnd.3gpp.access-transfer-events+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.bsf+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.gmop+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.gtpc": { source: "iana" }, "application/vnd.3gpp.interworking-data": { source: "iana" }, "application/vnd.3gpp.lpp": { source: "iana" }, "application/vnd.3gpp.mc-signalling-ear": { source: "iana" }, "application/vnd.3gpp.mcdata-affiliation-command+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcdata-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcdata-payload": { source: "iana" }, "application/vnd.3gpp.mcdata-service-config+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcdata-signalling": { source: "iana" }, "application/vnd.3gpp.mcdata-ue-config+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcdata-user-profile+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-affiliation-command+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-floor-request+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-location-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-mbms-usage-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-service-config+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-signed+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-ue-config+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-ue-init-config+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcptt-user-profile+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-affiliation-command+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-affiliation-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-location-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-mbms-usage-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-service-config+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-transmission-request+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-ue-config+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mcvideo-user-profile+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.mid-call+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.ngap": { source: "iana" }, "application/vnd.3gpp.pfcp": { source: "iana" }, "application/vnd.3gpp.pic-bw-large": { source: "iana", extensions: ["plb"] }, "application/vnd.3gpp.pic-bw-small": { source: "iana", extensions: ["psb"] }, "application/vnd.3gpp.pic-bw-var": { source: "iana", extensions: ["pvb"] }, "application/vnd.3gpp.s1ap": { source: "iana" }, "application/vnd.3gpp.sms": { source: "iana" }, "application/vnd.3gpp.sms+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.srvcc-ext+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.srvcc-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.state-and-event-info+xml": { source: "iana", compressible: true }, "application/vnd.3gpp.ussd+xml": { source: "iana", compressible: true }, "application/vnd.3gpp2.bcmcsinfo+xml": { source: "iana", compressible: true }, "application/vnd.3gpp2.sms": { source: "iana" }, "application/vnd.3gpp2.tcap": { source: "iana", extensions: ["tcap"] }, "application/vnd.3lightssoftware.imagescal": { source: "iana" }, "application/vnd.3m.post-it-notes": { source: "iana", extensions: ["pwn"] }, "application/vnd.accpac.simply.aso": { source: "iana", extensions: ["aso"] }, "application/vnd.accpac.simply.imp": { source: "iana", extensions: ["imp"] }, "application/vnd.acucobol": { source: "iana", extensions: ["acu"] }, "application/vnd.acucorp": { source: "iana", extensions: ["atc", "acutc"] }, "application/vnd.adobe.air-application-installer-package+zip": { source: "apache", compressible: false, extensions: ["air"] }, "application/vnd.adobe.flash.movie": { source: "iana" }, "application/vnd.adobe.formscentral.fcdt": { source: "iana", extensions: ["fcdt"] }, "application/vnd.adobe.fxp": { source: "iana", extensions: ["fxp", "fxpl"] }, "application/vnd.adobe.partial-upload": { source: "iana" }, "application/vnd.adobe.xdp+xml": { source: "iana", compressible: true, extensions: ["xdp"] }, "application/vnd.adobe.xfdf": { source: "iana", extensions: ["xfdf"] }, "application/vnd.aether.imp": { source: "iana" }, "application/vnd.afpc.afplinedata": { source: "iana" }, "application/vnd.afpc.afplinedata-pagedef": { source: "iana" }, "application/vnd.afpc.cmoca-cmresource": { source: "iana" }, "application/vnd.afpc.foca-charset": { source: "iana" }, "application/vnd.afpc.foca-codedfont": { source: "iana" }, "application/vnd.afpc.foca-codepage": { source: "iana" }, "application/vnd.afpc.modca": { source: "iana" }, "application/vnd.afpc.modca-cmtable": { source: "iana" }, "application/vnd.afpc.modca-formdef": { source: "iana" }, "application/vnd.afpc.modca-mediummap": { source: "iana" }, "application/vnd.afpc.modca-objectcontainer": { source: "iana" }, "application/vnd.afpc.modca-overlay": { source: "iana" }, "application/vnd.afpc.modca-pagesegment": { source: "iana" }, "application/vnd.age": { source: "iana", extensions: ["age"] }, "application/vnd.ah-barcode": { source: "iana" }, "application/vnd.ahead.space": { source: "iana", extensions: ["ahead"] }, "application/vnd.airzip.filesecure.azf": { source: "iana", extensions: ["azf"] }, "application/vnd.airzip.filesecure.azs": { source: "iana", extensions: ["azs"] }, "application/vnd.amadeus+json": { source: "iana", compressible: true }, "application/vnd.amazon.ebook": { source: "apache", extensions: ["azw"] }, "application/vnd.amazon.mobi8-ebook": { source: "iana" }, "application/vnd.americandynamics.acc": { source: "iana", extensions: ["acc"] }, "application/vnd.amiga.ami": { source: "iana", extensions: ["ami"] }, "application/vnd.amundsen.maze+xml": { source: "iana", compressible: true }, "application/vnd.android.ota": { source: "iana" }, "application/vnd.android.package-archive": { source: "apache", compressible: false, extensions: ["apk"] }, "application/vnd.anki": { source: "iana" }, "application/vnd.anser-web-certificate-issue-initiation": { source: "iana", extensions: ["cii"] }, "application/vnd.anser-web-funds-transfer-initiation": { source: "apache", extensions: ["fti"] }, "application/vnd.antix.game-component": { source: "iana", extensions: ["atx"] }, "application/vnd.apache.arrow.file": { source: "iana" }, "application/vnd.apache.arrow.stream": { source: "iana" }, "application/vnd.apache.thrift.binary": { source: "iana" }, "application/vnd.apache.thrift.compact": { source: "iana" }, "application/vnd.apache.thrift.json": { source: "iana" }, "application/vnd.api+json": { source: "iana", compressible: true }, "application/vnd.aplextor.warrp+json": { source: "iana", compressible: true }, "application/vnd.apothekende.reservation+json": { source: "iana", compressible: true }, "application/vnd.apple.installer+xml": { source: "iana", compressible: true, extensions: ["mpkg"] }, "application/vnd.apple.keynote": { source: "iana", extensions: ["key"] }, "application/vnd.apple.mpegurl": { source: "iana", extensions: ["m3u8"] }, "application/vnd.apple.numbers": { source: "iana", extensions: ["numbers"] }, "application/vnd.apple.pages": { source: "iana", extensions: ["pages"] }, "application/vnd.apple.pkpass": { compressible: false, extensions: ["pkpass"] }, "application/vnd.arastra.swi": { source: "iana" }, "application/vnd.aristanetworks.swi": { source: "iana", extensions: ["swi"] }, "application/vnd.artisan+json": { source: "iana", compressible: true }, "application/vnd.artsquare": { source: "iana" }, "application/vnd.astraea-software.iota": { source: "iana", extensions: ["iota"] }, "application/vnd.audiograph": { source: "iana", extensions: ["aep"] }, "application/vnd.autopackage": { source: "iana" }, "application/vnd.avalon+json": { source: "iana", compressible: true }, "application/vnd.avistar+xml": { source: "iana", compressible: true }, "application/vnd.balsamiq.bmml+xml": { source: "iana", compressible: true, extensions: ["bmml"] }, "application/vnd.balsamiq.bmpr": { source: "iana" }, "application/vnd.banana-accounting": { source: "iana" }, "application/vnd.bbf.usp.error": { source: "iana" }, "application/vnd.bbf.usp.msg": { source: "iana" }, "application/vnd.bbf.usp.msg+json": { source: "iana", compressible: true }, "application/vnd.bekitzur-stech+json": { source: "iana", compressible: true }, "application/vnd.bint.med-content": { source: "iana" }, "application/vnd.biopax.rdf+xml": { source: "iana", compressible: true }, "application/vnd.blink-idb-value-wrapper": { source: "iana" }, "application/vnd.blueice.multipass": { source: "iana", extensions: ["mpm"] }, "application/vnd.bluetooth.ep.oob": { source: "iana" }, "application/vnd.bluetooth.le.oob": { source: "iana" }, "application/vnd.bmi": { source: "iana", extensions: ["bmi"] }, "application/vnd.bpf": { source: "iana" }, "application/vnd.bpf3": { source: "iana" }, "application/vnd.businessobjects": { source: "iana", extensions: ["rep"] }, "application/vnd.byu.uapi+json": { source: "iana", compressible: true }, "application/vnd.cab-jscript": { source: "iana" }, "application/vnd.canon-cpdl": { source: "iana" }, "application/vnd.canon-lips": { source: "iana" }, "application/vnd.capasystems-pg+json": { source: "iana", compressible: true }, "application/vnd.cendio.thinlinc.clientconf": { source: "iana" }, "application/vnd.century-systems.tcp_stream": { source: "iana" }, "application/vnd.chemdraw+xml": { source: "iana", compressible: true, extensions: ["cdxml"] }, "application/vnd.chess-pgn": { source: "iana" }, "application/vnd.chipnuts.karaoke-mmd": { source: "iana", extensions: ["mmd"] }, "application/vnd.ciedi": { source: "iana" }, "application/vnd.cinderella": { source: "iana", extensions: ["cdy"] }, "application/vnd.cirpack.isdn-ext": { source: "iana" }, "application/vnd.citationstyles.style+xml": { source: "iana", compressible: true, extensions: ["csl"] }, "application/vnd.claymore": { source: "iana", extensions: ["cla"] }, "application/vnd.cloanto.rp9": { source: "iana", extensions: ["rp9"] }, "application/vnd.clonk.c4group": { source: "iana", extensions: ["c4g", "c4d", "c4f", "c4p", "c4u"] }, "application/vnd.cluetrust.cartomobile-config": { source: "iana", extensions: ["c11amc"] }, "application/vnd.cluetrust.cartomobile-config-pkg": { source: "iana", extensions: ["c11amz"] }, "application/vnd.coffeescript": { source: "iana" }, "application/vnd.collabio.xodocuments.document": { source: "iana" }, "application/vnd.collabio.xodocuments.document-template": { source: "iana" }, "application/vnd.collabio.xodocuments.presentation": { source: "iana" }, "application/vnd.collabio.xodocuments.presentation-template": { source: "iana" }, "application/vnd.collabio.xodocuments.spreadsheet": { source: "iana" }, "application/vnd.collabio.xodocuments.spreadsheet-template": { source: "iana" }, "application/vnd.collection+json": { source: "iana", compressible: true }, "application/vnd.collection.doc+json": { source: "iana", compressible: true }, "application/vnd.collection.next+json": { source: "iana", compressible: true }, "application/vnd.comicbook+zip": { source: "iana", compressible: false }, "application/vnd.comicbook-rar": { source: "iana" }, "application/vnd.commerce-battelle": { source: "iana" }, "application/vnd.commonspace": { source: "iana", extensions: ["csp"] }, "application/vnd.contact.cmsg": { source: "iana", extensions: ["cdbcmsg"] }, "application/vnd.coreos.ignition+json": { source: "iana", compressible: true }, "application/vnd.cosmocaller": { source: "iana", extensions: ["cmc"] }, "application/vnd.crick.clicker": { source: "iana", extensions: ["clkx"] }, "application/vnd.crick.clicker.keyboard": { source: "iana", extensions: ["clkk"] }, "application/vnd.crick.clicker.palette": { source: "iana", extensions: ["clkp"] }, "application/vnd.crick.clicker.template": { source: "iana", extensions: ["clkt"] }, "application/vnd.crick.clicker.wordbank": { source: "iana", extensions: ["clkw"] }, "application/vnd.criticaltools.wbs+xml": { source: "iana", compressible: true, extensions: ["wbs"] }, "application/vnd.cryptii.pipe+json": { source: "iana", compressible: true }, "application/vnd.crypto-shade-file": { source: "iana" }, "application/vnd.cryptomator.encrypted": { source: "iana" }, "application/vnd.cryptomator.vault": { source: "iana" }, "application/vnd.ctc-posml": { source: "iana", extensions: ["pml"] }, "application/vnd.ctct.ws+xml": { source: "iana", compressible: true }, "application/vnd.cups-pdf": { source: "iana" }, "application/vnd.cups-postscript": { source: "iana" }, "application/vnd.cups-ppd": { source: "iana", extensions: ["ppd"] }, "application/vnd.cups-raster": { source: "iana" }, "application/vnd.cups-raw": { source: "iana" }, "application/vnd.curl": { source: "iana" }, "application/vnd.curl.car": { source: "apache", extensions: ["car"] }, "application/vnd.curl.pcurl": { source: "apache", extensions: ["pcurl"] }, "application/vnd.cyan.dean.root+xml": { source: "iana", compressible: true }, "application/vnd.cybank": { source: "iana" }, "application/vnd.cyclonedx+json": { source: "iana", compressible: true }, "application/vnd.cyclonedx+xml": { source: "iana", compressible: true }, "application/vnd.d2l.coursepackage1p0+zip": { source: "iana", compressible: false }, "application/vnd.d3m-dataset": { source: "iana" }, "application/vnd.d3m-problem": { source: "iana" }, "application/vnd.dart": { source: "iana", compressible: true, extensions: ["dart"] }, "application/vnd.data-vision.rdz": { source: "iana", extensions: ["rdz"] }, "application/vnd.datapackage+json": { source: "iana", compressible: true }, "application/vnd.dataresource+json": { source: "iana", compressible: true }, "application/vnd.dbf": { source: "iana", extensions: ["dbf"] }, "application/vnd.debian.binary-package": { source: "iana" }, "application/vnd.dece.data": { source: "iana", extensions: ["uvf", "uvvf", "uvd", "uvvd"] }, "application/vnd.dece.ttml+xml": { source: "iana", compressible: true, extensions: ["uvt", "uvvt"] }, "application/vnd.dece.unspecified": { source: "iana", extensions: ["uvx", "uvvx"] }, "application/vnd.dece.zip": { source: "iana", extensions: ["uvz", "uvvz"] }, "application/vnd.denovo.fcselayout-link": { source: "iana", extensions: ["fe_launch"] }, "application/vnd.desmume.movie": { source: "iana" }, "application/vnd.dir-bi.plate-dl-nosuffix": { source: "iana" }, "application/vnd.dm.delegation+xml": { source: "iana", compressible: true }, "application/vnd.dna": { source: "iana", extensions: ["dna"] }, "application/vnd.document+json": { source: "iana", compressible: true }, "application/vnd.dolby.mlp": { source: "apache", extensions: ["mlp"] }, "application/vnd.dolby.mobile.1": { source: "iana" }, "application/vnd.dolby.mobile.2": { source: "iana" }, "application/vnd.doremir.scorecloud-binary-document": { source: "iana" }, "application/vnd.dpgraph": { source: "iana", extensions: ["dpg"] }, "application/vnd.dreamfactory": { source: "iana", extensions: ["dfac"] }, "application/vnd.drive+json": { source: "iana", compressible: true }, "application/vnd.ds-keypoint": { source: "apache", extensions: ["kpxx"] }, "application/vnd.dtg.local": { source: "iana" }, "application/vnd.dtg.local.flash": { source: "iana" }, "application/vnd.dtg.local.html": { source: "iana" }, "application/vnd.dvb.ait": { source: "iana", extensions: ["ait"] }, "application/vnd.dvb.dvbisl+xml": { source: "iana", compressible: true }, "application/vnd.dvb.dvbj": { source: "iana" }, "application/vnd.dvb.esgcontainer": { source: "iana" }, "application/vnd.dvb.ipdcdftnotifaccess": { source: "iana" }, "application/vnd.dvb.ipdcesgaccess": { source: "iana" }, "application/vnd.dvb.ipdcesgaccess2": { source: "iana" }, "application/vnd.dvb.ipdcesgpdd": { source: "iana" }, "application/vnd.dvb.ipdcroaming": { source: "iana" }, "application/vnd.dvb.iptv.alfec-base": { source: "iana" }, "application/vnd.dvb.iptv.alfec-enhancement": { source: "iana" }, "application/vnd.dvb.notif-aggregate-root+xml": { source: "iana", compressible: true }, "application/vnd.dvb.notif-container+xml": { source: "iana", compressible: true }, "application/vnd.dvb.notif-generic+xml": { source: "iana", compressible: true }, "application/vnd.dvb.notif-ia-msglist+xml": { source: "iana", compressible: true }, "application/vnd.dvb.notif-ia-registration-request+xml": { source: "iana", compressible: true }, "application/vnd.dvb.notif-ia-registration-response+xml": { source: "iana", compressible: true }, "application/vnd.dvb.notif-init+xml": { source: "iana", compressible: true }, "application/vnd.dvb.pfr": { source: "iana" }, "application/vnd.dvb.service": { source: "iana", extensions: ["svc"] }, "application/vnd.dxr": { source: "iana" }, "application/vnd.dynageo": { source: "iana", extensions: ["geo"] }, "application/vnd.dzr": { source: "iana" }, "application/vnd.easykaraoke.cdgdownload": { source: "iana" }, "application/vnd.ecdis-update": { source: "iana" }, "application/vnd.ecip.rlp": { source: "iana" }, "application/vnd.eclipse.ditto+json": { source: "iana", compressible: true }, "application/vnd.ecowin.chart": { source: "iana", extensions: ["mag"] }, "application/vnd.ecowin.filerequest": { source: "iana" }, "application/vnd.ecowin.fileupdate": { source: "iana" }, "application/vnd.ecowin.series": { source: "iana" }, "application/vnd.ecowin.seriesrequest": { source: "iana" }, "application/vnd.ecowin.seriesupdate": { source: "iana" }, "application/vnd.efi.img": { source: "iana" }, "application/vnd.efi.iso": { source: "iana" }, "application/vnd.emclient.accessrequest+xml": { source: "iana", compressible: true }, "application/vnd.enliven": { source: "iana", extensions: ["nml"] }, "application/vnd.enphase.envoy": { source: "iana" }, "application/vnd.eprints.data+xml": { source: "iana", compressible: true }, "application/vnd.epson.esf": { source: "iana", extensions: ["esf"] }, "application/vnd.epson.msf": { source: "iana", extensions: ["msf"] }, "application/vnd.epson.quickanime": { source: "iana", extensions: ["qam"] }, "application/vnd.epson.salt": { source: "iana", extensions: ["slt"] }, "application/vnd.epson.ssf": { source: "iana", extensions: ["ssf"] }, "application/vnd.ericsson.quickcall": { source: "iana" }, "application/vnd.espass-espass+zip": { source: "iana", compressible: false }, "application/vnd.eszigno3+xml": { source: "iana", compressible: true, extensions: ["es3", "et3"] }, "application/vnd.etsi.aoc+xml": { source: "iana", compressible: true }, "application/vnd.etsi.asic-e+zip": { source: "iana", compressible: false }, "application/vnd.etsi.asic-s+zip": { source: "iana", compressible: false }, "application/vnd.etsi.cug+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvcommand+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvdiscovery+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvprofile+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvsad-bc+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvsad-cod+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvsad-npvr+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvservice+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvsync+xml": { source: "iana", compressible: true }, "application/vnd.etsi.iptvueprofile+xml": { source: "iana", compressible: true }, "application/vnd.etsi.mcid+xml": { source: "iana", compressible: true }, "application/vnd.etsi.mheg5": { source: "iana" }, "application/vnd.etsi.overload-control-policy-dataset+xml": { source: "iana", compressible: true }, "application/vnd.etsi.pstn+xml": { source: "iana", compressible: true }, "application/vnd.etsi.sci+xml": { source: "iana", compressible: true }, "application/vnd.etsi.simservs+xml": { source: "iana", compressible: true }, "application/vnd.etsi.timestamp-token": { source: "iana" }, "application/vnd.etsi.tsl+xml": { source: "iana", compressible: true }, "application/vnd.etsi.tsl.der": { source: "iana" }, "application/vnd.eu.kasparian.car+json": { source: "iana", compressible: true }, "application/vnd.eudora.data": { source: "iana" }, "application/vnd.evolv.ecig.profile": { source: "iana" }, "application/vnd.evolv.ecig.settings": { source: "iana" }, "application/vnd.evolv.ecig.theme": { source: "iana" }, "application/vnd.exstream-empower+zip": { source: "iana", compressible: false }, "application/vnd.exstream-package": { source: "iana" }, "application/vnd.ezpix-album": { source: "iana", extensions: ["ez2"] }, "application/vnd.ezpix-package": { source: "iana", extensions: ["ez3"] }, "application/vnd.f-secure.mobile": { source: "iana" }, "application/vnd.familysearch.gedcom+zip": { source: "iana", compressible: false }, "application/vnd.fastcopy-disk-image": { source: "iana" }, "application/vnd.fdf": { source: "iana", extensions: ["fdf"] }, "application/vnd.fdsn.mseed": { source: "iana", extensions: ["mseed"] }, "application/vnd.fdsn.seed": { source: "iana", extensions: ["seed", "dataless"] }, "application/vnd.ffsns": { source: "iana" }, "application/vnd.ficlab.flb+zip": { source: "iana", compressible: false }, "application/vnd.filmit.zfc": { source: "iana" }, "application/vnd.fints": { source: "iana" }, "application/vnd.firemonkeys.cloudcell": { source: "iana" }, "application/vnd.flographit": { source: "iana", extensions: ["gph"] }, "application/vnd.fluxtime.clip": { source: "iana", extensions: ["ftc"] }, "application/vnd.font-fontforge-sfd": { source: "iana" }, "application/vnd.framemaker": { source: "iana", extensions: ["fm", "frame", "maker", "book"] }, "application/vnd.frogans.fnc": { source: "iana", extensions: ["fnc"] }, "application/vnd.frogans.ltf": { source: "iana", extensions: ["ltf"] }, "application/vnd.fsc.weblaunch": { source: "iana", extensions: ["fsc"] }, "application/vnd.fujifilm.fb.docuworks": { source: "iana" }, "application/vnd.fujifilm.fb.docuworks.binder": { source: "iana" }, "application/vnd.fujifilm.fb.docuworks.container": { source: "iana" }, "application/vnd.fujifilm.fb.jfi+xml": { source: "iana", compressible: true }, "application/vnd.fujitsu.oasys": { source: "iana", extensions: ["oas"] }, "application/vnd.fujitsu.oasys2": { source: "iana", extensions: ["oa2"] }, "application/vnd.fujitsu.oasys3": { source: "iana", extensions: ["oa3"] }, "application/vnd.fujitsu.oasysgp": { source: "iana", extensions: ["fg5"] }, "application/vnd.fujitsu.oasysprs": { source: "iana", extensions: ["bh2"] }, "application/vnd.fujixerox.art-ex": { source: "iana" }, "application/vnd.fujixerox.art4": { source: "iana" }, "application/vnd.fujixerox.ddd": { source: "iana", extensions: ["ddd"] }, "application/vnd.fujixerox.docuworks": { source: "iana", extensions: ["xdw"] }, "application/vnd.fujixerox.docuworks.binder": { source: "iana", extensions: ["xbd"] }, "application/vnd.fujixerox.docuworks.container": { source: "iana" }, "application/vnd.fujixerox.hbpl": { source: "iana" }, "application/vnd.fut-misnet": { source: "iana" }, "application/vnd.futoin+cbor": { source: "iana" }, "application/vnd.futoin+json": { source: "iana", compressible: true }, "application/vnd.fuzzysheet": { source: "iana", extensions: ["fzs"] }, "application/vnd.genomatix.tuxedo": { source: "iana", extensions: ["txd"] }, "application/vnd.gentics.grd+json": { source: "iana", compressible: true }, "application/vnd.geo+json": { source: "iana", compressible: true }, "application/vnd.geocube+xml": { source: "iana", compressible: true }, "application/vnd.geogebra.file": { source: "iana", extensions: ["ggb"] }, "application/vnd.geogebra.slides": { source: "iana" }, "application/vnd.geogebra.tool": { source: "iana", extensions: ["ggt"] }, "application/vnd.geometry-explorer": { source: "iana", extensions: ["gex", "gre"] }, "application/vnd.geonext": { source: "iana", extensions: ["gxt"] }, "application/vnd.geoplan": { source: "iana", extensions: ["g2w"] }, "application/vnd.geospace": { source: "iana", extensions: ["g3w"] }, "application/vnd.gerber": { source: "iana" }, "application/vnd.globalplatform.card-content-mgt": { source: "iana" }, "application/vnd.globalplatform.card-content-mgt-response": { source: "iana" }, "application/vnd.gmx": { source: "iana", extensions: ["gmx"] }, "application/vnd.google-apps.document": { compressible: false, extensions: ["gdoc"] }, "application/vnd.google-apps.presentation": { compressible: false, extensions: ["gslides"] }, "application/vnd.google-apps.spreadsheet": { compressible: false, extensions: ["gsheet"] }, "application/vnd.google-earth.kml+xml": { source: "iana", compressible: true, extensions: ["kml"] }, "application/vnd.google-earth.kmz": { source: "iana", compressible: false, extensions: ["kmz"] }, "application/vnd.gov.sk.e-form+xml": { source: "iana", compressible: true }, "application/vnd.gov.sk.e-form+zip": { source: "iana", compressible: false }, "application/vnd.gov.sk.xmldatacontainer+xml": { source: "iana", compressible: true }, "application/vnd.grafeq": { source: "iana", extensions: ["gqf", "gqs"] }, "application/vnd.gridmp": { source: "iana" }, "application/vnd.groove-account": { source: "iana", extensions: ["gac"] }, "application/vnd.groove-help": { source: "iana", extensions: ["ghf"] }, "application/vnd.groove-identity-message": { source: "iana", extensions: ["gim"] }, "application/vnd.groove-injector": { source: "iana", extensions: ["grv"] }, "application/vnd.groove-tool-message": { source: "iana", extensions: ["gtm"] }, "application/vnd.groove-tool-template": { source: "iana", extensions: ["tpl"] }, "application/vnd.groove-vcard": { source: "iana", extensions: ["vcg"] }, "application/vnd.hal+json": { source: "iana", compressible: true }, "application/vnd.hal+xml": { source: "iana", compressible: true, extensions: ["hal"] }, "application/vnd.handheld-entertainment+xml": { source: "iana", compressible: true, extensions: ["zmm"] }, "application/vnd.hbci": { source: "iana", extensions: ["hbci"] }, "application/vnd.hc+json": { source: "iana", compressible: true }, "application/vnd.hcl-bireports": { source: "iana" }, "application/vnd.hdt": { source: "iana" }, "application/vnd.heroku+json": { source: "iana", compressible: true }, "application/vnd.hhe.lesson-player": { source: "iana", extensions: ["les"] }, "application/vnd.hl7cda+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/vnd.hl7v2+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/vnd.hp-hpgl": { source: "iana", extensions: ["hpgl"] }, "application/vnd.hp-hpid": { source: "iana", extensions: ["hpid"] }, "application/vnd.hp-hps": { source: "iana", extensions: ["hps"] }, "application/vnd.hp-jlyt": { source: "iana", extensions: ["jlt"] }, "application/vnd.hp-pcl": { source: "iana", extensions: ["pcl"] }, "application/vnd.hp-pclxl": { source: "iana", extensions: ["pclxl"] }, "application/vnd.httphone": { source: "iana" }, "application/vnd.hydrostatix.sof-data": { source: "iana", extensions: ["sfd-hdstx"] }, "application/vnd.hyper+json": { source: "iana", compressible: true }, "application/vnd.hyper-item+json": { source: "iana", compressible: true }, "application/vnd.hyperdrive+json": { source: "iana", compressible: true }, "application/vnd.hzn-3d-crossword": { source: "iana" }, "application/vnd.ibm.afplinedata": { source: "iana" }, "application/vnd.ibm.electronic-media": { source: "iana" }, "application/vnd.ibm.minipay": { source: "iana", extensions: ["mpy"] }, "application/vnd.ibm.modcap": { source: "iana", extensions: ["afp", "listafp", "list3820"] }, "application/vnd.ibm.rights-management": { source: "iana", extensions: ["irm"] }, "application/vnd.ibm.secure-container": { source: "iana", extensions: ["sc"] }, "application/vnd.iccprofile": { source: "iana", extensions: ["icc", "icm"] }, "application/vnd.ieee.1905": { source: "iana" }, "application/vnd.igloader": { source: "iana", extensions: ["igl"] }, "application/vnd.imagemeter.folder+zip": { source: "iana", compressible: false }, "application/vnd.imagemeter.image+zip": { source: "iana", compressible: false }, "application/vnd.immervision-ivp": { source: "iana", extensions: ["ivp"] }, "application/vnd.immervision-ivu": { source: "iana", extensions: ["ivu"] }, "application/vnd.ims.imsccv1p1": { source: "iana" }, "application/vnd.ims.imsccv1p2": { source: "iana" }, "application/vnd.ims.imsccv1p3": { source: "iana" }, "application/vnd.ims.lis.v2.result+json": { source: "iana", compressible: true }, "application/vnd.ims.lti.v2.toolconsumerprofile+json": { source: "iana", compressible: true }, "application/vnd.ims.lti.v2.toolproxy+json": { source: "iana", compressible: true }, "application/vnd.ims.lti.v2.toolproxy.id+json": { source: "iana", compressible: true }, "application/vnd.ims.lti.v2.toolsettings+json": { source: "iana", compressible: true }, "application/vnd.ims.lti.v2.toolsettings.simple+json": { source: "iana", compressible: true }, "application/vnd.informedcontrol.rms+xml": { source: "iana", compressible: true }, "application/vnd.informix-visionary": { source: "iana" }, "application/vnd.infotech.project": { source: "iana" }, "application/vnd.infotech.project+xml": { source: "iana", compressible: true }, "application/vnd.innopath.wamp.notification": { source: "iana" }, "application/vnd.insors.igm": { source: "iana", extensions: ["igm"] }, "application/vnd.intercon.formnet": { source: "iana", extensions: ["xpw", "xpx"] }, "application/vnd.intergeo": { source: "iana", extensions: ["i2g"] }, "application/vnd.intertrust.digibox": { source: "iana" }, "application/vnd.intertrust.nncp": { source: "iana" }, "application/vnd.intu.qbo": { source: "iana", extensions: ["qbo"] }, "application/vnd.intu.qfx": { source: "iana", extensions: ["qfx"] }, "application/vnd.iptc.g2.catalogitem+xml": { source: "iana", compressible: true }, "application/vnd.iptc.g2.conceptitem+xml": { source: "iana", compressible: true }, "application/vnd.iptc.g2.knowledgeitem+xml": { source: "iana", compressible: true }, "application/vnd.iptc.g2.newsitem+xml": { source: "iana", compressible: true }, "application/vnd.iptc.g2.newsmessage+xml": { source: "iana", compressible: true }, "application/vnd.iptc.g2.packageitem+xml": { source: "iana", compressible: true }, "application/vnd.iptc.g2.planningitem+xml": { source: "iana", compressible: true }, "application/vnd.ipunplugged.rcprofile": { source: "iana", extensions: ["rcprofile"] }, "application/vnd.irepository.package+xml": { source: "iana", compressible: true, extensions: ["irp"] }, "application/vnd.is-xpr": { source: "iana", extensions: ["xpr"] }, "application/vnd.isac.fcs": { source: "iana", extensions: ["fcs"] }, "application/vnd.iso11783-10+zip": { source: "iana", compressible: false }, "application/vnd.jam": { source: "iana", extensions: ["jam"] }, "application/vnd.japannet-directory-service": { source: "iana" }, "application/vnd.japannet-jpnstore-wakeup": { source: "iana" }, "application/vnd.japannet-payment-wakeup": { source: "iana" }, "application/vnd.japannet-registration": { source: "iana" }, "application/vnd.japannet-registration-wakeup": { source: "iana" }, "application/vnd.japannet-setstore-wakeup": { source: "iana" }, "application/vnd.japannet-verification": { source: "iana" }, "application/vnd.japannet-verification-wakeup": { source: "iana" }, "application/vnd.jcp.javame.midlet-rms": { source: "iana", extensions: ["rms"] }, "application/vnd.jisp": { source: "iana", extensions: ["jisp"] }, "application/vnd.joost.joda-archive": { source: "iana", extensions: ["joda"] }, "application/vnd.jsk.isdn-ngn": { source: "iana" }, "application/vnd.kahootz": { source: "iana", extensions: ["ktz", "ktr"] }, "application/vnd.kde.karbon": { source: "iana", extensions: ["karbon"] }, "application/vnd.kde.kchart": { source: "iana", extensions: ["chrt"] }, "application/vnd.kde.kformula": { source: "iana", extensions: ["kfo"] }, "application/vnd.kde.kivio": { source: "iana", extensions: ["flw"] }, "application/vnd.kde.kontour": { source: "iana", extensions: ["kon"] }, "application/vnd.kde.kpresenter": { source: "iana", extensions: ["kpr", "kpt"] }, "application/vnd.kde.kspread": { source: "iana", extensions: ["ksp"] }, "application/vnd.kde.kword": { source: "iana", extensions: ["kwd", "kwt"] }, "application/vnd.kenameaapp": { source: "iana", extensions: ["htke"] }, "application/vnd.kidspiration": { source: "iana", extensions: ["kia"] }, "application/vnd.kinar": { source: "iana", extensions: ["kne", "knp"] }, "application/vnd.koan": { source: "iana", extensions: ["skp", "skd", "skt", "skm"] }, "application/vnd.kodak-descriptor": { source: "iana", extensions: ["sse"] }, "application/vnd.las": { source: "iana" }, "application/vnd.las.las+json": { source: "iana", compressible: true }, "application/vnd.las.las+xml": { source: "iana", compressible: true, extensions: ["lasxml"] }, "application/vnd.laszip": { source: "iana" }, "application/vnd.leap+json": { source: "iana", compressible: true }, "application/vnd.liberty-request+xml": { source: "iana", compressible: true }, "application/vnd.llamagraphics.life-balance.desktop": { source: "iana", extensions: ["lbd"] }, "application/vnd.llamagraphics.life-balance.exchange+xml": { source: "iana", compressible: true, extensions: ["lbe"] }, "application/vnd.logipipe.circuit+zip": { source: "iana", compressible: false }, "application/vnd.loom": { source: "iana" }, "application/vnd.lotus-1-2-3": { source: "iana", extensions: ["123"] }, "application/vnd.lotus-approach": { source: "iana", extensions: ["apr"] }, "application/vnd.lotus-freelance": { source: "iana", extensions: ["pre"] }, "application/vnd.lotus-notes": { source: "iana", extensions: ["nsf"] }, "application/vnd.lotus-organizer": { source: "iana", extensions: ["org"] }, "application/vnd.lotus-screencam": { source: "iana", extensions: ["scm"] }, "application/vnd.lotus-wordpro": { source: "iana", extensions: ["lwp"] }, "application/vnd.macports.portpkg": { source: "iana", extensions: ["portpkg"] }, "application/vnd.mapbox-vector-tile": { source: "iana", extensions: ["mvt"] }, "application/vnd.marlin.drm.actiontoken+xml": { source: "iana", compressible: true }, "application/vnd.marlin.drm.conftoken+xml": { source: "iana", compressible: true }, "application/vnd.marlin.drm.license+xml": { source: "iana", compressible: true }, "application/vnd.marlin.drm.mdcf": { source: "iana" }, "application/vnd.mason+json": { source: "iana", compressible: true }, "application/vnd.maxar.archive.3tz+zip": { source: "iana", compressible: false }, "application/vnd.maxmind.maxmind-db": { source: "iana" }, "application/vnd.mcd": { source: "iana", extensions: ["mcd"] }, "application/vnd.medcalcdata": { source: "iana", extensions: ["mc1"] }, "application/vnd.mediastation.cdkey": { source: "iana", extensions: ["cdkey"] }, "application/vnd.meridian-slingshot": { source: "iana" }, "application/vnd.mfer": { source: "iana", extensions: ["mwf"] }, "application/vnd.mfmp": { source: "iana", extensions: ["mfm"] }, "application/vnd.micro+json": { source: "iana", compressible: true }, "application/vnd.micrografx.flo": { source: "iana", extensions: ["flo"] }, "application/vnd.micrografx.igx": { source: "iana", extensions: ["igx"] }, "application/vnd.microsoft.portable-executable": { source: "iana" }, "application/vnd.microsoft.windows.thumbnail-cache": { source: "iana" }, "application/vnd.miele+json": { source: "iana", compressible: true }, "application/vnd.mif": { source: "iana", extensions: ["mif"] }, "application/vnd.minisoft-hp3000-save": { source: "iana" }, "application/vnd.mitsubishi.misty-guard.trustweb": { source: "iana" }, "application/vnd.mobius.daf": { source: "iana", extensions: ["daf"] }, "application/vnd.mobius.dis": { source: "iana", extensions: ["dis"] }, "application/vnd.mobius.mbk": { source: "iana", extensions: ["mbk"] }, "application/vnd.mobius.mqy": { source: "iana", extensions: ["mqy"] }, "application/vnd.mobius.msl": { source: "iana", extensions: ["msl"] }, "application/vnd.mobius.plc": { source: "iana", extensions: ["plc"] }, "application/vnd.mobius.txf": { source: "iana", extensions: ["txf"] }, "application/vnd.mophun.application": { source: "iana", extensions: ["mpn"] }, "application/vnd.mophun.certificate": { source: "iana", extensions: ["mpc"] }, "application/vnd.motorola.flexsuite": { source: "iana" }, "application/vnd.motorola.flexsuite.adsi": { source: "iana" }, "application/vnd.motorola.flexsuite.fis": { source: "iana" }, "application/vnd.motorola.flexsuite.gotap": { source: "iana" }, "application/vnd.motorola.flexsuite.kmr": { source: "iana" }, "application/vnd.motorola.flexsuite.ttc": { source: "iana" }, "application/vnd.motorola.flexsuite.wem": { source: "iana" }, "application/vnd.motorola.iprm": { source: "iana" }, "application/vnd.mozilla.xul+xml": { source: "iana", compressible: true, extensions: ["xul"] }, "application/vnd.ms-3mfdocument": { source: "iana" }, "application/vnd.ms-artgalry": { source: "iana", extensions: ["cil"] }, "application/vnd.ms-asf": { source: "iana" }, "application/vnd.ms-cab-compressed": { source: "iana", extensions: ["cab"] }, "application/vnd.ms-color.iccprofile": { source: "apache" }, "application/vnd.ms-excel": { source: "iana", compressible: false, extensions: ["xls", "xlm", "xla", "xlc", "xlt", "xlw"] }, "application/vnd.ms-excel.addin.macroenabled.12": { source: "iana", extensions: ["xlam"] }, "application/vnd.ms-excel.sheet.binary.macroenabled.12": { source: "iana", extensions: ["xlsb"] }, "application/vnd.ms-excel.sheet.macroenabled.12": { source: "iana", extensions: ["xlsm"] }, "application/vnd.ms-excel.template.macroenabled.12": { source: "iana", extensions: ["xltm"] }, "application/vnd.ms-fontobject": { source: "iana", compressible: true, extensions: ["eot"] }, "application/vnd.ms-htmlhelp": { source: "iana", extensions: ["chm"] }, "application/vnd.ms-ims": { source: "iana", extensions: ["ims"] }, "application/vnd.ms-lrm": { source: "iana", extensions: ["lrm"] }, "application/vnd.ms-office.activex+xml": { source: "iana", compressible: true }, "application/vnd.ms-officetheme": { source: "iana", extensions: ["thmx"] }, "application/vnd.ms-opentype": { source: "apache", compressible: true }, "application/vnd.ms-outlook": { compressible: false, extensions: ["msg"] }, "application/vnd.ms-package.obfuscated-opentype": { source: "apache" }, "application/vnd.ms-pki.seccat": { source: "apache", extensions: ["cat"] }, "application/vnd.ms-pki.stl": { source: "apache", extensions: ["stl"] }, "application/vnd.ms-playready.initiator+xml": { source: "iana", compressible: true }, "application/vnd.ms-powerpoint": { source: "iana", compressible: false, extensions: ["ppt", "pps", "pot"] }, "application/vnd.ms-powerpoint.addin.macroenabled.12": { source: "iana", extensions: ["ppam"] }, "application/vnd.ms-powerpoint.presentation.macroenabled.12": { source: "iana", extensions: ["pptm"] }, "application/vnd.ms-powerpoint.slide.macroenabled.12": { source: "iana", extensions: ["sldm"] }, "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { source: "iana", extensions: ["ppsm"] }, "application/vnd.ms-powerpoint.template.macroenabled.12": { source: "iana", extensions: ["potm"] }, "application/vnd.ms-printdevicecapabilities+xml": { source: "iana", compressible: true }, "application/vnd.ms-printing.printticket+xml": { source: "apache", compressible: true }, "application/vnd.ms-printschematicket+xml": { source: "iana", compressible: true }, "application/vnd.ms-project": { source: "iana", extensions: ["mpp", "mpt"] }, "application/vnd.ms-tnef": { source: "iana" }, "application/vnd.ms-windows.devicepairing": { source: "iana" }, "application/vnd.ms-windows.nwprinting.oob": { source: "iana" }, "application/vnd.ms-windows.printerpairing": { source: "iana" }, "application/vnd.ms-windows.wsd.oob": { source: "iana" }, "application/vnd.ms-wmdrm.lic-chlg-req": { source: "iana" }, "application/vnd.ms-wmdrm.lic-resp": { source: "iana" }, "application/vnd.ms-wmdrm.meter-chlg-req": { source: "iana" }, "application/vnd.ms-wmdrm.meter-resp": { source: "iana" }, "application/vnd.ms-word.document.macroenabled.12": { source: "iana", extensions: ["docm"] }, "application/vnd.ms-word.template.macroenabled.12": { source: "iana", extensions: ["dotm"] }, "application/vnd.ms-works": { source: "iana", extensions: ["wps", "wks", "wcm", "wdb"] }, "application/vnd.ms-wpl": { source: "iana", extensions: ["wpl"] }, "application/vnd.ms-xpsdocument": { source: "iana", compressible: false, extensions: ["xps"] }, "application/vnd.msa-disk-image": { source: "iana" }, "application/vnd.mseq": { source: "iana", extensions: ["mseq"] }, "application/vnd.msign": { source: "iana" }, "application/vnd.multiad.creator": { source: "iana" }, "application/vnd.multiad.creator.cif": { source: "iana" }, "application/vnd.music-niff": { source: "iana" }, "application/vnd.musician": { source: "iana", extensions: ["mus"] }, "application/vnd.muvee.style": { source: "iana", extensions: ["msty"] }, "application/vnd.mynfc": { source: "iana", extensions: ["taglet"] }, "application/vnd.nacamar.ybrid+json": { source: "iana", compressible: true }, "application/vnd.ncd.control": { source: "iana" }, "application/vnd.ncd.reference": { source: "iana" }, "application/vnd.nearst.inv+json": { source: "iana", compressible: true }, "application/vnd.nebumind.line": { source: "iana" }, "application/vnd.nervana": { source: "iana" }, "application/vnd.netfpx": { source: "iana" }, "application/vnd.neurolanguage.nlu": { source: "iana", extensions: ["nlu"] }, "application/vnd.nimn": { source: "iana" }, "application/vnd.nintendo.nitro.rom": { source: "iana" }, "application/vnd.nintendo.snes.rom": { source: "iana" }, "application/vnd.nitf": { source: "iana", extensions: ["ntf", "nitf"] }, "application/vnd.noblenet-directory": { source: "iana", extensions: ["nnd"] }, "application/vnd.noblenet-sealer": { source: "iana", extensions: ["nns"] }, "application/vnd.noblenet-web": { source: "iana", extensions: ["nnw"] }, "application/vnd.nokia.catalogs": { source: "iana" }, "application/vnd.nokia.conml+wbxml": { source: "iana" }, "application/vnd.nokia.conml+xml": { source: "iana", compressible: true }, "application/vnd.nokia.iptv.config+xml": { source: "iana", compressible: true }, "application/vnd.nokia.isds-radio-presets": { source: "iana" }, "application/vnd.nokia.landmark+wbxml": { source: "iana" }, "application/vnd.nokia.landmark+xml": { source: "iana", compressible: true }, "application/vnd.nokia.landmarkcollection+xml": { source: "iana", compressible: true }, "application/vnd.nokia.n-gage.ac+xml": { source: "iana", compressible: true, extensions: ["ac"] }, "application/vnd.nokia.n-gage.data": { source: "iana", extensions: ["ngdat"] }, "application/vnd.nokia.n-gage.symbian.install": { source: "iana", extensions: ["n-gage"] }, "application/vnd.nokia.ncd": { source: "iana" }, "application/vnd.nokia.pcd+wbxml": { source: "iana" }, "application/vnd.nokia.pcd+xml": { source: "iana", compressible: true }, "application/vnd.nokia.radio-preset": { source: "iana", extensions: ["rpst"] }, "application/vnd.nokia.radio-presets": { source: "iana", extensions: ["rpss"] }, "application/vnd.novadigm.edm": { source: "iana", extensions: ["edm"] }, "application/vnd.novadigm.edx": { source: "iana", extensions: ["edx"] }, "application/vnd.novadigm.ext": { source: "iana", extensions: ["ext"] }, "application/vnd.ntt-local.content-share": { source: "iana" }, "application/vnd.ntt-local.file-transfer": { source: "iana" }, "application/vnd.ntt-local.ogw_remote-access": { source: "iana" }, "application/vnd.ntt-local.sip-ta_remote": { source: "iana" }, "application/vnd.ntt-local.sip-ta_tcp_stream": { source: "iana" }, "application/vnd.oasis.opendocument.chart": { source: "iana", extensions: ["odc"] }, "application/vnd.oasis.opendocument.chart-template": { source: "iana", extensions: ["otc"] }, "application/vnd.oasis.opendocument.database": { source: "iana", extensions: ["odb"] }, "application/vnd.oasis.opendocument.formula": { source: "iana", extensions: ["odf"] }, "application/vnd.oasis.opendocument.formula-template": { source: "iana", extensions: ["odft"] }, "application/vnd.oasis.opendocument.graphics": { source: "iana", compressible: false, extensions: ["odg"] }, "application/vnd.oasis.opendocument.graphics-template": { source: "iana", extensions: ["otg"] }, "application/vnd.oasis.opendocument.image": { source: "iana", extensions: ["odi"] }, "application/vnd.oasis.opendocument.image-template": { source: "iana", extensions: ["oti"] }, "application/vnd.oasis.opendocument.presentation": { source: "iana", compressible: false, extensions: ["odp"] }, "application/vnd.oasis.opendocument.presentation-template": { source: "iana", extensions: ["otp"] }, "application/vnd.oasis.opendocument.spreadsheet": { source: "iana", compressible: false, extensions: ["ods"] }, "application/vnd.oasis.opendocument.spreadsheet-template": { source: "iana", extensions: ["ots"] }, "application/vnd.oasis.opendocument.text": { source: "iana", compressible: false, extensions: ["odt"] }, "application/vnd.oasis.opendocument.text-master": { source: "iana", extensions: ["odm"] }, "application/vnd.oasis.opendocument.text-template": { source: "iana", extensions: ["ott"] }, "application/vnd.oasis.opendocument.text-web": { source: "iana", extensions: ["oth"] }, "application/vnd.obn": { source: "iana" }, "application/vnd.ocf+cbor": { source: "iana" }, "application/vnd.oci.image.manifest.v1+json": { source: "iana", compressible: true }, "application/vnd.oftn.l10n+json": { source: "iana", compressible: true }, "application/vnd.oipf.contentaccessdownload+xml": { source: "iana", compressible: true }, "application/vnd.oipf.contentaccessstreaming+xml": { source: "iana", compressible: true }, "application/vnd.oipf.cspg-hexbinary": { source: "iana" }, "application/vnd.oipf.dae.svg+xml": { source: "iana", compressible: true }, "application/vnd.oipf.dae.xhtml+xml": { source: "iana", compressible: true }, "application/vnd.oipf.mippvcontrolmessage+xml": { source: "iana", compressible: true }, "application/vnd.oipf.pae.gem": { source: "iana" }, "application/vnd.oipf.spdiscovery+xml": { source: "iana", compressible: true }, "application/vnd.oipf.spdlist+xml": { source: "iana", compressible: true }, "application/vnd.oipf.ueprofile+xml": { source: "iana", compressible: true }, "application/vnd.oipf.userprofile+xml": { source: "iana", compressible: true }, "application/vnd.olpc-sugar": { source: "iana", extensions: ["xo"] }, "application/vnd.oma-scws-config": { source: "iana" }, "application/vnd.oma-scws-http-request": { source: "iana" }, "application/vnd.oma-scws-http-response": { source: "iana" }, "application/vnd.oma.bcast.associated-procedure-parameter+xml": { source: "iana", compressible: true }, "application/vnd.oma.bcast.drm-trigger+xml": { source: "iana", compressible: true }, "application/vnd.oma.bcast.imd+xml": { source: "iana", compressible: true }, "application/vnd.oma.bcast.ltkm": { source: "iana" }, "application/vnd.oma.bcast.notification+xml": { source: "iana", compressible: true }, "application/vnd.oma.bcast.provisioningtrigger": { source: "iana" }, "application/vnd.oma.bcast.sgboot": { source: "iana" }, "application/vnd.oma.bcast.sgdd+xml": { source: "iana", compressible: true }, "application/vnd.oma.bcast.sgdu": { source: "iana" }, "application/vnd.oma.bcast.simple-symbol-container": { source: "iana" }, "application/vnd.oma.bcast.smartcard-trigger+xml": { source: "iana", compressible: true }, "application/vnd.oma.bcast.sprov+xml": { source: "iana", compressible: true }, "application/vnd.oma.bcast.stkm": { source: "iana" }, "application/vnd.oma.cab-address-book+xml": { source: "iana", compressible: true }, "application/vnd.oma.cab-feature-handler+xml": { source: "iana", compressible: true }, "application/vnd.oma.cab-pcc+xml": { source: "iana", compressible: true }, "application/vnd.oma.cab-subs-invite+xml": { source: "iana", compressible: true }, "application/vnd.oma.cab-user-prefs+xml": { source: "iana", compressible: true }, "application/vnd.oma.dcd": { source: "iana" }, "application/vnd.oma.dcdc": { source: "iana" }, "application/vnd.oma.dd2+xml": { source: "iana", compressible: true, extensions: ["dd2"] }, "application/vnd.oma.drm.risd+xml": { source: "iana", compressible: true }, "application/vnd.oma.group-usage-list+xml": { source: "iana", compressible: true }, "application/vnd.oma.lwm2m+cbor": { source: "iana" }, "application/vnd.oma.lwm2m+json": { source: "iana", compressible: true }, "application/vnd.oma.lwm2m+tlv": { source: "iana" }, "application/vnd.oma.pal+xml": { source: "iana", compressible: true }, "application/vnd.oma.poc.detailed-progress-report+xml": { source: "iana", compressible: true }, "application/vnd.oma.poc.final-report+xml": { source: "iana", compressible: true }, "application/vnd.oma.poc.groups+xml": { source: "iana", compressible: true }, "application/vnd.oma.poc.invocation-descriptor+xml": { source: "iana", compressible: true }, "application/vnd.oma.poc.optimized-progress-report+xml": { source: "iana", compressible: true }, "application/vnd.oma.push": { source: "iana" }, "application/vnd.oma.scidm.messages+xml": { source: "iana", compressible: true }, "application/vnd.oma.xcap-directory+xml": { source: "iana", compressible: true }, "application/vnd.omads-email+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/vnd.omads-file+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/vnd.omads-folder+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/vnd.omaloc-supl-init": { source: "iana" }, "application/vnd.onepager": { source: "iana" }, "application/vnd.onepagertamp": { source: "iana" }, "application/vnd.onepagertamx": { source: "iana" }, "application/vnd.onepagertat": { source: "iana" }, "application/vnd.onepagertatp": { source: "iana" }, "application/vnd.onepagertatx": { source: "iana" }, "application/vnd.openblox.game+xml": { source: "iana", compressible: true, extensions: ["obgx"] }, "application/vnd.openblox.game-binary": { source: "iana" }, "application/vnd.openeye.oeb": { source: "iana" }, "application/vnd.openofficeorg.extension": { source: "apache", extensions: ["oxt"] }, "application/vnd.openstreetmap.data+xml": { source: "iana", compressible: true, extensions: ["osm"] }, "application/vnd.opentimestamps.ots": { source: "iana" }, "application/vnd.openxmlformats-officedocument.custom-properties+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.drawing+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.extended-properties+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.presentation": { source: "iana", compressible: false, extensions: ["pptx"] }, "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.slide": { source: "iana", extensions: ["sldx"] }, "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { source: "iana", extensions: ["ppsx"] }, "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.template": { source: "iana", extensions: ["potx"] }, "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { source: "iana", compressible: false, extensions: ["xlsx"] }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { source: "iana", extensions: ["xltx"] }, "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.theme+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.themeoverride+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.vmldrawing": { source: "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { source: "iana", compressible: false, extensions: ["docx"] }, "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { source: "iana", extensions: ["dotx"] }, "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-package.core-properties+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { source: "iana", compressible: true }, "application/vnd.openxmlformats-package.relationships+xml": { source: "iana", compressible: true }, "application/vnd.oracle.resource+json": { source: "iana", compressible: true }, "application/vnd.orange.indata": { source: "iana" }, "application/vnd.osa.netdeploy": { source: "iana" }, "application/vnd.osgeo.mapguide.package": { source: "iana", extensions: ["mgp"] }, "application/vnd.osgi.bundle": { source: "iana" }, "application/vnd.osgi.dp": { source: "iana", extensions: ["dp"] }, "application/vnd.osgi.subsystem": { source: "iana", extensions: ["esa"] }, "application/vnd.otps.ct-kip+xml": { source: "iana", compressible: true }, "application/vnd.oxli.countgraph": { source: "iana" }, "application/vnd.pagerduty+json": { source: "iana", compressible: true }, "application/vnd.palm": { source: "iana", extensions: ["pdb", "pqa", "oprc"] }, "application/vnd.panoply": { source: "iana" }, "application/vnd.paos.xml": { source: "iana" }, "application/vnd.patentdive": { source: "iana" }, "application/vnd.patientecommsdoc": { source: "iana" }, "application/vnd.pawaafile": { source: "iana", extensions: ["paw"] }, "application/vnd.pcos": { source: "iana" }, "application/vnd.pg.format": { source: "iana", extensions: ["str"] }, "application/vnd.pg.osasli": { source: "iana", extensions: ["ei6"] }, "application/vnd.piaccess.application-licence": { source: "iana" }, "application/vnd.picsel": { source: "iana", extensions: ["efif"] }, "application/vnd.pmi.widget": { source: "iana", extensions: ["wg"] }, "application/vnd.poc.group-advertisement+xml": { source: "iana", compressible: true }, "application/vnd.pocketlearn": { source: "iana", extensions: ["plf"] }, "application/vnd.powerbuilder6": { source: "iana", extensions: ["pbd"] }, "application/vnd.powerbuilder6-s": { source: "iana" }, "application/vnd.powerbuilder7": { source: "iana" }, "application/vnd.powerbuilder7-s": { source: "iana" }, "application/vnd.powerbuilder75": { source: "iana" }, "application/vnd.powerbuilder75-s": { source: "iana" }, "application/vnd.preminet": { source: "iana" }, "application/vnd.previewsystems.box": { source: "iana", extensions: ["box"] }, "application/vnd.proteus.magazine": { source: "iana", extensions: ["mgz"] }, "application/vnd.psfs": { source: "iana" }, "application/vnd.publishare-delta-tree": { source: "iana", extensions: ["qps"] }, "application/vnd.pvi.ptid1": { source: "iana", extensions: ["ptid"] }, "application/vnd.pwg-multiplexed": { source: "iana" }, "application/vnd.pwg-xhtml-print+xml": { source: "iana", compressible: true }, "application/vnd.qualcomm.brew-app-res": { source: "iana" }, "application/vnd.quarantainenet": { source: "iana" }, "application/vnd.quark.quarkxpress": { source: "iana", extensions: ["qxd", "qxt", "qwd", "qwt", "qxl", "qxb"] }, "application/vnd.quobject-quoxdocument": { source: "iana" }, "application/vnd.radisys.moml+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-audit+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-audit-conf+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-audit-conn+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-audit-dialog+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-audit-stream+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-conf+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-dialog+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-dialog-base+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-dialog-fax-detect+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-dialog-group+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-dialog-speech+xml": { source: "iana", compressible: true }, "application/vnd.radisys.msml-dialog-transform+xml": { source: "iana", compressible: true }, "application/vnd.rainstor.data": { source: "iana" }, "application/vnd.rapid": { source: "iana" }, "application/vnd.rar": { source: "iana", extensions: ["rar"] }, "application/vnd.realvnc.bed": { source: "iana", extensions: ["bed"] }, "application/vnd.recordare.musicxml": { source: "iana", extensions: ["mxl"] }, "application/vnd.recordare.musicxml+xml": { source: "iana", compressible: true, extensions: ["musicxml"] }, "application/vnd.renlearn.rlprint": { source: "iana" }, "application/vnd.resilient.logic": { source: "iana" }, "application/vnd.restful+json": { source: "iana", compressible: true }, "application/vnd.rig.cryptonote": { source: "iana", extensions: ["cryptonote"] }, "application/vnd.rim.cod": { source: "apache", extensions: ["cod"] }, "application/vnd.rn-realmedia": { source: "apache", extensions: ["rm"] }, "application/vnd.rn-realmedia-vbr": { source: "apache", extensions: ["rmvb"] }, "application/vnd.route66.link66+xml": { source: "iana", compressible: true, extensions: ["link66"] }, "application/vnd.rs-274x": { source: "iana" }, "application/vnd.ruckus.download": { source: "iana" }, "application/vnd.s3sms": { source: "iana" }, "application/vnd.sailingtracker.track": { source: "iana", extensions: ["st"] }, "application/vnd.sar": { source: "iana" }, "application/vnd.sbm.cid": { source: "iana" }, "application/vnd.sbm.mid2": { source: "iana" }, "application/vnd.scribus": { source: "iana" }, "application/vnd.sealed.3df": { source: "iana" }, "application/vnd.sealed.csf": { source: "iana" }, "application/vnd.sealed.doc": { source: "iana" }, "application/vnd.sealed.eml": { source: "iana" }, "application/vnd.sealed.mht": { source: "iana" }, "application/vnd.sealed.net": { source: "iana" }, "application/vnd.sealed.ppt": { source: "iana" }, "application/vnd.sealed.tiff": { source: "iana" }, "application/vnd.sealed.xls": { source: "iana" }, "application/vnd.sealedmedia.softseal.html": { source: "iana" }, "application/vnd.sealedmedia.softseal.pdf": { source: "iana" }, "application/vnd.seemail": { source: "iana", extensions: ["see"] }, "application/vnd.seis+json": { source: "iana", compressible: true }, "application/vnd.sema": { source: "iana", extensions: ["sema"] }, "application/vnd.semd": { source: "iana", extensions: ["semd"] }, "application/vnd.semf": { source: "iana", extensions: ["semf"] }, "application/vnd.shade-save-file": { source: "iana" }, "application/vnd.shana.informed.formdata": { source: "iana", extensions: ["ifm"] }, "application/vnd.shana.informed.formtemplate": { source: "iana", extensions: ["itp"] }, "application/vnd.shana.informed.interchange": { source: "iana", extensions: ["iif"] }, "application/vnd.shana.informed.package": { source: "iana", extensions: ["ipk"] }, "application/vnd.shootproof+json": { source: "iana", compressible: true }, "application/vnd.shopkick+json": { source: "iana", compressible: true }, "application/vnd.shp": { source: "iana" }, "application/vnd.shx": { source: "iana" }, "application/vnd.sigrok.session": { source: "iana" }, "application/vnd.simtech-mindmapper": { source: "iana", extensions: ["twd", "twds"] }, "application/vnd.siren+json": { source: "iana", compressible: true }, "application/vnd.smaf": { source: "iana", extensions: ["mmf"] }, "application/vnd.smart.notebook": { source: "iana" }, "application/vnd.smart.teacher": { source: "iana", extensions: ["teacher"] }, "application/vnd.snesdev-page-table": { source: "iana" }, "application/vnd.software602.filler.form+xml": { source: "iana", compressible: true, extensions: ["fo"] }, "application/vnd.software602.filler.form-xml-zip": { source: "iana" }, "application/vnd.solent.sdkm+xml": { source: "iana", compressible: true, extensions: ["sdkm", "sdkd"] }, "application/vnd.spotfire.dxp": { source: "iana", extensions: ["dxp"] }, "application/vnd.spotfire.sfs": { source: "iana", extensions: ["sfs"] }, "application/vnd.sqlite3": { source: "iana" }, "application/vnd.sss-cod": { source: "iana" }, "application/vnd.sss-dtf": { source: "iana" }, "application/vnd.sss-ntf": { source: "iana" }, "application/vnd.stardivision.calc": { source: "apache", extensions: ["sdc"] }, "application/vnd.stardivision.draw": { source: "apache", extensions: ["sda"] }, "application/vnd.stardivision.impress": { source: "apache", extensions: ["sdd"] }, "application/vnd.stardivision.math": { source: "apache", extensions: ["smf"] }, "application/vnd.stardivision.writer": { source: "apache", extensions: ["sdw", "vor"] }, "application/vnd.stardivision.writer-global": { source: "apache", extensions: ["sgl"] }, "application/vnd.stepmania.package": { source: "iana", extensions: ["smzip"] }, "application/vnd.stepmania.stepchart": { source: "iana", extensions: ["sm"] }, "application/vnd.street-stream": { source: "iana" }, "application/vnd.sun.wadl+xml": { source: "iana", compressible: true, extensions: ["wadl"] }, "application/vnd.sun.xml.calc": { source: "apache", extensions: ["sxc"] }, "application/vnd.sun.xml.calc.template": { source: "apache", extensions: ["stc"] }, "application/vnd.sun.xml.draw": { source: "apache", extensions: ["sxd"] }, "application/vnd.sun.xml.draw.template": { source: "apache", extensions: ["std"] }, "application/vnd.sun.xml.impress": { source: "apache", extensions: ["sxi"] }, "application/vnd.sun.xml.impress.template": { source: "apache", extensions: ["sti"] }, "application/vnd.sun.xml.math": { source: "apache", extensions: ["sxm"] }, "application/vnd.sun.xml.writer": { source: "apache", extensions: ["sxw"] }, "application/vnd.sun.xml.writer.global": { source: "apache", extensions: ["sxg"] }, "application/vnd.sun.xml.writer.template": { source: "apache", extensions: ["stw"] }, "application/vnd.sus-calendar": { source: "iana", extensions: ["sus", "susp"] }, "application/vnd.svd": { source: "iana", extensions: ["svd"] }, "application/vnd.swiftview-ics": { source: "iana" }, "application/vnd.sycle+xml": { source: "iana", compressible: true }, "application/vnd.syft+json": { source: "iana", compressible: true }, "application/vnd.symbian.install": { source: "apache", extensions: ["sis", "sisx"] }, "application/vnd.syncml+xml": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["xsm"] }, "application/vnd.syncml.dm+wbxml": { source: "iana", charset: "UTF-8", extensions: ["bdm"] }, "application/vnd.syncml.dm+xml": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["xdm"] }, "application/vnd.syncml.dm.notification": { source: "iana" }, "application/vnd.syncml.dmddf+wbxml": { source: "iana" }, "application/vnd.syncml.dmddf+xml": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["ddf"] }, "application/vnd.syncml.dmtnds+wbxml": { source: "iana" }, "application/vnd.syncml.dmtnds+xml": { source: "iana", charset: "UTF-8", compressible: true }, "application/vnd.syncml.ds.notification": { source: "iana" }, "application/vnd.tableschema+json": { source: "iana", compressible: true }, "application/vnd.tao.intent-module-archive": { source: "iana", extensions: ["tao"] }, "application/vnd.tcpdump.pcap": { source: "iana", extensions: ["pcap", "cap", "dmp"] }, "application/vnd.think-cell.ppttc+json": { source: "iana", compressible: true }, "application/vnd.tmd.mediaflex.api+xml": { source: "iana", compressible: true }, "application/vnd.tml": { source: "iana" }, "application/vnd.tmobile-livetv": { source: "iana", extensions: ["tmo"] }, "application/vnd.tri.onesource": { source: "iana" }, "application/vnd.trid.tpt": { source: "iana", extensions: ["tpt"] }, "application/vnd.triscape.mxs": { source: "iana", extensions: ["mxs"] }, "application/vnd.trueapp": { source: "iana", extensions: ["tra"] }, "application/vnd.truedoc": { source: "iana" }, "application/vnd.ubisoft.webplayer": { source: "iana" }, "application/vnd.ufdl": { source: "iana", extensions: ["ufd", "ufdl"] }, "application/vnd.uiq.theme": { source: "iana", extensions: ["utz"] }, "application/vnd.umajin": { source: "iana", extensions: ["umj"] }, "application/vnd.unity": { source: "iana", extensions: ["unityweb"] }, "application/vnd.uoml+xml": { source: "iana", compressible: true, extensions: ["uoml"] }, "application/vnd.uplanet.alert": { source: "iana" }, "application/vnd.uplanet.alert-wbxml": { source: "iana" }, "application/vnd.uplanet.bearer-choice": { source: "iana" }, "application/vnd.uplanet.bearer-choice-wbxml": { source: "iana" }, "application/vnd.uplanet.cacheop": { source: "iana" }, "application/vnd.uplanet.cacheop-wbxml": { source: "iana" }, "application/vnd.uplanet.channel": { source: "iana" }, "application/vnd.uplanet.channel-wbxml": { source: "iana" }, "application/vnd.uplanet.list": { source: "iana" }, "application/vnd.uplanet.list-wbxml": { source: "iana" }, "application/vnd.uplanet.listcmd": { source: "iana" }, "application/vnd.uplanet.listcmd-wbxml": { source: "iana" }, "application/vnd.uplanet.signal": { source: "iana" }, "application/vnd.uri-map": { source: "iana" }, "application/vnd.valve.source.material": { source: "iana" }, "application/vnd.vcx": { source: "iana", extensions: ["vcx"] }, "application/vnd.vd-study": { source: "iana" }, "application/vnd.vectorworks": { source: "iana" }, "application/vnd.vel+json": { source: "iana", compressible: true }, "application/vnd.verimatrix.vcas": { source: "iana" }, "application/vnd.veritone.aion+json": { source: "iana", compressible: true }, "application/vnd.veryant.thin": { source: "iana" }, "application/vnd.ves.encrypted": { source: "iana" }, "application/vnd.vidsoft.vidconference": { source: "iana" }, "application/vnd.visio": { source: "iana", extensions: ["vsd", "vst", "vss", "vsw"] }, "application/vnd.visionary": { source: "iana", extensions: ["vis"] }, "application/vnd.vividence.scriptfile": { source: "iana" }, "application/vnd.vsf": { source: "iana", extensions: ["vsf"] }, "application/vnd.wap.sic": { source: "iana" }, "application/vnd.wap.slc": { source: "iana" }, "application/vnd.wap.wbxml": { source: "iana", charset: "UTF-8", extensions: ["wbxml"] }, "application/vnd.wap.wmlc": { source: "iana", extensions: ["wmlc"] }, "application/vnd.wap.wmlscriptc": { source: "iana", extensions: ["wmlsc"] }, "application/vnd.webturbo": { source: "iana", extensions: ["wtb"] }, "application/vnd.wfa.dpp": { source: "iana" }, "application/vnd.wfa.p2p": { source: "iana" }, "application/vnd.wfa.wsc": { source: "iana" }, "application/vnd.windows.devicepairing": { source: "iana" }, "application/vnd.wmc": { source: "iana" }, "application/vnd.wmf.bootstrap": { source: "iana" }, "application/vnd.wolfram.mathematica": { source: "iana" }, "application/vnd.wolfram.mathematica.package": { source: "iana" }, "application/vnd.wolfram.player": { source: "iana", extensions: ["nbp"] }, "application/vnd.wordperfect": { source: "iana", extensions: ["wpd"] }, "application/vnd.wqd": { source: "iana", extensions: ["wqd"] }, "application/vnd.wrq-hp3000-labelled": { source: "iana" }, "application/vnd.wt.stf": { source: "iana", extensions: ["stf"] }, "application/vnd.wv.csp+wbxml": { source: "iana" }, "application/vnd.wv.csp+xml": { source: "iana", compressible: true }, "application/vnd.wv.ssp+xml": { source: "iana", compressible: true }, "application/vnd.xacml+json": { source: "iana", compressible: true }, "application/vnd.xara": { source: "iana", extensions: ["xar"] }, "application/vnd.xfdl": { source: "iana", extensions: ["xfdl"] }, "application/vnd.xfdl.webform": { source: "iana" }, "application/vnd.xmi+xml": { source: "iana", compressible: true }, "application/vnd.xmpie.cpkg": { source: "iana" }, "application/vnd.xmpie.dpkg": { source: "iana" }, "application/vnd.xmpie.plan": { source: "iana" }, "application/vnd.xmpie.ppkg": { source: "iana" }, "application/vnd.xmpie.xlim": { source: "iana" }, "application/vnd.yamaha.hv-dic": { source: "iana", extensions: ["hvd"] }, "application/vnd.yamaha.hv-script": { source: "iana", extensions: ["hvs"] }, "application/vnd.yamaha.hv-voice": { source: "iana", extensions: ["hvp"] }, "application/vnd.yamaha.openscoreformat": { source: "iana", extensions: ["osf"] }, "application/vnd.yamaha.openscoreformat.osfpvg+xml": { source: "iana", compressible: true, extensions: ["osfpvg"] }, "application/vnd.yamaha.remote-setup": { source: "iana" }, "application/vnd.yamaha.smaf-audio": { source: "iana", extensions: ["saf"] }, "application/vnd.yamaha.smaf-phrase": { source: "iana", extensions: ["spf"] }, "application/vnd.yamaha.through-ngn": { source: "iana" }, "application/vnd.yamaha.tunnel-udpencap": { source: "iana" }, "application/vnd.yaoweme": { source: "iana" }, "application/vnd.yellowriver-custom-menu": { source: "iana", extensions: ["cmp"] }, "application/vnd.youtube.yt": { source: "iana" }, "application/vnd.zul": { source: "iana", extensions: ["zir", "zirz"] }, "application/vnd.zzazz.deck+xml": { source: "iana", compressible: true, extensions: ["zaz"] }, "application/voicexml+xml": { source: "iana", compressible: true, extensions: ["vxml"] }, "application/voucher-cms+json": { source: "iana", compressible: true }, "application/vq-rtcpxr": { source: "iana" }, "application/wasm": { source: "iana", compressible: true, extensions: ["wasm"] }, "application/watcherinfo+xml": { source: "iana", compressible: true, extensions: ["wif"] }, "application/webpush-options+json": { source: "iana", compressible: true }, "application/whoispp-query": { source: "iana" }, "application/whoispp-response": { source: "iana" }, "application/widget": { source: "iana", extensions: ["wgt"] }, "application/winhlp": { source: "apache", extensions: ["hlp"] }, "application/wita": { source: "iana" }, "application/wordperfect5.1": { source: "iana" }, "application/wsdl+xml": { source: "iana", compressible: true, extensions: ["wsdl"] }, "application/wspolicy+xml": { source: "iana", compressible: true, extensions: ["wspolicy"] }, "application/x-7z-compressed": { source: "apache", compressible: false, extensions: ["7z"] }, "application/x-abiword": { source: "apache", extensions: ["abw"] }, "application/x-ace-compressed": { source: "apache", extensions: ["ace"] }, "application/x-amf": { source: "apache" }, "application/x-apple-diskimage": { source: "apache", extensions: ["dmg"] }, "application/x-arj": { compressible: false, extensions: ["arj"] }, "application/x-authorware-bin": { source: "apache", extensions: ["aab", "x32", "u32", "vox"] }, "application/x-authorware-map": { source: "apache", extensions: ["aam"] }, "application/x-authorware-seg": { source: "apache", extensions: ["aas"] }, "application/x-bcpio": { source: "apache", extensions: ["bcpio"] }, "application/x-bdoc": { compressible: false, extensions: ["bdoc"] }, "application/x-bittorrent": { source: "apache", extensions: ["torrent"] }, "application/x-blorb": { source: "apache", extensions: ["blb", "blorb"] }, "application/x-bzip": { source: "apache", compressible: false, extensions: ["bz"] }, "application/x-bzip2": { source: "apache", compressible: false, extensions: ["bz2", "boz"] }, "application/x-cbr": { source: "apache", extensions: ["cbr", "cba", "cbt", "cbz", "cb7"] }, "application/x-cdlink": { source: "apache", extensions: ["vcd"] }, "application/x-cfs-compressed": { source: "apache", extensions: ["cfs"] }, "application/x-chat": { source: "apache", extensions: ["chat"] }, "application/x-chess-pgn": { source: "apache", extensions: ["pgn"] }, "application/x-chrome-extension": { extensions: ["crx"] }, "application/x-cocoa": { source: "nginx", extensions: ["cco"] }, "application/x-compress": { source: "apache" }, "application/x-conference": { source: "apache", extensions: ["nsc"] }, "application/x-cpio": { source: "apache", extensions: ["cpio"] }, "application/x-csh": { source: "apache", extensions: ["csh"] }, "application/x-deb": { compressible: false }, "application/x-debian-package": { source: "apache", extensions: ["deb", "udeb"] }, "application/x-dgc-compressed": { source: "apache", extensions: ["dgc"] }, "application/x-director": { source: "apache", extensions: ["dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"] }, "application/x-doom": { source: "apache", extensions: ["wad"] }, "application/x-dtbncx+xml": { source: "apache", compressible: true, extensions: ["ncx"] }, "application/x-dtbook+xml": { source: "apache", compressible: true, extensions: ["dtb"] }, "application/x-dtbresource+xml": { source: "apache", compressible: true, extensions: ["res"] }, "application/x-dvi": { source: "apache", compressible: false, extensions: ["dvi"] }, "application/x-envoy": { source: "apache", extensions: ["evy"] }, "application/x-eva": { source: "apache", extensions: ["eva"] }, "application/x-font-bdf": { source: "apache", extensions: ["bdf"] }, "application/x-font-dos": { source: "apache" }, "application/x-font-framemaker": { source: "apache" }, "application/x-font-ghostscript": { source: "apache", extensions: ["gsf"] }, "application/x-font-libgrx": { source: "apache" }, "application/x-font-linux-psf": { source: "apache", extensions: ["psf"] }, "application/x-font-pcf": { source: "apache", extensions: ["pcf"] }, "application/x-font-snf": { source: "apache", extensions: ["snf"] }, "application/x-font-speedo": { source: "apache" }, "application/x-font-sunos-news": { source: "apache" }, "application/x-font-type1": { source: "apache", extensions: ["pfa", "pfb", "pfm", "afm"] }, "application/x-font-vfont": { source: "apache" }, "application/x-freearc": { source: "apache", extensions: ["arc"] }, "application/x-futuresplash": { source: "apache", extensions: ["spl"] }, "application/x-gca-compressed": { source: "apache", extensions: ["gca"] }, "application/x-glulx": { source: "apache", extensions: ["ulx"] }, "application/x-gnumeric": { source: "apache", extensions: ["gnumeric"] }, "application/x-gramps-xml": { source: "apache", extensions: ["gramps"] }, "application/x-gtar": { source: "apache", extensions: ["gtar"] }, "application/x-gzip": { source: "apache" }, "application/x-hdf": { source: "apache", extensions: ["hdf"] }, "application/x-httpd-php": { compressible: true, extensions: ["php"] }, "application/x-install-instructions": { source: "apache", extensions: ["install"] }, "application/x-iso9660-image": { source: "apache", extensions: ["iso"] }, "application/x-iwork-keynote-sffkey": { extensions: ["key"] }, "application/x-iwork-numbers-sffnumbers": { extensions: ["numbers"] }, "application/x-iwork-pages-sffpages": { extensions: ["pages"] }, "application/x-java-archive-diff": { source: "nginx", extensions: ["jardiff"] }, "application/x-java-jnlp-file": { source: "apache", compressible: false, extensions: ["jnlp"] }, "application/x-javascript": { compressible: true }, "application/x-keepass2": { extensions: ["kdbx"] }, "application/x-latex": { source: "apache", compressible: false, extensions: ["latex"] }, "application/x-lua-bytecode": { extensions: ["luac"] }, "application/x-lzh-compressed": { source: "apache", extensions: ["lzh", "lha"] }, "application/x-makeself": { source: "nginx", extensions: ["run"] }, "application/x-mie": { source: "apache", extensions: ["mie"] }, "application/x-mobipocket-ebook": { source: "apache", extensions: ["prc", "mobi"] }, "application/x-mpegurl": { compressible: false }, "application/x-ms-application": { source: "apache", extensions: ["application"] }, "application/x-ms-shortcut": { source: "apache", extensions: ["lnk"] }, "application/x-ms-wmd": { source: "apache", extensions: ["wmd"] }, "application/x-ms-wmz": { source: "apache", extensions: ["wmz"] }, "application/x-ms-xbap": { source: "apache", extensions: ["xbap"] }, "application/x-msaccess": { source: "apache", extensions: ["mdb"] }, "application/x-msbinder": { source: "apache", extensions: ["obd"] }, "application/x-mscardfile": { source: "apache", extensions: ["crd"] }, "application/x-msclip": { source: "apache", extensions: ["clp"] }, "application/x-msdos-program": { extensions: ["exe"] }, "application/x-msdownload": { source: "apache", extensions: ["exe", "dll", "com", "bat", "msi"] }, "application/x-msmediaview": { source: "apache", extensions: ["mvb", "m13", "m14"] }, "application/x-msmetafile": { source: "apache", extensions: ["wmf", "wmz", "emf", "emz"] }, "application/x-msmoney": { source: "apache", extensions: ["mny"] }, "application/x-mspublisher": { source: "apache", extensions: ["pub"] }, "application/x-msschedule": { source: "apache", extensions: ["scd"] }, "application/x-msterminal": { source: "apache", extensions: ["trm"] }, "application/x-mswrite": { source: "apache", extensions: ["wri"] }, "application/x-netcdf": { source: "apache", extensions: ["nc", "cdf"] }, "application/x-ns-proxy-autoconfig": { compressible: true, extensions: ["pac"] }, "application/x-nzb": { source: "apache", extensions: ["nzb"] }, "application/x-perl": { source: "nginx", extensions: ["pl", "pm"] }, "application/x-pilot": { source: "nginx", extensions: ["prc", "pdb"] }, "application/x-pkcs12": { source: "apache", compressible: false, extensions: ["p12", "pfx"] }, "application/x-pkcs7-certificates": { source: "apache", extensions: ["p7b", "spc"] }, "application/x-pkcs7-certreqresp": { source: "apache", extensions: ["p7r"] }, "application/x-pki-message": { source: "iana" }, "application/x-rar-compressed": { source: "apache", compressible: false, extensions: ["rar"] }, "application/x-redhat-package-manager": { source: "nginx", extensions: ["rpm"] }, "application/x-research-info-systems": { source: "apache", extensions: ["ris"] }, "application/x-sea": { source: "nginx", extensions: ["sea"] }, "application/x-sh": { source: "apache", compressible: true, extensions: ["sh"] }, "application/x-shar": { source: "apache", extensions: ["shar"] }, "application/x-shockwave-flash": { source: "apache", compressible: false, extensions: ["swf"] }, "application/x-silverlight-app": { source: "apache", extensions: ["xap"] }, "application/x-sql": { source: "apache", extensions: ["sql"] }, "application/x-stuffit": { source: "apache", compressible: false, extensions: ["sit"] }, "application/x-stuffitx": { source: "apache", extensions: ["sitx"] }, "application/x-subrip": { source: "apache", extensions: ["srt"] }, "application/x-sv4cpio": { source: "apache", extensions: ["sv4cpio"] }, "application/x-sv4crc": { source: "apache", extensions: ["sv4crc"] }, "application/x-t3vm-image": { source: "apache", extensions: ["t3"] }, "application/x-tads": { source: "apache", extensions: ["gam"] }, "application/x-tar": { source: "apache", compressible: true, extensions: ["tar"] }, "application/x-tcl": { source: "apache", extensions: ["tcl", "tk"] }, "application/x-tex": { source: "apache", extensions: ["tex"] }, "application/x-tex-tfm": { source: "apache", extensions: ["tfm"] }, "application/x-texinfo": { source: "apache", extensions: ["texinfo", "texi"] }, "application/x-tgif": { source: "apache", extensions: ["obj"] }, "application/x-ustar": { source: "apache", extensions: ["ustar"] }, "application/x-virtualbox-hdd": { compressible: true, extensions: ["hdd"] }, "application/x-virtualbox-ova": { compressible: true, extensions: ["ova"] }, "application/x-virtualbox-ovf": { compressible: true, extensions: ["ovf"] }, "application/x-virtualbox-vbox": { compressible: true, extensions: ["vbox"] }, "application/x-virtualbox-vbox-extpack": { compressible: false, extensions: ["vbox-extpack"] }, "application/x-virtualbox-vdi": { compressible: true, extensions: ["vdi"] }, "application/x-virtualbox-vhd": { compressible: true, extensions: ["vhd"] }, "application/x-virtualbox-vmdk": { compressible: true, extensions: ["vmdk"] }, "application/x-wais-source": { source: "apache", extensions: ["src"] }, "application/x-web-app-manifest+json": { compressible: true, extensions: ["webapp"] }, "application/x-www-form-urlencoded": { source: "iana", compressible: true }, "application/x-x509-ca-cert": { source: "iana", extensions: ["der", "crt", "pem"] }, "application/x-x509-ca-ra-cert": { source: "iana" }, "application/x-x509-next-ca-cert": { source: "iana" }, "application/x-xfig": { source: "apache", extensions: ["fig"] }, "application/x-xliff+xml": { source: "apache", compressible: true, extensions: ["xlf"] }, "application/x-xpinstall": { source: "apache", compressible: false, extensions: ["xpi"] }, "application/x-xz": { source: "apache", extensions: ["xz"] }, "application/x-zmachine": { source: "apache", extensions: ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"] }, "application/x400-bp": { source: "iana" }, "application/xacml+xml": { source: "iana", compressible: true }, "application/xaml+xml": { source: "apache", compressible: true, extensions: ["xaml"] }, "application/xcap-att+xml": { source: "iana", compressible: true, extensions: ["xav"] }, "application/xcap-caps+xml": { source: "iana", compressible: true, extensions: ["xca"] }, "application/xcap-diff+xml": { source: "iana", compressible: true, extensions: ["xdf"] }, "application/xcap-el+xml": { source: "iana", compressible: true, extensions: ["xel"] }, "application/xcap-error+xml": { source: "iana", compressible: true }, "application/xcap-ns+xml": { source: "iana", compressible: true, extensions: ["xns"] }, "application/xcon-conference-info+xml": { source: "iana", compressible: true }, "application/xcon-conference-info-diff+xml": { source: "iana", compressible: true }, "application/xenc+xml": { source: "iana", compressible: true, extensions: ["xenc"] }, "application/xhtml+xml": { source: "iana", compressible: true, extensions: ["xhtml", "xht"] }, "application/xhtml-voice+xml": { source: "apache", compressible: true }, "application/xliff+xml": { source: "iana", compressible: true, extensions: ["xlf"] }, "application/xml": { source: "iana", compressible: true, extensions: ["xml", "xsl", "xsd", "rng"] }, "application/xml-dtd": { source: "iana", compressible: true, extensions: ["dtd"] }, "application/xml-external-parsed-entity": { source: "iana" }, "application/xml-patch+xml": { source: "iana", compressible: true }, "application/xmpp+xml": { source: "iana", compressible: true }, "application/xop+xml": { source: "iana", compressible: true, extensions: ["xop"] }, "application/xproc+xml": { source: "apache", compressible: true, extensions: ["xpl"] }, "application/xslt+xml": { source: "iana", compressible: true, extensions: ["xsl", "xslt"] }, "application/xspf+xml": { source: "apache", compressible: true, extensions: ["xspf"] }, "application/xv+xml": { source: "iana", compressible: true, extensions: ["mxml", "xhvml", "xvml", "xvm"] }, "application/yang": { source: "iana", extensions: ["yang"] }, "application/yang-data+json": { source: "iana", compressible: true }, "application/yang-data+xml": { source: "iana", compressible: true }, "application/yang-patch+json": { source: "iana", compressible: true }, "application/yang-patch+xml": { source: "iana", compressible: true }, "application/yin+xml": { source: "iana", compressible: true, extensions: ["yin"] }, "application/zip": { source: "iana", compressible: false, extensions: ["zip"] }, "application/zlib": { source: "iana" }, "application/zstd": { source: "iana" }, "audio/1d-interleaved-parityfec": { source: "iana" }, "audio/32kadpcm": { source: "iana" }, "audio/3gpp": { source: "iana", compressible: false, extensions: ["3gpp"] }, "audio/3gpp2": { source: "iana" }, "audio/aac": { source: "iana" }, "audio/ac3": { source: "iana" }, "audio/adpcm": { source: "apache", extensions: ["adp"] }, "audio/amr": { source: "iana", extensions: ["amr"] }, "audio/amr-wb": { source: "iana" }, "audio/amr-wb+": { source: "iana" }, "audio/aptx": { source: "iana" }, "audio/asc": { source: "iana" }, "audio/atrac-advanced-lossless": { source: "iana" }, "audio/atrac-x": { source: "iana" }, "audio/atrac3": { source: "iana" }, "audio/basic": { source: "iana", compressible: false, extensions: ["au", "snd"] }, "audio/bv16": { source: "iana" }, "audio/bv32": { source: "iana" }, "audio/clearmode": { source: "iana" }, "audio/cn": { source: "iana" }, "audio/dat12": { source: "iana" }, "audio/dls": { source: "iana" }, "audio/dsr-es201108": { source: "iana" }, "audio/dsr-es202050": { source: "iana" }, "audio/dsr-es202211": { source: "iana" }, "audio/dsr-es202212": { source: "iana" }, "audio/dv": { source: "iana" }, "audio/dvi4": { source: "iana" }, "audio/eac3": { source: "iana" }, "audio/encaprtp": { source: "iana" }, "audio/evrc": { source: "iana" }, "audio/evrc-qcp": { source: "iana" }, "audio/evrc0": { source: "iana" }, "audio/evrc1": { source: "iana" }, "audio/evrcb": { source: "iana" }, "audio/evrcb0": { source: "iana" }, "audio/evrcb1": { source: "iana" }, "audio/evrcnw": { source: "iana" }, "audio/evrcnw0": { source: "iana" }, "audio/evrcnw1": { source: "iana" }, "audio/evrcwb": { source: "iana" }, "audio/evrcwb0": { source: "iana" }, "audio/evrcwb1": { source: "iana" }, "audio/evs": { source: "iana" }, "audio/flexfec": { source: "iana" }, "audio/fwdred": { source: "iana" }, "audio/g711-0": { source: "iana" }, "audio/g719": { source: "iana" }, "audio/g722": { source: "iana" }, "audio/g7221": { source: "iana" }, "audio/g723": { source: "iana" }, "audio/g726-16": { source: "iana" }, "audio/g726-24": { source: "iana" }, "audio/g726-32": { source: "iana" }, "audio/g726-40": { source: "iana" }, "audio/g728": { source: "iana" }, "audio/g729": { source: "iana" }, "audio/g7291": { source: "iana" }, "audio/g729d": { source: "iana" }, "audio/g729e": { source: "iana" }, "audio/gsm": { source: "iana" }, "audio/gsm-efr": { source: "iana" }, "audio/gsm-hr-08": { source: "iana" }, "audio/ilbc": { source: "iana" }, "audio/ip-mr_v2.5": { source: "iana" }, "audio/isac": { source: "apache" }, "audio/l16": { source: "iana" }, "audio/l20": { source: "iana" }, "audio/l24": { source: "iana", compressible: false }, "audio/l8": { source: "iana" }, "audio/lpc": { source: "iana" }, "audio/melp": { source: "iana" }, "audio/melp1200": { source: "iana" }, "audio/melp2400": { source: "iana" }, "audio/melp600": { source: "iana" }, "audio/mhas": { source: "iana" }, "audio/midi": { source: "apache", extensions: ["mid", "midi", "kar", "rmi"] }, "audio/mobile-xmf": { source: "iana", extensions: ["mxmf"] }, "audio/mp3": { compressible: false, extensions: ["mp3"] }, "audio/mp4": { source: "iana", compressible: false, extensions: ["m4a", "mp4a"] }, "audio/mp4a-latm": { source: "iana" }, "audio/mpa": { source: "iana" }, "audio/mpa-robust": { source: "iana" }, "audio/mpeg": { source: "iana", compressible: false, extensions: ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"] }, "audio/mpeg4-generic": { source: "iana" }, "audio/musepack": { source: "apache" }, "audio/ogg": { source: "iana", compressible: false, extensions: ["oga", "ogg", "spx", "opus"] }, "audio/opus": { source: "iana" }, "audio/parityfec": { source: "iana" }, "audio/pcma": { source: "iana" }, "audio/pcma-wb": { source: "iana" }, "audio/pcmu": { source: "iana" }, "audio/pcmu-wb": { source: "iana" }, "audio/prs.sid": { source: "iana" }, "audio/qcelp": { source: "iana" }, "audio/raptorfec": { source: "iana" }, "audio/red": { source: "iana" }, "audio/rtp-enc-aescm128": { source: "iana" }, "audio/rtp-midi": { source: "iana" }, "audio/rtploopback": { source: "iana" }, "audio/rtx": { source: "iana" }, "audio/s3m": { source: "apache", extensions: ["s3m"] }, "audio/scip": { source: "iana" }, "audio/silk": { source: "apache", extensions: ["sil"] }, "audio/smv": { source: "iana" }, "audio/smv-qcp": { source: "iana" }, "audio/smv0": { source: "iana" }, "audio/sofa": { source: "iana" }, "audio/sp-midi": { source: "iana" }, "audio/speex": { source: "iana" }, "audio/t140c": { source: "iana" }, "audio/t38": { source: "iana" }, "audio/telephone-event": { source: "iana" }, "audio/tetra_acelp": { source: "iana" }, "audio/tetra_acelp_bb": { source: "iana" }, "audio/tone": { source: "iana" }, "audio/tsvcis": { source: "iana" }, "audio/uemclip": { source: "iana" }, "audio/ulpfec": { source: "iana" }, "audio/usac": { source: "iana" }, "audio/vdvi": { source: "iana" }, "audio/vmr-wb": { source: "iana" }, "audio/vnd.3gpp.iufp": { source: "iana" }, "audio/vnd.4sb": { source: "iana" }, "audio/vnd.audiokoz": { source: "iana" }, "audio/vnd.celp": { source: "iana" }, "audio/vnd.cisco.nse": { source: "iana" }, "audio/vnd.cmles.radio-events": { source: "iana" }, "audio/vnd.cns.anp1": { source: "iana" }, "audio/vnd.cns.inf1": { source: "iana" }, "audio/vnd.dece.audio": { source: "iana", extensions: ["uva", "uvva"] }, "audio/vnd.digital-winds": { source: "iana", extensions: ["eol"] }, "audio/vnd.dlna.adts": { source: "iana" }, "audio/vnd.dolby.heaac.1": { source: "iana" }, "audio/vnd.dolby.heaac.2": { source: "iana" }, "audio/vnd.dolby.mlp": { source: "iana" }, "audio/vnd.dolby.mps": { source: "iana" }, "audio/vnd.dolby.pl2": { source: "iana" }, "audio/vnd.dolby.pl2x": { source: "iana" }, "audio/vnd.dolby.pl2z": { source: "iana" }, "audio/vnd.dolby.pulse.1": { source: "iana" }, "audio/vnd.dra": { source: "iana", extensions: ["dra"] }, "audio/vnd.dts": { source: "iana", extensions: ["dts"] }, "audio/vnd.dts.hd": { source: "iana", extensions: ["dtshd"] }, "audio/vnd.dts.uhd": { source: "iana" }, "audio/vnd.dvb.file": { source: "iana" }, "audio/vnd.everad.plj": { source: "iana" }, "audio/vnd.hns.audio": { source: "iana" }, "audio/vnd.lucent.voice": { source: "iana", extensions: ["lvp"] }, "audio/vnd.ms-playready.media.pya": { source: "iana", extensions: ["pya"] }, "audio/vnd.nokia.mobile-xmf": { source: "iana" }, "audio/vnd.nortel.vbk": { source: "iana" }, "audio/vnd.nuera.ecelp4800": { source: "iana", extensions: ["ecelp4800"] }, "audio/vnd.nuera.ecelp7470": { source: "iana", extensions: ["ecelp7470"] }, "audio/vnd.nuera.ecelp9600": { source: "iana", extensions: ["ecelp9600"] }, "audio/vnd.octel.sbc": { source: "iana" }, "audio/vnd.presonus.multitrack": { source: "iana" }, "audio/vnd.qcelp": { source: "iana" }, "audio/vnd.rhetorex.32kadpcm": { source: "iana" }, "audio/vnd.rip": { source: "iana", extensions: ["rip"] }, "audio/vnd.rn-realaudio": { compressible: false }, "audio/vnd.sealedmedia.softseal.mpeg": { source: "iana" }, "audio/vnd.vmx.cvsd": { source: "iana" }, "audio/vnd.wave": { compressible: false }, "audio/vorbis": { source: "iana", compressible: false }, "audio/vorbis-config": { source: "iana" }, "audio/wav": { compressible: false, extensions: ["wav"] }, "audio/wave": { compressible: false, extensions: ["wav"] }, "audio/webm": { source: "apache", compressible: false, extensions: ["weba"] }, "audio/x-aac": { source: "apache", compressible: false, extensions: ["aac"] }, "audio/x-aiff": { source: "apache", extensions: ["aif", "aiff", "aifc"] }, "audio/x-caf": { source: "apache", compressible: false, extensions: ["caf"] }, "audio/x-flac": { source: "apache", extensions: ["flac"] }, "audio/x-m4a": { source: "nginx", extensions: ["m4a"] }, "audio/x-matroska": { source: "apache", extensions: ["mka"] }, "audio/x-mpegurl": { source: "apache", extensions: ["m3u"] }, "audio/x-ms-wax": { source: "apache", extensions: ["wax"] }, "audio/x-ms-wma": { source: "apache", extensions: ["wma"] }, "audio/x-pn-realaudio": { source: "apache", extensions: ["ram", "ra"] }, "audio/x-pn-realaudio-plugin": { source: "apache", extensions: ["rmp"] }, "audio/x-realaudio": { source: "nginx", extensions: ["ra"] }, "audio/x-tta": { source: "apache" }, "audio/x-wav": { source: "apache", extensions: ["wav"] }, "audio/xm": { source: "apache", extensions: ["xm"] }, "chemical/x-cdx": { source: "apache", extensions: ["cdx"] }, "chemical/x-cif": { source: "apache", extensions: ["cif"] }, "chemical/x-cmdf": { source: "apache", extensions: ["cmdf"] }, "chemical/x-cml": { source: "apache", extensions: ["cml"] }, "chemical/x-csml": { source: "apache", extensions: ["csml"] }, "chemical/x-pdb": { source: "apache" }, "chemical/x-xyz": { source: "apache", extensions: ["xyz"] }, "font/collection": { source: "iana", extensions: ["ttc"] }, "font/otf": { source: "iana", compressible: true, extensions: ["otf"] }, "font/sfnt": { source: "iana" }, "font/ttf": { source: "iana", compressible: true, extensions: ["ttf"] }, "font/woff": { source: "iana", extensions: ["woff"] }, "font/woff2": { source: "iana", extensions: ["woff2"] }, "image/aces": { source: "iana", extensions: ["exr"] }, "image/apng": { compressible: false, extensions: ["apng"] }, "image/avci": { source: "iana", extensions: ["avci"] }, "image/avcs": { source: "iana", extensions: ["avcs"] }, "image/avif": { source: "iana", compressible: false, extensions: ["avif"] }, "image/bmp": { source: "iana", compressible: true, extensions: ["bmp"] }, "image/cgm": { source: "iana", extensions: ["cgm"] }, "image/dicom-rle": { source: "iana", extensions: ["drle"] }, "image/emf": { source: "iana", extensions: ["emf"] }, "image/fits": { source: "iana", extensions: ["fits"] }, "image/g3fax": { source: "iana", extensions: ["g3"] }, "image/gif": { source: "iana", compressible: false, extensions: ["gif"] }, "image/heic": { source: "iana", extensions: ["heic"] }, "image/heic-sequence": { source: "iana", extensions: ["heics"] }, "image/heif": { source: "iana", extensions: ["heif"] }, "image/heif-sequence": { source: "iana", extensions: ["heifs"] }, "image/hej2k": { source: "iana", extensions: ["hej2"] }, "image/hsj2": { source: "iana", extensions: ["hsj2"] }, "image/ief": { source: "iana", extensions: ["ief"] }, "image/jls": { source: "iana", extensions: ["jls"] }, "image/jp2": { source: "iana", compressible: false, extensions: ["jp2", "jpg2"] }, "image/jpeg": { source: "iana", compressible: false, extensions: ["jpeg", "jpg", "jpe"] }, "image/jph": { source: "iana", extensions: ["jph"] }, "image/jphc": { source: "iana", extensions: ["jhc"] }, "image/jpm": { source: "iana", compressible: false, extensions: ["jpm"] }, "image/jpx": { source: "iana", compressible: false, extensions: ["jpx", "jpf"] }, "image/jxr": { source: "iana", extensions: ["jxr"] }, "image/jxra": { source: "iana", extensions: ["jxra"] }, "image/jxrs": { source: "iana", extensions: ["jxrs"] }, "image/jxs": { source: "iana", extensions: ["jxs"] }, "image/jxsc": { source: "iana", extensions: ["jxsc"] }, "image/jxsi": { source: "iana", extensions: ["jxsi"] }, "image/jxss": { source: "iana", extensions: ["jxss"] }, "image/ktx": { source: "iana", extensions: ["ktx"] }, "image/ktx2": { source: "iana", extensions: ["ktx2"] }, "image/naplps": { source: "iana" }, "image/pjpeg": { compressible: false }, "image/png": { source: "iana", compressible: false, extensions: ["png"] }, "image/prs.btif": { source: "iana", extensions: ["btif"] }, "image/prs.pti": { source: "iana", extensions: ["pti"] }, "image/pwg-raster": { source: "iana" }, "image/sgi": { source: "apache", extensions: ["sgi"] }, "image/svg+xml": { source: "iana", compressible: true, extensions: ["svg", "svgz"] }, "image/t38": { source: "iana", extensions: ["t38"] }, "image/tiff": { source: "iana", compressible: false, extensions: ["tif", "tiff"] }, "image/tiff-fx": { source: "iana", extensions: ["tfx"] }, "image/vnd.adobe.photoshop": { source: "iana", compressible: true, extensions: ["psd"] }, "image/vnd.airzip.accelerator.azv": { source: "iana", extensions: ["azv"] }, "image/vnd.cns.inf2": { source: "iana" }, "image/vnd.dece.graphic": { source: "iana", extensions: ["uvi", "uvvi", "uvg", "uvvg"] }, "image/vnd.djvu": { source: "iana", extensions: ["djvu", "djv"] }, "image/vnd.dvb.subtitle": { source: "iana", extensions: ["sub"] }, "image/vnd.dwg": { source: "iana", extensions: ["dwg"] }, "image/vnd.dxf": { source: "iana", extensions: ["dxf"] }, "image/vnd.fastbidsheet": { source: "iana", extensions: ["fbs"] }, "image/vnd.fpx": { source: "iana", extensions: ["fpx"] }, "image/vnd.fst": { source: "iana", extensions: ["fst"] }, "image/vnd.fujixerox.edmics-mmr": { source: "iana", extensions: ["mmr"] }, "image/vnd.fujixerox.edmics-rlc": { source: "iana", extensions: ["rlc"] }, "image/vnd.globalgraphics.pgb": { source: "iana" }, "image/vnd.microsoft.icon": { source: "iana", compressible: true, extensions: ["ico"] }, "image/vnd.mix": { source: "iana" }, "image/vnd.mozilla.apng": { source: "iana" }, "image/vnd.ms-dds": { compressible: true, extensions: ["dds"] }, "image/vnd.ms-modi": { source: "iana", extensions: ["mdi"] }, "image/vnd.ms-photo": { source: "apache", extensions: ["wdp"] }, "image/vnd.net-fpx": { source: "iana", extensions: ["npx"] }, "image/vnd.pco.b16": { source: "iana", extensions: ["b16"] }, "image/vnd.radiance": { source: "iana" }, "image/vnd.sealed.png": { source: "iana" }, "image/vnd.sealedmedia.softseal.gif": { source: "iana" }, "image/vnd.sealedmedia.softseal.jpg": { source: "iana" }, "image/vnd.svf": { source: "iana" }, "image/vnd.tencent.tap": { source: "iana", extensions: ["tap"] }, "image/vnd.valve.source.texture": { source: "iana", extensions: ["vtf"] }, "image/vnd.wap.wbmp": { source: "iana", extensions: ["wbmp"] }, "image/vnd.xiff": { source: "iana", extensions: ["xif"] }, "image/vnd.zbrush.pcx": { source: "iana", extensions: ["pcx"] }, "image/webp": { source: "apache", extensions: ["webp"] }, "image/wmf": { source: "iana", extensions: ["wmf"] }, "image/x-3ds": { source: "apache", extensions: ["3ds"] }, "image/x-cmu-raster": { source: "apache", extensions: ["ras"] }, "image/x-cmx": { source: "apache", extensions: ["cmx"] }, "image/x-freehand": { source: "apache", extensions: ["fh", "fhc", "fh4", "fh5", "fh7"] }, "image/x-icon": { source: "apache", compressible: true, extensions: ["ico"] }, "image/x-jng": { source: "nginx", extensions: ["jng"] }, "image/x-mrsid-image": { source: "apache", extensions: ["sid"] }, "image/x-ms-bmp": { source: "nginx", compressible: true, extensions: ["bmp"] }, "image/x-pcx": { source: "apache", extensions: ["pcx"] }, "image/x-pict": { source: "apache", extensions: ["pic", "pct"] }, "image/x-portable-anymap": { source: "apache", extensions: ["pnm"] }, "image/x-portable-bitmap": { source: "apache", extensions: ["pbm"] }, "image/x-portable-graymap": { source: "apache", extensions: ["pgm"] }, "image/x-portable-pixmap": { source: "apache", extensions: ["ppm"] }, "image/x-rgb": { source: "apache", extensions: ["rgb"] }, "image/x-tga": { source: "apache", extensions: ["tga"] }, "image/x-xbitmap": { source: "apache", extensions: ["xbm"] }, "image/x-xcf": { compressible: false }, "image/x-xpixmap": { source: "apache", extensions: ["xpm"] }, "image/x-xwindowdump": { source: "apache", extensions: ["xwd"] }, "message/cpim": { source: "iana" }, "message/delivery-status": { source: "iana" }, "message/disposition-notification": { source: "iana", extensions: [ "disposition-notification" ] }, "message/external-body": { source: "iana" }, "message/feedback-report": { source: "iana" }, "message/global": { source: "iana", extensions: ["u8msg"] }, "message/global-delivery-status": { source: "iana", extensions: ["u8dsn"] }, "message/global-disposition-notification": { source: "iana", extensions: ["u8mdn"] }, "message/global-headers": { source: "iana", extensions: ["u8hdr"] }, "message/http": { source: "iana", compressible: false }, "message/imdn+xml": { source: "iana", compressible: true }, "message/news": { source: "iana" }, "message/partial": { source: "iana", compressible: false }, "message/rfc822": { source: "iana", compressible: true, extensions: ["eml", "mime"] }, "message/s-http": { source: "iana" }, "message/sip": { source: "iana" }, "message/sipfrag": { source: "iana" }, "message/tracking-status": { source: "iana" }, "message/vnd.si.simp": { source: "iana" }, "message/vnd.wfa.wsc": { source: "iana", extensions: ["wsc"] }, "model/3mf": { source: "iana", extensions: ["3mf"] }, "model/e57": { source: "iana" }, "model/gltf+json": { source: "iana", compressible: true, extensions: ["gltf"] }, "model/gltf-binary": { source: "iana", compressible: true, extensions: ["glb"] }, "model/iges": { source: "iana", compressible: false, extensions: ["igs", "iges"] }, "model/mesh": { source: "iana", compressible: false, extensions: ["msh", "mesh", "silo"] }, "model/mtl": { source: "iana", extensions: ["mtl"] }, "model/obj": { source: "iana", extensions: ["obj"] }, "model/step": { source: "iana" }, "model/step+xml": { source: "iana", compressible: true, extensions: ["stpx"] }, "model/step+zip": { source: "iana", compressible: false, extensions: ["stpz"] }, "model/step-xml+zip": { source: "iana", compressible: false, extensions: ["stpxz"] }, "model/stl": { source: "iana", extensions: ["stl"] }, "model/vnd.collada+xml": { source: "iana", compressible: true, extensions: ["dae"] }, "model/vnd.dwf": { source: "iana", extensions: ["dwf"] }, "model/vnd.flatland.3dml": { source: "iana" }, "model/vnd.gdl": { source: "iana", extensions: ["gdl"] }, "model/vnd.gs-gdl": { source: "apache" }, "model/vnd.gs.gdl": { source: "iana" }, "model/vnd.gtw": { source: "iana", extensions: ["gtw"] }, "model/vnd.moml+xml": { source: "iana", compressible: true }, "model/vnd.mts": { source: "iana", extensions: ["mts"] }, "model/vnd.opengex": { source: "iana", extensions: ["ogex"] }, "model/vnd.parasolid.transmit.binary": { source: "iana", extensions: ["x_b"] }, "model/vnd.parasolid.transmit.text": { source: "iana", extensions: ["x_t"] }, "model/vnd.pytha.pyox": { source: "iana" }, "model/vnd.rosette.annotated-data-model": { source: "iana" }, "model/vnd.sap.vds": { source: "iana", extensions: ["vds"] }, "model/vnd.usdz+zip": { source: "iana", compressible: false, extensions: ["usdz"] }, "model/vnd.valve.source.compiled-map": { source: "iana", extensions: ["bsp"] }, "model/vnd.vtu": { source: "iana", extensions: ["vtu"] }, "model/vrml": { source: "iana", compressible: false, extensions: ["wrl", "vrml"] }, "model/x3d+binary": { source: "apache", compressible: false, extensions: ["x3db", "x3dbz"] }, "model/x3d+fastinfoset": { source: "iana", extensions: ["x3db"] }, "model/x3d+vrml": { source: "apache", compressible: false, extensions: ["x3dv", "x3dvz"] }, "model/x3d+xml": { source: "iana", compressible: true, extensions: ["x3d", "x3dz"] }, "model/x3d-vrml": { source: "iana", extensions: ["x3dv"] }, "multipart/alternative": { source: "iana", compressible: false }, "multipart/appledouble": { source: "iana" }, "multipart/byteranges": { source: "iana" }, "multipart/digest": { source: "iana" }, "multipart/encrypted": { source: "iana", compressible: false }, "multipart/form-data": { source: "iana", compressible: false }, "multipart/header-set": { source: "iana" }, "multipart/mixed": { source: "iana" }, "multipart/multilingual": { source: "iana" }, "multipart/parallel": { source: "iana" }, "multipart/related": { source: "iana", compressible: false }, "multipart/report": { source: "iana" }, "multipart/signed": { source: "iana", compressible: false }, "multipart/vnd.bint.med-plus": { source: "iana" }, "multipart/voice-message": { source: "iana" }, "multipart/x-mixed-replace": { source: "iana" }, "text/1d-interleaved-parityfec": { source: "iana" }, "text/cache-manifest": { source: "iana", compressible: true, extensions: ["appcache", "manifest"] }, "text/calendar": { source: "iana", extensions: ["ics", "ifb"] }, "text/calender": { compressible: true }, "text/cmd": { compressible: true }, "text/coffeescript": { extensions: ["coffee", "litcoffee"] }, "text/cql": { source: "iana" }, "text/cql-expression": { source: "iana" }, "text/cql-identifier": { source: "iana" }, "text/css": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["css"] }, "text/csv": { source: "iana", compressible: true, extensions: ["csv"] }, "text/csv-schema": { source: "iana" }, "text/directory": { source: "iana" }, "text/dns": { source: "iana" }, "text/ecmascript": { source: "iana" }, "text/encaprtp": { source: "iana" }, "text/enriched": { source: "iana" }, "text/fhirpath": { source: "iana" }, "text/flexfec": { source: "iana" }, "text/fwdred": { source: "iana" }, "text/gff3": { source: "iana" }, "text/grammar-ref-list": { source: "iana" }, "text/html": { source: "iana", compressible: true, extensions: ["html", "htm", "shtml"] }, "text/jade": { extensions: ["jade"] }, "text/javascript": { source: "iana", compressible: true }, "text/jcr-cnd": { source: "iana" }, "text/jsx": { compressible: true, extensions: ["jsx"] }, "text/less": { compressible: true, extensions: ["less"] }, "text/markdown": { source: "iana", compressible: true, extensions: ["markdown", "md"] }, "text/mathml": { source: "nginx", extensions: ["mml"] }, "text/mdx": { compressible: true, extensions: ["mdx"] }, "text/mizar": { source: "iana" }, "text/n3": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["n3"] }, "text/parameters": { source: "iana", charset: "UTF-8" }, "text/parityfec": { source: "iana" }, "text/plain": { source: "iana", compressible: true, extensions: ["txt", "text", "conf", "def", "list", "log", "in", "ini"] }, "text/provenance-notation": { source: "iana", charset: "UTF-8" }, "text/prs.fallenstein.rst": { source: "iana" }, "text/prs.lines.tag": { source: "iana", extensions: ["dsc"] }, "text/prs.prop.logic": { source: "iana" }, "text/raptorfec": { source: "iana" }, "text/red": { source: "iana" }, "text/rfc822-headers": { source: "iana" }, "text/richtext": { source: "iana", compressible: true, extensions: ["rtx"] }, "text/rtf": { source: "iana", compressible: true, extensions: ["rtf"] }, "text/rtp-enc-aescm128": { source: "iana" }, "text/rtploopback": { source: "iana" }, "text/rtx": { source: "iana" }, "text/sgml": { source: "iana", extensions: ["sgml", "sgm"] }, "text/shaclc": { source: "iana" }, "text/shex": { source: "iana", extensions: ["shex"] }, "text/slim": { extensions: ["slim", "slm"] }, "text/spdx": { source: "iana", extensions: ["spdx"] }, "text/strings": { source: "iana" }, "text/stylus": { extensions: ["stylus", "styl"] }, "text/t140": { source: "iana" }, "text/tab-separated-values": { source: "iana", compressible: true, extensions: ["tsv"] }, "text/troff": { source: "iana", extensions: ["t", "tr", "roff", "man", "me", "ms"] }, "text/turtle": { source: "iana", charset: "UTF-8", extensions: ["ttl"] }, "text/ulpfec": { source: "iana" }, "text/uri-list": { source: "iana", compressible: true, extensions: ["uri", "uris", "urls"] }, "text/vcard": { source: "iana", compressible: true, extensions: ["vcard"] }, "text/vnd.a": { source: "iana" }, "text/vnd.abc": { source: "iana" }, "text/vnd.ascii-art": { source: "iana" }, "text/vnd.curl": { source: "iana", extensions: ["curl"] }, "text/vnd.curl.dcurl": { source: "apache", extensions: ["dcurl"] }, "text/vnd.curl.mcurl": { source: "apache", extensions: ["mcurl"] }, "text/vnd.curl.scurl": { source: "apache", extensions: ["scurl"] }, "text/vnd.debian.copyright": { source: "iana", charset: "UTF-8" }, "text/vnd.dmclientscript": { source: "iana" }, "text/vnd.dvb.subtitle": { source: "iana", extensions: ["sub"] }, "text/vnd.esmertec.theme-descriptor": { source: "iana", charset: "UTF-8" }, "text/vnd.familysearch.gedcom": { source: "iana", extensions: ["ged"] }, "text/vnd.ficlab.flt": { source: "iana" }, "text/vnd.fly": { source: "iana", extensions: ["fly"] }, "text/vnd.fmi.flexstor": { source: "iana", extensions: ["flx"] }, "text/vnd.gml": { source: "iana" }, "text/vnd.graphviz": { source: "iana", extensions: ["gv"] }, "text/vnd.hans": { source: "iana" }, "text/vnd.hgl": { source: "iana" }, "text/vnd.in3d.3dml": { source: "iana", extensions: ["3dml"] }, "text/vnd.in3d.spot": { source: "iana", extensions: ["spot"] }, "text/vnd.iptc.newsml": { source: "iana" }, "text/vnd.iptc.nitf": { source: "iana" }, "text/vnd.latex-z": { source: "iana" }, "text/vnd.motorola.reflex": { source: "iana" }, "text/vnd.ms-mediapackage": { source: "iana" }, "text/vnd.net2phone.commcenter.command": { source: "iana" }, "text/vnd.radisys.msml-basic-layout": { source: "iana" }, "text/vnd.senx.warpscript": { source: "iana" }, "text/vnd.si.uricatalogue": { source: "iana" }, "text/vnd.sosi": { source: "iana" }, "text/vnd.sun.j2me.app-descriptor": { source: "iana", charset: "UTF-8", extensions: ["jad"] }, "text/vnd.trolltech.linguist": { source: "iana", charset: "UTF-8" }, "text/vnd.wap.si": { source: "iana" }, "text/vnd.wap.sl": { source: "iana" }, "text/vnd.wap.wml": { source: "iana", extensions: ["wml"] }, "text/vnd.wap.wmlscript": { source: "iana", extensions: ["wmls"] }, "text/vtt": { source: "iana", charset: "UTF-8", compressible: true, extensions: ["vtt"] }, "text/x-asm": { source: "apache", extensions: ["s", "asm"] }, "text/x-c": { source: "apache", extensions: ["c", "cc", "cxx", "cpp", "h", "hh", "dic"] }, "text/x-component": { source: "nginx", extensions: ["htc"] }, "text/x-fortran": { source: "apache", extensions: ["f", "for", "f77", "f90"] }, "text/x-gwt-rpc": { compressible: true }, "text/x-handlebars-template": { extensions: ["hbs"] }, "text/x-java-source": { source: "apache", extensions: ["java"] }, "text/x-jquery-tmpl": { compressible: true }, "text/x-lua": { extensions: ["lua"] }, "text/x-markdown": { compressible: true, extensions: ["mkd"] }, "text/x-nfo": { source: "apache", extensions: ["nfo"] }, "text/x-opml": { source: "apache", extensions: ["opml"] }, "text/x-org": { compressible: true, extensions: ["org"] }, "text/x-pascal": { source: "apache", extensions: ["p", "pas"] }, "text/x-processing": { compressible: true, extensions: ["pde"] }, "text/x-sass": { extensions: ["sass"] }, "text/x-scss": { extensions: ["scss"] }, "text/x-setext": { source: "apache", extensions: ["etx"] }, "text/x-sfv": { source: "apache", extensions: ["sfv"] }, "text/x-suse-ymp": { compressible: true, extensions: ["ymp"] }, "text/x-uuencode": { source: "apache", extensions: ["uu"] }, "text/x-vcalendar": { source: "apache", extensions: ["vcs"] }, "text/x-vcard": { source: "apache", extensions: ["vcf"] }, "text/xml": { source: "iana", compressible: true, extensions: ["xml"] }, "text/xml-external-parsed-entity": { source: "iana" }, "text/yaml": { compressible: true, extensions: ["yaml", "yml"] }, "video/1d-interleaved-parityfec": { source: "iana" }, "video/3gpp": { source: "iana", extensions: ["3gp", "3gpp"] }, "video/3gpp-tt": { source: "iana" }, "video/3gpp2": { source: "iana", extensions: ["3g2"] }, "video/av1": { source: "iana" }, "video/bmpeg": { source: "iana" }, "video/bt656": { source: "iana" }, "video/celb": { source: "iana" }, "video/dv": { source: "iana" }, "video/encaprtp": { source: "iana" }, "video/ffv1": { source: "iana" }, "video/flexfec": { source: "iana" }, "video/h261": { source: "iana", extensions: ["h261"] }, "video/h263": { source: "iana", extensions: ["h263"] }, "video/h263-1998": { source: "iana" }, "video/h263-2000": { source: "iana" }, "video/h264": { source: "iana", extensions: ["h264"] }, "video/h264-rcdo": { source: "iana" }, "video/h264-svc": { source: "iana" }, "video/h265": { source: "iana" }, "video/iso.segment": { source: "iana", extensions: ["m4s"] }, "video/jpeg": { source: "iana", extensions: ["jpgv"] }, "video/jpeg2000": { source: "iana" }, "video/jpm": { source: "apache", extensions: ["jpm", "jpgm"] }, "video/jxsv": { source: "iana" }, "video/mj2": { source: "iana", extensions: ["mj2", "mjp2"] }, "video/mp1s": { source: "iana" }, "video/mp2p": { source: "iana" }, "video/mp2t": { source: "iana", extensions: ["ts"] }, "video/mp4": { source: "iana", compressible: false, extensions: ["mp4", "mp4v", "mpg4"] }, "video/mp4v-es": { source: "iana" }, "video/mpeg": { source: "iana", compressible: false, extensions: ["mpeg", "mpg", "mpe", "m1v", "m2v"] }, "video/mpeg4-generic": { source: "iana" }, "video/mpv": { source: "iana" }, "video/nv": { source: "iana" }, "video/ogg": { source: "iana", compressible: false, extensions: ["ogv"] }, "video/parityfec": { source: "iana" }, "video/pointer": { source: "iana" }, "video/quicktime": { source: "iana", compressible: false, extensions: ["qt", "mov"] }, "video/raptorfec": { source: "iana" }, "video/raw": { source: "iana" }, "video/rtp-enc-aescm128": { source: "iana" }, "video/rtploopback": { source: "iana" }, "video/rtx": { source: "iana" }, "video/scip": { source: "iana" }, "video/smpte291": { source: "iana" }, "video/smpte292m": { source: "iana" }, "video/ulpfec": { source: "iana" }, "video/vc1": { source: "iana" }, "video/vc2": { source: "iana" }, "video/vnd.cctv": { source: "iana" }, "video/vnd.dece.hd": { source: "iana", extensions: ["uvh", "uvvh"] }, "video/vnd.dece.mobile": { source: "iana", extensions: ["uvm", "uvvm"] }, "video/vnd.dece.mp4": { source: "iana" }, "video/vnd.dece.pd": { source: "iana", extensions: ["uvp", "uvvp"] }, "video/vnd.dece.sd": { source: "iana", extensions: ["uvs", "uvvs"] }, "video/vnd.dece.video": { source: "iana", extensions: ["uvv", "uvvv"] }, "video/vnd.directv.mpeg": { source: "iana" }, "video/vnd.directv.mpeg-tts": { source: "iana" }, "video/vnd.dlna.mpeg-tts": { source: "iana" }, "video/vnd.dvb.file": { source: "iana", extensions: ["dvb"] }, "video/vnd.fvt": { source: "iana", extensions: ["fvt"] }, "video/vnd.hns.video": { source: "iana" }, "video/vnd.iptvforum.1dparityfec-1010": { source: "iana" }, "video/vnd.iptvforum.1dparityfec-2005": { source: "iana" }, "video/vnd.iptvforum.2dparityfec-1010": { source: "iana" }, "video/vnd.iptvforum.2dparityfec-2005": { source: "iana" }, "video/vnd.iptvforum.ttsavc": { source: "iana" }, "video/vnd.iptvforum.ttsmpeg2": { source: "iana" }, "video/vnd.motorola.video": { source: "iana" }, "video/vnd.motorola.videop": { source: "iana" }, "video/vnd.mpegurl": { source: "iana", extensions: ["mxu", "m4u"] }, "video/vnd.ms-playready.media.pyv": { source: "iana", extensions: ["pyv"] }, "video/vnd.nokia.interleaved-multimedia": { source: "iana" }, "video/vnd.nokia.mp4vr": { source: "iana" }, "video/vnd.nokia.videovoip": { source: "iana" }, "video/vnd.objectvideo": { source: "iana" }, "video/vnd.radgamettools.bink": { source: "iana" }, "video/vnd.radgamettools.smacker": { source: "iana" }, "video/vnd.sealed.mpeg1": { source: "iana" }, "video/vnd.sealed.mpeg4": { source: "iana" }, "video/vnd.sealed.swf": { source: "iana" }, "video/vnd.sealedmedia.softseal.mov": { source: "iana" }, "video/vnd.uvvu.mp4": { source: "iana", extensions: ["uvu", "uvvu"] }, "video/vnd.vivo": { source: "iana", extensions: ["viv"] }, "video/vnd.youtube.yt": { source: "iana" }, "video/vp8": { source: "iana" }, "video/vp9": { source: "iana" }, "video/webm": { source: "apache", compressible: false, extensions: ["webm"] }, "video/x-f4v": { source: "apache", extensions: ["f4v"] }, "video/x-fli": { source: "apache", extensions: ["fli"] }, "video/x-flv": { source: "apache", compressible: false, extensions: ["flv"] }, "video/x-m4v": { source: "apache", extensions: ["m4v"] }, "video/x-matroska": { source: "apache", compressible: false, extensions: ["mkv", "mk3d", "mks"] }, "video/x-mng": { source: "apache", extensions: ["mng"] }, "video/x-ms-asf": { source: "apache", extensions: ["asf", "asx"] }, "video/x-ms-vob": { source: "apache", extensions: ["vob"] }, "video/x-ms-wm": { source: "apache", extensions: ["wm"] }, "video/x-ms-wmv": { source: "apache", compressible: false, extensions: ["wmv"] }, "video/x-ms-wmx": { source: "apache", extensions: ["wmx"] }, "video/x-ms-wvx": { source: "apache", extensions: ["wvx"] }, "video/x-msvideo": { source: "apache", extensions: ["avi"] }, "video/x-sgi-movie": { source: "apache", extensions: ["movie"] }, "video/x-smv": { source: "apache", extensions: ["smv"] }, "x-conference/x-cooltalk": { source: "apache", extensions: ["ice"] }, "x-shader/x-fragment": { compressible: true }, "x-shader/x-vertex": { compressible: true } }; } }); // node_modules/mime-db/index.js var require_mime_db = __commonJS({ "node_modules/mime-db/index.js"(exports, module2) { module2.exports = require_db(); } }); // node_modules/mime-types/index.js var require_mime_types = __commonJS({ "node_modules/mime-types/index.js"(exports) { "use strict"; var db = require_mime_db(); var extname = require("path").extname; var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/; var TEXT_TYPE_REGEXP = /^text\//i; exports.charset = charset; exports.charsets = { lookup: charset }; exports.contentType = contentType; exports.extension = extension; exports.extensions = /* @__PURE__ */ Object.create(null); exports.lookup = lookup; exports.types = /* @__PURE__ */ Object.create(null); populateMaps(exports.extensions, exports.types); function charset(type) { if (!type || typeof type !== "string") { return false; } var match = EXTRACT_TYPE_REGEXP.exec(type); var mime = match && db[match[1].toLowerCase()]; if (mime && mime.charset) { return mime.charset; } if (match && TEXT_TYPE_REGEXP.test(match[1])) { return "UTF-8"; } return false; } function contentType(str) { if (!str || typeof str !== "string") { return false; } var mime = str.indexOf("/") === -1 ? exports.lookup(str) : str; if (!mime) { return false; } if (mime.indexOf("charset") === -1) { var charset2 = exports.charset(mime); if (charset2) mime += "; charset=" + charset2.toLowerCase(); } return mime; } function extension(type) { if (!type || typeof type !== "string") { return false; } var match = EXTRACT_TYPE_REGEXP.exec(type); var exts = match && exports.extensions[match[1].toLowerCase()]; if (!exts || !exts.length) { return false; } return exts[0]; } function lookup(path3) { if (!path3 || typeof path3 !== "string") { return false; } var extension2 = extname("x." + path3).toLowerCase().substr(1); if (!extension2) { return false; } return exports.types[extension2] || false; } function populateMaps(extensions, types) { var preference = ["nginx", "apache", void 0, "iana"]; Object.keys(db).forEach(function forEachMimeType(type) { var mime = db[type]; var exts = mime.extensions; if (!exts || !exts.length) { return; } extensions[type] = exts; for (var i = 0; i < exts.length; i++) { var extension2 = exts[i]; if (types[extension2]) { var from = preference.indexOf(db[types[extension2]].source); var to = preference.indexOf(mime.source); if (types[extension2] !== "application/octet-stream" && (from > to || from === to && types[extension2].substr(0, 12) === "application/")) { continue; } } types[extension2] = type; } }); } } }); // node_modules/caseless/index.js var require_caseless = __commonJS({ "node_modules/caseless/index.js"(exports, module2) { function Caseless(dict) { this.dict = dict || {}; } Caseless.prototype.set = function(name, value, clobber) { if (typeof name === "object") { for (var i in name) { this.set(i, name[i], value); } } else { if (typeof clobber === "undefined") clobber = true; var has = this.has(name); if (!clobber && has) this.dict[has] = this.dict[has] + "," + value; else this.dict[has || name] = value; return has; } }; Caseless.prototype.has = function(name) { var keys = Object.keys(this.dict), name = name.toLowerCase(); for (var i = 0; i < keys.length; i++) { if (keys[i].toLowerCase() === name) return keys[i]; } return false; }; Caseless.prototype.get = function(name) { name = name.toLowerCase(); var result, _key; var headers = this.dict; Object.keys(headers).forEach(function(key) { _key = key.toLowerCase(); if (name === _key) result = headers[key]; }); return result; }; Caseless.prototype.swap = function(name) { var has = this.has(name); if (has === name) return; if (!has) throw new Error('There is no header than matches "' + name + '"'); this.dict[name] = this.dict[has]; delete this.dict[has]; }; Caseless.prototype.del = function(name) { var has = this.has(name); return delete this.dict[has || name]; }; module2.exports = function(dict) { return new Caseless(dict); }; module2.exports.httpify = function(resp, headers) { var c = new Caseless(headers); resp.setHeader = function(key, value, clobber) { if (typeof value === "undefined") return; return c.set(key, value, clobber); }; resp.hasHeader = function(key) { return c.has(key); }; resp.getHeader = function(key) { return c.get(key); }; resp.removeHeader = function(key) { return c.del(key); }; resp.headers = c.dict; return c; }; } }); // node_modules/forever-agent/index.js var require_forever_agent = __commonJS({ "node_modules/forever-agent/index.js"(exports, module2) { module2.exports = ForeverAgent; ForeverAgent.SSL = ForeverAgentSSL; var util = require("util"); var Agent = require("http").Agent; var net = require("net"); var tls = require("tls"); var AgentSSL = require("https").Agent; function getConnectionName(host, port) { var name = ""; if (typeof host === "string") { name = host + ":" + port; } else { name = host.host + ":" + host.port + ":" + (host.localAddress ? host.localAddress + ":" : ":"); } return name; } function ForeverAgent(options) { var self2 = this; self2.options = options || {}; self2.requests = {}; self2.sockets = {}; self2.freeSockets = {}; self2.maxSockets = self2.options.maxSockets || Agent.defaultMaxSockets; self2.minSockets = self2.options.minSockets || ForeverAgent.defaultMinSockets; self2.on("free", function(socket, host, port) { var name = getConnectionName(host, port); if (self2.requests[name] && self2.requests[name].length) { self2.requests[name].shift().onSocket(socket); } else if (self2.sockets[name].length < self2.minSockets) { if (!self2.freeSockets[name]) self2.freeSockets[name] = []; self2.freeSockets[name].push(socket); var onIdleError = function() { socket.destroy(); }; socket._onIdleError = onIdleError; socket.on("error", onIdleError); } else { socket.destroy(); } }); } util.inherits(ForeverAgent, Agent); ForeverAgent.defaultMinSockets = 5; ForeverAgent.prototype.createConnection = net.createConnection; ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest; ForeverAgent.prototype.addRequest = function(req, host, port) { var name = getConnectionName(host, port); if (typeof host !== "string") { var options = host; port = options.port; host = options.host; } if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) { var idleSocket = this.freeSockets[name].pop(); idleSocket.removeListener("error", idleSocket._onIdleError); delete idleSocket._onIdleError; req._reusedSocket = true; req.onSocket(idleSocket); } else { this.addRequestNoreuse(req, host, port); } }; ForeverAgent.prototype.removeSocket = function(s, name, host, port) { if (this.sockets[name]) { var index = this.sockets[name].indexOf(s); if (index !== -1) { this.sockets[name].splice(index, 1); } } else if (this.sockets[name] && this.sockets[name].length === 0) { delete this.sockets[name]; delete this.requests[name]; } if (this.freeSockets[name]) { var index = this.freeSockets[name].indexOf(s); if (index !== -1) { this.freeSockets[name].splice(index, 1); if (this.freeSockets[name].length === 0) { delete this.freeSockets[name]; } } } if (this.requests[name] && this.requests[name].length) { this.createSocket(name, host, port).emit("free"); } }; function ForeverAgentSSL(options) { ForeverAgent.call(this, options); } util.inherits(ForeverAgentSSL, ForeverAgent); ForeverAgentSSL.prototype.createConnection = createConnectionSSL; ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest; function createConnectionSSL(port, host, options) { if (typeof port === "object") { options = port; } else if (typeof host === "object") { options = host; } else if (typeof options === "object") { options = options; } else { options = {}; } if (typeof port === "number") { options.port = port; } if (typeof host === "string") { options.host = host; } return tls.connect(options); } } }); // node_modules/request/node_modules/form-data/lib/browser.js var require_browser = __commonJS({ "node_modules/request/node_modules/form-data/lib/browser.js"(exports, module2) { module2.exports = typeof self == "object" ? self.FormData : window.FormData; } }); // node_modules/isstream/isstream.js var require_isstream = __commonJS({ "node_modules/isstream/isstream.js"(exports, module2) { var stream = require("stream"); function isStream(obj) { return obj instanceof stream.Stream; } function isReadable(obj) { return isStream(obj) && typeof obj._read == "function" && typeof obj._readableState == "object"; } function isWritable(obj) { return isStream(obj) && typeof obj._write == "function" && typeof obj._writableState == "object"; } function isDuplex(obj) { return isReadable(obj) && isWritable(obj); } module2.exports = isStream; module2.exports.isReadable = isReadable; module2.exports.isWritable = isWritable; module2.exports.isDuplex = isDuplex; } }); // node_modules/is-typedarray/index.js var require_is_typedarray = __commonJS({ "node_modules/is-typedarray/index.js"(exports, module2) { module2.exports = isTypedArray; isTypedArray.strict = isStrictTypedArray; isTypedArray.loose = isLooseTypedArray; var toString = Object.prototype.toString; var names = { "[object Int8Array]": true, "[object Int16Array]": true, "[object Int32Array]": true, "[object Uint8Array]": true, "[object Uint8ClampedArray]": true, "[object Uint16Array]": true, "[object Uint32Array]": true, "[object Float32Array]": true, "[object Float64Array]": true }; function isTypedArray(arr) { return isStrictTypedArray(arr) || isLooseTypedArray(arr); } function isStrictTypedArray(arr) { return arr instanceof Int8Array || arr instanceof Int16Array || arr instanceof Int32Array || arr instanceof Uint8Array || arr instanceof Uint8ClampedArray || arr instanceof Uint16Array || arr instanceof Uint32Array || arr instanceof Float32Array || arr instanceof Float64Array; } function isLooseTypedArray(arr) { return names[toString.call(arr)]; } } }); // node_modules/request/lib/getProxyFromURI.js var require_getProxyFromURI = __commonJS({ "node_modules/request/lib/getProxyFromURI.js"(exports, module2) { "use strict"; function formatHostname(hostname) { return hostname.replace(/^\.*/, ".").toLowerCase(); } function parseNoProxyZone(zone) { zone = zone.trim().toLowerCase(); var zoneParts = zone.split(":", 2); var zoneHost = formatHostname(zoneParts[0]); var zonePort = zoneParts[1]; var hasPort = zone.indexOf(":") > -1; return { hostname: zoneHost, port: zonePort, hasPort }; } function uriInNoProxy(uri, noProxy) { var port = uri.port || (uri.protocol === "https:" ? "443" : "80"); var hostname = formatHostname(uri.hostname); var noProxyList = noProxy.split(","); return noProxyList.map(parseNoProxyZone).some(function(noProxyZone) { var isMatchedAt = hostname.indexOf(noProxyZone.hostname); var hostnameMatched = isMatchedAt > -1 && isMatchedAt === hostname.length - noProxyZone.hostname.length; if (noProxyZone.hasPort) { return port === noProxyZone.port && hostnameMatched; } return hostnameMatched; }); } function getProxyFromURI(uri) { var noProxy = process.env.NO_PROXY || process.env.no_proxy || ""; if (noProxy === "*") { return null; } if (noProxy !== "" && uriInNoProxy(uri, noProxy)) { return null; } if (uri.protocol === "http:") { return process.env.HTTP_PROXY || process.env.http_proxy || null; } if (uri.protocol === "https:") { return process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY || process.env.http_proxy || null; } return null; } module2.exports = getProxyFromURI; } }); // node_modules/qs/lib/utils.js var require_utils4 = __commonJS({ "node_modules/qs/lib/utils.js"(exports, module2) { "use strict"; var has = Object.prototype.hasOwnProperty; var hexTable = function() { var array = []; for (var i = 0; i < 256; ++i) { array.push("%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase()); } return array; }(); var compactQueue = function compactQueue2(queue) { var obj; while (queue.length) { var item = queue.pop(); obj = item.obj[item.prop]; if (Array.isArray(obj)) { var compacted = []; for (var j = 0; j < obj.length; ++j) { if (typeof obj[j] !== "undefined") { compacted.push(obj[j]); } } item.obj[item.prop] = compacted; } } return obj; }; var arrayToObject = function arrayToObject2(source, options) { var obj = options && options.plainObjects ? /* @__PURE__ */ Object.create(null) : {}; for (var i = 0; i < source.length; ++i) { if (typeof source[i] !== "undefined") { obj[i] = source[i]; } } return obj; }; var merge = function merge2(target, source, options) { if (!source) { return target; } if (typeof source !== "object") { if (Array.isArray(target)) { target.push(source); } else if (target && typeof target === "object") { if (options && (options.plainObjects || options.allowPrototypes) || !has.call(Object.prototype, source)) { target[source] = true; } } else { return [target, source]; } return target; } if (!target || typeof target !== "object") { return [target].concat(source); } var mergeTarget = target; if (Array.isArray(target) && !Array.isArray(source)) { mergeTarget = arrayToObject(target, options); } if (Array.isArray(target) && Array.isArray(source)) { source.forEach(function(item, i) { if (has.call(target, i)) { var targetItem = target[i]; if (targetItem && typeof targetItem === "object" && item && typeof item === "object") { target[i] = merge2(targetItem, item, options); } else { target.push(item); } } else { target[i] = item; } }); return target; } return Object.keys(source).reduce(function(acc, key) { var value = source[key]; if (has.call(acc, key)) { acc[key] = merge2(acc[key], value, options); } else { acc[key] = value; } return acc; }, mergeTarget); }; var assign = function assignSingleSource(target, source) { return Object.keys(source).reduce(function(acc, key) { acc[key] = source[key]; return acc; }, target); }; var decode = function(str) { try { return decodeURIComponent(str.replace(/\+/g, " ")); } catch (e) { return str; } }; var encode = function encode2(str) { if (str.length === 0) { return str; } var string = typeof str === "string" ? str : String(str); var out = ""; for (var i = 0; i < string.length; ++i) { var c = string.charCodeAt(i); if (c === 45 || c === 46 || c === 95 || c === 126 || c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122) { out += string.charAt(i); continue; } if (c < 128) { out = out + hexTable[c]; continue; } if (c < 2048) { out = out + (hexTable[192 | c >> 6] + hexTable[128 | c & 63]); continue; } if (c < 55296 || c >= 57344) { out = out + (hexTable[224 | c >> 12] + hexTable[128 | c >> 6 & 63] + hexTable[128 | c & 63]); continue; } i += 1; c = 65536 + ((c & 1023) << 10 | string.charCodeAt(i) & 1023); out += hexTable[240 | c >> 18] + hexTable[128 | c >> 12 & 63] + hexTable[128 | c >> 6 & 63] + hexTable[128 | c & 63]; } return out; }; var compact = function compact2(value) { var queue = [{ obj: { o: value }, prop: "o" }]; var refs = []; for (var i = 0; i < queue.length; ++i) { var item = queue[i]; var obj = item.obj[item.prop]; var keys = Object.keys(obj); for (var j = 0; j < keys.length; ++j) { var key = keys[j]; var val = obj[key]; if (typeof val === "object" && val !== null && refs.indexOf(val) === -1) { queue.push({ obj, prop: key }); refs.push(val); } } } return compactQueue(queue); }; var isRegExp = function isRegExp2(obj) { return Object.prototype.toString.call(obj) === "[object RegExp]"; }; var isBuffer = function isBuffer2(obj) { if (obj === null || typeof obj === "undefined") { return false; } return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); }; module2.exports = { arrayToObject, assign, compact, decode, encode, isBuffer, isRegExp, merge }; } }); // node_modules/qs/lib/formats.js var require_formats = __commonJS({ "node_modules/qs/lib/formats.js"(exports, module2) { "use strict"; var replace = String.prototype.replace; var percentTwenties = /%20/g; module2.exports = { "default": "RFC3986", formatters: { RFC1738: function(value) { return replace.call(value, percentTwenties, "+"); }, RFC3986: function(value) { return String(value); } }, RFC1738: "RFC1738", RFC3986: "RFC3986" }; } }); // node_modules/qs/lib/stringify.js var require_stringify2 = __commonJS({ "node_modules/qs/lib/stringify.js"(exports, module2) { "use strict"; var utils = require_utils4(); var formats = require_formats(); var arrayPrefixGenerators = { brackets: function brackets(prefix) { return prefix + "[]"; }, indices: function indices(prefix, key) { return prefix + "[" + key + "]"; }, repeat: function repeat(prefix) { return prefix; } }; var isArray = Array.isArray; var push = Array.prototype.push; var pushToArray = function(arr, valueOrArray) { push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); }; var toISO = Date.prototype.toISOString; var defaults = { delimiter: "&", encode: true, encoder: utils.encode, encodeValuesOnly: false, serializeDate: function serializeDate(date) { return toISO.call(date); }, skipNulls: false, strictNullHandling: false }; var stringify = function stringify2(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, formatter, encodeValuesOnly) { var obj = object; if (typeof filter === "function") { obj = filter(prefix, obj); } else if (obj instanceof Date) { obj = serializeDate(obj); } if (obj === null) { if (strictNullHandling) { return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; } obj = ""; } if (typeof obj === "string" || typeof obj === "number" || typeof obj === "boolean" || utils.isBuffer(obj)) { if (encoder) { var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); return [formatter(keyValue) + "=" + formatter(encoder(obj, defaults.encoder))]; } return [formatter(prefix) + "=" + formatter(String(obj))]; } var values = []; if (typeof obj === "undefined") { return values; } var objKeys; if (isArray(filter)) { objKeys = filter; } else { var keys = Object.keys(obj); objKeys = sort ? keys.sort(sort) : keys; } for (var i = 0; i < objKeys.length; ++i) { var key = objKeys[i]; if (skipNulls && obj[key] === null) { continue; } if (isArray(obj)) { pushToArray(values, stringify2(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, formatter, encodeValuesOnly)); } else { pushToArray(values, stringify2(obj[key], prefix + (allowDots ? "." + key : "[" + key + "]"), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, formatter, encodeValuesOnly)); } } return values; }; module2.exports = function(object, opts) { var obj = object; var options = opts ? utils.assign({}, opts) : {}; if (options.encoder !== null && typeof options.encoder !== "undefined" && typeof options.encoder !== "function") { throw new TypeError("Encoder has to be a function."); } var delimiter = typeof options.delimiter === "undefined" ? defaults.delimiter : options.delimiter; var strictNullHandling = typeof options.strictNullHandling === "boolean" ? options.strictNullHandling : defaults.strictNullHandling; var skipNulls = typeof options.skipNulls === "boolean" ? options.skipNulls : defaults.skipNulls; var encode = typeof options.encode === "boolean" ? options.encode : defaults.encode; var encoder = typeof options.encoder === "function" ? options.encoder : defaults.encoder; var sort = typeof options.sort === "function" ? options.sort : null; var allowDots = typeof options.allowDots === "undefined" ? false : options.allowDots; var serializeDate = typeof options.serializeDate === "function" ? options.serializeDate : defaults.serializeDate; var encodeValuesOnly = typeof options.encodeValuesOnly === "boolean" ? options.encodeValuesOnly : defaults.encodeValuesOnly; if (typeof options.format === "undefined") { options.format = formats["default"]; } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { throw new TypeError("Unknown format option provided."); } var formatter = formats.formatters[options.format]; var objKeys; var filter; if (typeof options.filter === "function") { filter = options.filter; obj = filter("", obj); } else if (isArray(options.filter)) { filter = options.filter; objKeys = filter; } var keys = []; if (typeof obj !== "object" || obj === null) { return ""; } var arrayFormat; if (options.arrayFormat in arrayPrefixGenerators) { arrayFormat = options.arrayFormat; } else if ("indices" in options) { arrayFormat = options.indices ? "indices" : "repeat"; } else { arrayFormat = "indices"; } var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; if (!objKeys) { objKeys = Object.keys(obj); } if (sort) { objKeys.sort(sort); } for (var i = 0; i < objKeys.length; ++i) { var key = objKeys[i]; if (skipNulls && obj[key] === null) { continue; } pushToArray(keys, stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode ? encoder : null, filter, sort, allowDots, serializeDate, formatter, encodeValuesOnly)); } var joined = keys.join(delimiter); var prefix = options.addQueryPrefix === true ? "?" : ""; return joined.length > 0 ? prefix + joined : ""; }; } }); // node_modules/qs/lib/parse.js var require_parse = __commonJS({ "node_modules/qs/lib/parse.js"(exports, module2) { "use strict"; var utils = require_utils4(); var has = Object.prototype.hasOwnProperty; var defaults = { allowDots: false, allowPrototypes: false, arrayLimit: 20, decoder: utils.decode, delimiter: "&", depth: 5, parameterLimit: 1e3, plainObjects: false, strictNullHandling: false }; var parseValues = function parseQueryStringValues(str, options) { var obj = {}; var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, "") : str; var limit = options.parameterLimit === Infinity ? void 0 : options.parameterLimit; var parts = cleanStr.split(options.delimiter, limit); for (var i = 0; i < parts.length; ++i) { var part = parts[i]; var bracketEqualsPos = part.indexOf("]="); var pos = bracketEqualsPos === -1 ? part.indexOf("=") : bracketEqualsPos + 1; var key, val; if (pos === -1) { key = options.decoder(part, defaults.decoder); val = options.strictNullHandling ? null : ""; } else { key = options.decoder(part.slice(0, pos), defaults.decoder); val = options.decoder(part.slice(pos + 1), defaults.decoder); } if (has.call(obj, key)) { obj[key] = [].concat(obj[key]).concat(val); } else { obj[key] = val; } } return obj; }; var parseObject = function(chain, val, options) { var leaf = val; for (var i = chain.length - 1; i >= 0; --i) { var obj; var root = chain[i]; if (root === "[]" && options.parseArrays) { obj = [].concat(leaf); } else { obj = options.plainObjects ? /* @__PURE__ */ Object.create(null) : {}; var cleanRoot = root.charAt(0) === "[" && root.charAt(root.length - 1) === "]" ? root.slice(1, -1) : root; var index = parseInt(cleanRoot, 10); if (!options.parseArrays && cleanRoot === "") { obj = { 0: leaf }; } else if (!isNaN(index) && root !== cleanRoot && String(index) === cleanRoot && index >= 0 && (options.parseArrays && index <= options.arrayLimit)) { obj = []; obj[index] = leaf; } else if (cleanRoot !== "__proto__") { obj[cleanRoot] = leaf; } } leaf = obj; } return leaf; }; var parseKeys = function parseQueryStringKeys(givenKey, val, options) { if (!givenKey) { return; } var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, "[$1]") : givenKey; var brackets = /(\[[^[\]]*])/; var child = /(\[[^[\]]*])/g; var segment = brackets.exec(key); var parent = segment ? key.slice(0, segment.index) : key; var keys = []; if (parent) { if (!options.plainObjects && has.call(Object.prototype, parent)) { if (!options.allowPrototypes) { return; } } keys.push(parent); } var i = 0; while ((segment = child.exec(key)) !== null && i < options.depth) { i += 1; if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { if (!options.allowPrototypes) { return; } } keys.push(segment[1]); } if (segment) { keys.push("[" + key.slice(segment.index) + "]"); } return parseObject(keys, val, options); }; module2.exports = function(str, opts) { var options = opts ? utils.assign({}, opts) : {}; if (options.decoder !== null && options.decoder !== void 0 && typeof options.decoder !== "function") { throw new TypeError("Decoder has to be a function."); } options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; options.delimiter = typeof options.delimiter === "string" || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; options.depth = typeof options.depth === "number" ? options.depth : defaults.depth; options.arrayLimit = typeof options.arrayLimit === "number" ? options.arrayLimit : defaults.arrayLimit; options.parseArrays = options.parseArrays !== false; options.decoder = typeof options.decoder === "function" ? options.decoder : defaults.decoder; options.allowDots = typeof options.allowDots === "boolean" ? options.allowDots : defaults.allowDots; options.plainObjects = typeof options.plainObjects === "boolean" ? options.plainObjects : defaults.plainObjects; options.allowPrototypes = typeof options.allowPrototypes === "boolean" ? options.allowPrototypes : defaults.allowPrototypes; options.parameterLimit = typeof options.parameterLimit === "number" ? options.parameterLimit : defaults.parameterLimit; options.strictNullHandling = typeof options.strictNullHandling === "boolean" ? options.strictNullHandling : defaults.strictNullHandling; if (str === "" || str === null || typeof str === "undefined") { return options.plainObjects ? /* @__PURE__ */ Object.create(null) : {}; } var tempObj = typeof str === "string" ? parseValues(str, options) : str; var obj = options.plainObjects ? /* @__PURE__ */ Object.create(null) : {}; var keys = Object.keys(tempObj); for (var i = 0; i < keys.length; ++i) { var key = keys[i]; var newObj = parseKeys(key, tempObj[key], options); obj = utils.merge(obj, newObj, options); } return utils.compact(obj); }; } }); // node_modules/qs/lib/index.js var require_lib4 = __commonJS({ "node_modules/qs/lib/index.js"(exports, module2) { "use strict"; var stringify = require_stringify2(); var parse = require_parse(); var formats = require_formats(); module2.exports = { formats, parse, stringify }; } }); // node_modules/request/lib/querystring.js var require_querystring = __commonJS({ "node_modules/request/lib/querystring.js"(exports) { "use strict"; var qs = require_lib4(); var querystring = require("querystring"); function Querystring(request2) { this.request = request2; this.lib = null; this.useQuerystring = null; this.parseOptions = null; this.stringifyOptions = null; } Querystring.prototype.init = function(options) { if (this.lib) { return; } this.useQuerystring = options.useQuerystring; this.lib = this.useQuerystring ? querystring : qs; this.parseOptions = options.qsParseOptions || {}; this.stringifyOptions = options.qsStringifyOptions || {}; }; Querystring.prototype.stringify = function(obj) { return this.useQuerystring ? this.rfc3986(this.lib.stringify(obj, this.stringifyOptions.sep || null, this.stringifyOptions.eq || null, this.stringifyOptions)) : this.lib.stringify(obj, this.stringifyOptions); }; Querystring.prototype.parse = function(str) { return this.useQuerystring ? this.lib.parse(str, this.parseOptions.sep || null, this.parseOptions.eq || null, this.parseOptions) : this.lib.parse(str, this.parseOptions); }; Querystring.prototype.rfc3986 = function(str) { return str.replace(/[!'()*]/g, function(c) { return "%" + c.charCodeAt(0).toString(16).toUpperCase(); }); }; Querystring.prototype.unescape = querystring.unescape; exports.Querystring = Querystring; } }); // node_modules/uri-js/dist/es5/uri.all.js var require_uri_all = __commonJS({ "node_modules/uri-js/dist/es5/uri.all.js"(exports, module2) { (function(global2, factory) { typeof exports === "object" && typeof module2 !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : factory(global2.URI = global2.URI || {}); })(exports, function(exports2) { "use strict"; function merge() { for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) { sets[_key] = arguments[_key]; } if (sets.length > 1) { sets[0] = sets[0].slice(0, -1); var xl = sets.length - 1; for (var x = 1; x < xl; ++x) { sets[x] = sets[x].slice(1, -1); } sets[xl] = sets[xl].slice(1); return sets.join(""); } else { return sets[0]; } } function subexp(str) { return "(?:" + str + ")"; } function typeOf(o) { return o === void 0 ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase(); } function toUpperCase(str) { return str.toUpperCase(); } function toArray(obj) { return obj !== void 0 && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : []; } function assign(target, source) { var obj = target; if (source) { for (var key in source) { obj[key] = source[key]; } } return obj; } function buildExps(isIRI2) { var ALPHA$$ = "[A-Za-z]", CR$ = "[\\x0D]", DIGIT$$ = "[0-9]", DQUOTE$$ = "[\\x22]", HEXDIG$$2 = merge(DIGIT$$, "[A-Fa-f]"), LF$$ = "[\\x0A]", SP$$ = "[\\x20]", PCT_ENCODED$2 = subexp(subexp("%[EFef]" + HEXDIG$$2 + "%" + HEXDIG$$2 + HEXDIG$$2 + "%" + HEXDIG$$2 + HEXDIG$$2) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$2 + "%" + HEXDIG$$2 + HEXDIG$$2) + "|" + subexp("%" + HEXDIG$$2 + HEXDIG$$2)), GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI2 ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", IPRIVATE$$ = isIRI2 ? "[\\uE000-\\uF8FF]" : "[]", UNRESERVED$$2 = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), USERINFO$ = subexp(subexp(PCT_ENCODED$2 + "|" + merge(UNRESERVED$$2, SUB_DELIMS$$, "[\\:]")) + "*"), DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), H16$ = subexp(HEXDIG$$2 + "{1,4}"), LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), ZONEID$ = subexp(subexp(UNRESERVED$$2 + "|" + PCT_ENCODED$2) + "+"), IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$2 + "{2})") + ZONEID$), IPVFUTURE$ = subexp("[vV]" + HEXDIG$$2 + "+\\." + merge(UNRESERVED$$2, SUB_DELIMS$$, "[\\:]") + "+"), IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), REG_NAME$ = subexp(subexp(PCT_ENCODED$2 + "|" + merge(UNRESERVED$$2, SUB_DELIMS$$)) + "*"), HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")|" + REG_NAME$), PORT$ = subexp(DIGIT$$ + "*"), AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), PCHAR$ = subexp(PCT_ENCODED$2 + "|" + merge(UNRESERVED$$2, SUB_DELIMS$$, "[\\:\\@]")), SEGMENT$ = subexp(PCHAR$ + "*"), SEGMENT_NZ$ = subexp(PCHAR$ + "+"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$2 + "|" + merge(UNRESERVED$$2, SUB_DELIMS$$, "[\\@]")) + "+"), PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), PATH_EMPTY$ = "(?!" + PCHAR$ + ")", PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; return { NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$2, SUB_DELIMS$$), "g"), NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$2, SUB_DELIMS$$), "g"), NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$2, SUB_DELIMS$$), "g"), NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$2, SUB_DELIMS$$), "g"), NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$2, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$2, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), ESCAPE: new RegExp(merge("[^]", UNRESERVED$$2, SUB_DELIMS$$), "g"), UNRESERVED: new RegExp(UNRESERVED$$2, "g"), OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$2, RESERVED$$), "g"), PCT_ENCODED: new RegExp(PCT_ENCODED$2, "g"), IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$2 + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") }; } var URI_PROTOCOL = buildExps(false); var IRI_PROTOCOL = buildExps(true); var slicedToArray = function() { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = void 0; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var toConsumableArray = function(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }; var maxInt = 2147483647; var base = 36; var tMin = 1; var tMax = 26; var skew = 38; var damp = 700; var initialBias = 72; var initialN = 128; var delimiter = "-"; var regexPunycode = /^xn--/; var regexNonASCII = /[^\0-\x7E]/; var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; var errors = { "overflow": "Overflow: input needs wider integers to process", "not-basic": "Illegal input >= 0x80 (not a basic code point)", "invalid-input": "Invalid input" }; var baseMinusTMin = base - tMin; var floor = Math.floor; var stringFromCharCode = String.fromCharCode; function error$1(type) { throw new RangeError(errors[type]); } function map(array, fn) { var result = []; var length = array.length; while (length--) { result[length] = fn(array[length]); } return result; } function mapDomain(string, fn) { var parts = string.split("@"); var result = ""; if (parts.length > 1) { result = parts[0] + "@"; string = parts[1]; } string = string.replace(regexSeparators, "."); var labels = string.split("."); var encoded = map(labels, fn).join("."); return result + encoded; } function ucs2decode(string) { var output = []; var counter = 0; var length = string.length; while (counter < length) { var value = string.charCodeAt(counter++); if (value >= 55296 && value <= 56319 && counter < length) { var extra = string.charCodeAt(counter++); if ((extra & 64512) == 56320) { output.push(((value & 1023) << 10) + (extra & 1023) + 65536); } else { output.push(value); counter--; } } else { output.push(value); } } return output; } var ucs2encode = function ucs2encode2(array) { return String.fromCodePoint.apply(String, toConsumableArray(array)); }; var basicToDigit = function basicToDigit2(codePoint) { if (codePoint - 48 < 10) { return codePoint - 22; } if (codePoint - 65 < 26) { return codePoint - 65; } if (codePoint - 97 < 26) { return codePoint - 97; } return base; }; var digitToBasic = function digitToBasic2(digit, flag) { return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); }; var adapt = function adapt2(delta, numPoints, firstTime) { var k = 0; delta = firstTime ? floor(delta / damp) : delta >> 1; delta += floor(delta / numPoints); for (; delta > baseMinusTMin * tMax >> 1; k += base) { delta = floor(delta / baseMinusTMin); } return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); }; var decode = function decode2(input) { var output = []; var inputLength = input.length; var i = 0; var n = initialN; var bias = initialBias; var basic = input.lastIndexOf(delimiter); if (basic < 0) { basic = 0; } for (var j = 0; j < basic; ++j) { if (input.charCodeAt(j) >= 128) { error$1("not-basic"); } output.push(input.charCodeAt(j)); } for (var index = basic > 0 ? basic + 1 : 0; index < inputLength; ) { var oldi = i; for (var w = 1, k = base; ; k += base) { if (index >= inputLength) { error$1("invalid-input"); } var digit = basicToDigit(input.charCodeAt(index++)); if (digit >= base || digit > floor((maxInt - i) / w)) { error$1("overflow"); } i += digit * w; var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; if (digit < t) { break; } var baseMinusT = base - t; if (w > floor(maxInt / baseMinusT)) { error$1("overflow"); } w *= baseMinusT; } var out = output.length + 1; bias = adapt(i - oldi, out, oldi == 0); if (floor(i / out) > maxInt - n) { error$1("overflow"); } n += floor(i / out); i %= out; output.splice(i++, 0, n); } return String.fromCodePoint.apply(String, output); }; var encode = function encode2(input) { var output = []; input = ucs2decode(input); var inputLength = input.length; var n = initialN; var delta = 0; var bias = initialBias; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = void 0; try { for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _currentValue2 = _step.value; if (_currentValue2 < 128) { output.push(stringFromCharCode(_currentValue2)); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var basicLength = output.length; var handledCPCount = basicLength; if (basicLength) { output.push(delimiter); } while (handledCPCount < inputLength) { var m = maxInt; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = void 0; try { for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var currentValue = _step2.value; if (currentValue >= n && currentValue < m) { m = currentValue; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } var handledCPCountPlusOne = handledCPCount + 1; if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { error$1("overflow"); } delta += (m - n) * handledCPCountPlusOne; n = m; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = void 0; try { for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var _currentValue = _step3.value; if (_currentValue < n && ++delta > maxInt) { error$1("overflow"); } if (_currentValue == n) { var q2 = delta; for (var k = base; ; k += base) { var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; if (q2 < t) { break; } var qMinusT = q2 - t; var baseMinusT = base - t; output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); q2 = floor(qMinusT / baseMinusT); } output.push(stringFromCharCode(digitToBasic(q2, 0))); bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); delta = 0; ++handledCPCount; } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } ++delta; ++n; } return output.join(""); }; var toUnicode = function toUnicode2(input) { return mapDomain(input, function(string) { return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; }); }; var toASCII = function toASCII2(input) { return mapDomain(input, function(string) { return regexNonASCII.test(string) ? "xn--" + encode(string) : string; }); }; var punycode = { "version": "2.1.0", "ucs2": { "decode": ucs2decode, "encode": ucs2encode }, "decode": decode, "encode": encode, "toASCII": toASCII, "toUnicode": toUnicode }; var SCHEMES = {}; function pctEncChar(chr) { var c = chr.charCodeAt(0); var e = void 0; if (c < 16) e = "%0" + c.toString(16).toUpperCase(); else if (c < 128) e = "%" + c.toString(16).toUpperCase(); else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase(); else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase(); return e; } function pctDecChars(str) { var newStr = ""; var i = 0; var il = str.length; while (i < il) { var c = parseInt(str.substr(i + 1, 2), 16); if (c < 128) { newStr += String.fromCharCode(c); i += 3; } else if (c >= 194 && c < 224) { if (il - i >= 6) { var c2 = parseInt(str.substr(i + 4, 2), 16); newStr += String.fromCharCode((c & 31) << 6 | c2 & 63); } else { newStr += str.substr(i, 6); } i += 6; } else if (c >= 224) { if (il - i >= 9) { var _c = parseInt(str.substr(i + 4, 2), 16); var c3 = parseInt(str.substr(i + 7, 2), 16); newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63); } else { newStr += str.substr(i, 9); } i += 9; } else { newStr += str.substr(i, 3); i += 3; } } return newStr; } function _normalizeComponentEncoding(components, protocol) { function decodeUnreserved2(str) { var decStr = pctDecChars(str); return !decStr.match(protocol.UNRESERVED) ? str : decStr; } if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved2).toLowerCase().replace(protocol.NOT_SCHEME, ""); if (components.userinfo !== void 0) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved2).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); if (components.host !== void 0) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved2).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); if (components.path !== void 0) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved2).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); if (components.query !== void 0) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved2).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); if (components.fragment !== void 0) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved2).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); return components; } function _stripLeadingZeros(str) { return str.replace(/^0*(.*)/, "$1") || "0"; } function _normalizeIPv4(host, protocol) { var matches = host.match(protocol.IPV4ADDRESS) || []; var _matches = slicedToArray(matches, 2), address = _matches[1]; if (address) { return address.split(".").map(_stripLeadingZeros).join("."); } else { return host; } } function _normalizeIPv6(host, protocol) { var matches = host.match(protocol.IPV6ADDRESS) || []; var _matches2 = slicedToArray(matches, 3), address = _matches2[1], zone = _matches2[2]; if (address) { var _address$toLowerCase$ = address.toLowerCase().split("::").reverse(), _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2), last = _address$toLowerCase$2[0], first = _address$toLowerCase$2[1]; var firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; var lastFields = last.split(":").map(_stripLeadingZeros); var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); var fieldCount = isLastFieldIPv4Address ? 7 : 8; var lastFieldsStart = lastFields.length - fieldCount; var fields = Array(fieldCount); for (var x = 0; x < fieldCount; ++x) { fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ""; } if (isLastFieldIPv4Address) { fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); } var allZeroFields = fields.reduce(function(acc, field, index) { if (!field || field === "0") { var lastLongest = acc[acc.length - 1]; if (lastLongest && lastLongest.index + lastLongest.length === index) { lastLongest.length++; } else { acc.push({ index, length: 1 }); } } return acc; }, []); var longestZeroFields = allZeroFields.sort(function(a, b) { return b.length - a.length; })[0]; var newHost = void 0; if (longestZeroFields && longestZeroFields.length > 1) { var newFirst = fields.slice(0, longestZeroFields.index); var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); newHost = newFirst.join(":") + "::" + newLast.join(":"); } else { newHost = fields.join(":"); } if (zone) { newHost += "%" + zone; } return newHost; } else { return host; } } var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === void 0; function parse(uriString) { var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; var components = {}; var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; var matches = uriString.match(URI_PARSE); if (matches) { if (NO_MATCH_IS_UNDEFINED) { components.scheme = matches[1]; components.userinfo = matches[3]; components.host = matches[4]; components.port = parseInt(matches[5], 10); components.path = matches[6] || ""; components.query = matches[7]; components.fragment = matches[8]; if (isNaN(components.port)) { components.port = matches[5]; } } else { components.scheme = matches[1] || void 0; components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : void 0; components.host = uriString.indexOf("//") !== -1 ? matches[4] : void 0; components.port = parseInt(matches[5], 10); components.path = matches[6] || ""; components.query = uriString.indexOf("?") !== -1 ? matches[7] : void 0; components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : void 0; if (isNaN(components.port)) { components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : void 0; } } if (components.host) { components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); } if (components.scheme === void 0 && components.userinfo === void 0 && components.host === void 0 && components.port === void 0 && !components.path && components.query === void 0) { components.reference = "same-document"; } else if (components.scheme === void 0) { components.reference = "relative"; } else if (components.fragment === void 0) { components.reference = "absolute"; } else { components.reference = "uri"; } if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { components.error = components.error || "URI is not a " + options.reference + " reference."; } var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) { try { components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); } catch (e) { components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; } } _normalizeComponentEncoding(components, URI_PROTOCOL); } else { _normalizeComponentEncoding(components, protocol); } if (schemeHandler && schemeHandler.parse) { schemeHandler.parse(components, options); } } else { components.error = components.error || "URI can not be parsed."; } return components; } function _recomposeAuthority(components, options) { var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; var uriTokens = []; if (components.userinfo !== void 0) { uriTokens.push(components.userinfo); uriTokens.push("@"); } if (components.host !== void 0) { uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function(_, $1, $2) { return "[" + $1 + ($2 ? "%25" + $2 : "") + "]"; })); } if (typeof components.port === "number" || typeof components.port === "string") { uriTokens.push(":"); uriTokens.push(String(components.port)); } return uriTokens.length ? uriTokens.join("") : void 0; } var RDS1 = /^\.\.?\//; var RDS2 = /^\/\.(\/|$)/; var RDS3 = /^\/\.\.(\/|$)/; var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; function removeDotSegments(input) { var output = []; while (input.length) { if (input.match(RDS1)) { input = input.replace(RDS1, ""); } else if (input.match(RDS2)) { input = input.replace(RDS2, "/"); } else if (input.match(RDS3)) { input = input.replace(RDS3, "/"); output.pop(); } else if (input === "." || input === "..") { input = ""; } else { var im = input.match(RDS5); if (im) { var s = im[0]; input = input.slice(s.length); output.push(s); } else { throw new Error("Unexpected dot segment condition"); } } } return output.join(""); } function serialize(components) { var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL; var uriTokens = []; var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options); if (components.host) { if (protocol.IPV6ADDRESS.test(components.host)) { } else if (options.domainHost || schemeHandler && schemeHandler.domainHost) { try { components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host); } catch (e) { components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; } } } _normalizeComponentEncoding(components, protocol); if (options.reference !== "suffix" && components.scheme) { uriTokens.push(components.scheme); uriTokens.push(":"); } var authority = _recomposeAuthority(components, options); if (authority !== void 0) { if (options.reference !== "suffix") { uriTokens.push("//"); } uriTokens.push(authority); if (components.path && components.path.charAt(0) !== "/") { uriTokens.push("/"); } } if (components.path !== void 0) { var s = components.path; if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { s = removeDotSegments(s); } if (authority === void 0) { s = s.replace(/^\/\//, "/%2F"); } uriTokens.push(s); } if (components.query !== void 0) { uriTokens.push("?"); uriTokens.push(components.query); } if (components.fragment !== void 0) { uriTokens.push("#"); uriTokens.push(components.fragment); } return uriTokens.join(""); } function resolveComponents(base2, relative) { var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; var skipNormalization = arguments[3]; var target = {}; if (!skipNormalization) { base2 = parse(serialize(base2, options), options); relative = parse(serialize(relative, options), options); } options = options || {}; if (!options.tolerant && relative.scheme) { target.scheme = relative.scheme; target.userinfo = relative.userinfo; target.host = relative.host; target.port = relative.port; target.path = removeDotSegments(relative.path || ""); target.query = relative.query; } else { if (relative.userinfo !== void 0 || relative.host !== void 0 || relative.port !== void 0) { target.userinfo = relative.userinfo; target.host = relative.host; target.port = relative.port; target.path = removeDotSegments(relative.path || ""); target.query = relative.query; } else { if (!relative.path) { target.path = base2.path; if (relative.query !== void 0) { target.query = relative.query; } else { target.query = base2.query; } } else { if (relative.path.charAt(0) === "/") { target.path = removeDotSegments(relative.path); } else { if ((base2.userinfo !== void 0 || base2.host !== void 0 || base2.port !== void 0) && !base2.path) { target.path = "/" + relative.path; } else if (!base2.path) { target.path = relative.path; } else { target.path = base2.path.slice(0, base2.path.lastIndexOf("/") + 1) + relative.path; } target.path = removeDotSegments(target.path); } target.query = relative.query; } target.userinfo = base2.userinfo; target.host = base2.host; target.port = base2.port; } target.scheme = base2.scheme; } target.fragment = relative.fragment; return target; } function resolve(baseURI, relativeURI, options) { var schemelessOptions = assign({ scheme: "null" }, options); return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); } function normalize(uri, options) { if (typeof uri === "string") { uri = serialize(parse(uri, options), options); } else if (typeOf(uri) === "object") { uri = parse(serialize(uri, options), options); } return uri; } function equal(uriA, uriB, options) { if (typeof uriA === "string") { uriA = serialize(parse(uriA, options), options); } else if (typeOf(uriA) === "object") { uriA = serialize(uriA, options); } if (typeof uriB === "string") { uriB = serialize(parse(uriB, options), options); } else if (typeOf(uriB) === "object") { uriB = serialize(uriB, options); } return uriA === uriB; } function escapeComponent(str, options) { return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar); } function unescapeComponent(str, options) { return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars); } var handler = { scheme: "http", domainHost: true, parse: function parse2(components, options) { if (!components.host) { components.error = components.error || "HTTP URIs must have a host."; } return components; }, serialize: function serialize2(components, options) { var secure = String(components.scheme).toLowerCase() === "https"; if (components.port === (secure ? 443 : 80) || components.port === "") { components.port = void 0; } if (!components.path) { components.path = "/"; } return components; } }; var handler$1 = { scheme: "https", domainHost: handler.domainHost, parse: handler.parse, serialize: handler.serialize }; function isSecure(wsComponents) { return typeof wsComponents.secure === "boolean" ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss"; } var handler$2 = { scheme: "ws", domainHost: true, parse: function parse2(components, options) { var wsComponents = components; wsComponents.secure = isSecure(wsComponents); wsComponents.resourceName = (wsComponents.path || "/") + (wsComponents.query ? "?" + wsComponents.query : ""); wsComponents.path = void 0; wsComponents.query = void 0; return wsComponents; }, serialize: function serialize2(wsComponents, options) { if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") { wsComponents.port = void 0; } if (typeof wsComponents.secure === "boolean") { wsComponents.scheme = wsComponents.secure ? "wss" : "ws"; wsComponents.secure = void 0; } if (wsComponents.resourceName) { var _wsComponents$resourc = wsComponents.resourceName.split("?"), _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2), path3 = _wsComponents$resourc2[0], query = _wsComponents$resourc2[1]; wsComponents.path = path3 && path3 !== "/" ? path3 : void 0; wsComponents.query = query; wsComponents.resourceName = void 0; } wsComponents.fragment = void 0; return wsComponents; } }; var handler$3 = { scheme: "wss", domainHost: handler$2.domainHost, parse: handler$2.parse, serialize: handler$2.serialize }; var O = {}; var isIRI = true; var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; var HEXDIG$$ = "[0-9A-Fa-f]"; var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; var VCHAR$$ = merge(QTEXT$$, '[\\"\\\\]'); var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; var UNRESERVED = new RegExp(UNRESERVED$$, "g"); var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); var NOT_HFVALUE = NOT_HFNAME; function decodeUnreserved(str) { var decStr = pctDecChars(str); return !decStr.match(UNRESERVED) ? str : decStr; } var handler$4 = { scheme: "mailto", parse: function parse$$1(components, options) { var mailtoComponents = components; var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : []; mailtoComponents.path = void 0; if (mailtoComponents.query) { var unknownHeaders = false; var headers = {}; var hfields = mailtoComponents.query.split("&"); for (var x = 0, xl = hfields.length; x < xl; ++x) { var hfield = hfields[x].split("="); switch (hfield[0]) { case "to": var toAddrs = hfield[1].split(","); for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) { to.push(toAddrs[_x]); } break; case "subject": mailtoComponents.subject = unescapeComponent(hfield[1], options); break; case "body": mailtoComponents.body = unescapeComponent(hfield[1], options); break; default: unknownHeaders = true; headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); break; } } if (unknownHeaders) mailtoComponents.headers = headers; } mailtoComponents.query = void 0; for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) { var addr = to[_x2].split("@"); addr[0] = unescapeComponent(addr[0]); if (!options.unicodeSupport) { try { addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); } catch (e) { mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; } } else { addr[1] = unescapeComponent(addr[1], options).toLowerCase(); } to[_x2] = addr.join("@"); } return mailtoComponents; }, serialize: function serialize$$1(mailtoComponents, options) { var components = mailtoComponents; var to = toArray(mailtoComponents.to); if (to) { for (var x = 0, xl = to.length; x < xl; ++x) { var toAddr = String(to[x]); var atIdx = toAddr.lastIndexOf("@"); var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); var domain = toAddr.slice(atIdx + 1); try { domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain); } catch (e) { components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; } to[x] = localPart + "@" + domain; } components.path = to.join(","); } var headers = mailtoComponents.headers = mailtoComponents.headers || {}; if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject; if (mailtoComponents.body) headers["body"] = mailtoComponents.body; var fields = []; for (var name in headers) { if (headers[name] !== O[name]) { fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); } } if (fields.length) { components.query = fields.join("&"); } return components; } }; var URN_PARSE = /^([^\:]+)\:(.*)/; var handler$5 = { scheme: "urn", parse: function parse$$1(components, options) { var matches = components.path && components.path.match(URN_PARSE); var urnComponents = components; if (matches) { var scheme = options.scheme || urnComponents.scheme || "urn"; var nid = matches[1].toLowerCase(); var nss = matches[2]; var urnScheme = scheme + ":" + (options.nid || nid); var schemeHandler = SCHEMES[urnScheme]; urnComponents.nid = nid; urnComponents.nss = nss; urnComponents.path = void 0; if (schemeHandler) { urnComponents = schemeHandler.parse(urnComponents, options); } } else { urnComponents.error = urnComponents.error || "URN can not be parsed."; } return urnComponents; }, serialize: function serialize$$1(urnComponents, options) { var scheme = options.scheme || urnComponents.scheme || "urn"; var nid = urnComponents.nid; var urnScheme = scheme + ":" + (options.nid || nid); var schemeHandler = SCHEMES[urnScheme]; if (schemeHandler) { urnComponents = schemeHandler.serialize(urnComponents, options); } var uriComponents = urnComponents; var nss = urnComponents.nss; uriComponents.path = (nid || options.nid) + ":" + nss; return uriComponents; } }; var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; var handler$6 = { scheme: "urn:uuid", parse: function parse2(urnComponents, options) { var uuidComponents = urnComponents; uuidComponents.uuid = uuidComponents.nss; uuidComponents.nss = void 0; if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { uuidComponents.error = uuidComponents.error || "UUID is not valid."; } return uuidComponents; }, serialize: function serialize2(uuidComponents, options) { var urnComponents = uuidComponents; urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); return urnComponents; } }; SCHEMES[handler.scheme] = handler; SCHEMES[handler$1.scheme] = handler$1; SCHEMES[handler$2.scheme] = handler$2; SCHEMES[handler$3.scheme] = handler$3; SCHEMES[handler$4.scheme] = handler$4; SCHEMES[handler$5.scheme] = handler$5; SCHEMES[handler$6.scheme] = handler$6; exports2.SCHEMES = SCHEMES; exports2.pctEncChar = pctEncChar; exports2.pctDecChars = pctDecChars; exports2.parse = parse; exports2.removeDotSegments = removeDotSegments; exports2.serialize = serialize; exports2.resolveComponents = resolveComponents; exports2.resolve = resolve; exports2.normalize = normalize; exports2.equal = equal; exports2.escapeComponent = escapeComponent; exports2.unescapeComponent = unescapeComponent; Object.defineProperty(exports2, "__esModule", { value: true }); }); } }); // node_modules/fast-deep-equal/index.js var require_fast_deep_equal = __commonJS({ "node_modules/fast-deep-equal/index.js"(exports, module2) { "use strict"; module2.exports = function equal(a, b) { if (a === b) return true; if (a && b && typeof a == "object" && typeof b == "object") { if (a.constructor !== b.constructor) return false; var length, i, keys; if (Array.isArray(a)) { length = a.length; if (length != b.length) return false; for (i = length; i-- !== 0; ) if (!equal(a[i], b[i])) return false; return true; } if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); keys = Object.keys(a); length = keys.length; if (length !== Object.keys(b).length) return false; for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; for (i = length; i-- !== 0; ) { var key = keys[i]; if (!equal(a[key], b[key])) return false; } return true; } return a !== a && b !== b; }; } }); // node_modules/ajv/lib/compile/ucs2length.js var require_ucs2length = __commonJS({ "node_modules/ajv/lib/compile/ucs2length.js"(exports, module2) { "use strict"; module2.exports = function ucs2length(str) { var length = 0, len = str.length, pos = 0, value; while (pos < len) { length++; value = str.charCodeAt(pos++); if (value >= 55296 && value <= 56319 && pos < len) { value = str.charCodeAt(pos); if ((value & 64512) == 56320) pos++; } } return length; }; } }); // node_modules/ajv/lib/compile/util.js var require_util3 = __commonJS({ "node_modules/ajv/lib/compile/util.js"(exports, module2) { "use strict"; module2.exports = { copy, checkDataType, checkDataTypes, coerceToTypes, toHash, getProperty, escapeQuotes, equal: require_fast_deep_equal(), ucs2length: require_ucs2length(), varOccurences, varReplace, schemaHasRules, schemaHasRulesExcept, schemaUnknownRules, toQuotedString, getPathExpr, getPath, getData, unescapeFragment, unescapeJsonPointer, escapeFragment, escapeJsonPointer }; function copy(o, to) { to = to || {}; for (var key in o) to[key] = o[key]; return to; } function checkDataType(dataType, data, strictNumbers, negate) { var EQUAL = negate ? " !== " : " === ", AND = negate ? " || " : " && ", OK = negate ? "!" : "", NOT = negate ? "" : "!"; switch (dataType) { case "null": return data + EQUAL + "null"; case "array": return OK + "Array.isArray(" + data + ")"; case "object": return "(" + OK + data + AND + "typeof " + data + EQUAL + '"object"' + AND + NOT + "Array.isArray(" + data + "))"; case "integer": return "(typeof " + data + EQUAL + '"number"' + AND + NOT + "(" + data + " % 1)" + AND + data + EQUAL + data + (strictNumbers ? AND + OK + "isFinite(" + data + ")" : "") + ")"; case "number": return "(typeof " + data + EQUAL + '"' + dataType + '"' + (strictNumbers ? AND + OK + "isFinite(" + data + ")" : "") + ")"; default: return "typeof " + data + EQUAL + '"' + dataType + '"'; } } function checkDataTypes(dataTypes, data, strictNumbers) { switch (dataTypes.length) { case 1: return checkDataType(dataTypes[0], data, strictNumbers, true); default: var code = ""; var types = toHash(dataTypes); if (types.array && types.object) { code = types.null ? "(" : "(!" + data + " || "; code += "typeof " + data + ' !== "object")'; delete types.null; delete types.array; delete types.object; } if (types.number) delete types.integer; for (var t in types) code += (code ? " && " : "") + checkDataType(t, data, strictNumbers, true); return code; } } var COERCE_TO_TYPES = toHash(["string", "number", "integer", "boolean", "null"]); function coerceToTypes(optionCoerceTypes, dataTypes) { if (Array.isArray(dataTypes)) { var types = []; for (var i = 0; i < dataTypes.length; i++) { var t = dataTypes[i]; if (COERCE_TO_TYPES[t]) types[types.length] = t; else if (optionCoerceTypes === "array" && t === "array") types[types.length] = t; } if (types.length) return types; } else if (COERCE_TO_TYPES[dataTypes]) { return [dataTypes]; } else if (optionCoerceTypes === "array" && dataTypes === "array") { return ["array"]; } } function toHash(arr) { var hash = {}; for (var i = 0; i < arr.length; i++) hash[arr[i]] = true; return hash; } var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; var SINGLE_QUOTE = /'|\\/g; function getProperty(key) { return typeof key == "number" ? "[" + key + "]" : IDENTIFIER.test(key) ? "." + key : "['" + escapeQuotes(key) + "']"; } function escapeQuotes(str) { return str.replace(SINGLE_QUOTE, "\\$&").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\f/g, "\\f").replace(/\t/g, "\\t"); } function varOccurences(str, dataVar) { dataVar += "[^0-9]"; var matches = str.match(new RegExp(dataVar, "g")); return matches ? matches.length : 0; } function varReplace(str, dataVar, expr) { dataVar += "([^0-9])"; expr = expr.replace(/\$/g, "$$$$"); return str.replace(new RegExp(dataVar, "g"), expr + "$1"); } function schemaHasRules(schema, rules) { if (typeof schema == "boolean") return !schema; for (var key in schema) if (rules[key]) return true; } function schemaHasRulesExcept(schema, rules, exceptKeyword) { if (typeof schema == "boolean") return !schema && exceptKeyword != "not"; for (var key in schema) if (key != exceptKeyword && rules[key]) return true; } function schemaUnknownRules(schema, rules) { if (typeof schema == "boolean") return; for (var key in schema) if (!rules[key]) return key; } function toQuotedString(str) { return "'" + escapeQuotes(str) + "'"; } function getPathExpr(currentPath, expr, jsonPointers, isNumber) { var path3 = jsonPointers ? "'/' + " + expr + (isNumber ? "" : ".replace(/~/g, '~0').replace(/\\//g, '~1')") : isNumber ? "'[' + " + expr + " + ']'" : "'[\\'' + " + expr + " + '\\']'"; return joinPaths(currentPath, path3); } function getPath(currentPath, prop, jsonPointers) { var path3 = jsonPointers ? toQuotedString("/" + escapeJsonPointer(prop)) : toQuotedString(getProperty(prop)); return joinPaths(currentPath, path3); } var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; function getData($data, lvl, paths) { var up, jsonPointer, data, matches; if ($data === "") return "rootData"; if ($data[0] == "/") { if (!JSON_POINTER.test($data)) throw new Error("Invalid JSON-pointer: " + $data); jsonPointer = $data; data = "rootData"; } else { matches = $data.match(RELATIVE_JSON_POINTER); if (!matches) throw new Error("Invalid JSON-pointer: " + $data); up = +matches[1]; jsonPointer = matches[2]; if (jsonPointer == "#") { if (up >= lvl) throw new Error("Cannot access property/index " + up + " levels up, current level is " + lvl); return paths[lvl - up]; } if (up > lvl) throw new Error("Cannot access data " + up + " levels up, current level is " + lvl); data = "data" + (lvl - up || ""); if (!jsonPointer) return data; } var expr = data; var segments = jsonPointer.split("/"); for (var i = 0; i < segments.length; i++) { var segment = segments[i]; if (segment) { data += getProperty(unescapeJsonPointer(segment)); expr += " && " + data; } } return expr; } function joinPaths(a, b) { if (a == '""') return b; return (a + " + " + b).replace(/([^\\])' \+ '/g, "$1"); } function unescapeFragment(str) { return unescapeJsonPointer(decodeURIComponent(str)); } function escapeFragment(str) { return encodeURIComponent(escapeJsonPointer(str)); } function escapeJsonPointer(str) { return str.replace(/~/g, "~0").replace(/\//g, "~1"); } function unescapeJsonPointer(str) { return str.replace(/~1/g, "/").replace(/~0/g, "~"); } } }); // node_modules/ajv/lib/compile/schema_obj.js var require_schema_obj = __commonJS({ "node_modules/ajv/lib/compile/schema_obj.js"(exports, module2) { "use strict"; var util = require_util3(); module2.exports = SchemaObject; function SchemaObject(obj) { util.copy(obj, this); } } }); // node_modules/json-schema-traverse/index.js var require_json_schema_traverse = __commonJS({ "node_modules/json-schema-traverse/index.js"(exports, module2) { "use strict"; var traverse = module2.exports = function(schema, opts, cb) { if (typeof opts == "function") { cb = opts; opts = {}; } cb = opts.cb || cb; var pre = typeof cb == "function" ? cb : cb.pre || function() { }; var post = cb.post || function() { }; _traverse(opts, pre, post, schema, "", schema); }; traverse.keywords = { additionalItems: true, items: true, contains: true, additionalProperties: true, propertyNames: true, not: true }; traverse.arrayKeywords = { items: true, allOf: true, anyOf: true, oneOf: true }; traverse.propsKeywords = { definitions: true, properties: true, patternProperties: true, dependencies: true }; traverse.skipKeywords = { default: true, enum: true, const: true, required: true, maximum: true, minimum: true, exclusiveMaximum: true, exclusiveMinimum: true, multipleOf: true, maxLength: true, minLength: true, pattern: true, format: true, maxItems: true, minItems: true, uniqueItems: true, maxProperties: true, minProperties: true }; function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) { if (schema && typeof schema == "object" && !Array.isArray(schema)) { pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); for (var key in schema) { var sch = schema[key]; if (Array.isArray(sch)) { if (key in traverse.arrayKeywords) { for (var i = 0; i < sch.length; i++) _traverse(opts, pre, post, sch[i], jsonPtr + "/" + key + "/" + i, rootSchema, jsonPtr, key, schema, i); } } else if (key in traverse.propsKeywords) { if (sch && typeof sch == "object") { for (var prop in sch) _traverse(opts, pre, post, sch[prop], jsonPtr + "/" + key + "/" + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop); } } else if (key in traverse.keywords || opts.allKeys && !(key in traverse.skipKeywords)) { _traverse(opts, pre, post, sch, jsonPtr + "/" + key, rootSchema, jsonPtr, key, schema); } } post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); } } function escapeJsonPtr(str) { return str.replace(/~/g, "~0").replace(/\//g, "~1"); } } }); // node_modules/ajv/lib/compile/resolve.js var require_resolve = __commonJS({ "node_modules/ajv/lib/compile/resolve.js"(exports, module2) { "use strict"; var URI = require_uri_all(); var equal = require_fast_deep_equal(); var util = require_util3(); var SchemaObject = require_schema_obj(); var traverse = require_json_schema_traverse(); module2.exports = resolve; resolve.normalizeId = normalizeId; resolve.fullPath = getFullPath; resolve.url = resolveUrl; resolve.ids = resolveIds; resolve.inlineRef = inlineRef; resolve.schema = resolveSchema; function resolve(compile, root, ref) { var refVal = this._refs[ref]; if (typeof refVal == "string") { if (this._refs[refVal]) refVal = this._refs[refVal]; else return resolve.call(this, compile, root, refVal); } refVal = refVal || this._schemas[ref]; if (refVal instanceof SchemaObject) { return inlineRef(refVal.schema, this._opts.inlineRefs) ? refVal.schema : refVal.validate || this._compile(refVal); } var res = resolveSchema.call(this, root, ref); var schema, v, baseId; if (res) { schema = res.schema; root = res.root; baseId = res.baseId; } if (schema instanceof SchemaObject) { v = schema.validate || compile.call(this, schema.schema, root, void 0, baseId); } else if (schema !== void 0) { v = inlineRef(schema, this._opts.inlineRefs) ? schema : compile.call(this, schema, root, void 0, baseId); } return v; } function resolveSchema(root, ref) { var p = URI.parse(ref), refPath = _getFullPath(p), baseId = getFullPath(this._getId(root.schema)); if (Object.keys(root.schema).length === 0 || refPath !== baseId) { var id = normalizeId(refPath); var refVal = this._refs[id]; if (typeof refVal == "string") { return resolveRecursive.call(this, root, refVal, p); } else if (refVal instanceof SchemaObject) { if (!refVal.validate) this._compile(refVal); root = refVal; } else { refVal = this._schemas[id]; if (refVal instanceof SchemaObject) { if (!refVal.validate) this._compile(refVal); if (id == normalizeId(ref)) return { schema: refVal, root, baseId }; root = refVal; } else { return; } } if (!root.schema) return; baseId = getFullPath(this._getId(root.schema)); } return getJsonPointer.call(this, p, baseId, root.schema, root); } function resolveRecursive(root, ref, parsedRef) { var res = resolveSchema.call(this, root, ref); if (res) { var schema = res.schema; var baseId = res.baseId; root = res.root; var id = this._getId(schema); if (id) baseId = resolveUrl(baseId, id); return getJsonPointer.call(this, parsedRef, baseId, schema, root); } } var PREVENT_SCOPE_CHANGE = util.toHash(["properties", "patternProperties", "enum", "dependencies", "definitions"]); function getJsonPointer(parsedRef, baseId, schema, root) { parsedRef.fragment = parsedRef.fragment || ""; if (parsedRef.fragment.slice(0, 1) != "/") return; var parts = parsedRef.fragment.split("/"); for (var i = 1; i < parts.length; i++) { var part = parts[i]; if (part) { part = util.unescapeFragment(part); schema = schema[part]; if (schema === void 0) break; var id; if (!PREVENT_SCOPE_CHANGE[part]) { id = this._getId(schema); if (id) baseId = resolveUrl(baseId, id); if (schema.$ref) { var $ref = resolveUrl(baseId, schema.$ref); var res = resolveSchema.call(this, root, $ref); if (res) { schema = res.schema; root = res.root; baseId = res.baseId; } } } } } if (schema !== void 0 && schema !== root.schema) return { schema, root, baseId }; } var SIMPLE_INLINED = util.toHash([ "type", "format", "pattern", "maxLength", "minLength", "maxProperties", "minProperties", "maxItems", "minItems", "maximum", "minimum", "uniqueItems", "multipleOf", "required", "enum" ]); function inlineRef(schema, limit) { if (limit === false) return false; if (limit === void 0 || limit === true) return checkNoRef(schema); else if (limit) return countKeys(schema) <= limit; } function checkNoRef(schema) { var item; if (Array.isArray(schema)) { for (var i = 0; i < schema.length; i++) { item = schema[i]; if (typeof item == "object" && !checkNoRef(item)) return false; } } else { for (var key in schema) { if (key == "$ref") return false; item = schema[key]; if (typeof item == "object" && !checkNoRef(item)) return false; } } return true; } function countKeys(schema) { var count = 0, item; if (Array.isArray(schema)) { for (var i = 0; i < schema.length; i++) { item = schema[i]; if (typeof item == "object") count += countKeys(item); if (count == Infinity) return Infinity; } } else { for (var key in schema) { if (key == "$ref") return Infinity; if (SIMPLE_INLINED[key]) { count++; } else { item = schema[key]; if (typeof item == "object") count += countKeys(item) + 1; if (count == Infinity) return Infinity; } } } return count; } function getFullPath(id, normalize) { if (normalize !== false) id = normalizeId(id); var p = URI.parse(id); return _getFullPath(p); } function _getFullPath(p) { return URI.serialize(p).split("#")[0] + "#"; } var TRAILING_SLASH_HASH = /#\/?$/; function normalizeId(id) { return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; } function resolveUrl(baseId, id) { id = normalizeId(id); return URI.resolve(baseId, id); } function resolveIds(schema) { var schemaId = normalizeId(this._getId(schema)); var baseIds = { "": schemaId }; var fullPaths = { "": getFullPath(schemaId, false) }; var localRefs = {}; var self2 = this; traverse(schema, { allKeys: true }, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) { if (jsonPtr === "") return; var id = self2._getId(sch); var baseId = baseIds[parentJsonPtr]; var fullPath = fullPaths[parentJsonPtr] + "/" + parentKeyword; if (keyIndex !== void 0) fullPath += "/" + (typeof keyIndex == "number" ? keyIndex : util.escapeFragment(keyIndex)); if (typeof id == "string") { id = baseId = normalizeId(baseId ? URI.resolve(baseId, id) : id); var refVal = self2._refs[id]; if (typeof refVal == "string") refVal = self2._refs[refVal]; if (refVal && refVal.schema) { if (!equal(sch, refVal.schema)) throw new Error('id "' + id + '" resolves to more than one schema'); } else if (id != normalizeId(fullPath)) { if (id[0] == "#") { if (localRefs[id] && !equal(sch, localRefs[id])) throw new Error('id "' + id + '" resolves to more than one schema'); localRefs[id] = sch; } else { self2._refs[id] = fullPath; } } } baseIds[jsonPtr] = baseId; fullPaths[jsonPtr] = fullPath; }); return localRefs; } } }); // node_modules/ajv/lib/compile/error_classes.js var require_error_classes = __commonJS({ "node_modules/ajv/lib/compile/error_classes.js"(exports, module2) { "use strict"; var resolve = require_resolve(); module2.exports = { Validation: errorSubclass(ValidationError), MissingRef: errorSubclass(MissingRefError) }; function ValidationError(errors) { this.message = "validation failed"; this.errors = errors; this.ajv = this.validation = true; } MissingRefError.message = function(baseId, ref) { return "can't resolve reference " + ref + " from id " + baseId; }; function MissingRefError(baseId, ref, message) { this.message = message || MissingRefError.message(baseId, ref); this.missingRef = resolve.url(baseId, ref); this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef)); } function errorSubclass(Subclass) { Subclass.prototype = Object.create(Error.prototype); Subclass.prototype.constructor = Subclass; return Subclass; } } }); // node_modules/fast-json-stable-stringify/index.js var require_fast_json_stable_stringify = __commonJS({ "node_modules/fast-json-stable-stringify/index.js"(exports, module2) { "use strict"; module2.exports = function(data, opts) { if (!opts) opts = {}; if (typeof opts === "function") opts = { cmp: opts }; var cycles = typeof opts.cycles === "boolean" ? opts.cycles : false; var cmp = opts.cmp && function(f) { return function(node) { return function(a, b) { var aobj = { key: a, value: node[a] }; var bobj = { key: b, value: node[b] }; return f(aobj, bobj); }; }; }(opts.cmp); var seen = []; return function stringify(node) { if (node && node.toJSON && typeof node.toJSON === "function") { node = node.toJSON(); } if (node === void 0) return; if (typeof node == "number") return isFinite(node) ? "" + node : "null"; if (typeof node !== "object") return JSON.stringify(node); var i, out; if (Array.isArray(node)) { out = "["; for (i = 0; i < node.length; i++) { if (i) out += ","; out += stringify(node[i]) || "null"; } return out + "]"; } if (node === null) return "null"; if (seen.indexOf(node) !== -1) { if (cycles) return JSON.stringify("__cycle__"); throw new TypeError("Converting circular structure to JSON"); } var seenIndex = seen.push(node) - 1; var keys = Object.keys(node).sort(cmp && cmp(node)); out = ""; for (i = 0; i < keys.length; i++) { var key = keys[i]; var value = stringify(node[key]); if (!value) continue; if (out) out += ","; out += JSON.stringify(key) + ":" + value; } seen.splice(seenIndex, 1); return "{" + out + "}"; }(data); }; } }); // node_modules/ajv/lib/dotjs/validate.js var require_validate2 = __commonJS({ "node_modules/ajv/lib/dotjs/validate.js"(exports, module2) { "use strict"; module2.exports = function generate_validate(it, $keyword, $ruleType) { var out = ""; var $async = it.schema.$async === true, $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, "$ref"), $id = it.self._getId(it.schema); if (it.opts.strictKeywords) { var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); if ($unknownKwd) { var $keywordsMsg = "unknown keyword: " + $unknownKwd; if (it.opts.strictKeywords === "log") it.logger.warn($keywordsMsg); else throw new Error($keywordsMsg); } } if (it.isTop) { out += " var validate = "; if ($async) { it.async = true; out += "async "; } out += "function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; "; if ($id && (it.opts.sourceCode || it.opts.processCode)) { out += " " + ("/*# sourceURL=" + $id + " */") + " "; } } if (typeof it.schema == "boolean" || !($refKeywords || it.schema.$ref)) { var $keyword = "false schema"; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $errorKeyword; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; if (it.schema === false) { if (it.isTop) { $breakOnError = true; } else { out += " var " + $valid + " = false; "; } var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "false schema") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} "; if (it.opts.messages !== false) { out += " , message: 'boolean schema is false' "; } if (it.opts.verbose) { out += " , schema: false , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } } else { if (it.isTop) { if ($async) { out += " return data; "; } else { out += " validate.errors = null; return true; "; } } else { out += " var " + $valid + " = true; "; } } if (it.isTop) { out += " }; return validate; "; } return out; } if (it.isTop) { var $top = it.isTop, $lvl = it.level = 0, $dataLvl = it.dataLevel = 0, $data = "data"; it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); it.baseId = it.baseId || it.rootId; delete it.isTop; it.dataPathArr = [""]; if (it.schema.default !== void 0 && it.opts.useDefaults && it.opts.strictDefaults) { var $defaultMsg = "default is ignored in the schema root"; if (it.opts.strictDefaults === "log") it.logger.warn($defaultMsg); else throw new Error($defaultMsg); } out += " var vErrors = null; "; out += " var errors = 0; "; out += " if (rootData === undefined) rootData = data; "; } else { var $lvl = it.level, $dataLvl = it.dataLevel, $data = "data" + ($dataLvl || ""); if ($id) it.baseId = it.resolve.url(it.baseId, $id); if ($async && !it.async) throw new Error("async schema in sync schema"); out += " var errs_" + $lvl + " = errors;"; } var $valid = "valid" + $lvl, $breakOnError = !it.opts.allErrors, $closingBraces1 = "", $closingBraces2 = ""; var $errorKeyword; var $typeSchema = it.schema.type, $typeIsArray = Array.isArray($typeSchema); if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { if ($typeIsArray) { if ($typeSchema.indexOf("null") == -1) $typeSchema = $typeSchema.concat("null"); } else if ($typeSchema != "null") { $typeSchema = [$typeSchema, "null"]; $typeIsArray = true; } } if ($typeIsArray && $typeSchema.length == 1) { $typeSchema = $typeSchema[0]; $typeIsArray = false; } if (it.schema.$ref && $refKeywords) { if (it.opts.extendRefs == "fail") { throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); } else if (it.opts.extendRefs !== true) { $refKeywords = false; it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); } } if (it.schema.$comment && it.opts.$comment) { out += " " + it.RULES.all.$comment.code(it, "$comment"); } if ($typeSchema) { if (it.opts.coerceTypes) { var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); } var $rulesGroup = it.RULES.types[$typeSchema]; if ($coerceToTypes || $typeIsArray || $rulesGroup === true || $rulesGroup && !$shouldUseGroup($rulesGroup)) { var $schemaPath = it.schemaPath + ".type", $errSchemaPath = it.errSchemaPath + "/type"; var $schemaPath = it.schemaPath + ".type", $errSchemaPath = it.errSchemaPath + "/type", $method = $typeIsArray ? "checkDataTypes" : "checkDataType"; out += " if (" + it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) + ") { "; if ($coerceToTypes) { var $dataType = "dataType" + $lvl, $coerced = "coerced" + $lvl; out += " var " + $dataType + " = typeof " + $data + "; var " + $coerced + " = undefined; "; if (it.opts.coerceTypes == "array") { out += " if (" + $dataType + " == 'object' && Array.isArray(" + $data + ") && " + $data + ".length == 1) { " + $data + " = " + $data + "[0]; " + $dataType + " = typeof " + $data + "; if (" + it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers) + ") " + $coerced + " = " + $data + "; } "; } out += " if (" + $coerced + " !== undefined) ; "; var arr1 = $coerceToTypes; if (arr1) { var $type, $i = -1, l1 = arr1.length - 1; while ($i < l1) { $type = arr1[$i += 1]; if ($type == "string") { out += " else if (" + $dataType + " == 'number' || " + $dataType + " == 'boolean') " + $coerced + " = '' + " + $data + "; else if (" + $data + " === null) " + $coerced + " = ''; "; } else if ($type == "number" || $type == "integer") { out += " else if (" + $dataType + " == 'boolean' || " + $data + " === null || (" + $dataType + " == 'string' && " + $data + " && " + $data + " == +" + $data + " "; if ($type == "integer") { out += " && !(" + $data + " % 1)"; } out += ")) " + $coerced + " = +" + $data + "; "; } else if ($type == "boolean") { out += " else if (" + $data + " === 'false' || " + $data + " === 0 || " + $data + " === null) " + $coerced + " = false; else if (" + $data + " === 'true' || " + $data + " === 1) " + $coerced + " = true; "; } else if ($type == "null") { out += " else if (" + $data + " === '' || " + $data + " === 0 || " + $data + " === false) " + $coerced + " = null; "; } else if (it.opts.coerceTypes == "array" && $type == "array") { out += " else if (" + $dataType + " == 'string' || " + $dataType + " == 'number' || " + $dataType + " == 'boolean' || " + $data + " == null) " + $coerced + " = [" + $data + "]; "; } } } out += " else { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "type") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { type: '"; if ($typeIsArray) { out += "" + $typeSchema.join(","); } else { out += "" + $typeSchema; } out += "' } "; if (it.opts.messages !== false) { out += " , message: 'should be "; if ($typeIsArray) { out += "" + $typeSchema.join(","); } else { out += "" + $typeSchema; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } if (" + $coerced + " !== undefined) { "; var $parentData = $dataLvl ? "data" + ($dataLvl - 1 || "") : "parentData", $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : "parentDataProperty"; out += " " + $data + " = " + $coerced + "; "; if (!$dataLvl) { out += "if (" + $parentData + " !== undefined)"; } out += " " + $parentData + "[" + $parentDataProperty + "] = " + $coerced + "; } "; } else { var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "type") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { type: '"; if ($typeIsArray) { out += "" + $typeSchema.join(","); } else { out += "" + $typeSchema; } out += "' } "; if (it.opts.messages !== false) { out += " , message: 'should be "; if ($typeIsArray) { out += "" + $typeSchema.join(","); } else { out += "" + $typeSchema; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } } out += " } "; } } if (it.schema.$ref && !$refKeywords) { out += " " + it.RULES.all.$ref.code(it, "$ref") + " "; if ($breakOnError) { out += " } if (errors === "; if ($top) { out += "0"; } else { out += "errs_" + $lvl; } out += ") { "; $closingBraces2 += "}"; } } else { var arr2 = it.RULES; if (arr2) { var $rulesGroup, i2 = -1, l2 = arr2.length - 1; while (i2 < l2) { $rulesGroup = arr2[i2 += 1]; if ($shouldUseGroup($rulesGroup)) { if ($rulesGroup.type) { out += " if (" + it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers) + ") { "; } if (it.opts.useDefaults) { if ($rulesGroup.type == "object" && it.schema.properties) { var $schema = it.schema.properties, $schemaKeys = Object.keys($schema); var arr3 = $schemaKeys; if (arr3) { var $propertyKey, i3 = -1, l3 = arr3.length - 1; while (i3 < l3) { $propertyKey = arr3[i3 += 1]; var $sch = $schema[$propertyKey]; if ($sch.default !== void 0) { var $passData = $data + it.util.getProperty($propertyKey); if (it.compositeRule) { if (it.opts.strictDefaults) { var $defaultMsg = "default is ignored for: " + $passData; if (it.opts.strictDefaults === "log") it.logger.warn($defaultMsg); else throw new Error($defaultMsg); } } else { out += " if (" + $passData + " === undefined "; if (it.opts.useDefaults == "empty") { out += " || " + $passData + " === null || " + $passData + " === '' "; } out += " ) " + $passData + " = "; if (it.opts.useDefaults == "shared") { out += " " + it.useDefault($sch.default) + " "; } else { out += " " + JSON.stringify($sch.default) + " "; } out += "; "; } } } } } else if ($rulesGroup.type == "array" && Array.isArray(it.schema.items)) { var arr4 = it.schema.items; if (arr4) { var $sch, $i = -1, l4 = arr4.length - 1; while ($i < l4) { $sch = arr4[$i += 1]; if ($sch.default !== void 0) { var $passData = $data + "[" + $i + "]"; if (it.compositeRule) { if (it.opts.strictDefaults) { var $defaultMsg = "default is ignored for: " + $passData; if (it.opts.strictDefaults === "log") it.logger.warn($defaultMsg); else throw new Error($defaultMsg); } } else { out += " if (" + $passData + " === undefined "; if (it.opts.useDefaults == "empty") { out += " || " + $passData + " === null || " + $passData + " === '' "; } out += " ) " + $passData + " = "; if (it.opts.useDefaults == "shared") { out += " " + it.useDefault($sch.default) + " "; } else { out += " " + JSON.stringify($sch.default) + " "; } out += "; "; } } } } } } var arr5 = $rulesGroup.rules; if (arr5) { var $rule, i5 = -1, l5 = arr5.length - 1; while (i5 < l5) { $rule = arr5[i5 += 1]; if ($shouldUseRule($rule)) { var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); if ($code) { out += " " + $code + " "; if ($breakOnError) { $closingBraces1 += "}"; } } } } } if ($breakOnError) { out += " " + $closingBraces1 + " "; $closingBraces1 = ""; } if ($rulesGroup.type) { out += " } "; if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { out += " else { "; var $schemaPath = it.schemaPath + ".type", $errSchemaPath = it.errSchemaPath + "/type"; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "type") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { type: '"; if ($typeIsArray) { out += "" + $typeSchema.join(","); } else { out += "" + $typeSchema; } out += "' } "; if (it.opts.messages !== false) { out += " , message: 'should be "; if ($typeIsArray) { out += "" + $typeSchema.join(","); } else { out += "" + $typeSchema; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } "; } } if ($breakOnError) { out += " if (errors === "; if ($top) { out += "0"; } else { out += "errs_" + $lvl; } out += ") { "; $closingBraces2 += "}"; } } } } } if ($breakOnError) { out += " " + $closingBraces2 + " "; } if ($top) { if ($async) { out += " if (errors === 0) return data; "; out += " else throw new ValidationError(vErrors); "; } else { out += " validate.errors = vErrors; "; out += " return errors === 0; "; } out += " }; return validate;"; } else { out += " var " + $valid + " = errors === errs_" + $lvl + ";"; } function $shouldUseGroup($rulesGroup2) { var rules = $rulesGroup2.rules; for (var i = 0; i < rules.length; i++) if ($shouldUseRule(rules[i])) return true; } function $shouldUseRule($rule2) { return it.schema[$rule2.keyword] !== void 0 || $rule2.implements && $ruleImplementsSomeKeyword($rule2); } function $ruleImplementsSomeKeyword($rule2) { var impl = $rule2.implements; for (var i = 0; i < impl.length; i++) if (it.schema[impl[i]] !== void 0) return true; } return out; }; } }); // node_modules/ajv/lib/compile/index.js var require_compile = __commonJS({ "node_modules/ajv/lib/compile/index.js"(exports, module2) { "use strict"; var resolve = require_resolve(); var util = require_util3(); var errorClasses = require_error_classes(); var stableStringify = require_fast_json_stable_stringify(); var validateGenerator = require_validate2(); var ucs2length = util.ucs2length; var equal = require_fast_deep_equal(); var ValidationError = errorClasses.Validation; module2.exports = compile; function compile(schema, root, localRefs, baseId) { var self2 = this, opts = this._opts, refVal = [void 0], refs = {}, patterns = [], patternsHash = {}, defaults = [], defaultsHash = {}, customRules = []; root = root || { schema, refVal, refs }; var c = checkCompiling.call(this, schema, root, baseId); var compilation = this._compilations[c.index]; if (c.compiling) return compilation.callValidate = callValidate; var formats = this._formats; var RULES = this.RULES; try { var v = localCompile(schema, root, localRefs, baseId); compilation.validate = v; var cv = compilation.callValidate; if (cv) { cv.schema = v.schema; cv.errors = null; cv.refs = v.refs; cv.refVal = v.refVal; cv.root = v.root; cv.$async = v.$async; if (opts.sourceCode) cv.source = v.source; } return v; } finally { endCompiling.call(this, schema, root, baseId); } function callValidate() { var validate = compilation.validate; var result = validate.apply(this, arguments); callValidate.errors = validate.errors; return result; } function localCompile(_schema, _root, localRefs2, baseId2) { var isRoot = !_root || _root && _root.schema == _schema; if (_root.schema != root.schema) return compile.call(self2, _schema, _root, localRefs2, baseId2); var $async = _schema.$async === true; var sourceCode = validateGenerator({ isTop: true, schema: _schema, isRoot, baseId: baseId2, root: _root, schemaPath: "", errSchemaPath: "#", errorPath: '""', MissingRefError: errorClasses.MissingRef, RULES, validate: validateGenerator, util, resolve, resolveRef, usePattern, useDefault, useCustomRule, opts, formats, logger: self2.logger, self: self2 }); sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + sourceCode; if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema); var validate; try { var makeValidate = new Function("self", "RULES", "formats", "root", "refVal", "defaults", "customRules", "equal", "ucs2length", "ValidationError", sourceCode); validate = makeValidate(self2, RULES, formats, root, refVal, defaults, customRules, equal, ucs2length, ValidationError); refVal[0] = validate; } catch (e) { self2.logger.error("Error compiling schema, function code:", sourceCode); throw e; } validate.schema = _schema; validate.errors = null; validate.refs = refs; validate.refVal = refVal; validate.root = isRoot ? validate : _root; if ($async) validate.$async = true; if (opts.sourceCode === true) { validate.source = { code: sourceCode, patterns, defaults }; } return validate; } function resolveRef(baseId2, ref, isRoot) { ref = resolve.url(baseId2, ref); var refIndex = refs[ref]; var _refVal, refCode; if (refIndex !== void 0) { _refVal = refVal[refIndex]; refCode = "refVal[" + refIndex + "]"; return resolvedRef(_refVal, refCode); } if (!isRoot && root.refs) { var rootRefId = root.refs[ref]; if (rootRefId !== void 0) { _refVal = root.refVal[rootRefId]; refCode = addLocalRef(ref, _refVal); return resolvedRef(_refVal, refCode); } } refCode = addLocalRef(ref); var v2 = resolve.call(self2, localCompile, root, ref); if (v2 === void 0) { var localSchema = localRefs && localRefs[ref]; if (localSchema) { v2 = resolve.inlineRef(localSchema, opts.inlineRefs) ? localSchema : compile.call(self2, localSchema, root, localRefs, baseId2); } } if (v2 === void 0) { removeLocalRef(ref); } else { replaceLocalRef(ref, v2); return resolvedRef(v2, refCode); } } function addLocalRef(ref, v2) { var refId = refVal.length; refVal[refId] = v2; refs[ref] = refId; return "refVal" + refId; } function removeLocalRef(ref) { delete refs[ref]; } function replaceLocalRef(ref, v2) { var refId = refs[ref]; refVal[refId] = v2; } function resolvedRef(refVal2, code) { return typeof refVal2 == "object" || typeof refVal2 == "boolean" ? { code, schema: refVal2, inline: true } : { code, $async: refVal2 && !!refVal2.$async }; } function usePattern(regexStr) { var index = patternsHash[regexStr]; if (index === void 0) { index = patternsHash[regexStr] = patterns.length; patterns[index] = regexStr; } return "pattern" + index; } function useDefault(value) { switch (typeof value) { case "boolean": case "number": return "" + value; case "string": return util.toQuotedString(value); case "object": if (value === null) return "null"; var valueStr = stableStringify(value); var index = defaultsHash[valueStr]; if (index === void 0) { index = defaultsHash[valueStr] = defaults.length; defaults[index] = value; } return "default" + index; } } function useCustomRule(rule, schema2, parentSchema, it) { if (self2._opts.validateSchema !== false) { var deps = rule.definition.dependencies; if (deps && !deps.every(function(keyword) { return Object.prototype.hasOwnProperty.call(parentSchema, keyword); })) throw new Error("parent schema must have all required keywords: " + deps.join(",")); var validateSchema = rule.definition.validateSchema; if (validateSchema) { var valid = validateSchema(schema2); if (!valid) { var message = "keyword schema is invalid: " + self2.errorsText(validateSchema.errors); if (self2._opts.validateSchema == "log") self2.logger.error(message); else throw new Error(message); } } } var compile2 = rule.definition.compile, inline = rule.definition.inline, macro = rule.definition.macro; var validate; if (compile2) { validate = compile2.call(self2, schema2, parentSchema, it); } else if (macro) { validate = macro.call(self2, schema2, parentSchema, it); if (opts.validateSchema !== false) self2.validateSchema(validate, true); } else if (inline) { validate = inline.call(self2, it, rule.keyword, schema2, parentSchema); } else { validate = rule.definition.validate; if (!validate) return; } if (validate === void 0) throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); var index = customRules.length; customRules[index] = validate; return { code: "customRule" + index, validate }; } } function checkCompiling(schema, root, baseId) { var index = compIndex.call(this, schema, root, baseId); if (index >= 0) return { index, compiling: true }; index = this._compilations.length; this._compilations[index] = { schema, root, baseId }; return { index, compiling: false }; } function endCompiling(schema, root, baseId) { var i = compIndex.call(this, schema, root, baseId); if (i >= 0) this._compilations.splice(i, 1); } function compIndex(schema, root, baseId) { for (var i = 0; i < this._compilations.length; i++) { var c = this._compilations[i]; if (c.schema == schema && c.root == root && c.baseId == baseId) return i; } return -1; } function patternCode(i, patterns) { return "var pattern" + i + " = new RegExp(" + util.toQuotedString(patterns[i]) + ");"; } function defaultCode(i) { return "var default" + i + " = defaults[" + i + "];"; } function refValCode(i, refVal) { return refVal[i] === void 0 ? "" : "var refVal" + i + " = refVal[" + i + "];"; } function customRuleCode(i) { return "var customRule" + i + " = customRules[" + i + "];"; } function vars(arr, statement) { if (!arr.length) return ""; var code = ""; for (var i = 0; i < arr.length; i++) code += statement(i, arr); return code; } } }); // node_modules/ajv/lib/cache.js var require_cache = __commonJS({ "node_modules/ajv/lib/cache.js"(exports, module2) { "use strict"; var Cache = module2.exports = function Cache2() { this._cache = {}; }; Cache.prototype.put = function Cache_put(key, value) { this._cache[key] = value; }; Cache.prototype.get = function Cache_get(key) { return this._cache[key]; }; Cache.prototype.del = function Cache_del(key) { delete this._cache[key]; }; Cache.prototype.clear = function Cache_clear() { this._cache = {}; }; } }); // node_modules/ajv/lib/compile/formats.js var require_formats2 = __commonJS({ "node_modules/ajv/lib/compile/formats.js"(exports, module2) { "use strict"; var util = require_util3(); var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i; var HOSTNAME = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i; var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; var URIREF = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; var URITEMPLATE = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; module2.exports = formats; function formats(mode) { mode = mode == "full" ? "full" : "fast"; return util.copy(formats[mode]); } formats.fast = { date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, "date-time": /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, "uri-template": URITEMPLATE, url: URL, email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, hostname: HOSTNAME, ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, regex, uuid: UUID, "json-pointer": JSON_POINTER, "json-pointer-uri-fragment": JSON_POINTER_URI_FRAGMENT, "relative-json-pointer": RELATIVE_JSON_POINTER }; formats.full = { date, time, "date-time": date_time, uri, "uri-reference": URIREF, "uri-template": URITEMPLATE, url: URL, email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, hostname: HOSTNAME, ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, regex, uuid: UUID, "json-pointer": JSON_POINTER, "json-pointer-uri-fragment": JSON_POINTER_URI_FRAGMENT, "relative-json-pointer": RELATIVE_JSON_POINTER }; function isLeapYear(year) { return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); } function date(str) { var matches = str.match(DATE); if (!matches) return false; var year = +matches[1]; var month = +matches[2]; var day = +matches[3]; return month >= 1 && month <= 12 && day >= 1 && day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); } function time(str, full) { var matches = str.match(TIME); if (!matches) return false; var hour = matches[1]; var minute = matches[2]; var second = matches[3]; var timeZone = matches[5]; return (hour <= 23 && minute <= 59 && second <= 59 || hour == 23 && minute == 59 && second == 60) && (!full || timeZone); } var DATE_TIME_SEPARATOR = /t|\s/i; function date_time(str) { var dateTime = str.split(DATE_TIME_SEPARATOR); return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); } var NOT_URI_FRAGMENT = /\/|:/; function uri(str) { return NOT_URI_FRAGMENT.test(str) && URI.test(str); } var Z_ANCHOR = /[^\\]\\Z/; function regex(str) { if (Z_ANCHOR.test(str)) return false; try { new RegExp(str); return true; } catch (e) { return false; } } } }); // node_modules/ajv/lib/dotjs/ref.js var require_ref = __commonJS({ "node_modules/ajv/lib/dotjs/ref.js"(exports, module2) { "use strict"; module2.exports = function generate_ref(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $async, $refCode; if ($schema == "#" || $schema == "#/") { if (it.isRoot) { $async = it.async; $refCode = "validate"; } else { $async = it.root.schema.$async === true; $refCode = "root.refVal[0]"; } } else { var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot); if ($refVal === void 0) { var $message = it.MissingRefError.message(it.baseId, $schema); if (it.opts.missingRefs == "fail") { it.logger.error($message); var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '$ref' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { ref: '" + it.util.escapeQuotes($schema) + "' } "; if (it.opts.messages !== false) { out += " , message: 'can\\'t resolve reference " + it.util.escapeQuotes($schema) + "' "; } if (it.opts.verbose) { out += " , schema: " + it.util.toQuotedString($schema) + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } if ($breakOnError) { out += " if (false) { "; } } else if (it.opts.missingRefs == "ignore") { it.logger.warn($message); if ($breakOnError) { out += " if (true) { "; } } else { throw new it.MissingRefError(it.baseId, $schema, $message); } } else if ($refVal.inline) { var $it = it.util.copy(it); $it.level++; var $nextValid = "valid" + $it.level; $it.schema = $refVal.schema; $it.schemaPath = ""; $it.errSchemaPath = $schema; var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code); out += " " + $code + " "; if ($breakOnError) { out += " if (" + $nextValid + ") { "; } } else { $async = $refVal.$async === true || it.async && $refVal.$async !== false; $refCode = $refVal.code; } } if ($refCode) { var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.opts.passContext) { out += " " + $refCode + ".call(this, "; } else { out += " " + $refCode + "( "; } out += " " + $data + ", (dataPath || '')"; if (it.errorPath != '""') { out += " + " + it.errorPath; } var $parentData = $dataLvl ? "data" + ($dataLvl - 1 || "") : "parentData", $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : "parentDataProperty"; out += " , " + $parentData + " , " + $parentDataProperty + ", rootData) "; var __callValidate = out; out = $$outStack.pop(); if ($async) { if (!it.async) throw new Error("async schema referenced by sync schema"); if ($breakOnError) { out += " var " + $valid + "; "; } out += " try { await " + __callValidate + "; "; if ($breakOnError) { out += " " + $valid + " = true; "; } out += " } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; "; if ($breakOnError) { out += " " + $valid + " = false; "; } out += " } "; if ($breakOnError) { out += " if (" + $valid + ") { "; } } else { out += " if (!" + __callValidate + ") { if (vErrors === null) vErrors = " + $refCode + ".errors; else vErrors = vErrors.concat(" + $refCode + ".errors); errors = vErrors.length; } "; if ($breakOnError) { out += " else { "; } } } return out; }; } }); // node_modules/ajv/lib/dotjs/allOf.js var require_allOf = __commonJS({ "node_modules/ajv/lib/dotjs/allOf.js"(exports, module2) { "use strict"; module2.exports = function generate_allOf(it, $keyword, $ruleType) { var out = " "; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; var $currentBaseId = $it.baseId, $allSchemasEmpty = true; var arr1 = $schema; if (arr1) { var $sch, $i = -1, l1 = arr1.length - 1; while ($i < l1) { $sch = arr1[$i += 1]; if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) { $allSchemasEmpty = false; $it.schema = $sch; $it.schemaPath = $schemaPath + "[" + $i + "]"; $it.errSchemaPath = $errSchemaPath + "/" + $i; out += " " + it.validate($it) + " "; $it.baseId = $currentBaseId; if ($breakOnError) { out += " if (" + $nextValid + ") { "; $closingBraces += "}"; } } } } if ($breakOnError) { if ($allSchemasEmpty) { out += " if (true) { "; } else { out += " " + $closingBraces.slice(0, -1) + " "; } } return out; }; } }); // node_modules/ajv/lib/dotjs/anyOf.js var require_anyOf = __commonJS({ "node_modules/ajv/lib/dotjs/anyOf.js"(exports, module2) { "use strict"; module2.exports = function generate_anyOf(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $errs = "errs__" + $lvl; var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; var $noEmptySchema = $schema.every(function($sch2) { return it.opts.strictKeywords ? typeof $sch2 == "object" && Object.keys($sch2).length > 0 || $sch2 === false : it.util.schemaHasRules($sch2, it.RULES.all); }); if ($noEmptySchema) { var $currentBaseId = $it.baseId; out += " var " + $errs + " = errors; var " + $valid + " = false; "; var $wasComposite = it.compositeRule; it.compositeRule = $it.compositeRule = true; var arr1 = $schema; if (arr1) { var $sch, $i = -1, l1 = arr1.length - 1; while ($i < l1) { $sch = arr1[$i += 1]; $it.schema = $sch; $it.schemaPath = $schemaPath + "[" + $i + "]"; $it.errSchemaPath = $errSchemaPath + "/" + $i; out += " " + it.validate($it) + " "; $it.baseId = $currentBaseId; out += " " + $valid + " = " + $valid + " || " + $nextValid + "; if (!" + $valid + ") { "; $closingBraces += "}"; } } it.compositeRule = $it.compositeRule = $wasComposite; out += " " + $closingBraces + " if (!" + $valid + ") { var err = "; if (it.createErrors !== false) { out += " { keyword: 'anyOf' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} "; if (it.opts.messages !== false) { out += " , message: 'should match some schema in anyOf' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError(vErrors); "; } else { out += " validate.errors = vErrors; return false; "; } } out += " } else { errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; } "; if (it.opts.allErrors) { out += " } "; } } else { if ($breakOnError) { out += " if (true) { "; } } return out; }; } }); // node_modules/ajv/lib/dotjs/comment.js var require_comment = __commonJS({ "node_modules/ajv/lib/dotjs/comment.js"(exports, module2) { "use strict"; module2.exports = function generate_comment(it, $keyword, $ruleType) { var out = " "; var $schema = it.schema[$keyword]; var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $comment = it.util.toQuotedString($schema); if (it.opts.$comment === true) { out += " console.log(" + $comment + ");"; } else if (typeof it.opts.$comment == "function") { out += " self._opts.$comment(" + $comment + ", " + it.util.toQuotedString($errSchemaPath) + ", validate.root.schema);"; } return out; }; } }); // node_modules/ajv/lib/dotjs/const.js var require_const = __commonJS({ "node_modules/ajv/lib/dotjs/const.js"(exports, module2) { "use strict"; module2.exports = function generate_const(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } if (!$isData) { out += " var schema" + $lvl + " = validate.schema" + $schemaPath + ";"; } out += "var " + $valid + " = equal(" + $data + ", schema" + $lvl + "); if (!" + $valid + ") { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'const' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { allowedValue: schema" + $lvl + " } "; if (it.opts.messages !== false) { out += " , message: 'should be equal to constant' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " }"; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/contains.js var require_contains = __commonJS({ "node_modules/ajv/lib/dotjs/contains.js"(exports, module2) { "use strict"; module2.exports = function generate_contains(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $errs = "errs__" + $lvl; var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; var $idx = "i" + $lvl, $dataNxt = $it.dataLevel = it.dataLevel + 1, $nextData = "data" + $dataNxt, $currentBaseId = it.baseId, $nonEmptySchema = it.opts.strictKeywords ? typeof $schema == "object" && Object.keys($schema).length > 0 || $schema === false : it.util.schemaHasRules($schema, it.RULES.all); out += "var " + $errs + " = errors;var " + $valid + ";"; if ($nonEmptySchema) { var $wasComposite = it.compositeRule; it.compositeRule = $it.compositeRule = true; $it.schema = $schema; $it.schemaPath = $schemaPath; $it.errSchemaPath = $errSchemaPath; out += " var " + $nextValid + " = false; for (var " + $idx + " = 0; " + $idx + " < " + $data + ".length; " + $idx + "++) { "; $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); var $passData = $data + "[" + $idx + "]"; $it.dataPathArr[$dataNxt] = $idx; var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { out += " " + it.util.varReplace($code, $nextData, $passData) + " "; } else { out += " var " + $nextData + " = " + $passData + "; " + $code + " "; } out += " if (" + $nextValid + ") break; } "; it.compositeRule = $it.compositeRule = $wasComposite; out += " " + $closingBraces + " if (!" + $nextValid + ") {"; } else { out += " if (" + $data + ".length == 0) {"; } var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'contains' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} "; if (it.opts.messages !== false) { out += " , message: 'should contain a valid item' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } else { "; if ($nonEmptySchema) { out += " errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; } "; } if (it.opts.allErrors) { out += " } "; } return out; }; } }); // node_modules/ajv/lib/dotjs/dependencies.js var require_dependencies = __commonJS({ "node_modules/ajv/lib/dotjs/dependencies.js"(exports, module2) { "use strict"; module2.exports = function generate_dependencies(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $errs = "errs__" + $lvl; var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; var $schemaDeps = {}, $propertyDeps = {}, $ownProperties = it.opts.ownProperties; for ($property in $schema) { if ($property == "__proto__") continue; var $sch = $schema[$property]; var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps; $deps[$property] = $sch; } out += "var " + $errs + " = errors;"; var $currentErrorPath = it.errorPath; out += "var missing" + $lvl + ";"; for (var $property in $propertyDeps) { $deps = $propertyDeps[$property]; if ($deps.length) { out += " if ( " + $data + it.util.getProperty($property) + " !== undefined "; if ($ownProperties) { out += " && Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($property) + "') "; } if ($breakOnError) { out += " && ( "; var arr1 = $deps; if (arr1) { var $propertyKey, $i = -1, l1 = arr1.length - 1; while ($i < l1) { $propertyKey = arr1[$i += 1]; if ($i) { out += " || "; } var $prop = it.util.getProperty($propertyKey), $useData = $data + $prop; out += " ( ( " + $useData + " === undefined "; if ($ownProperties) { out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') "; } out += ") && (missing" + $lvl + " = " + it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) + ") ) "; } } out += ")) { "; var $propertyPath = "missing" + $lvl, $missingProperty = "' + " + $propertyPath + " + '"; if (it.opts._errorDataPathProperty) { it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + " + " + $propertyPath; } var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'dependencies' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { property: '" + it.util.escapeQuotes($property) + "', missingProperty: '" + $missingProperty + "', depsCount: " + $deps.length + ", deps: '" + it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", ")) + "' } "; if (it.opts.messages !== false) { out += " , message: 'should have "; if ($deps.length == 1) { out += "property " + it.util.escapeQuotes($deps[0]); } else { out += "properties " + it.util.escapeQuotes($deps.join(", ")); } out += " when property " + it.util.escapeQuotes($property) + " is present' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } } else { out += " ) { "; var arr2 = $deps; if (arr2) { var $propertyKey, i2 = -1, l2 = arr2.length - 1; while (i2 < l2) { $propertyKey = arr2[i2 += 1]; var $prop = it.util.getProperty($propertyKey), $missingProperty = it.util.escapeQuotes($propertyKey), $useData = $data + $prop; if (it.opts._errorDataPathProperty) { it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); } out += " if ( " + $useData + " === undefined "; if ($ownProperties) { out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') "; } out += ") { var err = "; if (it.createErrors !== false) { out += " { keyword: 'dependencies' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { property: '" + it.util.escapeQuotes($property) + "', missingProperty: '" + $missingProperty + "', depsCount: " + $deps.length + ", deps: '" + it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", ")) + "' } "; if (it.opts.messages !== false) { out += " , message: 'should have "; if ($deps.length == 1) { out += "property " + it.util.escapeQuotes($deps[0]); } else { out += "properties " + it.util.escapeQuotes($deps.join(", ")); } out += " when property " + it.util.escapeQuotes($property) + " is present' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "; } } } out += " } "; if ($breakOnError) { $closingBraces += "}"; out += " else { "; } } } it.errorPath = $currentErrorPath; var $currentBaseId = $it.baseId; for (var $property in $schemaDeps) { var $sch = $schemaDeps[$property]; if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) { out += " " + $nextValid + " = true; if ( " + $data + it.util.getProperty($property) + " !== undefined "; if ($ownProperties) { out += " && Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($property) + "') "; } out += ") { "; $it.schema = $sch; $it.schemaPath = $schemaPath + it.util.getProperty($property); $it.errSchemaPath = $errSchemaPath + "/" + it.util.escapeFragment($property); out += " " + it.validate($it) + " "; $it.baseId = $currentBaseId; out += " } "; if ($breakOnError) { out += " if (" + $nextValid + ") { "; $closingBraces += "}"; } } } if ($breakOnError) { out += " " + $closingBraces + " if (" + $errs + " == errors) {"; } return out; }; } }); // node_modules/ajv/lib/dotjs/enum.js var require_enum = __commonJS({ "node_modules/ajv/lib/dotjs/enum.js"(exports, module2) { "use strict"; module2.exports = function generate_enum(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } var $i = "i" + $lvl, $vSchema = "schema" + $lvl; if (!$isData) { out += " var " + $vSchema + " = validate.schema" + $schemaPath + ";"; } out += "var " + $valid + ";"; if ($isData) { out += " if (schema" + $lvl + " === undefined) " + $valid + " = true; else if (!Array.isArray(schema" + $lvl + ")) " + $valid + " = false; else {"; } out += "" + $valid + " = false;for (var " + $i + "=0; " + $i + "<" + $vSchema + ".length; " + $i + "++) if (equal(" + $data + ", " + $vSchema + "[" + $i + "])) { " + $valid + " = true; break; }"; if ($isData) { out += " } "; } out += " if (!" + $valid + ") { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'enum' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { allowedValues: schema" + $lvl + " } "; if (it.opts.messages !== false) { out += " , message: 'should be equal to one of the allowed values' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " }"; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/format.js var require_format = __commonJS({ "node_modules/ajv/lib/dotjs/format.js"(exports, module2) { "use strict"; module2.exports = function generate_format(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); if (it.opts.format === false) { if ($breakOnError) { out += " if (true) { "; } return out; } var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } var $unknownFormats = it.opts.unknownFormats, $allowUnknown = Array.isArray($unknownFormats); if ($isData) { var $format = "format" + $lvl, $isObject = "isObject" + $lvl, $formatType = "formatType" + $lvl; out += " var " + $format + " = formats[" + $schemaValue + "]; var " + $isObject + " = typeof " + $format + " == 'object' && !(" + $format + " instanceof RegExp) && " + $format + ".validate; var " + $formatType + " = " + $isObject + " && " + $format + ".type || 'string'; if (" + $isObject + ") { "; if (it.async) { out += " var async" + $lvl + " = " + $format + ".async; "; } out += " " + $format + " = " + $format + ".validate; } if ( "; if ($isData) { out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'string') || "; } out += " ("; if ($unknownFormats != "ignore") { out += " (" + $schemaValue + " && !" + $format + " "; if ($allowUnknown) { out += " && self._opts.unknownFormats.indexOf(" + $schemaValue + ") == -1 "; } out += ") || "; } out += " (" + $format + " && " + $formatType + " == '" + $ruleType + "' && !(typeof " + $format + " == 'function' ? "; if (it.async) { out += " (async" + $lvl + " ? await " + $format + "(" + $data + ") : " + $format + "(" + $data + ")) "; } else { out += " " + $format + "(" + $data + ") "; } out += " : " + $format + ".test(" + $data + "))))) {"; } else { var $format = it.formats[$schema]; if (!$format) { if ($unknownFormats == "ignore") { it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); if ($breakOnError) { out += " if (true) { "; } return out; } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { if ($breakOnError) { out += " if (true) { "; } return out; } else { throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); } } var $isObject = typeof $format == "object" && !($format instanceof RegExp) && $format.validate; var $formatType = $isObject && $format.type || "string"; if ($isObject) { var $async = $format.async === true; $format = $format.validate; } if ($formatType != $ruleType) { if ($breakOnError) { out += " if (true) { "; } return out; } if ($async) { if (!it.async) throw new Error("async format in sync schema"); var $formatRef = "formats" + it.util.getProperty($schema) + ".validate"; out += " if (!(await " + $formatRef + "(" + $data + "))) { "; } else { out += " if (! "; var $formatRef = "formats" + it.util.getProperty($schema); if ($isObject) $formatRef += ".validate"; if (typeof $format == "function") { out += " " + $formatRef + "(" + $data + ") "; } else { out += " " + $formatRef + ".test(" + $data + ") "; } out += ") { "; } } var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'format' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { format: "; if ($isData) { out += "" + $schemaValue; } else { out += "" + it.util.toQuotedString($schema); } out += " } "; if (it.opts.messages !== false) { out += ` , message: 'should match format "`; if ($isData) { out += "' + " + $schemaValue + " + '"; } else { out += "" + it.util.escapeQuotes($schema); } out += `"' `; } if (it.opts.verbose) { out += " , schema: "; if ($isData) { out += "validate.schema" + $schemaPath; } else { out += "" + it.util.toQuotedString($schema); } out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } "; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/if.js var require_if = __commonJS({ "node_modules/ajv/lib/dotjs/if.js"(exports, module2) { "use strict"; module2.exports = function generate_if(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $errs = "errs__" + $lvl; var $it = it.util.copy(it); $it.level++; var $nextValid = "valid" + $it.level; var $thenSch = it.schema["then"], $elseSch = it.schema["else"], $thenPresent = $thenSch !== void 0 && (it.opts.strictKeywords ? typeof $thenSch == "object" && Object.keys($thenSch).length > 0 || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), $elsePresent = $elseSch !== void 0 && (it.opts.strictKeywords ? typeof $elseSch == "object" && Object.keys($elseSch).length > 0 || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), $currentBaseId = $it.baseId; if ($thenPresent || $elsePresent) { var $ifClause; $it.createErrors = false; $it.schema = $schema; $it.schemaPath = $schemaPath; $it.errSchemaPath = $errSchemaPath; out += " var " + $errs + " = errors; var " + $valid + " = true; "; var $wasComposite = it.compositeRule; it.compositeRule = $it.compositeRule = true; out += " " + it.validate($it) + " "; $it.baseId = $currentBaseId; $it.createErrors = true; out += " errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; } "; it.compositeRule = $it.compositeRule = $wasComposite; if ($thenPresent) { out += " if (" + $nextValid + ") { "; $it.schema = it.schema["then"]; $it.schemaPath = it.schemaPath + ".then"; $it.errSchemaPath = it.errSchemaPath + "/then"; out += " " + it.validate($it) + " "; $it.baseId = $currentBaseId; out += " " + $valid + " = " + $nextValid + "; "; if ($thenPresent && $elsePresent) { $ifClause = "ifClause" + $lvl; out += " var " + $ifClause + " = 'then'; "; } else { $ifClause = "'then'"; } out += " } "; if ($elsePresent) { out += " else { "; } } else { out += " if (!" + $nextValid + ") { "; } if ($elsePresent) { $it.schema = it.schema["else"]; $it.schemaPath = it.schemaPath + ".else"; $it.errSchemaPath = it.errSchemaPath + "/else"; out += " " + it.validate($it) + " "; $it.baseId = $currentBaseId; out += " " + $valid + " = " + $nextValid + "; "; if ($thenPresent && $elsePresent) { $ifClause = "ifClause" + $lvl; out += " var " + $ifClause + " = 'else'; "; } else { $ifClause = "'else'"; } out += " } "; } out += " if (!" + $valid + ") { var err = "; if (it.createErrors !== false) { out += " { keyword: 'if' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { failingKeyword: " + $ifClause + " } "; if (it.opts.messages !== false) { out += ` , message: 'should match "' + ` + $ifClause + ` + '" schema' `; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError(vErrors); "; } else { out += " validate.errors = vErrors; return false; "; } } out += " } "; if ($breakOnError) { out += " else { "; } } else { if ($breakOnError) { out += " if (true) { "; } } return out; }; } }); // node_modules/ajv/lib/dotjs/items.js var require_items = __commonJS({ "node_modules/ajv/lib/dotjs/items.js"(exports, module2) { "use strict"; module2.exports = function generate_items(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $errs = "errs__" + $lvl; var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; var $idx = "i" + $lvl, $dataNxt = $it.dataLevel = it.dataLevel + 1, $nextData = "data" + $dataNxt, $currentBaseId = it.baseId; out += "var " + $errs + " = errors;var " + $valid + ";"; if (Array.isArray($schema)) { var $additionalItems = it.schema.additionalItems; if ($additionalItems === false) { out += " " + $valid + " = " + $data + ".length <= " + $schema.length + "; "; var $currErrSchemaPath = $errSchemaPath; $errSchemaPath = it.errSchemaPath + "/additionalItems"; out += " if (!" + $valid + ") { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'additionalItems' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { limit: " + $schema.length + " } "; if (it.opts.messages !== false) { out += " , message: 'should NOT have more than " + $schema.length + " items' "; } if (it.opts.verbose) { out += " , schema: false , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } "; $errSchemaPath = $currErrSchemaPath; if ($breakOnError) { $closingBraces += "}"; out += " else { "; } } var arr1 = $schema; if (arr1) { var $sch, $i = -1, l1 = arr1.length - 1; while ($i < l1) { $sch = arr1[$i += 1]; if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) { out += " " + $nextValid + " = true; if (" + $data + ".length > " + $i + ") { "; var $passData = $data + "[" + $i + "]"; $it.schema = $sch; $it.schemaPath = $schemaPath + "[" + $i + "]"; $it.errSchemaPath = $errSchemaPath + "/" + $i; $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); $it.dataPathArr[$dataNxt] = $i; var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { out += " " + it.util.varReplace($code, $nextData, $passData) + " "; } else { out += " var " + $nextData + " = " + $passData + "; " + $code + " "; } out += " } "; if ($breakOnError) { out += " if (" + $nextValid + ") { "; $closingBraces += "}"; } } } } if (typeof $additionalItems == "object" && (it.opts.strictKeywords ? typeof $additionalItems == "object" && Object.keys($additionalItems).length > 0 || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) { $it.schema = $additionalItems; $it.schemaPath = it.schemaPath + ".additionalItems"; $it.errSchemaPath = it.errSchemaPath + "/additionalItems"; out += " " + $nextValid + " = true; if (" + $data + ".length > " + $schema.length + ") { for (var " + $idx + " = " + $schema.length + "; " + $idx + " < " + $data + ".length; " + $idx + "++) { "; $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); var $passData = $data + "[" + $idx + "]"; $it.dataPathArr[$dataNxt] = $idx; var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { out += " " + it.util.varReplace($code, $nextData, $passData) + " "; } else { out += " var " + $nextData + " = " + $passData + "; " + $code + " "; } if ($breakOnError) { out += " if (!" + $nextValid + ") break; "; } out += " } } "; if ($breakOnError) { out += " if (" + $nextValid + ") { "; $closingBraces += "}"; } } } else if (it.opts.strictKeywords ? typeof $schema == "object" && Object.keys($schema).length > 0 || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)) { $it.schema = $schema; $it.schemaPath = $schemaPath; $it.errSchemaPath = $errSchemaPath; out += " for (var " + $idx + " = " + 0 + "; " + $idx + " < " + $data + ".length; " + $idx + "++) { "; $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); var $passData = $data + "[" + $idx + "]"; $it.dataPathArr[$dataNxt] = $idx; var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { out += " " + it.util.varReplace($code, $nextData, $passData) + " "; } else { out += " var " + $nextData + " = " + $passData + "; " + $code + " "; } if ($breakOnError) { out += " if (!" + $nextValid + ") break; "; } out += " }"; } if ($breakOnError) { out += " " + $closingBraces + " if (" + $errs + " == errors) {"; } return out; }; } }); // node_modules/ajv/lib/dotjs/_limit.js var require_limit = __commonJS({ "node_modules/ajv/lib/dotjs/_limit.js"(exports, module2) { "use strict"; module2.exports = function generate__limit(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $errorKeyword; var $data = "data" + ($dataLvl || ""); var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } var $isMax = $keyword == "maximum", $exclusiveKeyword = $isMax ? "exclusiveMaximum" : "exclusiveMinimum", $schemaExcl = it.schema[$exclusiveKeyword], $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, $op = $isMax ? "<" : ">", $notOp = $isMax ? ">" : "<", $errorKeyword = void 0; if (!($isData || typeof $schema == "number" || $schema === void 0)) { throw new Error($keyword + " must be number"); } if (!($isDataExcl || $schemaExcl === void 0 || typeof $schemaExcl == "number" || typeof $schemaExcl == "boolean")) { throw new Error($exclusiveKeyword + " must be number or boolean"); } if ($isDataExcl) { var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), $exclusive = "exclusive" + $lvl, $exclType = "exclType" + $lvl, $exclIsNumber = "exclIsNumber" + $lvl, $opExpr = "op" + $lvl, $opStr = "' + " + $opExpr + " + '"; out += " var schemaExcl" + $lvl + " = " + $schemaValueExcl + "; "; $schemaValueExcl = "schemaExcl" + $lvl; out += " var " + $exclusive + "; var " + $exclType + " = typeof " + $schemaValueExcl + "; if (" + $exclType + " != 'boolean' && " + $exclType + " != 'undefined' && " + $exclType + " != 'number') { "; var $errorKeyword = $exclusiveKeyword; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "_exclusiveLimit") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} "; if (it.opts.messages !== false) { out += " , message: '" + $exclusiveKeyword + " should be boolean' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } else if ( "; if ($isData) { out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || "; } out += " " + $exclType + " == 'number' ? ( (" + $exclusive + " = " + $schemaValue + " === undefined || " + $schemaValueExcl + " " + $op + "= " + $schemaValue + ") ? " + $data + " " + $notOp + "= " + $schemaValueExcl + " : " + $data + " " + $notOp + " " + $schemaValue + " ) : ( (" + $exclusive + " = " + $schemaValueExcl + " === true) ? " + $data + " " + $notOp + "= " + $schemaValue + " : " + $data + " " + $notOp + " " + $schemaValue + " ) || " + $data + " !== " + $data + ") { var op" + $lvl + " = " + $exclusive + " ? '" + $op + "' : '" + $op + "='; "; if ($schema === void 0) { $errorKeyword = $exclusiveKeyword; $errSchemaPath = it.errSchemaPath + "/" + $exclusiveKeyword; $schemaValue = $schemaValueExcl; $isData = $isDataExcl; } } else { var $exclIsNumber = typeof $schemaExcl == "number", $opStr = $op; if ($exclIsNumber && $isData) { var $opExpr = "'" + $opStr + "'"; out += " if ( "; if ($isData) { out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || "; } out += " ( " + $schemaValue + " === undefined || " + $schemaExcl + " " + $op + "= " + $schemaValue + " ? " + $data + " " + $notOp + "= " + $schemaExcl + " : " + $data + " " + $notOp + " " + $schemaValue + " ) || " + $data + " !== " + $data + ") { "; } else { if ($exclIsNumber && $schema === void 0) { $exclusive = true; $errorKeyword = $exclusiveKeyword; $errSchemaPath = it.errSchemaPath + "/" + $exclusiveKeyword; $schemaValue = $schemaExcl; $notOp += "="; } else { if ($exclIsNumber) $schemaValue = Math[$isMax ? "min" : "max"]($schemaExcl, $schema); if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { $exclusive = true; $errorKeyword = $exclusiveKeyword; $errSchemaPath = it.errSchemaPath + "/" + $exclusiveKeyword; $notOp += "="; } else { $exclusive = false; $opStr += "="; } } var $opExpr = "'" + $opStr + "'"; out += " if ( "; if ($isData) { out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || "; } out += " " + $data + " " + $notOp + " " + $schemaValue + " || " + $data + " !== " + $data + ") { "; } } $errorKeyword = $errorKeyword || $keyword; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "_limit") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { comparison: " + $opExpr + ", limit: " + $schemaValue + ", exclusive: " + $exclusive + " } "; if (it.opts.messages !== false) { out += " , message: 'should be " + $opStr + " "; if ($isData) { out += "' + " + $schemaValue; } else { out += "" + $schemaValue + "'"; } } if (it.opts.verbose) { out += " , schema: "; if ($isData) { out += "validate.schema" + $schemaPath; } else { out += "" + $schema; } out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } "; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/_limitItems.js var require_limitItems = __commonJS({ "node_modules/ajv/lib/dotjs/_limitItems.js"(exports, module2) { "use strict"; module2.exports = function generate__limitItems(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $errorKeyword; var $data = "data" + ($dataLvl || ""); var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } if (!($isData || typeof $schema == "number")) { throw new Error($keyword + " must be number"); } var $op = $keyword == "maxItems" ? ">" : "<"; out += "if ( "; if ($isData) { out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || "; } out += " " + $data + ".length " + $op + " " + $schemaValue + ") { "; var $errorKeyword = $keyword; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "_limitItems") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { limit: " + $schemaValue + " } "; if (it.opts.messages !== false) { out += " , message: 'should NOT have "; if ($keyword == "maxItems") { out += "more"; } else { out += "fewer"; } out += " than "; if ($isData) { out += "' + " + $schemaValue + " + '"; } else { out += "" + $schema; } out += " items' "; } if (it.opts.verbose) { out += " , schema: "; if ($isData) { out += "validate.schema" + $schemaPath; } else { out += "" + $schema; } out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += "} "; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/_limitLength.js var require_limitLength = __commonJS({ "node_modules/ajv/lib/dotjs/_limitLength.js"(exports, module2) { "use strict"; module2.exports = function generate__limitLength(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $errorKeyword; var $data = "data" + ($dataLvl || ""); var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } if (!($isData || typeof $schema == "number")) { throw new Error($keyword + " must be number"); } var $op = $keyword == "maxLength" ? ">" : "<"; out += "if ( "; if ($isData) { out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || "; } if (it.opts.unicode === false) { out += " " + $data + ".length "; } else { out += " ucs2length(" + $data + ") "; } out += " " + $op + " " + $schemaValue + ") { "; var $errorKeyword = $keyword; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "_limitLength") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { limit: " + $schemaValue + " } "; if (it.opts.messages !== false) { out += " , message: 'should NOT be "; if ($keyword == "maxLength") { out += "longer"; } else { out += "shorter"; } out += " than "; if ($isData) { out += "' + " + $schemaValue + " + '"; } else { out += "" + $schema; } out += " characters' "; } if (it.opts.verbose) { out += " , schema: "; if ($isData) { out += "validate.schema" + $schemaPath; } else { out += "" + $schema; } out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += "} "; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/_limitProperties.js var require_limitProperties = __commonJS({ "node_modules/ajv/lib/dotjs/_limitProperties.js"(exports, module2) { "use strict"; module2.exports = function generate__limitProperties(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $errorKeyword; var $data = "data" + ($dataLvl || ""); var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } if (!($isData || typeof $schema == "number")) { throw new Error($keyword + " must be number"); } var $op = $keyword == "maxProperties" ? ">" : "<"; out += "if ( "; if ($isData) { out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || "; } out += " Object.keys(" + $data + ").length " + $op + " " + $schemaValue + ") { "; var $errorKeyword = $keyword; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "_limitProperties") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { limit: " + $schemaValue + " } "; if (it.opts.messages !== false) { out += " , message: 'should NOT have "; if ($keyword == "maxProperties") { out += "more"; } else { out += "fewer"; } out += " than "; if ($isData) { out += "' + " + $schemaValue + " + '"; } else { out += "" + $schema; } out += " properties' "; } if (it.opts.verbose) { out += " , schema: "; if ($isData) { out += "validate.schema" + $schemaPath; } else { out += "" + $schema; } out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += "} "; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/multipleOf.js var require_multipleOf = __commonJS({ "node_modules/ajv/lib/dotjs/multipleOf.js"(exports, module2) { "use strict"; module2.exports = function generate_multipleOf(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } if (!($isData || typeof $schema == "number")) { throw new Error($keyword + " must be number"); } out += "var division" + $lvl + ";if ("; if ($isData) { out += " " + $schemaValue + " !== undefined && ( typeof " + $schemaValue + " != 'number' || "; } out += " (division" + $lvl + " = " + $data + " / " + $schemaValue + ", "; if (it.opts.multipleOfPrecision) { out += " Math.abs(Math.round(division" + $lvl + ") - division" + $lvl + ") > 1e-" + it.opts.multipleOfPrecision + " "; } else { out += " division" + $lvl + " !== parseInt(division" + $lvl + ") "; } out += " ) "; if ($isData) { out += " ) "; } out += " ) { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'multipleOf' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { multipleOf: " + $schemaValue + " } "; if (it.opts.messages !== false) { out += " , message: 'should be multiple of "; if ($isData) { out += "' + " + $schemaValue; } else { out += "" + $schemaValue + "'"; } } if (it.opts.verbose) { out += " , schema: "; if ($isData) { out += "validate.schema" + $schemaPath; } else { out += "" + $schema; } out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += "} "; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/not.js var require_not = __commonJS({ "node_modules/ajv/lib/dotjs/not.js"(exports, module2) { "use strict"; module2.exports = function generate_not(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $errs = "errs__" + $lvl; var $it = it.util.copy(it); $it.level++; var $nextValid = "valid" + $it.level; if (it.opts.strictKeywords ? typeof $schema == "object" && Object.keys($schema).length > 0 || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)) { $it.schema = $schema; $it.schemaPath = $schemaPath; $it.errSchemaPath = $errSchemaPath; out += " var " + $errs + " = errors; "; var $wasComposite = it.compositeRule; it.compositeRule = $it.compositeRule = true; $it.createErrors = false; var $allErrorsOption; if ($it.opts.allErrors) { $allErrorsOption = $it.opts.allErrors; $it.opts.allErrors = false; } out += " " + it.validate($it) + " "; $it.createErrors = true; if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; it.compositeRule = $it.compositeRule = $wasComposite; out += " if (" + $nextValid + ") { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'not' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} "; if (it.opts.messages !== false) { out += " , message: 'should NOT be valid' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } else { errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; } "; if (it.opts.allErrors) { out += " } "; } } else { out += " var err = "; if (it.createErrors !== false) { out += " { keyword: 'not' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} "; if (it.opts.messages !== false) { out += " , message: 'should NOT be valid' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; if ($breakOnError) { out += " if (false) { "; } } return out; }; } }); // node_modules/ajv/lib/dotjs/oneOf.js var require_oneOf = __commonJS({ "node_modules/ajv/lib/dotjs/oneOf.js"(exports, module2) { "use strict"; module2.exports = function generate_oneOf(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $errs = "errs__" + $lvl; var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; var $currentBaseId = $it.baseId, $prevValid = "prevValid" + $lvl, $passingSchemas = "passingSchemas" + $lvl; out += "var " + $errs + " = errors , " + $prevValid + " = false , " + $valid + " = false , " + $passingSchemas + " = null; "; var $wasComposite = it.compositeRule; it.compositeRule = $it.compositeRule = true; var arr1 = $schema; if (arr1) { var $sch, $i = -1, l1 = arr1.length - 1; while ($i < l1) { $sch = arr1[$i += 1]; if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) { $it.schema = $sch; $it.schemaPath = $schemaPath + "[" + $i + "]"; $it.errSchemaPath = $errSchemaPath + "/" + $i; out += " " + it.validate($it) + " "; $it.baseId = $currentBaseId; } else { out += " var " + $nextValid + " = true; "; } if ($i) { out += " if (" + $nextValid + " && " + $prevValid + ") { " + $valid + " = false; " + $passingSchemas + " = [" + $passingSchemas + ", " + $i + "]; } else { "; $closingBraces += "}"; } out += " if (" + $nextValid + ") { " + $valid + " = " + $prevValid + " = true; " + $passingSchemas + " = " + $i + "; }"; } } it.compositeRule = $it.compositeRule = $wasComposite; out += "" + $closingBraces + "if (!" + $valid + ") { var err = "; if (it.createErrors !== false) { out += " { keyword: 'oneOf' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { passingSchemas: " + $passingSchemas + " } "; if (it.opts.messages !== false) { out += " , message: 'should match exactly one schema in oneOf' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError(vErrors); "; } else { out += " validate.errors = vErrors; return false; "; } } out += "} else { errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; }"; if (it.opts.allErrors) { out += " } "; } return out; }; } }); // node_modules/ajv/lib/dotjs/pattern.js var require_pattern = __commonJS({ "node_modules/ajv/lib/dotjs/pattern.js"(exports, module2) { "use strict"; module2.exports = function generate_pattern(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } var $regexp = $isData ? "(new RegExp(" + $schemaValue + "))" : it.usePattern($schema); out += "if ( "; if ($isData) { out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'string') || "; } out += " !" + $regexp + ".test(" + $data + ") ) { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'pattern' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { pattern: "; if ($isData) { out += "" + $schemaValue; } else { out += "" + it.util.toQuotedString($schema); } out += " } "; if (it.opts.messages !== false) { out += ` , message: 'should match pattern "`; if ($isData) { out += "' + " + $schemaValue + " + '"; } else { out += "" + it.util.escapeQuotes($schema); } out += `"' `; } if (it.opts.verbose) { out += " , schema: "; if ($isData) { out += "validate.schema" + $schemaPath; } else { out += "" + it.util.toQuotedString($schema); } out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += "} "; if ($breakOnError) { out += " else { "; } return out; }; } }); // node_modules/ajv/lib/dotjs/properties.js var require_properties = __commonJS({ "node_modules/ajv/lib/dotjs/properties.js"(exports, module2) { "use strict"; module2.exports = function generate_properties(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $errs = "errs__" + $lvl; var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; var $key = "key" + $lvl, $idx = "idx" + $lvl, $dataNxt = $it.dataLevel = it.dataLevel + 1, $nextData = "data" + $dataNxt, $dataProperties = "dataProperties" + $lvl; var $schemaKeys = Object.keys($schema || {}).filter(notProto), $pProperties = it.schema.patternProperties || {}, $pPropertyKeys = Object.keys($pProperties).filter(notProto), $aProperties = it.schema.additionalProperties, $someProperties = $schemaKeys.length || $pPropertyKeys.length, $noAdditional = $aProperties === false, $additionalIsSchema = typeof $aProperties == "object" && Object.keys($aProperties).length, $removeAdditional = it.opts.removeAdditional, $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, $ownProperties = it.opts.ownProperties, $currentBaseId = it.baseId; var $required = it.schema.required; if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { var $requiredHash = it.util.toHash($required); } function notProto(p) { return p !== "__proto__"; } out += "var " + $errs + " = errors;var " + $nextValid + " = true;"; if ($ownProperties) { out += " var " + $dataProperties + " = undefined;"; } if ($checkAdditional) { if ($ownProperties) { out += " " + $dataProperties + " = " + $dataProperties + " || Object.keys(" + $data + "); for (var " + $idx + "=0; " + $idx + "<" + $dataProperties + ".length; " + $idx + "++) { var " + $key + " = " + $dataProperties + "[" + $idx + "]; "; } else { out += " for (var " + $key + " in " + $data + ") { "; } if ($someProperties) { out += " var isAdditional" + $lvl + " = !(false "; if ($schemaKeys.length) { if ($schemaKeys.length > 8) { out += " || validate.schema" + $schemaPath + ".hasOwnProperty(" + $key + ") "; } else { var arr1 = $schemaKeys; if (arr1) { var $propertyKey, i1 = -1, l1 = arr1.length - 1; while (i1 < l1) { $propertyKey = arr1[i1 += 1]; out += " || " + $key + " == " + it.util.toQuotedString($propertyKey) + " "; } } } } if ($pPropertyKeys.length) { var arr2 = $pPropertyKeys; if (arr2) { var $pProperty, $i = -1, l2 = arr2.length - 1; while ($i < l2) { $pProperty = arr2[$i += 1]; out += " || " + it.usePattern($pProperty) + ".test(" + $key + ") "; } } } out += " ); if (isAdditional" + $lvl + ") { "; } if ($removeAdditional == "all") { out += " delete " + $data + "[" + $key + "]; "; } else { var $currentErrorPath = it.errorPath; var $additionalProperty = "' + " + $key + " + '"; if (it.opts._errorDataPathProperty) { it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); } if ($noAdditional) { if ($removeAdditional) { out += " delete " + $data + "[" + $key + "]; "; } else { out += " " + $nextValid + " = false; "; var $currErrSchemaPath = $errSchemaPath; $errSchemaPath = it.errSchemaPath + "/additionalProperties"; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'additionalProperties' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { additionalProperty: '" + $additionalProperty + "' } "; if (it.opts.messages !== false) { out += " , message: '"; if (it.opts._errorDataPathProperty) { out += "is an invalid additional property"; } else { out += "should NOT have additional properties"; } out += "' "; } if (it.opts.verbose) { out += " , schema: false , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } $errSchemaPath = $currErrSchemaPath; if ($breakOnError) { out += " break; "; } } } else if ($additionalIsSchema) { if ($removeAdditional == "failing") { out += " var " + $errs + " = errors; "; var $wasComposite = it.compositeRule; it.compositeRule = $it.compositeRule = true; $it.schema = $aProperties; $it.schemaPath = it.schemaPath + ".additionalProperties"; $it.errSchemaPath = it.errSchemaPath + "/additionalProperties"; $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); var $passData = $data + "[" + $key + "]"; $it.dataPathArr[$dataNxt] = $key; var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { out += " " + it.util.varReplace($code, $nextData, $passData) + " "; } else { out += " var " + $nextData + " = " + $passData + "; " + $code + " "; } out += " if (!" + $nextValid + ") { errors = " + $errs + "; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete " + $data + "[" + $key + "]; } "; it.compositeRule = $it.compositeRule = $wasComposite; } else { $it.schema = $aProperties; $it.schemaPath = it.schemaPath + ".additionalProperties"; $it.errSchemaPath = it.errSchemaPath + "/additionalProperties"; $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); var $passData = $data + "[" + $key + "]"; $it.dataPathArr[$dataNxt] = $key; var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { out += " " + it.util.varReplace($code, $nextData, $passData) + " "; } else { out += " var " + $nextData + " = " + $passData + "; " + $code + " "; } if ($breakOnError) { out += " if (!" + $nextValid + ") break; "; } } } it.errorPath = $currentErrorPath; } if ($someProperties) { out += " } "; } out += " } "; if ($breakOnError) { out += " if (" + $nextValid + ") { "; $closingBraces += "}"; } } var $useDefaults = it.opts.useDefaults && !it.compositeRule; if ($schemaKeys.length) { var arr3 = $schemaKeys; if (arr3) { var $propertyKey, i3 = -1, l3 = arr3.length - 1; while (i3 < l3) { $propertyKey = arr3[i3 += 1]; var $sch = $schema[$propertyKey]; if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) { var $prop = it.util.getProperty($propertyKey), $passData = $data + $prop, $hasDefault = $useDefaults && $sch.default !== void 0; $it.schema = $sch; $it.schemaPath = $schemaPath + $prop; $it.errSchemaPath = $errSchemaPath + "/" + it.util.escapeFragment($propertyKey); $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { $code = it.util.varReplace($code, $nextData, $passData); var $useData = $passData; } else { var $useData = $nextData; out += " var " + $nextData + " = " + $passData + "; "; } if ($hasDefault) { out += " " + $code + " "; } else { if ($requiredHash && $requiredHash[$propertyKey]) { out += " if ( " + $useData + " === undefined "; if ($ownProperties) { out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') "; } out += ") { " + $nextValid + " = false; "; var $currentErrorPath = it.errorPath, $currErrSchemaPath = $errSchemaPath, $missingProperty = it.util.escapeQuotes($propertyKey); if (it.opts._errorDataPathProperty) { it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); } $errSchemaPath = it.errSchemaPath + "/required"; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } "; if (it.opts.messages !== false) { out += " , message: '"; if (it.opts._errorDataPathProperty) { out += "is a required property"; } else { out += "should have required property \\'" + $missingProperty + "\\'"; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } $errSchemaPath = $currErrSchemaPath; it.errorPath = $currentErrorPath; out += " } else { "; } else { if ($breakOnError) { out += " if ( " + $useData + " === undefined "; if ($ownProperties) { out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') "; } out += ") { " + $nextValid + " = true; } else { "; } else { out += " if (" + $useData + " !== undefined "; if ($ownProperties) { out += " && Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') "; } out += " ) { "; } } out += " " + $code + " } "; } } if ($breakOnError) { out += " if (" + $nextValid + ") { "; $closingBraces += "}"; } } } } if ($pPropertyKeys.length) { var arr4 = $pPropertyKeys; if (arr4) { var $pProperty, i4 = -1, l4 = arr4.length - 1; while (i4 < l4) { $pProperty = arr4[i4 += 1]; var $sch = $pProperties[$pProperty]; if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) { $it.schema = $sch; $it.schemaPath = it.schemaPath + ".patternProperties" + it.util.getProperty($pProperty); $it.errSchemaPath = it.errSchemaPath + "/patternProperties/" + it.util.escapeFragment($pProperty); if ($ownProperties) { out += " " + $dataProperties + " = " + $dataProperties + " || Object.keys(" + $data + "); for (var " + $idx + "=0; " + $idx + "<" + $dataProperties + ".length; " + $idx + "++) { var " + $key + " = " + $dataProperties + "[" + $idx + "]; "; } else { out += " for (var " + $key + " in " + $data + ") { "; } out += " if (" + it.usePattern($pProperty) + ".test(" + $key + ")) { "; $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); var $passData = $data + "[" + $key + "]"; $it.dataPathArr[$dataNxt] = $key; var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { out += " " + it.util.varReplace($code, $nextData, $passData) + " "; } else { out += " var " + $nextData + " = " + $passData + "; " + $code + " "; } if ($breakOnError) { out += " if (!" + $nextValid + ") break; "; } out += " } "; if ($breakOnError) { out += " else " + $nextValid + " = true; "; } out += " } "; if ($breakOnError) { out += " if (" + $nextValid + ") { "; $closingBraces += "}"; } } } } } if ($breakOnError) { out += " " + $closingBraces + " if (" + $errs + " == errors) {"; } return out; }; } }); // node_modules/ajv/lib/dotjs/propertyNames.js var require_propertyNames = __commonJS({ "node_modules/ajv/lib/dotjs/propertyNames.js"(exports, module2) { "use strict"; module2.exports = function generate_propertyNames(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $errs = "errs__" + $lvl; var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; out += "var " + $errs + " = errors;"; if (it.opts.strictKeywords ? typeof $schema == "object" && Object.keys($schema).length > 0 || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)) { $it.schema = $schema; $it.schemaPath = $schemaPath; $it.errSchemaPath = $errSchemaPath; var $key = "key" + $lvl, $idx = "idx" + $lvl, $i = "i" + $lvl, $invalidName = "' + " + $key + " + '", $dataNxt = $it.dataLevel = it.dataLevel + 1, $nextData = "data" + $dataNxt, $dataProperties = "dataProperties" + $lvl, $ownProperties = it.opts.ownProperties, $currentBaseId = it.baseId; if ($ownProperties) { out += " var " + $dataProperties + " = undefined; "; } if ($ownProperties) { out += " " + $dataProperties + " = " + $dataProperties + " || Object.keys(" + $data + "); for (var " + $idx + "=0; " + $idx + "<" + $dataProperties + ".length; " + $idx + "++) { var " + $key + " = " + $dataProperties + "[" + $idx + "]; "; } else { out += " for (var " + $key + " in " + $data + ") { "; } out += " var startErrs" + $lvl + " = errors; "; var $passData = $key; var $wasComposite = it.compositeRule; it.compositeRule = $it.compositeRule = true; var $code = it.validate($it); $it.baseId = $currentBaseId; if (it.util.varOccurences($code, $nextData) < 2) { out += " " + it.util.varReplace($code, $nextData, $passData) + " "; } else { out += " var " + $nextData + " = " + $passData + "; " + $code + " "; } it.compositeRule = $it.compositeRule = $wasComposite; out += " if (!" + $nextValid + ") { for (var " + $i + "=startErrs" + $lvl + "; " + $i + " 0 || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) { $required[$required.length] = $property; } } } } else { var $required = $schema; } } if ($isData || $required.length) { var $currentErrorPath = it.errorPath, $loopRequired = $isData || $required.length >= it.opts.loopRequired, $ownProperties = it.opts.ownProperties; if ($breakOnError) { out += " var missing" + $lvl + "; "; if ($loopRequired) { if (!$isData) { out += " var " + $vSchema + " = validate.schema" + $schemaPath + "; "; } var $i = "i" + $lvl, $propertyPath = "schema" + $lvl + "[" + $i + "]", $missingProperty = "' + " + $propertyPath + " + '"; if (it.opts._errorDataPathProperty) { it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); } out += " var " + $valid + " = true; "; if ($isData) { out += " if (schema" + $lvl + " === undefined) " + $valid + " = true; else if (!Array.isArray(schema" + $lvl + ")) " + $valid + " = false; else {"; } out += " for (var " + $i + " = 0; " + $i + " < " + $vSchema + ".length; " + $i + "++) { " + $valid + " = " + $data + "[" + $vSchema + "[" + $i + "]] !== undefined "; if ($ownProperties) { out += " && Object.prototype.hasOwnProperty.call(" + $data + ", " + $vSchema + "[" + $i + "]) "; } out += "; if (!" + $valid + ") break; } "; if ($isData) { out += " } "; } out += " if (!" + $valid + ") { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } "; if (it.opts.messages !== false) { out += " , message: '"; if (it.opts._errorDataPathProperty) { out += "is a required property"; } else { out += "should have required property \\'" + $missingProperty + "\\'"; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } else { "; } else { out += " if ( "; var arr2 = $required; if (arr2) { var $propertyKey, $i = -1, l2 = arr2.length - 1; while ($i < l2) { $propertyKey = arr2[$i += 1]; if ($i) { out += " || "; } var $prop = it.util.getProperty($propertyKey), $useData = $data + $prop; out += " ( ( " + $useData + " === undefined "; if ($ownProperties) { out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') "; } out += ") && (missing" + $lvl + " = " + it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) + ") ) "; } } out += ") { "; var $propertyPath = "missing" + $lvl, $missingProperty = "' + " + $propertyPath + " + '"; if (it.opts._errorDataPathProperty) { it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + " + " + $propertyPath; } var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } "; if (it.opts.messages !== false) { out += " , message: '"; if (it.opts._errorDataPathProperty) { out += "is a required property"; } else { out += "should have required property \\'" + $missingProperty + "\\'"; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } else { "; } } else { if ($loopRequired) { if (!$isData) { out += " var " + $vSchema + " = validate.schema" + $schemaPath + "; "; } var $i = "i" + $lvl, $propertyPath = "schema" + $lvl + "[" + $i + "]", $missingProperty = "' + " + $propertyPath + " + '"; if (it.opts._errorDataPathProperty) { it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); } if ($isData) { out += " if (" + $vSchema + " && !Array.isArray(" + $vSchema + ")) { var err = "; if (it.createErrors !== false) { out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } "; if (it.opts.messages !== false) { out += " , message: '"; if (it.opts._errorDataPathProperty) { out += "is a required property"; } else { out += "should have required property \\'" + $missingProperty + "\\'"; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (" + $vSchema + " !== undefined) { "; } out += " for (var " + $i + " = 0; " + $i + " < " + $vSchema + ".length; " + $i + "++) { if (" + $data + "[" + $vSchema + "[" + $i + "]] === undefined "; if ($ownProperties) { out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", " + $vSchema + "[" + $i + "]) "; } out += ") { var err = "; if (it.createErrors !== false) { out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } "; if (it.opts.messages !== false) { out += " , message: '"; if (it.opts._errorDataPathProperty) { out += "is a required property"; } else { out += "should have required property \\'" + $missingProperty + "\\'"; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } "; if ($isData) { out += " } "; } } else { var arr3 = $required; if (arr3) { var $propertyKey, i3 = -1, l3 = arr3.length - 1; while (i3 < l3) { $propertyKey = arr3[i3 += 1]; var $prop = it.util.getProperty($propertyKey), $missingProperty = it.util.escapeQuotes($propertyKey), $useData = $data + $prop; if (it.opts._errorDataPathProperty) { it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); } out += " if ( " + $useData + " === undefined "; if ($ownProperties) { out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') "; } out += ") { var err = "; if (it.createErrors !== false) { out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } "; if (it.opts.messages !== false) { out += " , message: '"; if (it.opts._errorDataPathProperty) { out += "is a required property"; } else { out += "should have required property \\'" + $missingProperty + "\\'"; } out += "' "; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "; } } } } it.errorPath = $currentErrorPath; } else if ($breakOnError) { out += " if (true) {"; } return out; }; } }); // node_modules/ajv/lib/dotjs/uniqueItems.js var require_uniqueItems = __commonJS({ "node_modules/ajv/lib/dotjs/uniqueItems.js"(exports, module2) { "use strict"; module2.exports = function generate_uniqueItems(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } if (($schema || $isData) && it.opts.uniqueItems !== false) { if ($isData) { out += " var " + $valid + "; if (" + $schemaValue + " === false || " + $schemaValue + " === undefined) " + $valid + " = true; else if (typeof " + $schemaValue + " != 'boolean') " + $valid + " = false; else { "; } out += " var i = " + $data + ".length , " + $valid + " = true , j; if (i > 1) { "; var $itemType = it.schema.items && it.schema.items.type, $typeIsArray = Array.isArray($itemType); if (!$itemType || $itemType == "object" || $itemType == "array" || $typeIsArray && ($itemType.indexOf("object") >= 0 || $itemType.indexOf("array") >= 0)) { out += " outer: for (;i--;) { for (j = i; j--;) { if (equal(" + $data + "[i], " + $data + "[j])) { " + $valid + " = false; break outer; } } } "; } else { out += " var itemIndices = {}, item; for (;i--;) { var item = " + $data + "[i]; "; var $method = "checkDataType" + ($typeIsArray ? "s" : ""); out += " if (" + it.util[$method]($itemType, "item", it.opts.strictNumbers, true) + ") continue; "; if ($typeIsArray) { out += ` if (typeof item == 'string') item = '"' + item; `; } out += " if (typeof itemIndices[item] == 'number') { " + $valid + " = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "; } out += " } "; if ($isData) { out += " } "; } out += " if (!" + $valid + ") { "; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: 'uniqueItems' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { i: i, j: j } "; if (it.opts.messages !== false) { out += " , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "; } if (it.opts.verbose) { out += " , schema: "; if ($isData) { out += "validate.schema" + $schemaPath; } else { out += "" + $schema; } out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } out += " } "; if ($breakOnError) { out += " else { "; } } else { if ($breakOnError) { out += " if (true) { "; } } return out; }; } }); // node_modules/ajv/lib/dotjs/index.js var require_dotjs = __commonJS({ "node_modules/ajv/lib/dotjs/index.js"(exports, module2) { "use strict"; module2.exports = { "$ref": require_ref(), allOf: require_allOf(), anyOf: require_anyOf(), "$comment": require_comment(), const: require_const(), contains: require_contains(), dependencies: require_dependencies(), "enum": require_enum(), format: require_format(), "if": require_if(), items: require_items(), maximum: require_limit(), minimum: require_limit(), maxItems: require_limitItems(), minItems: require_limitItems(), maxLength: require_limitLength(), minLength: require_limitLength(), maxProperties: require_limitProperties(), minProperties: require_limitProperties(), multipleOf: require_multipleOf(), not: require_not(), oneOf: require_oneOf(), pattern: require_pattern(), properties: require_properties(), propertyNames: require_propertyNames(), required: require_required(), uniqueItems: require_uniqueItems(), validate: require_validate2() }; } }); // node_modules/ajv/lib/compile/rules.js var require_rules2 = __commonJS({ "node_modules/ajv/lib/compile/rules.js"(exports, module2) { "use strict"; var ruleModules = require_dotjs(); var toHash = require_util3().toHash; module2.exports = function rules() { var RULES = [ { type: "number", rules: [ { "maximum": ["exclusiveMaximum"] }, { "minimum": ["exclusiveMinimum"] }, "multipleOf", "format" ] }, { type: "string", rules: ["maxLength", "minLength", "pattern", "format"] }, { type: "array", rules: ["maxItems", "minItems", "items", "contains", "uniqueItems"] }, { type: "object", rules: [ "maxProperties", "minProperties", "required", "dependencies", "propertyNames", { "properties": ["additionalProperties", "patternProperties"] } ] }, { rules: ["$ref", "const", "enum", "not", "anyOf", "oneOf", "allOf", "if"] } ]; var ALL = ["type", "$comment"]; var KEYWORDS = [ "$schema", "$id", "id", "$data", "$async", "title", "description", "default", "definitions", "examples", "readOnly", "writeOnly", "contentMediaType", "contentEncoding", "additionalItems", "then", "else" ]; var TYPES = ["number", "integer", "string", "array", "object", "boolean", "null"]; RULES.all = toHash(ALL); RULES.types = toHash(TYPES); RULES.forEach(function(group) { group.rules = group.rules.map(function(keyword) { var implKeywords; if (typeof keyword == "object") { var key = Object.keys(keyword)[0]; implKeywords = keyword[key]; keyword = key; implKeywords.forEach(function(k) { ALL.push(k); RULES.all[k] = true; }); } ALL.push(keyword); var rule = RULES.all[keyword] = { keyword, code: ruleModules[keyword], implements: implKeywords }; return rule; }); RULES.all.$comment = { keyword: "$comment", code: ruleModules.$comment }; if (group.type) RULES.types[group.type] = group; }); RULES.keywords = toHash(ALL.concat(KEYWORDS)); RULES.custom = {}; return RULES; }; } }); // node_modules/ajv/lib/data.js var require_data = __commonJS({ "node_modules/ajv/lib/data.js"(exports, module2) { "use strict"; var KEYWORDS = [ "multipleOf", "maximum", "exclusiveMaximum", "minimum", "exclusiveMinimum", "maxLength", "minLength", "pattern", "additionalItems", "maxItems", "minItems", "uniqueItems", "maxProperties", "minProperties", "required", "additionalProperties", "enum", "format", "const" ]; module2.exports = function(metaSchema, keywordsJsonPointers) { for (var i = 0; i < keywordsJsonPointers.length; i++) { metaSchema = JSON.parse(JSON.stringify(metaSchema)); var segments = keywordsJsonPointers[i].split("/"); var keywords = metaSchema; var j; for (j = 1; j < segments.length; j++) keywords = keywords[segments[j]]; for (j = 0; j < KEYWORDS.length; j++) { var key = KEYWORDS[j]; var schema = keywords[key]; if (schema) { keywords[key] = { anyOf: [ schema, { $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" } ] }; } } } return metaSchema; }; } }); // node_modules/ajv/lib/compile/async.js var require_async = __commonJS({ "node_modules/ajv/lib/compile/async.js"(exports, module2) { "use strict"; var MissingRefError = require_error_classes().MissingRef; module2.exports = compileAsync; function compileAsync(schema, meta, callback) { var self2 = this; if (typeof this._opts.loadSchema != "function") throw new Error("options.loadSchema should be a function"); if (typeof meta == "function") { callback = meta; meta = void 0; } var p = loadMetaSchemaOf(schema).then(function() { var schemaObj = self2._addSchema(schema, void 0, meta); return schemaObj.validate || _compileAsync(schemaObj); }); if (callback) { p.then(function(v) { callback(null, v); }, callback); } return p; function loadMetaSchemaOf(sch) { var $schema = sch.$schema; return $schema && !self2.getSchema($schema) ? compileAsync.call(self2, { $ref: $schema }, true) : Promise.resolve(); } function _compileAsync(schemaObj) { try { return self2._compile(schemaObj); } catch (e) { if (e instanceof MissingRefError) return loadMissingSchema(e); throw e; } function loadMissingSchema(e) { var ref = e.missingSchema; if (added(ref)) throw new Error("Schema " + ref + " is loaded but " + e.missingRef + " cannot be resolved"); var schemaPromise = self2._loadingSchemas[ref]; if (!schemaPromise) { schemaPromise = self2._loadingSchemas[ref] = self2._opts.loadSchema(ref); schemaPromise.then(removePromise, removePromise); } return schemaPromise.then(function(sch) { if (!added(ref)) { return loadMetaSchemaOf(sch).then(function() { if (!added(ref)) self2.addSchema(sch, ref, void 0, meta); }); } }).then(function() { return _compileAsync(schemaObj); }); function removePromise() { delete self2._loadingSchemas[ref]; } function added(ref2) { return self2._refs[ref2] || self2._schemas[ref2]; } } } } } }); // node_modules/ajv/lib/dotjs/custom.js var require_custom = __commonJS({ "node_modules/ajv/lib/dotjs/custom.js"(exports, module2) { "use strict"; module2.exports = function generate_custom(it, $keyword, $ruleType) { var out = " "; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + "/" + $keyword; var $breakOnError = !it.opts.allErrors; var $errorKeyword; var $data = "data" + ($dataLvl || ""); var $valid = "valid" + $lvl; var $errs = "errs__" + $lvl; var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; "; $schemaValue = "schema" + $lvl; } else { $schemaValue = $schema; } var $rule = this, $definition = "definition" + $lvl, $rDef = $rule.definition, $closingBraces = ""; var $compile, $inline, $macro, $ruleValidate, $validateCode; if ($isData && $rDef.$data) { $validateCode = "keywordValidate" + $lvl; var $validateSchema = $rDef.validateSchema; out += " var " + $definition + " = RULES.custom['" + $keyword + "'].definition; var " + $validateCode + " = " + $definition + ".validate;"; } else { $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); if (!$ruleValidate) return; $schemaValue = "validate.schema" + $schemaPath; $validateCode = $ruleValidate.code; $compile = $rDef.compile; $inline = $rDef.inline; $macro = $rDef.macro; } var $ruleErrs = $validateCode + ".errors", $i = "i" + $lvl, $ruleErr = "ruleErr" + $lvl, $asyncKeyword = $rDef.async; if ($asyncKeyword && !it.async) throw new Error("async keyword in sync schema"); if (!($inline || $macro)) { out += "" + $ruleErrs + " = null;"; } out += "var " + $errs + " = errors;var " + $valid + ";"; if ($isData && $rDef.$data) { $closingBraces += "}"; out += " if (" + $schemaValue + " === undefined) { " + $valid + " = true; } else { "; if ($validateSchema) { $closingBraces += "}"; out += " " + $valid + " = " + $definition + ".validateSchema(" + $schemaValue + "); if (" + $valid + ") { "; } } if ($inline) { if ($rDef.statements) { out += " " + $ruleValidate.validate + " "; } else { out += " " + $valid + " = " + $ruleValidate.validate + "; "; } } else if ($macro) { var $it = it.util.copy(it); var $closingBraces = ""; $it.level++; var $nextValid = "valid" + $it.level; $it.schema = $ruleValidate.validate; $it.schemaPath = ""; var $wasComposite = it.compositeRule; it.compositeRule = $it.compositeRule = true; var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); it.compositeRule = $it.compositeRule = $wasComposite; out += " " + $code; } else { var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; out += " " + $validateCode + ".call( "; if (it.opts.passContext) { out += "this"; } else { out += "self"; } if ($compile || $rDef.schema === false) { out += " , " + $data + " "; } else { out += " , " + $schemaValue + " , " + $data + " , validate.schema" + it.schemaPath + " "; } out += " , (dataPath || '')"; if (it.errorPath != '""') { out += " + " + it.errorPath; } var $parentData = $dataLvl ? "data" + ($dataLvl - 1 || "") : "parentData", $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : "parentDataProperty"; out += " , " + $parentData + " , " + $parentDataProperty + " , rootData ) "; var def_callRuleValidate = out; out = $$outStack.pop(); if ($rDef.errors === false) { out += " " + $valid + " = "; if ($asyncKeyword) { out += "await "; } out += "" + def_callRuleValidate + "; "; } else { if ($asyncKeyword) { $ruleErrs = "customErrors" + $lvl; out += " var " + $ruleErrs + " = null; try { " + $valid + " = await " + def_callRuleValidate + "; } catch (e) { " + $valid + " = false; if (e instanceof ValidationError) " + $ruleErrs + " = e.errors; else throw e; } "; } else { out += " " + $ruleErrs + " = null; " + $valid + " = " + def_callRuleValidate + "; "; } } } if ($rDef.modifying) { out += " if (" + $parentData + ") " + $data + " = " + $parentData + "[" + $parentDataProperty + "];"; } out += "" + $closingBraces; if ($rDef.valid) { if ($breakOnError) { out += " if (true) { "; } } else { out += " if ( "; if ($rDef.valid === void 0) { out += " !"; if ($macro) { out += "" + $nextValid; } else { out += "" + $valid; } } else { out += " " + !$rDef.valid + " "; } out += ") { "; $errorKeyword = $rule.keyword; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; var $$outStack = $$outStack || []; $$outStack.push(out); out = ""; if (it.createErrors !== false) { out += " { keyword: '" + ($errorKeyword || "custom") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { keyword: '" + $rule.keyword + "' } "; if (it.opts.messages !== false) { out += ` , message: 'should pass "` + $rule.keyword + `" keyword validation' `; } if (it.opts.verbose) { out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " "; } out += " } "; } else { out += " {} "; } var __err = out; out = $$outStack.pop(); if (!it.compositeRule && $breakOnError) { if (it.async) { out += " throw new ValidationError([" + __err + "]); "; } else { out += " validate.errors = [" + __err + "]; return false; "; } } else { out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "; } var def_customError = out; out = $$outStack.pop(); if ($inline) { if ($rDef.errors) { if ($rDef.errors != "full") { out += " for (var " + $i + "=" + $errs + "; " + $i + ">> ((i & 3) << 3) & 255; } return rnds; }; } var rnds8; var rnds; } }); // node_modules/uuid/lib/bytesToUuid.js var require_bytesToUuid = __commonJS({ "node_modules/uuid/lib/bytesToUuid.js"(exports, module2) { var byteToHex = []; for (i = 0; i < 256; ++i) { byteToHex[i] = (i + 256).toString(16).substr(1); } var i; function bytesToUuid(buf, offset) { var i2 = offset || 0; var bth = byteToHex; return [ bth[buf[i2++]], bth[buf[i2++]], bth[buf[i2++]], bth[buf[i2++]], "-", bth[buf[i2++]], bth[buf[i2++]], "-", bth[buf[i2++]], bth[buf[i2++]], "-", bth[buf[i2++]], bth[buf[i2++]], "-", bth[buf[i2++]], bth[buf[i2++]], bth[buf[i2++]], bth[buf[i2++]], bth[buf[i2++]], bth[buf[i2++]] ].join(""); } module2.exports = bytesToUuid; } }); // node_modules/uuid/v4.js var require_v4 = __commonJS({ "node_modules/uuid/v4.js"(exports, module2) { var rng = require_rng_browser(); var bytesToUuid = require_bytesToUuid(); function v4(options, buf, offset) { var i = buf && offset || 0; if (typeof options == "string") { buf = options === "binary" ? new Array(16) : null; options = null; } options = options || {}; var rnds = options.random || (options.rng || rng)(); rnds[6] = rnds[6] & 15 | 64; rnds[8] = rnds[8] & 63 | 128; if (buf) { for (var ii = 0; ii < 16; ++ii) { buf[i + ii] = rnds[ii]; } } return buf || bytesToUuid(rnds); } module2.exports = v4; } }); // node_modules/request/lib/auth.js var require_auth = __commonJS({ "node_modules/request/lib/auth.js"(exports) { "use strict"; var caseless = require_caseless(); var uuid = require_v4(); var helpers = require_helpers(); var md5 = helpers.md5; var toBase64 = helpers.toBase64; function Auth(request2) { this.request = request2; this.hasAuth = false; this.sentAuth = false; this.bearerToken = null; this.user = null; this.pass = null; } Auth.prototype.basic = function(user, pass, sendImmediately) { var self2 = this; if (typeof user !== "string" || pass !== void 0 && typeof pass !== "string") { self2.request.emit("error", new Error("auth() received invalid user or password")); } self2.user = user; self2.pass = pass; self2.hasAuth = true; var header = user + ":" + (pass || ""); if (sendImmediately || typeof sendImmediately === "undefined") { var authHeader = "Basic " + toBase64(header); self2.sentAuth = true; return authHeader; } }; Auth.prototype.bearer = function(bearer, sendImmediately) { var self2 = this; self2.bearerToken = bearer; self2.hasAuth = true; if (sendImmediately || typeof sendImmediately === "undefined") { if (typeof bearer === "function") { bearer = bearer(); } var authHeader = "Bearer " + (bearer || ""); self2.sentAuth = true; return authHeader; } }; Auth.prototype.digest = function(method, path3, authHeader) { var self2 = this; var challenge = {}; var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi; while (true) { var match = re.exec(authHeader); if (!match) { break; } challenge[match[1]] = match[2] || match[3]; } var ha1Compute = function(algorithm, user, realm, pass, nonce, cnonce2) { var ha12 = md5(user + ":" + realm + ":" + pass); if (algorithm && algorithm.toLowerCase() === "md5-sess") { return md5(ha12 + ":" + nonce + ":" + cnonce2); } else { return ha12; } }; var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && "auth"; var nc = qop && "00000001"; var cnonce = qop && uuid().replace(/-/g, ""); var ha1 = ha1Compute(challenge.algorithm, self2.user, challenge.realm, self2.pass, challenge.nonce, cnonce); var ha2 = md5(method + ":" + path3); var digestResponse = qop ? md5(ha1 + ":" + challenge.nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + ha2) : md5(ha1 + ":" + challenge.nonce + ":" + ha2); var authValues = { username: self2.user, realm: challenge.realm, nonce: challenge.nonce, uri: path3, qop, response: digestResponse, nc, cnonce, algorithm: challenge.algorithm, opaque: challenge.opaque }; authHeader = []; for (var k in authValues) { if (authValues[k]) { if (k === "qop" || k === "nc" || k === "algorithm") { authHeader.push(k + "=" + authValues[k]); } else { authHeader.push(k + '="' + authValues[k] + '"'); } } } authHeader = "Digest " + authHeader.join(", "); self2.sentAuth = true; return authHeader; }; Auth.prototype.onRequest = function(user, pass, sendImmediately, bearer) { var self2 = this; var request2 = self2.request; var authHeader; if (bearer === void 0 && user === void 0) { self2.request.emit("error", new Error("no auth mechanism defined")); } else if (bearer !== void 0) { authHeader = self2.bearer(bearer, sendImmediately); } else { authHeader = self2.basic(user, pass, sendImmediately); } if (authHeader) { request2.setHeader("authorization", authHeader); } }; Auth.prototype.onResponse = function(response) { var self2 = this; var request2 = self2.request; if (!self2.hasAuth || self2.sentAuth) { return null; } var c = caseless(response.headers); var authHeader = c.get("www-authenticate"); var authVerb = authHeader && authHeader.split(" ")[0].toLowerCase(); request2.debug("reauth", authVerb); switch (authVerb) { case "basic": return self2.basic(self2.user, self2.pass, true); case "bearer": return self2.bearer(self2.bearerToken, true); case "digest": return self2.digest(request2.method, request2.path, authHeader); } }; exports.Auth = Auth; } }); // node_modules/oauth-sign/index.js var require_oauth_sign = __commonJS({ "node_modules/oauth-sign/index.js"(exports) { var crypto2 = require("crypto"); function sha(key, body, algorithm) { return crypto2.createHmac(algorithm, key).update(body).digest("base64"); } function rsa(key, body) { return crypto2.createSign("RSA-SHA1").update(body).sign(key, "base64"); } function rfc3986(str) { return encodeURIComponent(str).replace(/!/g, "%21").replace(/\*/g, "%2A").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/'/g, "%27"); } function map(obj) { var key, val, arr = []; for (key in obj) { val = obj[key]; if (Array.isArray(val)) for (var i = 0; i < val.length; i++) arr.push([key, val[i]]); else if (typeof val === "object") for (var prop in val) arr.push([key + "[" + prop + "]", val[prop]]); else arr.push([key, val]); } return arr; } function compare(a, b) { return a > b ? 1 : a < b ? -1 : 0; } function generateBase(httpMethod, base_uri, params) { var normalized = map(params).map(function(p) { return [rfc3986(p[0]), rfc3986(p[1] || "")]; }).sort(function(a, b) { return compare(a[0], b[0]) || compare(a[1], b[1]); }).map(function(p) { return p.join("="); }).join("&"); var base = [ rfc3986(httpMethod ? httpMethod.toUpperCase() : "GET"), rfc3986(base_uri), rfc3986(normalized) ].join("&"); return base; } function hmacsign(httpMethod, base_uri, params, consumer_secret, token_secret) { var base = generateBase(httpMethod, base_uri, params); var key = [ consumer_secret || "", token_secret || "" ].map(rfc3986).join("&"); return sha(key, base, "sha1"); } function hmacsign256(httpMethod, base_uri, params, consumer_secret, token_secret) { var base = generateBase(httpMethod, base_uri, params); var key = [ consumer_secret || "", token_secret || "" ].map(rfc3986).join("&"); return sha(key, base, "sha256"); } function rsasign(httpMethod, base_uri, params, private_key, token_secret) { var base = generateBase(httpMethod, base_uri, params); var key = private_key || ""; return rsa(key, base); } function plaintext(consumer_secret, token_secret) { var key = [ consumer_secret || "", token_secret || "" ].map(rfc3986).join("&"); return key; } function sign(signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) { var method; var skipArgs = 1; switch (signMethod) { case "RSA-SHA1": method = rsasign; break; case "HMAC-SHA1": method = hmacsign; break; case "HMAC-SHA256": method = hmacsign256; break; case "PLAINTEXT": method = plaintext; skipArgs = 4; break; default: throw new Error("Signature method not supported: " + signMethod); } return method.apply(null, [].slice.call(arguments, skipArgs)); } exports.hmacsign = hmacsign; exports.hmacsign256 = hmacsign256; exports.rsasign = rsasign; exports.plaintext = plaintext; exports.sign = sign; exports.rfc3986 = rfc3986; exports.generateBase = generateBase; } }); // node_modules/request/lib/oauth.js var require_oauth = __commonJS({ "node_modules/request/lib/oauth.js"(exports) { "use strict"; var url = require("url"); var qs = require_lib4(); var caseless = require_caseless(); var uuid = require_v4(); var oauth = require_oauth_sign(); var crypto2 = require("crypto"); var Buffer2 = require_safe_buffer().Buffer; function OAuth(request2) { this.request = request2; this.params = null; } OAuth.prototype.buildParams = function(_oauth, uri, method, query, form, qsLib) { var oa = {}; for (var i in _oauth) { oa["oauth_" + i] = _oauth[i]; } if (!oa.oauth_version) { oa.oauth_version = "1.0"; } if (!oa.oauth_timestamp) { oa.oauth_timestamp = Math.floor(Date.now() / 1e3).toString(); } if (!oa.oauth_nonce) { oa.oauth_nonce = uuid().replace(/-/g, ""); } if (!oa.oauth_signature_method) { oa.oauth_signature_method = "HMAC-SHA1"; } var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key; delete oa.oauth_consumer_secret; delete oa.oauth_private_key; var token_secret = oa.oauth_token_secret; delete oa.oauth_token_secret; var realm = oa.oauth_realm; delete oa.oauth_realm; delete oa.oauth_transport_method; var baseurl = uri.protocol + "//" + uri.host + uri.pathname; var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join("&")); oa.oauth_signature = oauth.sign(oa.oauth_signature_method, method, baseurl, params, consumer_secret_or_private_key, token_secret); if (realm) { oa.realm = realm; } return oa; }; OAuth.prototype.buildBodyHash = function(_oauth, body) { if (["HMAC-SHA1", "RSA-SHA1"].indexOf(_oauth.signature_method || "HMAC-SHA1") < 0) { this.request.emit("error", new Error("oauth: " + _oauth.signature_method + " signature_method not supported with body_hash signing.")); } var shasum = crypto2.createHash("sha1"); shasum.update(body || ""); var sha1 = shasum.digest("hex"); return Buffer2.from(sha1, "hex").toString("base64"); }; OAuth.prototype.concatParams = function(oa, sep, wrap) { wrap = wrap || ""; var params = Object.keys(oa).filter(function(i) { return i !== "realm" && i !== "oauth_signature"; }).sort(); if (oa.realm) { params.splice(0, 0, "realm"); } params.push("oauth_signature"); return params.map(function(i) { return i + "=" + wrap + oauth.rfc3986(oa[i]) + wrap; }).join(sep); }; OAuth.prototype.onRequest = function(_oauth) { var self2 = this; self2.params = _oauth; var uri = self2.request.uri || {}; var method = self2.request.method || ""; var headers = caseless(self2.request.headers); var body = self2.request.body || ""; var qsLib = self2.request.qsLib || qs; var form; var query; var contentType = headers.get("content-type") || ""; var formContentType = "application/x-www-form-urlencoded"; var transport = _oauth.transport_method || "header"; if (contentType.slice(0, formContentType.length) === formContentType) { contentType = formContentType; form = body; } if (uri.query) { query = uri.query; } if (transport === "body" && (method !== "POST" || contentType !== formContentType)) { self2.request.emit("error", new Error("oauth: transport_method of body requires POST and content-type " + formContentType)); } if (!form && typeof _oauth.body_hash === "boolean") { _oauth.body_hash = self2.buildBodyHash(_oauth, self2.request.body.toString()); } var oa = self2.buildParams(_oauth, uri, method, query, form, qsLib); switch (transport) { case "header": self2.request.setHeader("Authorization", "OAuth " + self2.concatParams(oa, ",", '"')); break; case "query": var href = self2.request.uri.href += (query ? "&" : "?") + self2.concatParams(oa, "&"); self2.request.uri = url.parse(href); self2.request.path = self2.request.uri.path; break; case "body": self2.request.body = (form ? form + "&" : "") + self2.concatParams(oa, "&"); break; default: self2.request.emit("error", new Error("oauth: transport_method invalid")); } }; exports.OAuth = OAuth; } }); // node_modules/request/lib/hawk.js var require_hawk = __commonJS({ "node_modules/request/lib/hawk.js"(exports) { "use strict"; var crypto2 = require("crypto"); function randomString(size) { var bits = (size + 1) * 6; var buffer = crypto2.randomBytes(Math.ceil(bits / 8)); var string = buffer.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, ""); return string.slice(0, size); } function calculatePayloadHash(payload, algorithm, contentType) { var hash = crypto2.createHash(algorithm); hash.update("hawk.1.payload\n"); hash.update((contentType ? contentType.split(";")[0].trim().toLowerCase() : "") + "\n"); hash.update(payload || ""); hash.update("\n"); return hash.digest("base64"); } exports.calculateMac = function(credentials, opts) { var normalized = "hawk.1.header\n" + opts.ts + "\n" + opts.nonce + "\n" + (opts.method || "").toUpperCase() + "\n" + opts.resource + "\n" + opts.host.toLowerCase() + "\n" + opts.port + "\n" + (opts.hash || "") + "\n"; if (opts.ext) { normalized = normalized + opts.ext.replace("\\", "\\\\").replace("\n", "\\n"); } normalized = normalized + "\n"; if (opts.app) { normalized = normalized + opts.app + "\n" + (opts.dlg || "") + "\n"; } var hmac = crypto2.createHmac(credentials.algorithm, credentials.key).update(normalized); var digest = hmac.digest("base64"); return digest; }; exports.header = function(uri, method, opts) { var timestamp = opts.timestamp || Math.floor((Date.now() + (opts.localtimeOffsetMsec || 0)) / 1e3); var credentials = opts.credentials; if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) { return ""; } if (["sha1", "sha256"].indexOf(credentials.algorithm) === -1) { return ""; } var artifacts = { ts: timestamp, nonce: opts.nonce || randomString(6), method, resource: uri.pathname + (uri.search || ""), host: uri.hostname, port: uri.port || (uri.protocol === "http:" ? 80 : 443), hash: opts.hash, ext: opts.ext, app: opts.app, dlg: opts.dlg }; if (!artifacts.hash && (opts.payload || opts.payload === "")) { artifacts.hash = calculatePayloadHash(opts.payload, credentials.algorithm, opts.contentType); } var mac = exports.calculateMac(credentials, artifacts); var hasExt = artifacts.ext !== null && artifacts.ext !== void 0 && artifacts.ext !== ""; var header = 'Hawk id="' + credentials.id + '", ts="' + artifacts.ts + '", nonce="' + artifacts.nonce + (artifacts.hash ? '", hash="' + artifacts.hash : "") + (hasExt ? '", ext="' + artifacts.ext.replace(/\\/g, "\\\\").replace(/"/g, '\\"') : "") + '", mac="' + mac + '"'; if (artifacts.app) { header = header + ', app="' + artifacts.app + (artifacts.dlg ? '", dlg="' + artifacts.dlg : "") + '"'; } return header; }; } }); // node_modules/delayed-stream/lib/delayed_stream.js var require_delayed_stream = __commonJS({ "node_modules/delayed-stream/lib/delayed_stream.js"(exports, module2) { var Stream = require("stream").Stream; var util = require("util"); module2.exports = DelayedStream; function DelayedStream() { this.source = null; this.dataSize = 0; this.maxDataSize = 1024 * 1024; this.pauseStream = true; this._maxDataSizeExceeded = false; this._released = false; this._bufferedEvents = []; } util.inherits(DelayedStream, Stream); DelayedStream.create = function(source, options) { var delayedStream = new this(); options = options || {}; for (var option in options) { delayedStream[option] = options[option]; } delayedStream.source = source; var realEmit = source.emit; source.emit = function() { delayedStream._handleEmit(arguments); return realEmit.apply(source, arguments); }; source.on("error", function() { }); if (delayedStream.pauseStream) { source.pause(); } return delayedStream; }; Object.defineProperty(DelayedStream.prototype, "readable", { configurable: true, enumerable: true, get: function() { return this.source.readable; } }); DelayedStream.prototype.setEncoding = function() { return this.source.setEncoding.apply(this.source, arguments); }; DelayedStream.prototype.resume = function() { if (!this._released) { this.release(); } this.source.resume(); }; DelayedStream.prototype.pause = function() { this.source.pause(); }; DelayedStream.prototype.release = function() { this._released = true; this._bufferedEvents.forEach(function(args) { this.emit.apply(this, args); }.bind(this)); this._bufferedEvents = []; }; DelayedStream.prototype.pipe = function() { var r = Stream.prototype.pipe.apply(this, arguments); this.resume(); return r; }; DelayedStream.prototype._handleEmit = function(args) { if (this._released) { this.emit.apply(this, args); return; } if (args[0] === "data") { this.dataSize += args[1].length; this._checkIfMaxDataSizeExceeded(); } this._bufferedEvents.push(args); }; DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { if (this._maxDataSizeExceeded) { return; } if (this.dataSize <= this.maxDataSize) { return; } this._maxDataSizeExceeded = true; var message = "DelayedStream#maxDataSize of " + this.maxDataSize + " bytes exceeded."; this.emit("error", new Error(message)); }; } }); // node_modules/combined-stream/lib/combined_stream.js var require_combined_stream = __commonJS({ "node_modules/combined-stream/lib/combined_stream.js"(exports, module2) { var util = require("util"); var Stream = require("stream").Stream; var DelayedStream = require_delayed_stream(); module2.exports = CombinedStream; function CombinedStream() { this.writable = false; this.readable = true; this.dataSize = 0; this.maxDataSize = 2 * 1024 * 1024; this.pauseStreams = true; this._released = false; this._streams = []; this._currentStream = null; this._insideLoop = false; this._pendingNext = false; } util.inherits(CombinedStream, Stream); CombinedStream.create = function(options) { var combinedStream = new this(); options = options || {}; for (var option in options) { combinedStream[option] = options[option]; } return combinedStream; }; CombinedStream.isStreamLike = function(stream) { return typeof stream !== "function" && typeof stream !== "string" && typeof stream !== "boolean" && typeof stream !== "number" && !Buffer.isBuffer(stream); }; CombinedStream.prototype.append = function(stream) { var isStreamLike = CombinedStream.isStreamLike(stream); if (isStreamLike) { if (!(stream instanceof DelayedStream)) { var newStream = DelayedStream.create(stream, { maxDataSize: Infinity, pauseStream: this.pauseStreams }); stream.on("data", this._checkDataSize.bind(this)); stream = newStream; } this._handleErrors(stream); if (this.pauseStreams) { stream.pause(); } } this._streams.push(stream); return this; }; CombinedStream.prototype.pipe = function(dest, options) { Stream.prototype.pipe.call(this, dest, options); this.resume(); return dest; }; CombinedStream.prototype._getNext = function() { this._currentStream = null; if (this._insideLoop) { this._pendingNext = true; return; } this._insideLoop = true; try { do { this._pendingNext = false; this._realGetNext(); } while (this._pendingNext); } finally { this._insideLoop = false; } }; CombinedStream.prototype._realGetNext = function() { var stream = this._streams.shift(); if (typeof stream == "undefined") { this.end(); return; } if (typeof stream !== "function") { this._pipeNext(stream); return; } var getStream = stream; getStream(function(stream2) { var isStreamLike = CombinedStream.isStreamLike(stream2); if (isStreamLike) { stream2.on("data", this._checkDataSize.bind(this)); this._handleErrors(stream2); } this._pipeNext(stream2); }.bind(this)); }; CombinedStream.prototype._pipeNext = function(stream) { this._currentStream = stream; var isStreamLike = CombinedStream.isStreamLike(stream); if (isStreamLike) { stream.on("end", this._getNext.bind(this)); stream.pipe(this, { end: false }); return; } var value = stream; this.write(value); this._getNext(); }; CombinedStream.prototype._handleErrors = function(stream) { var self2 = this; stream.on("error", function(err) { self2._emitError(err); }); }; CombinedStream.prototype.write = function(data) { this.emit("data", data); }; CombinedStream.prototype.pause = function() { if (!this.pauseStreams) { return; } if (this.pauseStreams && this._currentStream && typeof this._currentStream.pause == "function") this._currentStream.pause(); this.emit("pause"); }; CombinedStream.prototype.resume = function() { if (!this._released) { this._released = true; this.writable = true; this._getNext(); } if (this.pauseStreams && this._currentStream && typeof this._currentStream.resume == "function") this._currentStream.resume(); this.emit("resume"); }; CombinedStream.prototype.end = function() { this._reset(); this.emit("end"); }; CombinedStream.prototype.destroy = function() { this._reset(); this.emit("close"); }; CombinedStream.prototype._reset = function() { this.writable = false; this._streams = []; this._currentStream = null; }; CombinedStream.prototype._checkDataSize = function() { this._updateDataSize(); if (this.dataSize <= this.maxDataSize) { return; } var message = "DelayedStream#maxDataSize of " + this.maxDataSize + " bytes exceeded."; this._emitError(new Error(message)); }; CombinedStream.prototype._updateDataSize = function() { this.dataSize = 0; var self2 = this; this._streams.forEach(function(stream) { if (!stream.dataSize) { return; } self2.dataSize += stream.dataSize; }); if (this._currentStream && this._currentStream.dataSize) { this.dataSize += this._currentStream.dataSize; } }; CombinedStream.prototype._emitError = function(err) { this._reset(); this.emit("error", err); }; } }); // node_modules/request/lib/multipart.js var require_multipart = __commonJS({ "node_modules/request/lib/multipart.js"(exports) { "use strict"; var uuid = require_v4(); var CombinedStream = require_combined_stream(); var isstream = require_isstream(); var Buffer2 = require_safe_buffer().Buffer; function Multipart(request2) { this.request = request2; this.boundary = uuid(); this.chunked = false; this.body = null; } Multipart.prototype.isChunked = function(options) { var self2 = this; var chunked = false; var parts = options.data || options; if (!parts.forEach) { self2.request.emit("error", new Error("Argument error, options.multipart.")); } if (options.chunked !== void 0) { chunked = options.chunked; } if (self2.request.getHeader("transfer-encoding") === "chunked") { chunked = true; } if (!chunked) { parts.forEach(function(part) { if (typeof part.body === "undefined") { self2.request.emit("error", new Error("Body attribute missing in multipart.")); } if (isstream(part.body)) { chunked = true; } }); } return chunked; }; Multipart.prototype.setHeaders = function(chunked) { var self2 = this; if (chunked && !self2.request.hasHeader("transfer-encoding")) { self2.request.setHeader("transfer-encoding", "chunked"); } var header = self2.request.getHeader("content-type"); if (!header || header.indexOf("multipart") === -1) { self2.request.setHeader("content-type", "multipart/related; boundary=" + self2.boundary); } else { if (header.indexOf("boundary") !== -1) { self2.boundary = header.replace(/.*boundary=([^\s;]+).*/, "$1"); } else { self2.request.setHeader("content-type", header + "; boundary=" + self2.boundary); } } }; Multipart.prototype.build = function(parts, chunked) { var self2 = this; var body = chunked ? new CombinedStream() : []; function add(part) { if (typeof part === "number") { part = part.toString(); } return chunked ? body.append(part) : body.push(Buffer2.from(part)); } if (self2.request.preambleCRLF) { add("\r\n"); } parts.forEach(function(part) { var preamble = "--" + self2.boundary + "\r\n"; Object.keys(part).forEach(function(key) { if (key === "body") { return; } preamble += key + ": " + part[key] + "\r\n"; }); preamble += "\r\n"; add(preamble); add(part.body); add("\r\n"); }); add("--" + self2.boundary + "--"); if (self2.request.postambleCRLF) { add("\r\n"); } return body; }; Multipart.prototype.onRequest = function(options) { var self2 = this; var chunked = self2.isChunked(options); var parts = options.data || options; self2.setHeaders(chunked); self2.chunked = chunked; self2.body = self2.build(parts, chunked); }; exports.Multipart = Multipart; } }); // node_modules/request/lib/redirect.js var require_redirect = __commonJS({ "node_modules/request/lib/redirect.js"(exports) { "use strict"; var url = require("url"); var isUrl = /^https?:/; function Redirect(request2) { this.request = request2; this.followRedirect = true; this.followRedirects = true; this.followAllRedirects = false; this.followOriginalHttpMethod = false; this.allowRedirect = function() { return true; }; this.maxRedirects = 10; this.redirects = []; this.redirectsFollowed = 0; this.removeRefererHeader = false; } Redirect.prototype.onRequest = function(options) { var self2 = this; if (options.maxRedirects !== void 0) { self2.maxRedirects = options.maxRedirects; } if (typeof options.followRedirect === "function") { self2.allowRedirect = options.followRedirect; } if (options.followRedirect !== void 0) { self2.followRedirects = !!options.followRedirect; } if (options.followAllRedirects !== void 0) { self2.followAllRedirects = options.followAllRedirects; } if (self2.followRedirects || self2.followAllRedirects) { self2.redirects = self2.redirects || []; } if (options.removeRefererHeader !== void 0) { self2.removeRefererHeader = options.removeRefererHeader; } if (options.followOriginalHttpMethod !== void 0) { self2.followOriginalHttpMethod = options.followOriginalHttpMethod; } }; Redirect.prototype.redirectTo = function(response) { var self2 = this; var request2 = self2.request; var redirectTo = null; if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has("location")) { var location = response.caseless.get("location"); request2.debug("redirect", location); if (self2.followAllRedirects) { redirectTo = location; } else if (self2.followRedirects) { switch (request2.method) { case "PATCH": case "PUT": case "POST": case "DELETE": break; default: redirectTo = location; break; } } } else if (response.statusCode === 401) { var authHeader = request2._auth.onResponse(response); if (authHeader) { request2.setHeader("authorization", authHeader); redirectTo = request2.uri; } } return redirectTo; }; Redirect.prototype.onResponse = function(response) { var self2 = this; var request2 = self2.request; var redirectTo = self2.redirectTo(response); if (!redirectTo || !self2.allowRedirect.call(request2, response)) { return false; } request2.debug("redirect to", redirectTo); if (response.resume) { response.resume(); } if (self2.redirectsFollowed >= self2.maxRedirects) { request2.emit("error", new Error("Exceeded maxRedirects. Probably stuck in a redirect loop " + request2.uri.href)); return false; } self2.redirectsFollowed += 1; if (!isUrl.test(redirectTo)) { redirectTo = url.resolve(request2.uri.href, redirectTo); } var uriPrev = request2.uri; request2.uri = url.parse(redirectTo); if (request2.uri.protocol !== uriPrev.protocol) { delete request2.agent; } self2.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo }); if (self2.followAllRedirects && request2.method !== "HEAD" && response.statusCode !== 401 && response.statusCode !== 307) { request2.method = self2.followOriginalHttpMethod ? request2.method : "GET"; } delete request2.src; delete request2.req; delete request2._started; if (response.statusCode !== 401 && response.statusCode !== 307) { delete request2.body; delete request2._form; if (request2.headers) { request2.removeHeader("host"); request2.removeHeader("content-type"); request2.removeHeader("content-length"); if (request2.uri.hostname !== request2.originalHost.split(":")[0]) { request2.removeHeader("authorization"); } } } if (!self2.removeRefererHeader) { request2.setHeader("referer", uriPrev.href); } request2.emit("redirect"); request2.init(); return true; }; exports.Redirect = Redirect; } }); // node_modules/tunnel-agent/index.js var require_tunnel_agent = __commonJS({ "node_modules/tunnel-agent/index.js"(exports) { "use strict"; var net = require("net"); var tls = require("tls"); var http = require("http"); var https = require("https"); var events = require("events"); var assert = require("assert"); var util = require("util"); var Buffer2 = require_safe_buffer().Buffer; exports.httpOverHttp = httpOverHttp; exports.httpsOverHttp = httpsOverHttp; exports.httpOverHttps = httpOverHttps; exports.httpsOverHttps = httpsOverHttps; function httpOverHttp(options) { var agent = new TunnelingAgent(options); agent.request = http.request; return agent; } function httpsOverHttp(options) { var agent = new TunnelingAgent(options); agent.request = http.request; agent.createSocket = createSecureSocket; agent.defaultPort = 443; return agent; } function httpOverHttps(options) { var agent = new TunnelingAgent(options); agent.request = https.request; return agent; } function httpsOverHttps(options) { var agent = new TunnelingAgent(options); agent.request = https.request; agent.createSocket = createSecureSocket; agent.defaultPort = 443; return agent; } function TunnelingAgent(options) { var self2 = this; self2.options = options || {}; self2.proxyOptions = self2.options.proxy || {}; self2.maxSockets = self2.options.maxSockets || http.Agent.defaultMaxSockets; self2.requests = []; self2.sockets = []; self2.on("free", function onFree(socket, host, port) { for (var i = 0, len = self2.requests.length; i < len; ++i) { var pending = self2.requests[i]; if (pending.host === host && pending.port === port) { self2.requests.splice(i, 1); pending.request.onSocket(socket); return; } } socket.destroy(); self2.removeSocket(socket); }); } util.inherits(TunnelingAgent, events.EventEmitter); TunnelingAgent.prototype.addRequest = function addRequest(req, options) { var self2 = this; if (typeof options === "string") { options = { host: options, port: arguments[2], path: arguments[3] }; } if (self2.sockets.length >= this.maxSockets) { self2.requests.push({ host: options.host, port: options.port, request: req }); return; } self2.createConnection({ host: options.host, port: options.port, request: req }); }; TunnelingAgent.prototype.createConnection = function createConnection(pending) { var self2 = this; self2.createSocket(pending, function(socket) { socket.on("free", onFree); socket.on("close", onCloseOrRemove); socket.on("agentRemove", onCloseOrRemove); pending.request.onSocket(socket); function onFree() { self2.emit("free", socket, pending.host, pending.port); } function onCloseOrRemove(err) { self2.removeSocket(socket); socket.removeListener("free", onFree); socket.removeListener("close", onCloseOrRemove); socket.removeListener("agentRemove", onCloseOrRemove); } }); }; TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { var self2 = this; var placeholder = {}; self2.sockets.push(placeholder); var connectOptions = mergeOptions({}, self2.proxyOptions, { method: "CONNECT", path: options.host + ":" + options.port, agent: false }); if (connectOptions.proxyAuth) { connectOptions.headers = connectOptions.headers || {}; connectOptions.headers["Proxy-Authorization"] = "Basic " + Buffer2.from(connectOptions.proxyAuth).toString("base64"); } debug("making CONNECT request"); var connectReq = self2.request(connectOptions); connectReq.useChunkedEncodingByDefault = false; connectReq.once("response", onResponse); connectReq.once("upgrade", onUpgrade); connectReq.once("connect", onConnect); connectReq.once("error", onError); connectReq.end(); function onResponse(res) { res.upgrade = true; } function onUpgrade(res, socket, head) { process.nextTick(function() { onConnect(res, socket, head); }); } function onConnect(res, socket, head) { connectReq.removeAllListeners(); socket.removeAllListeners(); if (res.statusCode === 200) { assert.equal(head.length, 0); debug("tunneling connection has established"); self2.sockets[self2.sockets.indexOf(placeholder)] = socket; cb(socket); } else { debug("tunneling socket could not be established, statusCode=%d", res.statusCode); var error = new Error("tunneling socket could not be established, statusCode=" + res.statusCode); error.code = "ECONNRESET"; options.request.emit("error", error); self2.removeSocket(placeholder); } } function onError(cause) { connectReq.removeAllListeners(); debug("tunneling socket could not be established, cause=%s\n", cause.message, cause.stack); var error = new Error("tunneling socket could not be established, cause=" + cause.message); error.code = "ECONNRESET"; options.request.emit("error", error); self2.removeSocket(placeholder); } }; TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { var pos = this.sockets.indexOf(socket); if (pos === -1) return; this.sockets.splice(pos, 1); var pending = this.requests.shift(); if (pending) { this.createConnection(pending); } }; function createSecureSocket(options, cb) { var self2 = this; TunnelingAgent.prototype.createSocket.call(self2, options, function(socket) { var secureSocket = tls.connect(0, mergeOptions({}, self2.options, { servername: options.host, socket })); self2.sockets[self2.sockets.indexOf(socket)] = secureSocket; cb(secureSocket); }); } function mergeOptions(target) { for (var i = 1, len = arguments.length; i < len; ++i) { var overrides = arguments[i]; if (typeof overrides === "object") { var keys = Object.keys(overrides); for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { var k = keys[j]; if (overrides[k] !== void 0) { target[k] = overrides[k]; } } } } return target; } var debug; if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { debug = function() { var args = Array.prototype.slice.call(arguments); if (typeof args[0] === "string") { args[0] = "TUNNEL: " + args[0]; } else { args.unshift("TUNNEL:"); } console.error.apply(console, args); }; } else { debug = function() { }; } exports.debug = debug; } }); // node_modules/request/lib/tunnel.js var require_tunnel = __commonJS({ "node_modules/request/lib/tunnel.js"(exports) { "use strict"; var url = require("url"); var tunnel = require_tunnel_agent(); var defaultProxyHeaderWhiteList = [ "accept", "accept-charset", "accept-encoding", "accept-language", "accept-ranges", "cache-control", "content-encoding", "content-language", "content-location", "content-md5", "content-range", "content-type", "connection", "date", "expect", "max-forwards", "pragma", "referer", "te", "user-agent", "via" ]; var defaultProxyHeaderExclusiveList = [ "proxy-authorization" ]; function constructProxyHost(uriObject) { var port = uriObject.port; var protocol = uriObject.protocol; var proxyHost = uriObject.hostname + ":"; if (port) { proxyHost += port; } else if (protocol === "https:") { proxyHost += "443"; } else { proxyHost += "80"; } return proxyHost; } function constructProxyHeaderWhiteList(headers, proxyHeaderWhiteList) { var whiteList = proxyHeaderWhiteList.reduce(function(set, header) { set[header.toLowerCase()] = true; return set; }, {}); return Object.keys(headers).filter(function(header) { return whiteList[header.toLowerCase()]; }).reduce(function(set, header) { set[header] = headers[header]; return set; }, {}); } function constructTunnelOptions(request2, proxyHeaders) { var proxy = request2.proxy; var tunnelOptions = { proxy: { host: proxy.hostname, port: +proxy.port, proxyAuth: proxy.auth, headers: proxyHeaders }, headers: request2.headers, ca: request2.ca, cert: request2.cert, key: request2.key, passphrase: request2.passphrase, pfx: request2.pfx, ciphers: request2.ciphers, rejectUnauthorized: request2.rejectUnauthorized, secureOptions: request2.secureOptions, secureProtocol: request2.secureProtocol }; return tunnelOptions; } function constructTunnelFnName(uri, proxy) { var uriProtocol = uri.protocol === "https:" ? "https" : "http"; var proxyProtocol = proxy.protocol === "https:" ? "Https" : "Http"; return [uriProtocol, proxyProtocol].join("Over"); } function getTunnelFn(request2) { var uri = request2.uri; var proxy = request2.proxy; var tunnelFnName = constructTunnelFnName(uri, proxy); return tunnel[tunnelFnName]; } function Tunnel(request2) { this.request = request2; this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList; this.proxyHeaderExclusiveList = []; if (typeof request2.tunnel !== "undefined") { this.tunnelOverride = request2.tunnel; } } Tunnel.prototype.isEnabled = function() { var self2 = this; var request2 = self2.request; if (typeof self2.tunnelOverride !== "undefined") { return self2.tunnelOverride; } if (request2.uri.protocol === "https:") { return true; } return false; }; Tunnel.prototype.setup = function(options) { var self2 = this; var request2 = self2.request; options = options || {}; if (typeof request2.proxy === "string") { request2.proxy = url.parse(request2.proxy); } if (!request2.proxy || !request2.tunnel) { return false; } if (options.proxyHeaderWhiteList) { self2.proxyHeaderWhiteList = options.proxyHeaderWhiteList; } if (options.proxyHeaderExclusiveList) { self2.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList; } var proxyHeaderExclusiveList = self2.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList); var proxyHeaderWhiteList = self2.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList); var proxyHeaders = constructProxyHeaderWhiteList(request2.headers, proxyHeaderWhiteList); proxyHeaders.host = constructProxyHost(request2.uri); proxyHeaderExclusiveList.forEach(request2.removeHeader, request2); var tunnelFn = getTunnelFn(request2); var tunnelOptions = constructTunnelOptions(request2, proxyHeaders); request2.agent = tunnelFn(tunnelOptions); return true; }; Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList; Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList; exports.Tunnel = Tunnel; } }); // node_modules/performance-now/lib/performance-now.js var require_performance_now = __commonJS({ "node_modules/performance-now/lib/performance-now.js"(exports, module2) { (function() { var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime; if (typeof performance !== "undefined" && performance !== null && performance.now) { module2.exports = function() { return performance.now(); }; } else if (typeof process !== "undefined" && process !== null && process.hrtime) { module2.exports = function() { return (getNanoSeconds() - nodeLoadTime) / 1e6; }; hrtime = process.hrtime; getNanoSeconds = function() { var hr; hr = hrtime(); return hr[0] * 1e9 + hr[1]; }; moduleLoadTime = getNanoSeconds(); upTime = process.uptime() * 1e9; nodeLoadTime = moduleLoadTime - upTime; } else if (Date.now) { module2.exports = function() { return Date.now() - loadTime; }; loadTime = Date.now(); } else { module2.exports = function() { return new Date().getTime() - loadTime; }; loadTime = new Date().getTime(); } }).call(exports); } }); // node_modules/request/request.js var require_request2 = __commonJS({ "node_modules/request/request.js"(exports, module2) { "use strict"; var http = require("http"); var https = require("https"); var url = require("url"); var util = require("util"); var stream = require("stream"); var zlib = require("zlib"); var aws2 = require_aws_sign2(); var aws4 = require_aws4(); var httpSignature = require_lib3(); var mime = require_mime_types(); var caseless = require_caseless(); var ForeverAgent = require_forever_agent(); var FormData = require_browser(); var extend = require_extend(); var isstream = require_isstream(); var isTypedArray = require_is_typedarray().strict; var helpers = require_helpers(); var cookies = require_cookies(); var getProxyFromURI = require_getProxyFromURI(); var Querystring = require_querystring().Querystring; var Har = require_har2().Har; var Auth = require_auth().Auth; var OAuth = require_oauth().OAuth; var hawk = require_hawk(); var Multipart = require_multipart().Multipart; var Redirect = require_redirect().Redirect; var Tunnel = require_tunnel().Tunnel; var now = require_performance_now(); var Buffer2 = require_safe_buffer().Buffer; var safeStringify = helpers.safeStringify; var isReadStream = helpers.isReadStream; var toBase64 = helpers.toBase64; var defer = helpers.defer; var copy = helpers.copy; var version = helpers.version; var globalCookieJar = cookies.jar(); var globalPool = {}; function filterForNonReserved(reserved, options) { var object = {}; for (var i in options) { var notReserved = reserved.indexOf(i) === -1; if (notReserved) { object[i] = options[i]; } } return object; } function filterOutReservedFunctions(reserved, options) { var object = {}; for (var i in options) { var isReserved = !(reserved.indexOf(i) === -1); var isFunction = typeof options[i] === "function"; if (!(isReserved && isFunction)) { object[i] = options[i]; } } return object; } function requestToJSON() { var self2 = this; return { uri: self2.uri, method: self2.method, headers: self2.headers }; } function responseToJSON() { var self2 = this; return { statusCode: self2.statusCode, body: self2.body, headers: self2.headers, request: requestToJSON.call(self2.request) }; } function Request(options) { var self2 = this; if (options.har) { self2._har = new Har(self2); options = self2._har.options(options); } stream.Stream.call(self2); var reserved = Object.keys(Request.prototype); var nonReserved = filterForNonReserved(reserved, options); extend(self2, nonReserved); options = filterOutReservedFunctions(reserved, options); self2.readable = true; self2.writable = true; if (options.method) { self2.explicitMethod = true; } self2._qs = new Querystring(self2); self2._auth = new Auth(self2); self2._oauth = new OAuth(self2); self2._multipart = new Multipart(self2); self2._redirect = new Redirect(self2); self2._tunnel = new Tunnel(self2); self2.init(options); } util.inherits(Request, stream.Stream); Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG); function debug() { if (Request.debug) { console.error("REQUEST %s", util.format.apply(util, arguments)); } } Request.prototype.debug = debug; Request.prototype.init = function(options) { var self2 = this; if (!options) { options = {}; } self2.headers = self2.headers ? copy(self2.headers) : {}; for (var headerName in self2.headers) { if (typeof self2.headers[headerName] === "undefined") { delete self2.headers[headerName]; } } caseless.httpify(self2, self2.headers); if (!self2.method) { self2.method = options.method || "GET"; } if (!self2.localAddress) { self2.localAddress = options.localAddress; } self2._qs.init(options); debug(options); if (!self2.pool && self2.pool !== false) { self2.pool = globalPool; } self2.dests = self2.dests || []; self2.__isRequestRequest = true; if (!self2._callback && self2.callback) { self2._callback = self2.callback; self2.callback = function() { if (self2._callbackCalled) { return; } self2._callbackCalled = true; self2._callback.apply(self2, arguments); }; self2.on("error", self2.callback.bind()); self2.on("complete", self2.callback.bind(self2, null)); } if (!self2.uri && self2.url) { self2.uri = self2.url; delete self2.url; } if (self2.baseUrl) { if (typeof self2.baseUrl !== "string") { return self2.emit("error", new Error("options.baseUrl must be a string")); } if (typeof self2.uri !== "string") { return self2.emit("error", new Error("options.uri must be a string when using options.baseUrl")); } if (self2.uri.indexOf("//") === 0 || self2.uri.indexOf("://") !== -1) { return self2.emit("error", new Error("options.uri must be a path when using options.baseUrl")); } var baseUrlEndsWithSlash = self2.baseUrl.lastIndexOf("/") === self2.baseUrl.length - 1; var uriStartsWithSlash = self2.uri.indexOf("/") === 0; if (baseUrlEndsWithSlash && uriStartsWithSlash) { self2.uri = self2.baseUrl + self2.uri.slice(1); } else if (baseUrlEndsWithSlash || uriStartsWithSlash) { self2.uri = self2.baseUrl + self2.uri; } else if (self2.uri === "") { self2.uri = self2.baseUrl; } else { self2.uri = self2.baseUrl + "/" + self2.uri; } delete self2.baseUrl; } if (!self2.uri) { return self2.emit("error", new Error("options.uri is a required argument")); } if (typeof self2.uri === "string") { self2.uri = url.parse(self2.uri); } if (!self2.uri.href) { self2.uri.href = url.format(self2.uri); } if (self2.uri.protocol === "unix:") { return self2.emit("error", new Error("`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`")); } if (self2.uri.host === "unix") { self2.enableUnixSocket(); } if (self2.strictSSL === false) { self2.rejectUnauthorized = false; } if (!self2.uri.pathname) { self2.uri.pathname = "/"; } if (!(self2.uri.host || self2.uri.hostname && self2.uri.port) && !self2.uri.isUnix) { var faultyUri = url.format(self2.uri); var message = 'Invalid URI "' + faultyUri + '"'; if (Object.keys(options).length === 0) { message += ". This can be caused by a crappy redirection."; } self2.abort(); return self2.emit("error", new Error(message)); } if (!self2.hasOwnProperty("proxy")) { self2.proxy = getProxyFromURI(self2.uri); } self2.tunnel = self2._tunnel.isEnabled(); if (self2.proxy) { self2._tunnel.setup(options); } self2._redirect.onRequest(options); self2.setHost = false; if (!self2.hasHeader("host")) { var hostHeaderName = self2.originalHostHeaderName || "host"; self2.setHeader(hostHeaderName, self2.uri.host); if (self2.uri.port) { if (self2.uri.port === "80" && self2.uri.protocol === "http:" || self2.uri.port === "443" && self2.uri.protocol === "https:") { self2.setHeader(hostHeaderName, self2.uri.hostname); } } self2.setHost = true; } self2.jar(self2._jar || options.jar); if (!self2.uri.port) { if (self2.uri.protocol === "http:") { self2.uri.port = 80; } else if (self2.uri.protocol === "https:") { self2.uri.port = 443; } } if (self2.proxy && !self2.tunnel) { self2.port = self2.proxy.port; self2.host = self2.proxy.hostname; } else { self2.port = self2.uri.port; self2.host = self2.uri.hostname; } if (options.form) { self2.form(options.form); } if (options.formData) { var formData = options.formData; var requestForm = self2.form(); var appendFormValue = function(key, value) { if (value && value.hasOwnProperty("value") && value.hasOwnProperty("options")) { requestForm.append(key, value.value, value.options); } else { requestForm.append(key, value); } }; for (var formKey in formData) { if (formData.hasOwnProperty(formKey)) { var formValue = formData[formKey]; if (formValue instanceof Array) { for (var j = 0; j < formValue.length; j++) { appendFormValue(formKey, formValue[j]); } } else { appendFormValue(formKey, formValue); } } } } if (options.qs) { self2.qs(options.qs); } if (self2.uri.path) { self2.path = self2.uri.path; } else { self2.path = self2.uri.pathname + (self2.uri.search || ""); } if (self2.path.length === 0) { self2.path = "/"; } if (options.aws) { self2.aws(options.aws); } if (options.hawk) { self2.hawk(options.hawk); } if (options.httpSignature) { self2.httpSignature(options.httpSignature); } if (options.auth) { if (Object.prototype.hasOwnProperty.call(options.auth, "username")) { options.auth.user = options.auth.username; } if (Object.prototype.hasOwnProperty.call(options.auth, "password")) { options.auth.pass = options.auth.password; } self2.auth(options.auth.user, options.auth.pass, options.auth.sendImmediately, options.auth.bearer); } if (self2.gzip && !self2.hasHeader("accept-encoding")) { self2.setHeader("accept-encoding", "gzip, deflate"); } if (self2.uri.auth && !self2.hasHeader("authorization")) { var uriAuthPieces = self2.uri.auth.split(":").map(function(item) { return self2._qs.unescape(item); }); self2.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(":"), true); } if (!self2.tunnel && self2.proxy && self2.proxy.auth && !self2.hasHeader("proxy-authorization")) { var proxyAuthPieces = self2.proxy.auth.split(":").map(function(item) { return self2._qs.unescape(item); }); var authHeader = "Basic " + toBase64(proxyAuthPieces.join(":")); self2.setHeader("proxy-authorization", authHeader); } if (self2.proxy && !self2.tunnel) { self2.path = self2.uri.protocol + "//" + self2.uri.host + self2.path; } if (options.json) { self2.json(options.json); } if (options.multipart) { self2.multipart(options.multipart); } if (options.time) { self2.timing = true; self2.elapsedTime = self2.elapsedTime || 0; } function setContentLength() { if (isTypedArray(self2.body)) { self2.body = Buffer2.from(self2.body); } if (!self2.hasHeader("content-length")) { var length; if (typeof self2.body === "string") { length = Buffer2.byteLength(self2.body); } else if (Array.isArray(self2.body)) { length = self2.body.reduce(function(a, b) { return a + b.length; }, 0); } else { length = self2.body.length; } if (length) { self2.setHeader("content-length", length); } else { self2.emit("error", new Error("Argument error, options.body.")); } } } if (self2.body && !isstream(self2.body)) { setContentLength(); } if (options.oauth) { self2.oauth(options.oauth); } else if (self2._oauth.params && self2.hasHeader("authorization")) { self2.oauth(self2._oauth.params); } var protocol = self2.proxy && !self2.tunnel ? self2.proxy.protocol : self2.uri.protocol; var defaultModules = { "http:": http, "https:": https }; var httpModules = self2.httpModules || {}; self2.httpModule = httpModules[protocol] || defaultModules[protocol]; if (!self2.httpModule) { return self2.emit("error", new Error("Invalid protocol: " + protocol)); } if (options.ca) { self2.ca = options.ca; } if (!self2.agent) { if (options.agentOptions) { self2.agentOptions = options.agentOptions; } if (options.agentClass) { self2.agentClass = options.agentClass; } else if (options.forever) { var v = version(); if (v.major === 0 && v.minor <= 10) { self2.agentClass = protocol === "http:" ? ForeverAgent : ForeverAgent.SSL; } else { self2.agentClass = self2.httpModule.Agent; self2.agentOptions = self2.agentOptions || {}; self2.agentOptions.keepAlive = true; } } else { self2.agentClass = self2.httpModule.Agent; } } if (self2.pool === false) { self2.agent = false; } else { self2.agent = self2.agent || self2.getNewAgent(); } self2.on("pipe", function(src) { if (self2.ntick && self2._started) { self2.emit("error", new Error("You cannot pipe to this stream after the outbound request has started.")); } self2.src = src; if (isReadStream(src)) { if (!self2.hasHeader("content-type")) { self2.setHeader("content-type", mime.lookup(src.path)); } } else { if (src.headers) { for (var i in src.headers) { if (!self2.hasHeader(i)) { self2.setHeader(i, src.headers[i]); } } } if (self2._json && !self2.hasHeader("content-type")) { self2.setHeader("content-type", "application/json"); } if (src.method && !self2.explicitMethod) { self2.method = src.method; } } }); defer(function() { if (self2._aborted) { return; } var end = function() { if (self2._form) { if (!self2._auth.hasAuth) { self2._form.pipe(self2); } else if (self2._auth.hasAuth && self2._auth.sentAuth) { self2._form.pipe(self2); } } if (self2._multipart && self2._multipart.chunked) { self2._multipart.body.pipe(self2); } if (self2.body) { if (isstream(self2.body)) { self2.body.pipe(self2); } else { setContentLength(); if (Array.isArray(self2.body)) { self2.body.forEach(function(part) { self2.write(part); }); } else { self2.write(self2.body); } self2.end(); } } else if (self2.requestBodyStream) { console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe."); self2.requestBodyStream.pipe(self2); } else if (!self2.src) { if (self2._auth.hasAuth && !self2._auth.sentAuth) { self2.end(); return; } if (self2.method !== "GET" && typeof self2.method !== "undefined") { self2.setHeader("content-length", 0); } self2.end(); } }; if (self2._form && !self2.hasHeader("content-length")) { self2.setHeader(self2._form.getHeaders(), true); self2._form.getLength(function(err, length) { if (!err && !isNaN(length)) { self2.setHeader("content-length", length); } end(); }); } else { end(); } self2.ntick = true; }); }; Request.prototype.getNewAgent = function() { var self2 = this; var Agent = self2.agentClass; var options = {}; if (self2.agentOptions) { for (var i in self2.agentOptions) { options[i] = self2.agentOptions[i]; } } if (self2.ca) { options.ca = self2.ca; } if (self2.ciphers) { options.ciphers = self2.ciphers; } if (self2.secureProtocol) { options.secureProtocol = self2.secureProtocol; } if (self2.secureOptions) { options.secureOptions = self2.secureOptions; } if (typeof self2.rejectUnauthorized !== "undefined") { options.rejectUnauthorized = self2.rejectUnauthorized; } if (self2.cert && self2.key) { options.key = self2.key; options.cert = self2.cert; } if (self2.pfx) { options.pfx = self2.pfx; } if (self2.passphrase) { options.passphrase = self2.passphrase; } var poolKey = ""; if (Agent !== self2.httpModule.Agent) { poolKey += Agent.name; } var proxy = self2.proxy; if (typeof proxy === "string") { proxy = url.parse(proxy); } var isHttps = proxy && proxy.protocol === "https:" || this.uri.protocol === "https:"; if (isHttps) { if (options.ca) { if (poolKey) { poolKey += ":"; } poolKey += options.ca; } if (typeof options.rejectUnauthorized !== "undefined") { if (poolKey) { poolKey += ":"; } poolKey += options.rejectUnauthorized; } if (options.cert) { if (poolKey) { poolKey += ":"; } poolKey += options.cert.toString("ascii") + options.key.toString("ascii"); } if (options.pfx) { if (poolKey) { poolKey += ":"; } poolKey += options.pfx.toString("ascii"); } if (options.ciphers) { if (poolKey) { poolKey += ":"; } poolKey += options.ciphers; } if (options.secureProtocol) { if (poolKey) { poolKey += ":"; } poolKey += options.secureProtocol; } if (options.secureOptions) { if (poolKey) { poolKey += ":"; } poolKey += options.secureOptions; } } if (self2.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self2.httpModule.globalAgent) { return self2.httpModule.globalAgent; } poolKey = self2.uri.protocol + poolKey; if (!self2.pool[poolKey]) { self2.pool[poolKey] = new Agent(options); if (self2.pool.maxSockets) { self2.pool[poolKey].maxSockets = self2.pool.maxSockets; } } return self2.pool[poolKey]; }; Request.prototype.start = function() { var self2 = this; if (self2.timing) { var startTime = new Date().getTime(); var startTimeNow = now(); } if (self2._aborted) { return; } self2._started = true; self2.method = self2.method || "GET"; self2.href = self2.uri.href; if (self2.src && self2.src.stat && self2.src.stat.size && !self2.hasHeader("content-length")) { self2.setHeader("content-length", self2.src.stat.size); } if (self2._aws) { self2.aws(self2._aws, true); } var reqOptions = copy(self2); delete reqOptions.auth; debug("make request", self2.uri.href); delete reqOptions.timeout; try { self2.req = self2.httpModule.request(reqOptions); } catch (err) { self2.emit("error", err); return; } if (self2.timing) { self2.startTime = startTime; self2.startTimeNow = startTimeNow; self2.timings = {}; } var timeout; if (self2.timeout && !self2.timeoutTimer) { if (self2.timeout < 0) { timeout = 0; } else if (typeof self2.timeout === "number" && isFinite(self2.timeout)) { timeout = self2.timeout; } } self2.req.on("response", self2.onRequestResponse.bind(self2)); self2.req.on("error", self2.onRequestError.bind(self2)); self2.req.on("drain", function() { self2.emit("drain"); }); self2.req.on("socket", function(socket) { var isConnecting = socket._connecting || socket.connecting; if (self2.timing) { self2.timings.socket = now() - self2.startTimeNow; if (isConnecting) { var onLookupTiming = function() { self2.timings.lookup = now() - self2.startTimeNow; }; var onConnectTiming = function() { self2.timings.connect = now() - self2.startTimeNow; }; socket.once("lookup", onLookupTiming); socket.once("connect", onConnectTiming); self2.req.once("error", function() { socket.removeListener("lookup", onLookupTiming); socket.removeListener("connect", onConnectTiming); }); } } var setReqTimeout = function() { self2.req.setTimeout(timeout, function() { if (self2.req) { self2.abort(); var e = new Error("ESOCKETTIMEDOUT"); e.code = "ESOCKETTIMEDOUT"; e.connect = false; self2.emit("error", e); } }); }; if (timeout !== void 0) { if (isConnecting) { var onReqSockConnect = function() { socket.removeListener("connect", onReqSockConnect); self2.clearTimeout(); setReqTimeout(); }; socket.on("connect", onReqSockConnect); self2.req.on("error", function(err) { socket.removeListener("connect", onReqSockConnect); }); self2.timeoutTimer = setTimeout(function() { socket.removeListener("connect", onReqSockConnect); self2.abort(); var e = new Error("ETIMEDOUT"); e.code = "ETIMEDOUT"; e.connect = true; self2.emit("error", e); }, timeout); } else { setReqTimeout(); } } self2.emit("socket", socket); }); self2.emit("request", self2.req); }; Request.prototype.onRequestError = function(error) { var self2 = this; if (self2._aborted) { return; } if (self2.req && self2.req._reusedSocket && error.code === "ECONNRESET" && self2.agent.addRequestNoreuse) { self2.agent = { addRequest: self2.agent.addRequestNoreuse.bind(self2.agent) }; self2.start(); self2.req.end(); return; } self2.clearTimeout(); self2.emit("error", error); }; Request.prototype.onRequestResponse = function(response) { var self2 = this; if (self2.timing) { self2.timings.response = now() - self2.startTimeNow; } debug("onRequestResponse", self2.uri.href, response.statusCode, response.headers); response.on("end", function() { if (self2.timing) { self2.timings.end = now() - self2.startTimeNow; response.timingStart = self2.startTime; if (!self2.timings.socket) { self2.timings.socket = 0; } if (!self2.timings.lookup) { self2.timings.lookup = self2.timings.socket; } if (!self2.timings.connect) { self2.timings.connect = self2.timings.lookup; } if (!self2.timings.response) { self2.timings.response = self2.timings.connect; } debug("elapsed time", self2.timings.end); self2.elapsedTime += Math.round(self2.timings.end); response.elapsedTime = self2.elapsedTime; response.timings = self2.timings; response.timingPhases = { wait: self2.timings.socket, dns: self2.timings.lookup - self2.timings.socket, tcp: self2.timings.connect - self2.timings.lookup, firstByte: self2.timings.response - self2.timings.connect, download: self2.timings.end - self2.timings.response, total: self2.timings.end }; } debug("response end", self2.uri.href, response.statusCode, response.headers); }); if (self2._aborted) { debug("aborted", self2.uri.href); response.resume(); return; } self2.response = response; response.request = self2; response.toJSON = responseToJSON; if (self2.httpModule === https && self2.strictSSL && (!response.hasOwnProperty("socket") || !response.socket.authorized)) { debug("strict ssl error", self2.uri.href); var sslErr = response.hasOwnProperty("socket") ? response.socket.authorizationError : self2.uri.href + " does not support SSL"; self2.emit("error", new Error("SSL Error: " + sslErr)); return; } self2.originalHost = self2.getHeader("host"); if (!self2.originalHostHeaderName) { self2.originalHostHeaderName = self2.hasHeader("host"); } if (self2.setHost) { self2.removeHeader("host"); } self2.clearTimeout(); var targetCookieJar = self2._jar && self2._jar.setCookie ? self2._jar : globalCookieJar; var addCookie = function(cookie) { try { targetCookieJar.setCookie(cookie, self2.uri.href, { ignoreError: true }); } catch (e) { self2.emit("error", e); } }; response.caseless = caseless(response.headers); if (response.caseless.has("set-cookie") && !self2._disableCookies) { var headerName = response.caseless.has("set-cookie"); if (Array.isArray(response.headers[headerName])) { response.headers[headerName].forEach(addCookie); } else { addCookie(response.headers[headerName]); } } if (self2._redirect.onResponse(response)) { return; } else { response.on("close", function() { if (!self2._ended) { self2.response.emit("end"); } }); response.once("end", function() { self2._ended = true; }); var noBody = function(code) { return self2.method === "HEAD" || code >= 100 && code < 200 || code === 204 || code === 304; }; var responseContent; if (self2.gzip && !noBody(response.statusCode)) { var contentEncoding = response.headers["content-encoding"] || "identity"; contentEncoding = contentEncoding.trim().toLowerCase(); var zlibOptions = { flush: zlib.Z_SYNC_FLUSH, finishFlush: zlib.Z_SYNC_FLUSH }; if (contentEncoding === "gzip") { responseContent = zlib.createGunzip(zlibOptions); response.pipe(responseContent); } else if (contentEncoding === "deflate") { responseContent = zlib.createInflate(zlibOptions); response.pipe(responseContent); } else { if (contentEncoding !== "identity") { debug("ignoring unrecognized Content-Encoding " + contentEncoding); } responseContent = response; } } else { responseContent = response; } if (self2.encoding) { if (self2.dests.length !== 0) { console.error("Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid."); } else { responseContent.setEncoding(self2.encoding); } } if (self2._paused) { responseContent.pause(); } self2.responseContent = responseContent; self2.emit("response", response); self2.dests.forEach(function(dest) { self2.pipeDest(dest); }); responseContent.on("data", function(chunk) { if (self2.timing && !self2.responseStarted) { self2.responseStartTime = new Date().getTime(); response.responseStartTime = self2.responseStartTime; } self2._destdata = true; self2.emit("data", chunk); }); responseContent.once("end", function(chunk) { self2.emit("end", chunk); }); responseContent.on("error", function(error) { self2.emit("error", error); }); responseContent.on("close", function() { self2.emit("close"); }); if (self2.callback) { self2.readResponseBody(response); } else { self2.on("end", function() { if (self2._aborted) { debug("aborted", self2.uri.href); return; } self2.emit("complete", response); }); } } debug("finish init function", self2.uri.href); }; Request.prototype.readResponseBody = function(response) { var self2 = this; debug("reading response's body"); var buffers = []; var bufferLength = 0; var strings = []; self2.on("data", function(chunk) { if (!Buffer2.isBuffer(chunk)) { strings.push(chunk); } else if (chunk.length) { bufferLength += chunk.length; buffers.push(chunk); } }); self2.on("end", function() { debug("end event", self2.uri.href); if (self2._aborted) { debug("aborted", self2.uri.href); buffers = []; bufferLength = 0; return; } if (bufferLength) { debug("has body", self2.uri.href, bufferLength); response.body = Buffer2.concat(buffers, bufferLength); if (self2.encoding !== null) { response.body = response.body.toString(self2.encoding); } buffers = []; bufferLength = 0; } else if (strings.length) { if (self2.encoding === "utf8" && strings[0].length > 0 && strings[0][0] === "\uFEFF") { strings[0] = strings[0].substring(1); } response.body = strings.join(""); } if (self2._json) { try { response.body = JSON.parse(response.body, self2._jsonReviver); } catch (e) { debug("invalid JSON received", self2.uri.href); } } debug("emitting complete", self2.uri.href); if (typeof response.body === "undefined" && !self2._json) { response.body = self2.encoding === null ? Buffer2.alloc(0) : ""; } self2.emit("complete", response, response.body); }); }; Request.prototype.abort = function() { var self2 = this; self2._aborted = true; if (self2.req) { self2.req.abort(); } else if (self2.response) { self2.response.destroy(); } self2.clearTimeout(); self2.emit("abort"); }; Request.prototype.pipeDest = function(dest) { var self2 = this; var response = self2.response; if (dest.headers && !dest.headersSent) { if (response.caseless.has("content-type")) { var ctname = response.caseless.has("content-type"); if (dest.setHeader) { dest.setHeader(ctname, response.headers[ctname]); } else { dest.headers[ctname] = response.headers[ctname]; } } if (response.caseless.has("content-length")) { var clname = response.caseless.has("content-length"); if (dest.setHeader) { dest.setHeader(clname, response.headers[clname]); } else { dest.headers[clname] = response.headers[clname]; } } } if (dest.setHeader && !dest.headersSent) { for (var i in response.headers) { if (!self2.gzip || i !== "content-encoding") { dest.setHeader(i, response.headers[i]); } } dest.statusCode = response.statusCode; } if (self2.pipefilter) { self2.pipefilter(response, dest); } }; Request.prototype.qs = function(q2, clobber) { var self2 = this; var base; if (!clobber && self2.uri.query) { base = self2._qs.parse(self2.uri.query); } else { base = {}; } for (var i in q2) { base[i] = q2[i]; } var qs = self2._qs.stringify(base); if (qs === "") { return self2; } self2.uri = url.parse(self2.uri.href.split("?")[0] + "?" + qs); self2.url = self2.uri; self2.path = self2.uri.path; if (self2.uri.host === "unix") { self2.enableUnixSocket(); } return self2; }; Request.prototype.form = function(form) { var self2 = this; if (form) { if (!/^application\/x-www-form-urlencoded\b/.test(self2.getHeader("content-type"))) { self2.setHeader("content-type", "application/x-www-form-urlencoded"); } self2.body = typeof form === "string" ? self2._qs.rfc3986(form.toString("utf8")) : self2._qs.stringify(form).toString("utf8"); return self2; } self2._form = new FormData(); self2._form.on("error", function(err) { err.message = "form-data: " + err.message; self2.emit("error", err); self2.abort(); }); return self2._form; }; Request.prototype.multipart = function(multipart) { var self2 = this; self2._multipart.onRequest(multipart); if (!self2._multipart.chunked) { self2.body = self2._multipart.body; } return self2; }; Request.prototype.json = function(val) { var self2 = this; if (!self2.hasHeader("accept")) { self2.setHeader("accept", "application/json"); } if (typeof self2.jsonReplacer === "function") { self2._jsonReplacer = self2.jsonReplacer; } self2._json = true; if (typeof val === "boolean") { if (self2.body !== void 0) { if (!/^application\/x-www-form-urlencoded\b/.test(self2.getHeader("content-type"))) { self2.body = safeStringify(self2.body, self2._jsonReplacer); } else { self2.body = self2._qs.rfc3986(self2.body); } if (!self2.hasHeader("content-type")) { self2.setHeader("content-type", "application/json"); } } } else { self2.body = safeStringify(val, self2._jsonReplacer); if (!self2.hasHeader("content-type")) { self2.setHeader("content-type", "application/json"); } } if (typeof self2.jsonReviver === "function") { self2._jsonReviver = self2.jsonReviver; } return self2; }; Request.prototype.getHeader = function(name, headers) { var self2 = this; var result, re, match; if (!headers) { headers = self2.headers; } Object.keys(headers).forEach(function(key) { if (key.length !== name.length) { return; } re = new RegExp(name, "i"); match = key.match(re); if (match) { result = headers[key]; } }); return result; }; Request.prototype.enableUnixSocket = function() { var unixParts = this.uri.path.split(":"); var host = unixParts[0]; var path3 = unixParts[1]; this.socketPath = host; this.uri.pathname = path3; this.uri.path = path3; this.uri.host = host; this.uri.hostname = host; this.uri.isUnix = true; }; Request.prototype.auth = function(user, pass, sendImmediately, bearer) { var self2 = this; self2._auth.onRequest(user, pass, sendImmediately, bearer); return self2; }; Request.prototype.aws = function(opts, now2) { var self2 = this; if (!now2) { self2._aws = opts; return self2; } if (opts.sign_version === 4 || opts.sign_version === "4") { var options = { host: self2.uri.host, path: self2.uri.path, method: self2.method, headers: self2.headers, body: self2.body }; if (opts.service) { options.service = opts.service; } var signRes = aws4.sign(options, { accessKeyId: opts.key, secretAccessKey: opts.secret, sessionToken: opts.session }); self2.setHeader("authorization", signRes.headers.Authorization); self2.setHeader("x-amz-date", signRes.headers["X-Amz-Date"]); if (signRes.headers["X-Amz-Security-Token"]) { self2.setHeader("x-amz-security-token", signRes.headers["X-Amz-Security-Token"]); } } else { var date = new Date(); self2.setHeader("date", date.toUTCString()); var auth = { key: opts.key, secret: opts.secret, verb: self2.method.toUpperCase(), date, contentType: self2.getHeader("content-type") || "", md5: self2.getHeader("content-md5") || "", amazonHeaders: aws2.canonicalizeHeaders(self2.headers) }; var path3 = self2.uri.path; if (opts.bucket && path3) { auth.resource = "/" + opts.bucket + path3; } else if (opts.bucket && !path3) { auth.resource = "/" + opts.bucket; } else if (!opts.bucket && path3) { auth.resource = path3; } else if (!opts.bucket && !path3) { auth.resource = "/"; } auth.resource = aws2.canonicalizeResource(auth.resource); self2.setHeader("authorization", aws2.authorization(auth)); } return self2; }; Request.prototype.httpSignature = function(opts) { var self2 = this; httpSignature.signRequest({ getHeader: function(header) { return self2.getHeader(header, self2.headers); }, setHeader: function(header, value) { self2.setHeader(header, value); }, method: self2.method, path: self2.path }, opts); debug("httpSignature authorization", self2.getHeader("authorization")); return self2; }; Request.prototype.hawk = function(opts) { var self2 = this; self2.setHeader("Authorization", hawk.header(self2.uri, self2.method, opts)); }; Request.prototype.oauth = function(_oauth) { var self2 = this; self2._oauth.onRequest(_oauth); return self2; }; Request.prototype.jar = function(jar) { var self2 = this; var cookies2; if (self2._redirect.redirectsFollowed === 0) { self2.originalCookieHeader = self2.getHeader("cookie"); } if (!jar) { cookies2 = false; self2._disableCookies = true; } else { var targetCookieJar = jar.getCookieString ? jar : globalCookieJar; var urihref = self2.uri.href; if (targetCookieJar) { cookies2 = targetCookieJar.getCookieString(urihref); } } if (cookies2 && cookies2.length) { if (self2.originalCookieHeader) { self2.setHeader("cookie", self2.originalCookieHeader + "; " + cookies2); } else { self2.setHeader("cookie", cookies2); } } self2._jar = jar; return self2; }; Request.prototype.pipe = function(dest, opts) { var self2 = this; if (self2.response) { if (self2._destdata) { self2.emit("error", new Error("You cannot pipe after data has been emitted from the response.")); } else if (self2._ended) { self2.emit("error", new Error("You cannot pipe after the response has been ended.")); } else { stream.Stream.prototype.pipe.call(self2, dest, opts); self2.pipeDest(dest); return dest; } } else { self2.dests.push(dest); stream.Stream.prototype.pipe.call(self2, dest, opts); return dest; } }; Request.prototype.write = function() { var self2 = this; if (self2._aborted) { return; } if (!self2._started) { self2.start(); } if (self2.req) { return self2.req.write.apply(self2.req, arguments); } }; Request.prototype.end = function(chunk) { var self2 = this; if (self2._aborted) { return; } if (chunk) { self2.write(chunk); } if (!self2._started) { self2.start(); } if (self2.req) { self2.req.end(); } }; Request.prototype.pause = function() { var self2 = this; if (!self2.responseContent) { self2._paused = true; } else { self2.responseContent.pause.apply(self2.responseContent, arguments); } }; Request.prototype.resume = function() { var self2 = this; if (!self2.responseContent) { self2._paused = false; } else { self2.responseContent.resume.apply(self2.responseContent, arguments); } }; Request.prototype.destroy = function() { var self2 = this; this.clearTimeout(); if (!self2._ended) { self2.end(); } else if (self2.response) { self2.response.destroy(); } }; Request.prototype.clearTimeout = function() { if (this.timeoutTimer) { clearTimeout(this.timeoutTimer); this.timeoutTimer = null; } }; Request.defaultProxyHeaderWhiteList = Tunnel.defaultProxyHeaderWhiteList.slice(); Request.defaultProxyHeaderExclusiveList = Tunnel.defaultProxyHeaderExclusiveList.slice(); Request.prototype.toJSON = requestToJSON; module2.exports = Request; } }); // node_modules/request/index.js var require_request3 = __commonJS({ "node_modules/request/index.js"(exports, module2) { "use strict"; var extend = require_extend(); var cookies = require_cookies(); var helpers = require_helpers(); var paramsHaveRequestBody = helpers.paramsHaveRequestBody; function initParams(uri, options, callback) { if (typeof options === "function") { callback = options; } var params = {}; if (options !== null && typeof options === "object") { extend(params, options, { uri }); } else if (typeof uri === "string") { extend(params, { uri }); } else { extend(params, uri); } params.callback = callback || params.callback; return params; } function request2(uri, options, callback) { if (typeof uri === "undefined") { throw new Error("undefined is not a valid uri or options object."); } var params = initParams(uri, options, callback); if (params.method === "HEAD" && paramsHaveRequestBody(params)) { throw new Error("HTTP HEAD requests MUST NOT include a request body."); } return new request2.Request(params); } function verbFunc(verb) { var method = verb.toUpperCase(); return function(uri, options, callback) { var params = initParams(uri, options, callback); params.method = method; return request2(params, params.callback); }; } request2.get = verbFunc("get"); request2.head = verbFunc("head"); request2.options = verbFunc("options"); request2.post = verbFunc("post"); request2.put = verbFunc("put"); request2.patch = verbFunc("patch"); request2.del = verbFunc("delete"); request2["delete"] = verbFunc("delete"); request2.jar = function(store) { return cookies.jar(store); }; request2.cookie = function(str) { return cookies.parse(str); }; function wrapRequestMethod(method, options, requester, verb) { return function(uri, opts, callback) { var params = initParams(uri, opts, callback); var target = {}; extend(true, target, options, params); target.pool = params.pool || options.pool; if (verb) { target.method = verb.toUpperCase(); } if (typeof requester === "function") { method = requester; } return method(target, target.callback); }; } request2.defaults = function(options, requester) { var self2 = this; options = options || {}; if (typeof options === "function") { requester = options; options = {}; } var defaults = wrapRequestMethod(self2, options, requester); var verbs = ["get", "head", "post", "put", "patch", "del", "delete"]; verbs.forEach(function(verb) { defaults[verb] = wrapRequestMethod(self2[verb], options, requester, verb); }); defaults.cookie = wrapRequestMethod(self2.cookie, options, requester); defaults.jar = self2.jar; defaults.defaults = self2.defaults; return defaults; }; request2.forever = function(agentOptions, optionsArg) { var options = {}; if (optionsArg) { extend(options, optionsArg); } if (agentOptions) { options.agentOptions = agentOptions; } options.forever = true; return request2.defaults(options); }; module2.exports = request2; request2.Request = require_request2(); request2.initParams = initParams; Object.defineProperty(request2, "debug", { enumerable: true, get: function() { return request2.Request.debug; }, set: function(debug) { request2.Request.debug = debug; } }); } }); // node_modules/isexe/windows.js var require_windows = __commonJS({ "node_modules/isexe/windows.js"(exports, module2) { module2.exports = isexe; isexe.sync = sync2; var fs4 = require("fs"); function checkPathExt(path3, options) { var pathext = options.pathExt !== void 0 ? options.pathExt : process.env.PATHEXT; if (!pathext) { return true; } pathext = pathext.split(";"); if (pathext.indexOf("") !== -1) { return true; } for (var i = 0; i < pathext.length; i++) { var p = pathext[i].toLowerCase(); if (p && path3.substr(-p.length).toLowerCase() === p) { return true; } } return false; } function checkStat(stat, path3, options) { if (!stat.isSymbolicLink() && !stat.isFile()) { return false; } return checkPathExt(path3, options); } function isexe(path3, options, cb) { fs4.stat(path3, function(er, stat) { cb(er, er ? false : checkStat(stat, path3, options)); }); } function sync2(path3, options) { return checkStat(fs4.statSync(path3), path3, options); } } }); // node_modules/isexe/mode.js var require_mode = __commonJS({ "node_modules/isexe/mode.js"(exports, module2) { module2.exports = isexe; isexe.sync = sync2; var fs4 = require("fs"); function isexe(path3, options, cb) { fs4.stat(path3, function(er, stat) { cb(er, er ? false : checkStat(stat, options)); }); } function sync2(path3, options) { return checkStat(fs4.statSync(path3), options); } function checkStat(stat, options) { return stat.isFile() && checkMode(stat, options); } function checkMode(stat, options) { var mod = stat.mode; var uid = stat.uid; var gid = stat.gid; var myUid = options.uid !== void 0 ? options.uid : process.getuid && process.getuid(); var myGid = options.gid !== void 0 ? options.gid : process.getgid && process.getgid(); var u = parseInt("100", 8); var g = parseInt("010", 8); var o = parseInt("001", 8); var ug = u | g; var ret = mod & o || mod & g && gid === myGid || mod & u && uid === myUid || mod & ug && myUid === 0; return ret; } } }); // node_modules/isexe/index.js var require_isexe = __commonJS({ "node_modules/isexe/index.js"(exports, module2) { var fs4 = require("fs"); var core; if (process.platform === "win32" || global.TESTING_WINDOWS) { core = require_windows(); } else { core = require_mode(); } module2.exports = isexe; isexe.sync = sync2; function isexe(path3, options, cb) { if (typeof options === "function") { cb = options; options = {}; } if (!cb) { if (typeof Promise !== "function") { throw new TypeError("callback not provided"); } return new Promise(function(resolve, reject) { isexe(path3, options || {}, function(er, is) { if (er) { reject(er); } else { resolve(is); } }); }); } core(path3, options || {}, function(er, is) { if (er) { if (er.code === "EACCES" || options && options.ignoreErrors) { er = null; is = false; } } cb(er, is); }); } function sync2(path3, options) { try { return core.sync(path3, options || {}); } catch (er) { if (options && options.ignoreErrors || er.code === "EACCES") { return false; } else { throw er; } } } } }); // node_modules/which/which.js var require_which = __commonJS({ "node_modules/which/which.js"(exports, module2) { var isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys"; var path3 = require("path"); var COLON = isWindows ? ";" : ":"; var isexe = require_isexe(); var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); var getPathInfo = (cmd, opt) => { const colon = opt.colon || COLON; const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [""] : [ ...isWindows ? [process.cwd()] : [], ...(opt.path || process.env.PATH || "").split(colon) ]; const pathExtExe = isWindows ? opt.pathExt || process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM" : ""; const pathExt = isWindows ? pathExtExe.split(colon) : [""]; if (isWindows) { if (cmd.indexOf(".") !== -1 && pathExt[0] !== "") pathExt.unshift(""); } return { pathEnv, pathExt, pathExtExe }; }; var which2 = (cmd, opt, cb) => { if (typeof opt === "function") { cb = opt; opt = {}; } if (!opt) opt = {}; const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); const found = []; const step = (i) => new Promise((resolve, reject) => { if (i === pathEnv.length) return opt.all && found.length ? resolve(found) : reject(getNotFoundError(cmd)); const ppRaw = pathEnv[i]; const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; const pCmd = path3.join(pathPart, cmd); const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; resolve(subStep(p, i, 0)); }); const subStep = (p, i, ii) => new Promise((resolve, reject) => { if (ii === pathExt.length) return resolve(step(i + 1)); const ext = pathExt[ii]; isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { if (!er && is) { if (opt.all) found.push(p + ext); else return resolve(p + ext); } return resolve(subStep(p, i, ii + 1)); }); }); return cb ? step(0).then((res) => cb(null, res), cb) : step(0); }; var whichSync = (cmd, opt) => { opt = opt || {}; const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); const found = []; for (let i = 0; i < pathEnv.length; i++) { const ppRaw = pathEnv[i]; const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; const pCmd = path3.join(pathPart, cmd); const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; for (let j = 0; j < pathExt.length; j++) { const cur = p + pathExt[j]; try { const is = isexe.sync(cur, { pathExt: pathExtExe }); if (is) { if (opt.all) found.push(cur); else return cur; } } catch (ex) { } } } if (opt.all && found.length) return found; if (opt.nothrow) return null; throw getNotFoundError(cmd); }; module2.exports = which2; which2.sync = whichSync; } }); // src/main.ts var main_exports = {}; __export(main_exports, { default: () => WakaTime }); module.exports = __toCommonJS(main_exports); var import_obsidian = require("obsidian"); var child_process3 = __toESM(require("child_process")); // src/options.ts var path = __toESM(require("path")); var fs2 = __toESM(require("fs")); var child_process = __toESM(require("child_process")); // src/utils.ts var Utils = class { static quote(str) { if (str.includes(" ")) return `"${str.replace('"', '\\"')}"`; return str; } static apiKeyInvalid(key) { const err = "Invalid api key... check https://wakatime.com/settings for your key"; if (!key) return err; const re = new RegExp("^(waka_)?[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$", "i"); if (!re.test(key)) return err; return ""; } static validateProxy(proxy) { if (!proxy) return ""; let re; if (proxy.indexOf("\\") === -1) { re = new RegExp("^((https?|socks5)://)?([^:@]+(:([^:@])+)?@)?[\\w\\.-]+(:\\d+)?$", "i"); } else { re = new RegExp("^.*\\\\.+$", "i"); } if (!re.test(proxy)) return "Invalid proxy. Valid formats are https://user:pass@host:port or socks5://user:pass@host:port or domain\\user:pass"; return ""; } static formatDate(date) { const months = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; let ampm = "AM"; let hour = date.getHours(); if (hour > 11) { ampm = "PM"; hour = hour - 12; } if (hour == 0) { hour = 12; } const minute = date.getMinutes(); return `${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()} ${hour}:${minute < 10 ? `0${minute}` : minute} ${ampm}`; } static obfuscateKey(key) { let newKey = ""; if (key) { newKey = key; if (key.length > 4) newKey = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX" + key.substring(key.length - 4); } return newKey; } static wrapArg(arg) { if (arg.indexOf(" ") > -1) return '"' + arg.replace(/"/g, '\\"') + '"'; return arg; } static formatArguments(binary, args) { const clone = args.slice(0); clone.unshift(this.wrapArg(binary)); const newCmds = []; let lastCmd = ""; for (let i = 0; i < clone.length; i++) { if (lastCmd == "--key") newCmds.push(this.wrapArg(this.obfuscateKey(clone[i]))); else newCmds.push(this.wrapArg(clone[i])); lastCmd = clone[i]; } return newCmds.join(" "); } }; // src/desktop.ts var fs = __toESM(require("fs")); var os = __toESM(require("os")); var Desktop = class { static isWindows() { return os.platform() === "win32"; } static getHomeDirectory() { const home = process.env.WAKATIME_HOME; if (home && home.trim() && fs.existsSync(home.trim())) return home.trim(); return process.env[this.isWindows() ? "USERPROFILE" : "HOME"] || process.cwd(); } static buildOptions() { const options = { windowsHide: true }; if (!this.isWindows() && !process.env.WAKATIME_HOME && !process.env.HOME) { options["env"] = { ...process.env, WAKATIME_HOME: this.getHomeDirectory() }; } return options; } }; // src/options.ts var Options = class { constructor(logger) { this.cache = {}; const wakaHome = Desktop.getHomeDirectory(); this.configFile = path.join(wakaHome, ".wakatime.cfg"); this.internalConfigFile = path.join(wakaHome, ".wakatime-internal.cfg"); this.logFile = path.join(wakaHome, ".wakatime.log"); this.logger = logger; } async getSettingAsync(section, key) { return new Promise((resolve, reject) => { this.getSetting(section, key, false, (setting) => { setting.error ? reject(setting.error) : resolve(setting.value); }); }); } getSetting(section, key, internal, callback) { fs2.readFile(this.getConfigFile(internal), "utf-8", (err, content) => { if (err) { callback({ error: new Error(`could not read ${this.getConfigFile(internal)}`), key, value: "" }); } else { let currentSection = ""; const lines = content.split("\n"); for (let i = 0; i < lines.length; i++) { const line = lines[i]; if (this.startsWith(line.trim(), "[") && this.endsWith(line.trim(), "]")) { currentSection = line.trim().substring(1, line.trim().length - 1).toLowerCase(); } else if (currentSection === section) { const parts = line.split("="); const currentKey = parts[0].trim(); if (currentKey === key && parts.length > 1) { callback({ key, value: this.removeNulls(parts[1].trim()) }); return; } } } callback({ key, value: "" }); } }); } setSetting(section, key, val, internal) { const configFile = this.getConfigFile(internal); fs2.readFile(configFile, "utf-8", (err, content) => { if (err) content = ""; const contents = []; let currentSection = ""; let found = false; const lines = content.split("\n"); for (let i = 0; i < lines.length; i++) { const line = lines[i]; if (this.startsWith(line.trim(), "[") && this.endsWith(line.trim(), "]")) { if (currentSection === section && !found) { contents.push(this.removeNulls(key + " = " + val)); found = true; } currentSection = line.trim().substring(1, line.trim().length - 1).toLowerCase(); contents.push(this.removeNulls(line)); } else if (currentSection === section) { const parts = line.split("="); const currentKey = parts[0].trim(); if (currentKey === key) { if (!found) { contents.push(this.removeNulls(key + " = " + val)); found = true; } } else { contents.push(this.removeNulls(line)); } } else { contents.push(this.removeNulls(line)); } } if (!found) { if (currentSection !== section) { contents.push("[" + section + "]"); } contents.push(this.removeNulls(key + " = " + val)); } fs2.writeFile(configFile, contents.join("\n"), (err2) => { if (err2) throw err2; }); }); } setSettings(section, settings, internal) { const configFile = this.getConfigFile(internal); fs2.readFile(configFile, "utf-8", (err, content) => { if (err) content = ""; const contents = []; let currentSection = ""; const found = {}; const lines = content.split("\n"); for (let i = 0; i < lines.length; i++) { const line = lines[i]; if (this.startsWith(line.trim(), "[") && this.endsWith(line.trim(), "]")) { if (currentSection === section) { settings.forEach((setting) => { if (!found[setting.key]) { contents.push(this.removeNulls(setting.key + " = " + setting.value)); found[setting.key] = true; } }); } currentSection = line.trim().substring(1, line.trim().length - 1).toLowerCase(); contents.push(this.removeNulls(line)); } else if (currentSection === section) { const parts = line.split("="); const currentKey = parts[0].trim(); let keepLineUnchanged = true; settings.forEach((setting) => { if (currentKey === setting.key) { keepLineUnchanged = false; if (!found[setting.key]) { contents.push(this.removeNulls(setting.key + " = " + setting.value)); found[setting.key] = true; } } }); if (keepLineUnchanged) { contents.push(this.removeNulls(line)); } } else { contents.push(this.removeNulls(line)); } } settings.forEach((setting) => { if (!found[setting.key]) { if (currentSection !== section) { contents.push("[" + section + "]"); currentSection = section; } contents.push(this.removeNulls(setting.key + " = " + setting.value)); found[setting.key] = true; } }); fs2.writeFile(configFile, contents.join("\n"), (err2) => { if (err2) throw err2; }); }); } getConfigFile(internal) { return internal ? this.internalConfigFile : this.configFile; } getLogFile() { return this.logFile; } async getApiKeyAsync() { if (!Utils.apiKeyInvalid(this.cache.api_key)) { return this.cache.api_key; } try { const apiKeyFromVault = await this.getApiKeyFromVaultCmd(); if (!Utils.apiKeyInvalid(apiKeyFromVault)) { this.cache.api_key = apiKeyFromVault; return this.cache.api_key; } } catch (err) { } try { const apiKey = await this.getSettingAsync("settings", "api_key"); if (!Utils.apiKeyInvalid(apiKey)) this.cache.api_key = apiKey; return apiKey; } catch (err) { this.logger.debug(`Exception while reading API Key from config file: ${err}`); return ""; } } async getApiKeyFromVaultCmd() { try { const apiKeyCmd = await this.getSettingAsync("settings", "api_key_vault_cmd"); if (!apiKeyCmd) return ""; const options = Desktop.buildOptions(); const proc = child_process.spawn(apiKeyCmd, options); let stdout = ""; for await (const chunk of proc.stdout) { stdout += chunk; } let stderr = ""; for await (const chunk of proc.stderr) { stderr += chunk; } const exitCode = await new Promise((resolve) => { proc.on("close", resolve); }); if (exitCode) this.logger.warn(`api key vault command error (${exitCode}): ${stderr}`); else if (stderr && stderr.trim()) this.logger.warn(stderr.trim()); const apiKey = stdout.toString().trim(); return apiKey; } catch (err) { this.logger.debug(`Exception while reading API Key Vault Cmd from config file: ${err}`); return ""; } } getApiKey(callback) { this.getApiKeyAsync().then((apiKey) => { if (!Utils.apiKeyInvalid(apiKey)) { callback(apiKey); } else { callback(null); } }).catch((err) => { this.logger.warn(`Unable to get api key: ${err}`); callback(null); }); } hasApiKey(callback) { this.getApiKeyAsync().then((apiKey) => callback(!Utils.apiKeyInvalid(apiKey))).catch((err) => { this.logger.warn(`Unable to check for api key: ${err}`); callback(false); }); } startsWith(outer, inner) { return outer.slice(0, inner.length) === inner; } endsWith(outer, inner) { return inner === "" || outer.slice(-inner.length) === inner; } removeNulls(s) { return s.replace(/\0/g, ""); } }; // src/constants.ts var LogLevel = /* @__PURE__ */ ((LogLevel2) => { LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG"; LogLevel2[LogLevel2["INFO"] = 1] = "INFO"; LogLevel2[LogLevel2["WARN"] = 2] = "WARN"; LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR"; return LogLevel2; })(LogLevel || {}); // src/logger.ts var Logger = class { constructor(level) { this.setLevel(level); } getLevel() { return this.level; } setLevel(level) { this.level = level; } log(level, msg) { if (level >= this.level) { msg = `[WakaTime][${LogLevel[level]}] ${msg}`; if (level == 0 /* DEBUG */) console.log(msg); if (level == 1 /* INFO */) console.info(msg); if (level == 2 /* WARN */) console.warn(msg); if (level == 3 /* ERROR */) console.error(msg); } } debug(msg) { this.log(0 /* DEBUG */, msg); } info(msg) { this.log(1 /* INFO */, msg); } warn(msg) { this.log(2 /* WARN */, msg); } warnException(msg) { if (msg.message !== void 0) { this.log(2 /* WARN */, msg.message); } } error(msg) { this.log(3 /* ERROR */, msg); } errorException(msg) { if (msg.message !== void 0) { this.log(3 /* ERROR */, msg.message); } } }; // src/dependencies.ts var import_adm_zip = __toESM(require_adm_zip()); var child_process2 = __toESM(require("child_process")); var fs3 = __toESM(require("fs")); var os2 = __toESM(require("os")); var path2 = __toESM(require("path")); var request = __toESM(require_request3()); var which = __toESM(require_which()); var Dependencies = class { constructor(options, logger) { this.resourcesLocation = void 0; this.cliLocation = void 0; this.cliLocationGlobal = void 0; this.cliInstalled = false; this.githubDownloadPrefix = "https://github.com/wakatime/wakatime-cli/releases/download"; this.githubReleasesStableUrl = "https://api.github.com/repos/wakatime/wakatime-cli/releases/latest"; this.githubReleasesAlphaUrl = "https://api.github.com/repos/wakatime/wakatime-cli/releases?per_page=1"; this.latestCliVersion = ""; this.options = options; this.logger = logger; } getResourcesLocation() { if (this.resourcesLocation) return this.resourcesLocation; const folder = path2.join(Desktop.getHomeDirectory(), ".wakatime"); try { fs3.mkdirSync(folder, { recursive: true }); this.resourcesLocation = folder; } catch (e) { this.resourcesLocation = "./.wakatime"; } return this.resourcesLocation; } getCliLocation() { if (this.cliLocation) return this.cliLocation; this.cliLocation = this.getCliLocationGlobal(); if (this.cliLocation) return this.cliLocation; const ext = Desktop.isWindows() ? ".exe" : ""; let osname = os2.platform(); if (osname == "win32") osname = "windows"; const arch2 = this.architecture(); this.cliLocation = path2.join(this.getResourcesLocation(), `wakatime-cli-${osname}-${arch2}${ext}`); return this.cliLocation; } getCliLocationGlobal() { if (this.cliLocationGlobal) return this.cliLocationGlobal; const binaryName = `wakatime-cli${Desktop.isWindows() ? ".exe" : ""}`; const path3 = which.sync(binaryName, { nothrow: true }); if (path3) { this.cliLocationGlobal = path3; this.logger.debug(`Using global wakatime-cli location: ${path3}`); } return this.cliLocationGlobal; } isCliInstalled() { if (this.cliInstalled) return true; this.cliInstalled = fs3.existsSync(this.getCliLocation()); return this.cliInstalled; } checkAndInstallCli(callback) { if (!this.isCliInstalled()) { this.installCli(callback); } else { this.isCliLatest((isLatest) => { if (!isLatest) { this.installCli(callback); } else { callback(); } }); } } isCliLatest(callback) { if (this.getCliLocationGlobal()) { callback(true); return; } const args = ["--version"]; const options = Desktop.buildOptions(); try { child_process2.execFile(this.getCliLocation(), args, options, (error, _stdout, stderr) => { if (!(error != null)) { const currentVersion = _stdout.toString().trim() + stderr.toString().trim(); this.logger.debug(`Current wakatime-cli version is ${currentVersion}`); this.logger.debug("Checking for updates to wakatime-cli..."); this.getLatestCliVersion((latestVersion) => { if (currentVersion === latestVersion) { this.logger.debug("wakatime-cli is up to date"); callback(true); } else if (latestVersion) { this.logger.debug(`Found an updated wakatime-cli ${latestVersion}`); callback(false); } else { this.logger.debug("Unable to find latest wakatime-cli version"); callback(false); } }); } else { callback(false); } }); } catch (e) { callback(false); } } getLatestCliVersion(callback) { if (this.latestCliVersion) { callback(this.latestCliVersion); return; } this.options.getSetting("settings", "proxy", false, (proxy) => { this.options.getSetting("settings", "no_ssl_verify", false, (noSSLVerify) => { this.options.getSetting("internal", "cli_version_last_modified", true, (modified) => { this.options.getSetting("internal", "cli_version", true, (version) => { this.options.getSetting("settings", "alpha", false, (alpha) => { const options = { url: alpha.value == "true" ? this.githubReleasesAlphaUrl : this.githubReleasesStableUrl, json: true, headers: { "User-Agent": "github.com/wakatime/vscode-wakatime" } }; if (proxy.value) { this.logger.debug(`Using Proxy: ${proxy.value}`); options["proxy"] = proxy.value; } if (noSSLVerify.value === "true") options["strictSSL"] = false; if (modified.value && version.value && options.headers) options.headers["If-Modified-Since"] = modified.value; try { request.get(options, (error, response, json) => { if (!error && response && (response.statusCode == 200 || response.statusCode == 304)) { this.logger.debug(`GitHub API Response ${response.statusCode}`); if (response.statusCode == 304) { this.latestCliVersion = version.value; callback(this.latestCliVersion); return; } this.latestCliVersion = alpha.value == "true" ? json[0]["tag_name"] : json["tag_name"]; this.logger.debug(`Latest wakatime-cli version from GitHub: ${this.latestCliVersion}`); const lastModified = response.headers["last-modified"]; if (lastModified && this.latestCliVersion) { this.options.setSettings("internal", [ { key: "cli_version", value: this.latestCliVersion }, { key: "cli_version_last_modified", value: lastModified } ], true); } callback(this.latestCliVersion); } else { if (response) { this.logger.warn(`GitHub API Response ${response.statusCode}: ${error}`); } else { this.logger.warn(`GitHub API Response Error: ${error}`); } callback(""); } }); } catch (e) { this.logger.warnException(e); callback(""); } }); }); }); }); }); } installCli(callback) { this.getLatestCliVersion((version) => { if (!version) { callback(); return; } this.logger.debug(`Downloading wakatime-cli ${version}...`); const url = this.cliDownloadUrl(version); const zipFile = path2.join(this.getResourcesLocation(), "wakatime-cli" + this.randStr() + ".zip"); this.downloadFile(url, zipFile, () => { this.extractCli(zipFile, callback); }, callback); }); } isSymlink(file) { try { return fs3.lstatSync(file).isSymbolicLink(); } catch (_) { } return false; } extractCli(zipFile, callback) { this.logger.debug(`Extracting wakatime-cli into "${this.getResourcesLocation()}"...`); this.removeCli(() => { this.unzip(zipFile, this.getResourcesLocation(), () => { if (!Desktop.isWindows()) { const cli = this.getCliLocation(); try { this.logger.debug("Chmod 755 wakatime-cli..."); fs3.chmodSync(cli, 493); } catch (e) { this.logger.warnException(e); } const ext = Desktop.isWindows() ? ".exe" : ""; const link = path2.join(this.getResourcesLocation(), `wakatime-cli${ext}`); if (!this.isSymlink(link)) { try { this.logger.debug(`Create symlink from wakatime-cli to ${cli}`); fs3.symlinkSync(cli, link); } catch (e) { this.logger.warnException(e); try { fs3.copyFileSync(cli, link); fs3.chmodSync(link, 493); } catch (e2) { this.logger.warnException(e2); } } } } callback(); }); this.logger.debug("Finished extracting wakatime-cli."); }); } removeCli(callback) { if (fs3.existsSync(this.getCliLocation())) { fs3.unlink(this.getCliLocation(), () => { callback(); }); } else { callback(); } } downloadFile(url, outputFile, callback, error) { this.options.getSetting("settings", "proxy", false, (proxy) => { this.options.getSetting("settings", "no_ssl_verify", false, (noSSLVerify) => { const options = { url }; if (proxy.value) { this.logger.debug(`Using Proxy: ${proxy.value}`); options["proxy"] = proxy.value; } if (noSSLVerify.value === "true") options["strictSSL"] = false; try { const r = request.get(options); r.on("error", (e) => { this.logger.warn(`Failed to download ${url}`); this.logger.warn(e.toString()); error(); }); const out = fs3.createWriteStream(outputFile); r.pipe(out); r.on("end", () => { out.on("finish", () => { callback(); }); }); } catch (e) { this.logger.warnException(e); callback(); } }); }); } unzip(file, outputDir, callback) { if (fs3.existsSync(file)) { try { const zip = new import_adm_zip.default(file); zip.extractAllTo(outputDir, true); } catch (e) { this.logger.errorException(e); } finally { try { fs3.unlink(file, () => { callback(); }); } catch (e2) { callback(); } } } } architecture() { const arch2 = os2.arch(); if (arch2.indexOf("32") > -1) return "386"; if (arch2.indexOf("x64") > -1) return "amd64"; return arch2; } cliDownloadUrl(version) { let osname = os2.platform(); if (osname == "win32") osname = "windows"; const arch2 = this.architecture(); const validCombinations = [ "darwin-amd64", "darwin-arm64", "freebsd-386", "freebsd-amd64", "freebsd-arm", "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "netbsd-386", "netbsd-amd64", "netbsd-arm", "openbsd-386", "openbsd-amd64", "openbsd-arm", "openbsd-arm64", "windows-386", "windows-amd64", "windows-arm64" ]; if (!validCombinations.includes(`${osname}-${arch2}`)) this.reportMissingPlatformSupport(osname, arch2); return `${this.githubDownloadPrefix}/${version}/wakatime-cli-${osname}-${arch2}.zip`; } reportMissingPlatformSupport(osname, architecture) { const url = `https://api.wakatime.com/api/v1/cli-missing?osname=${osname}&architecture=${architecture}&plugin=vscode`; this.options.getSetting("settings", "proxy", false, (proxy) => { this.options.getSetting("settings", "no_ssl_verify", false, (noSSLVerify) => { const options = { url }; if (proxy.value) options["proxy"] = proxy.value; if (noSSLVerify.value === "true") options["strictSSL"] = false; try { request.get(options); } catch (e) { } }); }); } randStr() { return (Math.random() + 1).toString(36).substring(7); } }; // src/main.ts var WakaTime = class extends import_obsidian.Plugin { constructor() { super(...arguments); this.lastFetchToday = 0; this.fetchTodayInterval = 6e4; this.lastHeartbeat = 0; } async onload() { this.logger = new Logger(1 /* INFO */); this.options = new Options(this.logger); this.addCommand({ id: "wakatime-api-key", name: "WakaTime API Key", callback: () => { this.promptForApiKey(); } }); this.options.getSetting("settings", "debug", false, (debug) => { this.logger.setLevel(debug.value == "true" ? 0 /* DEBUG */ : 1 /* INFO */); this.dependencies = new Dependencies(this.options, this.logger); this.options.getSetting("settings", "disabled", false, (disabled) => { this.disabled = disabled.value === "true"; if (this.disabled) { return; } this.initializeDependencies(); }); }); } onunload() { } initializeDependencies() { this.logger.debug(`Initializing WakaTime v${this.manifest.version}`); this.statusBar = this.addStatusBarItem(); this.options.getSetting("settings", "status_bar_enabled", false, (statusBarEnabled) => { this.showStatusBar = statusBarEnabled.value !== "false"; this.updateStatusBarText("WakaTime Initializing..."); this.checkApiKey(); this.setupEventListeners(); this.options.getSetting("settings", "status_bar_coding_activity", false, (showCodingActivity) => { this.showCodingActivity = showCodingActivity.value !== "false"; this.dependencies.checkAndInstallCli(() => { this.logger.debug("WakaTime initialized"); this.updateStatusBarText(); this.updateStatusBarTooltip("WakaTime: Initialized"); this.getCodingActivity(); }); }); }); } checkApiKey() { this.options.hasApiKey((hasApiKey) => { if (!hasApiKey) this.promptForApiKey(); }); } setupEventListeners() { this.registerDomEvent(document, "click", (evt) => { this.onEvent(false); }); this.registerDomEvent(document, "keydown", (evt) => { this.onEvent(false); }); } onEvent(isWrite) { const view = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView); if (!view) return; const activeFile = this.app.workspace.getActiveFile(); if (!activeFile) return; const cursor = view.editor.getCursor(); const file = `${this.app.vault.adapter.basePath}/${activeFile.path}`; const time = Date.now(); if (isWrite || this.enoughTimePassed(time) || this.lastFile !== file) { this.sendHeartbeat(file, time, cursor.line, cursor.ch, isWrite); this.lastFile = file; this.lastHeartbeat = time; } } enoughTimePassed(time) { return this.lastHeartbeat + 12e4 < time; } updateStatusBarText(text) { if (!this.statusBar) return; if (!text) { this.statusBar.setText("\u{1F552}"); } else { this.statusBar.setText("\u{1F552} " + text); } } updateStatusBarTooltip(tooltipText) { if (!this.statusBar) return; this.statusBar.setAttr("title", tooltipText); } promptForApiKey() { new ApiKeyModal(this.app, this.options).open(); } sendHeartbeat(file, time, lineno, cursorpos, isWrite) { this.options.getApiKey((apiKey) => { if (!apiKey) return; this._sendHeartbeat(file, time, lineno, cursorpos, isWrite); }); } _sendHeartbeat(file, time, lineno, cursorpos, isWrite) { if (!this.dependencies.isCliInstalled()) return; const args = []; args.push("--entity", Utils.quote(file)); const user_agent = "obsidian/" + import_obsidian.apiVersion + " obsidian-wakatime/" + this.manifest.version; args.push("--plugin", Utils.quote(user_agent)); args.push("--lineno", String(lineno + 1)); args.push("--cursorpos", String(cursorpos + 1)); if (isWrite) args.push("--write"); if (Desktop.isWindows()) { args.push("--config", Utils.quote(this.options.getConfigFile(false)), "--log-file", Utils.quote(this.options.getLogFile())); } const binary = this.dependencies.getCliLocation(); this.logger.debug(`Sending heartbeat: ${Utils.formatArguments(binary, args)}`); const options = Desktop.buildOptions(); const proc = child_process3.execFile(binary, args, options, (error, stdout, stderr) => { if (error != null) { if (stderr && stderr.toString() != "") this.logger.error(stderr.toString()); if (stdout && stdout.toString() != "") this.logger.error(stdout.toString()); this.logger.error(error.toString()); } }); proc.on("close", (code, _signal) => { if (code == 0) { if (this.showStatusBar) this.getCodingActivity(); this.logger.debug(`last heartbeat sent ${Utils.formatDate(new Date())}`); } else if (code == 102 || code == 112) { if (this.showStatusBar) { if (!this.showCodingActivity) this.updateStatusBarText(); this.updateStatusBarTooltip("WakaTime: working offline... coding activity will sync next time we are online"); } this.logger.warn(`Working offline (${code}); Check your ${this.options.getLogFile()} file for more details`); } else if (code == 103) { const error_msg = `Config parsing error (103); Check your ${this.options.getLogFile()} file for more details`; if (this.showStatusBar) { this.updateStatusBarText("WakaTime Error"); this.updateStatusBarTooltip(`WakaTime: ${error_msg}`); } this.logger.error(error_msg); } else if (code == 104) { const error_msg = "Invalid Api Key (104); Make sure your Api Key is correct!"; if (this.showStatusBar) { this.updateStatusBarText("WakaTime Error"); this.updateStatusBarTooltip(`WakaTime: ${error_msg}`); } this.logger.error(error_msg); } else { const error_msg = `Unknown Error (${code}); Check your ${this.options.getLogFile()} file for more details`; if (this.showStatusBar) { this.updateStatusBarText("WakaTime Error"); this.updateStatusBarTooltip(`WakaTime: ${error_msg}`); } this.logger.error(error_msg); } }); } getCodingActivity() { if (!this.showStatusBar) { return; } if (this.lastFetchToday > 0 && this.lastFetchToday > this.lastHeartbeat) return; const cutoff = Date.now() - this.fetchTodayInterval; if (this.lastFetchToday > cutoff) return; this.lastFetchToday = Date.now(); this.options.getApiKey((apiKey) => { if (!apiKey) return; this._getCodingActivity(); }); } _getCodingActivity() { if (!this.dependencies.isCliInstalled()) return; const user_agent = "obsidian/" + import_obsidian.apiVersion + " obsidian-wakatime/" + this.manifest.version; const args = ["--today", "--plugin", Utils.quote(user_agent)]; if (Desktop.isWindows()) { args.push("--config", Utils.quote(this.options.getConfigFile(false)), "--logfile", Utils.quote(this.options.getLogFile())); } const binary = this.dependencies.getCliLocation(); this.logger.debug(`Fetching coding activity for Today from api: ${Utils.formatArguments(binary, args)}`); const options = Desktop.buildOptions(); const proc = child_process3.execFile(binary, args, options, (error, stdout, stderr) => { if (error != null) { if (stderr && stderr.toString() != "") this.logger.error(stderr.toString()); if (stdout && stdout.toString() != "") this.logger.error(stdout.toString()); this.logger.error(error.toString()); } }); let output = ""; if (proc.stdout) { proc.stdout.on("data", (data) => { if (data) output += data; }); } proc.on("close", (code, _signal) => { if (code == 0) { if (this.showStatusBar) { if (output && output.trim()) { if (this.showCodingActivity) { this.updateStatusBarText(output.trim()); this.updateStatusBarTooltip("WakaTime: Today\u2019s coding time."); } else { this.updateStatusBarText(); this.updateStatusBarTooltip(output.trim()); } } else { this.updateStatusBarText(); this.updateStatusBarTooltip("WakaTime: Calculating time spent today in background..."); } } } else if (code == 102 || code == 112) { } else { const error_msg = `Error fetching today coding activity (${code}); Check your ${this.options.getLogFile()} file for more details`; this.logger.debug(error_msg); } }); } }; var ApiKeyModal = class extends import_obsidian.Modal { constructor(app, options) { if (ApiKeyModal.instance) { return ApiKeyModal.instance; } super(app); this.options = options; ApiKeyModal.instance = this; } onOpen() { const { contentEl } = this; this.options.getSetting("settings", "api_key", false, (setting) => { let defaultVal = setting.value; if (Utils.apiKeyInvalid(defaultVal)) defaultVal = ""; contentEl.createEl("h2", { text: "Enter your WakaTime API Key" }); new import_obsidian.Setting(contentEl).addText((text) => { text.setValue(defaultVal); text.inputEl.addClass("api-key-input"); this.input = text; }); new import_obsidian.Setting(contentEl).addButton((btn) => btn.setButtonText("Save").setCta().onClick(() => { const val = this.input.getValue(); const invalid = Utils.apiKeyInvalid(val); console.log(invalid); if (!invalid) { this.close(); this.options.setSetting("settings", "api_key", val, false); } })); }); } onClose() { const { contentEl } = this; contentEl.empty(); } }; /*! * Copyright 2010 LearnBoost * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*! * Copyright (c) 2015, Salesforce.com, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of Salesforce.com nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /*! * Copyright (c) 2018, Salesforce.com, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of Salesforce.com nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /*! * mime-db * Copyright(c) 2014 Jonathan Ong * Copyright(c) 2015-2022 Douglas Christopher Wilson * MIT Licensed */ /*! * mime-types * Copyright(c) 2014 Jonathan Ong * Copyright(c) 2015 Douglas Christopher Wilson * MIT Licensed */ /*! safe-buffer. MIT License. Feross Aboukhadijeh */ /** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2FkbS16aXAvdXRpbC9maWxlU3lzdGVtLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL3V0aWwvY29uc3RhbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL3V0aWwvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvdXRpbC9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvdXRpbC9mYXR0ci5qcyIsICJub2RlX21vZHVsZXMvYWRtLXppcC91dGlsL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL2hlYWRlcnMvZW50cnlIZWFkZXIuanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvaGVhZGVycy9tYWluSGVhZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL2hlYWRlcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvbWV0aG9kcy9kZWZsYXRlci5qcyIsICJub2RlX21vZHVsZXMvYWRtLXppcC9tZXRob2RzL2luZmxhdGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL21ldGhvZHMvemlwY3J5cHRvLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL21ldGhvZHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvemlwRW50cnkuanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvemlwRmlsZS5qcyIsICJub2RlX21vZHVsZXMvYWRtLXppcC9hZG0temlwLmpzIiwgIm5vZGVfbW9kdWxlcy9leHRlbmQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3BzbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi9wdWJzdWZmaXgtcHNsLmpzIiwgIm5vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL3N0b3JlLmpzIiwgIm5vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL3Blcm11dGVEb21haW4uanMiLCAibm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvcGF0aE1hdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL21lbXN0b3JlLmpzIiwgIm5vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL3ZlcnNpb24uanMiLCAibm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvY29va2llLmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1ZXN0L2xpYi9jb29raWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9qc29uLXN0cmluZ2lmeS1zYWZlL3N0cmluZ2lmeS5qcyIsICJub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL2hlbHBlcnMuanMiLCAibm9kZV9tb2R1bGVzL2F3cy1zaWduMi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYXdzNC9scnUuanMiLCAibm9kZV9tb2R1bGVzL2F3czQvYXdzNC5qcyIsICJub2RlX21vZHVsZXMvYXNzZXJ0LXBsdXMvYXNzZXJ0LmpzIiwgIm5vZGVfbW9kdWxlcy9zYWZlci1idWZmZXIvc2FmZXIuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9hbGdzLmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZXJyb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9hc24xL2xpYi9iZXIvZXJyb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9hc24xL2xpYi9iZXIvdHlwZXMuanMiLCAibm9kZV9tb2R1bGVzL2FzbjEvbGliL2Jlci9yZWFkZXIuanMiLCAibm9kZV9tb2R1bGVzL2FzbjEvbGliL2Jlci93cml0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2FzbjEvbGliL2Jlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYXNuMS9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2pzYm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VjYy1qc2JuL2xpYi9lYy5qcyIsICJub2RlX21vZHVsZXMvdHdlZXRuYWNsL25hY2wtZmFzdC5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvc3NoLWJ1ZmZlci5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL3NpZ25hdHVyZS5qcyIsICJub2RlX21vZHVsZXMvZWNjLWpzYm4vbGliL3NlYy5qcyIsICJub2RlX21vZHVsZXMvZWNjLWpzYm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9kaGUuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9lZC1jb21wYXQuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL3BrY3M4LmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZm9ybWF0cy9wa2NzMS5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2Zvcm1hdHMvcmZjNDI1My5qcyIsICJub2RlX21vZHVsZXMvYmNyeXB0LXBia2RmL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZm9ybWF0cy9zc2gtcHJpdmF0ZS5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2Zvcm1hdHMvcGVtLmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZm9ybWF0cy9zc2guanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL2Ruc3NlYy5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2Zvcm1hdHMvcHV0dHkuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL2F1dG8uanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9wcml2YXRlLWtleS5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2lkZW50aXR5LmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZm9ybWF0cy9vcGVuc3NoLWNlcnQuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL3g1MDkuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL3g1MDktcGVtLmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvY2VydGlmaWNhdGUuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9maW5nZXJwcmludC5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2tleS5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXNpZ25hdHVyZS9saWIvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtc2lnbmF0dXJlL2xpYi9wYXJzZXIuanMiLCAibm9kZV9tb2R1bGVzL2V4dHNwcmludGYvbGliL2V4dHNwcmludGYuanMiLCAibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvdmVycm9yL2xpYi92ZXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL2pzb24tc2NoZW1hL2xpYi92YWxpZGF0ZS5qcyIsICJub2RlX21vZHVsZXMvanNwcmltL2xpYi9qc3ByaW0uanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtc2lnbmF0dXJlL2xpYi9zaWduZXIuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtc2lnbmF0dXJlL2xpYi92ZXJpZnkuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtc2lnbmF0dXJlL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWltZS1kYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWltZS10eXBlcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2FzZWxlc3MvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2ZvcmV2ZXItYWdlbnQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3Qvbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvaXNzdHJlYW0vaXNzdHJlYW0uanMiLCAibm9kZV9tb2R1bGVzL2lzLXR5cGVkYXJyYXkvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL2dldFByb3h5RnJvbVVSSS5qcyIsICJub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIsICJub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsICJub2RlX21vZHVsZXMvcXMvbGliL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL3F1ZXJ5c3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3NjaGVtZXMvdXJuLXV1aWQudHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9zcmMvc2NoZW1lcy91cm4udHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9zcmMvc2NoZW1lcy9tYWlsdG8udHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9zcmMvc2NoZW1lcy93c3MudHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9zcmMvc2NoZW1lcy93cy50cyIsICJub2RlX21vZHVsZXMvdXJpLWpzL3NyYy9zY2hlbWVzL2h0dHBzLnRzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3NjaGVtZXMvaHR0cC50cyIsICJub2RlX21vZHVsZXMvdXJpLWpzL3NyYy91cmkudHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuZXM2LmpzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3JlZ2V4cHMtaXJpLnRzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3JlZ2V4cHMtdXJpLnRzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3V0aWwudHMiLCAibm9kZV9tb2R1bGVzL2Zhc3QtZGVlcC1lcXVhbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL3VjczJsZW5ndGguanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvc2NoZW1hX29iai5qcyIsICJub2RlX21vZHVsZXMvanNvbi1zY2hlbWEtdHJhdmVyc2UvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9yZXNvbHZlLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvZXJyb3JfY2xhc3Nlcy5qcyIsICJub2RlX21vZHVsZXMvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvdmFsaWRhdGUuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9jYWNoZS5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL2Zvcm1hdHMuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvcmVmLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2FsbE9mLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2FueU9mLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2NvbW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvY29uc3QuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvY29udGFpbnMuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvZGVwZW5kZW5jaWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2VudW0uanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvZm9ybWF0LmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2lmLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2l0ZW1zLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL19saW1pdC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9fbGltaXRJdGVtcy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9fbGltaXRMZW5ndGguanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvX2xpbWl0UHJvcGVydGllcy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9tdWx0aXBsZU9mLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL25vdC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9vbmVPZi5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9wYXR0ZXJuLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL3Byb3BlcnRpZXMuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvcHJvcGVydHlOYW1lcy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9yZXF1aXJlZC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy91bmlxdWVJdGVtcy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL3J1bGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9hc3luYy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9jdXN0b20uanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZGVmaW5pdGlvbl9zY2hlbWEuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIva2V5d29yZC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9hanYuanMiLCAibm9kZV9tb2R1bGVzL2hhci12YWxpZGF0b3IvbGliL2Vycm9yLmpzIiwgIm5vZGVfbW9kdWxlcy9oYXItc2NoZW1hL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaGFyLXZhbGlkYXRvci9saWIvcHJvbWlzZS5qcyIsICJub2RlX21vZHVsZXMvcmVxdWVzdC9saWIvaGFyLmpzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2xpYi9ybmctYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9saWIvYnl0ZXNUb1V1aWQuanMiLCAibm9kZV9tb2R1bGVzL3V1aWQvdjQuanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL2F1dGguanMiLCAibm9kZV9tb2R1bGVzL29hdXRoLXNpZ24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL29hdXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1ZXN0L2xpYi9oYXdrLmpzIiwgIm5vZGVfbW9kdWxlcy9kZWxheWVkLXN0cmVhbS9saWIvZGVsYXllZF9zdHJlYW0uanMiLCAibm9kZV9tb2R1bGVzL2NvbWJpbmVkLXN0cmVhbS9saWIvY29tYmluZWRfc3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1ZXN0L2xpYi9tdWx0aXBhcnQuanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL3JlZGlyZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy90dW5uZWwtYWdlbnQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL3R1bm5lbC5qcyIsICJub2RlX21vZHVsZXMvcGVyZm9ybWFuY2Utbm93L2xpYi9zcmMvcGVyZm9ybWFuY2Utbm93LmNvZmZlZSIsICJub2RlX21vZHVsZXMvcmVxdWVzdC9yZXF1ZXN0LmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1ZXN0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pc2V4ZS93aW5kb3dzLmpzIiwgIm5vZGVfbW9kdWxlcy9pc2V4ZS9tb2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9pc2V4ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvd2hpY2gvd2hpY2guanMiLCAic3JjL21haW4udHMiLCAic3JjL29wdGlvbnMudHMiLCAic3JjL3V0aWxzLnRzIiwgInNyYy9kZXNrdG9wLnRzIiwgInNyYy9jb25zdGFudHMudHMiLCAic3JjL2xvZ2dlci50cyIsICJzcmMvZGVwZW5kZW5jaWVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnRzLnJlcXVpcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9uc1tcImVsZWN0cm9uXCJdKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEZzID0gcmVxdWlyZShcIm9yaWdpbmFsLWZzXCIpO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9yaWdpbmFsRnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gICAgcmV0dXJuIHJlcXVpcmUoXCJmc1wiKTtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLyogVGhlIGxvY2FsIGZpbGUgaGVhZGVyICovXG4gICAgTE9DSERSICAgICAgICAgICA6IDMwLCAvLyBMT0MgaGVhZGVyIHNpemVcbiAgICBMT0NTSUcgICAgICAgICAgIDogMHgwNDAzNGI1MCwgLy8gXCJQS1xcMDAzXFwwMDRcIlxuICAgIExPQ1ZFUiAgICAgICAgICAgOiA0LFx0Ly8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdFxuICAgIExPQ0ZMRyAgICAgICAgICAgOiA2LCAvLyBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWdcbiAgICBMT0NIT1cgICAgICAgICAgIDogOCwgLy8gY29tcHJlc3Npb24gbWV0aG9kXG4gICAgTE9DVElNICAgICAgICAgICA6IDEwLCAvLyBtb2RpZmljYXRpb24gdGltZSAoMiBieXRlcyB0aW1lLCAyIGJ5dGVzIGRhdGUpXG4gICAgTE9DQ1JDICAgICAgICAgICA6IDE0LCAvLyB1bmNvbXByZXNzZWQgZmlsZSBjcmMtMzIgdmFsdWVcbiAgICBMT0NTSVogICAgICAgICAgIDogMTgsIC8vIGNvbXByZXNzZWQgc2l6ZVxuICAgIExPQ0xFTiAgICAgICAgICAgOiAyMiwgLy8gdW5jb21wcmVzc2VkIHNpemVcbiAgICBMT0NOQU0gICAgICAgICAgIDogMjYsIC8vIGZpbGVuYW1lIGxlbmd0aFxuICAgIExPQ0VYVCAgICAgICAgICAgOiAyOCwgLy8gZXh0cmEgZmllbGQgbGVuZ3RoXG5cbiAgICAvKiBUaGUgRGF0YSBkZXNjcmlwdG9yICovXG4gICAgRVhUU0lHICAgICAgICAgICA6IDB4MDgwNzRiNTAsIC8vIFwiUEtcXDAwN1xcMDA4XCJcbiAgICBFWFRIRFIgICAgICAgICAgIDogMTYsIC8vIEVYVCBoZWFkZXIgc2l6ZVxuICAgIEVYVENSQyAgICAgICAgICAgOiA0LCAvLyB1bmNvbXByZXNzZWQgZmlsZSBjcmMtMzIgdmFsdWVcbiAgICBFWFRTSVogICAgICAgICAgIDogOCwgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgRVhUTEVOICAgICAgICAgICA6IDEyLCAvLyB1bmNvbXByZXNzZWQgc2l6ZVxuXG4gICAgLyogVGhlIGNlbnRyYWwgZGlyZWN0b3J5IGZpbGUgaGVhZGVyICovXG4gICAgQ0VOSERSICAgICAgICAgICA6IDQ2LCAvLyBDRU4gaGVhZGVyIHNpemVcbiAgICBDRU5TSUcgICAgICAgICAgIDogMHgwMjAxNGI1MCwgLy8gXCJQS1xcMDAxXFwwMDJcIlxuICAgIENFTlZFTSAgICAgICAgICAgOiA0LCAvLyB2ZXJzaW9uIG1hZGUgYnlcbiAgICBDRU5WRVIgICAgICAgICAgIDogNiwgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdFxuICAgIENFTkZMRyAgICAgICAgICAgOiA4LCAvLyBlbmNyeXB0LCBkZWNyeXB0IGZsYWdzXG4gICAgQ0VOSE9XICAgICAgICAgICA6IDEwLCAvLyBjb21wcmVzc2lvbiBtZXRob2RcbiAgICBDRU5USU0gICAgICAgICAgIDogMTIsIC8vIG1vZGlmaWNhdGlvbiB0aW1lICgyIGJ5dGVzIHRpbWUsIDIgYnl0ZXMgZGF0ZSlcbiAgICBDRU5DUkMgICAgICAgICAgIDogMTYsIC8vIHVuY29tcHJlc3NlZCBmaWxlIGNyYy0zMiB2YWx1ZVxuICAgIENFTlNJWiAgICAgICAgICAgOiAyMCwgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgQ0VOTEVOICAgICAgICAgICA6IDI0LCAvLyB1bmNvbXByZXNzZWQgc2l6ZVxuICAgIENFTk5BTSAgICAgICAgICAgOiAyOCwgLy8gZmlsZW5hbWUgbGVuZ3RoXG4gICAgQ0VORVhUICAgICAgICAgICA6IDMwLCAvLyBleHRyYSBmaWVsZCBsZW5ndGhcbiAgICBDRU5DT00gICAgICAgICAgIDogMzIsIC8vIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICBDRU5EU0sgICAgICAgICAgIDogMzQsIC8vIHZvbHVtZSBudW1iZXIgc3RhcnRcbiAgICBDRU5BVFQgICAgICAgICAgIDogMzYsIC8vIGludGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIENFTkFUWCAgICAgICAgICAgOiAzOCwgLy8gZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIChob3N0IHN5c3RlbSBkZXBlbmRlbnQpXG4gICAgQ0VOT0ZGICAgICAgICAgICA6IDQyLCAvLyBMT0MgaGVhZGVyIG9mZnNldFxuXG4gICAgLyogVGhlIGVudHJpZXMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqL1xuICAgIEVOREhEUiAgICAgICAgICAgOiAyMiwgLy8gRU5EIGhlYWRlciBzaXplXG4gICAgRU5EU0lHICAgICAgICAgICA6IDB4MDYwNTRiNTAsIC8vIFwiUEtcXDAwNVxcMDA2XCJcbiAgICBFTkRTVUIgICAgICAgICAgIDogOCwgLy8gbnVtYmVyIG9mIGVudHJpZXMgb24gdGhpcyBkaXNrXG4gICAgRU5EVE9UICAgICAgICAgICA6IDEwLCAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllc1xuICAgIEVORFNJWiAgICAgICAgICAgOiAxMiwgLy8gY2VudHJhbCBkaXJlY3Rvcnkgc2l6ZSBpbiBieXRlc1xuICAgIEVORE9GRiAgICAgICAgICAgOiAxNiwgLy8gb2Zmc2V0IG9mIGZpcnN0IENFTiBoZWFkZXJcbiAgICBFTkRDT00gICAgICAgICAgIDogMjAsIC8vIHppcCBmaWxlIGNvbW1lbnQgbGVuZ3RoXG5cbiAgICBFTkQ2NEhEUiAgICAgICAgIDogMjAsIC8vIHppcDY0IEVORCBoZWFkZXIgc2l6ZVxuICAgIEVORDY0U0lHICAgICAgICAgOiAweDA3MDY0YjUwLCAvLyB6aXA2NCBMb2NhdG9yIHNpZ25hdHVyZSwgXCJQS1xcMDA2XFwwMDdcIlxuICAgIEVORDY0U1RBUlQgICAgICAgOiA0LCAvLyBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0XG4gICAgRU5ENjRPRkYgICAgICAgICA6IDgsIC8vIHJlbGF0aXZlIG9mZnNldCBvZiB0aGUgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XG4gICAgRU5ENjROVU1ESVNLUyAgICA6IDE2LCAvLyB0b3RhbCBudW1iZXIgb2YgZGlza3NcblxuICAgIFpJUDY0U0lHICAgICAgICAgOiAweDA2MDY0YjUwLCAvLyB6aXA2NCBzaWduYXR1cmUsIFwiUEtcXDAwNlxcMDA2XCJcbiAgICBaSVA2NEhEUiAgICAgICAgIDogNTYsIC8vIHppcDY0IHJlY29yZCBtaW5pbXVtIHNpemVcbiAgICBaSVA2NExFQUQgICAgICAgIDogMTIsIC8vIGxlYWRpbmcgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQsIG5vdCBjb3VudGVkIGJ5IHRoZSB2YWx1ZSBzdG9yZWQgaW4gWklQNjRTSVpFXG4gICAgWklQNjRTSVpFICAgICAgICA6IDQsIC8vIHppcDY0IHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZFxuICAgIFpJUDY0VkVNICAgICAgICAgOiAxMiwgLy8gemlwNjQgdmVyc2lvbiBtYWRlIGJ5XG4gICAgWklQNjRWRVIgICAgICAgICA6IDE0LCAvLyB6aXA2NCB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0XG4gICAgWklQNjREU0sgICAgICAgICA6IDE2LCAvLyB6aXA2NCBudW1iZXIgb2YgdGhpcyBkaXNrXG4gICAgWklQNjREU0tESVIgICAgICA6IDIwLCAvLyBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZCBkaXJlY3RvcnlcbiAgICBaSVA2NFNVQiAgICAgICAgIDogMjQsIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoaXMgZGlza1xuICAgIFpJUDY0VE9UICAgICAgICAgOiAzMiwgLy8gdG90YWwgbnVtYmVyIG9mIGVudHJpZXNcbiAgICBaSVA2NFNJWkIgICAgICAgIDogNDAsIC8vIHppcDY0IGNlbnRyYWwgZGlyZWN0b3J5IHNpemUgaW4gYnl0ZXNcbiAgICBaSVA2NE9GRiAgICAgICAgIDogNDgsIC8vIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyXG4gICAgWklQNjRFWFRSQSAgICAgICA6IDU2LCAvLyBleHRlbnNpYmxlIGRhdGEgc2VjdG9yXG5cbiAgICAvKiBDb21wcmVzc2lvbiBtZXRob2RzICovXG4gICAgU1RPUkVEICAgICAgICAgICA6IDAsIC8vIG5vIGNvbXByZXNzaW9uXG4gICAgU0hSVU5LICAgICAgICAgICA6IDEsIC8vIHNocnVua1xuICAgIFJFRFVDRUQxICAgICAgICAgOiAyLCAvLyByZWR1Y2VkIHdpdGggY29tcHJlc3Npb24gZmFjdG9yIDFcbiAgICBSRURVQ0VEMiAgICAgICAgIDogMywgLy8gcmVkdWNlZCB3aXRoIGNvbXByZXNzaW9uIGZhY3RvciAyXG4gICAgUkVEVUNFRDMgICAgICAgICA6IDQsIC8vIHJlZHVjZWQgd2l0aCBjb21wcmVzc2lvbiBmYWN0b3IgM1xuICAgIFJFRFVDRUQ0ICAgICAgICAgOiA1LCAvLyByZWR1Y2VkIHdpdGggY29tcHJlc3Npb24gZmFjdG9yIDRcbiAgICBJTVBMT0RFRCAgICAgICAgIDogNiwgLy8gaW1wbG9kZWRcbiAgICAvLyA3IHJlc2VydmVkIGZvciBUb2tlbml6aW5nIGNvbXByZXNzaW9uIGFsZ29yaXRobVxuICAgIERFRkxBVEVEICAgICAgICAgOiA4LCAvLyBkZWZsYXRlZFxuICAgIEVOSEFOQ0VEX0RFRkxBVEVEOiA5LCAvLyBlbmhhbmNlZCBkZWZsYXRlZFxuICAgIFBLV0FSRSAgICAgICAgICAgOiAxMCwvLyBQS1dhcmUgRENMIGltcGxvZGVkXG4gICAgLy8gMTEgcmVzZXJ2ZWQgYnkgUEtXQVJFXG4gICAgQlpJUDIgICAgICAgICAgICA6IDEyLCAvLyAgY29tcHJlc3NlZCB1c2luZyBCWklQMlxuICAgIC8vIDEzIHJlc2VydmVkIGJ5IFBLV0FSRVxuICAgIExaTUEgICAgICAgICAgICAgOiAxNCwgLy8gTFpNQVxuICAgIC8vIDE1LTE3IHJlc2VydmVkIGJ5IFBLV0FSRVxuICAgIElCTV9URVJTRSAgICAgICAgOiAxOCwgLy8gY29tcHJlc3NlZCB1c2luZyBJQk0gVEVSU0VcbiAgICBJQk1fTFo3NyAgICAgICAgIDogMTksIC8vIElCTSBMWjc3IHpcbiAgICBBRVNfRU5DUllQVCAgICAgIDogOTksIC8vIFdpblpJUCBBRVMgZW5jcnlwdGlvbiBtZXRob2RcblxuICAgIC8qIEdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZyAqL1xuICAgIC8vIHZhbHVlcyBjYW4gb2J0YWluZWQgd2l0aCBleHByZXNzaW9uIDIqKmJpdG5yXG4gICAgRkxHX0VOQyAgICAgICAgICA6IDEsICAgIC8vIEJpdCAwOiBlbmNyeXB0ZWQgZmlsZVxuICAgIEZMR19DT01QMSAgICAgICAgOiAyLCAgICAvLyBCaXQgMSwgY29tcHJlc3Npb24gb3B0aW9uXG4gICAgRkxHX0NPTVAyICAgICAgICA6IDQsICAgIC8vIEJpdCAyLCBjb21wcmVzc2lvbiBvcHRpb25cbiAgICBGTEdfREVTQyAgICAgICAgIDogOCwgICAgLy8gQml0IDMsIGRhdGEgZGVzY3JpcHRvclxuICAgIEZMR19FTkggICAgICAgICAgOiAxNiwgICAvLyBCaXQgNCwgZW5oYW5jZWQgZGVmbGF0aW5nXG4gICAgRkxHX1BBVENIICAgICAgICA6IDMyLCAgIC8vIEJpdCA1LCBpbmRpY2F0ZXMgdGhhdCB0aGUgZmlsZSBpcyBjb21wcmVzc2VkIHBhdGNoZWQgZGF0YS5cbiAgICBGTEdfU1RSICAgICAgICAgIDogNjQsICAgLy8gQml0IDYsIHN0cm9uZyBlbmNyeXB0aW9uIChwYXRlbnRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyA3LTEwOiBDdXJyZW50bHkgdW51c2VkLlxuICAgIEZMR19FRlMgICAgICAgICAgOiAyMDQ4LCAvLyBCaXQgMTE6IExhbmd1YWdlIGVuY29kaW5nIGZsYWcgKEVGUylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0IDEyOiBSZXNlcnZlZCBieSBQS1dBUkUgZm9yIGVuaGFuY2VkIGNvbXByZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQgMTM6IGVuY3J5cHRlZCB0aGUgQ2VudHJhbCBEaXJlY3RvcnkgKHBhdGVudGVkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAxNC0xNTogUmVzZXJ2ZWQgYnkgUEtXQVJFLlxuICAgIEZMR19NU0sgICAgICAgICAgOiA0MDk2LCAvLyBtYXNrIGhlYWRlciB2YWx1ZXNcblxuICAgIC8qIExvYWQgdHlwZSAqL1xuICAgIEZJTEUgICAgICAgICAgICAgOiAyLFxuICAgIEJVRkZFUiAgICAgICAgICAgOiAxLFxuICAgIE5PTkUgICAgICAgICAgICAgOiAwLFxuXG4gICAgLyogNC41IEV4dGVuc2libGUgZGF0YSBmaWVsZHMgKi9cbiAgICBFRl9JRCAgICAgICAgICAgIDogMCxcbiAgICBFRl9TSVpFICAgICAgICAgIDogMixcblxuICAgIC8qIEhlYWRlciBJRHMgKi9cbiAgICBJRF9aSVA2NCAgICAgICAgIDogMHgwMDAxLFxuICAgIElEX0FWSU5GTyAgICAgICAgOiAweDAwMDcsXG4gICAgSURfUEZTICAgICAgICAgICA6IDB4MDAwOCxcbiAgICBJRF9PUzIgICAgICAgICAgIDogMHgwMDA5LFxuICAgIElEX05URlMgICAgICAgICAgOiAweDAwMGEsXG4gICAgSURfT1BFTlZNUyAgICAgICA6IDB4MDAwYyxcbiAgICBJRF9VTklYICAgICAgICAgIDogMHgwMDBkLFxuICAgIElEX0ZPUksgICAgICAgICAgOiAweDAwMGUsXG4gICAgSURfUEFUQ0ggICAgICAgICA6IDB4MDAwZixcbiAgICBJRF9YNTA5X1BLQ1M3ICAgIDogMHgwMDE0LFxuICAgIElEX1g1MDlfQ0VSVElEX0YgOiAweDAwMTUsXG4gICAgSURfWDUwOV9DRVJUSURfQyA6IDB4MDAxNixcbiAgICBJRF9TVFJPTkdFTkMgICAgIDogMHgwMDE3LFxuICAgIElEX1JFQ09SRF9NR1QgICAgOiAweDAwMTgsXG4gICAgSURfWDUwOV9QS0NTN19STCA6IDB4MDAxOSxcbiAgICBJRF9JQk0xICAgICAgICAgIDogMHgwMDY1LFxuICAgIElEX0lCTTIgICAgICAgICAgOiAweDAwNjYsXG4gICAgSURfUE9TWklQICAgICAgICA6IDB4NDY5MCxcblxuICAgIEVGX1pJUDY0X09SXzMyICAgOiAweGZmZmZmZmZmLFxuICAgIEVGX1pJUDY0X09SXzE2ICAgOiAweGZmZmYsXG4gICAgRUZfWklQNjRfU1VOQ09NUCA6IDAsXG4gICAgRUZfWklQNjRfU0NPTVAgICA6IDgsXG4gICAgRUZfWklQNjRfUkhPICAgICA6IDE2LFxuICAgIEVGX1pJUDY0X0RTTiAgICAgOiAyNFxufTtcbiIsICJjb25zdCBmc3lzdGVtID0gcmVxdWlyZShcIi4vZmlsZVN5c3RlbVwiKS5yZXF1aXJlKCk7XG5jb25zdCBwdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IENvbnN0YW50cyA9IHJlcXVpcmUoXCIuL2NvbnN0YW50c1wiKTtcbmNvbnN0IGlzV2luID0gdHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgXCJ3aW4zMlwiID09PSBwcm9jZXNzLnBsYXRmb3JtO1xuXG5jb25zdCBpc19PYmogPSAob2JqKSA9PiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIjtcblxuLy8gZ2VuZXJhdGUgQ1JDMzIgbG9va3VwIHRhYmxlXG5jb25zdCBjcmNUYWJsZSA9IG5ldyBVaW50MzJBcnJheSgyNTYpLm1hcCgodCwgYykgPT4ge1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICAgIGlmICgoYyAmIDEpICE9PSAwKSB7XG4gICAgICAgICAgICBjID0gMHhlZGI4ODMyMCBeIChjID4+PiAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgPj4+PSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4+PiAwO1xufSk7XG5cbi8vIFVUSUxTIGZ1bmN0aW9uc1xuXG5mdW5jdGlvbiBVdGlscyhvcHRzKSB7XG4gICAgdGhpcy5zZXAgPSBwdGguc2VwO1xuICAgIHRoaXMuZnMgPSBmc3lzdGVtO1xuXG4gICAgaWYgKGlzX09iaihvcHRzKSkge1xuICAgICAgICAvLyBjdXN0b20gZmlsZXN5c3RlbVxuICAgICAgICBpZiAoaXNfT2JqKG9wdHMuZnMpICYmIHR5cGVvZiBvcHRzLmZzLnN0YXRTeW5jID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZnMgPSBvcHRzLmZzO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFV0aWxzO1xuXG4vLyBJTlNUQU5DRUQgZnVuY3Rpb25zXG5cblV0aWxzLnByb3RvdHlwZS5tYWtlRGlyID0gZnVuY3Rpb24gKC8qU3RyaW5nKi8gZm9sZGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTeW5jIC0gbWFrZSBkaXJlY3RvcmllcyB0cmVlXG4gICAgZnVuY3Rpb24gbWtkaXJTeW5jKC8qU3RyaW5nKi8gZnBhdGgpIHtcbiAgICAgICAgbGV0IHJlc29sdmVkUGF0aCA9IGZwYXRoLnNwbGl0KHNlbGYuc2VwKVswXTtcbiAgICAgICAgZnBhdGguc3BsaXQoc2VsZi5zZXApLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGlmICghbmFtZSB8fCBuYW1lLnN1YnN0cigtMSwgMSkgPT09IFwiOlwiKSByZXR1cm47XG4gICAgICAgICAgICByZXNvbHZlZFBhdGggKz0gc2VsZi5zZXAgKyBuYW1lO1xuICAgICAgICAgICAgdmFyIHN0YXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXQgPSBzZWxmLmZzLnN0YXRTeW5jKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5mcy5ta2RpclN5bmMocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ICYmIHN0YXQuaXNGaWxlKCkpIHRocm93IEVycm9ycy5GSUxFX0lOX1RIRV9XQVkucmVwbGFjZShcIiVzXCIsIHJlc29sdmVkUGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1rZGlyU3luYyhmb2xkZXIpO1xufTtcblxuVXRpbHMucHJvdG90eXBlLndyaXRlRmlsZVRvID0gZnVuY3Rpb24gKC8qU3RyaW5nKi8gcGF0aCwgLypCdWZmZXIqLyBjb250ZW50LCAvKkJvb2xlYW4qLyBvdmVyd3JpdGUsIC8qTnVtYmVyKi8gYXR0cikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmZzLmV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgICAgaWYgKCFvdmVyd3JpdGUpIHJldHVybiBmYWxzZTsgLy8gY2Fubm90IG92ZXJ3cml0ZVxuXG4gICAgICAgIHZhciBzdGF0ID0gc2VsZi5mcy5zdGF0U3luYyhwYXRoKTtcbiAgICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBmb2xkZXIgPSBwdGguZGlybmFtZShwYXRoKTtcbiAgICBpZiAoIXNlbGYuZnMuZXhpc3RzU3luYyhmb2xkZXIpKSB7XG4gICAgICAgIHNlbGYubWFrZURpcihmb2xkZXIpO1xuICAgIH1cblxuICAgIHZhciBmZDtcbiAgICB0cnkge1xuICAgICAgICBmZCA9IHNlbGYuZnMub3BlblN5bmMocGF0aCwgXCJ3XCIsIDQzOCk7IC8vIDA2NjZcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNlbGYuZnMuY2htb2RTeW5jKHBhdGgsIDQzOCk7XG4gICAgICAgIGZkID0gc2VsZi5mcy5vcGVuU3luYyhwYXRoLCBcIndcIiwgNDM4KTtcbiAgICB9XG4gICAgaWYgKGZkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWxmLmZzLndyaXRlU3luYyhmZCwgY29udGVudCwgMCwgY29udGVudC5sZW5ndGgsIDApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2VsZi5mcy5jbG9zZVN5bmMoZmQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlbGYuZnMuY2htb2RTeW5jKHBhdGgsIGF0dHIgfHwgNDM4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cblV0aWxzLnByb3RvdHlwZS53cml0ZUZpbGVUb0FzeW5jID0gZnVuY3Rpb24gKC8qU3RyaW5nKi8gcGF0aCwgLypCdWZmZXIqLyBjb250ZW50LCAvKkJvb2xlYW4qLyBvdmVyd3JpdGUsIC8qTnVtYmVyKi8gYXR0ciwgLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBhdHRyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBhdHRyO1xuICAgICAgICBhdHRyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgc2VsZi5mcy5leGlzdHMocGF0aCwgZnVuY3Rpb24gKGV4aXN0KSB7XG4gICAgICAgIGlmIChleGlzdCAmJiAhb3ZlcndyaXRlKSByZXR1cm4gY2FsbGJhY2soZmFsc2UpO1xuXG4gICAgICAgIHNlbGYuZnMuc3RhdChwYXRoLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICAgICAgICBpZiAoZXhpc3QgJiYgc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGZvbGRlciA9IHB0aC5kaXJuYW1lKHBhdGgpO1xuICAgICAgICAgICAgc2VsZi5mcy5leGlzdHMoZm9sZGVyLCBmdW5jdGlvbiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHNlbGYubWFrZURpcihmb2xkZXIpO1xuXG4gICAgICAgICAgICAgICAgc2VsZi5mcy5vcGVuKHBhdGgsIFwid1wiLCA0MzgsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnMuY2htb2QocGF0aCwgNDM4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mcy5vcGVuKHBhdGgsIFwid1wiLCA0MzgsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnMud3JpdGUoZmQsIGNvbnRlbnQsIDAsIGNvbnRlbnQubGVuZ3RoLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZzLmNsb3NlKGZkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mcy5jaG1vZChwYXRoLCBhdHRyIHx8IDQzOCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZzLndyaXRlKGZkLCBjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnMuY2xvc2UoZmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mcy5jaG1vZChwYXRoLCBhdHRyIHx8IDQzOCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZzLmNobW9kKHBhdGgsIGF0dHIgfHwgNDM4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuVXRpbHMucHJvdG90eXBlLmZpbmRGaWxlcyA9IGZ1bmN0aW9uICgvKlN0cmluZyovIHBhdGgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGZpbmRTeW5jKC8qU3RyaW5nKi8gZGlyLCAvKlJlZ0V4cCovIHBhdHRlcm4sIC8qQm9vbGVhbiovIHJlY3Vyc2l2ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICByZWN1cnNpdmUgPSBwYXR0ZXJuO1xuICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICAgICAgc2VsZi5mcy5yZWFkZGlyU3luYyhkaXIpLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAgIHZhciBwYXRoID0gcHRoLmpvaW4oZGlyLCBmaWxlKTtcblxuICAgICAgICAgICAgaWYgKHNlbGYuZnMuc3RhdFN5bmMocGF0aCkuaXNEaXJlY3RvcnkoKSAmJiByZWN1cnNpdmUpIGZpbGVzID0gZmlsZXMuY29uY2F0KGZpbmRTeW5jKHBhdGgsIHBhdHRlcm4sIHJlY3Vyc2l2ZSkpO1xuXG4gICAgICAgICAgICBpZiAoIXBhdHRlcm4gfHwgcGF0dGVybi50ZXN0KHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChwdGgubm9ybWFsaXplKHBhdGgpICsgKHNlbGYuZnMuc3RhdFN5bmMocGF0aCkuaXNEaXJlY3RvcnkoKSA/IHNlbGYuc2VwIDogXCJcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIHJldHVybiBmaW5kU3luYyhwYXRoLCB1bmRlZmluZWQsIHRydWUpO1xufTtcblxuVXRpbHMucHJvdG90eXBlLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7fTtcblxuVXRpbHMucHJvdG90eXBlLnNldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7fTtcblxuLy8gU1RBVElDIGZ1bmN0aW9uc1xuXG4vLyBjcmMzMiBzaW5nbGUgdXBkYXRlIChpdCBpcyBwYXJ0IG9mIGNyYzMyKVxuVXRpbHMuY3JjMzJ1cGRhdGUgPSBmdW5jdGlvbiAoY3JjLCBieXRlKSB7XG4gICAgcmV0dXJuIGNyY1RhYmxlWyhjcmMgXiBieXRlKSAmIDB4ZmZdIF4gKGNyYyA+Pj4gOCk7XG59O1xuXG5VdGlscy5jcmMzMiA9IGZ1bmN0aW9uIChidWYpIHtcbiAgICBpZiAodHlwZW9mIGJ1ZiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYsIFwidXRmOFwiKTtcbiAgICB9XG4gICAgLy8gR2VuZXJhdGUgY3JjVGFibGVcbiAgICBpZiAoIWNyY1RhYmxlLmxlbmd0aCkgZ2VuQ1JDVGFibGUoKTtcblxuICAgIGxldCBsZW4gPSBidWYubGVuZ3RoO1xuICAgIGxldCBjcmMgPSB+MDtcbiAgICBmb3IgKGxldCBvZmYgPSAwOyBvZmYgPCBsZW47ICkgY3JjID0gVXRpbHMuY3JjMzJ1cGRhdGUoY3JjLCBidWZbb2ZmKytdKTtcbiAgICAvLyB4b3IgYW5kIGNhc3QgYXMgdWludDMyIG51bWJlclxuICAgIHJldHVybiB+Y3JjID4+PiAwO1xufTtcblxuVXRpbHMubWV0aG9kVG9TdHJpbmcgPSBmdW5jdGlvbiAoLypOdW1iZXIqLyBtZXRob2QpIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICBjYXNlIENvbnN0YW50cy5TVE9SRUQ6XG4gICAgICAgICAgICByZXR1cm4gXCJTVE9SRUQgKFwiICsgbWV0aG9kICsgXCIpXCI7XG4gICAgICAgIGNhc2UgQ29uc3RhbnRzLkRFRkxBVEVEOlxuICAgICAgICAgICAgcmV0dXJuIFwiREVGTEFURUQgKFwiICsgbWV0aG9kICsgXCIpXCI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gXCJVTlNVUFBPUlRFRCAoXCIgKyBtZXRob2QgKyBcIilcIjtcbiAgICB9XG59O1xuXG4vLyByZW1vdmVzIFwiLi5cIiBzdHlsZSBwYXRoIGVsZW1lbnRzXG5VdGlscy5jYW5vbmljYWwgPSBmdW5jdGlvbiAoLypzdHJpbmcqLyBwYXRoKSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gXCJcIjtcbiAgICAvLyB0cmljayBub3JtYWxpemUgdGhpbmsgcGF0aCBpcyBhYnNvbHV0ZVxuICAgIHZhciBzYWZlU3VmZml4ID0gcHRoLnBvc2l4Lm5vcm1hbGl6ZShcIi9cIiArIHBhdGguc3BsaXQoXCJcXFxcXCIpLmpvaW4oXCIvXCIpKTtcbiAgICByZXR1cm4gcHRoLmpvaW4oXCIuXCIsIHNhZmVTdWZmaXgpO1xufTtcblxuLy8gbWFrZSBhYm9sdXRlIHBhdGhzIHRha2luZyBwcmVmaXggYXMgcm9vdCBmb2xkZXJcblV0aWxzLnNhbml0aXplID0gZnVuY3Rpb24gKC8qc3RyaW5nKi8gcHJlZml4LCAvKnN0cmluZyovIG5hbWUpIHtcbiAgICBwcmVmaXggPSBwdGgucmVzb2x2ZShwdGgubm9ybWFsaXplKHByZWZpeCkpO1xuICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoXCIvXCIpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXRoID0gcHRoLm5vcm1hbGl6ZShwdGguam9pbihwcmVmaXgsIHBhcnRzLnNsaWNlKGksIGwpLmpvaW4ocHRoLnNlcCkpKTtcbiAgICAgICAgaWYgKHBhdGguaW5kZXhPZihwcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHRoLm5vcm1hbGl6ZShwdGguam9pbihwcmVmaXgsIHB0aC5iYXNlbmFtZShuYW1lKSkpO1xufTtcblxuLy8gY29udmVydHMgYnVmZmVyLCBVaW50OEFycmF5LCBzdHJpbmcgdHlwZXMgdG8gYnVmZmVyXG5VdGlscy50b0J1ZmZlciA9IGZ1bmN0aW9uIHRvQnVmZmVyKC8qYnVmZmVyLCBVaW50OEFycmF5LCBzdHJpbmcqLyBpbnB1dCkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oaW5wdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGV4cGVjdCBzdHJpbmcgYWxsIG90aGVyIHZhbHVlcyBhcmUgaW52YWxpZCBhbmQgcmV0dXJuIGVtcHR5IGJ1ZmZlclxuICAgICAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oaW5wdXQsIFwidXRmOFwiKSA6IEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG59O1xuXG5VdGlscy5yZWFkQmlnVUludDY0TEUgPSBmdW5jdGlvbiAoLypCdWZmZXIqLyBidWZmZXIsIC8qaW50Ki8gaW5kZXgpIHtcbiAgICB2YXIgc2xpY2UgPSBCdWZmZXIuZnJvbShidWZmZXIuc2xpY2UoaW5kZXgsIGluZGV4ICsgOCkpO1xuICAgIHNsaWNlLnN3YXA2NCgpO1xuXG4gICAgcmV0dXJuIHBhcnNlSW50KGAweCR7c2xpY2UudG9TdHJpbmcoXCJoZXhcIil9YCk7XG59O1xuXG5VdGlscy5pc1dpbiA9IGlzV2luOyAvLyBEbyB3ZSBoYXZlIHdpbmRvd3Mgc3lzdGVtXG5VdGlscy5jcmNUYWJsZSA9IGNyY1RhYmxlO1xuIiwgIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qIEhlYWRlciBlcnJvciBtZXNzYWdlcyAqL1xuICAgIElOVkFMSURfTE9DOiBcIkludmFsaWQgTE9DIGhlYWRlciAoYmFkIHNpZ25hdHVyZSlcIixcbiAgICBJTlZBTElEX0NFTjogXCJJbnZhbGlkIENFTiBoZWFkZXIgKGJhZCBzaWduYXR1cmUpXCIsXG4gICAgSU5WQUxJRF9FTkQ6IFwiSW52YWxpZCBFTkQgaGVhZGVyIChiYWQgc2lnbmF0dXJlKVwiLFxuXG4gICAgLyogWmlwRW50cnkgZXJyb3IgbWVzc2FnZXMqL1xuICAgIE5PX0RBVEE6IFwiTm90aGluZyB0byBkZWNvbXByZXNzXCIsXG4gICAgQkFEX0NSQzogXCJDUkMzMiBjaGVja3N1bSBmYWlsZWRcIixcbiAgICBGSUxFX0lOX1RIRV9XQVk6IFwiVGhlcmUgaXMgYSBmaWxlIGluIHRoZSB3YXk6ICVzXCIsXG4gICAgVU5LTk9XTl9NRVRIT0Q6IFwiSW52YWxpZC91bnN1cHBvcnRlZCBjb21wcmVzc2lvbiBtZXRob2RcIixcblxuICAgIC8qIEluZmxhdGVyIGVycm9yIG1lc3NhZ2VzICovXG4gICAgQVZBSUxfREFUQTogXCJpbmZsYXRlOjpBdmFpbGFibGUgaW5mbGF0ZSBkYXRhIGRpZCBub3QgdGVybWluYXRlXCIsXG4gICAgSU5WQUxJRF9ESVNUQU5DRTogXCJpbmZsYXRlOjpJbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIG9yIGRpc3RhbmNlIGNvZGUgaW4gZml4ZWQgb3IgZHluYW1pYyBibG9ja1wiLFxuICAgIFRPX01BTllfQ09ERVM6IFwiaW5mbGF0ZTo6RHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiB0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2UgY29kZXNcIixcbiAgICBJTlZBTElEX1JFUEVBVF9MRU46IFwiaW5mbGF0ZTo6RHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiByZXBlYXQgbW9yZSB0aGFuIHNwZWNpZmllZCBsZW5ndGhzXCIsXG4gICAgSU5WQUxJRF9SRVBFQVRfRklSU1Q6IFwiaW5mbGF0ZTo6RHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiByZXBlYXQgbGVuZ3RocyB3aXRoIG5vIGZpcnN0IGxlbmd0aFwiLFxuICAgIElOQ09NUExFVEVfQ09ERVM6IFwiaW5mbGF0ZTo6RHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiBjb2RlIGxlbmd0aHMgY29kZXMgaW5jb21wbGV0ZVwiLFxuICAgIElOVkFMSURfRFlOX0RJU1RBTkNFOiBcImluZmxhdGU6OkR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogaW52YWxpZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHNcIixcbiAgICBJTlZBTElEX0NPREVTX0xFTjogXCJpbmZsYXRlOjpEeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IGludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzXCIsXG4gICAgSU5WQUxJRF9TVE9SRV9CTE9DSzogXCJpbmZsYXRlOjpTdG9yZWQgYmxvY2sgbGVuZ3RoIGRpZCBub3QgbWF0Y2ggb25lJ3MgY29tcGxlbWVudFwiLFxuICAgIElOVkFMSURfQkxPQ0tfVFlQRTogXCJpbmZsYXRlOjpJbnZhbGlkIGJsb2NrIHR5cGUgKHR5cGUgPT0gMylcIixcblxuICAgIC8qIEFETS1aSVAgZXJyb3IgbWVzc2FnZXMgKi9cbiAgICBDQU5UX0VYVFJBQ1RfRklMRTogXCJDb3VsZCBub3QgZXh0cmFjdCB0aGUgZmlsZVwiLFxuICAgIENBTlRfT1ZFUlJJREU6IFwiVGFyZ2V0IGZpbGUgYWxyZWFkeSBleGlzdHNcIixcbiAgICBOT19aSVA6IFwiTm8gemlwIGZpbGUgd2FzIGxvYWRlZFwiLFxuICAgIE5PX0VOVFJZOiBcIkVudHJ5IGRvZXNuJ3QgZXhpc3RcIixcbiAgICBESVJFQ1RPUllfQ09OVEVOVF9FUlJPUjogXCJBIGRpcmVjdG9yeSBjYW5ub3QgaGF2ZSBjb250ZW50XCIsXG4gICAgRklMRV9OT1RfRk9VTkQ6IFwiRmlsZSBub3QgZm91bmQ6ICVzXCIsXG4gICAgTk9UX0lNUExFTUVOVEVEOiBcIk5vdCBpbXBsZW1lbnRlZFwiLFxuICAgIElOVkFMSURfRklMRU5BTUU6IFwiSW52YWxpZCBmaWxlbmFtZVwiLFxuICAgIElOVkFMSURfRk9STUFUOiBcIkludmFsaWQgb3IgdW5zdXBwb3J0ZWQgemlwIGZvcm1hdC4gTm8gRU5EIGhlYWRlciBmb3VuZFwiXG59O1xuIiwgImNvbnN0IGZzID0gcmVxdWlyZShcIi4vZmlsZVN5c3RlbVwiKS5yZXF1aXJlKCk7XG5jb25zdCBwdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuZnMuZXhpc3RzU3luYyA9IGZzLmV4aXN0c1N5bmMgfHwgcHRoLmV4aXN0c1N5bmM7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKC8qU3RyaW5nKi8gcGF0aCkge1xuICAgIHZhciBfcGF0aCA9IHBhdGggfHwgXCJcIixcbiAgICAgICAgX29iaiA9IG5ld0F0dHIoKSxcbiAgICAgICAgX3N0YXQgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gbmV3QXR0cigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogZmFsc2UsXG4gICAgICAgICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgICAgZXhlY3V0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtdGltZTogMCxcbiAgICAgICAgICAgIGF0aW1lOiAwXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKF9wYXRoICYmIGZzLmV4aXN0c1N5bmMoX3BhdGgpKSB7XG4gICAgICAgIF9zdGF0ID0gZnMuc3RhdFN5bmMoX3BhdGgpO1xuICAgICAgICBfb2JqLmRpcmVjdG9yeSA9IF9zdGF0LmlzRGlyZWN0b3J5KCk7XG4gICAgICAgIF9vYmoubXRpbWUgPSBfc3RhdC5tdGltZTtcbiAgICAgICAgX29iai5hdGltZSA9IF9zdGF0LmF0aW1lO1xuICAgICAgICBfb2JqLmV4ZWN1dGFibGUgPSAoMG8xMTEgJiBfc3RhdC5tb2RlKSAhPT0gMDsgLy8gZmlsZSBpcyBleGVjdXRhYmxlIHdobyBldmVyIGhhciByaWdodCBub3QganVzdCBvd25lclxuICAgICAgICBfb2JqLnJlYWRvbmx5ID0gKDBvMjAwICYgX3N0YXQubW9kZSkgPT09IDA7IC8vIHJlYWRvbmx5IGlmIG93bmVyIGhhcyBubyB3cml0ZSByaWdodFxuICAgICAgICBfb2JqLmhpZGRlbiA9IHB0aC5iYXNlbmFtZShfcGF0aClbMF0gPT09IFwiLlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkludmFsaWQgcGF0aDogXCIgKyBfcGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0IGRpcmVjdG9yeSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqLmRpcmVjdG9yeTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgcmVhZE9ubHkoKSB7XG4gICAgICAgICAgICByZXR1cm4gX29iai5yZWFkb25seTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgaGlkZGVuKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYmouaGlkZGVuO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBtdGltZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqLm10aW1lO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBhdGltZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqLmF0aW1lO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBleGVjdXRhYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYmouZXhlY3V0YWJsZTtcbiAgICAgICAgfSxcblxuICAgICAgICBkZWNvZGVBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoKSB7fSxcblxuICAgICAgICBlbmNvZGVBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoKSB7fSxcblxuICAgICAgICB0b0pTT046IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0aDogX3BhdGgsXG4gICAgICAgICAgICAgICAgaXNEaXJlY3Rvcnk6IF9vYmouZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGlzUmVhZE9ubHk6IF9vYmoucmVhZG9ubHksXG4gICAgICAgICAgICAgICAgaXNIaWRkZW46IF9vYmouaGlkZGVuLFxuICAgICAgICAgICAgICAgIGlzRXhlY3V0YWJsZTogX29iai5leGVjdXRhYmxlLFxuICAgICAgICAgICAgICAgIG1UaW1lOiBfb2JqLm10aW1lLFxuICAgICAgICAgICAgICAgIGFUaW1lOiBfb2JqLmF0aW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pTT04oKSwgbnVsbCwgXCJcXHRcIik7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xubW9kdWxlLmV4cG9ydHMuQ29uc3RhbnRzID0gcmVxdWlyZShcIi4vY29uc3RhbnRzXCIpO1xubW9kdWxlLmV4cG9ydHMuRXJyb3JzID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xubW9kdWxlLmV4cG9ydHMuRmlsZUF0dHIgPSByZXF1aXJlKFwiLi9mYXR0clwiKTtcbiIsICJ2YXIgVXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbFwiKSxcbiAgICBDb25zdGFudHMgPSBVdGlscy5Db25zdGFudHM7XG5cbi8qIFRoZSBjZW50cmFsIGRpcmVjdG9yeSBmaWxlIGhlYWRlciAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF92ZXJNYWRlID0gMjAsIC8vIHYyLjBcbiAgICAgICAgX3ZlcnNpb24gPSAxMCwgLy8gdjEuMFxuICAgICAgICBfZmxhZ3MgPSAwLFxuICAgICAgICBfbWV0aG9kID0gMCxcbiAgICAgICAgX3RpbWUgPSAwLFxuICAgICAgICBfY3JjID0gMCxcbiAgICAgICAgX2NvbXByZXNzZWRTaXplID0gMCxcbiAgICAgICAgX3NpemUgPSAwLFxuICAgICAgICBfZm5hbWVMZW4gPSAwLFxuICAgICAgICBfZXh0cmFMZW4gPSAwLFxuICAgICAgICBfY29tTGVuID0gMCxcbiAgICAgICAgX2Rpc2tTdGFydCA9IDAsXG4gICAgICAgIF9pbmF0dHIgPSAwLFxuICAgICAgICBfYXR0ciA9IDAsXG4gICAgICAgIF9vZmZzZXQgPSAwO1xuXG4gICAgX3Zlck1hZGUgfD0gVXRpbHMuaXNXaW4gPyAweDBhMDAgOiAweDAzMDA7XG5cbiAgICAvLyBTZXQgRUZTIGZsYWcgc2luY2UgZmlsZW5hbWUgYW5kIGNvbW1lbnQgZmllbGRzIGFyZSBhbGwgYnkgZGVmYXVsdCBlbmNvZGVkIHVzaW5nIFVURi04LlxuICAgIC8vIFdpdGhvdXQgaXQgZmlsZSBuYW1lcyBtYXkgYmUgY29ycnVwdGVkIGZvciBvdGhlciBhcHBzIHdoZW4gZmlsZSBuYW1lcyB1c2UgdW5pY29kZSBjaGFyc1xuICAgIF9mbGFncyB8PSBDb25zdGFudHMuRkxHX0VGUztcblxuICAgIHZhciBfZGF0YUhlYWRlciA9IHt9O1xuXG4gICAgZnVuY3Rpb24gc2V0VGltZSh2YWwpIHtcbiAgICAgICAgdmFsID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgX3RpbWUgPVxuICAgICAgICAgICAgKCgodmFsLmdldEZ1bGxZZWFyKCkgLSAxOTgwKSAmIDB4N2YpIDw8IDI1KSB8IC8vIGIwOS0xNiB5ZWFycyBmcm9tIDE5ODBcbiAgICAgICAgICAgICgodmFsLmdldE1vbnRoKCkgKyAxKSA8PCAyMSkgfCAvLyBiMDUtMDggbW9udGhcbiAgICAgICAgICAgICh2YWwuZ2V0RGF0ZSgpIDw8IDE2KSB8IC8vIGIwMC0wNCBob3VyXG4gICAgICAgICAgICAvLyAyIGJ5dGVzIHRpbWVcbiAgICAgICAgICAgICh2YWwuZ2V0SG91cnMoKSA8PCAxMSkgfCAvLyBiMTEtMTUgaG91clxuICAgICAgICAgICAgKHZhbC5nZXRNaW51dGVzKCkgPDwgNSkgfCAvLyBiMDUtMTAgbWludXRlXG4gICAgICAgICAgICAodmFsLmdldFNlY29uZHMoKSA+PiAxKTsgLy8gYjAwLTA0IHNlY29uZHMgZGl2aWRlZCBieSAyXG4gICAgfVxuXG4gICAgc2V0VGltZSgrbmV3IERhdGUoKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgbWFkZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdmVyTWFkZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IG1hZGUodmFsKSB7XG4gICAgICAgICAgICBfdmVyTWFkZSA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBfdmVyc2lvbjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IHZlcnNpb24odmFsKSB7XG4gICAgICAgICAgICBfdmVyc2lvbiA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZmxhZ3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2ZsYWdzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgZmxhZ3ModmFsKSB7XG4gICAgICAgICAgICBfZmxhZ3MgPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IG1ldGhvZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfbWV0aG9kO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgbWV0aG9kKHZhbCkge1xuICAgICAgICAgICAgc3dpdGNoICh2YWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5TVE9SRUQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IDEwO1xuICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkRFRkxBVEVEOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IDIwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX21ldGhvZCA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgdGltZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgoKF90aW1lID4+IDI1KSAmIDB4N2YpICsgMTk4MCwgKChfdGltZSA+PiAyMSkgJiAweDBmKSAtIDEsIChfdGltZSA+PiAxNikgJiAweDFmLCAoX3RpbWUgPj4gMTEpICYgMHgxZiwgKF90aW1lID4+IDUpICYgMHgzZiwgKF90aW1lICYgMHgxZikgPDwgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCB0aW1lKHZhbCkge1xuICAgICAgICAgICAgc2V0VGltZSh2YWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBjcmMoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NyYztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGNyYyh2YWwpIHtcbiAgICAgICAgICAgIF9jcmMgPSBNYXRoLm1heCgwLCB2YWwpID4+PiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBjb21wcmVzc2VkU2l6ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfY29tcHJlc3NlZFNpemU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjb21wcmVzc2VkU2l6ZSh2YWwpIHtcbiAgICAgICAgICAgIF9jb21wcmVzc2VkU2l6ZSA9IE1hdGgubWF4KDAsIHZhbCkgPj4+IDA7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3NpemU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBzaXplKHZhbCkge1xuICAgICAgICAgICAgX3NpemUgPSBNYXRoLm1heCgwLCB2YWwpID4+PiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBmaWxlTmFtZUxlbmd0aCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfZm5hbWVMZW47XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBmaWxlTmFtZUxlbmd0aCh2YWwpIHtcbiAgICAgICAgICAgIF9mbmFtZUxlbiA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZXh0cmFMZW5ndGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2V4dHJhTGVuO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgZXh0cmFMZW5ndGgodmFsKSB7XG4gICAgICAgICAgICBfZXh0cmFMZW4gPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IGNvbW1lbnRMZW5ndGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NvbUxlbjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGNvbW1lbnRMZW5ndGgodmFsKSB7XG4gICAgICAgICAgICBfY29tTGVuID0gdmFsO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBkaXNrTnVtU3RhcnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Rpc2tTdGFydDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGRpc2tOdW1TdGFydCh2YWwpIHtcbiAgICAgICAgICAgIF9kaXNrU3RhcnQgPSBNYXRoLm1heCgwLCB2YWwpID4+PiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBpbkF0dHIoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2luYXR0cjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGluQXR0cih2YWwpIHtcbiAgICAgICAgICAgIF9pbmF0dHIgPSBNYXRoLm1heCgwLCB2YWwpID4+PiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBhdHRyKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9hdHRyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgYXR0cih2YWwpIHtcbiAgICAgICAgICAgIF9hdHRyID0gTWF0aC5tYXgoMCwgdmFsKSA+Pj4gMDtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBnZXQgVW5peCBmaWxlIHBlcm1pc3Npb25zXG4gICAgICAgIGdldCBmaWxlQXR0cigpIHtcbiAgICAgICAgICAgIHJldHVybiBfYXR0ciA/ICgoKF9hdHRyID4+PiAwKSB8IDApID4+IDE2KSAmIDB4ZmZmIDogMDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgb2Zmc2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vZmZzZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBvZmZzZXQodmFsKSB7XG4gICAgICAgICAgICBfb2Zmc2V0ID0gTWF0aC5tYXgoMCwgdmFsKSA+Pj4gMDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZW5jcmlwdGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIChfZmxhZ3MgJiAxKSA9PT0gMTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZW50cnlIZWFkZXJTaXplKCkge1xuICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50cy5DRU5IRFIgKyBfZm5hbWVMZW4gKyBfZXh0cmFMZW4gKyBfY29tTGVuO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCByZWFsRGF0YU9mZnNldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2Zmc2V0ICsgQ29uc3RhbnRzLkxPQ0hEUiArIF9kYXRhSGVhZGVyLmZuYW1lTGVuICsgX2RhdGFIZWFkZXIuZXh0cmFMZW47XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IGRhdGFIZWFkZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2RhdGFIZWFkZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbG9hZERhdGFIZWFkZXJGcm9tQmluYXJ5OiBmdW5jdGlvbiAoLypCdWZmZXIqLyBpbnB1dCkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBpbnB1dC5zbGljZShfb2Zmc2V0LCBfb2Zmc2V0ICsgQ29uc3RhbnRzLkxPQ0hEUik7XG4gICAgICAgICAgICAvLyAzMCBieXRlcyBhbmQgc2hvdWxkIHN0YXJ0IHdpdGggXCJQS1xcMDAzXFwwMDRcIlxuICAgICAgICAgICAgaWYgKGRhdGEucmVhZFVJbnQzMkxFKDApICE9PSBDb25zdGFudHMuTE9DU0lHKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5JTlZBTElEX0xPQyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZGF0YUhlYWRlciA9IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkxPQ1ZFUiksXG4gICAgICAgICAgICAgICAgLy8gZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnXG4gICAgICAgICAgICAgICAgZmxhZ3M6IGRhdGEucmVhZFVJbnQxNkxFKENvbnN0YW50cy5MT0NGTEcpLFxuICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICAgICAgICAgICAgICAgIG1ldGhvZDogZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkxPQ0hPVyksXG4gICAgICAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUgKDIgYnl0ZXMgdGltZSwgMiBieXRlcyBkYXRlKVxuICAgICAgICAgICAgICAgIHRpbWU6IGRhdGEucmVhZFVJbnQzMkxFKENvbnN0YW50cy5MT0NUSU0pLFxuICAgICAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBmaWxlIGNyYy0zMiB2YWx1ZVxuICAgICAgICAgICAgICAgIGNyYzogZGF0YS5yZWFkVUludDMyTEUoQ29uc3RhbnRzLkxPQ0NSQyksXG4gICAgICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICAgICAgY29tcHJlc3NlZFNpemU6IGRhdGEucmVhZFVJbnQzMkxFKENvbnN0YW50cy5MT0NTSVopLFxuICAgICAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICAgICAgc2l6ZTogZGF0YS5yZWFkVUludDMyTEUoQ29uc3RhbnRzLkxPQ0xFTiksXG4gICAgICAgICAgICAgICAgLy8gZmlsZW5hbWUgbGVuZ3RoXG4gICAgICAgICAgICAgICAgZm5hbWVMZW46IGRhdGEucmVhZFVJbnQxNkxFKENvbnN0YW50cy5MT0NOQU0pLFxuICAgICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aFxuICAgICAgICAgICAgICAgIGV4dHJhTGVuOiBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuTE9DRVhUKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBsb2FkRnJvbUJpbmFyeTogZnVuY3Rpb24gKC8qQnVmZmVyKi8gZGF0YSkge1xuICAgICAgICAgICAgLy8gZGF0YSBzaG91bGQgYmUgNDYgYnl0ZXMgYW5kIHN0YXJ0IHdpdGggXCJQSyAwMSAwMlwiXG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT09IENvbnN0YW50cy5DRU5IRFIgfHwgZGF0YS5yZWFkVUludDMyTEUoMCkgIT09IENvbnN0YW50cy5DRU5TSUcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLklOVkFMSURfQ0VOKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHZlcnNpb24gbWFkZSBieVxuICAgICAgICAgICAgX3Zlck1hZGUgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuQ0VOVkVNKTtcbiAgICAgICAgICAgIC8vIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3RcbiAgICAgICAgICAgIF92ZXJzaW9uID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkNFTlZFUik7XG4gICAgICAgICAgICAvLyBlbmNyeXB0LCBkZWNyeXB0IGZsYWdzXG4gICAgICAgICAgICBfZmxhZ3MgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuQ0VORkxHKTtcbiAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICAgICAgICAgICAgX21ldGhvZCA9IGRhdGEucmVhZFVJbnQxNkxFKENvbnN0YW50cy5DRU5IT1cpO1xuICAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUgKDIgYnl0ZXMgdGltZSwgMiBieXRlcyBkYXRlKVxuICAgICAgICAgICAgX3RpbWUgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuQ0VOVElNKTtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBmaWxlIGNyYy0zMiB2YWx1ZVxuICAgICAgICAgICAgX2NyYyA9IGRhdGEucmVhZFVJbnQzMkxFKENvbnN0YW50cy5DRU5DUkMpO1xuICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICBfY29tcHJlc3NlZFNpemUgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuQ0VOU0laKTtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICBfc2l6ZSA9IGRhdGEucmVhZFVJbnQzMkxFKENvbnN0YW50cy5DRU5MRU4pO1xuICAgICAgICAgICAgLy8gZmlsZW5hbWUgbGVuZ3RoXG4gICAgICAgICAgICBfZm5hbWVMZW4gPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuQ0VOTkFNKTtcbiAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aFxuICAgICAgICAgICAgX2V4dHJhTGVuID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkNFTkVYVCk7XG4gICAgICAgICAgICAvLyBmaWxlIGNvbW1lbnQgbGVuZ3RoXG4gICAgICAgICAgICBfY29tTGVuID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkNFTkNPTSk7XG4gICAgICAgICAgICAvLyB2b2x1bWUgbnVtYmVyIHN0YXJ0XG4gICAgICAgICAgICBfZGlza1N0YXJ0ID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkNFTkRTSyk7XG4gICAgICAgICAgICAvLyBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIF9pbmF0dHIgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuQ0VOQVRUKTtcbiAgICAgICAgICAgIC8vIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgX2F0dHIgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuQ0VOQVRYKTtcbiAgICAgICAgICAgIC8vIExPQyBoZWFkZXIgb2Zmc2V0XG4gICAgICAgICAgICBfb2Zmc2V0ID0gZGF0YS5yZWFkVUludDMyTEUoQ29uc3RhbnRzLkNFTk9GRik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YUhlYWRlclRvQmluYXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBMT0MgaGVhZGVyIHNpemUgKDMwIGJ5dGVzKVxuICAgICAgICAgICAgdmFyIGRhdGEgPSBCdWZmZXIuYWxsb2MoQ29uc3RhbnRzLkxPQ0hEUik7XG4gICAgICAgICAgICAvLyBcIlBLXFwwMDNcXDAwNFwiXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoQ29uc3RhbnRzLkxPQ1NJRywgMCk7XG4gICAgICAgICAgICAvLyB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0XG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX3ZlcnNpb24sIENvbnN0YW50cy5MT0NWRVIpO1xuICAgICAgICAgICAgLy8gZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX2ZsYWdzLCBDb25zdGFudHMuTE9DRkxHKTtcbiAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKF9tZXRob2QsIENvbnN0YW50cy5MT0NIT1cpO1xuICAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUgKDIgYnl0ZXMgdGltZSwgMiBieXRlcyBkYXRlKVxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKF90aW1lLCBDb25zdGFudHMuTE9DVElNKTtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBmaWxlIGNyYy0zMiB2YWx1ZVxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKF9jcmMsIENvbnN0YW50cy5MT0NDUkMpO1xuICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX2NvbXByZXNzZWRTaXplLCBDb25zdGFudHMuTE9DU0laKTtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX3NpemUsIENvbnN0YW50cy5MT0NMRU4pO1xuICAgICAgICAgICAgLy8gZmlsZW5hbWUgbGVuZ3RoXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX2ZuYW1lTGVuLCBDb25zdGFudHMuTE9DTkFNKTtcbiAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aFxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKF9leHRyYUxlbiwgQ29uc3RhbnRzLkxPQ0VYVCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSxcblxuICAgICAgICBlbnRyeUhlYWRlclRvQmluYXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBDRU4gaGVhZGVyIHNpemUgKDQ2IGJ5dGVzKVxuICAgICAgICAgICAgdmFyIGRhdGEgPSBCdWZmZXIuYWxsb2MoQ29uc3RhbnRzLkNFTkhEUiArIF9mbmFtZUxlbiArIF9leHRyYUxlbiArIF9jb21MZW4pO1xuICAgICAgICAgICAgLy8gXCJQS1xcMDAxXFwwMDJcIlxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKENvbnN0YW50cy5DRU5TSUcsIDApO1xuICAgICAgICAgICAgLy8gdmVyc2lvbiBtYWRlIGJ5XG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX3Zlck1hZGUsIENvbnN0YW50cy5DRU5WRU0pO1xuICAgICAgICAgICAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdFxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKF92ZXJzaW9uLCBDb25zdGFudHMuQ0VOVkVSKTtcbiAgICAgICAgICAgIC8vIGVuY3J5cHQsIGRlY3J5cHQgZmxhZ3NcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MTZMRShfZmxhZ3MsIENvbnN0YW50cy5DRU5GTEcpO1xuICAgICAgICAgICAgLy8gY29tcHJlc3Npb24gbWV0aG9kXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX21ldGhvZCwgQ29uc3RhbnRzLkNFTkhPVyk7XG4gICAgICAgICAgICAvLyBtb2RpZmljYXRpb24gdGltZSAoMiBieXRlcyB0aW1lLCAyIGJ5dGVzIGRhdGUpXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX3RpbWUsIENvbnN0YW50cy5DRU5USU0pO1xuICAgICAgICAgICAgLy8gdW5jb21wcmVzc2VkIGZpbGUgY3JjLTMyIHZhbHVlXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX2NyYywgQ29uc3RhbnRzLkNFTkNSQyk7XG4gICAgICAgICAgICAvLyBjb21wcmVzc2VkIHNpemVcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MzJMRShfY29tcHJlc3NlZFNpemUsIENvbnN0YW50cy5DRU5TSVopO1xuICAgICAgICAgICAgLy8gdW5jb21wcmVzc2VkIHNpemVcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MzJMRShfc2l6ZSwgQ29uc3RhbnRzLkNFTkxFTik7XG4gICAgICAgICAgICAvLyBmaWxlbmFtZSBsZW5ndGhcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MTZMRShfZm5hbWVMZW4sIENvbnN0YW50cy5DRU5OQU0pO1xuICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgbGVuZ3RoXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX2V4dHJhTGVuLCBDb25zdGFudHMuQ0VORVhUKTtcbiAgICAgICAgICAgIC8vIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MTZMRShfY29tTGVuLCBDb25zdGFudHMuQ0VOQ09NKTtcbiAgICAgICAgICAgIC8vIHZvbHVtZSBudW1iZXIgc3RhcnRcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MTZMRShfZGlza1N0YXJ0LCBDb25zdGFudHMuQ0VORFNLKTtcbiAgICAgICAgICAgIC8vIGludGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKF9pbmF0dHIsIENvbnN0YW50cy5DRU5BVFQpO1xuICAgICAgICAgICAgLy8gZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX2F0dHIsIENvbnN0YW50cy5DRU5BVFgpO1xuICAgICAgICAgICAgLy8gTE9DIGhlYWRlciBvZmZzZXRcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MzJMRShfb2Zmc2V0LCBDb25zdGFudHMuQ0VOT0ZGKTtcbiAgICAgICAgICAgIC8vIGZpbGwgYWxsIHdpdGhcbiAgICAgICAgICAgIGRhdGEuZmlsbCgweDAwLCBDb25zdGFudHMuQ0VOSERSKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvSlNPTjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBmdW5jdGlvbiAobnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnIgKyBcIiBieXRlc1wiO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtYWRlOiBfdmVyTWFkZSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBfdmVyc2lvbixcbiAgICAgICAgICAgICAgICBmbGFnczogX2ZsYWdzLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogVXRpbHMubWV0aG9kVG9TdHJpbmcoX21ldGhvZCksXG4gICAgICAgICAgICAgICAgdGltZTogdGhpcy50aW1lLFxuICAgICAgICAgICAgICAgIGNyYzogXCIweFwiICsgX2NyYy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2VkU2l6ZTogYnl0ZXMoX2NvbXByZXNzZWRTaXplKSxcbiAgICAgICAgICAgICAgICBzaXplOiBieXRlcyhfc2l6ZSksXG4gICAgICAgICAgICAgICAgZmlsZU5hbWVMZW5ndGg6IGJ5dGVzKF9mbmFtZUxlbiksXG4gICAgICAgICAgICAgICAgZXh0cmFMZW5ndGg6IGJ5dGVzKF9leHRyYUxlbiksXG4gICAgICAgICAgICAgICAgY29tbWVudExlbmd0aDogYnl0ZXMoX2NvbUxlbiksXG4gICAgICAgICAgICAgICAgZGlza051bVN0YXJ0OiBfZGlza1N0YXJ0LFxuICAgICAgICAgICAgICAgIGluQXR0cjogX2luYXR0cixcbiAgICAgICAgICAgICAgICBhdHRyOiBfYXR0cixcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IF9vZmZzZXQsXG4gICAgICAgICAgICAgICAgZW50cnlIZWFkZXJTaXplOiBieXRlcyhDb25zdGFudHMuQ0VOSERSICsgX2ZuYW1lTGVuICsgX2V4dHJhTGVuICsgX2NvbUxlbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpLCBudWxsLCBcIlxcdFwiKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwgInZhciBVdGlscyA9IHJlcXVpcmUoXCIuLi91dGlsXCIpLFxuICAgIENvbnN0YW50cyA9IFV0aWxzLkNvbnN0YW50cztcblxuLyogVGhlIGVudHJpZXMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF92b2x1bWVFbnRyaWVzID0gMCxcbiAgICAgICAgX3RvdGFsRW50cmllcyA9IDAsXG4gICAgICAgIF9zaXplID0gMCxcbiAgICAgICAgX29mZnNldCA9IDAsXG4gICAgICAgIF9jb21tZW50TGVuZ3RoID0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGdldCBkaXNrRW50cmllcygpIHtcbiAgICAgICAgICAgIHJldHVybiBfdm9sdW1lRW50cmllcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGRpc2tFbnRyaWVzKC8qTnVtYmVyKi8gdmFsKSB7XG4gICAgICAgICAgICBfdm9sdW1lRW50cmllcyA9IF90b3RhbEVudHJpZXMgPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IHRvdGFsRW50cmllcygpIHtcbiAgICAgICAgICAgIHJldHVybiBfdG90YWxFbnRyaWVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgdG90YWxFbnRyaWVzKC8qTnVtYmVyKi8gdmFsKSB7XG4gICAgICAgICAgICBfdG90YWxFbnRyaWVzID0gX3ZvbHVtZUVudHJpZXMgPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3NpemU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBzaXplKC8qTnVtYmVyKi8gdmFsKSB7XG4gICAgICAgICAgICBfc2l6ZSA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgb2Zmc2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vZmZzZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBvZmZzZXQoLypOdW1iZXIqLyB2YWwpIHtcbiAgICAgICAgICAgIF9vZmZzZXQgPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IGNvbW1lbnRMZW5ndGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NvbW1lbnRMZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjb21tZW50TGVuZ3RoKC8qTnVtYmVyKi8gdmFsKSB7XG4gICAgICAgICAgICBfY29tbWVudExlbmd0aCA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgbWFpbkhlYWRlclNpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29uc3RhbnRzLkVOREhEUiArIF9jb21tZW50TGVuZ3RoO1xuICAgICAgICB9LFxuXG4gICAgICAgIGxvYWRGcm9tQmluYXJ5OiBmdW5jdGlvbiAoLypCdWZmZXIqLyBkYXRhKSB7XG4gICAgICAgICAgICAvLyBkYXRhIHNob3VsZCBiZSAyMiBieXRlcyBhbmQgc3RhcnQgd2l0aCBcIlBLIDA1IDA2XCJcbiAgICAgICAgICAgIC8vIG9yIGJlIDU2KyBieXRlcyBhbmQgc3RhcnQgd2l0aCBcIlBLIDA2IDA2XCIgZm9yIFppcDY0XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGRhdGEubGVuZ3RoICE9PSBDb25zdGFudHMuRU5ESERSIHx8IGRhdGEucmVhZFVJbnQzMkxFKDApICE9PSBDb25zdGFudHMuRU5EU0lHKSAmJlxuICAgICAgICAgICAgICAgIChkYXRhLmxlbmd0aCA8IENvbnN0YW50cy5aSVA2NEhEUiB8fCBkYXRhLnJlYWRVSW50MzJMRSgwKSAhPT0gQ29uc3RhbnRzLlpJUDY0U0lHKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5JTlZBTElEX0VORCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLnJlYWRVSW50MzJMRSgwKSA9PT0gQ29uc3RhbnRzLkVORFNJRykge1xuICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoaXMgdm9sdW1lXG4gICAgICAgICAgICAgICAgX3ZvbHVtZUVudHJpZXMgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuRU5EU1VCKTtcbiAgICAgICAgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllc1xuICAgICAgICAgICAgICAgIF90b3RhbEVudHJpZXMgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuRU5EVE9UKTtcbiAgICAgICAgICAgICAgICAvLyBjZW50cmFsIGRpcmVjdG9yeSBzaXplIGluIGJ5dGVzXG4gICAgICAgICAgICAgICAgX3NpemUgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuRU5EU0laKTtcbiAgICAgICAgICAgICAgICAvLyBvZmZzZXQgb2YgZmlyc3QgQ0VOIGhlYWRlclxuICAgICAgICAgICAgICAgIF9vZmZzZXQgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuRU5ET0ZGKTtcbiAgICAgICAgICAgICAgICAvLyB6aXAgZmlsZSBjb21tZW50IGxlbmd0aFxuICAgICAgICAgICAgICAgIF9jb21tZW50TGVuZ3RoID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkVORENPTSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoaXMgdm9sdW1lXG4gICAgICAgICAgICAgICAgX3ZvbHVtZUVudHJpZXMgPSBVdGlscy5yZWFkQmlnVUludDY0TEUoZGF0YSwgQ29uc3RhbnRzLlpJUDY0U1VCKTtcbiAgICAgICAgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllc1xuICAgICAgICAgICAgICAgIF90b3RhbEVudHJpZXMgPSBVdGlscy5yZWFkQmlnVUludDY0TEUoZGF0YSwgQ29uc3RhbnRzLlpJUDY0VE9UKTtcbiAgICAgICAgICAgICAgICAvLyBjZW50cmFsIGRpcmVjdG9yeSBzaXplIGluIGJ5dGVzXG4gICAgICAgICAgICAgICAgX3NpemUgPSBVdGlscy5yZWFkQmlnVUludDY0TEUoZGF0YSwgQ29uc3RhbnRzLlpJUDY0U0laKTtcbiAgICAgICAgICAgICAgICAvLyBvZmZzZXQgb2YgZmlyc3QgQ0VOIGhlYWRlclxuICAgICAgICAgICAgICAgIF9vZmZzZXQgPSBVdGlscy5yZWFkQmlnVUludDY0TEUoZGF0YSwgQ29uc3RhbnRzLlpJUDY0T0ZGKTtcblxuICAgICAgICAgICAgICAgIF9jb21tZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0b0JpbmFyeTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGIgPSBCdWZmZXIuYWxsb2MoQ29uc3RhbnRzLkVOREhEUiArIF9jb21tZW50TGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIFwiUEsgMDUgMDZcIiBzaWduYXR1cmVcbiAgICAgICAgICAgIGIud3JpdGVVSW50MzJMRShDb25zdGFudHMuRU5EU0lHLCAwKTtcbiAgICAgICAgICAgIGIud3JpdGVVSW50MzJMRSgwLCA0KTtcbiAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoaXMgdm9sdW1lXG4gICAgICAgICAgICBiLndyaXRlVUludDE2TEUoX3ZvbHVtZUVudHJpZXMsIENvbnN0YW50cy5FTkRTVUIpO1xuICAgICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGVudHJpZXNcbiAgICAgICAgICAgIGIud3JpdGVVSW50MTZMRShfdG90YWxFbnRyaWVzLCBDb25zdGFudHMuRU5EVE9UKTtcbiAgICAgICAgICAgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IHNpemUgaW4gYnl0ZXNcbiAgICAgICAgICAgIGIud3JpdGVVSW50MzJMRShfc2l6ZSwgQ29uc3RhbnRzLkVORFNJWik7XG4gICAgICAgICAgICAvLyBvZmZzZXQgb2YgZmlyc3QgQ0VOIGhlYWRlclxuICAgICAgICAgICAgYi53cml0ZVVJbnQzMkxFKF9vZmZzZXQsIENvbnN0YW50cy5FTkRPRkYpO1xuICAgICAgICAgICAgLy8gemlwIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgICAgIGIud3JpdGVVSW50MTZMRShfY29tbWVudExlbmd0aCwgQ29uc3RhbnRzLkVORENPTSk7XG4gICAgICAgICAgICAvLyBmaWxsIGNvbW1lbnQgbWVtb3J5IHdpdGggc3BhY2VzIHNvIG5vIGdhcmJhZ2UgaXMgbGVmdCB0aGVyZVxuICAgICAgICAgICAgYi5maWxsKFwiIFwiLCBDb25zdGFudHMuRU5ESERSKTtcblxuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9KU09OOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGVzIDB4MDAwMCBzdHlsZSBvdXRwdXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGZ1bmN0aW9uIChuciwgbGVuKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9mZnMgPSBuci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAob2Zmcy5sZW5ndGggPCBsZW4pIG9mZnMgPSBcIjBcIiArIG9mZnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiMHhcIiArIG9mZnM7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRpc2tFbnRyaWVzOiBfdm9sdW1lRW50cmllcyxcbiAgICAgICAgICAgICAgICB0b3RhbEVudHJpZXM6IF90b3RhbEVudHJpZXMsXG4gICAgICAgICAgICAgICAgc2l6ZTogX3NpemUgKyBcIiBieXRlc1wiLFxuICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0KF9vZmZzZXQsIDQpLFxuICAgICAgICAgICAgICAgIGNvbW1lbnRMZW5ndGg6IF9jb21tZW50TGVuZ3RoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pTT04oKSwgbnVsbCwgXCJcXHRcIik7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICJleHBvcnRzLkVudHJ5SGVhZGVyID0gcmVxdWlyZShcIi4vZW50cnlIZWFkZXJcIik7XG5leHBvcnRzLk1haW5IZWFkZXIgPSByZXF1aXJlKFwiLi9tYWluSGVhZGVyXCIpO1xuIiwgIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKC8qQnVmZmVyKi8gaW5idWYpIHtcbiAgICB2YXIgemxpYiA9IHJlcXVpcmUoXCJ6bGliXCIpO1xuXG4gICAgdmFyIG9wdHMgPSB7IGNodW5rU2l6ZTogKHBhcnNlSW50KGluYnVmLmxlbmd0aCAvIDEwMjQpICsgMSkgKiAxMDI0IH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZWZsYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gemxpYi5kZWZsYXRlUmF3U3luYyhpbmJ1Ziwgb3B0cyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVmbGF0ZUFzeW5jOiBmdW5jdGlvbiAoLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gemxpYi5jcmVhdGVEZWZsYXRlUmF3KG9wdHMpLFxuICAgICAgICAgICAgICAgIHBhcnRzID0gW10sXG4gICAgICAgICAgICAgICAgdG90YWwgPSAwO1xuICAgICAgICAgICAgdG1wLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgdG90YWwgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRtcC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyh0b3RhbCksXG4gICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gPSAwO1xuICAgICAgICAgICAgICAgIGJ1Zi5maWxsKDApO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgcGFydC5jb3B5KGJ1Ziwgd3JpdHRlbik7XG4gICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gKz0gcGFydC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGJ1Zik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRtcC5lbmQoaW5idWYpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLypCdWZmZXIqLyBpbmJ1Zikge1xuICAgIHZhciB6bGliID0gcmVxdWlyZShcInpsaWJcIik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbmZsYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gemxpYi5pbmZsYXRlUmF3U3luYyhpbmJ1Zik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5mbGF0ZUFzeW5jOiBmdW5jdGlvbiAoLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KCksXG4gICAgICAgICAgICAgICAgcGFydHMgPSBbXSxcbiAgICAgICAgICAgICAgICB0b3RhbCA9IDA7XG4gICAgICAgICAgICB0bXAub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICB0b3RhbCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG1wLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKHRvdGFsKSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiA9IDA7XG4gICAgICAgICAgICAgICAgYnVmLmZpbGwoMCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0LmNvcHkoYnVmLCB3cml0dGVuKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiArPSBwYXJ0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soYnVmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG1wLmVuZChpbmJ1Zik7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gbm9kZSBjcnlwdCwgd2UgdXNlIGl0IGZvciBnZW5lcmF0ZSBzYWx0XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm9kZS9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zXG5jb25zdCB7IHJhbmRvbUZpbGxTeW5jIH0gPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuXG4vLyBnZW5lcmF0ZSBDUkMzMiBsb29rdXAgdGFibGVcbmNvbnN0IGNyY3RhYmxlID0gbmV3IFVpbnQzMkFycmF5KDI1NikubWFwKCh0LCBjcmMpID0+IHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDg7IGorKykge1xuICAgICAgICBpZiAoMCAhPT0gKGNyYyAmIDEpKSB7XG4gICAgICAgICAgICBjcmMgPSAoY3JjID4+PiAxKSBeIDB4ZWRiODgzMjA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmMgPj4+PSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmMgPj4+IDA7XG59KTtcblxuLy8gQy1zdHlsZSB1SW50MzIgTXVsdGlwbHkgKGRpc2NhcmRzIGhpZ2hlciBiaXRzLCB3aGVuIEpTIG11bHRpcGx5IGRpc2NhcmRzIGxvd2VyIGJpdHMpXG5jb25zdCB1TXVsID0gKGEsIGIpID0+IE1hdGguaW11bChhLCBiKSA+Pj4gMDtcblxuLy8gY3JjMzIgYnl0ZSBzaW5nbGUgdXBkYXRlIChhY3R1YWxseSBzYW1lIGZ1bmN0aW9uIGlzIHBhcnQgb2YgdXRpbHMuY3JjMzIgZnVuY3Rpb24gOikgKVxuY29uc3QgY3JjMzJ1cGRhdGUgPSAocENyYzMyLCBidmFsKSA9PiB7XG4gICAgcmV0dXJuIGNyY3RhYmxlWyhwQ3JjMzIgXiBidmFsKSAmIDB4ZmZdIF4gKHBDcmMzMiA+Pj4gOCk7XG59O1xuXG4vLyBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBzYWx0IGZvciBlbmNyeXRpb24gaGVhZGVyXG5jb25zdCBnZW5TYWx0ID0gKCkgPT4ge1xuICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByYW5kb21GaWxsU3luYykge1xuICAgICAgICByZXR1cm4gcmFuZG9tRmlsbFN5bmMoQnVmZmVyLmFsbG9jKDEyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgaWYgZnVuY3Rpb24gaXMgbm90IGRlZmluZWRcbiAgICAgICAgcmV0dXJuIGdlblNhbHQubm9kZSgpO1xuICAgIH1cbn07XG5cbi8vIHNhbHQgZ2VuZXJhdGlvbiB3aXRoIG5vZGUgcmFuZG9tIGZ1bmN0aW9uIChtYWlubHkgYXMgZmFsbGJhY2spXG5nZW5TYWx0Lm5vZGUgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2FsdCA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgY29uc3QgbGVuID0gc2FsdC5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgc2FsdFtpXSA9IChNYXRoLnJhbmRvbSgpICogMjU2KSAmIDB4ZmY7XG4gICAgcmV0dXJuIHNhbHQ7XG59O1xuXG4vLyBnZW5lcmFsIGNvbmZpZ1xuY29uc3QgY29uZmlnID0ge1xuICAgIGdlblNhbHRcbn07XG5cbi8vIENsYXNzIEluaXRrZXlzIGhhbmRsZXMgc2FtZSBiYXNpYyBvcHMgd2l0aCBrZXlzXG5mdW5jdGlvbiBJbml0a2V5cyhwdykge1xuICAgIGNvbnN0IHBhc3MgPSBCdWZmZXIuaXNCdWZmZXIocHcpID8gcHcgOiBCdWZmZXIuZnJvbShwdyk7XG4gICAgdGhpcy5rZXlzID0gbmV3IFVpbnQzMkFycmF5KFsweDEyMzQ1Njc4LCAweDIzNDU2Nzg5LCAweDM0NTY3ODkwXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMudXBkYXRlS2V5cyhwYXNzW2ldKTtcbiAgICB9XG59XG5cbkluaXRrZXlzLnByb3RvdHlwZS51cGRhdGVLZXlzID0gZnVuY3Rpb24gKGJ5dGVWYWx1ZSkge1xuICAgIGNvbnN0IGtleXMgPSB0aGlzLmtleXM7XG4gICAga2V5c1swXSA9IGNyYzMydXBkYXRlKGtleXNbMF0sIGJ5dGVWYWx1ZSk7XG4gICAga2V5c1sxXSArPSBrZXlzWzBdICYgMHhmZjtcbiAgICBrZXlzWzFdID0gdU11bChrZXlzWzFdLCAxMzQ3NzU4MTMpICsgMTtcbiAgICBrZXlzWzJdID0gY3JjMzJ1cGRhdGUoa2V5c1syXSwga2V5c1sxXSA+Pj4gMjQpO1xuICAgIHJldHVybiBieXRlVmFsdWU7XG59O1xuXG5Jbml0a2V5cy5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBrID0gKHRoaXMua2V5c1syXSB8IDIpID4+PiAwOyAvLyBrZXlcbiAgICByZXR1cm4gKHVNdWwoaywgayBeIDEpID4+IDgpICYgMHhmZjsgLy8gZGVjb2RlXG59O1xuXG5mdW5jdGlvbiBtYWtlX2RlY3J5cHRlcigvKkJ1ZmZlciovIHB3ZCkge1xuICAgIC8vIDEuIFN0YWdlIGluaXRpYWxpemUga2V5XG4gICAgY29uc3Qga2V5cyA9IG5ldyBJbml0a2V5cyhwd2QpO1xuXG4gICAgLy8gcmV0dXJuIGRlY3J5cHRlciBmdW5jdGlvblxuICAgIHJldHVybiBmdW5jdGlvbiAoLypCdWZmZXIqLyBkYXRhKSB7XG4gICAgICAgIC8vIHJlc3VsdCAtIHdlIGNyZWF0ZSBuZXcgQnVmZmVyIGZvciByZXN1bHRzXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYyhkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICAvLyBwcm9jZXNzIGlucHV0IGRhdGFcbiAgICAgICAgZm9yIChsZXQgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAvL2MgXj0ga2V5cy5uZXh0KCk7XG4gICAgICAgICAgICAvL3Jlc3VsdFtwb3MrK10gPSBjOyAvLyBkZWNvZGUgJiBTYXZlIFZhbHVlXG4gICAgICAgICAgICByZXN1bHRbcG9zKytdID0ga2V5cy51cGRhdGVLZXlzKGMgXiBrZXlzLm5leHQoKSk7IC8vIHVwZGF0ZSBrZXlzIHdpdGggZGVjb2RlZCBieXRlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYWtlX2VuY3J5cHRlcigvKkJ1ZmZlciovIHB3ZCkge1xuICAgIC8vIDEuIFN0YWdlIGluaXRpYWxpemUga2V5XG4gICAgY29uc3Qga2V5cyA9IG5ldyBJbml0a2V5cyhwd2QpO1xuXG4gICAgLy8gcmV0dXJuIGVuY3J5cHRpbmcgZnVuY3Rpb24sIHJlc3VsdCBhbmQgcG9zIGlzIGhlcmUgc28gd2UgZG9udCBoYXZlIHRvIG1lcmdlIGJ1ZmZlcnMgbGF0ZXJcbiAgICByZXR1cm4gZnVuY3Rpb24gKC8qQnVmZmVyKi8gZGF0YSwgLypCdWZmZXIqLyByZXN1bHQsIC8qIE51bWJlciAqLyBwb3MgPSAwKSB7XG4gICAgICAgIC8vIHJlc3VsdCAtIHdlIGNyZWF0ZSBuZXcgQnVmZmVyIGZvciByZXN1bHRzXG4gICAgICAgIGlmICghcmVzdWx0KSByZXN1bHQgPSBCdWZmZXIuYWxsb2MoZGF0YS5sZW5ndGgpO1xuICAgICAgICAvLyBwcm9jZXNzIGlucHV0IGRhdGFcbiAgICAgICAgZm9yIChsZXQgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBrID0ga2V5cy5uZXh0KCk7IC8vIHNhdmUga2V5IGJ5dGVcbiAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSBjIF4gazsgLy8gc2F2ZSB2YWxcbiAgICAgICAgICAgIGtleXMudXBkYXRlS2V5cyhjKTsgLy8gdXBkYXRlIGtleXMgd2l0aCBkZWNvZGVkIGJ5dGVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGRlY3J5cHQoLypCdWZmZXIqLyBkYXRhLCAvKk9iamVjdCovIGhlYWRlciwgLypTdHJpbmcsIEJ1ZmZlciovIHB3ZCkge1xuICAgIGlmICghZGF0YSB8fCAhQnVmZmVyLmlzQnVmZmVyKGRhdGEpIHx8IGRhdGEubGVuZ3RoIDwgMTIpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG5cbiAgICAvLyAxLiBXZSBJbml0aWFsaXplIGFuZCBnZW5lcmF0ZSBkZWNyeXB0aW5nIGZ1bmN0aW9uXG4gICAgY29uc3QgZGVjcnlwdGVyID0gbWFrZV9kZWNyeXB0ZXIocHdkKTtcblxuICAgIC8vIDIuIGRlY3J5cHQgc2FsdCB3aGF0IGlzIGFsd2F5cyAxMiBieXRlcyBhbmQgaXMgYSBwYXJ0IG9mIGZpbGUgY29udGVudFxuICAgIGNvbnN0IHNhbHQgPSBkZWNyeXB0ZXIoZGF0YS5zbGljZSgwLCAxMikpO1xuXG4gICAgLy8gMy4gZG9lcyBwYXNzd29yZCBtZWV0IGV4cGVjdGF0aW9uc1xuICAgIGlmIChzYWx0WzExXSAhPT0gaGVhZGVyLmNyYyA+Pj4gMjQpIHtcbiAgICAgICAgdGhyb3cgXCJBRE0tWklQOiBXcm9uZyBQYXNzd29yZFwiO1xuICAgIH1cblxuICAgIC8vIDQuIGRlY29kZSBjb250ZW50XG4gICAgcmV0dXJuIGRlY3J5cHRlcihkYXRhLnNsaWNlKDEyKSk7XG59XG5cbi8vIGxldHMgYWRkIHdheSB0byBwb3B1bGF0ZSBzYWx0LCBOT1QgUkVDT01NRU5ERUQgZm9yIHByb2R1Y3Rpb24gYnV0IG1heWJlIHVzZWZ1bCBmb3IgdGVzdGluZyBnZW5lcmFsIGZ1bmN0aW9uYWxpdHlcbmZ1bmN0aW9uIF9zYWx0ZXIoZGF0YSkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoZGF0YSkgJiYgZGF0YS5sZW5ndGggPj0gMTIpIHtcbiAgICAgICAgLy8gYmUgYXdhcmUgLSBjdXJyZW50bHkgc2FsdGluZyBidWZmZXIgZGF0YSBpcyBtb2RpZmllZFxuICAgICAgICBjb25maWcuZ2VuU2FsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnNsaWNlKDAsIDEyKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFwibm9kZVwiKSB7XG4gICAgICAgIC8vIHRlc3Qgc2FsdCBnZW5lcmF0aW9uIHdpdGggbm9kZSByYW5kb20gZnVuY3Rpb25cbiAgICAgICAgY29uZmlnLmdlblNhbHQgPSBnZW5TYWx0Lm5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdmFsdWUgaXMgbm90IGFjY2VwdGFibGUgY29uZmlnIGdldHMgcmVzZXQuXG4gICAgICAgIGNvbmZpZy5nZW5TYWx0ID0gZ2VuU2FsdDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuY3J5cHQoLypCdWZmZXIqLyBkYXRhLCAvKk9iamVjdCovIGhlYWRlciwgLypTdHJpbmcsIEJ1ZmZlciovIHB3ZCwgLypCb29sZWFuKi8gb2xkbGlrZSA9IGZhbHNlKSB7XG4gICAgLy8gMS4gdGVzdCBkYXRhIGlmIGRhdGEgaXMgbm90IEJ1ZmZlciB3ZSBtYWtlIGJ1ZmZlciBmcm9tIGl0XG4gICAgaWYgKGRhdGEgPT0gbnVsbCkgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICAvLyBpZiBkYXRhIGlzIG5vdCBidWZmZXIgYmUgbWFrZSBidWZmZXIgZnJvbSBpdFxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSBkYXRhID0gQnVmZmVyLmZyb20oZGF0YS50b1N0cmluZygpKTtcblxuICAgIC8vIDIuIFdlIEluaXRpYWxpemUgYW5kIGdlbmVyYXRlIGVuY3J5cHRpbmcgZnVuY3Rpb25cbiAgICBjb25zdCBlbmNyeXB0ZXIgPSBtYWtlX2VuY3J5cHRlcihwd2QpO1xuXG4gICAgLy8gMy4gZ2VuZXJhdGUgc2FsdCAoMTItYnl0ZXMgb2YgcmFuZG9tIGRhdGEpXG4gICAgY29uc3Qgc2FsdCA9IGNvbmZpZy5nZW5TYWx0KCk7XG4gICAgc2FsdFsxMV0gPSAoaGVhZGVyLmNyYyA+Pj4gMjQpICYgMHhmZjtcblxuICAgIC8vIG9sZCBpbXBsZW1lbnRhdGlvbnMgKGJlZm9yZSBQS1ppcCAyLjA0ZykgdXNlZCB0d28gYnl0ZSBjaGVja1xuICAgIGlmIChvbGRsaWtlKSBzYWx0WzEwXSA9IChoZWFkZXIuY3JjID4+PiAxNikgJiAweGZmO1xuXG4gICAgLy8gNC4gY3JlYXRlIG91dHB1dFxuICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYyhkYXRhLmxlbmd0aCArIDEyKTtcbiAgICBlbmNyeXB0ZXIoc2FsdCwgcmVzdWx0KTtcblxuICAgIC8vIGZpbmFsbHkgZW5jb2RlIGNvbnRlbnRcbiAgICByZXR1cm4gZW5jcnlwdGVyKGRhdGEsIHJlc3VsdCwgMTIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgZGVjcnlwdCwgZW5jcnlwdCwgX3NhbHRlciB9O1xuIiwgImV4cG9ydHMuRGVmbGF0ZXIgPSByZXF1aXJlKFwiLi9kZWZsYXRlclwiKTtcbmV4cG9ydHMuSW5mbGF0ZXIgPSByZXF1aXJlKFwiLi9pbmZsYXRlclwiKTtcbmV4cG9ydHMuWmlwQ3J5cHRvID0gcmVxdWlyZShcIi4vemlwY3J5cHRvXCIpO1xuIiwgInZhciBVdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxcIiksXG4gICAgSGVhZGVycyA9IHJlcXVpcmUoXCIuL2hlYWRlcnNcIiksXG4gICAgQ29uc3RhbnRzID0gVXRpbHMuQ29uc3RhbnRzLFxuICAgIE1ldGhvZHMgPSByZXF1aXJlKFwiLi9tZXRob2RzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgvKkJ1ZmZlciovIGlucHV0KSB7XG4gICAgdmFyIF9lbnRyeUhlYWRlciA9IG5ldyBIZWFkZXJzLkVudHJ5SGVhZGVyKCksXG4gICAgICAgIF9lbnRyeU5hbWUgPSBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIF9jb21tZW50ID0gQnVmZmVyLmFsbG9jKDApLFxuICAgICAgICBfaXNEaXJlY3RvcnkgPSBmYWxzZSxcbiAgICAgICAgdW5jb21wcmVzc2VkRGF0YSA9IG51bGwsXG4gICAgICAgIF9leHRyYSA9IEJ1ZmZlci5hbGxvYygwKTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXByZXNzZWREYXRhRnJvbVppcCgpIHtcbiAgICAgICAgaWYgKCFpbnB1dCB8fCAhQnVmZmVyLmlzQnVmZmVyKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgICAgfVxuICAgICAgICBfZW50cnlIZWFkZXIubG9hZERhdGFIZWFkZXJGcm9tQmluYXJ5KGlucHV0KTtcbiAgICAgICAgcmV0dXJuIGlucHV0LnNsaWNlKF9lbnRyeUhlYWRlci5yZWFsRGF0YU9mZnNldCwgX2VudHJ5SGVhZGVyLnJlYWxEYXRhT2Zmc2V0ICsgX2VudHJ5SGVhZGVyLmNvbXByZXNzZWRTaXplKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmMzMk9LKGRhdGEpIHtcbiAgICAgICAgLy8gaWYgYml0IDMgKDB4MDgpIG9mIHRoZSBnZW5lcmFsLXB1cnBvc2UgZmxhZ3MgZmllbGQgaXMgc2V0LCB0aGVuIHRoZSBDUkMtMzIgYW5kIGZpbGUgc2l6ZXMgYXJlIG5vdCBrbm93biB3aGVuIHRoZSBoZWFkZXIgaXMgd3JpdHRlblxuICAgICAgICBpZiAoKF9lbnRyeUhlYWRlci5mbGFncyAmIDB4OCkgIT09IDB4OCkge1xuICAgICAgICAgICAgaWYgKFV0aWxzLmNyYzMyKGRhdGEpICE9PSBfZW50cnlIZWFkZXIuZGF0YUhlYWRlci5jcmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBAVE9ETzogbG9hZCBhbmQgY2hlY2sgZGF0YSBkZXNjcmlwdG9yIGhlYWRlclxuICAgICAgICAgICAgLy8gVGhlIGZpZWxkcyBpbiB0aGUgbG9jYWwgaGVhZGVyIGFyZSBmaWxsZWQgd2l0aCB6ZXJvLCBhbmQgdGhlIENSQy0zMiBhbmQgc2l6ZSBhcmUgYXBwZW5kZWQgaW4gYSAxMi1ieXRlIHN0cnVjdHVyZVxuICAgICAgICAgICAgLy8gKG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgYSA0LWJ5dGUgc2lnbmF0dXJlKSBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29tcHJlc3NlZCBkYXRhOlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29tcHJlc3MoLypCb29sZWFuKi8gYXN5bmMsIC8qRnVuY3Rpb24qLyBjYWxsYmFjaywgLypTdHJpbmcsIEJ1ZmZlciovIHBhc3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgYXN5bmMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHBhc3MgPSBhc3luYztcbiAgICAgICAgICAgIGFzeW5jID0gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIGlmIChhc3luYyAmJiBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKEJ1ZmZlci5hbGxvYygwKSwgVXRpbHMuRXJyb3JzLkRJUkVDVE9SWV9DT05URU5UX0VSUk9SKTsgLy9zaSBhZGRlZCBlcnJvci5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29tcHJlc3NlZERhdGEgPSBnZXRDb21wcmVzc2VkRGF0YUZyb21aaXAoKTtcblxuICAgICAgICBpZiAoY29tcHJlc3NlZERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWxlIGlzIGVtcHR5LCBub3RoaW5nIHRvIGRlY29tcHJlc3MuXG4gICAgICAgICAgICBpZiAoYXN5bmMgJiYgY2FsbGJhY2spIGNhbGxiYWNrKGNvbXByZXNzZWREYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2VkRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfZW50cnlIZWFkZXIuZW5jcmlwdGVkKSB7XG4gICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHBhc3MgJiYgIUJ1ZmZlci5pc0J1ZmZlcihwYXNzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFETS1aSVA6IEluY29tcGF0aWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wcmVzc2VkRGF0YSA9IE1ldGhvZHMuWmlwQ3J5cHRvLmRlY3J5cHQoY29tcHJlc3NlZERhdGEsIF9lbnRyeUhlYWRlciwgcGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGF0YSA9IEJ1ZmZlci5hbGxvYyhfZW50cnlIZWFkZXIuc2l6ZSk7XG5cbiAgICAgICAgc3dpdGNoIChfZW50cnlIZWFkZXIubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5TVE9SRUQ6XG4gICAgICAgICAgICAgICAgY29tcHJlc3NlZERhdGEuY29weShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNyYzMyT0soZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhLCBVdGlscy5FcnJvcnMuQkFEX0NSQyk7IC8vc2kgYWRkZWQgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5CQURfQ1JDKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL3NpIGFkZGVkIG90aGVyd2lzZSBkaWQgbm90IHNlZW0gdG8gcmV0dXJuIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhc3luYyAmJiBjYWxsYmFjaykgY2FsbGJhY2soZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkRFRkxBVEVEOlxuICAgICAgICAgICAgICAgIHZhciBpbmZsYXRlciA9IG5ldyBNZXRob2RzLkluZmxhdGVyKGNvbXByZXNzZWREYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGluZmxhdGVyLmluZmxhdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3B5KGRhdGEsIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyYzMyT0soZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuQkFEX0NSQyArIFwiIFwiICsgX2VudHJ5TmFtZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlQXN5bmMoZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvcHkocmVzdWx0LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3JjMzJPSyhyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCwgVXRpbHMuRXJyb3JzLkJBRF9DUkMpOyAvL3NpIGFkZGVkIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSBjYWxsYmFjayhCdWZmZXIuYWxsb2MoMCksIFV0aWxzLkVycm9ycy5VTktOT1dOX01FVEhPRCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5VTktOT1dOX01FVEhPRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wcmVzcygvKkJvb2xlYW4qLyBhc3luYywgLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICgoIXVuY29tcHJlc3NlZERhdGEgfHwgIXVuY29tcHJlc3NlZERhdGEubGVuZ3RoKSAmJiBCdWZmZXIuaXNCdWZmZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBubyBkYXRhIHNldCBvciB0aGUgZGF0YSB3YXNuJ3QgY2hhbmdlZCB0byByZXF1aXJlIHJlY29tcHJlc3Npb25cbiAgICAgICAgICAgIGlmIChhc3luYyAmJiBjYWxsYmFjaykgY2FsbGJhY2soZ2V0Q29tcHJlc3NlZERhdGFGcm9tWmlwKCkpO1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXByZXNzZWREYXRhRnJvbVppcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVuY29tcHJlc3NlZERhdGEubGVuZ3RoICYmICFfaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIHZhciBjb21wcmVzc2VkRGF0YTtcbiAgICAgICAgICAgIC8vIExvY2FsIGZpbGUgaGVhZGVyXG4gICAgICAgICAgICBzd2l0Y2ggKF9lbnRyeUhlYWRlci5tZXRob2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5TVE9SRUQ6XG4gICAgICAgICAgICAgICAgICAgIF9lbnRyeUhlYWRlci5jb21wcmVzc2VkU2l6ZSA9IF9lbnRyeUhlYWRlci5zaXplO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWREYXRhID0gQnVmZmVyLmFsbG9jKHVuY29tcHJlc3NlZERhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkRGF0YS5jb3B5KGNvbXByZXNzZWREYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXN5bmMgJiYgY2FsbGJhY2spIGNhbGxiYWNrKGNvbXByZXNzZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXByZXNzZWREYXRhO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuREVGTEFURUQ6XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWZsYXRlciA9IG5ldyBNZXRob2RzLkRlZmxhdGVyKHVuY29tcHJlc3NlZERhdGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVmbGF0ZWQgPSBkZWZsYXRlci5kZWZsYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIuY29tcHJlc3NlZFNpemUgPSBkZWZsYXRlZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmbGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZsYXRlci5kZWZsYXRlQXN5bmMoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkRGF0YSA9IEJ1ZmZlci5hbGxvYyhkYXRhLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmNvbXByZXNzZWRTaXplID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jb3B5KGNvbXByZXNzZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhjb21wcmVzc2VkRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZsYXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhCdWZmZXIuYWxsb2MoMCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRVSW50NjRMRShidWZmZXIsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gKGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0ICsgNCkgPDwgNCkgKyBidWZmZXIucmVhZFVJbnQzMkxFKG9mZnNldCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VFeHRyYShkYXRhKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICB2YXIgc2lnbmF0dXJlLCBzaXplLCBwYXJ0O1xuICAgICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNpZ25hdHVyZSA9IGRhdGEucmVhZFVJbnQxNkxFKG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBwYXJ0ID0gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgICAgICBpZiAoQ29uc3RhbnRzLklEX1pJUDY0ID09PSBzaWduYXR1cmUpIHtcbiAgICAgICAgICAgICAgICBwYXJzZVppcDY0RXh0ZW5kZWRJbmZvcm1hdGlvbihwYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vT3ZlcnJpZGUgaGVhZGVyIGZpZWxkIHZhbHVlcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBaSVA2NCBleHRyYSBmaWVsZFxuICAgIGZ1bmN0aW9uIHBhcnNlWmlwNjRFeHRlbmRlZEluZm9ybWF0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIHNpemUsIGNvbXByZXNzZWRTaXplLCBvZmZzZXQsIGRpc2tOdW1TdGFydDtcblxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPj0gQ29uc3RhbnRzLkVGX1pJUDY0X1NDT01QKSB7XG4gICAgICAgICAgICBzaXplID0gcmVhZFVJbnQ2NExFKGRhdGEsIENvbnN0YW50cy5FRl9aSVA2NF9TVU5DT01QKTtcbiAgICAgICAgICAgIGlmIChfZW50cnlIZWFkZXIuc2l6ZSA9PT0gQ29uc3RhbnRzLkVGX1pJUDY0X09SXzMyKSB7XG4gICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLnNpemUgPSBzaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+PSBDb25zdGFudHMuRUZfWklQNjRfUkhPKSB7XG4gICAgICAgICAgICBjb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRShkYXRhLCBDb25zdGFudHMuRUZfWklQNjRfU0NPTVApO1xuICAgICAgICAgICAgaWYgKF9lbnRyeUhlYWRlci5jb21wcmVzc2VkU2l6ZSA9PT0gQ29uc3RhbnRzLkVGX1pJUDY0X09SXzMyKSB7XG4gICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID49IENvbnN0YW50cy5FRl9aSVA2NF9EU04pIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHJlYWRVSW50NjRMRShkYXRhLCBDb25zdGFudHMuRUZfWklQNjRfUkhPKTtcbiAgICAgICAgICAgIGlmIChfZW50cnlIZWFkZXIub2Zmc2V0ID09PSBDb25zdGFudHMuRUZfWklQNjRfT1JfMzIpIHtcbiAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+PSBDb25zdGFudHMuRUZfWklQNjRfRFNOICsgNCkge1xuICAgICAgICAgICAgZGlza051bVN0YXJ0ID0gZGF0YS5yZWFkVUludDMyTEUoQ29uc3RhbnRzLkVGX1pJUDY0X0RTTik7XG4gICAgICAgICAgICBpZiAoX2VudHJ5SGVhZGVyLmRpc2tOdW1TdGFydCA9PT0gQ29uc3RhbnRzLkVGX1pJUDY0X09SXzE2KSB7XG4gICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmRpc2tOdW1TdGFydCA9IGRpc2tOdW1TdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGdldCBlbnRyeU5hbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2VudHJ5TmFtZS50b1N0cmluZygpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgcmF3RW50cnlOYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9lbnRyeU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBlbnRyeU5hbWUodmFsKSB7XG4gICAgICAgICAgICBfZW50cnlOYW1lID0gVXRpbHMudG9CdWZmZXIodmFsKTtcbiAgICAgICAgICAgIHZhciBsYXN0Q2hhciA9IF9lbnRyeU5hbWVbX2VudHJ5TmFtZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIF9pc0RpcmVjdG9yeSA9IGxhc3RDaGFyID09PSA0NyB8fCBsYXN0Q2hhciA9PT0gOTI7XG4gICAgICAgICAgICBfZW50cnlIZWFkZXIuZmlsZU5hbWVMZW5ndGggPSBfZW50cnlOYW1lLmxlbmd0aDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZXh0cmEoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2V4dHJhO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgZXh0cmEodmFsKSB7XG4gICAgICAgICAgICBfZXh0cmEgPSB2YWw7XG4gICAgICAgICAgICBfZW50cnlIZWFkZXIuZXh0cmFMZW5ndGggPSB2YWwubGVuZ3RoO1xuICAgICAgICAgICAgcGFyc2VFeHRyYSh2YWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBjb21tZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9jb21tZW50LnRvU3RyaW5nKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjb21tZW50KHZhbCkge1xuICAgICAgICAgICAgX2NvbW1lbnQgPSBVdGlscy50b0J1ZmZlcih2YWwpO1xuICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmNvbW1lbnRMZW5ndGggPSBfY29tbWVudC5sZW5ndGg7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgICAgICB2YXIgbiA9IF9lbnRyeU5hbWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHJldHVybiBfaXNEaXJlY3RvcnlcbiAgICAgICAgICAgICAgICA/IG5cbiAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyKG4ubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgICAgICAgICAgICAgICAgLnBvcCgpXG4gICAgICAgICAgICAgICAgOiBuLnNwbGl0KFwiL1wiKS5wb3AoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGlzRGlyZWN0b3J5KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9pc0RpcmVjdG9yeTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRDb21wcmVzc2VkRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXByZXNzKGZhbHNlLCBudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRDb21wcmVzc2VkRGF0YUFzeW5jOiBmdW5jdGlvbiAoLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb21wcmVzcyh0cnVlLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RGF0YTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB1bmNvbXByZXNzZWREYXRhID0gVXRpbHMudG9CdWZmZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFfaXNEaXJlY3RvcnkgJiYgdW5jb21wcmVzc2VkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIuc2l6ZSA9IHVuY29tcHJlc3NlZERhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIF9lbnRyeUhlYWRlci5tZXRob2QgPSBVdGlscy5Db25zdGFudHMuREVGTEFURUQ7XG4gICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmNyYyA9IFV0aWxzLmNyYzMyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZvbGRlcnMgYW5kIGJsYW5rIGZpbGVzIHNob3VsZCBiZSBzdG9yZWRcbiAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIubWV0aG9kID0gVXRpbHMuQ29uc3RhbnRzLlNUT1JFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiAocGFzcykge1xuICAgICAgICAgICAgaWYgKF9lbnRyeUhlYWRlci5jaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuY29tcHJlc3NlZERhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWNvbXByZXNzKGZhbHNlLCBudWxsLCBwYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBnZXREYXRhQXN5bmM6IGZ1bmN0aW9uICgvKkZ1bmN0aW9uKi8gY2FsbGJhY2ssIHBhc3MpIHtcbiAgICAgICAgICAgIGlmIChfZW50cnlIZWFkZXIuY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVuY29tcHJlc3NlZERhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWNvbXByZXNzKHRydWUsIGNhbGxiYWNrLCBwYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBzZXQgYXR0cihhdHRyKSB7XG4gICAgICAgICAgICBfZW50cnlIZWFkZXIuYXR0ciA9IGF0dHI7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBhdHRyKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9lbnRyeUhlYWRlci5hdHRyO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldCBoZWFkZXIoLypCdWZmZXIqLyBkYXRhKSB7XG4gICAgICAgICAgICBfZW50cnlIZWFkZXIubG9hZEZyb21CaW5hcnkoZGF0YSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IGhlYWRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiBfZW50cnlIZWFkZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFja0hlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gMS4gY3JlYXRlIGhlYWRlciAoYnVmZmVyKVxuICAgICAgICAgICAgdmFyIGhlYWRlciA9IF9lbnRyeUhlYWRlci5lbnRyeUhlYWRlclRvQmluYXJ5KCk7XG4gICAgICAgICAgICB2YXIgYWRkcG9zID0gVXRpbHMuQ29uc3RhbnRzLkNFTkhEUjtcbiAgICAgICAgICAgIC8vIDIuIGFkZCBmaWxlIG5hbWVcbiAgICAgICAgICAgIF9lbnRyeU5hbWUuY29weShoZWFkZXIsIGFkZHBvcyk7XG4gICAgICAgICAgICBhZGRwb3MgKz0gX2VudHJ5TmFtZS5sZW5ndGg7XG4gICAgICAgICAgICAvLyAzLiBhZGQgZXh0cmEgZGF0YVxuICAgICAgICAgICAgaWYgKF9lbnRyeUhlYWRlci5leHRyYUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIF9leHRyYS5jb3B5KGhlYWRlciwgYWRkcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRwb3MgKz0gX2VudHJ5SGVhZGVyLmV4dHJhTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gNC4gYWRkIGZpbGUgY29tbWVudFxuICAgICAgICAgICAgaWYgKF9lbnRyeUhlYWRlci5jb21tZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgX2NvbW1lbnQuY29weShoZWFkZXIsIGFkZHBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvSlNPTjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBmdW5jdGlvbiAobnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCI8XCIgKyAoKG5yICYmIG5yLmxlbmd0aCArIFwiIGJ5dGVzIGJ1ZmZlclwiKSB8fCBcIm51bGxcIikgKyBcIj5cIjtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW50cnlOYW1lOiB0aGlzLmVudHJ5TmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgY29tbWVudDogdGhpcy5jb21tZW50LFxuICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5OiB0aGlzLmlzRGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGhlYWRlcjogX2VudHJ5SGVhZGVyLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGNvbXByZXNzZWREYXRhOiBieXRlcyhpbnB1dCksXG4gICAgICAgICAgICAgICAgZGF0YTogYnl0ZXModW5jb21wcmVzc2VkRGF0YSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpLCBudWxsLCBcIlxcdFwiKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwgImNvbnN0IFppcEVudHJ5ID0gcmVxdWlyZShcIi4vemlwRW50cnlcIik7XG5jb25zdCBIZWFkZXJzID0gcmVxdWlyZShcIi4vaGVhZGVyc1wiKTtcbmNvbnN0IFV0aWxzID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLypCdWZmZXJ8bnVsbCovIGluQnVmZmVyLCAvKiogb2JqZWN0ICovIG9wdGlvbnMpIHtcbiAgICB2YXIgZW50cnlMaXN0ID0gW10sXG4gICAgICAgIGVudHJ5VGFibGUgPSB7fSxcbiAgICAgICAgX2NvbW1lbnQgPSBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIG1haW5IZWFkZXIgPSBuZXcgSGVhZGVycy5NYWluSGVhZGVyKCksXG4gICAgICAgIGxvYWRlZEVudHJpZXMgPSBmYWxzZTtcblxuICAgIC8vIGFzc2lnbiBvcHRpb25zXG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCB7IG5vU29ydCB9ID0gb3B0cztcblxuICAgIGlmIChpbkJ1ZmZlcikge1xuICAgICAgICAvLyBpcyBhIG1lbW9yeSBidWZmZXJcbiAgICAgICAgcmVhZE1haW5IZWFkZXIob3B0cy5yZWFkRW50cmllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm9uZS4gaXMgYSBuZXcgZmlsZVxuICAgICAgICBsb2FkZWRFbnRyaWVzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpdGVyYXRlRW50cmllcyhjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB0b3RhbEVudHJpZXMgPSBtYWluSGVhZGVyLmRpc2tFbnRyaWVzOyAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllc1xuICAgICAgICBsZXQgaW5kZXggPSBtYWluSGVhZGVyLm9mZnNldDsgLy8gb2Zmc2V0IG9mIGZpcnN0IENFTiBoZWFkZXJcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsRW50cmllczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdG1wID0gaW5kZXg7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBaaXBFbnRyeShpbkJ1ZmZlcik7XG5cbiAgICAgICAgICAgIGVudHJ5LmhlYWRlciA9IGluQnVmZmVyLnNsaWNlKHRtcCwgKHRtcCArPSBVdGlscy5Db25zdGFudHMuQ0VOSERSKSk7XG4gICAgICAgICAgICBlbnRyeS5lbnRyeU5hbWUgPSBpbkJ1ZmZlci5zbGljZSh0bXAsICh0bXAgKz0gZW50cnkuaGVhZGVyLmZpbGVOYW1lTGVuZ3RoKSk7XG5cbiAgICAgICAgICAgIGluZGV4ICs9IGVudHJ5LmhlYWRlci5lbnRyeUhlYWRlclNpemU7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKGVudHJ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRFbnRyaWVzKCkge1xuICAgICAgICBsb2FkZWRFbnRyaWVzID0gdHJ1ZTtcbiAgICAgICAgZW50cnlUYWJsZSA9IHt9O1xuICAgICAgICBlbnRyeUxpc3QgPSBuZXcgQXJyYXkobWFpbkhlYWRlci5kaXNrRW50cmllcyk7IC8vIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzXG4gICAgICAgIHZhciBpbmRleCA9IG1haW5IZWFkZXIub2Zmc2V0OyAvLyBvZmZzZXQgb2YgZmlyc3QgQ0VOIGhlYWRlclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJ5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRtcCA9IGluZGV4LFxuICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IFppcEVudHJ5KGluQnVmZmVyKTtcbiAgICAgICAgICAgIGVudHJ5LmhlYWRlciA9IGluQnVmZmVyLnNsaWNlKHRtcCwgKHRtcCArPSBVdGlscy5Db25zdGFudHMuQ0VOSERSKSk7XG5cbiAgICAgICAgICAgIGVudHJ5LmVudHJ5TmFtZSA9IGluQnVmZmVyLnNsaWNlKHRtcCwgKHRtcCArPSBlbnRyeS5oZWFkZXIuZmlsZU5hbWVMZW5ndGgpKTtcblxuICAgICAgICAgICAgaWYgKGVudHJ5LmhlYWRlci5leHRyYUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LmV4dHJhID0gaW5CdWZmZXIuc2xpY2UodG1wLCAodG1wICs9IGVudHJ5LmhlYWRlci5leHRyYUxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW50cnkuaGVhZGVyLmNvbW1lbnRMZW5ndGgpIGVudHJ5LmNvbW1lbnQgPSBpbkJ1ZmZlci5zbGljZSh0bXAsIHRtcCArIGVudHJ5LmhlYWRlci5jb21tZW50TGVuZ3RoKTtcblxuICAgICAgICAgICAgaW5kZXggKz0gZW50cnkuaGVhZGVyLmVudHJ5SGVhZGVyU2l6ZTtcblxuICAgICAgICAgICAgZW50cnlMaXN0W2ldID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeVRhYmxlW2VudHJ5LmVudHJ5TmFtZV0gPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRNYWluSGVhZGVyKC8qQm9vbGVhbiovIHJlYWROb3cpIHtcbiAgICAgICAgdmFyIGkgPSBpbkJ1ZmZlci5sZW5ndGggLSBVdGlscy5Db25zdGFudHMuRU5ESERSLCAvLyBFTkQgaGVhZGVyIHNpemVcbiAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KDAsIGkgLSAweGZmZmYpLCAvLyAweEZGRkYgaXMgdGhlIG1heCB6aXAgZmlsZSBjb21tZW50IGxlbmd0aFxuICAgICAgICAgICAgbiA9IG1heCxcbiAgICAgICAgICAgIGVuZFN0YXJ0ID0gaW5CdWZmZXIubGVuZ3RoLFxuICAgICAgICAgICAgZW5kT2Zmc2V0ID0gLTEsIC8vIFN0YXJ0IG9mZnNldCBvZiB0aGUgRU5EIGhlYWRlclxuICAgICAgICAgICAgY29tbWVudEVuZCA9IDA7XG5cbiAgICAgICAgZm9yIChpOyBpID49IG47IGktLSkge1xuICAgICAgICAgICAgaWYgKGluQnVmZmVyW2ldICE9PSAweDUwKSBjb250aW51ZTsgLy8gcXVpY2sgY2hlY2sgdGhhdCB0aGUgYnl0ZSBpcyAnUCdcbiAgICAgICAgICAgIGlmIChpbkJ1ZmZlci5yZWFkVUludDMyTEUoaSkgPT09IFV0aWxzLkNvbnN0YW50cy5FTkRTSUcpIHtcbiAgICAgICAgICAgICAgICAvLyBcIlBLXFwwMDVcXDAwNlwiXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0ID0gaTtcbiAgICAgICAgICAgICAgICBjb21tZW50RW5kID0gaTtcbiAgICAgICAgICAgICAgICBlbmRTdGFydCA9IGkgKyBVdGlscy5Db25zdGFudHMuRU5ESERSO1xuICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgZm91bmQgYSByZWd1bGFyIHNpZ25hdHVyZSwgbGV0J3MgbG9vayBqdXN0IGEgYml0IGZ1cnRoZXIgdG8gY2hlY2sgaWYgdGhlcmUncyBhbnkgemlwNjQgc2lnbmF0dXJlXG4gICAgICAgICAgICAgICAgbiA9IGkgLSBVdGlscy5Db25zdGFudHMuRU5ENjRIRFI7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbkJ1ZmZlci5yZWFkVUludDMyTEUoaSkgPT09IFV0aWxzLkNvbnN0YW50cy5FTkQ2NFNJRykge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgemlwNjQgc2lnbmF0dXJlLCBsZXQncyBjb250aW51ZSByZWFkaW5nIHRoZSB3aG9sZSB6aXA2NCByZWNvcmRcbiAgICAgICAgICAgICAgICBuID0gbWF4O1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5CdWZmZXIucmVhZFVJbnQzMkxFKGkpID09PSBVdGlscy5Db25zdGFudHMuWklQNjRTSUcpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCB0aGUgemlwNjQgcmVjb3JkLCBsZXQncyBkZXRlcm1pbmUgaXQncyBzaXplXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0ID0gaTtcbiAgICAgICAgICAgICAgICBlbmRTdGFydCA9IGkgKyBVdGlscy5yZWFkQmlnVUludDY0TEUoaW5CdWZmZXIsIGkgKyBVdGlscy5Db25zdGFudHMuWklQNjRTSVpFKSArIFV0aWxzLkNvbnN0YW50cy5aSVA2NExFQUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIX5lbmRPZmZzZXQpIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuSU5WQUxJRF9GT1JNQVQpO1xuXG4gICAgICAgIG1haW5IZWFkZXIubG9hZEZyb21CaW5hcnkoaW5CdWZmZXIuc2xpY2UoZW5kT2Zmc2V0LCBlbmRTdGFydCkpO1xuICAgICAgICBpZiAobWFpbkhlYWRlci5jb21tZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICBfY29tbWVudCA9IGluQnVmZmVyLnNsaWNlKGNvbW1lbnRFbmQgKyBVdGlscy5Db25zdGFudHMuRU5ESERSKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVhZE5vdykgcmVhZEVudHJpZXMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzb3J0RW50cmllcygpIHtcbiAgICAgICAgaWYgKGVudHJ5TGlzdC5sZW5ndGggPiAxICYmICFub1NvcnQpIHtcbiAgICAgICAgICAgIGVudHJ5TGlzdC5zb3J0KChhLCBiKSA9PiBhLmVudHJ5TmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5lbnRyeU5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgWmlwRW50cnkgb2JqZWN0cyBleGlzdGVudCBpbiB0aGUgY3VycmVudCBvcGVuZWQgYXJjaGl2ZVxuICAgICAgICAgKiBAcmV0dXJuIEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICBnZXQgZW50cmllcygpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkRW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmNoaXZlIGNvbW1lbnRcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IGNvbW1lbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NvbW1lbnQudG9TdHJpbmcoKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGNvbW1lbnQodmFsKSB7XG4gICAgICAgICAgICBfY29tbWVudCA9IFV0aWxzLnRvQnVmZmVyKHZhbCk7XG4gICAgICAgICAgICBtYWluSGVhZGVyLmNvbW1lbnRMZW5ndGggPSBfY29tbWVudC5sZW5ndGg7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0RW50cnlDb3VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFsb2FkZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1haW5IZWFkZXIuZGlza0VudHJpZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3QubGVuZ3RoO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFsb2FkZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0ZUVudHJpZXMoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW50cnlMaXN0LmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZW50cnkgaXMgaW5leGlzdGVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZW50cnlOYW1lXG4gICAgICAgICAqIEByZXR1cm4gWmlwRW50cnlcbiAgICAgICAgICovXG4gICAgICAgIGdldEVudHJ5OiBmdW5jdGlvbiAoLypTdHJpbmcqLyBlbnRyeU5hbWUpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkRW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW50cnlUYWJsZVtlbnRyeU5hbWVdIHx8IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgdGhlIGdpdmVuIGVudHJ5IHRvIHRoZSBlbnRyeSBsaXN0XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAgICAgKi9cbiAgICAgICAgc2V0RW50cnk6IGZ1bmN0aW9uICgvKlppcEVudHJ5Ki8gZW50cnkpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkRW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeUxpc3QucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeVRhYmxlW2VudHJ5LmVudHJ5TmFtZV0gPSBlbnRyeTtcbiAgICAgICAgICAgIG1haW5IZWFkZXIudG90YWxFbnRyaWVzID0gZW50cnlMaXN0Lmxlbmd0aDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVtb3ZlcyB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoZSBlbnRyeSBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiB0aGUgZW50cnkgaXMgYSBkaXJlY3RvcnksIHRoZW4gYWxsIG5lc3RlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2lsbCBiZSByZW1vdmVkXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeU5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGRlbGV0ZUVudHJ5OiBmdW5jdGlvbiAoLypTdHJpbmcqLyBlbnRyeU5hbWUpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkRW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyeVRhYmxlW2VudHJ5TmFtZV07XG4gICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3NlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RW50cnlDaGlsZHJlbihlbnRyeSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmVudHJ5TmFtZSAhPT0gZW50cnlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi5kZWxldGVFbnRyeShjaGlsZC5lbnRyeU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeUxpc3Quc3BsaWNlKGVudHJ5TGlzdC5pbmRleE9mKGVudHJ5KSwgMSk7XG4gICAgICAgICAgICBkZWxldGUgZW50cnlUYWJsZVtlbnRyeU5hbWVdO1xuICAgICAgICAgICAgbWFpbkhlYWRlci50b3RhbEVudHJpZXMgPSBlbnRyeUxpc3QubGVuZ3RoO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgSXRlcmF0ZXMgYW5kIHJldHVybnMgYWxsIG5lc3RlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgb2YgdGhlIGdpdmVuIGVudHJ5XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAgICAgKiBAcmV0dXJuIEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICBnZXRFbnRyeUNoaWxkcmVuOiBmdW5jdGlvbiAoLypaaXBFbnRyeSovIGVudHJ5KSB7XG4gICAgICAgICAgICBpZiAoIWxvYWRlZEVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5lbnRyeU5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuID0gbmFtZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBlbnRyeUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoemlwRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHppcEVudHJ5LmVudHJ5TmFtZS5zdWJzdHIoMCwgbGVuKSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHppcEVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSB6aXAgZmlsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIEJ1ZmZlclxuICAgICAgICAgKi9cbiAgICAgICAgY29tcHJlc3NUb0J1ZmZlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFsb2FkZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvcnRFbnRyaWVzKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFCbG9jayA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZW50cnlIZWFkZXJzID0gW107XG4gICAgICAgICAgICBsZXQgdG90YWxTaXplID0gMDtcbiAgICAgICAgICAgIGxldCBkaW5kZXggPSAwO1xuXG4gICAgICAgICAgICBtYWluSGVhZGVyLnNpemUgPSAwO1xuICAgICAgICAgICAgbWFpbkhlYWRlci5vZmZzZXQgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJ5TGlzdCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzIGRhdGEgYW5kIHNldCBsb2NhbCBhbmQgZW50cnkgaGVhZGVyIGFjY29yZGluZ2x5LiBSZWFzb24gd2h5IGlzIGNhbGxlZCBmaXJzdFxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWREYXRhID0gZW50cnkuZ2V0Q29tcHJlc3NlZERhdGEoKTtcbiAgICAgICAgICAgICAgICAvLyAxLiBjb25zdHJ1Y3QgZGF0YSBoZWFkZXJcbiAgICAgICAgICAgICAgICBlbnRyeS5oZWFkZXIub2Zmc2V0ID0gZGluZGV4O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFIZWFkZXIgPSBlbnRyeS5oZWFkZXIuZGF0YUhlYWRlclRvQmluYXJ5KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlOYW1lTGVuID0gZW50cnkucmF3RW50cnlOYW1lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAvLyAxLjIuIHBvc3RoZWFkZXIgLSBkYXRhIGFmdGVyIGRhdGEgaGVhZGVyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zdEhlYWRlciA9IEJ1ZmZlci5hbGxvYyhlbnRyeU5hbWVMZW4gKyBlbnRyeS5leHRyYS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGVudHJ5LnJhd0VudHJ5TmFtZS5jb3B5KHBvc3RIZWFkZXIsIDApO1xuICAgICAgICAgICAgICAgIHBvc3RIZWFkZXIuY29weShlbnRyeS5leHRyYSwgZW50cnlOYW1lTGVuKTtcblxuICAgICAgICAgICAgICAgIC8vIDIuIG9mZnNldHNcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YUhlYWRlci5sZW5ndGggKyBwb3N0SGVhZGVyLmxlbmd0aCArIGNvbXByZXNzZWREYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBkaW5kZXggKz0gZGF0YUxlbmd0aDtcblxuICAgICAgICAgICAgICAgIC8vIDMuIHN0b3JlIHZhbHVlcyBpbiBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIGRhdGFCbG9jay5wdXNoKGRhdGFIZWFkZXIpO1xuICAgICAgICAgICAgICAgIGRhdGFCbG9jay5wdXNoKHBvc3RIZWFkZXIpO1xuICAgICAgICAgICAgICAgIGRhdGFCbG9jay5wdXNoKGNvbXByZXNzZWREYXRhKTtcblxuICAgICAgICAgICAgICAgIC8vIDQuIGNvbnN0cnVjdCBlbnRyeSBoZWFkZXJcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeUhlYWRlciA9IGVudHJ5LnBhY2tIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBlbnRyeUhlYWRlcnMucHVzaChlbnRyeUhlYWRlcik7XG4gICAgICAgICAgICAgICAgLy8gNS4gdXBkYXRlIG1haW4gaGVhZGVyXG4gICAgICAgICAgICAgICAgbWFpbkhlYWRlci5zaXplICs9IGVudHJ5SGVhZGVyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gZGF0YUxlbmd0aCArIGVudHJ5SGVhZGVyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG90YWxTaXplICs9IG1haW5IZWFkZXIubWFpbkhlYWRlclNpemU7IC8vIGFsc28gaW5jbHVkZXMgemlwIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgICAgIC8vIHBvaW50IHRvIGVuZCBvZiBkYXRhIGFuZCBiZWdpbm5pbmcgb2YgY2VudHJhbCBkaXJlY3RvcnkgZmlyc3QgcmVjb3JkXG4gICAgICAgICAgICBtYWluSGVhZGVyLm9mZnNldCA9IGRpbmRleDtcblxuICAgICAgICAgICAgZGluZGV4ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IG91dEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyh0b3RhbFNpemUpO1xuICAgICAgICAgICAgLy8gd3JpdGUgZGF0YSBibG9ja3NcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udGVudCBvZiBkYXRhQmxvY2spIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpO1xuICAgICAgICAgICAgICAgIGRpbmRleCArPSBjb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gd3JpdGUgY2VudHJhbCBkaXJlY3RvcnkgZW50cmllc1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250ZW50IG9mIGVudHJ5SGVhZGVycykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQuY29weShvdXRCdWZmZXIsIGRpbmRleCk7XG4gICAgICAgICAgICAgICAgZGluZGV4ICs9IGNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3cml0ZSBtYWluIGhlYWRlclxuICAgICAgICAgICAgY29uc3QgbWggPSBtYWluSGVhZGVyLnRvQmluYXJ5KCk7XG4gICAgICAgICAgICBpZiAoX2NvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBfY29tbWVudC5jb3B5KG1oLCBVdGlscy5Db25zdGFudHMuRU5ESERSKTsgLy8gYWRkIHppcCBmaWxlIGNvbW1lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1oLmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpO1xuXG4gICAgICAgICAgICByZXR1cm4gb3V0QnVmZmVyO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvQXN5bmNCdWZmZXI6IGZ1bmN0aW9uICgvKkZ1bmN0aW9uKi8gb25TdWNjZXNzLCAvKkZ1bmN0aW9uKi8gb25GYWlsLCAvKkZ1bmN0aW9uKi8gb25JdGVtU3RhcnQsIC8qRnVuY3Rpb24qLyBvbkl0ZW1FbmQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNvcnRFbnRyaWVzKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhQmxvY2sgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeUhlYWRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdG90YWxTaXplID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgZGluZGV4ID0gMDtcblxuICAgICAgICAgICAgICAgIG1haW5IZWFkZXIuc2l6ZSA9IDA7XG4gICAgICAgICAgICAgICAgbWFpbkhlYWRlci5vZmZzZXQgPSAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcHJlc3MyQnVmZmVyID0gZnVuY3Rpb24gKGVudHJ5TGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5TGlzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJ5TGlzdHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZW50cnkuZW50cnlOYW1lICsgZW50cnkuZXh0cmEudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkl0ZW1TdGFydCkgb25JdGVtU3RhcnQobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb21wcmVzc2VkRGF0YUFzeW5jKGZ1bmN0aW9uIChjb21wcmVzc2VkRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkl0ZW1FbmQpIG9uSXRlbUVuZChuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmhlYWRlci5vZmZzZXQgPSBkaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhSGVhZGVyID0gZW50cnkuaGVhZGVyLmRhdGFIZWFkZXJUb0JpbmFyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc3RIZWFkZXIgPSBCdWZmZXIuYWxsb2MobmFtZS5sZW5ndGgsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhSGVhZGVyLmxlbmd0aCArIHBvc3RIZWFkZXIubGVuZ3RoICsgY29tcHJlc3NlZERhdGEubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGluZGV4ICs9IGRhdGFMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2sucHVzaChkYXRhSGVhZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2sucHVzaChwb3N0SGVhZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2sucHVzaChjb21wcmVzc2VkRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeUhlYWRlciA9IGVudHJ5LnBhY2tIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeUhlYWRlcnMucHVzaChlbnRyeUhlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkhlYWRlci5zaXplICs9IGVudHJ5SGVhZGVyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gZGF0YUxlbmd0aCArIGVudHJ5SGVhZGVyLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzMkJ1ZmZlcihlbnRyeUxpc3RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplICs9IG1haW5IZWFkZXIubWFpbkhlYWRlclNpemU7IC8vIGFsc28gaW5jbHVkZXMgemlwIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGVuZCBvZiBkYXRhIGFuZCBiZWdpbm5pbmcgb2YgY2VudHJhbCBkaXJlY3RvcnkgZmlyc3QgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWluSGVhZGVyLm9mZnNldCA9IGRpbmRleDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyh0b3RhbFNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUJsb2NrLmZvckVhY2goZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpOyAvLyB3cml0ZSBkYXRhIGJsb2Nrc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbmRleCArPSBjb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpOyAvLyB3cml0ZSBjZW50cmFsIGRpcmVjdG9yeSBlbnRyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGluZGV4ICs9IGNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1oID0gbWFpbkhlYWRlci50b0JpbmFyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbW1lbnQuY29weShtaCwgVXRpbHMuQ29uc3RhbnRzLkVOREhEUik7IC8vIGFkZCB6aXAgZmlsZSBjb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1oLmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpOyAvLyB3cml0ZSBtYWluIGhlYWRlclxuXG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3Mob3V0QnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb21wcmVzczJCdWZmZXIoZW50cnlMaXN0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBvbkZhaWwoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICJjb25zdCBVdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5jb25zdCBwdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IFppcEVudHJ5ID0gcmVxdWlyZShcIi4vemlwRW50cnlcIik7XG5jb25zdCBaaXBGaWxlID0gcmVxdWlyZShcIi4vemlwRmlsZVwiKTtcblxuY29uc3QgZ2V0X0Jvb2wgPSAodmFsLCBkZWYpID0+ICh0eXBlb2YgdmFsID09PSBcImJvb2xlYW5cIiA/IHZhbCA6IGRlZik7XG5jb25zdCBnZXRfU3RyID0gKHZhbCwgZGVmKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IHZhbCA6IGRlZik7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIC8vIG9wdGlvbiBcIm5vU29ydFwiIDogaWYgdHJ1ZSBpdCBkaXNhYmxlcyBmaWxlcyBzb3J0aW5nXG4gICAgbm9Tb3J0OiBmYWxzZSxcbiAgICAvLyByZWFkIGVudHJpZXMgZHVyaW5nIGxvYWQgKGluaXRpYWwgbG9hZGluZyBtYXkgYmUgc2xvd2VyKVxuICAgIHJlYWRFbnRyaWVzOiBmYWxzZSxcbiAgICAvLyBkZWZhdWx0IG1ldGhvZCBpcyBub25lXG4gICAgbWV0aG9kOiBVdGlscy5Db25zdGFudHMuTk9ORSxcbiAgICAvLyBmaWxlIHN5c3RlbVxuICAgIGZzOiBudWxsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgvKipTdHJpbmcqLyBpbnB1dCwgLyoqIG9iamVjdCAqLyBvcHRpb25zKSB7XG4gICAgbGV0IGluQnVmZmVyID0gbnVsbDtcblxuICAgIC8vIGNyZWF0ZSBvYmplY3QgYmFzZWQgZGVmYXVsdCBvcHRpb25zLCBhbGxvd2luZyB0aGVtIHRvIGJlIG92ZXJ3cml0dGVuXG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgZGVmYXVsdE9wdGlvbnMpO1xuXG4gICAgLy8gdGVzdCBpbnB1dCB2YXJpYWJsZVxuICAgIGlmIChpbnB1dCAmJiBcIm9iamVjdFwiID09PSB0eXBlb2YgaW5wdXQpIHtcbiAgICAgICAgLy8gaWYgdmFsdWUgaXMgbm90IGJ1ZmZlciB3ZSBhY2NlcHQgaXQgdG8gYmUgb2JqZWN0IHdpdGggb3B0aW9uc1xuICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG9wdHMsIGlucHV0KTtcbiAgICAgICAgICAgIGlucHV0ID0gb3B0cy5pbnB1dCA/IG9wdHMuaW5wdXQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAob3B0cy5pbnB1dCkgZGVsZXRlIG9wdHMuaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBpbnB1dCBpcyBidWZmZXJcbiAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIGluQnVmZmVyID0gaW5wdXQ7XG4gICAgICAgICAgICBvcHRzLm1ldGhvZCA9IFV0aWxzLkNvbnN0YW50cy5CVUZGRVI7XG4gICAgICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFzc2lnbiBvcHRpb25zXG4gICAgT2JqZWN0LmFzc2lnbihvcHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGluc3RhbmNpYXRlIHV0aWxzIGZpbGVzeXN0ZW1cbiAgICBjb25zdCBmaWxldG9vbHMgPSBuZXcgVXRpbHMob3B0cyk7XG5cbiAgICAvLyBpZiBpbnB1dCBpcyBmaWxlIG5hbWUgd2UgcmV0cmlldmUgaXRzIGNvbnRlbnRcbiAgICBpZiAoaW5wdXQgJiYgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGlucHV0KSB7XG4gICAgICAgIC8vIGxvYWQgemlwIGZpbGVcbiAgICAgICAgaWYgKGZpbGV0b29scy5mcy5leGlzdHNTeW5jKGlucHV0KSkge1xuICAgICAgICAgICAgb3B0cy5tZXRob2QgPSBVdGlscy5Db25zdGFudHMuRklMRTtcbiAgICAgICAgICAgIG9wdHMuZmlsZW5hbWUgPSBpbnB1dDtcbiAgICAgICAgICAgIGluQnVmZmVyID0gZmlsZXRvb2xzLmZzLnJlYWRGaWxlU3luYyhpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLklOVkFMSURfRklMRU5BTUUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIHZhcmlhYmxlXG4gICAgY29uc3QgX3ppcCA9IG5ldyBaaXBGaWxlKGluQnVmZmVyLCBvcHRzKTtcblxuICAgIGNvbnN0IHsgY2Fub25pY2FsLCBzYW5pdGl6ZSB9ID0gVXRpbHM7XG5cbiAgICBmdW5jdGlvbiBnZXRFbnRyeSgvKipPYmplY3QqLyBlbnRyeSkge1xuICAgICAgICBpZiAoZW50cnkgJiYgX3ppcCkge1xuICAgICAgICAgICAgdmFyIGl0ZW07XG4gICAgICAgICAgICAvLyBJZiBlbnRyeSB3YXMgZ2l2ZW4gYXMgYSBmaWxlIG5hbWVcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIGl0ZW0gPSBfemlwLmdldEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIC8vIGlmIGVudHJ5IHdhcyBnaXZlbiBhcyBhIFppcEVudHJ5IG9iamVjdFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZW50cnkuZW50cnlOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBlbnRyeS5oZWFkZXIgIT09IFwidW5kZWZpbmVkXCIpIGl0ZW0gPSBfemlwLmdldEVudHJ5KGVudHJ5LmVudHJ5TmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4UGF0aCh6aXBQYXRoKSB7XG4gICAgICAgIGNvbnN0IHsgam9pbiwgbm9ybWFsaXplLCBzZXAgfSA9IHB0aC5wb3NpeDtcbiAgICAgICAgLy8gY29udmVydCB3aW5kb3dzIGZpbGUgc2VwYXJhdG9ycyBhbmQgbm9ybWFsaXplXG4gICAgICAgIHJldHVybiBqb2luKFwiLlwiLCBub3JtYWxpemUoc2VwICsgemlwUGF0aC5zcGxpdChcIlxcXFxcIikuam9pbihzZXApICsgc2VwKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4dHJhY3RzIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBhcmNoaXZlIGFuZCByZXR1cm5zIHRoZSBjb250ZW50IGFzIGEgQnVmZmVyIG9iamVjdFxuICAgICAgICAgKiBAcGFyYW0gZW50cnkgWmlwRW50cnkgb2JqZWN0IG9yIFN0cmluZyB3aXRoIHRoZSBmdWxsIHBhdGggb2YgdGhlIGVudHJ5XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gQnVmZmVyIG9yIE51bGwgaW4gY2FzZSBvZiBlcnJvclxuICAgICAgICAgKi9cbiAgICAgICAgcmVhZEZpbGU6IGZ1bmN0aW9uICgvKipPYmplY3QqLyBlbnRyeSwgLypTdHJpbmcsIEJ1ZmZlciovIHBhc3MpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gZ2V0RW50cnkoZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuIChpdGVtICYmIGl0ZW0uZ2V0RGF0YShwYXNzKSkgfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQXN5bmNocm9ub3VzIHJlYWRGaWxlXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeSBaaXBFbnRyeSBvYmplY3Qgb3IgU3RyaW5nIHdpdGggdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZW50cnlcbiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gQnVmZmVyIG9yIE51bGwgaW4gY2FzZSBvZiBlcnJvclxuICAgICAgICAgKi9cbiAgICAgICAgcmVhZEZpbGVBc3luYzogZnVuY3Rpb24gKC8qKk9iamVjdCovIGVudHJ5LCAvKipGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IGdldEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5nZXREYXRhQXN5bmMoY2FsbGJhY2spO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBcImdldEVudHJ5IGZhaWxlZCBmb3I6XCIgKyBlbnRyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4dHJhY3RzIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBhcmNoaXZlIGFuZCByZXR1cm5zIHRoZSBjb250ZW50IGFzIHBsYWluIHRleHQgaW4gdGhlIGdpdmVuIGVuY29kaW5nXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeSBaaXBFbnRyeSBvYmplY3Qgb3IgU3RyaW5nIHdpdGggdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZW50cnlcbiAgICAgICAgICogQHBhcmFtIGVuY29kaW5nIE9wdGlvbmFsLiBJZiBubyBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdXRmOCBpcyB1c2VkXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gU3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICByZWFkQXNUZXh0OiBmdW5jdGlvbiAoLyoqT2JqZWN0Ki8gZW50cnksIC8qKlN0cmluZz0qLyBlbmNvZGluZykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gaXRlbS5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoZW5jb2RpbmcgfHwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBc3luY2hyb25vdXMgcmVhZEFzVGV4dFxuICAgICAgICAgKiBAcGFyYW0gZW50cnkgWmlwRW50cnkgb2JqZWN0IG9yIFN0cmluZyB3aXRoIHRoZSBmdWxsIHBhdGggb2YgdGhlIGVudHJ5XG4gICAgICAgICAqIEBwYXJhbSBjYWxsYmFja1xuICAgICAgICAgKiBAcGFyYW0gZW5jb2RpbmcgT3B0aW9uYWwuIElmIG5vIGVuY29kaW5nIGlzIHNwZWNpZmllZCB1dGY4IGlzIHVzZWRcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiBTdHJpbmdcbiAgICAgICAgICovXG4gICAgICAgIHJlYWRBc1RleHRBc3luYzogZnVuY3Rpb24gKC8qKk9iamVjdCovIGVudHJ5LCAvKipGdW5jdGlvbiovIGNhbGxiYWNrLCAvKipTdHJpbmc9Ki8gZW5jb2RpbmcpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gZ2V0RW50cnkoZW50cnkpO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpdGVtLmdldERhdGFBc3luYyhmdW5jdGlvbiAoZGF0YSwgZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YS50b1N0cmluZyhlbmNvZGluZyB8fCBcInV0ZjhcIikpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgZmlsZSBvciB0aGUgZW50cnkgYW5kIGFsbCBpdCdzIG5lc3RlZCBkaXJlY3RvcmllcyBhbmQgZmlsZXMgaWYgdGhlIGdpdmVuIGVudHJ5IGlzIGEgZGlyZWN0b3J5XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAgICAgKi9cbiAgICAgICAgZGVsZXRlRmlsZTogZnVuY3Rpb24gKC8qKk9iamVjdCovIGVudHJ5KSB7XG4gICAgICAgICAgICAvLyBAVE9ETzogdGVzdCBkZWxldGVGaWxlXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGdldEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgX3ppcC5kZWxldGVFbnRyeShpdGVtLmVudHJ5TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBjb21tZW50IHRvIHRoZSB6aXAuIFRoZSB6aXAgbXVzdCBiZSByZXdyaXR0ZW4gYWZ0ZXIgYWRkaW5nIHRoZSBjb21tZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gY29tbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgYWRkWmlwQ29tbWVudDogZnVuY3Rpb24gKC8qKlN0cmluZyovIGNvbW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEBUT0RPOiB0ZXN0IGFkZFppcENvbW1lbnRcbiAgICAgICAgICAgIF96aXAuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHppcCBjb21tZW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gU3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBnZXRaaXBDb21tZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ppcC5jb21tZW50IHx8IFwiXCI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBjb21tZW50IHRvIGEgc3BlY2lmaWVkIHppcEVudHJ5LiBUaGUgemlwIG11c3QgYmUgcmV3cml0dGVuIGFmdGVyIGFkZGluZyB0aGUgY29tbWVudFxuICAgICAgICAgKiBUaGUgY29tbWVudCBjYW5ub3QgZXhjZWVkIDY1NTM1IGNoYXJhY3RlcnMgaW4gbGVuZ3RoXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAgICAgKiBAcGFyYW0gY29tbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgYWRkWmlwRW50cnlDb21tZW50OiBmdW5jdGlvbiAoLyoqT2JqZWN0Ki8gZW50cnksIC8qKlN0cmluZyovIGNvbW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gZ2V0RW50cnkoZW50cnkpO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpdGVtLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb21tZW50IG9mIHRoZSBzcGVjaWZpZWQgZW50cnlcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGVudHJ5XG4gICAgICAgICAqIEByZXR1cm4gU3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBnZXRaaXBFbnRyeUNvbW1lbnQ6IGZ1bmN0aW9uICgvKipPYmplY3QqLyBlbnRyeSkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmNvbW1lbnQgfHwgXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIGFuIGV4aXN0aW5nIGVudHJ5IGluc2lkZSB0aGUgYXJjaGl2ZS4gVGhlIHppcCBtdXN0IGJlIHJld3JpdHRlbiBhZnRlciB1cGRhdGluZyB0aGUgY29udGVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZW50cnlcbiAgICAgICAgICogQHBhcmFtIGNvbnRlbnRcbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZUZpbGU6IGZ1bmN0aW9uICgvKipPYmplY3QqLyBlbnRyeSwgLyoqQnVmZmVyKi8gY29udGVudCkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uc2V0RGF0YShjb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkcyBhIGZpbGUgZnJvbSB0aGUgZGlzayB0byB0aGUgYXJjaGl2ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gbG9jYWxQYXRoIEZpbGUgdG8gYWRkIHRvIHppcFxuICAgICAgICAgKiBAcGFyYW0gemlwUGF0aCBPcHRpb25hbCBwYXRoIGluc2lkZSB0aGUgemlwXG4gICAgICAgICAqIEBwYXJhbSB6aXBOYW1lIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBmaWxlXG4gICAgICAgICAqL1xuICAgICAgICBhZGRMb2NhbEZpbGU6IGZ1bmN0aW9uICgvKipTdHJpbmcqLyBsb2NhbFBhdGgsIC8qKlN0cmluZz0qLyB6aXBQYXRoLCAvKipTdHJpbmc9Ki8gemlwTmFtZSwgLyoqU3RyaW5nKi8gY29tbWVudCkge1xuICAgICAgICAgICAgaWYgKGZpbGV0b29scy5mcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAvLyBmaXggWmlwUGF0aFxuICAgICAgICAgICAgICAgIHppcFBhdGggPSB6aXBQYXRoID8gZml4UGF0aCh6aXBQYXRoKSA6IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBwIC0gbG9jYWwgZmlsZSBuYW1lXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBsb2NhbFBhdGguc3BsaXQoXCJcXFxcXCIpLmpvaW4oXCIvXCIpLnNwbGl0KFwiL1wiKS5wb3AoKTtcblxuICAgICAgICAgICAgICAgIC8vIGFkZCBmaWxlIG5hbWUgaW50byB6aXBwYXRoXG4gICAgICAgICAgICAgICAgemlwUGF0aCArPSB6aXBOYW1lID8gemlwTmFtZSA6IHA7XG5cbiAgICAgICAgICAgICAgICAvLyByZWFkIGZpbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIGNvbnN0IF9hdHRyID0gZmlsZXRvb2xzLmZzLnN0YXRTeW5jKGxvY2FsUGF0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBhZGQgZmlsZSBpbnRvIHppcCBmaWxlXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxlKHppcFBhdGgsIGZpbGV0b29scy5mcy5yZWFkRmlsZVN5bmMobG9jYWxQYXRoKSwgY29tbWVudCwgX2F0dHIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLkZJTEVfTk9UX0ZPVU5ELnJlcGxhY2UoXCIlc1wiLCBsb2NhbFBhdGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkcyBhIGxvY2FsIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBuZXN0ZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIHRoZSBhcmNoaXZlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBsb2NhbFBhdGhcbiAgICAgICAgICogQHBhcmFtIHppcFBhdGggb3B0aW9uYWwgcGF0aCBpbnNpZGUgemlwXG4gICAgICAgICAqIEBwYXJhbSBmaWx0ZXIgb3B0aW9uYWwgUmVnRXhwIG9yIEZ1bmN0aW9uIGlmIGZpbGVzIG1hdGNoIHdpbGxcbiAgICAgICAgICogICAgICAgICAgICAgICBiZSBpbmNsdWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGFkZExvY2FsRm9sZGVyOiBmdW5jdGlvbiAoLyoqU3RyaW5nKi8gbG9jYWxQYXRoLCAvKipTdHJpbmc9Ki8gemlwUGF0aCwgLyoqPVJlZ0V4cHxGdW5jdGlvbiovIGZpbHRlcikge1xuICAgICAgICAgICAgLy8gUHJlcGFyZSBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBmaWx0ZXIgaXMgUmVnRXhwIHdyYXAgaXRcbiAgICAgICAgICAgICAgICBmaWx0ZXIgPSAoZnVuY3Rpb24gKHJ4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByeC50ZXN0KGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KShmaWx0ZXIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBmaWx0ZXIgaXMgbm90IGZ1bmN0aW9uIHdlIHdpbGwgcmVwbGFjZSBpdFxuICAgICAgICAgICAgICAgIGZpbHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZml4IFppcFBhdGhcbiAgICAgICAgICAgIHppcFBhdGggPSB6aXBQYXRoID8gZml4UGF0aCh6aXBQYXRoKSA6IFwiXCI7XG5cbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcGF0aCBmaXJzdFxuICAgICAgICAgICAgbG9jYWxQYXRoID0gcHRoLm5vcm1hbGl6ZShsb2NhbFBhdGgpO1xuXG4gICAgICAgICAgICBpZiAoZmlsZXRvb2xzLmZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZmlsZXRvb2xzLmZpbmRGaWxlcyhsb2NhbFBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlcGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBwdGgucmVsYXRpdmUobG9jYWxQYXRoLCBmaWxlcGF0aCkuc3BsaXQoXCJcXFxcXCIpLmpvaW4oXCIvXCIpOyAvL3dpbmRvd3MgZml4XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyKHApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRzID0gZmlsZXRvb2xzLmZzLnN0YXRTeW5jKGZpbGVwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRGaWxlKHppcFBhdGggKyBwLCBmaWxldG9vbHMuZnMucmVhZEZpbGVTeW5jKGZpbGVwYXRoKSwgXCJcIiwgc3RhdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRmlsZSh6aXBQYXRoICsgcCArIFwiL1wiLCBCdWZmZXIuYWxsb2MoMCksIFwiXCIsIHN0YXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5GSUxFX05PVF9GT1VORC5yZXBsYWNlKFwiJXNcIiwgbG9jYWxQYXRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzeW5jaHJvbm91cyBhZGRMb2NhbEZpbGVcbiAgICAgICAgICogQHBhcmFtIGxvY2FsUGF0aFxuICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgICAgICogQHBhcmFtIHppcFBhdGggb3B0aW9uYWwgcGF0aCBpbnNpZGUgemlwXG4gICAgICAgICAqIEBwYXJhbSBmaWx0ZXIgb3B0aW9uYWwgUmVnRXhwIG9yIEZ1bmN0aW9uIGlmIGZpbGVzIG1hdGNoIHdpbGxcbiAgICAgICAgICogICAgICAgICAgICAgICBiZSBpbmNsdWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGFkZExvY2FsRm9sZGVyQXN5bmM6IGZ1bmN0aW9uICgvKlN0cmluZyovIGxvY2FsUGF0aCwgLypGdW5jdGlvbiovIGNhbGxiYWNrLCAvKlN0cmluZyovIHppcFBhdGgsIC8qUmVnRXhwfEZ1bmN0aW9uKi8gZmlsdGVyKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gKGZ1bmN0aW9uIChyeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcngudGVzdChmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSkoZmlsdGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmaXggWmlwUGF0aFxuICAgICAgICAgICAgemlwUGF0aCA9IHppcFBhdGggPyBmaXhQYXRoKHppcFBhdGgpIDogXCJcIjtcblxuICAgICAgICAgICAgLy8gbm9ybWFsaXplIHRoZSBwYXRoIGZpcnN0XG4gICAgICAgICAgICBsb2NhbFBhdGggPSBwdGgubm9ybWFsaXplKGxvY2FsUGF0aCk7XG5cbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIGZpbGV0b29scy5mcy5vcGVuKGxvY2FsUGF0aCwgXCJyXCIsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgVXRpbHMuRXJyb3JzLkZJTEVfTk9UX0ZPVU5ELnJlcGxhY2UoXCIlc1wiLCBsb2NhbFBhdGgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1zID0gZmlsZXRvb2xzLmZpbmRGaWxlcyhsb2NhbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IC0xO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZXBhdGggPSBpdGVtc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHB0aC5yZWxhdGl2ZShsb2NhbFBhdGgsIGZpbGVwYXRoKS5zcGxpdChcIlxcXFxcIikuam9pbihcIi9cIik7IC8vd2luZG93cyBmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKFwiTkZEXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW15cXHgyMC1cXHg3RV0vZywgXCJcIik7IC8vIGFjY2VudCBmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyKHApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGV0b29scy5mcy5zdGF0KGZpbGVwYXRoLCBmdW5jdGlvbiAoZXIwLCBzdGF0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyMCkgY2FsbGJhY2sodW5kZWZpbmVkLCBlcjApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLmZzLnJlYWRGaWxlKGZpbGVwYXRoLCBmdW5jdGlvbiAoZXIxLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcjEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgZXIxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRmlsZSh6aXBQYXRoICsgcCwgZGF0YSwgXCJcIiwgc3RhdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRmlsZSh6aXBQYXRoICsgcCArIFwiL1wiLCBCdWZmZXIuYWxsb2MoMCksIFwiXCIsIHN0YXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gcGF0aCB3aGVyZSBmaWxlcyB3aWxsIGJlIGV4dHJhY3RlZFxuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgLSBvcHRpb25hbCBwcm9wZXJ0aWVzXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wcy56aXBQYXRoIC0gb3B0aW9uYWwgcGF0aCBpbnNpZGUgemlwXG4gICAgICAgICAqIEBwYXJhbSB7cmVnZXhwLCBmdW5jdGlvbn0gcHJvcHMuZmlsdGVyIC0gUmVnRXhwIG9yIEZ1bmN0aW9uIGlmIGZpbGVzIG1hdGNoIHdpbGwgYmUgaW5jbHVkZWQuXG4gICAgICAgICAqL1xuICAgICAgICBhZGRMb2NhbEZvbGRlclByb21pc2U6IGZ1bmN0aW9uICgvKlN0cmluZyovIGxvY2FsUGF0aCwgLyogb2JqZWN0ICovIHByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsdGVyLCB6aXBQYXRoIH0gPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRMb2NhbEZvbGRlckFzeW5jKFxuICAgICAgICAgICAgICAgICAgICBsb2NhbFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIChkb25lLCBlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHppcFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIHlvdSB0byBjcmVhdGUgYSBlbnRyeSAoZmlsZSBvciBkaXJlY3RvcnkpIGluIHRoZSB6aXAgZmlsZS5cbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IHRoZSBlbnRyeU5hbWUgbXVzdCBlbmQgaW4gLyBhbmQgYSBudWxsIGJ1ZmZlciBzaG91bGQgYmUgcHJvdmlkZWQuXG4gICAgICAgICAqIENvbW1lbnQgYW5kIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeU5hbWVcbiAgICAgICAgICogQHBhcmFtIHtCdWZmZXIgfCBzdHJpbmd9IGNvbnRlbnQgLSBmaWxlIGNvbnRlbnQgYXMgYnVmZmVyIG9yIHV0ZjggY29kZWQgc3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50IC0gZmlsZSBjb21tZW50XG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgb2JqZWN0fSBhdHRyIC0gbnVtYmVyIGFzIHVuaXggZmlsZSBwZXJtaXNzaW9ucywgb2JqZWN0IGFzIGZpbGVzeXN0ZW0gU3RhdHMgb2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBhZGRGaWxlOiBmdW5jdGlvbiAoLyoqU3RyaW5nKi8gZW50cnlOYW1lLCAvKipCdWZmZXIqLyBjb250ZW50LCAvKipTdHJpbmcqLyBjb21tZW50LCAvKipOdW1iZXIqLyBhdHRyKSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBnZXRFbnRyeShlbnRyeU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gZW50cnkgIT0gbnVsbDtcblxuICAgICAgICAgICAgLy8gcHJlcGFyZSBuZXcgZW50cnlcbiAgICAgICAgICAgIGlmICghdXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgWmlwRW50cnkoKTtcbiAgICAgICAgICAgICAgICBlbnRyeS5lbnRyeU5hbWUgPSBlbnRyeU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS5jb21tZW50ID0gY29tbWVudCB8fCBcIlwiO1xuXG4gICAgICAgICAgICBjb25zdCBpc1N0YXQgPSBcIm9iamVjdFwiID09PSB0eXBlb2YgYXR0ciAmJiBhdHRyIGluc3RhbmNlb2YgZmlsZXRvb2xzLmZzLlN0YXRzO1xuXG4gICAgICAgICAgICAvLyBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIGZyb20gZmlsZSBzdGF0c1xuICAgICAgICAgICAgaWYgKGlzU3RhdCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LmhlYWRlci50aW1lID0gYXR0ci5tdGltZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGZpbGUgYXR0cmlidXRlXG4gICAgICAgICAgICB2YXIgZmlsZWF0dHIgPSBlbnRyeS5pc0RpcmVjdG9yeSA/IDB4MTAgOiAwOyAvLyAoTVMtRE9TIGRpcmVjdG9yeSBmbGFnKVxuXG4gICAgICAgICAgICAvLyBleHRlbmRlZCBhdHRyaWJ1dGVzIGZpZWxkIGZvciBVbml4XG4gICAgICAgICAgICBpZiAoIVV0aWxzLmlzV2luKSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0IGZpbGUgdHlwZSBlaXRoZXIgU19JRkRJUiAvIFNfSUZSRUdcbiAgICAgICAgICAgICAgICBsZXQgdW5peCA9IGVudHJ5LmlzRGlyZWN0b3J5ID8gMHg0MDAwIDogMHg4MDAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzU3RhdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGF0dHJpYnV0ZXMgZnJvbSBmaWxlIHN0YXRzXG4gICAgICAgICAgICAgICAgICAgIHVuaXggfD0gMHhmZmYgJiBhdHRyLm1vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcIm51bWJlclwiID09PSB0eXBlb2YgYXR0cikge1xuICAgICAgICAgICAgICAgICAgICAvLyBhdHRyIGZyb20gZ2l2ZW4gYXR0ciB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgdW5peCB8PSAweGZmZiAmIGF0dHI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZXM6XG4gICAgICAgICAgICAgICAgICAgIHVuaXggfD0gZW50cnkuaXNEaXJlY3RvcnkgPyAwbzc1NSA6IDBvNjQ0OyAvLyBwZXJtaXNzaW9ucyAoZHJ3eHIteHIteCkgb3IgKC1yLXdyLS1yLS0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmlsZWF0dHIgPSAoZmlsZWF0dHIgfCAodW5peCA8PCAxNikpID4+PiAwOyAvLyBhZGQgYXR0cmlidXRlc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbnRyeS5hdHRyID0gZmlsZWF0dHI7XG5cbiAgICAgICAgICAgIGVudHJ5LnNldERhdGEoY29udGVudCk7XG4gICAgICAgICAgICBpZiAoIXVwZGF0ZSkgX3ppcC5zZXRFbnRyeShlbnRyeSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgWmlwRW50cnkgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGZpbGVzIGFuZCBmb2xkZXJzIGluc2lkZSB0aGUgYXJjaGl2ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICBnZXRFbnRyaWVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ppcCA/IF96aXAuZW50cmllcyA6IFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgWmlwRW50cnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmlsZSBvciBmb2xkZXIgc3BlY2lmaWVkIGJ5IGBgbmFtZWBgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcmV0dXJuIFppcEVudHJ5XG4gICAgICAgICAqL1xuICAgICAgICBnZXRFbnRyeTogZnVuY3Rpb24gKC8qKlN0cmluZyovIG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRFbnRyeShuYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRFbnRyeUNvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ppcC5nZXRFbnRyeUNvdW50KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9yRWFjaDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ppcC5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmFjdHMgdGhlIGdpdmVuIGVudHJ5IHRvIHRoZSBnaXZlbiB0YXJnZXRQYXRoXG4gICAgICAgICAqIElmIHRoZSBlbnRyeSBpcyBhIGRpcmVjdG9yeSBpbnNpZGUgdGhlIGFyY2hpdmUsIHRoZSBlbnRpcmUgZGlyZWN0b3J5IGFuZCBpdCdzIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUgZXh0cmFjdGVkXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeSBaaXBFbnRyeSBvYmplY3Qgb3IgU3RyaW5nIHdpdGggdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZW50cnlcbiAgICAgICAgICogQHBhcmFtIHRhcmdldFBhdGggVGFyZ2V0IGZvbGRlciB3aGVyZSB0byB3cml0ZSB0aGUgZmlsZVxuICAgICAgICAgKiBAcGFyYW0gbWFpbnRhaW5FbnRyeVBhdGggSWYgbWFpbnRhaW5FbnRyeVBhdGggaXMgdHJ1ZSBhbmQgdGhlIGVudHJ5IGlzIGluc2lkZSBhIGZvbGRlciwgdGhlIGVudHJ5IGZvbGRlclxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjcmVhdGVkIGluIHRhcmdldFBhdGggYXMgd2VsbC4gRGVmYXVsdCBpcyBUUlVFXG4gICAgICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHRhcmdldCBwYXRoLCB0aGUgZmlsZSB3aWxsIGJlIG92ZXJ3cml0ZW4gaWYgdGhpcyBpcyB0cnVlLlxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgRkFMU0VcbiAgICAgICAgICogQHBhcmFtIGtlZXBPcmlnaW5hbFBlcm1pc3Npb24gVGhlIGZpbGUgd2lsbCBiZSBzZXQgYXMgdGhlIHBlcm1pc3Npb24gZnJvbSB0aGUgZW50cnkgaWYgdGhpcyBpcyB0cnVlLlxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgRkFMU0VcbiAgICAgICAgICogQHBhcmFtIG91dEZpbGVOYW1lIFN0cmluZyBJZiBzZXQgd2lsbCBvdmVycmlkZSB0aGUgZmlsZW5hbWUgb2YgdGhlIGV4dHJhY3RlZCBmaWxlIChPbmx5IHdvcmtzIGlmIHRoZSBlbnRyeSBpcyBhIGZpbGUpXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gQm9vbGVhblxuICAgICAgICAgKi9cbiAgICAgICAgZXh0cmFjdEVudHJ5VG86IGZ1bmN0aW9uIChcbiAgICAgICAgICAgIC8qKk9iamVjdCovIGVudHJ5LFxuICAgICAgICAgICAgLyoqU3RyaW5nKi8gdGFyZ2V0UGF0aCxcbiAgICAgICAgICAgIC8qKkJvb2xlYW4qLyBtYWludGFpbkVudHJ5UGF0aCxcbiAgICAgICAgICAgIC8qKkJvb2xlYW4qLyBvdmVyd3JpdGUsXG4gICAgICAgICAgICAvKipCb29sZWFuKi8ga2VlcE9yaWdpbmFsUGVybWlzc2lvbixcbiAgICAgICAgICAgIC8qKlN0cmluZyoqLyBvdXRGaWxlTmFtZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG92ZXJ3cml0ZSA9IGdldF9Cb29sKG92ZXJ3cml0ZSwgZmFsc2UpO1xuICAgICAgICAgICAga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA9IGdldF9Cb29sKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIGZhbHNlKTtcbiAgICAgICAgICAgIG1haW50YWluRW50cnlQYXRoID0gZ2V0X0Jvb2wobWFpbnRhaW5FbnRyeVBhdGgsIHRydWUpO1xuICAgICAgICAgICAgb3V0RmlsZU5hbWUgPSBnZXRfU3RyKG91dEZpbGVOYW1lLCBnZXRfU3RyKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIHVuZGVmaW5lZCkpO1xuXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGdldEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuTk9fRU5UUlkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZW50cnlOYW1lID0gY2Fub25pY2FsKGl0ZW0uZW50cnlOYW1lKTtcblxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHNhbml0aXplKHRhcmdldFBhdGgsIG91dEZpbGVOYW1lICYmICFpdGVtLmlzRGlyZWN0b3J5ID8gb3V0RmlsZU5hbWUgOiBtYWludGFpbkVudHJ5UGF0aCA/IGVudHJ5TmFtZSA6IHB0aC5iYXNlbmFtZShlbnRyeU5hbWUpKTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBfemlwLmdldEVudHJ5Q2hpbGRyZW4oaXRlbSk7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzRGlyZWN0b3J5KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gY2hpbGQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuQ0FOVF9FWFRSQUNUX0ZJTEUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gY2Fub25pY2FsKGNoaWxkLmVudHJ5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZE5hbWUgPSBzYW5pdGl6ZSh0YXJnZXRQYXRoLCBtYWludGFpbkVudHJ5UGF0aCA/IG5hbWUgOiBwdGguYmFzZW5hbWUobmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmV2ZXJzZSBvcGVyYXRpb24gZm9yIGF0dHIgZGVwZW5kIG9uIG1ldGhvZCBhZGRGaWxlKClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUF0dHIgPSBrZWVwT3JpZ2luYWxQZXJtaXNzaW9uID8gY2hpbGQuaGVhZGVyLmZpbGVBdHRyIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBmaWxldG9vbHMud3JpdGVGaWxlVG8oY2hpbGROYW1lLCBjb250ZW50LCBvdmVyd3JpdGUsIGZpbGVBdHRyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBpdGVtLmdldERhdGEoKTtcbiAgICAgICAgICAgIGlmICghY29udGVudCkgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5DQU5UX0VYVFJBQ1RfRklMRSk7XG5cbiAgICAgICAgICAgIGlmIChmaWxldG9vbHMuZnMuZXhpc3RzU3luYyh0YXJnZXQpICYmICFvdmVyd3JpdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLkNBTlRfT1ZFUlJJREUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJldmVyc2Ugb3BlcmF0aW9uIGZvciBhdHRyIGRlcGVuZCBvbiBtZXRob2QgYWRkRmlsZSgpXG4gICAgICAgICAgICBjb25zdCBmaWxlQXR0ciA9IGtlZXBPcmlnaW5hbFBlcm1pc3Npb24gPyBlbnRyeS5oZWFkZXIuZmlsZUF0dHIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmaWxldG9vbHMud3JpdGVGaWxlVG8odGFyZ2V0LCBjb250ZW50LCBvdmVyd3JpdGUsIGZpbGVBdHRyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRlc3QgdGhlIGFyY2hpdmVcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uIChwYXNzKSB7XG4gICAgICAgICAgICBpZiAoIV96aXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGVudHJ5IGluIF96aXAuZW50cmllcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBfemlwLmVudHJpZXNbZW50cnldLmdldERhdGEocGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmFjdHMgdGhlIGVudGlyZSBhcmNoaXZlIHRvIHRoZSBnaXZlbiBsb2NhdGlvblxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUYXJnZXQgbG9jYXRpb25cbiAgICAgICAgICogQHBhcmFtIG92ZXJ3cml0ZSBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgdGFyZ2V0IHBhdGgsIHRoZSBmaWxlIHdpbGwgYmUgb3ZlcndyaXRlbiBpZiB0aGlzIGlzIHRydWUuXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBGQUxTRVxuICAgICAgICAgKiBAcGFyYW0ga2VlcE9yaWdpbmFsUGVybWlzc2lvbiBUaGUgZmlsZSB3aWxsIGJlIHNldCBhcyB0aGUgcGVybWlzc2lvbiBmcm9tIHRoZSBlbnRyeSBpZiB0aGlzIGlzIHRydWUuXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBGQUxTRVxuICAgICAgICAgKi9cbiAgICAgICAgZXh0cmFjdEFsbFRvOiBmdW5jdGlvbiAoLyoqU3RyaW5nKi8gdGFyZ2V0UGF0aCwgLyoqQm9vbGVhbiovIG92ZXJ3cml0ZSwgLyoqQm9vbGVhbiovIGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIC8qU3RyaW5nLCBCdWZmZXIqLyBwYXNzKSB7XG4gICAgICAgICAgICBvdmVyd3JpdGUgPSBnZXRfQm9vbChvdmVyd3JpdGUsIGZhbHNlKTtcbiAgICAgICAgICAgIHBhc3MgPSBnZXRfU3RyKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIHBhc3MpO1xuICAgICAgICAgICAga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA9IGdldF9Cb29sKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghX3ppcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuTk9fWklQKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF96aXAuZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeU5hbWUgPSBzYW5pdGl6ZSh0YXJnZXRQYXRoLCBjYW5vbmljYWwoZW50cnkuZW50cnlOYW1lLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLm1ha2VEaXIoZW50cnlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGVudHJ5LmdldERhdGEocGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuQ0FOVF9FWFRSQUNUX0ZJTEUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgcmV2ZXJzZSBvcGVyYXRpb24gZm9yIGF0dHIgZGVwZW5kIG9uIG1ldGhvZCBhZGRGaWxlKClcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlQXR0ciA9IGtlZXBPcmlnaW5hbFBlcm1pc3Npb24gPyBlbnRyeS5oZWFkZXIuZmlsZUF0dHIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZmlsZXRvb2xzLndyaXRlRmlsZVRvKGVudHJ5TmFtZSwgY29udGVudCwgb3ZlcndyaXRlLCBmaWxlQXR0cik7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLmZzLnV0aW1lc1N5bmMoZW50cnlOYW1lLCBlbnRyeS5oZWFkZXIudGltZSwgZW50cnkuaGVhZGVyLnRpbWUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLkNBTlRfRVhUUkFDVF9GSUxFKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQXN5bmNocm9ub3VzIGV4dHJhY3RBbGxUb1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUYXJnZXQgbG9jYXRpb25cbiAgICAgICAgICogQHBhcmFtIG92ZXJ3cml0ZSBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgdGFyZ2V0IHBhdGgsIHRoZSBmaWxlIHdpbGwgYmUgb3ZlcndyaXRlbiBpZiB0aGlzIGlzIHRydWUuXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBGQUxTRVxuICAgICAgICAgKiBAcGFyYW0ga2VlcE9yaWdpbmFsUGVybWlzc2lvbiBUaGUgZmlsZSB3aWxsIGJlIHNldCBhcyB0aGUgcGVybWlzc2lvbiBmcm9tIHRoZSBlbnRyeSBpZiB0aGlzIGlzIHRydWUuXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBGQUxTRVxuICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhbGwgZW50cmllcyBhcmUgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSBvciBhbnkgZXJyb3IgaXMgdGhyb3duLlxuICAgICAgICAgKi9cbiAgICAgICAgZXh0cmFjdEFsbFRvQXN5bmM6IGZ1bmN0aW9uICgvKipTdHJpbmcqLyB0YXJnZXRQYXRoLCAvKipCb29sZWFuKi8gb3ZlcndyaXRlLCAvKipCb29sZWFuKi8ga2VlcE9yaWdpbmFsUGVybWlzc2lvbiwgLyoqRnVuY3Rpb24qLyBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdmVyd3JpdGUgPSBnZXRfQm9vbChvdmVyd3JpdGUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA9PT0gXCJmdW5jdGlvblwiICYmICFjYWxsYmFjaykgY2FsbGJhY2sgPSBrZWVwT3JpZ2luYWxQZXJtaXNzaW9uO1xuICAgICAgICAgICAga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA9IGdldF9Cb29sKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghX3ppcCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihVdGlscy5FcnJvcnMuTk9fWklQKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YXJnZXRQYXRoID0gcHRoLnJlc29sdmUodGFyZ2V0UGF0aCk7XG4gICAgICAgICAgICAvLyBjb252ZXJ0IGVudHJ5TmFtZSB0b1xuICAgICAgICAgICAgY29uc3QgZ2V0UGF0aCA9IChlbnRyeSkgPT4gc2FuaXRpemUodGFyZ2V0UGF0aCwgcHRoLm5vcm1hbGl6ZShjYW5vbmljYWwoZW50cnkuZW50cnlOYW1lLnRvU3RyaW5nKCkpKSk7XG4gICAgICAgICAgICBjb25zdCBnZXRFcnJvciA9IChtc2csIGZpbGUpID0+IG5ldyBFcnJvcihtc2cgKyAnOiBcIicgKyBmaWxlICsgJ1wiJyk7XG5cbiAgICAgICAgICAgIC8vIHNlcGFyYXRlIGRpcmVjdG9yaWVzIGZyb20gZmlsZXNcbiAgICAgICAgICAgIGNvbnN0IGRpckVudHJpZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVFbnRyaWVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgX3ppcC5lbnRyaWVzLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJFbnRyaWVzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZUVudHJpZXMuYWRkKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgZGlyZWN0b3J5IGVudHJpZXMgZmlyc3Qgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgLy8gdGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbiBhbmQgYXNzdXJlcyBmb2xkZXJzIGFyZSB0aGVyZSBiZWZvcmUgd3JpdGluZyBmaWxlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBkaXJFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyUGF0aCA9IGdldFBhdGgoZW50cnkpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXZlcnNlIG9wZXJhdGlvbiBmb3IgYXR0ciBkZXBlbmQgb24gbWV0aG9kIGFkZEZpbGUoKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRpckF0dHIgPSBrZWVwT3JpZ2luYWxQZXJtaXNzaW9uID8gZW50cnkuaGVhZGVyLmZpbGVBdHRyIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGV0b29scy5tYWtlRGlyKGRpclBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyQXR0cikgZmlsZXRvb2xzLmZzLmNobW9kU3luYyhkaXJQYXRoLCBkaXJBdHRyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gdW5peCB0aW1lc3RhbXAgd2lsbCBjaGFuZ2UgaWYgZmlsZXMgYXJlIGxhdGVyIGFkZGVkIHRvIGZvbGRlciwgYnV0IHN0aWxsXG4gICAgICAgICAgICAgICAgICAgIGZpbGV0b29scy5mcy51dGltZXNTeW5jKGRpclBhdGgsIGVudHJ5LmhlYWRlci50aW1lLCBlbnRyeS5oZWFkZXIudGltZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZ2V0RXJyb3IoXCJVbmFibGUgdG8gY3JlYXRlIGZvbGRlclwiLCBkaXJQYXRoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxsYmFjayB3cmFwcGVyLCBmb3Igc29tZSBob3VzZSBrZWVwaW5nXG4gICAgICAgICAgICBjb25zdCBkb25lID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlRW50cmllcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gRXh0cmFjdCBmaWxlIGVudHJpZXMgYXN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmlsZUVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeU5hbWUgPSBwdGgubm9ybWFsaXplKGNhbm9uaWNhbChlbnRyeS5lbnRyeU5hbWUudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FuaXRpemUodGFyZ2V0UGF0aCwgZW50cnlOYW1lKTtcbiAgICAgICAgICAgICAgICBlbnRyeS5nZXREYXRhQXN5bmMoZnVuY3Rpb24gKGNvbnRlbnQsIGVycl8xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVycl8xKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLkNBTlRfRVhUUkFDVF9GSUxFKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmV2ZXJzZSBvcGVyYXRpb24gZm9yIGF0dHIgZGVwZW5kIG9uIG1ldGhvZCBhZGRGaWxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVBdHRyID0ga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA/IGVudHJ5LmhlYWRlci5maWxlQXR0ciA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGV0b29scy53cml0ZUZpbGVUb0FzeW5jKGZpbGVQYXRoLCBjb250ZW50LCBvdmVyd3JpdGUsIGZpbGVBdHRyLCBmdW5jdGlvbiAoc3VjYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3VjYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhnZXRFcnJvcihcIlVuYWJsZSB0byB3cml0ZSBmaWxlXCIsIGZpbGVQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLmZzLnV0aW1lcyhmaWxlUGF0aCwgZW50cnkuaGVhZGVyLnRpbWUsIGVudHJ5LmhlYWRlci50aW1lLCBmdW5jdGlvbiAoZXJyXzIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycl8yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhnZXRFcnJvcihcIlVuYWJsZSB0byBzZXQgdGltZXNcIiwgZmlsZVBhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlRW50cmllcy5kZWxldGUoZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBjYWxsYmFjayBpZiBpdCB3YXMgbGFzdCBlbnRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2FsbCB0aGUgY2FsbGJhY2sgaWYgZmlsZUVudHJpZXMgd2FzIGVtcHR5XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdyaXRlcyB0aGUgbmV3bHkgY3JlYXRlZCB6aXAgZmlsZSB0byBkaXNrIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gb3IgaWYgYSB6aXAgd2FzIG9wZW5lZCBhbmQgbm8gYGB0YXJnZXRGaWxlTmFtZWBgIGlzIHByb3ZpZGVkLCBpdCB3aWxsIG92ZXJ3cml0ZSB0aGUgb3BlbmVkIHppcFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0RmlsZU5hbWVcbiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAgICAgICAqL1xuICAgICAgICB3cml0ZVppcDogZnVuY3Rpb24gKC8qKlN0cmluZyovIHRhcmdldEZpbGVOYW1lLCAvKipGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0RmlsZU5hbWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHRhcmdldEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRGaWxlTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRhcmdldEZpbGVOYW1lICYmIG9wdHMuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRGaWxlTmFtZSA9IG9wdHMuZmlsZW5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRhcmdldEZpbGVOYW1lKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciB6aXBEYXRhID0gX3ppcC5jb21wcmVzc1RvQnVmZmVyKCk7XG4gICAgICAgICAgICBpZiAoemlwRGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBvayA9IGZpbGV0b29scy53cml0ZUZpbGVUbyh0YXJnZXRGaWxlTmFtZSwgemlwRGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSBjYWxsYmFjayghb2sgPyBuZXcgRXJyb3IoXCJmYWlsZWRcIikgOiBudWxsLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB3cml0ZVppcFByb21pc2U6IGZ1bmN0aW9uICgvKipTdHJpbmcqLyB0YXJnZXRGaWxlTmFtZSwgLyogb2JqZWN0ICovIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCB7IG92ZXJ3cml0ZSwgcGVybSB9ID0gT2JqZWN0LmFzc2lnbih7IG92ZXJ3cml0ZTogdHJ1ZSB9LCBwcm9wcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZmluZCBmaWxlIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldEZpbGVOYW1lICYmIG9wdHMuZmlsZW5hbWUpIHRhcmdldEZpbGVOYW1lID0gb3B0cy5maWxlbmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldEZpbGVOYW1lKSByZWplY3QoXCJBRE0tWklQOiBaSVAgRmlsZSBOYW1lIE1pc3NpbmdcIik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvQnVmZmVyUHJvbWlzZSgpLnRoZW4oKHppcERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gKGRvbmUpID0+IChkb25lID8gcmVzb2x2ZShkb25lKSA6IHJlamVjdChcIkFETS1aSVA6IFdhc24ndCBhYmxlIHRvIHdyaXRlIHppcCBmaWxlXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLndyaXRlRmlsZVRvQXN5bmModGFyZ2V0RmlsZU5hbWUsIHppcERhdGEsIG92ZXJ3cml0ZSwgcGVybSwgcmV0KTtcbiAgICAgICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9CdWZmZXJQcm9taXNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIF96aXAudG9Bc3luY0J1ZmZlcihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIGVudGlyZSB6aXAgZmlsZSBhcyBhIEJ1ZmZlciBvYmplY3RcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiBCdWZmZXJcbiAgICAgICAgICovXG4gICAgICAgIHRvQnVmZmVyOiBmdW5jdGlvbiAoLyoqRnVuY3Rpb249Ki8gb25TdWNjZXNzLCAvKipGdW5jdGlvbj0qLyBvbkZhaWwsIC8qKkZ1bmN0aW9uPSovIG9uSXRlbVN0YXJ0LCAvKipGdW5jdGlvbj0qLyBvbkl0ZW1FbmQpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVPZiA9IDI7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uU3VjY2VzcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgX3ppcC50b0FzeW5jQnVmZmVyKG9uU3VjY2Vzcywgb25GYWlsLCBvbkl0ZW1TdGFydCwgb25JdGVtRW5kKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfemlwLmNvbXByZXNzVG9CdWZmZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgaXNBcnJheSA9IGZ1bmN0aW9uIGlzQXJyYXkoYXJyKSB7XG5cdGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBBcnJheS5pc0FycmF5KGFycik7XG5cdH1cblxuXHRyZXR1cm4gdG9TdHIuY2FsbChhcnIpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxudmFyIGlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuXHRpZiAoIW9iaiB8fCB0b1N0ci5jYWxsKG9iaikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dmFyIGhhc093bkNvbnN0cnVjdG9yID0gaGFzT3duLmNhbGwob2JqLCAnY29uc3RydWN0b3InKTtcblx0dmFyIGhhc0lzUHJvdG90eXBlT2YgPSBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSAmJiBoYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAnaXNQcm90b3R5cGVPZicpO1xuXHQvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0XG5cdGlmIChvYmouY29uc3RydWN0b3IgJiYgIWhhc093bkNvbnN0cnVjdG9yICYmICFoYXNJc1Byb3RvdHlwZU9mKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsXG5cdC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLlxuXHR2YXIga2V5O1xuXHRmb3IgKGtleSBpbiBvYmopIHsgLyoqLyB9XG5cblx0cmV0dXJuIHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnIHx8IGhhc093bi5jYWxsKG9iaiwga2V5KTtcbn07XG5cbi8vIElmIG5hbWUgaXMgJ19fcHJvdG9fXycsIGFuZCBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgYXZhaWxhYmxlLCBkZWZpbmUgX19wcm90b19fIGFzIGFuIG93biBwcm9wZXJ0eSBvbiB0YXJnZXRcbnZhciBzZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIHNldFByb3BlcnR5KHRhcmdldCwgb3B0aW9ucykge1xuXHRpZiAoZGVmaW5lUHJvcGVydHkgJiYgb3B0aW9ucy5uYW1lID09PSAnX19wcm90b19fJykge1xuXHRcdGRlZmluZVByb3BlcnR5KHRhcmdldCwgb3B0aW9ucy5uYW1lLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IG9wdGlvbnMubmV3VmFsdWUsXG5cdFx0XHR3cml0YWJsZTogdHJ1ZVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldFtvcHRpb25zLm5hbWVdID0gb3B0aW9ucy5uZXdWYWx1ZTtcblx0fVxufTtcblxuLy8gUmV0dXJuIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIF9fcHJvdG9fXyBpZiAnX19wcm90b19fJyBpcyBub3QgYW4gb3duIHByb3BlcnR5XG52YXIgZ2V0UHJvcGVydHkgPSBmdW5jdGlvbiBnZXRQcm9wZXJ0eShvYmosIG5hbWUpIHtcblx0aWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSB7XG5cdFx0aWYgKCFoYXNPd24uY2FsbChvYmosIG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gdm9pZCAwO1xuXHRcdH0gZWxzZSBpZiAoZ09QRCkge1xuXHRcdFx0Ly8gSW4gZWFybHkgdmVyc2lvbnMgb2Ygbm9kZSwgb2JqWydfX3Byb3RvX18nXSBpcyBidWdneSB3aGVuIG9iaiBoYXNcblx0XHRcdC8vIF9fcHJvdG9fXyBhcyBhbiBvd24gcHJvcGVydHkuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKSB3b3Jrcy5cblx0XHRcdHJldHVybiBnT1BEKG9iaiwgbmFtZSkudmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9ialtuYW1lXTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0ZW5kKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmU7XG5cdHZhciB0YXJnZXQgPSBhcmd1bWVudHNbMF07XG5cdHZhciBpID0gMTtcblx0dmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdHZhciBkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0ZGVlcCA9IHRhcmdldDtcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307XG5cdFx0Ly8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdGkgPSAyO1xuXHR9XG5cdGlmICh0YXJnZXQgPT0gbnVsbCB8fCAodHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRvcHRpb25zID0gYXJndW1lbnRzW2ldO1xuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAob3B0aW9ucyAhPSBudWxsKSB7XG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKG5hbWUgaW4gb3B0aW9ucykge1xuXHRcdFx0XHRzcmMgPSBnZXRQcm9wZXJ0eSh0YXJnZXQsIG5hbWUpO1xuXHRcdFx0XHRjb3B5ID0gZ2V0UHJvcGVydHkob3B0aW9ucywgbmFtZSk7XG5cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAodGFyZ2V0ICE9PSBjb3B5KSB7XG5cdFx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdFx0aWYgKGRlZXAgJiYgY29weSAmJiAoaXNQbGFpbk9iamVjdChjb3B5KSB8fCAoY29weUlzQXJyYXkgPSBpc0FycmF5KGNvcHkpKSkpIHtcblx0XHRcdFx0XHRcdGlmIChjb3B5SXNBcnJheSkge1xuXHRcdFx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBpc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cblx0XHRcdFx0XHRcdHNldFByb3BlcnR5KHRhcmdldCwgeyBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KSB9KTtcblxuXHRcdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb3B5ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0c2V0UHJvcGVydHkodGFyZ2V0LCB7IG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBjb3B5IH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuIiwgIi8qZXNsaW50IG5vLXZhcjowLCBwcmVmZXItYXJyb3ctY2FsbGJhY2s6IDAsIG9iamVjdC1zaG9ydGhhbmQ6IDAgKi9cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgUHVueWNvZGUgPSByZXF1aXJlKCdwdW55Y29kZScpO1xuXG5cbnZhciBpbnRlcm5hbHMgPSB7fTtcblxuXG4vL1xuLy8gUmVhZCBydWxlcyBmcm9tIGZpbGUuXG4vL1xuaW50ZXJuYWxzLnJ1bGVzID0gcmVxdWlyZSgnLi9kYXRhL3J1bGVzLmpzb24nKS5tYXAoZnVuY3Rpb24gKHJ1bGUpIHtcblxuICByZXR1cm4ge1xuICAgIHJ1bGU6IHJ1bGUsXG4gICAgc3VmZml4OiBydWxlLnJlcGxhY2UoL14oXFwqXFwufFxcISkvLCAnJyksXG4gICAgcHVueVN1ZmZpeDogLTEsXG4gICAgd2lsZGNhcmQ6IHJ1bGUuY2hhckF0KDApID09PSAnKicsXG4gICAgZXhjZXB0aW9uOiBydWxlLmNoYXJBdCgwKSA9PT0gJyEnXG4gIH07XG59KTtcblxuXG4vL1xuLy8gQ2hlY2sgaXMgZ2l2ZW4gc3RyaW5nIGVuZHMgd2l0aCBgc3VmZml4YC5cbi8vXG5pbnRlcm5hbHMuZW5kc1dpdGggPSBmdW5jdGlvbiAoc3RyLCBzdWZmaXgpIHtcblxuICByZXR1cm4gc3RyLmluZGV4T2Yoc3VmZml4LCBzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xO1xufTtcblxuXG4vL1xuLy8gRmluZCBydWxlIGZvciBhIGdpdmVuIGRvbWFpbi5cbi8vXG5pbnRlcm5hbHMuZmluZFJ1bGUgPSBmdW5jdGlvbiAoZG9tYWluKSB7XG5cbiAgdmFyIHB1bnlEb21haW4gPSBQdW55Y29kZS50b0FTQ0lJKGRvbWFpbik7XG4gIHJldHVybiBpbnRlcm5hbHMucnVsZXMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBydWxlKSB7XG5cbiAgICBpZiAocnVsZS5wdW55U3VmZml4ID09PSAtMSl7XG4gICAgICBydWxlLnB1bnlTdWZmaXggPSBQdW55Y29kZS50b0FTQ0lJKHJ1bGUuc3VmZml4KTtcbiAgICB9XG4gICAgaWYgKCFpbnRlcm5hbHMuZW5kc1dpdGgocHVueURvbWFpbiwgJy4nICsgcnVsZS5wdW55U3VmZml4KSAmJiBwdW55RG9tYWluICE9PSBydWxlLnB1bnlTdWZmaXgpIHtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH1cbiAgICAvLyBUaGlzIGhhcyBiZWVuIGNvbW1lbnRlZCBvdXQgYXMgaXQgbmV2ZXIgc2VlbXMgdG8gcnVuLiBUaGlzIGlzIGJlY2F1c2VcbiAgICAvLyBzdWIgdGxkcyBhbHdheXMgYXBwZWFyIGFmdGVyIHRoZWlyIHBhcmVudHMgYW5kIHdlIG5ldmVyIGZpbmQgYSBzaG9ydGVyXG4gICAgLy8gbWF0Y2guXG4gICAgLy9pZiAobWVtbykge1xuICAgIC8vICB2YXIgbWVtb1N1ZmZpeCA9IFB1bnljb2RlLnRvQVNDSUkobWVtby5zdWZmaXgpO1xuICAgIC8vICBpZiAobWVtb1N1ZmZpeC5sZW5ndGggPj0gcHVueVN1ZmZpeC5sZW5ndGgpIHtcbiAgICAvLyAgICByZXR1cm4gbWVtbztcbiAgICAvLyAgfVxuICAgIC8vfVxuICAgIHJldHVybiBydWxlO1xuICB9LCBudWxsKTtcbn07XG5cblxuLy9cbi8vIEVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcy5cbi8vXG5leHBvcnRzLmVycm9yQ29kZXMgPSB7XG4gIERPTUFJTl9UT09fU0hPUlQ6ICdEb21haW4gbmFtZSB0b28gc2hvcnQuJyxcbiAgRE9NQUlOX1RPT19MT05HOiAnRG9tYWluIG5hbWUgdG9vIGxvbmcuIEl0IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gMjU1IGNoYXJzLicsXG4gIExBQkVMX1NUQVJUU19XSVRIX0RBU0g6ICdEb21haW4gbmFtZSBsYWJlbCBjYW4gbm90IHN0YXJ0IHdpdGggYSBkYXNoLicsXG4gIExBQkVMX0VORFNfV0lUSF9EQVNIOiAnRG9tYWluIG5hbWUgbGFiZWwgY2FuIG5vdCBlbmQgd2l0aCBhIGRhc2guJyxcbiAgTEFCRUxfVE9PX0xPTkc6ICdEb21haW4gbmFtZSBsYWJlbCBzaG91bGQgYmUgYXQgbW9zdCA2MyBjaGFycyBsb25nLicsXG4gIExBQkVMX1RPT19TSE9SVDogJ0RvbWFpbiBuYW1lIGxhYmVsIHNob3VsZCBiZSBhdCBsZWFzdCAxIGNoYXJhY3RlciBsb25nLicsXG4gIExBQkVMX0lOVkFMSURfQ0hBUlM6ICdEb21haW4gbmFtZSBsYWJlbCBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIGRhc2hlcy4nXG59O1xuXG5cbi8vXG4vLyBWYWxpZGF0ZSBkb21haW4gbmFtZSBhbmQgdGhyb3cgaWYgbm90IHZhbGlkLlxuLy9cbi8vIEZyb20gd2lraXBlZGlhOlxuLy9cbi8vIEhvc3RuYW1lcyBhcmUgY29tcG9zZWQgb2Ygc2VyaWVzIG9mIGxhYmVscyBjb25jYXRlbmF0ZWQgd2l0aCBkb3RzLCBhcyBhcmUgYWxsXG4vLyBkb21haW4gbmFtZXMuIEVhY2ggbGFiZWwgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDYzIGNoYXJhY3RlcnMgbG9uZywgYW5kIHRoZVxuLy8gZW50aXJlIGhvc3RuYW1lIChpbmNsdWRpbmcgdGhlIGRlbGltaXRpbmcgZG90cykgaGFzIGEgbWF4aW11bSBvZiAyNTUgY2hhcnMuXG4vL1xuLy8gQWxsb3dlZCBjaGFyczpcbi8vXG4vLyAqIGBhLXpgXG4vLyAqIGAwLTlgXG4vLyAqIGAtYCBidXQgbm90IGFzIGEgc3RhcnRpbmcgb3IgZW5kaW5nIGNoYXJhY3RlclxuLy8gKiBgLmAgYXMgYSBzZXBhcmF0b3IgZm9yIHRoZSB0ZXh0dWFsIHBvcnRpb25zIG9mIGEgZG9tYWluIG5hbWVcbi8vXG4vLyAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRG9tYWluX25hbWVcbi8vICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ib3N0bmFtZVxuLy9cbmludGVybmFscy52YWxpZGF0ZSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuXG4gIC8vIEJlZm9yZSB3ZSBjYW4gdmFsaWRhdGUgd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgSUROcyB3aXRoIHVuaWNvZGUgY2hhcnMuXG4gIHZhciBhc2NpaSA9IFB1bnljb2RlLnRvQVNDSUkoaW5wdXQpO1xuXG4gIGlmIChhc2NpaS5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuICdET01BSU5fVE9PX1NIT1JUJztcbiAgfVxuICBpZiAoYXNjaWkubGVuZ3RoID4gMjU1KSB7XG4gICAgcmV0dXJuICdET01BSU5fVE9PX0xPTkcnO1xuICB9XG5cbiAgLy8gQ2hlY2sgZWFjaCBwYXJ0J3MgbGVuZ3RoIGFuZCBhbGxvd2VkIGNoYXJzLlxuICB2YXIgbGFiZWxzID0gYXNjaWkuc3BsaXQoJy4nKTtcbiAgdmFyIGxhYmVsO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgaWYgKCFsYWJlbC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnTEFCRUxfVE9PX1NIT1JUJztcbiAgICB9XG4gICAgaWYgKGxhYmVsLmxlbmd0aCA+IDYzKSB7XG4gICAgICByZXR1cm4gJ0xBQkVMX1RPT19MT05HJztcbiAgICB9XG4gICAgaWYgKGxhYmVsLmNoYXJBdCgwKSA9PT0gJy0nKSB7XG4gICAgICByZXR1cm4gJ0xBQkVMX1NUQVJUU19XSVRIX0RBU0gnO1xuICAgIH1cbiAgICBpZiAobGFiZWwuY2hhckF0KGxhYmVsLmxlbmd0aCAtIDEpID09PSAnLScpIHtcbiAgICAgIHJldHVybiAnTEFCRUxfRU5EU19XSVRIX0RBU0gnO1xuICAgIH1cbiAgICBpZiAoIS9eW2EtejAtOVxcLV0rJC8udGVzdChsYWJlbCkpIHtcbiAgICAgIHJldHVybiAnTEFCRUxfSU5WQUxJRF9DSEFSUyc7XG4gICAgfVxuICB9XG59O1xuXG5cbi8vXG4vLyBQdWJsaWMgQVBJXG4vL1xuXG5cbi8vXG4vLyBQYXJzZSBkb21haW4uXG4vL1xuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuXG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRG9tYWluIG5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgfVxuXG4gIC8vIEZvcmNlIGRvbWFpbiB0byBsb3dlcmNhc2UuXG4gIHZhciBkb21haW4gPSBpbnB1dC5zbGljZSgwKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIEhhbmRsZSBGUUROLlxuICAvLyBUT0RPOiBTaW1wbHkgcmVtb3ZlIHRyYWlsaW5nIGRvdD9cbiAgaWYgKGRvbWFpbi5jaGFyQXQoZG9tYWluLmxlbmd0aCAtIDEpID09PSAnLicpIHtcbiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoMCwgZG9tYWluLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXNlIGlucHV0LlxuICB2YXIgZXJyb3IgPSBpbnRlcm5hbHMudmFsaWRhdGUoZG9tYWluKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG1lc3NhZ2U6IGV4cG9ydHMuZXJyb3JDb2Rlc1tlcnJvcl0sXG4gICAgICAgIGNvZGU6IGVycm9yXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHZhciBwYXJzZWQgPSB7XG4gICAgaW5wdXQ6IGlucHV0LFxuICAgIHRsZDogbnVsbCxcbiAgICBzbGQ6IG51bGwsXG4gICAgZG9tYWluOiBudWxsLFxuICAgIHN1YmRvbWFpbjogbnVsbCxcbiAgICBsaXN0ZWQ6IGZhbHNlXG4gIH07XG5cbiAgdmFyIGRvbWFpblBhcnRzID0gZG9tYWluLnNwbGl0KCcuJyk7XG5cbiAgLy8gTm9uLUludGVybmV0IFRMRFxuICBpZiAoZG9tYWluUGFydHNbZG9tYWluUGFydHMubGVuZ3RoIC0gMV0gPT09ICdsb2NhbCcpIHtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgdmFyIGhhbmRsZVB1bnljb2RlID0gZnVuY3Rpb24gKCkge1xuXG4gICAgaWYgKCEveG4tLS8udGVzdChkb21haW4pKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLmRvbWFpbikge1xuICAgICAgcGFyc2VkLmRvbWFpbiA9IFB1bnljb2RlLnRvQVNDSUkocGFyc2VkLmRvbWFpbik7XG4gICAgfVxuICAgIGlmIChwYXJzZWQuc3ViZG9tYWluKSB7XG4gICAgICBwYXJzZWQuc3ViZG9tYWluID0gUHVueWNvZGUudG9BU0NJSShwYXJzZWQuc3ViZG9tYWluKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfTtcblxuICB2YXIgcnVsZSA9IGludGVybmFscy5maW5kUnVsZShkb21haW4pO1xuXG4gIC8vIFVubGlzdGVkIHRsZC5cbiAgaWYgKCFydWxlKSB7XG4gICAgaWYgKGRvbWFpblBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICAgIHBhcnNlZC50bGQgPSBkb21haW5QYXJ0cy5wb3AoKTtcbiAgICBwYXJzZWQuc2xkID0gZG9tYWluUGFydHMucG9wKCk7XG4gICAgcGFyc2VkLmRvbWFpbiA9IFtwYXJzZWQuc2xkLCBwYXJzZWQudGxkXS5qb2luKCcuJyk7XG4gICAgaWYgKGRvbWFpblBhcnRzLmxlbmd0aCkge1xuICAgICAgcGFyc2VkLnN1YmRvbWFpbiA9IGRvbWFpblBhcnRzLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlUHVueWNvZGUoKTtcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgcHVibGljIHN1ZmZpeCBpcyBsaXN0ZWQuXG4gIHBhcnNlZC5saXN0ZWQgPSB0cnVlO1xuXG4gIHZhciB0bGRQYXJ0cyA9IHJ1bGUuc3VmZml4LnNwbGl0KCcuJyk7XG4gIHZhciBwcml2YXRlUGFydHMgPSBkb21haW5QYXJ0cy5zbGljZSgwLCBkb21haW5QYXJ0cy5sZW5ndGggLSB0bGRQYXJ0cy5sZW5ndGgpO1xuXG4gIGlmIChydWxlLmV4Y2VwdGlvbikge1xuICAgIHByaXZhdGVQYXJ0cy5wdXNoKHRsZFBhcnRzLnNoaWZ0KCkpO1xuICB9XG5cbiAgcGFyc2VkLnRsZCA9IHRsZFBhcnRzLmpvaW4oJy4nKTtcblxuICBpZiAoIXByaXZhdGVQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaGFuZGxlUHVueWNvZGUoKTtcbiAgfVxuXG4gIGlmIChydWxlLndpbGRjYXJkKSB7XG4gICAgdGxkUGFydHMudW5zaGlmdChwcml2YXRlUGFydHMucG9wKCkpO1xuICAgIHBhcnNlZC50bGQgPSB0bGRQYXJ0cy5qb2luKCcuJyk7XG4gIH1cblxuICBpZiAoIXByaXZhdGVQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaGFuZGxlUHVueWNvZGUoKTtcbiAgfVxuXG4gIHBhcnNlZC5zbGQgPSBwcml2YXRlUGFydHMucG9wKCk7XG4gIHBhcnNlZC5kb21haW4gPSBbcGFyc2VkLnNsZCwgIHBhcnNlZC50bGRdLmpvaW4oJy4nKTtcblxuICBpZiAocHJpdmF0ZVBhcnRzLmxlbmd0aCkge1xuICAgIHBhcnNlZC5zdWJkb21haW4gPSBwcml2YXRlUGFydHMuam9pbignLicpO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZVB1bnljb2RlKCk7XG59O1xuXG5cbi8vXG4vLyBHZXQgZG9tYWluLlxuLy9cbmV4cG9ydHMuZ2V0ID0gZnVuY3Rpb24gKGRvbWFpbikge1xuXG4gIGlmICghZG9tYWluKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHMucGFyc2UoZG9tYWluKS5kb21haW4gfHwgbnVsbDtcbn07XG5cblxuLy9cbi8vIENoZWNrIHdoZXRoZXIgZG9tYWluIGJlbG9uZ3MgdG8gYSBrbm93biBwdWJsaWMgc3VmZml4LlxuLy9cbmV4cG9ydHMuaXNWYWxpZCA9IGZ1bmN0aW9uIChkb21haW4pIHtcblxuICB2YXIgcGFyc2VkID0gZXhwb3J0cy5wYXJzZShkb21haW4pO1xuICByZXR1cm4gQm9vbGVhbihwYXJzZWQuZG9tYWluICYmIHBhcnNlZC5saXN0ZWQpO1xufTtcbiIsICIvKiFcbiAqIENvcHlyaWdodCAoYykgMjAxOCwgU2FsZXNmb3JjZS5jb20sIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU2FsZXNmb3JjZS5jb20gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heVxuICogYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cbid1c2Ugc3RyaWN0JztcbnZhciBwc2wgPSByZXF1aXJlKCdwc2wnKTtcblxuZnVuY3Rpb24gZ2V0UHVibGljU3VmZml4KGRvbWFpbikge1xuICByZXR1cm4gcHNsLmdldChkb21haW4pO1xufVxuXG5leHBvcnRzLmdldFB1YmxpY1N1ZmZpeCA9IGdldFB1YmxpY1N1ZmZpeDtcbiIsICIvKiFcbiAqIENvcHlyaWdodCAoYykgMjAxNSwgU2FsZXNmb3JjZS5jb20sIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU2FsZXNmb3JjZS5jb20gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heVxuICogYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cbid1c2Ugc3RyaWN0Jztcbi8qanNoaW50IHVudXNlZDpmYWxzZSAqL1xuXG5mdW5jdGlvbiBTdG9yZSgpIHtcbn1cbmV4cG9ydHMuU3RvcmUgPSBTdG9yZTtcblxuLy8gU3RvcmVzIG1heSBiZSBzeW5jaHJvbm91cywgYnV0IGFyZSBzdGlsbCByZXF1aXJlZCB0byB1c2UgYVxuLy8gQ29udGludWF0aW9uLVBhc3NpbmcgU3R5bGUgQVBJLiAgVGhlIENvb2tpZUphciBpdHNlbGYgd2lsbCBleHBvc2UgYSBcIipTeW5jXCJcbi8vIEFQSSB0aGF0IGNvbnZlcnRzIGZyb20gc3luY2hyb25vdXMtY2FsbGJhY2tzIHRvIGltcGVyYXRpdmUgc3R5bGUuXG5TdG9yZS5wcm90b3R5cGUuc3luY2hyb25vdXMgPSBmYWxzZTtcblxuU3RvcmUucHJvdG90eXBlLmZpbmRDb29raWUgPSBmdW5jdGlvbihkb21haW4sIHBhdGgsIGtleSwgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdmaW5kQ29va2llIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLmZpbmRDb29raWVzID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbmRDb29raWVzIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLnB1dENvb2tpZSA9IGZ1bmN0aW9uKGNvb2tpZSwgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdwdXRDb29raWUgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUudXBkYXRlQ29va2llID0gZnVuY3Rpb24ob2xkQ29va2llLCBuZXdDb29raWUsIGNiKSB7XG4gIC8vIHJlY29tbWVuZGVkIGRlZmF1bHQgaW1wbGVtZW50YXRpb246XG4gIC8vIHJldHVybiB0aGlzLnB1dENvb2tpZShuZXdDb29raWUsIGNiKTtcbiAgdGhyb3cgbmV3IEVycm9yKCd1cGRhdGVDb29raWUgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUucmVtb3ZlQ29va2llID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBrZXksIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcigncmVtb3ZlQ29va2llIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLnJlbW92ZUNvb2tpZXMgPSBmdW5jdGlvbihkb21haW4sIHBhdGgsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcigncmVtb3ZlQ29va2llcyBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5yZW1vdmVBbGxDb29raWVzID0gZnVuY3Rpb24oY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdyZW1vdmVBbGxDb29raWVzIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufVxuXG5TdG9yZS5wcm90b3R5cGUuZ2V0QWxsQ29va2llcyA9IGZ1bmN0aW9uKGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignZ2V0QWxsQ29va2llcyBpcyBub3QgaW1wbGVtZW50ZWQgKHRoZXJlZm9yZSBqYXIgY2Fubm90IGJlIHNlcmlhbGl6ZWQpJyk7XG59O1xuIiwgIi8qIVxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBTYWxlc2ZvcmNlLmNvbSwgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTYWxlc2ZvcmNlLmNvbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5XG4gKiBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XG4gKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcHVic3VmZml4ID0gcmVxdWlyZSgnLi9wdWJzdWZmaXgtcHNsJyk7XG5cbi8vIEdpdmVzIHRoZSBwZXJtdXRhdGlvbiBvZiBhbGwgcG9zc2libGUgZG9tYWluTWF0Y2goKWVzIG9mIGEgZ2l2ZW4gZG9tYWluLiBUaGVcbi8vIGFycmF5IGlzIGluIHNob3J0ZXN0LXRvLWxvbmdlc3Qgb3JkZXIuICBIYW5keSBmb3IgaW5kZXhpbmcuXG5mdW5jdGlvbiBwZXJtdXRlRG9tYWluIChkb21haW4pIHtcbiAgdmFyIHB1YlN1ZiA9IHB1YnN1ZmZpeC5nZXRQdWJsaWNTdWZmaXgoZG9tYWluKTtcbiAgaWYgKCFwdWJTdWYpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAocHViU3VmID09IGRvbWFpbikge1xuICAgIHJldHVybiBbZG9tYWluXTtcbiAgfVxuXG4gIHZhciBwcmVmaXggPSBkb21haW4uc2xpY2UoMCwgLShwdWJTdWYubGVuZ3RoICsgMSkpOyAvLyBcIi5leGFtcGxlLmNvbVwiXG4gIHZhciBwYXJ0cyA9IHByZWZpeC5zcGxpdCgnLicpLnJldmVyc2UoKTtcbiAgdmFyIGN1ciA9IHB1YlN1ZjtcbiAgdmFyIHBlcm11dGF0aW9ucyA9IFtjdXJdO1xuICB3aGlsZSAocGFydHMubGVuZ3RoKSB7XG4gICAgY3VyID0gcGFydHMuc2hpZnQoKSArICcuJyArIGN1cjtcbiAgICBwZXJtdXRhdGlvbnMucHVzaChjdXIpO1xuICB9XG4gIHJldHVybiBwZXJtdXRhdGlvbnM7XG59XG5cbmV4cG9ydHMucGVybXV0ZURvbWFpbiA9IHBlcm11dGVEb21haW47XG4iLCAiLyohXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNhbGVzZm9yY2UuY29tLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNhbGVzZm9yY2UuY29tIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXlcbiAqIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBcIkEgcmVxdWVzdC1wYXRoIHBhdGgtbWF0Y2hlcyBhIGdpdmVuIGNvb2tpZS1wYXRoIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVcbiAqIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGRzOlwiXG4gKi9cbmZ1bmN0aW9uIHBhdGhNYXRjaCAocmVxUGF0aCwgY29va2llUGF0aCkge1xuICAvLyBcIm8gIFRoZSBjb29raWUtcGF0aCBhbmQgdGhlIHJlcXVlc3QtcGF0aCBhcmUgaWRlbnRpY2FsLlwiXG4gIGlmIChjb29raWVQYXRoID09PSByZXFQYXRoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgaWR4ID0gcmVxUGF0aC5pbmRleE9mKGNvb2tpZVBhdGgpO1xuICBpZiAoaWR4ID09PSAwKSB7XG4gICAgLy8gXCJvICBUaGUgY29va2llLXBhdGggaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QtcGF0aCwgYW5kIHRoZSBsYXN0XG4gICAgLy8gY2hhcmFjdGVyIG9mIHRoZSBjb29raWUtcGF0aCBpcyAleDJGIChcIi9cIikuXCJcbiAgICBpZiAoY29va2llUGF0aC5zdWJzdHIoLTEpID09PSBcIi9cIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gXCIgbyAgVGhlIGNvb2tpZS1wYXRoIGlzIGEgcHJlZml4IG9mIHRoZSByZXF1ZXN0LXBhdGgsIGFuZCB0aGUgZmlyc3RcbiAgICAvLyBjaGFyYWN0ZXIgb2YgdGhlIHJlcXVlc3QtcGF0aCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY29va2llLSBwYXRoXG4gICAgLy8gaXMgYSAleDJGIChcIi9cIikgY2hhcmFjdGVyLlwiXG4gICAgaWYgKHJlcVBhdGguc3Vic3RyKGNvb2tpZVBhdGgubGVuZ3RoLCAxKSA9PT0gXCIvXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0cy5wYXRoTWF0Y2ggPSBwYXRoTWF0Y2g7XG4iLCAiLyohXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNhbGVzZm9yY2UuY29tLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNhbGVzZm9yY2UuY29tIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXlcbiAqIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG4ndXNlIHN0cmljdCc7XG52YXIgU3RvcmUgPSByZXF1aXJlKCcuL3N0b3JlJykuU3RvcmU7XG52YXIgcGVybXV0ZURvbWFpbiA9IHJlcXVpcmUoJy4vcGVybXV0ZURvbWFpbicpLnBlcm11dGVEb21haW47XG52YXIgcGF0aE1hdGNoID0gcmVxdWlyZSgnLi9wYXRoTWF0Y2gnKS5wYXRoTWF0Y2g7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gTWVtb3J5Q29va2llU3RvcmUoKSB7XG4gIFN0b3JlLmNhbGwodGhpcyk7XG4gIHRoaXMuaWR4ID0ge307XG59XG51dGlsLmluaGVyaXRzKE1lbW9yeUNvb2tpZVN0b3JlLCBTdG9yZSk7XG5leHBvcnRzLk1lbW9yeUNvb2tpZVN0b3JlID0gTWVtb3J5Q29va2llU3RvcmU7XG5NZW1vcnlDb29raWVTdG9yZS5wcm90b3R5cGUuaWR4ID0gbnVsbDtcblxuLy8gU2luY2UgaXQncyBqdXN0IGEgc3RydWN0IGluIFJBTSwgdGhpcyBTdG9yZSBpcyBzeW5jaHJvbm91c1xuTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlLnN5bmNocm9ub3VzID0gdHJ1ZTtcblxuLy8gZm9yY2UgYSBkZWZhdWx0IGRlcHRoOlxuTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFwieyBpZHg6IFwiK3V0aWwuaW5zcGVjdCh0aGlzLmlkeCwgZmFsc2UsIDIpKycgfSc7XG59O1xuXG4vLyBVc2UgdGhlIG5ldyBjdXN0b20gaW5zcGVjdGlvbiBzeW1ib2wgdG8gYWRkIHRoZSBjdXN0b20gaW5zcGVjdCBmdW5jdGlvbiBpZlxuLy8gYXZhaWxhYmxlLlxuaWYgKHV0aWwuaW5zcGVjdC5jdXN0b20pIHtcbiAgTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlW3V0aWwuaW5zcGVjdC5jdXN0b21dID0gTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlLmluc3BlY3Q7XG59XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS5maW5kQ29va2llID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBrZXksIGNiKSB7XG4gIGlmICghdGhpcy5pZHhbZG9tYWluXSkge1xuICAgIHJldHVybiBjYihudWxsLHVuZGVmaW5lZCk7XG4gIH1cbiAgaWYgKCF0aGlzLmlkeFtkb21haW5dW3BhdGhdKSB7XG4gICAgcmV0dXJuIGNiKG51bGwsdW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gY2IobnVsbCx0aGlzLmlkeFtkb21haW5dW3BhdGhdW2tleV18fG51bGwpO1xufTtcblxuTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlLmZpbmRDb29raWVzID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBjYikge1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICBpZiAoIWRvbWFpbikge1xuICAgIHJldHVybiBjYihudWxsLFtdKTtcbiAgfVxuXG4gIHZhciBwYXRoTWF0Y2hlcjtcbiAgaWYgKCFwYXRoKSB7XG4gICAgLy8gbnVsbCBtZWFucyBcImFsbCBwYXRoc1wiXG4gICAgcGF0aE1hdGNoZXIgPSBmdW5jdGlvbiBtYXRjaEFsbChkb21haW5JbmRleCkge1xuICAgICAgZm9yICh2YXIgY3VyUGF0aCBpbiBkb21haW5JbmRleCkge1xuICAgICAgICB2YXIgcGF0aEluZGV4ID0gZG9tYWluSW5kZXhbY3VyUGF0aF07XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBwYXRoSW5kZXgpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2gocGF0aEluZGV4W2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICB9IGVsc2Uge1xuICAgIHBhdGhNYXRjaGVyID0gZnVuY3Rpb24gbWF0Y2hSRkMoZG9tYWluSW5kZXgpIHtcbiAgICAgICAvL05PVEU6IHdlIHNob3VsZCB1c2UgcGF0aC1tYXRjaCBhbGdvcml0aG0gZnJvbSBTNS4xLjQgaGVyZVxuICAgICAgIC8vKHNlZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9DaHJvbWl1bVdlYkFwcHMvY2hyb21pdW0vYmxvYi9iM2QzYjRkYThiYjk0YzFiMmUwNjE2MDBkZjEwNmQ1OTBmZGEzNjIwL25ldC9jb29raWVzL2Nhbm9uaWNhbF9jb29raWUuY2MjTDI5OSlcbiAgICAgICBPYmplY3Qua2V5cyhkb21haW5JbmRleCkuZm9yRWFjaChmdW5jdGlvbiAoY29va2llUGF0aCkge1xuICAgICAgICAgaWYgKHBhdGhNYXRjaChwYXRoLCBjb29raWVQYXRoKSkge1xuICAgICAgICAgICB2YXIgcGF0aEluZGV4ID0gZG9tYWluSW5kZXhbY29va2llUGF0aF07XG5cbiAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHBhdGhJbmRleCkge1xuICAgICAgICAgICAgIHJlc3VsdHMucHVzaChwYXRoSW5kZXhba2V5XSk7XG4gICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICB9KTtcbiAgICAgfTtcbiAgfVxuXG4gIHZhciBkb21haW5zID0gcGVybXV0ZURvbWFpbihkb21haW4pIHx8IFtkb21haW5dO1xuICB2YXIgaWR4ID0gdGhpcy5pZHg7XG4gIGRvbWFpbnMuZm9yRWFjaChmdW5jdGlvbihjdXJEb21haW4pIHtcbiAgICB2YXIgZG9tYWluSW5kZXggPSBpZHhbY3VyRG9tYWluXTtcbiAgICBpZiAoIWRvbWFpbkluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBhdGhNYXRjaGVyKGRvbWFpbkluZGV4KTtcbiAgfSk7XG5cbiAgY2IobnVsbCxyZXN1bHRzKTtcbn07XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS5wdXRDb29raWUgPSBmdW5jdGlvbihjb29raWUsIGNiKSB7XG4gIGlmICghdGhpcy5pZHhbY29va2llLmRvbWFpbl0pIHtcbiAgICB0aGlzLmlkeFtjb29raWUuZG9tYWluXSA9IHt9O1xuICB9XG4gIGlmICghdGhpcy5pZHhbY29va2llLmRvbWFpbl1bY29va2llLnBhdGhdKSB7XG4gICAgdGhpcy5pZHhbY29va2llLmRvbWFpbl1bY29va2llLnBhdGhdID0ge307XG4gIH1cbiAgdGhpcy5pZHhbY29va2llLmRvbWFpbl1bY29va2llLnBhdGhdW2Nvb2tpZS5rZXldID0gY29va2llO1xuICBjYihudWxsKTtcbn07XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS51cGRhdGVDb29raWUgPSBmdW5jdGlvbihvbGRDb29raWUsIG5ld0Nvb2tpZSwgY2IpIHtcbiAgLy8gdXBkYXRlQ29va2llKCkgbWF5IGF2b2lkIHVwZGF0aW5nIGNvb2tpZXMgdGhhdCBhcmUgaWRlbnRpY2FsLiAgRm9yIGV4YW1wbGUsXG4gIC8vIGxhc3RBY2Nlc3NlZCBtYXkgbm90IGJlIGltcG9ydGFudCB0byBzb21lIHN0b3JlcyBhbmQgYW4gZXF1YWxpdHlcbiAgLy8gY29tcGFyaXNvbiBjb3VsZCBleGNsdWRlIHRoYXQgZmllbGQuXG4gIHRoaXMucHV0Q29va2llKG5ld0Nvb2tpZSxjYik7XG59O1xuXG5NZW1vcnlDb29raWVTdG9yZS5wcm90b3R5cGUucmVtb3ZlQ29va2llID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBrZXksIGNiKSB7XG4gIGlmICh0aGlzLmlkeFtkb21haW5dICYmIHRoaXMuaWR4W2RvbWFpbl1bcGF0aF0gJiYgdGhpcy5pZHhbZG9tYWluXVtwYXRoXVtrZXldKSB7XG4gICAgZGVsZXRlIHRoaXMuaWR4W2RvbWFpbl1bcGF0aF1ba2V5XTtcbiAgfVxuICBjYihudWxsKTtcbn07XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS5yZW1vdmVDb29raWVzID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBjYikge1xuICBpZiAodGhpcy5pZHhbZG9tYWluXSkge1xuICAgIGlmIChwYXRoKSB7XG4gICAgICBkZWxldGUgdGhpcy5pZHhbZG9tYWluXVtwYXRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuaWR4W2RvbWFpbl07XG4gICAgfVxuICB9XG4gIHJldHVybiBjYihudWxsKTtcbn07XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS5yZW1vdmVBbGxDb29raWVzID0gZnVuY3Rpb24oY2IpIHtcbiAgdGhpcy5pZHggPSB7fTtcbiAgcmV0dXJuIGNiKG51bGwpO1xufVxuXG5NZW1vcnlDb29raWVTdG9yZS5wcm90b3R5cGUuZ2V0QWxsQ29va2llcyA9IGZ1bmN0aW9uKGNiKSB7XG4gIHZhciBjb29raWVzID0gW107XG4gIHZhciBpZHggPSB0aGlzLmlkeDtcblxuICB2YXIgZG9tYWlucyA9IE9iamVjdC5rZXlzKGlkeCk7XG4gIGRvbWFpbnMuZm9yRWFjaChmdW5jdGlvbihkb21haW4pIHtcbiAgICB2YXIgcGF0aHMgPSBPYmplY3Qua2V5cyhpZHhbZG9tYWluXSk7XG4gICAgcGF0aHMuZm9yRWFjaChmdW5jdGlvbihwYXRoKSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGlkeFtkb21haW5dW3BhdGhdKTtcbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvb2tpZXMucHVzaChpZHhbZG9tYWluXVtwYXRoXVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFNvcnQgYnkgY3JlYXRpb25JbmRleCBzbyBkZXNlcmlhbGl6aW5nIHJldGFpbnMgdGhlIGNyZWF0aW9uIG9yZGVyLlxuICAvLyBXaGVuIGltcGxlbWVudGluZyB5b3VyIG93biBzdG9yZSwgdGhpcyBTSE9VTEQgcmV0YWluIHRoZSBvcmRlciB0b29cbiAgY29va2llcy5zb3J0KGZ1bmN0aW9uKGEsYikge1xuICAgIHJldHVybiAoYS5jcmVhdGlvbkluZGV4fHwwKSAtIChiLmNyZWF0aW9uSW5kZXh8fDApO1xuICB9KTtcblxuICBjYihudWxsLCBjb29raWVzKTtcbn07XG4iLCAiLy8gZ2VuZXJhdGVkIGJ5IGdlbnZlcnNpb25cbm1vZHVsZS5leHBvcnRzID0gJzIuNS4wJ1xuIiwgIi8qIVxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBTYWxlc2ZvcmNlLmNvbSwgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTYWxlc2ZvcmNlLmNvbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5XG4gKiBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XG4gKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xudmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xudmFyIHVybFBhcnNlID0gcmVxdWlyZSgndXJsJykucGFyc2U7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBwdWJzdWZmaXggPSByZXF1aXJlKCcuL3B1YnN1ZmZpeC1wc2wnKTtcbnZhciBTdG9yZSA9IHJlcXVpcmUoJy4vc3RvcmUnKS5TdG9yZTtcbnZhciBNZW1vcnlDb29raWVTdG9yZSA9IHJlcXVpcmUoJy4vbWVtc3RvcmUnKS5NZW1vcnlDb29raWVTdG9yZTtcbnZhciBwYXRoTWF0Y2ggPSByZXF1aXJlKCcuL3BhdGhNYXRjaCcpLnBhdGhNYXRjaDtcbnZhciBWRVJTSU9OID0gcmVxdWlyZSgnLi92ZXJzaW9uJyk7XG5cbnZhciBwdW55Y29kZTtcbnRyeSB7XG4gIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbn0gY2F0Y2goZSkge1xuICBjb25zb2xlLndhcm4oXCJ0b3VnaC1jb29raWU6IGNhbid0IGxvYWQgcHVueWNvZGU7IHdvbid0IHVzZSBwdW55Y29kZSBmb3IgZG9tYWluIG5vcm1hbGl6YXRpb25cIik7XG59XG5cbi8vIEZyb20gUkZDNjI2NSBTNC4xLjFcbi8vIG5vdGUgdGhhdCBpdCBleGNsdWRlcyBcXHgzQiBcIjtcIlxudmFyIENPT0tJRV9PQ1RFVFMgPSAvXltcXHgyMVxceDIzLVxceDJCXFx4MkQtXFx4M0FcXHgzQy1cXHg1QlxceDVELVxceDdFXSskLztcblxudmFyIENPTlRST0xfQ0hBUlMgPSAvW1xceDAwLVxceDFGXS87XG5cbi8vIEZyb20gQ2hyb21pdW0gLy8gJ1xccicsICdcXG4nIGFuZCAnXFwwJyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHRlcm1pbmF0b3IgaW5cbi8vIHRoZSBcInJlbGF4ZWRcIiBtb2RlLCBzZWU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vQ2hyb21pdW1XZWJBcHBzL2Nocm9taXVtL2Jsb2IvYjNkM2I0ZGE4YmI5NGMxYjJlMDYxNjAwZGYxMDZkNTkwZmRhMzYyMC9uZXQvY29va2llcy9wYXJzZWRfY29va2llLmNjI0w2MFxudmFyIFRFUk1JTkFUT1JTID0gWydcXG4nLCAnXFxyJywgJ1xcMCddO1xuXG4vLyBSRkM2MjY1IFM0LjEuMSBkZWZpbmVzIHBhdGggdmFsdWUgYXMgJ2FueSBDSEFSIGV4Y2VwdCBDVExzIG9yIFwiO1wiJ1xuLy8gTm90ZSAnOycgaXMgXFx4M0JcbnZhciBQQVRIX1ZBTFVFID0gL1tcXHgyMC1cXHgzQVxceDNDLVxceDdFXSsvO1xuXG4vLyBkYXRlLXRpbWUgcGFyc2luZyBjb25zdGFudHMgKFJGQzYyNjUgUzUuMS4xKVxuXG52YXIgREFURV9ERUxJTSA9IC9bXFx4MDlcXHgyMC1cXHgyRlxceDNCLVxceDQwXFx4NUItXFx4NjBcXHg3Qi1cXHg3RV0vO1xuXG52YXIgTU9OVEhfVE9fTlVNID0ge1xuICBqYW46MCwgZmViOjEsIG1hcjoyLCBhcHI6MywgbWF5OjQsIGp1bjo1LFxuICBqdWw6NiwgYXVnOjcsIHNlcDo4LCBvY3Q6OSwgbm92OjEwLCBkZWM6MTFcbn07XG52YXIgTlVNX1RPX01PTlRIID0gW1xuICAnSmFuJywnRmViJywnTWFyJywnQXByJywnTWF5JywnSnVuJywnSnVsJywnQXVnJywnU2VwJywnT2N0JywnTm92JywnRGVjJ1xuXTtcbnZhciBOVU1fVE9fREFZID0gW1xuICAnU3VuJywnTW9uJywnVHVlJywnV2VkJywnVGh1JywnRnJpJywnU2F0J1xuXTtcblxudmFyIE1BWF9USU1FID0gMjE0NzQ4MzY0NzAwMDsgLy8gMzEtYml0IG1heFxudmFyIE1JTl9USU1FID0gMDsgLy8gMzEtYml0IG1pblxuXG4vKlxuICogUGFyc2VzIGEgTmF0dXJhbCBudW1iZXIgKGkuZS4sIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyKSB3aXRoIGVpdGhlciB0aGVcbiAqICAgIDxtaW4+KjxtYXg+RElHSVQgKCBub24tZGlnaXQgKk9DVEVUIClcbiAqIG9yXG4gKiAgICA8bWluPio8bWF4PkRJR0lUXG4gKiBncmFtbWFyIChSRkM2MjY1IFM1LjEuMSkuXG4gKlxuICogVGhlIFwidHJhaWxpbmdPS1wiIGJvb2xlYW4gY29udHJvbHMgaWYgdGhlIGdyYW1tYXIgYWNjZXB0cyBhXG4gKiBcIiggbm9uLWRpZ2l0ICpPQ1RFVCApXCIgdHJhaWxlci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VEaWdpdHModG9rZW4sIG1pbkRpZ2l0cywgbWF4RGlnaXRzLCB0cmFpbGluZ09LKSB7XG4gIHZhciBjb3VudCA9IDA7XG4gIHdoaWxlIChjb3VudCA8IHRva2VuLmxlbmd0aCkge1xuICAgIHZhciBjID0gdG9rZW4uY2hhckNvZGVBdChjb3VudCk7XG4gICAgLy8gXCJub24tZGlnaXQgPSAleDAwLTJGIC8gJXgzQS1GRlwiXG4gICAgaWYgKGMgPD0gMHgyRiB8fCBjID49IDB4M0EpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb3VudCsrO1xuICB9XG5cbiAgLy8gY29uc3RyYWluIHRvIGEgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzLlxuICBpZiAoY291bnQgPCBtaW5EaWdpdHMgfHwgY291bnQgPiBtYXhEaWdpdHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghdHJhaWxpbmdPSyAmJiBjb3VudCAhPSB0b2tlbi5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBwYXJzZUludCh0b2tlbi5zdWJzdHIoMCxjb3VudCksIDEwKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lKHRva2VuKSB7XG4gIHZhciBwYXJ0cyA9IHRva2VuLnNwbGl0KCc6Jyk7XG4gIHZhciByZXN1bHQgPSBbMCwwLDBdO1xuXG4gIC8qIFJGNjI1NiBTNS4xLjE6XG4gICAqICAgICAgdGltZSAgICAgICAgICAgID0gaG1zLXRpbWUgKCBub24tZGlnaXQgKk9DVEVUIClcbiAgICogICAgICBobXMtdGltZSAgICAgICAgPSB0aW1lLWZpZWxkIFwiOlwiIHRpbWUtZmllbGQgXCI6XCIgdGltZS1maWVsZFxuICAgKiAgICAgIHRpbWUtZmllbGQgICAgICA9IDEqMkRJR0lUXG4gICAqL1xuXG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgLy8gXCJ0aW1lLWZpZWxkXCIgbXVzdCBiZSBzdHJpY3RseSBcIjEqMkRJR0lUXCIsIEhPV0VWRVIsIFwiaG1zLXRpbWVcIiBjYW4gYmVcbiAgICAvLyBmb2xsb3dlZCBieSBcIiggbm9uLWRpZ2l0ICpPQ1RFVCApXCIgc28gdGhlcmVmb3JlIHRoZSBsYXN0IHRpbWUtZmllbGQgY2FuXG4gICAgLy8gaGF2ZSBhIHRyYWlsZXJcbiAgICB2YXIgdHJhaWxpbmdPSyA9IChpID09IDIpO1xuICAgIHZhciBudW0gPSBwYXJzZURpZ2l0cyhwYXJ0c1tpXSwgMSwgMiwgdHJhaWxpbmdPSyk7XG4gICAgaWYgKG51bSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJlc3VsdFtpXSA9IG51bTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9udGgodG9rZW4pIHtcbiAgdG9rZW4gPSBTdHJpbmcodG9rZW4pLnN1YnN0cigwLDMpLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBudW0gPSBNT05USF9UT19OVU1bdG9rZW5dO1xuICByZXR1cm4gbnVtID49IDAgPyBudW0gOiBudWxsO1xufVxuXG4vKlxuICogUkZDNjI2NSBTNS4xLjEgZGF0ZSBwYXJzZXIgKHNlZSBSRkMgZm9yIGZ1bGwgZ3JhbW1hcilcbiAqL1xuZnVuY3Rpb24gcGFyc2VEYXRlKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIFJGQzYyNjUgUzUuMS4xOlxuICAgKiAyLiBQcm9jZXNzIGVhY2ggZGF0ZS10b2tlbiBzZXF1ZW50aWFsbHkgaW4gdGhlIG9yZGVyIHRoZSBkYXRlLXRva2Vuc1xuICAgKiBhcHBlYXIgaW4gdGhlIGNvb2tpZS1kYXRlXG4gICAqL1xuICB2YXIgdG9rZW5zID0gc3RyLnNwbGl0KERBVEVfREVMSU0pO1xuICBpZiAoIXRva2Vucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBob3VyID0gbnVsbDtcbiAgdmFyIG1pbnV0ZSA9IG51bGw7XG4gIHZhciBzZWNvbmQgPSBudWxsO1xuICB2YXIgZGF5T2ZNb250aCA9IG51bGw7XG4gIHZhciBtb250aCA9IG51bGw7XG4gIHZhciB5ZWFyID0gbnVsbDtcblxuICBmb3IgKHZhciBpPTA7IGk8dG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRva2VuID0gdG9rZW5zW2ldLnRyaW0oKTtcbiAgICBpZiAoIXRva2VuLmxlbmd0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdDtcblxuICAgIC8qIDIuMS4gSWYgdGhlIGZvdW5kLXRpbWUgZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgdG9rZW4gbWF0Y2hlcyB0aGUgdGltZVxuICAgICAqIHByb2R1Y3Rpb24sIHNldCB0aGUgZm91bmQtdGltZSBmbGFnIGFuZCBzZXQgdGhlIGhvdXItIHZhbHVlLFxuICAgICAqIG1pbnV0ZS12YWx1ZSwgYW5kIHNlY29uZC12YWx1ZSB0byB0aGUgbnVtYmVycyBkZW5vdGVkIGJ5IHRoZSBkaWdpdHMgaW5cbiAgICAgKiB0aGUgZGF0ZS10b2tlbiwgcmVzcGVjdGl2ZWx5LiAgU2tpcCB0aGUgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmQgY29udGludWVcbiAgICAgKiB0byB0aGUgbmV4dCBkYXRlLXRva2VuLlxuICAgICAqL1xuICAgIGlmIChzZWNvbmQgPT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHBhcnNlVGltZSh0b2tlbik7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGhvdXIgPSByZXN1bHRbMF07XG4gICAgICAgIG1pbnV0ZSA9IHJlc3VsdFsxXTtcbiAgICAgICAgc2Vjb25kID0gcmVzdWx0WzJdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiAyLjIuIElmIHRoZSBmb3VuZC1kYXktb2YtbW9udGggZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgZGF0ZS10b2tlbiBtYXRjaGVzXG4gICAgICogdGhlIGRheS1vZi1tb250aCBwcm9kdWN0aW9uLCBzZXQgdGhlIGZvdW5kLWRheS1vZi0gbW9udGggZmxhZyBhbmQgc2V0XG4gICAgICogdGhlIGRheS1vZi1tb250aC12YWx1ZSB0byB0aGUgbnVtYmVyIGRlbm90ZWQgYnkgdGhlIGRhdGUtdG9rZW4uICBTa2lwXG4gICAgICogdGhlIHJlbWFpbmluZyBzdWItc3RlcHMgYW5kIGNvbnRpbnVlIHRvIHRoZSBuZXh0IGRhdGUtdG9rZW4uXG4gICAgICovXG4gICAgaWYgKGRheU9mTW9udGggPT09IG51bGwpIHtcbiAgICAgIC8vIFwiZGF5LW9mLW1vbnRoID0gMSoyRElHSVQgKCBub24tZGlnaXQgKk9DVEVUIClcIlxuICAgICAgcmVzdWx0ID0gcGFyc2VEaWdpdHModG9rZW4sIDEsIDIsIHRydWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICBkYXlPZk1vbnRoID0gcmVzdWx0O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiAyLjMuIElmIHRoZSBmb3VuZC1tb250aCBmbGFnIGlzIG5vdCBzZXQgYW5kIHRoZSBkYXRlLXRva2VuIG1hdGNoZXMgdGhlXG4gICAgICogbW9udGggcHJvZHVjdGlvbiwgc2V0IHRoZSBmb3VuZC1tb250aCBmbGFnIGFuZCBzZXQgdGhlIG1vbnRoLXZhbHVlIHRvXG4gICAgICogdGhlIG1vbnRoIGRlbm90ZWQgYnkgdGhlIGRhdGUtdG9rZW4uICBTa2lwIHRoZSByZW1haW5pbmcgc3ViLXN0ZXBzIGFuZFxuICAgICAqIGNvbnRpbnVlIHRvIHRoZSBuZXh0IGRhdGUtdG9rZW4uXG4gICAgICovXG4gICAgaWYgKG1vbnRoID09PSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBwYXJzZU1vbnRoKHRva2VuKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgbW9udGggPSByZXN1bHQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIDIuNC4gSWYgdGhlIGZvdW5kLXllYXIgZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgZGF0ZS10b2tlbiBtYXRjaGVzIHRoZVxuICAgICAqIHllYXIgcHJvZHVjdGlvbiwgc2V0IHRoZSBmb3VuZC15ZWFyIGZsYWcgYW5kIHNldCB0aGUgeWVhci12YWx1ZSB0byB0aGVcbiAgICAgKiBudW1iZXIgZGVub3RlZCBieSB0aGUgZGF0ZS10b2tlbi4gIFNraXAgdGhlIHJlbWFpbmluZyBzdWItc3RlcHMgYW5kXG4gICAgICogY29udGludWUgdG8gdGhlIG5leHQgZGF0ZS10b2tlbi5cbiAgICAgKi9cbiAgICBpZiAoeWVhciA9PT0gbnVsbCkge1xuICAgICAgLy8gXCJ5ZWFyID0gMio0RElHSVQgKCBub24tZGlnaXQgKk9DVEVUIClcIlxuICAgICAgcmVzdWx0ID0gcGFyc2VEaWdpdHModG9rZW4sIDIsIDQsIHRydWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICB5ZWFyID0gcmVzdWx0O1xuICAgICAgICAvKiBGcm9tIFM1LjEuMTpcbiAgICAgICAgICogMy4gIElmIHRoZSB5ZWFyLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA3MCBhbmQgbGVzc1xuICAgICAgICAgKiB0aGFuIG9yIGVxdWFsIHRvIDk5LCBpbmNyZW1lbnQgdGhlIHllYXItdmFsdWUgYnkgMTkwMC5cbiAgICAgICAgICogNC4gIElmIHRoZSB5ZWFyLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzXG4gICAgICAgICAqIHRoYW4gb3IgZXF1YWwgdG8gNjksIGluY3JlbWVudCB0aGUgeWVhci12YWx1ZSBieSAyMDAwLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHllYXIgPj0gNzAgJiYgeWVhciA8PSA5OSkge1xuICAgICAgICAgIHllYXIgKz0gMTkwMDtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyID49IDAgJiYgeWVhciA8PSA2OSkge1xuICAgICAgICAgIHllYXIgKz0gMjAwMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qIFJGQyA2MjY1IFM1LjEuMVxuICAgKiBcIjUuIEFib3J0IHRoZXNlIHN0ZXBzIGFuZCBmYWlsIHRvIHBhcnNlIHRoZSBjb29raWUtZGF0ZSBpZjpcbiAgICogICAgICogIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm91bmQtZGF5LW9mLW1vbnRoLCBmb3VuZC1tb250aCwgZm91bmQtXG4gICAqICAgICAgICB5ZWFyLCBvciBmb3VuZC10aW1lIGZsYWdzIGlzIG5vdCBzZXQsXG4gICAqICAgICAqICB0aGUgZGF5LW9mLW1vbnRoLXZhbHVlIGlzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbiAzMSxcbiAgICogICAgICogIHRoZSB5ZWFyLXZhbHVlIGlzIGxlc3MgdGhhbiAxNjAxLFxuICAgKiAgICAgKiAgdGhlIGhvdXItdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDIzLFxuICAgKiAgICAgKiAgdGhlIG1pbnV0ZS12YWx1ZSBpcyBncmVhdGVyIHRoYW4gNTksIG9yXG4gICAqICAgICAqICB0aGUgc2Vjb25kLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiA1OS5cbiAgICogICAgIChOb3RlIHRoYXQgbGVhcCBzZWNvbmRzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0aGlzIHN5bnRheC4pXCJcbiAgICpcbiAgICogU28sIGluIG9yZGVyIGFzIGFib3ZlOlxuICAgKi9cbiAgaWYgKFxuICAgIGRheU9mTW9udGggPT09IG51bGwgfHwgbW9udGggPT09IG51bGwgfHwgeWVhciA9PT0gbnVsbCB8fCBzZWNvbmQgPT09IG51bGwgfHxcbiAgICBkYXlPZk1vbnRoIDwgMSB8fCBkYXlPZk1vbnRoID4gMzEgfHxcbiAgICB5ZWFyIDwgMTYwMSB8fFxuICAgIGhvdXIgPiAyMyB8fFxuICAgIG1pbnV0ZSA+IDU5IHx8XG4gICAgc2Vjb25kID4gNTlcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXlPZk1vbnRoLCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHtcbiAgdmFyIGQgPSBkYXRlLmdldFVUQ0RhdGUoKTsgZCA9IGQgPj0gMTAgPyBkIDogJzAnK2Q7XG4gIHZhciBoID0gZGF0ZS5nZXRVVENIb3VycygpOyBoID0gaCA+PSAxMCA/IGggOiAnMCcraDtcbiAgdmFyIG0gPSBkYXRlLmdldFVUQ01pbnV0ZXMoKTsgbSA9IG0gPj0gMTAgPyBtIDogJzAnK207XG4gIHZhciBzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCk7IHMgPSBzID49IDEwID8gcyA6ICcwJytzO1xuICByZXR1cm4gTlVNX1RPX0RBWVtkYXRlLmdldFVUQ0RheSgpXSArICcsICcgK1xuICAgIGQrJyAnKyBOVU1fVE9fTU9OVEhbZGF0ZS5nZXRVVENNb250aCgpXSArJyAnKyBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKycgJytcbiAgICBoKyc6JyttKyc6JytzKycgR01UJztcbn1cblxuLy8gUzUuMS4yIENhbm9uaWNhbGl6ZWQgSG9zdCBOYW1lc1xuZnVuY3Rpb24gY2Fub25pY2FsRG9tYWluKHN0cikge1xuICBpZiAoc3RyID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoL15cXC4vLCcnKTsgLy8gUzQuMS4yLjMgJiBTNS4yLjM6IGlnbm9yZSBsZWFkaW5nIC5cblxuICAvLyBjb252ZXJ0IHRvIElETiBpZiBhbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnNcbiAgaWYgKHB1bnljb2RlICYmIC9bXlxcdTAwMDEtXFx1MDA3Zl0vLnRlc3Qoc3RyKSkge1xuICAgIHN0ciA9IHB1bnljb2RlLnRvQVNDSUkoc3RyKTtcbiAgfVxuXG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKTtcbn1cblxuLy8gUzUuMS4zIERvbWFpbiBNYXRjaGluZ1xuZnVuY3Rpb24gZG9tYWluTWF0Y2goc3RyLCBkb21TdHIsIGNhbm9uaWNhbGl6ZSkge1xuICBpZiAoc3RyID09IG51bGwgfHwgZG9tU3RyID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoY2Fub25pY2FsaXplICE9PSBmYWxzZSkge1xuICAgIHN0ciA9IGNhbm9uaWNhbERvbWFpbihzdHIpO1xuICAgIGRvbVN0ciA9IGNhbm9uaWNhbERvbWFpbihkb21TdHIpO1xuICB9XG5cbiAgLypcbiAgICogXCJUaGUgZG9tYWluIHN0cmluZyBhbmQgdGhlIHN0cmluZyBhcmUgaWRlbnRpY2FsLiAoTm90ZSB0aGF0IGJvdGggdGhlXG4gICAqIGRvbWFpbiBzdHJpbmcgYW5kIHRoZSBzdHJpbmcgd2lsbCBoYXZlIGJlZW4gY2Fub25pY2FsaXplZCB0byBsb3dlciBjYXNlIGF0XG4gICAqIHRoaXMgcG9pbnQpXCJcbiAgICovXG4gIGlmIChzdHIgPT0gZG9tU3RyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiBcIkFsbCBvZiB0aGUgZm9sbG93aW5nIFt0aHJlZV0gY29uZGl0aW9ucyBob2xkOlwiIChvcmRlciBhZGp1c3RlZCBmcm9tIHRoZSBSRkMpICovXG5cbiAgLyogXCIqIFRoZSBzdHJpbmcgaXMgYSBob3N0IG5hbWUgKGkuZS4sIG5vdCBhbiBJUCBhZGRyZXNzKS5cIiAqL1xuICBpZiAobmV0LmlzSVAoc3RyKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIFwiKiBUaGUgZG9tYWluIHN0cmluZyBpcyBhIHN1ZmZpeCBvZiB0aGUgc3RyaW5nXCIgKi9cbiAgdmFyIGlkeCA9IHN0ci5pbmRleE9mKGRvbVN0cik7XG4gIGlmIChpZHggPD0gMCkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gaXQncyBhIG5vbi1tYXRjaCAoLTEpIG9yIHByZWZpeCAoMClcbiAgfVxuXG4gIC8vIGUuZyBcImEuYi5jXCIuaW5kZXhPZihcImIuY1wiKSA9PT0gMlxuICAvLyA1ID09PSAzKzJcbiAgaWYgKHN0ci5sZW5ndGggIT09IGRvbVN0ci5sZW5ndGggKyBpZHgpIHsgLy8gaXQncyBub3QgYSBzdWZmaXhcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiBcIiogVGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRvbWFpblxuICAqIHN0cmluZyBpcyBhICV4MkUgKFwiLlwiKSBjaGFyYWN0ZXIuXCIgKi9cbiAgaWYgKHN0ci5zdWJzdHIoaWR4LTEsMSkgIT09ICcuJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5cbi8vIFJGQzYyNjUgUzUuMS40IFBhdGhzIGFuZCBQYXRoLU1hdGNoXG5cbi8qXG4gKiBcIlRoZSB1c2VyIGFnZW50IE1VU1QgdXNlIGFuIGFsZ29yaXRobSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtXG4gKiB0byBjb21wdXRlIHRoZSBkZWZhdWx0LXBhdGggb2YgYSBjb29raWU6XCJcbiAqXG4gKiBBc3N1bXB0aW9uOiB0aGUgcGF0aCAoYW5kIG5vdCBxdWVyeSBwYXJ0IG9yIGFic29sdXRlIHVyaSkgaXMgcGFzc2VkIGluLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UGF0aChwYXRoKSB7XG4gIC8vIFwiMi4gSWYgdGhlIHVyaS1wYXRoIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHVyaS1wYXRoIGlzIG5vdFxuICAvLyBhICV4MkYgKFwiL1wiKSBjaGFyYWN0ZXIsIG91dHB1dCAleDJGIChcIi9cIikgYW5kIHNraXAgdGhlIHJlbWFpbmluZyBzdGVwcy5cbiAgaWYgKCFwYXRoIHx8IHBhdGguc3Vic3RyKDAsMSkgIT09IFwiL1wiKSB7XG4gICAgcmV0dXJuIFwiL1wiO1xuICB9XG5cbiAgLy8gXCIzLiBJZiB0aGUgdXJpLXBhdGggY29udGFpbnMgbm8gbW9yZSB0aGFuIG9uZSAleDJGIChcIi9cIikgY2hhcmFjdGVyLCBvdXRwdXRcbiAgLy8gJXgyRiAoXCIvXCIpIGFuZCBza2lwIHRoZSByZW1haW5pbmcgc3RlcC5cIlxuICBpZiAocGF0aCA9PT0gXCIvXCIpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuXG4gIHZhciByaWdodFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG4gIGlmIChyaWdodFNsYXNoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiL1wiO1xuICB9XG5cbiAgLy8gXCI0LiBPdXRwdXQgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVyaS1wYXRoIGZyb20gdGhlIGZpcnN0IGNoYXJhY3RlciB1cCB0byxcbiAgLy8gYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSByaWdodC1tb3N0ICV4MkYgKFwiL1wiKS5cIlxuICByZXR1cm4gcGF0aC5zbGljZSgwLCByaWdodFNsYXNoKTtcbn1cblxuZnVuY3Rpb24gdHJpbVRlcm1pbmF0b3Ioc3RyKSB7XG4gIGZvciAodmFyIHQgPSAwOyB0IDwgVEVSTUlOQVRPUlMubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgdGVybWluYXRvcklkeCA9IHN0ci5pbmRleE9mKFRFUk1JTkFUT1JTW3RdKTtcbiAgICBpZiAodGVybWluYXRvcklkeCAhPT0gLTEpIHtcbiAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMCx0ZXJtaW5hdG9ySWR4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvb2tpZVBhaXIoY29va2llUGFpciwgbG9vc2VNb2RlKSB7XG4gIGNvb2tpZVBhaXIgPSB0cmltVGVybWluYXRvcihjb29raWVQYWlyKTtcblxuICB2YXIgZmlyc3RFcSA9IGNvb2tpZVBhaXIuaW5kZXhPZignPScpO1xuICBpZiAobG9vc2VNb2RlKSB7XG4gICAgaWYgKGZpcnN0RXEgPT09IDApIHsgLy8gJz0nIGlzIGltbWVkaWF0ZWx5IGF0IHN0YXJ0XG4gICAgICBjb29raWVQYWlyID0gY29va2llUGFpci5zdWJzdHIoMSk7XG4gICAgICBmaXJzdEVxID0gY29va2llUGFpci5pbmRleE9mKCc9Jyk7IC8vIG1pZ2h0IHN0aWxsIG5lZWQgdG8gc3BsaXQgb24gJz0nXG4gICAgfVxuICB9IGVsc2UgeyAvLyBub24tbG9vc2UgbW9kZVxuICAgIGlmIChmaXJzdEVxIDw9IDApIHsgLy8gbm8gJz0nIG9yIGlzIGF0IHN0YXJ0XG4gICAgICByZXR1cm47IC8vIG5lZWRzIHRvIGhhdmUgbm9uLWVtcHR5IFwiY29va2llLW5hbWVcIlxuICAgIH1cbiAgfVxuXG4gIHZhciBjb29raWVOYW1lLCBjb29raWVWYWx1ZTtcbiAgaWYgKGZpcnN0RXEgPD0gMCkge1xuICAgIGNvb2tpZU5hbWUgPSBcIlwiO1xuICAgIGNvb2tpZVZhbHVlID0gY29va2llUGFpci50cmltKCk7XG4gIH0gZWxzZSB7XG4gICAgY29va2llTmFtZSA9IGNvb2tpZVBhaXIuc3Vic3RyKDAsIGZpcnN0RXEpLnRyaW0oKTtcbiAgICBjb29raWVWYWx1ZSA9IGNvb2tpZVBhaXIuc3Vic3RyKGZpcnN0RXErMSkudHJpbSgpO1xuICB9XG5cbiAgaWYgKENPTlRST0xfQ0hBUlMudGVzdChjb29raWVOYW1lKSB8fCBDT05UUk9MX0NIQVJTLnRlc3QoY29va2llVmFsdWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGMgPSBuZXcgQ29va2llKCk7XG4gIGMua2V5ID0gY29va2llTmFtZTtcbiAgYy52YWx1ZSA9IGNvb2tpZVZhbHVlO1xuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcGFyc2Uoc3RyLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgc3RyID0gc3RyLnRyaW0oKTtcblxuICAvLyBXZSB1c2UgYSByZWdleCB0byBwYXJzZSB0aGUgXCJuYW1lLXZhbHVlLXBhaXJcIiBwYXJ0IG9mIFM1LjJcbiAgdmFyIGZpcnN0U2VtaSA9IHN0ci5pbmRleE9mKCc7Jyk7IC8vIFM1LjIgc3RlcCAxXG4gIHZhciBjb29raWVQYWlyID0gKGZpcnN0U2VtaSA9PT0gLTEpID8gc3RyIDogc3RyLnN1YnN0cigwLCBmaXJzdFNlbWkpO1xuICB2YXIgYyA9IHBhcnNlQ29va2llUGFpcihjb29raWVQYWlyLCAhIW9wdGlvbnMubG9vc2UpO1xuICBpZiAoIWMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZmlyc3RTZW1pID09PSAtMSkge1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgLy8gUzUuMi4zIFwidW5wYXJzZWQtYXR0cmlidXRlcyBjb25zaXN0IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHNldC1jb29raWUtc3RyaW5nXG4gIC8vIChpbmNsdWRpbmcgdGhlICV4M0IgKFwiO1wiKSBpbiBxdWVzdGlvbikuXCIgcGx1cyBsYXRlciBvbiBpbiB0aGUgc2FtZSBzZWN0aW9uXG4gIC8vIFwiZGlzY2FyZCB0aGUgZmlyc3QgXCI7XCIgYW5kIHRyaW1cIi5cbiAgdmFyIHVucGFyc2VkID0gc3RyLnNsaWNlKGZpcnN0U2VtaSArIDEpLnRyaW0oKTtcblxuICAvLyBcIklmIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHN0cmluZyBpcyBlbXB0eSwgc2tpcCB0aGUgcmVzdCBvZiB0aGVzZVxuICAvLyBzdGVwcy5cIlxuICBpZiAodW5wYXJzZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICAvKlxuICAgKiBTNS4yIHNheXMgdGhhdCB3aGVuIGxvb3Bpbmcgb3ZlciB0aGUgaXRlbXMgXCJbcF1yb2Nlc3MgdGhlIGF0dHJpYnV0ZS1uYW1lXG4gICAqIGFuZCBhdHRyaWJ1dGUtdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMgaW4gdGhlIGZvbGxvd2luZ1xuICAgKiBzdWJzZWN0aW9uc1wiIGZvciBldmVyeSBpdGVtLiAgUGx1cywgZm9yIG1hbnkgb2YgdGhlIGluZGl2aWR1YWwgYXR0cmlidXRlc1xuICAgKiBpbiBTNS4zIGl0IHNheXMgdG8gdXNlIHRoZSBcImF0dHJpYnV0ZS12YWx1ZSBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgaW4gdGhlXG4gICAqIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdFwiLiAgVGhlcmVmb3JlLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLCB3ZSBvdmVyd3JpdGVcbiAgICogdGhlIHByZXZpb3VzIHZhbHVlLlxuICAgKi9cbiAgdmFyIGNvb2tpZV9hdnMgPSB1bnBhcnNlZC5zcGxpdCgnOycpO1xuICB3aGlsZSAoY29va2llX2F2cy5sZW5ndGgpIHtcbiAgICB2YXIgYXYgPSBjb29raWVfYXZzLnNoaWZ0KCkudHJpbSgpO1xuICAgIGlmIChhdi5sZW5ndGggPT09IDApIHsgLy8gaGFwcGVucyBpZiBcIjs7XCIgYXBwZWFyc1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBhdl9zZXAgPSBhdi5pbmRleE9mKCc9Jyk7XG4gICAgdmFyIGF2X2tleSwgYXZfdmFsdWU7XG5cbiAgICBpZiAoYXZfc2VwID09PSAtMSkge1xuICAgICAgYXZfa2V5ID0gYXY7XG4gICAgICBhdl92YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF2X2tleSA9IGF2LnN1YnN0cigwLGF2X3NlcCk7XG4gICAgICBhdl92YWx1ZSA9IGF2LnN1YnN0cihhdl9zZXArMSk7XG4gICAgfVxuXG4gICAgYXZfa2V5ID0gYXZfa2V5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICBhdl92YWx1ZSA9IGF2X3ZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICBzd2l0Y2goYXZfa2V5KSB7XG4gICAgY2FzZSAnZXhwaXJlcyc6IC8vIFM1LjIuMVxuICAgICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICAgIHZhciBleHAgPSBwYXJzZURhdGUoYXZfdmFsdWUpO1xuICAgICAgICAvLyBcIklmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgZmFpbGVkIHRvIHBhcnNlIGFzIGEgY29va2llIGRhdGUsIGlnbm9yZSB0aGVcbiAgICAgICAgLy8gY29va2llLWF2LlwiXG4gICAgICAgIGlmIChleHApIHtcbiAgICAgICAgICAvLyBvdmVyIGFuZCB1bmRlcmZsb3cgbm90IHJlYWxpc3RpY2FsbHkgYSBjb25jZXJuOiBWOCdzIGdldFRpbWUoKSBzZWVtcyB0b1xuICAgICAgICAgIC8vIHN0b3JlIHNvbWV0aGluZyBsYXJnZXIgdGhhbiBhIDMyLWJpdCB0aW1lX3QgKGV2ZW4gd2l0aCAzMi1iaXQgbm9kZSlcbiAgICAgICAgICBjLmV4cGlyZXMgPSBleHA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbWF4LWFnZSc6IC8vIFM1LjIuMlxuICAgICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICAgIC8vIFwiSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIG5vdCBhIERJR0lUIG9yIGEgXCItXCJcbiAgICAgICAgLy8gY2hhcmFjdGVyIC4uLltvcl0uLi4gSWYgdGhlIHJlbWFpbmRlciBvZiBhdHRyaWJ1dGUtdmFsdWUgY29udGFpbnMgYVxuICAgICAgICAvLyBub24tRElHSVQgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cIlxuICAgICAgICBpZiAoL14tP1swLTldKyQvLnRlc3QoYXZfdmFsdWUpKSB7XG4gICAgICAgICAgdmFyIGRlbHRhID0gcGFyc2VJbnQoYXZfdmFsdWUsIDEwKTtcbiAgICAgICAgICAvLyBcIklmIGRlbHRhLXNlY29uZHMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gKDApLCBsZXQgZXhwaXJ5LXRpbWVcbiAgICAgICAgICAvLyBiZSB0aGUgZWFybGllc3QgcmVwcmVzZW50YWJsZSBkYXRlIGFuZCB0aW1lLlwiXG4gICAgICAgICAgYy5zZXRNYXhBZ2UoZGVsdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RvbWFpbic6IC8vIFM1LjIuM1xuICAgICAgLy8gXCJJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5LCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiAgSG93ZXZlcixcbiAgICAgIC8vIHRoZSB1c2VyIGFnZW50IFNIT1VMRCBpZ25vcmUgdGhlIGNvb2tpZS1hdiBlbnRpcmVseS5cIlxuICAgICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICAgIC8vIFM1LjIuMyBcIkxldCBjb29raWUtZG9tYWluIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUgd2l0aG91dCB0aGUgbGVhZGluZyAleDJFXG4gICAgICAgIC8vIChcIi5cIikgY2hhcmFjdGVyLlwiXG4gICAgICAgIHZhciBkb21haW4gPSBhdl92YWx1ZS50cmltKCkucmVwbGFjZSgvXlxcLi8sICcnKTtcbiAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgIC8vIFwiQ29udmVydCB0aGUgY29va2llLWRvbWFpbiB0byBsb3dlciBjYXNlLlwiXG4gICAgICAgICAgYy5kb21haW4gPSBkb21haW4udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwYXRoJzogLy8gUzUuMi40XG4gICAgICAvKlxuICAgICAgICogXCJJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4gICAgICAgKiBhdHRyaWJ1dGUtdmFsdWUgaXMgbm90ICV4MkYgKFwiL1wiKTpcbiAgICAgICAqICAgTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBkZWZhdWx0LXBhdGguXG4gICAgICAgKiBPdGhlcndpc2U6XG4gICAgICAgKiAgIExldCBjb29raWUtcGF0aCBiZSB0aGUgYXR0cmlidXRlLXZhbHVlLlwiXG4gICAgICAgKlxuICAgICAgICogV2UnbGwgcmVwcmVzZW50IHRoZSBkZWZhdWx0LXBhdGggYXMgbnVsbCBzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZVxuICAgICAgICogY29udGV4dCBvZiB0aGUgcGFyc2luZy5cbiAgICAgICAqL1xuICAgICAgYy5wYXRoID0gYXZfdmFsdWUgJiYgYXZfdmFsdWVbMF0gPT09IFwiL1wiID8gYXZfdmFsdWUgOiBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWN1cmUnOiAvLyBTNS4yLjVcbiAgICAgIC8qXG4gICAgICAgKiBcIklmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiU2VjdXJlXCIsXG4gICAgICAgKiB0aGUgdXNlciBhZ2VudCBNVVNUIGFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdFxuICAgICAgICogd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBTZWN1cmUgYW5kIGFuIGVtcHR5IGF0dHJpYnV0ZS12YWx1ZS5cIlxuICAgICAgICovXG4gICAgICBjLnNlY3VyZSA9IHRydWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2h0dHBvbmx5JzogLy8gUzUuMi42IC0tIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzICdzZWN1cmUnXG4gICAgICBjLmh0dHBPbmx5ID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGMuZXh0ZW5zaW9ucyA9IGMuZXh0ZW5zaW9ucyB8fCBbXTtcbiAgICAgIGMuZXh0ZW5zaW9ucy5wdXNoKGF2KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjO1xufVxuXG4vLyBhdm9pZCB0aGUgVjggZGVvcHRpbWl6YXRpb24gbW9uc3RlciFcbmZ1bmN0aW9uIGpzb25QYXJzZShzdHIpIHtcbiAgdmFyIG9iajtcbiAgdHJ5IHtcbiAgICBvYmogPSBKU09OLnBhcnNlKHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBmcm9tSlNPTihzdHIpIHtcbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvYmo7XG4gIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIG9iaiA9IGpzb25QYXJzZShzdHIpO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGFzc3VtZSBpdCdzIGFuIE9iamVjdFxuICAgIG9iaiA9IHN0cjtcbiAgfVxuXG4gIHZhciBjID0gbmV3IENvb2tpZSgpO1xuICBmb3IgKHZhciBpPTA7IGk8Q29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IENvb2tpZS5zZXJpYWxpemFibGVQcm9wZXJ0aWVzW2ldO1xuICAgIGlmIChvYmpbcHJvcF0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBvYmpbcHJvcF0gPT09IENvb2tpZS5wcm90b3R5cGVbcHJvcF0pXG4gICAge1xuICAgICAgY29udGludWU7IC8vIGxlYXZlIGFzIHByb3RvdHlwZSBkZWZhdWx0XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdleHBpcmVzJyB8fFxuICAgICAgICBwcm9wID09PSAnY3JlYXRpb24nIHx8XG4gICAgICAgIHByb3AgPT09ICdsYXN0QWNjZXNzZWQnKVxuICAgIHtcbiAgICAgIGlmIChvYmpbcHJvcF0gPT09IG51bGwpIHtcbiAgICAgICAgY1twcm9wXSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjW3Byb3BdID0gb2JqW3Byb3BdID09IFwiSW5maW5pdHlcIiA/XG4gICAgICAgICAgXCJJbmZpbml0eVwiIDogbmV3IERhdGUob2JqW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY1twcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuLyogU2VjdGlvbiA1LjQgcGFydCAyOlxuICogXCIqICBDb29raWVzIHdpdGggbG9uZ2VyIHBhdGhzIGFyZSBsaXN0ZWQgYmVmb3JlIGNvb2tpZXMgd2l0aFxuICogICAgIHNob3J0ZXIgcGF0aHMuXG4gKlxuICogICogIEFtb25nIGNvb2tpZXMgdGhhdCBoYXZlIGVxdWFsLWxlbmd0aCBwYXRoIGZpZWxkcywgY29va2llcyB3aXRoXG4gKiAgICAgZWFybGllciBjcmVhdGlvbi10aW1lcyBhcmUgbGlzdGVkIGJlZm9yZSBjb29raWVzIHdpdGggbGF0ZXJcbiAqICAgICBjcmVhdGlvbi10aW1lcy5cIlxuICovXG5cbmZ1bmN0aW9uIGNvb2tpZUNvbXBhcmUoYSxiKSB7XG4gIHZhciBjbXAgPSAwO1xuXG4gIC8vIGRlc2NlbmRpbmcgZm9yIGxlbmd0aDogYiBDTVAgYVxuICB2YXIgYVBhdGhMZW4gPSBhLnBhdGggPyBhLnBhdGgubGVuZ3RoIDogMDtcbiAgdmFyIGJQYXRoTGVuID0gYi5wYXRoID8gYi5wYXRoLmxlbmd0aCA6IDA7XG4gIGNtcCA9IGJQYXRoTGVuIC0gYVBhdGhMZW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgLy8gYXNjZW5kaW5nIGZvciB0aW1lOiBhIENNUCBiXG4gIHZhciBhVGltZSA9IGEuY3JlYXRpb24gPyBhLmNyZWF0aW9uLmdldFRpbWUoKSA6IE1BWF9USU1FO1xuICB2YXIgYlRpbWUgPSBiLmNyZWF0aW9uID8gYi5jcmVhdGlvbi5nZXRUaW1lKCkgOiBNQVhfVElNRTtcbiAgY21wID0gYVRpbWUgLSBiVGltZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICAvLyBicmVhayB0aWVzIGZvciB0aGUgc2FtZSBtaWxsaXNlY29uZCAocHJlY2lzaW9uIG9mIEphdmFTY3JpcHQncyBjbG9jaylcbiAgY21wID0gYS5jcmVhdGlvbkluZGV4IC0gYi5jcmVhdGlvbkluZGV4O1xuXG4gIHJldHVybiBjbXA7XG59XG5cbi8vIEdpdmVzIHRoZSBwZXJtdXRhdGlvbiBvZiBhbGwgcG9zc2libGUgcGF0aE1hdGNoKCllcyBvZiBhIGdpdmVuIHBhdGguIFRoZVxuLy8gYXJyYXkgaXMgaW4gbG9uZ2VzdC10by1zaG9ydGVzdCBvcmRlci4gIEhhbmR5IGZvciBpbmRleGluZy5cbmZ1bmN0aW9uIHBlcm11dGVQYXRoKHBhdGgpIHtcbiAgaWYgKHBhdGggPT09ICcvJykge1xuICAgIHJldHVybiBbJy8nXTtcbiAgfVxuICBpZiAocGF0aC5sYXN0SW5kZXhPZignLycpID09PSBwYXRoLmxlbmd0aC0xKSB7XG4gICAgcGF0aCA9IHBhdGguc3Vic3RyKDAscGF0aC5sZW5ndGgtMSk7XG4gIH1cbiAgdmFyIHBlcm11dGF0aW9ucyA9IFtwYXRoXTtcbiAgd2hpbGUgKHBhdGgubGVuZ3RoID4gMSkge1xuICAgIHZhciBsaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgaWYgKGxpbmRleCA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLGxpbmRleCk7XG4gICAgcGVybXV0YXRpb25zLnB1c2gocGF0aCk7XG4gIH1cbiAgcGVybXV0YXRpb25zLnB1c2goJy8nKTtcbiAgcmV0dXJuIHBlcm11dGF0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0Q29va2llQ29udGV4dCh1cmwpIHtcbiAgaWYgKHVybCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgLy8gTk9URTogZGVjb2RlVVJJIHdpbGwgdGhyb3cgb24gbWFsZm9ybWVkIFVSSXMgKHNlZSBHSC0zMikuXG4gIC8vIFRoZXJlZm9yZSwgd2Ugd2lsbCBqdXN0IHNraXAgZGVjb2RpbmcgZm9yIHN1Y2ggVVJJcy5cbiAgdHJ5IHtcbiAgICB1cmwgPSBkZWNvZGVVUkkodXJsKTtcbiAgfVxuICBjYXRjaChlcnIpIHtcbiAgICAvLyBTaWxlbnRseSBzd2FsbG93IGVycm9yXG4gIH1cblxuICByZXR1cm4gdXJsUGFyc2UodXJsKTtcbn1cblxuZnVuY3Rpb24gQ29va2llKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgaWYgKENvb2tpZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocHJvcCkgJiZcbiAgICAgICAgQ29va2llLnByb3RvdHlwZVtwcm9wXSAhPT0gb3B0aW9uc1twcm9wXSAmJlxuICAgICAgICBwcm9wLnN1YnN0cigwLDEpICE9PSAnXycpXG4gICAge1xuICAgICAgdGhpc1twcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gICAgfVxuICB9LCB0aGlzKTtcblxuICB0aGlzLmNyZWF0aW9uID0gdGhpcy5jcmVhdGlvbiB8fCBuZXcgRGF0ZSgpO1xuXG4gIC8vIHVzZWQgdG8gYnJlYWsgY3JlYXRpb24gdGllcyBpbiBjb29raWVDb21wYXJlKCk6XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY3JlYXRpb25JbmRleCcsIHtcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLCAvLyBpbXBvcnRhbnQgZm9yIGFzc2VydC5kZWVwRXF1YWwgY2hlY2tzXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6ICsrQ29va2llLmNvb2tpZXNDcmVhdGVkXG4gIH0pO1xufVxuXG5Db29raWUuY29va2llc0NyZWF0ZWQgPSAwOyAvLyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBjb29raWUgaXMgY3JlYXRlZFxuXG5Db29raWUucGFyc2UgPSBwYXJzZTtcbkNvb2tpZS5mcm9tSlNPTiA9IGZyb21KU09OO1xuXG5Db29raWUucHJvdG90eXBlLmtleSA9IFwiXCI7XG5Db29raWUucHJvdG90eXBlLnZhbHVlID0gXCJcIjtcblxuLy8gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBSRkMgaGFzIHRoZW06XG5Db29raWUucHJvdG90eXBlLmV4cGlyZXMgPSBcIkluZmluaXR5XCI7IC8vIGNvZXJjZXMgdG8gbGl0ZXJhbCBJbmZpbml0eVxuQ29va2llLnByb3RvdHlwZS5tYXhBZ2UgPSBudWxsOyAvLyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXhwaXJlcyBmb3IgVFRMXG5Db29raWUucHJvdG90eXBlLmRvbWFpbiA9IG51bGw7XG5Db29raWUucHJvdG90eXBlLnBhdGggPSBudWxsO1xuQ29va2llLnByb3RvdHlwZS5zZWN1cmUgPSBmYWxzZTtcbkNvb2tpZS5wcm90b3R5cGUuaHR0cE9ubHkgPSBmYWxzZTtcbkNvb2tpZS5wcm90b3R5cGUuZXh0ZW5zaW9ucyA9IG51bGw7XG5cbi8vIHNldCBieSB0aGUgQ29va2llSmFyOlxuQ29va2llLnByb3RvdHlwZS5ob3N0T25seSA9IG51bGw7IC8vIGJvb2xlYW4gd2hlbiBzZXRcbkNvb2tpZS5wcm90b3R5cGUucGF0aElzRGVmYXVsdCA9IG51bGw7IC8vIGJvb2xlYW4gd2hlbiBzZXRcbkNvb2tpZS5wcm90b3R5cGUuY3JlYXRpb24gPSBudWxsOyAvLyBEYXRlIHdoZW4gc2V0OyBkZWZhdWx0ZWQgYnkgQ29va2llLnBhcnNlXG5Db29raWUucHJvdG90eXBlLmxhc3RBY2Nlc3NlZCA9IG51bGw7IC8vIERhdGUgd2hlbiBzZXRcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb29raWUucHJvdG90eXBlLCAnY3JlYXRpb25JbmRleCcsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiAwXG59KTtcblxuQ29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhDb29raWUucHJvdG90eXBlKVxuICAuZmlsdGVyKGZ1bmN0aW9uKHByb3ApIHtcbiAgICByZXR1cm4gIShcbiAgICAgIENvb2tpZS5wcm90b3R5cGVbcHJvcF0gaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuICAgICAgcHJvcCA9PT0gJ2NyZWF0aW9uSW5kZXgnIHx8XG4gICAgICBwcm9wLnN1YnN0cigwLDEpID09PSAnXydcbiAgICApO1xuICB9KTtcblxuQ29va2llLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiAnQ29va2llPVwiJyt0aGlzLnRvU3RyaW5nKCkgK1xuICAgICc7IGhvc3RPbmx5PScrKHRoaXMuaG9zdE9ubHkgIT0gbnVsbCA/IHRoaXMuaG9zdE9ubHkgOiAnPycpICtcbiAgICAnOyBhQWdlPScrKHRoaXMubGFzdEFjY2Vzc2VkID8gKG5vdy10aGlzLmxhc3RBY2Nlc3NlZC5nZXRUaW1lKCkpKydtcycgOiAnPycpICtcbiAgICAnOyBjQWdlPScrKHRoaXMuY3JlYXRpb24gPyAobm93LXRoaXMuY3JlYXRpb24uZ2V0VGltZSgpKSsnbXMnIDogJz8nKSArXG4gICAgJ1wiJztcbn07XG5cbi8vIFVzZSB0aGUgbmV3IGN1c3RvbSBpbnNwZWN0aW9uIHN5bWJvbCB0byBhZGQgdGhlIGN1c3RvbSBpbnNwZWN0IGZ1bmN0aW9uIGlmXG4vLyBhdmFpbGFibGUuXG5pZiAodXRpbC5pbnNwZWN0LmN1c3RvbSkge1xuICBDb29raWUucHJvdG90eXBlW3V0aWwuaW5zcGVjdC5jdXN0b21dID0gQ29va2llLnByb3RvdHlwZS5pbnNwZWN0O1xufVxuXG5Db29raWUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgb2JqID0ge307XG5cbiAgdmFyIHByb3BzID0gQ29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXM7XG4gIGZvciAodmFyIGk9MDsgaTxwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgaWYgKHRoaXNbcHJvcF0gPT09IENvb2tpZS5wcm90b3R5cGVbcHJvcF0pIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBsZWF2ZSBhcyBwcm90b3R5cGUgZGVmYXVsdFxuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnZXhwaXJlcycgfHxcbiAgICAgICAgcHJvcCA9PT0gJ2NyZWF0aW9uJyB8fFxuICAgICAgICBwcm9wID09PSAnbGFzdEFjY2Vzc2VkJylcbiAgICB7XG4gICAgICBpZiAodGhpc1twcm9wXSA9PT0gbnVsbCkge1xuICAgICAgICBvYmpbcHJvcF0gPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW3Byb3BdID0gdGhpc1twcm9wXSA9PSBcIkluZmluaXR5XCIgPyAvLyBpbnRlbnRpb25hbGx5IG5vdCA9PT1cbiAgICAgICAgICBcIkluZmluaXR5XCIgOiB0aGlzW3Byb3BdLnRvSVNPU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wID09PSAnbWF4QWdlJykge1xuICAgICAgaWYgKHRoaXNbcHJvcF0gIT09IG51bGwpIHtcbiAgICAgICAgLy8gYWdhaW4sIGludGVudGlvbmFsbHkgbm90ID09PVxuICAgICAgICBvYmpbcHJvcF0gPSAodGhpc1twcm9wXSA9PSBJbmZpbml0eSB8fCB0aGlzW3Byb3BdID09IC1JbmZpbml0eSkgP1xuICAgICAgICAgIHRoaXNbcHJvcF0udG9TdHJpbmcoKSA6IHRoaXNbcHJvcF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzW3Byb3BdICE9PSBDb29raWUucHJvdG90eXBlW3Byb3BdKSB7XG4gICAgICAgIG9ialtwcm9wXSA9IHRoaXNbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbkNvb2tpZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGZyb21KU09OKHRoaXMudG9KU09OKCkpO1xufTtcblxuQ29va2llLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICBpZiAoIUNPT0tJRV9PQ1RFVFMudGVzdCh0aGlzLnZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodGhpcy5leHBpcmVzICE9IEluZmluaXR5ICYmICEodGhpcy5leHBpcmVzIGluc3RhbmNlb2YgRGF0ZSkgJiYgIXBhcnNlRGF0ZSh0aGlzLmV4cGlyZXMpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0aGlzLm1heEFnZSAhPSBudWxsICYmIHRoaXMubWF4QWdlIDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIFwiTWF4LUFnZT1cIiBub24temVyby1kaWdpdCAqRElHSVRcbiAgfVxuICBpZiAodGhpcy5wYXRoICE9IG51bGwgJiYgIVBBVEhfVkFMVUUudGVzdCh0aGlzLnBhdGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGNkb21haW4gPSB0aGlzLmNkb21haW4oKTtcbiAgaWYgKGNkb21haW4pIHtcbiAgICBpZiAoY2RvbWFpbi5tYXRjaCgvXFwuJC8pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIFM0LjEuMi4zIHN1Z2dlc3RzIHRoYXQgdGhpcyBpcyBiYWQuIGRvbWFpbk1hdGNoKCkgdGVzdHMgY29uZmlybSB0aGlzXG4gICAgfVxuICAgIHZhciBzdWZmaXggPSBwdWJzdWZmaXguZ2V0UHVibGljU3VmZml4KGNkb21haW4pO1xuICAgIGlmIChzdWZmaXggPT0gbnVsbCkgeyAvLyBpdCdzIGEgcHVibGljIHN1ZmZpeFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkNvb2tpZS5wcm90b3R5cGUuc2V0RXhwaXJlcyA9IGZ1bmN0aW9uIHNldEV4cGlyZXMoZXhwKSB7XG4gIGlmIChleHAgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgdGhpcy5leHBpcmVzID0gZXhwO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZXhwaXJlcyA9IHBhcnNlRGF0ZShleHApIHx8IFwiSW5maW5pdHlcIjtcbiAgfVxufTtcblxuQ29va2llLnByb3RvdHlwZS5zZXRNYXhBZ2UgPSBmdW5jdGlvbiBzZXRNYXhBZ2UoYWdlKSB7XG4gIGlmIChhZ2UgPT09IEluZmluaXR5IHx8IGFnZSA9PT0gLUluZmluaXR5KSB7XG4gICAgdGhpcy5tYXhBZ2UgPSBhZ2UudG9TdHJpbmcoKTsgLy8gc28gSlNPTi5zdHJpbmdpZnkoKSB3b3Jrc1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWF4QWdlID0gYWdlO1xuICB9XG59O1xuXG4vLyBnaXZlcyBDb29raWUgaGVhZGVyIGZvcm1hdFxuQ29va2llLnByb3RvdHlwZS5jb29raWVTdHJpbmcgPSBmdW5jdGlvbiBjb29raWVTdHJpbmcoKSB7XG4gIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICBpZiAodmFsID09IG51bGwpIHtcbiAgICB2YWwgPSAnJztcbiAgfVxuICBpZiAodGhpcy5rZXkgPT09ICcnKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICByZXR1cm4gdGhpcy5rZXkrJz0nK3ZhbDtcbn07XG5cbi8vIGdpdmVzIFNldC1Db29raWUgaGVhZGVyIGZvcm1hdFxuQ29va2llLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gdGhpcy5jb29raWVTdHJpbmcoKTtcblxuICBpZiAodGhpcy5leHBpcmVzICE9IEluZmluaXR5KSB7XG4gICAgaWYgKHRoaXMuZXhwaXJlcyBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHN0ciArPSAnOyBFeHBpcmVzPScrZm9ybWF0RGF0ZSh0aGlzLmV4cGlyZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJzsgRXhwaXJlcz0nK3RoaXMuZXhwaXJlcztcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5tYXhBZ2UgIT0gbnVsbCAmJiB0aGlzLm1heEFnZSAhPSBJbmZpbml0eSkge1xuICAgIHN0ciArPSAnOyBNYXgtQWdlPScrdGhpcy5tYXhBZ2U7XG4gIH1cblxuICBpZiAodGhpcy5kb21haW4gJiYgIXRoaXMuaG9zdE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgRG9tYWluPScrdGhpcy5kb21haW47XG4gIH1cbiAgaWYgKHRoaXMucGF0aCkge1xuICAgIHN0ciArPSAnOyBQYXRoPScrdGhpcy5wYXRoO1xuICB9XG5cbiAgaWYgKHRoaXMuc2VjdXJlKSB7XG4gICAgc3RyICs9ICc7IFNlY3VyZSc7XG4gIH1cbiAgaWYgKHRoaXMuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICB9XG4gIGlmICh0aGlzLmV4dGVuc2lvbnMpIHtcbiAgICB0aGlzLmV4dGVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbihleHQpIHtcbiAgICAgIHN0ciArPSAnOyAnK2V4dDtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59O1xuXG4vLyBUVEwoKSBwYXJ0aWFsbHkgcmVwbGFjZXMgdGhlIFwiZXhwaXJ5LXRpbWVcIiBwYXJ0cyBvZiBTNS4zIHN0ZXAgMyAoc2V0Q29va2llKClcbi8vIGVsc2V3aGVyZSlcbi8vIFM1LjMgc2F5cyB0byBnaXZlIHRoZSBcImxhdGVzdCByZXByZXNlbnRhYmxlIGRhdGVcIiBmb3Igd2hpY2ggd2UgdXNlIEluZmluaXR5XG4vLyBGb3IgXCJleHBpcmVkXCIgd2UgdXNlIDBcbkNvb2tpZS5wcm90b3R5cGUuVFRMID0gZnVuY3Rpb24gVFRMKG5vdykge1xuICAvKiBSRkM2MjY1IFM0LjEuMi4yIElmIGEgY29va2llIGhhcyBib3RoIHRoZSBNYXgtQWdlIGFuZCB0aGUgRXhwaXJlc1xuICAgKiBhdHRyaWJ1dGUsIHRoZSBNYXgtQWdlIGF0dHJpYnV0ZSBoYXMgcHJlY2VkZW5jZSBhbmQgY29udHJvbHMgdGhlXG4gICAqIGV4cGlyYXRpb24gZGF0ZSBvZiB0aGUgY29va2llLlxuICAgKiAoQ29uY3VycyB3aXRoIFM1LjMgc3RlcCAzKVxuICAgKi9cbiAgaWYgKHRoaXMubWF4QWdlICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhBZ2U8PTAgPyAwIDogdGhpcy5tYXhBZ2UqMTAwMDtcbiAgfVxuXG4gIHZhciBleHBpcmVzID0gdGhpcy5leHBpcmVzO1xuICBpZiAoZXhwaXJlcyAhPSBJbmZpbml0eSkge1xuICAgIGlmICghKGV4cGlyZXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgZXhwaXJlcyA9IHBhcnNlRGF0ZShleHBpcmVzKSB8fCBJbmZpbml0eTtcbiAgICB9XG5cbiAgICBpZiAoZXhwaXJlcyA9PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgIH1cblxuICAgIHJldHVybiBleHBpcmVzLmdldFRpbWUoKSAtIChub3cgfHwgRGF0ZS5ub3coKSk7XG4gIH1cblxuICByZXR1cm4gSW5maW5pdHk7XG59O1xuXG4vLyBleHBpcnlUaW1lKCkgcmVwbGFjZXMgdGhlIFwiZXhwaXJ5LXRpbWVcIiBwYXJ0cyBvZiBTNS4zIHN0ZXAgMyAoc2V0Q29va2llKClcbi8vIGVsc2V3aGVyZSlcbkNvb2tpZS5wcm90b3R5cGUuZXhwaXJ5VGltZSA9IGZ1bmN0aW9uIGV4cGlyeVRpbWUobm93KSB7XG4gIGlmICh0aGlzLm1heEFnZSAhPSBudWxsKSB7XG4gICAgdmFyIHJlbGF0aXZlVG8gPSBub3cgfHwgdGhpcy5jcmVhdGlvbiB8fCBuZXcgRGF0ZSgpO1xuICAgIHZhciBhZ2UgPSAodGhpcy5tYXhBZ2UgPD0gMCkgPyAtSW5maW5pdHkgOiB0aGlzLm1heEFnZSoxMDAwO1xuICAgIHJldHVybiByZWxhdGl2ZVRvLmdldFRpbWUoKSArIGFnZTtcbiAgfVxuXG4gIGlmICh0aGlzLmV4cGlyZXMgPT0gSW5maW5pdHkpIHtcbiAgICByZXR1cm4gSW5maW5pdHk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZXhwaXJlcy5nZXRUaW1lKCk7XG59O1xuXG4vLyBleHBpcnlEYXRlKCkgcmVwbGFjZXMgdGhlIFwiZXhwaXJ5LXRpbWVcIiBwYXJ0cyBvZiBTNS4zIHN0ZXAgMyAoc2V0Q29va2llKClcbi8vIGVsc2V3aGVyZSksIGV4Y2VwdCBpdCByZXR1cm5zIGEgRGF0ZVxuQ29va2llLnByb3RvdHlwZS5leHBpcnlEYXRlID0gZnVuY3Rpb24gZXhwaXJ5RGF0ZShub3cpIHtcbiAgdmFyIG1pbGxpc2VjID0gdGhpcy5leHBpcnlUaW1lKG5vdyk7XG4gIGlmIChtaWxsaXNlYyA9PSBJbmZpbml0eSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShNQVhfVElNRSk7XG4gIH0gZWxzZSBpZiAobWlsbGlzZWMgPT0gLUluZmluaXR5KSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE1JTl9USU1FKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IERhdGUobWlsbGlzZWMpO1xuICB9XG59O1xuXG4vLyBUaGlzIHJlcGxhY2VzIHRoZSBcInBlcnNpc3RlbnQtZmxhZ1wiIHBhcnRzIG9mIFM1LjMgc3RlcCAzXG5Db29raWUucHJvdG90eXBlLmlzUGVyc2lzdGVudCA9IGZ1bmN0aW9uIGlzUGVyc2lzdGVudCgpIHtcbiAgcmV0dXJuICh0aGlzLm1heEFnZSAhPSBudWxsIHx8IHRoaXMuZXhwaXJlcyAhPSBJbmZpbml0eSk7XG59O1xuXG4vLyBNb3N0bHkgUzUuMS4yIGFuZCBTNS4yLjM6XG5Db29raWUucHJvdG90eXBlLmNkb21haW4gPVxuQ29va2llLnByb3RvdHlwZS5jYW5vbmljYWxpemVkRG9tYWluID0gZnVuY3Rpb24gY2Fub25pY2FsaXplZERvbWFpbigpIHtcbiAgaWYgKHRoaXMuZG9tYWluID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gY2Fub25pY2FsRG9tYWluKHRoaXMuZG9tYWluKTtcbn07XG5cbmZ1bmN0aW9uIENvb2tpZUphcihzdG9yZSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgb3B0aW9ucyA9IHtyZWplY3RQdWJsaWNTdWZmaXhlczogb3B0aW9uc307XG4gIH0gZWxzZSBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmIChvcHRpb25zLnJlamVjdFB1YmxpY1N1ZmZpeGVzICE9IG51bGwpIHtcbiAgICB0aGlzLnJlamVjdFB1YmxpY1N1ZmZpeGVzID0gb3B0aW9ucy5yZWplY3RQdWJsaWNTdWZmaXhlcztcbiAgfVxuICBpZiAob3B0aW9ucy5sb29zZU1vZGUgIT0gbnVsbCkge1xuICAgIHRoaXMuZW5hYmxlTG9vc2VNb2RlID0gb3B0aW9ucy5sb29zZU1vZGU7XG4gIH1cblxuICBpZiAoIXN0b3JlKSB7XG4gICAgc3RvcmUgPSBuZXcgTWVtb3J5Q29va2llU3RvcmUoKTtcbiAgfVxuICB0aGlzLnN0b3JlID0gc3RvcmU7XG59XG5Db29raWVKYXIucHJvdG90eXBlLnN0b3JlID0gbnVsbDtcbkNvb2tpZUphci5wcm90b3R5cGUucmVqZWN0UHVibGljU3VmZml4ZXMgPSB0cnVlO1xuQ29va2llSmFyLnByb3RvdHlwZS5lbmFibGVMb29zZU1vZGUgPSBmYWxzZTtcbnZhciBDQU5fQkVfU1lOQyA9IFtdO1xuXG5DQU5fQkVfU1lOQy5wdXNoKCdzZXRDb29raWUnKTtcbkNvb2tpZUphci5wcm90b3R5cGUuc2V0Q29va2llID0gZnVuY3Rpb24oY29va2llLCB1cmwsIG9wdGlvbnMsIGNiKSB7XG4gIHZhciBlcnI7XG4gIHZhciBjb250ZXh0ID0gZ2V0Q29va2llQ29udGV4dCh1cmwpO1xuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgY2IgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBob3N0ID0gY2Fub25pY2FsRG9tYWluKGNvbnRleHQuaG9zdG5hbWUpO1xuICB2YXIgbG9vc2UgPSB0aGlzLmVuYWJsZUxvb3NlTW9kZTtcbiAgaWYgKG9wdGlvbnMubG9vc2UgIT0gbnVsbCkge1xuICAgIGxvb3NlID0gb3B0aW9ucy5sb29zZTtcbiAgfVxuXG4gIC8vIFM1LjMgc3RlcCAxXG4gIGlmICghKGNvb2tpZSBpbnN0YW5jZW9mIENvb2tpZSkpIHtcbiAgICBjb29raWUgPSBDb29raWUucGFyc2UoY29va2llLCB7IGxvb3NlOiBsb29zZSB9KTtcbiAgfVxuICBpZiAoIWNvb2tpZSkge1xuICAgIGVyciA9IG5ldyBFcnJvcihcIkNvb2tpZSBmYWlsZWQgdG8gcGFyc2VcIik7XG4gICAgcmV0dXJuIGNiKG9wdGlvbnMuaWdub3JlRXJyb3IgPyBudWxsIDogZXJyKTtcbiAgfVxuXG4gIC8vIFM1LjMgc3RlcCAyXG4gIHZhciBub3cgPSBvcHRpb25zLm5vdyB8fCBuZXcgRGF0ZSgpOyAvLyB3aWxsIGFzc2lnbiBsYXRlciB0byBzYXZlIGVmZm9ydCBpbiB0aGUgZmFjZSBvZiBlcnJvcnNcblxuICAvLyBTNS4zIHN0ZXAgMzogTk9PUDsgcGVyc2lzdGVudC1mbGFnIGFuZCBleHBpcnktdGltZSBpcyBoYW5kbGVkIGJ5IGdldENvb2tpZSgpXG5cbiAgLy8gUzUuMyBzdGVwIDQ6IE5PT1A7IGRvbWFpbiBpcyBudWxsIGJ5IGRlZmF1bHRcblxuICAvLyBTNS4zIHN0ZXAgNTogcHVibGljIHN1ZmZpeGVzXG4gIGlmICh0aGlzLnJlamVjdFB1YmxpY1N1ZmZpeGVzICYmIGNvb2tpZS5kb21haW4pIHtcbiAgICB2YXIgc3VmZml4ID0gcHVic3VmZml4LmdldFB1YmxpY1N1ZmZpeChjb29raWUuY2RvbWFpbigpKTtcbiAgICBpZiAoc3VmZml4ID09IG51bGwpIHsgLy8gZS5nLiBcImNvbVwiXG4gICAgICBlcnIgPSBuZXcgRXJyb3IoXCJDb29raWUgaGFzIGRvbWFpbiBzZXQgdG8gYSBwdWJsaWMgc3VmZml4XCIpO1xuICAgICAgcmV0dXJuIGNiKG9wdGlvbnMuaWdub3JlRXJyb3IgPyBudWxsIDogZXJyKTtcbiAgICB9XG4gIH1cblxuICAvLyBTNS4zIHN0ZXAgNjpcbiAgaWYgKGNvb2tpZS5kb21haW4pIHtcbiAgICBpZiAoIWRvbWFpbk1hdGNoKGhvc3QsIGNvb2tpZS5jZG9tYWluKCksIGZhbHNlKSkge1xuICAgICAgZXJyID0gbmV3IEVycm9yKFwiQ29va2llIG5vdCBpbiB0aGlzIGhvc3QncyBkb21haW4uIENvb2tpZTpcIitjb29raWUuY2RvbWFpbigpK1wiIFJlcXVlc3Q6XCIraG9zdCk7XG4gICAgICByZXR1cm4gY2Iob3B0aW9ucy5pZ25vcmVFcnJvciA/IG51bGwgOiBlcnIpO1xuICAgIH1cblxuICAgIGlmIChjb29raWUuaG9zdE9ubHkgPT0gbnVsbCkgeyAvLyBkb24ndCByZXNldCBpZiBhbHJlYWR5IHNldFxuICAgICAgY29va2llLmhvc3RPbmx5ID0gZmFsc2U7XG4gICAgfVxuXG4gIH0gZWxzZSB7XG4gICAgY29va2llLmhvc3RPbmx5ID0gdHJ1ZTtcbiAgICBjb29raWUuZG9tYWluID0gaG9zdDtcbiAgfVxuXG4gIC8vUzUuMi40IElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgZW1wdHkgb3IgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGVcbiAgLy9hdHRyaWJ1dGUtdmFsdWUgaXMgbm90ICV4MkYgKFwiL1wiKTpcbiAgLy9MZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0aC5cbiAgaWYgKCFjb29raWUucGF0aCB8fCBjb29raWUucGF0aFswXSAhPT0gJy8nKSB7XG4gICAgY29va2llLnBhdGggPSBkZWZhdWx0UGF0aChjb250ZXh0LnBhdGhuYW1lKTtcbiAgICBjb29raWUucGF0aElzRGVmYXVsdCA9IHRydWU7XG4gIH1cblxuICAvLyBTNS4zIHN0ZXAgODogTk9PUDsgc2VjdXJlIGF0dHJpYnV0ZVxuICAvLyBTNS4zIHN0ZXAgOTogTk9PUDsgaHR0cE9ubHkgYXR0cmlidXRlXG5cbiAgLy8gUzUuMyBzdGVwIDEwXG4gIGlmIChvcHRpb25zLmh0dHAgPT09IGZhbHNlICYmIGNvb2tpZS5odHRwT25seSkge1xuICAgIGVyciA9IG5ldyBFcnJvcihcIkNvb2tpZSBpcyBIdHRwT25seSBhbmQgdGhpcyBpc24ndCBhbiBIVFRQIEFQSVwiKTtcbiAgICByZXR1cm4gY2Iob3B0aW9ucy5pZ25vcmVFcnJvciA/IG51bGwgOiBlcnIpO1xuICB9XG5cbiAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcblxuICBpZiAoIXN0b3JlLnVwZGF0ZUNvb2tpZSkge1xuICAgIHN0b3JlLnVwZGF0ZUNvb2tpZSA9IGZ1bmN0aW9uKG9sZENvb2tpZSwgbmV3Q29va2llLCBjYikge1xuICAgICAgdGhpcy5wdXRDb29raWUobmV3Q29va2llLCBjYik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpdGhDb29raWUoZXJyLCBvbGRDb29raWUpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dCA9IGZ1bmN0aW9uKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNiKG51bGwsIGNvb2tpZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChvbGRDb29raWUpIHtcbiAgICAgIC8vIFM1LjMgc3RlcCAxMSAtIFwiSWYgdGhlIGNvb2tpZSBzdG9yZSBjb250YWlucyBhIGNvb2tpZSB3aXRoIHRoZSBzYW1lIG5hbWUsXG4gICAgICAvLyBkb21haW4sIGFuZCBwYXRoIGFzIHRoZSBuZXdseSBjcmVhdGVkIGNvb2tpZTpcIlxuICAgICAgaWYgKG9wdGlvbnMuaHR0cCA9PT0gZmFsc2UgJiYgb2xkQ29va2llLmh0dHBPbmx5KSB7IC8vIHN0ZXAgMTEuMlxuICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXCJvbGQgQ29va2llIGlzIEh0dHBPbmx5IGFuZCB0aGlzIGlzbid0IGFuIEhUVFAgQVBJXCIpO1xuICAgICAgICByZXR1cm4gY2Iob3B0aW9ucy5pZ25vcmVFcnJvciA/IG51bGwgOiBlcnIpO1xuICAgICAgfVxuICAgICAgY29va2llLmNyZWF0aW9uID0gb2xkQ29va2llLmNyZWF0aW9uOyAvLyBzdGVwIDExLjNcbiAgICAgIGNvb2tpZS5jcmVhdGlvbkluZGV4ID0gb2xkQ29va2llLmNyZWF0aW9uSW5kZXg7IC8vIHByZXNlcnZlIHRpZS1icmVha2VyXG4gICAgICBjb29raWUubGFzdEFjY2Vzc2VkID0gbm93O1xuICAgICAgLy8gU3RlcCAxMS40IChkZWxldGUgY29va2llKSBpcyBpbXBsaWVkIGJ5IGp1c3Qgc2V0dGluZyB0aGUgbmV3IG9uZTpcbiAgICAgIHN0b3JlLnVwZGF0ZUNvb2tpZShvbGRDb29raWUsIGNvb2tpZSwgbmV4dCk7IC8vIHN0ZXAgMTJcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb29raWUuY3JlYXRpb24gPSBjb29raWUubGFzdEFjY2Vzc2VkID0gbm93O1xuICAgICAgc3RvcmUucHV0Q29va2llKGNvb2tpZSwgbmV4dCk7IC8vIHN0ZXAgMTJcbiAgICB9XG4gIH1cblxuICBzdG9yZS5maW5kQ29va2llKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUua2V5LCB3aXRoQ29va2llKTtcbn07XG5cbi8vIFJGQzYzNjUgUzUuNFxuQ0FOX0JFX1NZTkMucHVzaCgnZ2V0Q29va2llcycpO1xuQ29va2llSmFyLnByb3RvdHlwZS5nZXRDb29raWVzID0gZnVuY3Rpb24odXJsLCBvcHRpb25zLCBjYikge1xuICB2YXIgY29udGV4dCA9IGdldENvb2tpZUNvbnRleHQodXJsKTtcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIGNiID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgaG9zdCA9IGNhbm9uaWNhbERvbWFpbihjb250ZXh0Lmhvc3RuYW1lKTtcbiAgdmFyIHBhdGggPSBjb250ZXh0LnBhdGhuYW1lIHx8ICcvJztcblxuICB2YXIgc2VjdXJlID0gb3B0aW9ucy5zZWN1cmU7XG4gIGlmIChzZWN1cmUgPT0gbnVsbCAmJiBjb250ZXh0LnByb3RvY29sICYmXG4gICAgICAoY29udGV4dC5wcm90b2NvbCA9PSAnaHR0cHM6JyB8fCBjb250ZXh0LnByb3RvY29sID09ICd3c3M6JykpXG4gIHtcbiAgICBzZWN1cmUgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGh0dHAgPSBvcHRpb25zLmh0dHA7XG4gIGlmIChodHRwID09IG51bGwpIHtcbiAgICBodHRwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBub3cgPSBvcHRpb25zLm5vdyB8fCBEYXRlLm5vdygpO1xuICB2YXIgZXhwaXJlQ2hlY2sgPSBvcHRpb25zLmV4cGlyZSAhPT0gZmFsc2U7XG4gIHZhciBhbGxQYXRocyA9ICEhb3B0aW9ucy5hbGxQYXRocztcbiAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcblxuICBmdW5jdGlvbiBtYXRjaGluZ0Nvb2tpZShjKSB7XG4gICAgLy8gXCJFaXRoZXI6XG4gICAgLy8gICBUaGUgY29va2llJ3MgaG9zdC1vbmx5LWZsYWcgaXMgdHJ1ZSBhbmQgdGhlIGNhbm9uaWNhbGl6ZWRcbiAgICAvLyAgIHJlcXVlc3QtaG9zdCBpcyBpZGVudGljYWwgdG8gdGhlIGNvb2tpZSdzIGRvbWFpbi5cbiAgICAvLyBPcjpcbiAgICAvLyAgIFRoZSBjb29raWUncyBob3N0LW9ubHktZmxhZyBpcyBmYWxzZSBhbmQgdGhlIGNhbm9uaWNhbGl6ZWRcbiAgICAvLyAgIHJlcXVlc3QtaG9zdCBkb21haW4tbWF0Y2hlcyB0aGUgY29va2llJ3MgZG9tYWluLlwiXG4gICAgaWYgKGMuaG9zdE9ubHkpIHtcbiAgICAgIGlmIChjLmRvbWFpbiAhPSBob3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFkb21haW5NYXRjaChob3N0LCBjLmRvbWFpbiwgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcIlRoZSByZXF1ZXN0LXVyaSdzIHBhdGggcGF0aC1tYXRjaGVzIHRoZSBjb29raWUncyBwYXRoLlwiXG4gICAgaWYgKCFhbGxQYXRocyAmJiAhcGF0aE1hdGNoKHBhdGgsIGMucGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBcIklmIHRoZSBjb29raWUncyBzZWN1cmUtb25seS1mbGFnIGlzIHRydWUsIHRoZW4gdGhlIHJlcXVlc3QtdXJpJ3NcbiAgICAvLyBzY2hlbWUgbXVzdCBkZW5vdGUgYSBcInNlY3VyZVwiIHByb3RvY29sXCJcbiAgICBpZiAoYy5zZWN1cmUgJiYgIXNlY3VyZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFwiSWYgdGhlIGNvb2tpZSdzIGh0dHAtb25seS1mbGFnIGlzIHRydWUsIHRoZW4gZXhjbHVkZSB0aGUgY29va2llIGlmIHRoZVxuICAgIC8vIGNvb2tpZS1zdHJpbmcgaXMgYmVpbmcgZ2VuZXJhdGVkIGZvciBhIFwibm9uLUhUVFBcIiBBUElcIlxuICAgIGlmIChjLmh0dHBPbmx5ICYmICFodHRwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gZGVmZXJyZWQgZnJvbSBTNS4zXG4gICAgLy8gbm9uLVJGQzogYWxsb3cgcmV0ZW50aW9uIG9mIGV4cGlyZWQgY29va2llcyBieSBjaG9pY2VcbiAgICBpZiAoZXhwaXJlQ2hlY2sgJiYgYy5leHBpcnlUaW1lKCkgPD0gbm93KSB7XG4gICAgICBzdG9yZS5yZW1vdmVDb29raWUoYy5kb21haW4sIGMucGF0aCwgYy5rZXksIGZ1bmN0aW9uKCl7fSk7IC8vIHJlc3VsdCBpZ25vcmVkXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdG9yZS5maW5kQ29va2llcyhob3N0LCBhbGxQYXRocyA/IG51bGwgOiBwYXRoLCBmdW5jdGlvbihlcnIsY29va2llcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH1cblxuICAgIGNvb2tpZXMgPSBjb29raWVzLmZpbHRlcihtYXRjaGluZ0Nvb2tpZSk7XG5cbiAgICAvLyBzb3J0aW5nIG9mIFM1LjQgcGFydCAyXG4gICAgaWYgKG9wdGlvbnMuc29ydCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvb2tpZXMgPSBjb29raWVzLnNvcnQoY29va2llQ29tcGFyZSk7XG4gICAgfVxuXG4gICAgLy8gUzUuNCBwYXJ0IDNcbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb29raWVzLmZvckVhY2goZnVuY3Rpb24oYykge1xuICAgICAgYy5sYXN0QWNjZXNzZWQgPSBub3c7XG4gICAgfSk7XG4gICAgLy8gVE9ETyBwZXJzaXN0IGxhc3RBY2Nlc3NlZFxuXG4gICAgY2IobnVsbCxjb29raWVzKTtcbiAgfSk7XG59O1xuXG5DQU5fQkVfU1lOQy5wdXNoKCdnZXRDb29raWVTdHJpbmcnKTtcbkNvb2tpZUphci5wcm90b3R5cGUuZ2V0Q29va2llU3RyaW5nID0gZnVuY3Rpb24oLyouLi4sIGNiKi8pIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7XG4gIHZhciBjYiA9IGFyZ3MucG9wKCk7XG4gIHZhciBuZXh0ID0gZnVuY3Rpb24oZXJyLGNvb2tpZXMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYihudWxsLCBjb29raWVzXG4gICAgICAgIC5zb3J0KGNvb2tpZUNvbXBhcmUpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24oYyl7XG4gICAgICAgICAgcmV0dXJuIGMuY29va2llU3RyaW5nKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCc7ICcpKTtcbiAgICB9XG4gIH07XG4gIGFyZ3MucHVzaChuZXh0KTtcbiAgdGhpcy5nZXRDb29raWVzLmFwcGx5KHRoaXMsYXJncyk7XG59O1xuXG5DQU5fQkVfU1lOQy5wdXNoKCdnZXRTZXRDb29raWVTdHJpbmdzJyk7XG5Db29raWVKYXIucHJvdG90eXBlLmdldFNldENvb2tpZVN0cmluZ3MgPSBmdW5jdGlvbigvKi4uLiwgY2IqLykge1xuICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtcbiAgdmFyIGNiID0gYXJncy5wb3AoKTtcbiAgdmFyIG5leHQgPSBmdW5jdGlvbihlcnIsY29va2llcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNiKG51bGwsIGNvb2tpZXMubWFwKGZ1bmN0aW9uKGMpe1xuICAgICAgICByZXR1cm4gYy50b1N0cmluZygpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcbiAgYXJncy5wdXNoKG5leHQpO1xuICB0aGlzLmdldENvb2tpZXMuYXBwbHkodGhpcyxhcmdzKTtcbn07XG5cbkNBTl9CRV9TWU5DLnB1c2goJ3NlcmlhbGl6ZScpO1xuQ29va2llSmFyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbihjYikge1xuICB2YXIgdHlwZSA9IHRoaXMuc3RvcmUuY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgdHlwZSA9IG51bGw7XG4gIH1cblxuICAvLyB1cGRhdGUgUkVBRE1FLm1kIFwiU2VyaWFsaXphdGlvbiBGb3JtYXRcIiBpZiB5b3UgY2hhbmdlIHRoaXMsIHBsZWFzZSFcbiAgdmFyIHNlcmlhbGl6ZWQgPSB7XG4gICAgLy8gVGhlIHZlcnNpb24gb2YgdG91Z2gtY29va2llIHRoYXQgc2VyaWFsaXplZCB0aGlzIGphci4gR2VuZXJhbGx5IGEgZ29vZFxuICAgIC8vIHByYWN0aWNlIHNpbmNlIGZ1dHVyZSB2ZXJzaW9ucyBjYW4gbWFrZSBkYXRhIGltcG9ydCBkZWNpc2lvbnMgYmFzZWQgb25cbiAgICAvLyBrbm93biBwYXN0IGJlaGF2aW9yLiBXaGVuL2lmIHRoaXMgbWF0dGVycywgdXNlIGBzZW12ZXJgLlxuICAgIHZlcnNpb246ICd0b3VnaC1jb29raWVAJytWRVJTSU9OLFxuXG4gICAgLy8gYWRkIHRoZSBzdG9yZSB0eXBlLCB0byBtYWtlIGh1bWFucyBoYXBweTpcbiAgICBzdG9yZVR5cGU6IHR5cGUsXG5cbiAgICAvLyBDb29raWVKYXIgY29uZmlndXJhdGlvbjpcbiAgICByZWplY3RQdWJsaWNTdWZmaXhlczogISF0aGlzLnJlamVjdFB1YmxpY1N1ZmZpeGVzLFxuXG4gICAgLy8gdGhpcyBnZXRzIGZpbGxlZCBmcm9tIGdldEFsbENvb2tpZXM6XG4gICAgY29va2llczogW11cbiAgfTtcblxuICBpZiAoISh0aGlzLnN0b3JlLmdldEFsbENvb2tpZXMgJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuc3RvcmUuZ2V0QWxsQ29va2llcyA9PT0gJ2Z1bmN0aW9uJykpXG4gIHtcbiAgICByZXR1cm4gY2IobmV3IEVycm9yKCdzdG9yZSBkb2VzIG5vdCBzdXBwb3J0IGdldEFsbENvb2tpZXMgYW5kIGNhbm5vdCBiZSBzZXJpYWxpemVkJykpO1xuICB9XG5cbiAgdGhpcy5zdG9yZS5nZXRBbGxDb29raWVzKGZ1bmN0aW9uKGVycixjb29raWVzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplZC5jb29raWVzID0gY29va2llcy5tYXAoZnVuY3Rpb24oY29va2llKSB7XG4gICAgICAvLyBjb252ZXJ0IHRvIHNlcmlhbGl6ZWQgJ3JhdycgY29va2llc1xuICAgICAgY29va2llID0gKGNvb2tpZSBpbnN0YW5jZW9mIENvb2tpZSkgPyBjb29raWUudG9KU09OKCkgOiBjb29raWU7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgaW5kZXggc28gbmV3IG9uZXMgZ2V0IGFzc2lnbmVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICAgIGRlbGV0ZSBjb29raWUuY3JlYXRpb25JbmRleDtcblxuICAgICAgcmV0dXJuIGNvb2tpZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjYihudWxsLCBzZXJpYWxpemVkKTtcbiAgfSk7XG59O1xuXG4vLyB3ZWxsLWtub3duIG5hbWUgdGhhdCBKU09OLnN0cmluZ2lmeSBjYWxsc1xuQ29va2llSmFyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2VyaWFsaXplU3luYygpO1xufTtcblxuLy8gdXNlIHRoZSBjbGFzcyBtZXRob2QgQ29va2llSmFyLmRlc2VyaWFsaXplIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5XG5DQU5fQkVfU1lOQy5wdXNoKCdfaW1wb3J0Q29va2llcycpO1xuQ29va2llSmFyLnByb3RvdHlwZS5faW1wb3J0Q29va2llcyA9IGZ1bmN0aW9uKHNlcmlhbGl6ZWQsIGNiKSB7XG4gIHZhciBqYXIgPSB0aGlzO1xuICB2YXIgY29va2llcyA9IHNlcmlhbGl6ZWQuY29va2llcztcbiAgaWYgKCFjb29raWVzIHx8ICFBcnJheS5pc0FycmF5KGNvb2tpZXMpKSB7XG4gICAgcmV0dXJuIGNiKG5ldyBFcnJvcignc2VyaWFsaXplZCBqYXIgaGFzIG5vIGNvb2tpZXMgYXJyYXknKSk7XG4gIH1cbiAgY29va2llcyA9IGNvb2tpZXMuc2xpY2UoKTsgLy8gZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWxcblxuICBmdW5jdGlvbiBwdXROZXh0KGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH1cblxuICAgIGlmICghY29va2llcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYihlcnIsIGphcik7XG4gICAgfVxuXG4gICAgdmFyIGNvb2tpZTtcbiAgICB0cnkge1xuICAgICAgY29va2llID0gZnJvbUpTT04oY29va2llcy5zaGlmdCgpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gY2IoZSk7XG4gICAgfVxuXG4gICAgaWYgKGNvb2tpZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHB1dE5leHQobnVsbCk7IC8vIHNraXAgdGhpcyBjb29raWVcbiAgICB9XG5cbiAgICBqYXIuc3RvcmUucHV0Q29va2llKGNvb2tpZSwgcHV0TmV4dCk7XG4gIH1cblxuICBwdXROZXh0KCk7XG59O1xuXG5Db29raWVKYXIuZGVzZXJpYWxpemUgPSBmdW5jdGlvbihzdHJPck9iaiwgc3RvcmUsIGNiKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAzKSB7XG4gICAgLy8gc3RvcmUgaXMgb3B0aW9uYWxcbiAgICBjYiA9IHN0b3JlO1xuICAgIHN0b3JlID0gbnVsbDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkO1xuICBpZiAodHlwZW9mIHN0ck9yT2JqID09PSAnc3RyaW5nJykge1xuICAgIHNlcmlhbGl6ZWQgPSBqc29uUGFyc2Uoc3RyT3JPYmopO1xuICAgIGlmIChzZXJpYWxpemVkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBjYihzZXJpYWxpemVkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2VyaWFsaXplZCA9IHN0ck9yT2JqO1xuICB9XG5cbiAgdmFyIGphciA9IG5ldyBDb29raWVKYXIoc3RvcmUsIHNlcmlhbGl6ZWQucmVqZWN0UHVibGljU3VmZml4ZXMpO1xuICBqYXIuX2ltcG9ydENvb2tpZXMoc2VyaWFsaXplZCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfVxuICAgIGNiKG51bGwsIGphcik7XG4gIH0pO1xufTtcblxuQ29va2llSmFyLmRlc2VyaWFsaXplU3luYyA9IGZ1bmN0aW9uKHN0ck9yT2JqLCBzdG9yZSkge1xuICB2YXIgc2VyaWFsaXplZCA9IHR5cGVvZiBzdHJPck9iaiA9PT0gJ3N0cmluZycgP1xuICAgIEpTT04ucGFyc2Uoc3RyT3JPYmopIDogc3RyT3JPYmo7XG4gIHZhciBqYXIgPSBuZXcgQ29va2llSmFyKHN0b3JlLCBzZXJpYWxpemVkLnJlamVjdFB1YmxpY1N1ZmZpeGVzKTtcblxuICAvLyBjYXRjaCB0aGlzIG1pc3Rha2UgZWFybHk6XG4gIGlmICghamFyLnN0b3JlLnN5bmNocm9ub3VzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb29raWVKYXIgc3RvcmUgaXMgbm90IHN5bmNocm9ub3VzOyB1c2UgYXN5bmMgQVBJIGluc3RlYWQuJyk7XG4gIH1cblxuICBqYXIuX2ltcG9ydENvb2tpZXNTeW5jKHNlcmlhbGl6ZWQpO1xuICByZXR1cm4gamFyO1xufTtcbkNvb2tpZUphci5mcm9tSlNPTiA9IENvb2tpZUphci5kZXNlcmlhbGl6ZVN5bmM7XG5cbkNvb2tpZUphci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihuZXdTdG9yZSwgY2IpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBjYiA9IG5ld1N0b3JlO1xuICAgIG5ld1N0b3JlID0gbnVsbDtcbiAgfVxuXG4gIHRoaXMuc2VyaWFsaXplKGZ1bmN0aW9uKGVycixzZXJpYWxpemVkKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfVxuICAgIENvb2tpZUphci5kZXNlcmlhbGl6ZShzZXJpYWxpemVkLCBuZXdTdG9yZSwgY2IpO1xuICB9KTtcbn07XG5cbkNBTl9CRV9TWU5DLnB1c2goJ3JlbW92ZUFsbENvb2tpZXMnKTtcbkNvb2tpZUphci5wcm90b3R5cGUucmVtb3ZlQWxsQ29va2llcyA9IGZ1bmN0aW9uKGNiKSB7XG4gIHZhciBzdG9yZSA9IHRoaXMuc3RvcmU7XG5cbiAgLy8gQ2hlY2sgdGhhdCB0aGUgc3RvcmUgaW1wbGVtZW50cyBpdHMgb3duIHJlbW92ZUFsbENvb2tpZXMoKS4gVGhlIGRlZmF1bHRcbiAgLy8gaW1wbGVtZW50YXRpb24gaW4gU3RvcmUgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIGEgXCJub3RcbiAgLy8gaW1wbGVtZW50ZWRcIiBFcnJvci5cbiAgaWYgKHN0b3JlLnJlbW92ZUFsbENvb2tpZXMgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgc3RvcmUucmVtb3ZlQWxsQ29va2llcyAhPT0gU3RvcmUucHJvdG90eXBlLnJlbW92ZUFsbENvb2tpZXMpXG4gIHtcbiAgICByZXR1cm4gc3RvcmUucmVtb3ZlQWxsQ29va2llcyhjYik7XG4gIH1cblxuICBzdG9yZS5nZXRBbGxDb29raWVzKGZ1bmN0aW9uKGVyciwgY29va2llcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH1cblxuICAgIGlmIChjb29raWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNiKG51bGwpO1xuICAgIH1cblxuICAgIHZhciBjb21wbGV0ZWRDb3VudCA9IDA7XG4gICAgdmFyIHJlbW92ZUVycm9ycyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlQ29va2llQ2IocmVtb3ZlRXJyKSB7XG4gICAgICBpZiAocmVtb3ZlRXJyKSB7XG4gICAgICAgIHJlbW92ZUVycm9ycy5wdXNoKHJlbW92ZUVycik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZENvdW50Kys7XG5cbiAgICAgIGlmIChjb21wbGV0ZWRDb3VudCA9PT0gY29va2llcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGNiKHJlbW92ZUVycm9ycy5sZW5ndGggPyByZW1vdmVFcnJvcnNbMF0gOiBudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb29raWVzLmZvckVhY2goZnVuY3Rpb24oY29va2llKSB7XG4gICAgICBzdG9yZS5yZW1vdmVDb29raWUoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5rZXksIHJlbW92ZUNvb2tpZUNiKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5Db29raWVKYXIucHJvdG90eXBlLl9jbG9uZVN5bmMgPSBzeW5jV3JhcCgnY2xvbmUnKTtcbkNvb2tpZUphci5wcm90b3R5cGUuY2xvbmVTeW5jID0gZnVuY3Rpb24obmV3U3RvcmUpIHtcbiAgaWYgKCFuZXdTdG9yZS5zeW5jaHJvbm91cykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29va2llSmFyIGNsb25lIGRlc3RpbmF0aW9uIHN0b3JlIGlzIG5vdCBzeW5jaHJvbm91czsgdXNlIGFzeW5jIEFQSSBpbnN0ZWFkLicpO1xuICB9XG4gIHJldHVybiB0aGlzLl9jbG9uZVN5bmMobmV3U3RvcmUpO1xufTtcblxuLy8gVXNlIGEgY2xvc3VyZSB0byBwcm92aWRlIGEgdHJ1ZSBpbXBlcmF0aXZlIEFQSSBmb3Igc3luY2hyb25vdXMgc3RvcmVzLlxuZnVuY3Rpb24gc3luY1dyYXAobWV0aG9kKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuc3RvcmUuc3luY2hyb25vdXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29va2llSmFyIHN0b3JlIGlzIG5vdCBzeW5jaHJvbm91czsgdXNlIGFzeW5jIEFQSSBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICB2YXIgc3luY0Vyciwgc3luY1Jlc3VsdDtcbiAgICBhcmdzLnB1c2goZnVuY3Rpb24gc3luY0NiKGVyciwgcmVzdWx0KSB7XG4gICAgICBzeW5jRXJyID0gZXJyO1xuICAgICAgc3luY1Jlc3VsdCA9IHJlc3VsdDtcbiAgICB9KTtcbiAgICB0aGlzW21ldGhvZF0uYXBwbHkodGhpcywgYXJncyk7XG5cbiAgICBpZiAoc3luY0Vycikge1xuICAgICAgdGhyb3cgc3luY0VycjtcbiAgICB9XG4gICAgcmV0dXJuIHN5bmNSZXN1bHQ7XG4gIH07XG59XG5cbi8vIHdyYXAgYWxsIGRlY2xhcmVkIENBTl9CRV9TWU5DIG1ldGhvZHMgaW4gdGhlIHN5bmMgd3JhcHBlclxuQ0FOX0JFX1NZTkMuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgQ29va2llSmFyLnByb3RvdHlwZVttZXRob2QrJ1N5bmMnXSA9IHN5bmNXcmFwKG1ldGhvZCk7XG59KTtcblxuZXhwb3J0cy52ZXJzaW9uID0gVkVSU0lPTjtcbmV4cG9ydHMuQ29va2llSmFyID0gQ29va2llSmFyO1xuZXhwb3J0cy5Db29raWUgPSBDb29raWU7XG5leHBvcnRzLlN0b3JlID0gU3RvcmU7XG5leHBvcnRzLk1lbW9yeUNvb2tpZVN0b3JlID0gTWVtb3J5Q29va2llU3RvcmU7XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmV4cG9ydHMuZm9ybWF0RGF0ZSA9IGZvcm1hdERhdGU7XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLmZyb21KU09OID0gZnJvbUpTT047XG5leHBvcnRzLmRvbWFpbk1hdGNoID0gZG9tYWluTWF0Y2g7XG5leHBvcnRzLmRlZmF1bHRQYXRoID0gZGVmYXVsdFBhdGg7XG5leHBvcnRzLnBhdGhNYXRjaCA9IHBhdGhNYXRjaDtcbmV4cG9ydHMuZ2V0UHVibGljU3VmZml4ID0gcHVic3VmZml4LmdldFB1YmxpY1N1ZmZpeDtcbmV4cG9ydHMuY29va2llQ29tcGFyZSA9IGNvb2tpZUNvbXBhcmU7XG5leHBvcnRzLnBlcm11dGVEb21haW4gPSByZXF1aXJlKCcuL3Blcm11dGVEb21haW4nKS5wZXJtdXRlRG9tYWluO1xuZXhwb3J0cy5wZXJtdXRlUGF0aCA9IHBlcm11dGVQYXRoO1xuZXhwb3J0cy5jYW5vbmljYWxEb21haW4gPSBjYW5vbmljYWxEb21haW47XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciB0b3VnaCA9IHJlcXVpcmUoJ3RvdWdoLWNvb2tpZScpXG5cbnZhciBDb29raWUgPSB0b3VnaC5Db29raWVcbnZhciBDb29raWVKYXIgPSB0b3VnaC5Db29raWVKYXJcblxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgaWYgKHN0ciAmJiBzdHIudXJpKSB7XG4gICAgc3RyID0gc3RyLnVyaVxuICB9XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvb2tpZSBmdW5jdGlvbiBvbmx5IGFjY2VwdHMgU1RSSU5HIGFzIHBhcmFtJylcbiAgfVxuICByZXR1cm4gQ29va2llLnBhcnNlKHN0ciwge2xvb3NlOiB0cnVlfSlcbn1cblxuLy8gQWRhcHQgdGhlIHNvbWV0aW1lcy1Bc3luYyBhcGkgb2YgdG91Z2guQ29va2llSmFyIHRvIG91ciByZXF1aXJlbWVudHNcbmZ1bmN0aW9uIFJlcXVlc3RKYXIgKHN0b3JlKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBzZWxmLl9qYXIgPSBuZXcgQ29va2llSmFyKHN0b3JlLCB7bG9vc2VNb2RlOiB0cnVlfSlcbn1cblJlcXVlc3RKYXIucHJvdG90eXBlLnNldENvb2tpZSA9IGZ1bmN0aW9uIChjb29raWVPclN0ciwgdXJpLCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICByZXR1cm4gc2VsZi5famFyLnNldENvb2tpZVN5bmMoY29va2llT3JTdHIsIHVyaSwgb3B0aW9ucyB8fCB7fSlcbn1cblJlcXVlc3RKYXIucHJvdG90eXBlLmdldENvb2tpZVN0cmluZyA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiBzZWxmLl9qYXIuZ2V0Q29va2llU3RyaW5nU3luYyh1cmkpXG59XG5SZXF1ZXN0SmFyLnByb3RvdHlwZS5nZXRDb29raWVzID0gZnVuY3Rpb24gKHVyaSkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgcmV0dXJuIHNlbGYuX2phci5nZXRDb29raWVzU3luYyh1cmkpXG59XG5cbmV4cG9ydHMuamFyID0gZnVuY3Rpb24gKHN0b3JlKSB7XG4gIHJldHVybiBuZXcgUmVxdWVzdEphcihzdG9yZSlcbn1cbiIsICJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdpZnlcbmV4cG9ydHMuZ2V0U2VyaWFsaXplID0gc2VyaWFsaXplclxuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2VzLCBjeWNsZVJlcGxhY2VyKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIHNlcmlhbGl6ZXIocmVwbGFjZXIsIGN5Y2xlUmVwbGFjZXIpLCBzcGFjZXMpXG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZXIocmVwbGFjZXIsIGN5Y2xlUmVwbGFjZXIpIHtcbiAgdmFyIHN0YWNrID0gW10sIGtleXMgPSBbXVxuXG4gIGlmIChjeWNsZVJlcGxhY2VyID09IG51bGwpIGN5Y2xlUmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgaWYgKHN0YWNrWzBdID09PSB2YWx1ZSkgcmV0dXJuIFwiW0NpcmN1bGFyIH5dXCJcbiAgICByZXR1cm4gXCJbQ2lyY3VsYXIgfi5cIiArIGtleXMuc2xpY2UoMCwgc3RhY2suaW5kZXhPZih2YWx1ZSkpLmpvaW4oXCIuXCIpICsgXCJdXCJcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0aGlzUG9zID0gc3RhY2suaW5kZXhPZih0aGlzKVxuICAgICAgfnRoaXNQb3MgPyBzdGFjay5zcGxpY2UodGhpc1BvcyArIDEpIDogc3RhY2sucHVzaCh0aGlzKVxuICAgICAgfnRoaXNQb3MgPyBrZXlzLnNwbGljZSh0aGlzUG9zLCBJbmZpbml0eSwga2V5KSA6IGtleXMucHVzaChrZXkpXG4gICAgICBpZiAofnN0YWNrLmluZGV4T2YodmFsdWUpKSB2YWx1ZSA9IGN5Y2xlUmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKVxuICAgIH1cbiAgICBlbHNlIHN0YWNrLnB1c2godmFsdWUpXG5cbiAgICByZXR1cm4gcmVwbGFjZXIgPT0gbnVsbCA/IHZhbHVlIDogcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKVxuICB9XG59XG4iLCAiLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCdWZmZXIucHJvdG90eXBlKVxuXG4vLyBDb3B5IHN0YXRpYyBtZXRob2RzIGZyb20gQnVmZmVyXG5jb3B5UHJvcHMoQnVmZmVyLCBTYWZlQnVmZmVyKVxuXG5TYWZlQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoMClcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihzaXplKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gYnVmZmVyLlNsb3dCdWZmZXIoc2l6ZSlcbn1cbiIsICIndXNlIHN0cmljdCdcblxudmFyIGpzb25TYWZlU3RyaW5naWZ5ID0gcmVxdWlyZSgnanNvbi1zdHJpbmdpZnktc2FmZScpXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgZGVmZXIgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAndW5kZWZpbmVkJ1xuICA/IHByb2Nlc3MubmV4dFRpY2tcbiAgOiBzZXRJbW1lZGlhdGVcblxuZnVuY3Rpb24gcGFyYW1zSGF2ZVJlcXVlc3RCb2R5IChwYXJhbXMpIHtcbiAgcmV0dXJuIChcbiAgICBwYXJhbXMuYm9keSB8fFxuICAgIHBhcmFtcy5yZXF1ZXN0Qm9keVN0cmVhbSB8fFxuICAgIChwYXJhbXMuanNvbiAmJiB0eXBlb2YgcGFyYW1zLmpzb24gIT09ICdib29sZWFuJykgfHxcbiAgICBwYXJhbXMubXVsdGlwYXJ0XG4gIClcbn1cblxuZnVuY3Rpb24gc2FmZVN0cmluZ2lmeSAob2JqLCByZXBsYWNlcikge1xuICB2YXIgcmV0XG4gIHRyeSB7XG4gICAgcmV0ID0gSlNPTi5zdHJpbmdpZnkob2JqLCByZXBsYWNlcilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldCA9IGpzb25TYWZlU3RyaW5naWZ5KG9iaiwgcmVwbGFjZXIpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBtZDUgKHN0cikge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShzdHIpLmRpZ2VzdCgnaGV4Jylcbn1cblxuZnVuY3Rpb24gaXNSZWFkU3RyZWFtIChycykge1xuICByZXR1cm4gcnMucmVhZGFibGUgJiYgcnMucGF0aCAmJiBycy5tb2RlXG59XG5cbmZ1bmN0aW9uIHRvQmFzZTY0IChzdHIpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0ciB8fCAnJywgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jylcbn1cblxuZnVuY3Rpb24gY29weSAob2JqKSB7XG4gIHZhciBvID0ge31cbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7XG4gICAgb1tpXSA9IG9ialtpXVxuICB9KVxuICByZXR1cm4gb1xufVxuXG5mdW5jdGlvbiB2ZXJzaW9uICgpIHtcbiAgdmFyIG51bWJlcnMgPSBwcm9jZXNzLnZlcnNpb24ucmVwbGFjZSgndicsICcnKS5zcGxpdCgnLicpXG4gIHJldHVybiB7XG4gICAgbWFqb3I6IHBhcnNlSW50KG51bWJlcnNbMF0sIDEwKSxcbiAgICBtaW5vcjogcGFyc2VJbnQobnVtYmVyc1sxXSwgMTApLFxuICAgIHBhdGNoOiBwYXJzZUludChudW1iZXJzWzJdLCAxMClcbiAgfVxufVxuXG5leHBvcnRzLnBhcmFtc0hhdmVSZXF1ZXN0Qm9keSA9IHBhcmFtc0hhdmVSZXF1ZXN0Qm9keVxuZXhwb3J0cy5zYWZlU3RyaW5naWZ5ID0gc2FmZVN0cmluZ2lmeVxuZXhwb3J0cy5tZDUgPSBtZDVcbmV4cG9ydHMuaXNSZWFkU3RyZWFtID0gaXNSZWFkU3RyZWFtXG5leHBvcnRzLnRvQmFzZTY0ID0gdG9CYXNlNjRcbmV4cG9ydHMuY29weSA9IGNvcHlcbmV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb25cbmV4cG9ydHMuZGVmZXIgPSBkZWZlclxuIiwgIlxuLyohXG4gKiAgQ29weXJpZ2h0IDIwMTAgTGVhcm5Cb29zdCA8ZGV2QGxlYXJuYm9vc3QuY29tPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG4gICwgcGFyc2UgPSByZXF1aXJlKCd1cmwnKS5wYXJzZVxuICA7XG5cbi8qKlxuICogVmFsaWQga2V5cy5cbiAqL1xuXG52YXIga2V5cyA9IFxuICBbICdhY2wnXG4gICwgJ2xvY2F0aW9uJ1xuICAsICdsb2dnaW5nJ1xuICAsICdub3RpZmljYXRpb24nXG4gICwgJ3BhcnROdW1iZXInXG4gICwgJ3BvbGljeSdcbiAgLCAncmVxdWVzdFBheW1lbnQnXG4gICwgJ3RvcnJlbnQnXG4gICwgJ3VwbG9hZElkJ1xuICAsICd1cGxvYWRzJ1xuICAsICd2ZXJzaW9uSWQnXG4gICwgJ3ZlcnNpb25pbmcnXG4gICwgJ3ZlcnNpb25zJ1xuICAsICd3ZWJzaXRlJ1xuICBdXG5cbi8qKlxuICogUmV0dXJuIGFuIFwiQXV0aG9yaXphdGlvblwiIGhlYWRlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2BcbiAqIGluIHRoZSBmb3JtIG9mIFwiQVdTIDxrZXk+OjxzaWduYXR1cmU+XCJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYXV0aG9yaXphdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gJ0FXUyAnICsgb3B0aW9ucy5rZXkgKyAnOicgKyBzaWduKG9wdGlvbnMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXV0aG9yaXphdGlvblxubW9kdWxlLmV4cG9ydHMuYXV0aG9yaXphdGlvbiA9IGF1dGhvcml6YXRpb25cblxuLyoqXG4gKiBTaW1wbGUgSE1BQy1TSEExIFdyYXBwZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi8gXG5cbmZ1bmN0aW9uIGhtYWNTaGExIChvcHRpb25zKSB7XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIG9wdGlvbnMuc2VjcmV0KS51cGRhdGUob3B0aW9ucy5tZXNzYWdlKS5kaWdlc3QoJ2Jhc2U2NCcpXG59XG5cbm1vZHVsZS5leHBvcnRzLmhtYWNTaGExID0gaG1hY1NoYTFcblxuLyoqXG4gKiBDcmVhdGUgYSBiYXNlNjQgc2hhMSBITUFDIGZvciBgb3B0aW9uc2AuIFxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2lnbiAob3B0aW9ucykge1xuICBvcHRpb25zLm1lc3NhZ2UgPSBzdHJpbmdUb1NpZ24ob3B0aW9ucylcbiAgcmV0dXJuIGhtYWNTaGExKG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cy5zaWduID0gc2lnblxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2U2NCBzaGExIEhNQUMgZm9yIGBvcHRpb25zYC4gXG4gKlxuICogU3BlY2lmaWNhbGx5IHRvIGJlIHVzZWQgd2l0aCBTMyBwcmVzaWduZWQgVVJMc1xuICogXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2lnblF1ZXJ5IChvcHRpb25zKSB7XG4gIG9wdGlvbnMubWVzc2FnZSA9IHF1ZXJ5U3RyaW5nVG9TaWduKG9wdGlvbnMpXG4gIHJldHVybiBobWFjU2hhMShvcHRpb25zKVxufVxubW9kdWxlLmV4cG9ydHMuc2lnblF1ZXJ5PSBzaWduUXVlcnlcblxuLyoqXG4gKiBSZXR1cm4gYSBzdHJpbmcgZm9yIHNpZ24oKSB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKlxuICogU3BlYzpcbiAqIFxuICogICAgPHZlcmI+XFxuXG4gKiAgICA8bWQ1PlxcblxuICogICAgPGNvbnRlbnQtdHlwZT5cXG5cbiAqICAgIDxkYXRlPlxcblxuICogICAgW2hlYWRlcnNcXG5dXG4gKiAgICA8cmVzb3VyY2U+XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ1RvU2lnbiAob3B0aW9ucykge1xuICB2YXIgaGVhZGVycyA9IG9wdGlvbnMuYW1hem9uSGVhZGVycyB8fCAnJ1xuICBpZiAoaGVhZGVycykgaGVhZGVycyArPSAnXFxuJ1xuICB2YXIgciA9IFxuICAgIFsgb3B0aW9ucy52ZXJiXG4gICAgLCBvcHRpb25zLm1kNVxuICAgICwgb3B0aW9ucy5jb250ZW50VHlwZVxuICAgICwgb3B0aW9ucy5kYXRlID8gb3B0aW9ucy5kYXRlLnRvVVRDU3RyaW5nKCkgOiAnJ1xuICAgICwgaGVhZGVycyArIG9wdGlvbnMucmVzb3VyY2VcbiAgICBdXG4gIHJldHVybiByLmpvaW4oJ1xcbicpXG59XG5tb2R1bGUuZXhwb3J0cy5zdHJpbmdUb1NpZ24gPSBzdHJpbmdUb1NpZ25cblxuLyoqXG4gKiBSZXR1cm4gYSBzdHJpbmcgZm9yIHNpZ24oKSB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AsIGJ1dCBpcyBtZWFudCBleGNsdXNpdmVseVxuICogZm9yIFMzIHByZXNpZ25lZCBVUkxzXG4gKlxuICogU3BlYzpcbiAqIFxuICogICAgPGRhdGU+XFxuXG4gKiAgICA8cmVzb3VyY2U+XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHF1ZXJ5U3RyaW5nVG9TaWduIChvcHRpb25zKXtcbiAgcmV0dXJuICdHRVRcXG5cXG5cXG4nICsgb3B0aW9ucy5kYXRlICsgJ1xcbicgKyBvcHRpb25zLnJlc291cmNlXG59XG5tb2R1bGUuZXhwb3J0cy5xdWVyeVN0cmluZ1RvU2lnbiA9IHF1ZXJ5U3RyaW5nVG9TaWduXG5cbi8qKlxuICogUGVyZm9ybSB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAtIGlnbm9yZSBub24tYW1hem9uIGhlYWRlcnNcbiAqICAtIGxvd2VyY2FzZSBmaWVsZHNcbiAqICAtIHNvcnQgbGV4aWNvZ3JhcGhpY2FsbHlcbiAqICAtIHRyaW0gd2hpdGVzcGFjZSBiZXR3ZWVuIFwiOlwiXG4gKiAgLSBqb2luIHdpdGggbmV3bGluZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJzXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjYW5vbmljYWxpemVIZWFkZXJzIChoZWFkZXJzKSB7XG4gIHZhciBidWYgPSBbXVxuICAgICwgZmllbGRzID0gT2JqZWN0LmtleXMoaGVhZGVycylcbiAgICA7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV1cbiAgICAgICwgdmFsID0gaGVhZGVyc1tmaWVsZF1cbiAgICAgICwgZmllbGQgPSBmaWVsZC50b0xvd2VyQ2FzZSgpXG4gICAgICA7XG4gICAgaWYgKDAgIT09IGZpZWxkLmluZGV4T2YoJ3gtYW16JykpIGNvbnRpbnVlXG4gICAgYnVmLnB1c2goZmllbGQgKyAnOicgKyB2YWwpXG4gIH1cbiAgcmV0dXJuIGJ1Zi5zb3J0KCkuam9pbignXFxuJylcbn1cbm1vZHVsZS5leHBvcnRzLmNhbm9uaWNhbGl6ZUhlYWRlcnMgPSBjYW5vbmljYWxpemVIZWFkZXJzXG5cbi8qKlxuICogUGVyZm9ybSB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAtIGlnbm9yZSBub24gc3ViLXJlc291cmNlc1xuICogIC0gc29ydCBsZXhpY29ncmFwaGljYWxseVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXNvdXJjZVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplUmVzb3VyY2UgKHJlc291cmNlKSB7XG4gIHZhciB1cmwgPSBwYXJzZShyZXNvdXJjZSwgdHJ1ZSlcbiAgICAsIHBhdGggPSB1cmwucGF0aG5hbWVcbiAgICAsIGJ1ZiA9IFtdXG4gICAgO1xuXG4gIE9iamVjdC5rZXlzKHVybC5xdWVyeSkuZm9yRWFjaChmdW5jdGlvbihrZXkpe1xuICAgIGlmICghfmtleXMuaW5kZXhPZihrZXkpKSByZXR1cm5cbiAgICB2YXIgdmFsID0gJycgPT0gdXJsLnF1ZXJ5W2tleV0gPyAnJyA6ICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwucXVlcnlba2V5XSlcbiAgICBidWYucHVzaChrZXkgKyB2YWwpXG4gIH0pXG5cbiAgcmV0dXJuIHBhdGggKyAoYnVmLmxlbmd0aCA/ICc/JyArIGJ1Zi5zb3J0KCkuam9pbignJicpIDogJycpXG59XG5tb2R1bGUuZXhwb3J0cy5jYW5vbmljYWxpemVSZXNvdXJjZSA9IGNhbm9uaWNhbGl6ZVJlc291cmNlXG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzaXplKSB7XG4gIHJldHVybiBuZXcgTHJ1Q2FjaGUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gTHJ1Q2FjaGUoc2l6ZSkge1xuICB0aGlzLmNhcGFjaXR5ID0gc2l6ZSB8IDBcbiAgdGhpcy5tYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIHRoaXMubGlzdCA9IG5ldyBEb3VibHlMaW5rZWRMaXN0KClcbn1cblxuTHJ1Q2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGtleSkge1xuICB2YXIgbm9kZSA9IHRoaXMubWFwW2tleV1cbiAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICB0aGlzLnVzZWQobm9kZSlcbiAgcmV0dXJuIG5vZGUudmFsXG59XG5cbkxydUNhY2hlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihrZXksIHZhbCkge1xuICB2YXIgbm9kZSA9IHRoaXMubWFwW2tleV1cbiAgaWYgKG5vZGUgIT0gbnVsbCkge1xuICAgIG5vZGUudmFsID0gdmFsXG4gIH0gZWxzZSB7XG4gICAgaWYgKCF0aGlzLmNhcGFjaXR5KSB0aGlzLnBydW5lKClcbiAgICBpZiAoIXRoaXMuY2FwYWNpdHkpIHJldHVybiBmYWxzZVxuICAgIG5vZGUgPSBuZXcgRG91Ymx5TGlua2VkTm9kZShrZXksIHZhbClcbiAgICB0aGlzLm1hcFtrZXldID0gbm9kZVxuICAgIHRoaXMuY2FwYWNpdHktLVxuICB9XG4gIHRoaXMudXNlZChub2RlKVxuICByZXR1cm4gdHJ1ZVxufVxuXG5McnVDYWNoZS5wcm90b3R5cGUudXNlZCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5saXN0Lm1vdmVUb0Zyb250KG5vZGUpXG59XG5cbkxydUNhY2hlLnByb3RvdHlwZS5wcnVuZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbm9kZSA9IHRoaXMubGlzdC5wb3AoKVxuICBpZiAobm9kZSAhPSBudWxsKSB7XG4gICAgZGVsZXRlIHRoaXMubWFwW25vZGUua2V5XVxuICAgIHRoaXMuY2FwYWNpdHkrK1xuICB9XG59XG5cblxuZnVuY3Rpb24gRG91Ymx5TGlua2VkTGlzdCgpIHtcbiAgdGhpcy5maXJzdE5vZGUgPSBudWxsXG4gIHRoaXMubGFzdE5vZGUgPSBudWxsXG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLm1vdmVUb0Zyb250ID0gZnVuY3Rpb24obm9kZSkge1xuICBpZiAodGhpcy5maXJzdE5vZGUgPT0gbm9kZSkgcmV0dXJuXG5cbiAgdGhpcy5yZW1vdmUobm9kZSlcblxuICBpZiAodGhpcy5maXJzdE5vZGUgPT0gbnVsbCkge1xuICAgIHRoaXMuZmlyc3ROb2RlID0gbm9kZVxuICAgIHRoaXMubGFzdE5vZGUgPSBub2RlXG4gICAgbm9kZS5wcmV2ID0gbnVsbFxuICAgIG5vZGUubmV4dCA9IG51bGxcbiAgfSBlbHNlIHtcbiAgICBub2RlLnByZXYgPSBudWxsXG4gICAgbm9kZS5uZXh0ID0gdGhpcy5maXJzdE5vZGVcbiAgICBub2RlLm5leHQucHJldiA9IG5vZGVcbiAgICB0aGlzLmZpcnN0Tm9kZSA9IG5vZGVcbiAgfVxufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGxhc3ROb2RlID0gdGhpcy5sYXN0Tm9kZVxuICBpZiAobGFzdE5vZGUgIT0gbnVsbCkge1xuICAgIHRoaXMucmVtb3ZlKGxhc3ROb2RlKVxuICB9XG4gIHJldHVybiBsYXN0Tm9kZVxufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihub2RlKSB7XG4gIGlmICh0aGlzLmZpcnN0Tm9kZSA9PSBub2RlKSB7XG4gICAgdGhpcy5maXJzdE5vZGUgPSBub2RlLm5leHRcbiAgfSBlbHNlIGlmIChub2RlLnByZXYgIT0gbnVsbCkge1xuICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0XG4gIH1cbiAgaWYgKHRoaXMubGFzdE5vZGUgPT0gbm9kZSkge1xuICAgIHRoaXMubGFzdE5vZGUgPSBub2RlLnByZXZcbiAgfSBlbHNlIGlmIChub2RlLm5leHQgIT0gbnVsbCkge1xuICAgIG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBEb3VibHlMaW5rZWROb2RlKGtleSwgdmFsKSB7XG4gIHRoaXMua2V5ID0ga2V5XG4gIHRoaXMudmFsID0gdmFsXG4gIHRoaXMucHJldiA9IG51bGxcbiAgdGhpcy5uZXh0ID0gbnVsbFxufVxuIiwgInZhciBhd3M0ID0gZXhwb3J0cyxcbiAgICB1cmwgPSByZXF1aXJlKCd1cmwnKSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyksXG4gICAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyksXG4gICAgbHJ1ID0gcmVxdWlyZSgnLi9scnUnKSxcbiAgICBjcmVkZW50aWFsc0NhY2hlID0gbHJ1KDEwMDApXG5cbi8vIGh0dHA6Ly9kb2NzLmFtYXpvbndlYnNlcnZpY2VzLmNvbS9nZW5lcmFsL2xhdGVzdC9nci9zaWduYXR1cmUtdmVyc2lvbi00Lmh0bWxcblxuZnVuY3Rpb24gaG1hYyhrZXksIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIbWFjKCdzaGEyNTYnLCBrZXkpLnVwZGF0ZShzdHJpbmcsICd1dGY4JykuZGlnZXN0KGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBoYXNoKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc3RyaW5nLCAndXRmOCcpLmRpZ2VzdChlbmNvZGluZylcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBzdHJpbmcgaGFzIGFscmVhZHkgYmVlbiBwZXJjZW50IGVuY29kZWRcbmZ1bmN0aW9uIGVuY29kZVJmYzM5ODYodXJsRW5jb2RlZFN0cmluZykge1xuICByZXR1cm4gdXJsRW5jb2RlZFN0cmluZy5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGVuY29kZVJmYzM5ODZGdWxsKHN0cikge1xuICByZXR1cm4gZW5jb2RlUmZjMzk4NihlbmNvZGVVUklDb21wb25lbnQoc3RyKSlcbn1cblxuLy8gQSBiaXQgb2YgYSBjb21iaW5hdGlvbiBvZjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qYXZhLXYyL2Jsb2IvZGM2OTVkZTZhYjQ5YWQwMzkzNGUxYjAyZTcyNjNhYmJkMjM1NGJlMC9jb3JlL2F1dGgvc3JjL21haW4vamF2YS9zb2Z0d2FyZS9hbWF6b24vYXdzc2RrL2F1dGgvc2lnbmVyL2ludGVybmFsL0Fic3RyYWN0QXdzNFNpZ25lci5qYXZhI0w1OVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzL2Jsb2IvMThjYjdlNWI0NjNiNDYyMzlmOWZkZDRhNjVlMmZmOGM4MTgzMWU4Zi9saWIvc2lnbmVycy92NC5qcyNMMTkxLUwxOTlcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taGFydC9hd3M0ZmV0Y2gvYmxvYi9iM2FlZDE2YjZmMTczODRjZjM2ZWEzM2JjYmEzYzFlOWYzYmRmZWZkL3NyYy9tYWluLmpzI0wyNS1MMzRcbnZhciBIRUFERVJTX1RPX0lHTk9SRSA9IHtcbiAgJ2F1dGhvcml6YXRpb24nOiB0cnVlLFxuICAnY29ubmVjdGlvbic6IHRydWUsXG4gICd4LWFtem4tdHJhY2UtaWQnOiB0cnVlLFxuICAndXNlci1hZ2VudCc6IHRydWUsXG4gICdleHBlY3QnOiB0cnVlLFxuICAncHJlc2lnbmVkLWV4cGlyZXMnOiB0cnVlLFxuICAncmFuZ2UnOiB0cnVlLFxufVxuXG4vLyByZXF1ZXN0OiB7IHBhdGggfCBib2R5LCBbaG9zdF0sIFttZXRob2RdLCBbaGVhZGVyc10sIFtzZXJ2aWNlXSwgW3JlZ2lvbl0gfVxuLy8gY3JlZGVudGlhbHM6IHsgYWNjZXNzS2V5SWQsIHNlY3JldEFjY2Vzc0tleSwgW3Nlc3Npb25Ub2tlbl0gfVxuZnVuY3Rpb24gUmVxdWVzdFNpZ25lcihyZXF1ZXN0LCBjcmVkZW50aWFscykge1xuXG4gIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHJlcXVlc3QgPSB1cmwucGFyc2UocmVxdWVzdClcblxuICB2YXIgaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycyA9IChyZXF1ZXN0LmhlYWRlcnMgfHwge30pLFxuICAgICAgaG9zdFBhcnRzID0gKCF0aGlzLnNlcnZpY2UgfHwgIXRoaXMucmVnaW9uKSAmJiB0aGlzLm1hdGNoSG9zdChyZXF1ZXN0Lmhvc3RuYW1lIHx8IHJlcXVlc3QuaG9zdCB8fCBoZWFkZXJzLkhvc3QgfHwgaGVhZGVycy5ob3N0KVxuXG4gIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzIHx8IHRoaXMuZGVmYXVsdENyZWRlbnRpYWxzKClcblxuICB0aGlzLnNlcnZpY2UgPSByZXF1ZXN0LnNlcnZpY2UgfHwgaG9zdFBhcnRzWzBdIHx8ICcnXG4gIHRoaXMucmVnaW9uID0gcmVxdWVzdC5yZWdpb24gfHwgaG9zdFBhcnRzWzFdIHx8ICd1cy1lYXN0LTEnXG5cbiAgLy8gU0VTIHVzZXMgYSBkaWZmZXJlbnQgZG9tYWluIGZyb20gdGhlIHNlcnZpY2UgbmFtZVxuICBpZiAodGhpcy5zZXJ2aWNlID09PSAnZW1haWwnKSB0aGlzLnNlcnZpY2UgPSAnc2VzJ1xuXG4gIGlmICghcmVxdWVzdC5tZXRob2QgJiYgcmVxdWVzdC5ib2R5KVxuICAgIHJlcXVlc3QubWV0aG9kID0gJ1BPU1QnXG5cbiAgaWYgKCFoZWFkZXJzLkhvc3QgJiYgIWhlYWRlcnMuaG9zdCkge1xuICAgIGhlYWRlcnMuSG9zdCA9IHJlcXVlc3QuaG9zdG5hbWUgfHwgcmVxdWVzdC5ob3N0IHx8IHRoaXMuY3JlYXRlSG9zdCgpXG5cbiAgICAvLyBJZiBhIHBvcnQgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHVzZSBpdCBhcyBpc1xuICAgIGlmIChyZXF1ZXN0LnBvcnQpXG4gICAgICBoZWFkZXJzLkhvc3QgKz0gJzonICsgcmVxdWVzdC5wb3J0XG4gIH1cbiAgaWYgKCFyZXF1ZXN0Lmhvc3RuYW1lICYmICFyZXF1ZXN0Lmhvc3QpXG4gICAgcmVxdWVzdC5ob3N0bmFtZSA9IGhlYWRlcnMuSG9zdCB8fCBoZWFkZXJzLmhvc3RcblxuICB0aGlzLmlzQ29kZUNvbW1pdEdpdCA9IHRoaXMuc2VydmljZSA9PT0gJ2NvZGVjb21taXQnICYmIHJlcXVlc3QubWV0aG9kID09PSAnR0lUJ1xufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5tYXRjaEhvc3QgPSBmdW5jdGlvbihob3N0KSB7XG4gIHZhciBtYXRjaCA9IChob3N0IHx8ICcnKS5tYXRjaCgvKFteXFwuXSspXFwuKD86KFteXFwuXSopXFwuKT9hbWF6b25hd3NcXC5jb20oXFwuY24pPyQvKVxuICB2YXIgaG9zdFBhcnRzID0gKG1hdGNoIHx8IFtdKS5zbGljZSgxLCAzKVxuXG4gIC8vIEVTJ3MgaG9zdFBhcnRzIGFyZSBzb21ldGltZXMgdGhlIG90aGVyIHdheSByb3VuZCwgaWYgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWRcbiAgLy8gdG8gYmUgcmVnaW9uIGVxdWFscyBcdTIwMThlc1x1MjAxOSBzd2l0Y2ggdGhlbSBiYWNrXG4gIC8vIGUuZy4gc2VhcmNoLWNsdXN0ZXItbmFtZS1hYWFhMDBhYWFhMGFhYTBhYWFhYWFhMGFhYS51cy1lYXN0LTEuZXMuYW1hem9uYXdzLmNvbVxuICBpZiAoaG9zdFBhcnRzWzFdID09PSAnZXMnKVxuICAgIGhvc3RQYXJ0cyA9IGhvc3RQYXJ0cy5yZXZlcnNlKClcblxuICBpZiAoaG9zdFBhcnRzWzFdID09ICdzMycpIHtcbiAgICBob3N0UGFydHNbMF0gPSAnczMnXG4gICAgaG9zdFBhcnRzWzFdID0gJ3VzLWVhc3QtMSdcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgaWYgKC9eczMtLy50ZXN0KGhvc3RQYXJ0c1tpXSkpIHtcbiAgICAgICAgaG9zdFBhcnRzWzFdID0gaG9zdFBhcnRzW2ldLnNsaWNlKDMpXG4gICAgICAgIGhvc3RQYXJ0c1swXSA9ICdzMydcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gaG9zdFBhcnRzXG59XG5cbi8vIGh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dlbmVyYWwvbGF0ZXN0L2dyL3JhbmRlLmh0bWxcblJlcXVlc3RTaWduZXIucHJvdG90eXBlLmlzU2luZ2xlUmVnaW9uID0gZnVuY3Rpb24oKSB7XG4gIC8vIFNwZWNpYWwgY2FzZSBmb3IgUzMgYW5kIFNpbXBsZURCIGluIHVzLWVhc3QtMVxuICBpZiAoWydzMycsICdzZGInXS5pbmRleE9mKHRoaXMuc2VydmljZSkgPj0gMCAmJiB0aGlzLnJlZ2lvbiA9PT0gJ3VzLWVhc3QtMScpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIFsnY2xvdWRmcm9udCcsICdscycsICdyb3V0ZTUzJywgJ2lhbScsICdpbXBvcnRleHBvcnQnLCAnc3RzJ11cbiAgICAuaW5kZXhPZih0aGlzLnNlcnZpY2UpID49IDBcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuY3JlYXRlSG9zdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVnaW9uID0gdGhpcy5pc1NpbmdsZVJlZ2lvbigpID8gJycgOiAnLicgKyB0aGlzLnJlZ2lvbixcbiAgICAgIHN1YmRvbWFpbiA9IHRoaXMuc2VydmljZSA9PT0gJ3NlcycgPyAnZW1haWwnIDogdGhpcy5zZXJ2aWNlXG4gIHJldHVybiBzdWJkb21haW4gKyByZWdpb24gKyAnLmFtYXpvbmF3cy5jb20nXG59XG5cblJlcXVlc3RTaWduZXIucHJvdG90eXBlLnByZXBhcmVSZXF1ZXN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFyc2VQYXRoKClcblxuICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCwgaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycywgcXVlcnlcblxuICBpZiAocmVxdWVzdC5zaWduUXVlcnkpIHtcblxuICAgIHRoaXMucGFyc2VkUGF0aC5xdWVyeSA9IHF1ZXJ5ID0gdGhpcy5wYXJzZWRQYXRoLnF1ZXJ5IHx8IHt9XG5cbiAgICBpZiAodGhpcy5jcmVkZW50aWFscy5zZXNzaW9uVG9rZW4pXG4gICAgICBxdWVyeVsnWC1BbXotU2VjdXJpdHktVG9rZW4nXSA9IHRoaXMuY3JlZGVudGlhbHMuc2Vzc2lvblRva2VuXG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlID09PSAnczMnICYmICFxdWVyeVsnWC1BbXotRXhwaXJlcyddKVxuICAgICAgcXVlcnlbJ1gtQW16LUV4cGlyZXMnXSA9IDg2NDAwXG5cbiAgICBpZiAocXVlcnlbJ1gtQW16LURhdGUnXSlcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBxdWVyeVsnWC1BbXotRGF0ZSddXG4gICAgZWxzZVxuICAgICAgcXVlcnlbJ1gtQW16LURhdGUnXSA9IHRoaXMuZ2V0RGF0ZVRpbWUoKVxuXG4gICAgcXVlcnlbJ1gtQW16LUFsZ29yaXRobSddID0gJ0FXUzQtSE1BQy1TSEEyNTYnXG4gICAgcXVlcnlbJ1gtQW16LUNyZWRlbnRpYWwnXSA9IHRoaXMuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQgKyAnLycgKyB0aGlzLmNyZWRlbnRpYWxTdHJpbmcoKVxuICAgIHF1ZXJ5WydYLUFtei1TaWduZWRIZWFkZXJzJ10gPSB0aGlzLnNpZ25lZEhlYWRlcnMoKVxuXG4gIH0gZWxzZSB7XG5cbiAgICBpZiAoIXJlcXVlc3QuZG9Ob3RNb2RpZnlIZWFkZXJzICYmICF0aGlzLmlzQ29kZUNvbW1pdEdpdCkge1xuICAgICAgaWYgKHJlcXVlc3QuYm9keSAmJiAhaGVhZGVyc1snQ29udGVudC1UeXBlJ10gJiYgIWhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKVxuICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9dXRmLTgnXG5cbiAgICAgIGlmIChyZXF1ZXN0LmJvZHkgJiYgIWhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gJiYgIWhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pXG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBCdWZmZXIuYnl0ZUxlbmd0aChyZXF1ZXN0LmJvZHkpXG5cbiAgICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzLnNlc3Npb25Ub2tlbiAmJiAhaGVhZGVyc1snWC1BbXotU2VjdXJpdHktVG9rZW4nXSAmJiAhaGVhZGVyc1sneC1hbXotc2VjdXJpdHktdG9rZW4nXSlcbiAgICAgICAgaGVhZGVyc1snWC1BbXotU2VjdXJpdHktVG9rZW4nXSA9IHRoaXMuY3JlZGVudGlhbHMuc2Vzc2lvblRva2VuXG5cbiAgICAgIGlmICh0aGlzLnNlcnZpY2UgPT09ICdzMycgJiYgIWhlYWRlcnNbJ1gtQW16LUNvbnRlbnQtU2hhMjU2J10gJiYgIWhlYWRlcnNbJ3gtYW16LWNvbnRlbnQtc2hhMjU2J10pXG4gICAgICAgIGhlYWRlcnNbJ1gtQW16LUNvbnRlbnQtU2hhMjU2J10gPSBoYXNoKHRoaXMucmVxdWVzdC5ib2R5IHx8ICcnLCAnaGV4JylcblxuICAgICAgaWYgKGhlYWRlcnNbJ1gtQW16LURhdGUnXSB8fCBoZWFkZXJzWyd4LWFtei1kYXRlJ10pXG4gICAgICAgIHRoaXMuZGF0ZXRpbWUgPSBoZWFkZXJzWydYLUFtei1EYXRlJ10gfHwgaGVhZGVyc1sneC1hbXotZGF0ZSddXG4gICAgICBlbHNlXG4gICAgICAgIGhlYWRlcnNbJ1gtQW16LURhdGUnXSA9IHRoaXMuZ2V0RGF0ZVRpbWUoKVxuICAgIH1cblxuICAgIGRlbGV0ZSBoZWFkZXJzLkF1dGhvcml6YXRpb25cbiAgICBkZWxldGUgaGVhZGVycy5hdXRob3JpemF0aW9uXG4gIH1cbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMucGFyc2VkUGF0aCkgdGhpcy5wcmVwYXJlUmVxdWVzdCgpXG5cbiAgaWYgKHRoaXMucmVxdWVzdC5zaWduUXVlcnkpIHtcbiAgICB0aGlzLnBhcnNlZFBhdGgucXVlcnlbJ1gtQW16LVNpZ25hdHVyZSddID0gdGhpcy5zaWduYXR1cmUoKVxuICB9IGVsc2Uge1xuICAgIHRoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSB0aGlzLmF1dGhIZWFkZXIoKVxuICB9XG5cbiAgdGhpcy5yZXF1ZXN0LnBhdGggPSB0aGlzLmZvcm1hdFBhdGgoKVxuXG4gIHJldHVybiB0aGlzLnJlcXVlc3Rcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuZ2V0RGF0ZVRpbWUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmRhdGV0aW1lKSB7XG4gICAgdmFyIGhlYWRlcnMgPSB0aGlzLnJlcXVlc3QuaGVhZGVycyxcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShoZWFkZXJzLkRhdGUgfHwgaGVhZGVycy5kYXRlIHx8IG5ldyBEYXRlKVxuXG4gICAgdGhpcy5kYXRldGltZSA9IGRhdGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9bOlxcLV18XFwuXFxkezN9L2csICcnKVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB0cmFpbGluZyAnWicgb24gdGhlIHRpbWVzdGFtcCBzdHJpbmcgZm9yIENvZGVDb21taXQgZ2l0IGFjY2Vzc1xuICAgIGlmICh0aGlzLmlzQ29kZUNvbW1pdEdpdCkgdGhpcy5kYXRldGltZSA9IHRoaXMuZGF0ZXRpbWUuc2xpY2UoMCwgLTEpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZGF0ZXRpbWVcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuZ2V0RGF0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXREYXRlVGltZSgpLnN1YnN0cigwLCA4KVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5hdXRoSGVhZGVyID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBbXG4gICAgJ0FXUzQtSE1BQy1TSEEyNTYgQ3JlZGVudGlhbD0nICsgdGhpcy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCArICcvJyArIHRoaXMuY3JlZGVudGlhbFN0cmluZygpLFxuICAgICdTaWduZWRIZWFkZXJzPScgKyB0aGlzLnNpZ25lZEhlYWRlcnMoKSxcbiAgICAnU2lnbmF0dXJlPScgKyB0aGlzLnNpZ25hdHVyZSgpLFxuICBdLmpvaW4oJywgJylcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuc2lnbmF0dXJlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBkYXRlID0gdGhpcy5nZXREYXRlKCksXG4gICAgICBjYWNoZUtleSA9IFt0aGlzLmNyZWRlbnRpYWxzLnNlY3JldEFjY2Vzc0tleSwgZGF0ZSwgdGhpcy5yZWdpb24sIHRoaXMuc2VydmljZV0uam9pbigpLFxuICAgICAga0RhdGUsIGtSZWdpb24sIGtTZXJ2aWNlLCBrQ3JlZGVudGlhbHMgPSBjcmVkZW50aWFsc0NhY2hlLmdldChjYWNoZUtleSlcbiAgaWYgKCFrQ3JlZGVudGlhbHMpIHtcbiAgICBrRGF0ZSA9IGhtYWMoJ0FXUzQnICsgdGhpcy5jcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXksIGRhdGUpXG4gICAga1JlZ2lvbiA9IGhtYWMoa0RhdGUsIHRoaXMucmVnaW9uKVxuICAgIGtTZXJ2aWNlID0gaG1hYyhrUmVnaW9uLCB0aGlzLnNlcnZpY2UpXG4gICAga0NyZWRlbnRpYWxzID0gaG1hYyhrU2VydmljZSwgJ2F3czRfcmVxdWVzdCcpXG4gICAgY3JlZGVudGlhbHNDYWNoZS5zZXQoY2FjaGVLZXksIGtDcmVkZW50aWFscylcbiAgfVxuICByZXR1cm4gaG1hYyhrQ3JlZGVudGlhbHMsIHRoaXMuc3RyaW5nVG9TaWduKCksICdoZXgnKVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5zdHJpbmdUb1NpZ24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFtcbiAgICAnQVdTNC1ITUFDLVNIQTI1NicsXG4gICAgdGhpcy5nZXREYXRlVGltZSgpLFxuICAgIHRoaXMuY3JlZGVudGlhbFN0cmluZygpLFxuICAgIGhhc2godGhpcy5jYW5vbmljYWxTdHJpbmcoKSwgJ2hleCcpLFxuICBdLmpvaW4oJ1xcbicpXG59XG5cblJlcXVlc3RTaWduZXIucHJvdG90eXBlLmNhbm9uaWNhbFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMucGFyc2VkUGF0aCkgdGhpcy5wcmVwYXJlUmVxdWVzdCgpXG5cbiAgdmFyIHBhdGhTdHIgPSB0aGlzLnBhcnNlZFBhdGgucGF0aCxcbiAgICAgIHF1ZXJ5ID0gdGhpcy5wYXJzZWRQYXRoLnF1ZXJ5LFxuICAgICAgaGVhZGVycyA9IHRoaXMucmVxdWVzdC5oZWFkZXJzLFxuICAgICAgcXVlcnlTdHIgPSAnJyxcbiAgICAgIG5vcm1hbGl6ZVBhdGggPSB0aGlzLnNlcnZpY2UgIT09ICdzMycsXG4gICAgICBkZWNvZGVQYXRoID0gdGhpcy5zZXJ2aWNlID09PSAnczMnIHx8IHRoaXMucmVxdWVzdC5kb05vdEVuY29kZVBhdGgsXG4gICAgICBkZWNvZGVTbGFzaGVzSW5QYXRoID0gdGhpcy5zZXJ2aWNlID09PSAnczMnLFxuICAgICAgZmlyc3RWYWxPbmx5ID0gdGhpcy5zZXJ2aWNlID09PSAnczMnLFxuICAgICAgYm9keUhhc2hcblxuICBpZiAodGhpcy5zZXJ2aWNlID09PSAnczMnICYmIHRoaXMucmVxdWVzdC5zaWduUXVlcnkpIHtcbiAgICBib2R5SGFzaCA9ICdVTlNJR05FRC1QQVlMT0FEJ1xuICB9IGVsc2UgaWYgKHRoaXMuaXNDb2RlQ29tbWl0R2l0KSB7XG4gICAgYm9keUhhc2ggPSAnJ1xuICB9IGVsc2Uge1xuICAgIGJvZHlIYXNoID0gaGVhZGVyc1snWC1BbXotQ29udGVudC1TaGEyNTYnXSB8fCBoZWFkZXJzWyd4LWFtei1jb250ZW50LXNoYTI1NiddIHx8XG4gICAgICBoYXNoKHRoaXMucmVxdWVzdC5ib2R5IHx8ICcnLCAnaGV4JylcbiAgfVxuXG4gIGlmIChxdWVyeSkge1xuICAgIHZhciByZWR1Y2VkUXVlcnkgPSBPYmplY3Qua2V5cyhxdWVyeSkucmVkdWNlKGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgICBpZiAoIWtleSkgcmV0dXJuIG9ialxuICAgICAgb2JqW2VuY29kZVJmYzM5ODZGdWxsKGtleSldID0gIUFycmF5LmlzQXJyYXkocXVlcnlba2V5XSkgPyBxdWVyeVtrZXldIDpcbiAgICAgICAgKGZpcnN0VmFsT25seSA/IHF1ZXJ5W2tleV1bMF0gOiBxdWVyeVtrZXldKVxuICAgICAgcmV0dXJuIG9ialxuICAgIH0sIHt9KVxuICAgIHZhciBlbmNvZGVkUXVlcnlQaWVjZXMgPSBbXVxuICAgIE9iamVjdC5rZXlzKHJlZHVjZWRRdWVyeSkuc29ydCgpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVkdWNlZFF1ZXJ5W2tleV0pKSB7XG4gICAgICAgIGVuY29kZWRRdWVyeVBpZWNlcy5wdXNoKGtleSArICc9JyArIGVuY29kZVJmYzM5ODZGdWxsKHJlZHVjZWRRdWVyeVtrZXldKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZHVjZWRRdWVyeVtrZXldLm1hcChlbmNvZGVSZmMzOTg2RnVsbCkuc29ydCgpXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24odmFsKSB7IGVuY29kZWRRdWVyeVBpZWNlcy5wdXNoKGtleSArICc9JyArIHZhbCkgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHF1ZXJ5U3RyID0gZW5jb2RlZFF1ZXJ5UGllY2VzLmpvaW4oJyYnKVxuICB9XG4gIGlmIChwYXRoU3RyICE9PSAnLycpIHtcbiAgICBpZiAobm9ybWFsaXplUGF0aCkgcGF0aFN0ciA9IHBhdGhTdHIucmVwbGFjZSgvXFwvezIsfS9nLCAnLycpXG4gICAgcGF0aFN0ciA9IHBhdGhTdHIuc3BsaXQoJy8nKS5yZWR1Y2UoZnVuY3Rpb24ocGF0aCwgcGllY2UpIHtcbiAgICAgIGlmIChub3JtYWxpemVQYXRoICYmIHBpZWNlID09PSAnLi4nKSB7XG4gICAgICAgIHBhdGgucG9wKClcbiAgICAgIH0gZWxzZSBpZiAoIW5vcm1hbGl6ZVBhdGggfHwgcGllY2UgIT09ICcuJykge1xuICAgICAgICBpZiAoZGVjb2RlUGF0aCkgcGllY2UgPSBkZWNvZGVVUklDb21wb25lbnQocGllY2UucmVwbGFjZSgvXFwrL2csICcgJykpXG4gICAgICAgIHBhdGgucHVzaChlbmNvZGVSZmMzOTg2RnVsbChwaWVjZSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0sIFtdKS5qb2luKCcvJylcbiAgICBpZiAocGF0aFN0clswXSAhPT0gJy8nKSBwYXRoU3RyID0gJy8nICsgcGF0aFN0clxuICAgIGlmIChkZWNvZGVTbGFzaGVzSW5QYXRoKSBwYXRoU3RyID0gcGF0aFN0ci5yZXBsYWNlKC8lMkYvZywgJy8nKVxuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB0aGlzLnJlcXVlc3QubWV0aG9kIHx8ICdHRVQnLFxuICAgIHBhdGhTdHIsXG4gICAgcXVlcnlTdHIsXG4gICAgdGhpcy5jYW5vbmljYWxIZWFkZXJzKCkgKyAnXFxuJyxcbiAgICB0aGlzLnNpZ25lZEhlYWRlcnMoKSxcbiAgICBib2R5SGFzaCxcbiAgXS5qb2luKCdcXG4nKVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5jYW5vbmljYWxIZWFkZXJzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBoZWFkZXJzID0gdGhpcy5yZXF1ZXN0LmhlYWRlcnNcbiAgZnVuY3Rpb24gdHJpbUFsbChoZWFkZXIpIHtcbiAgICByZXR1cm4gaGVhZGVyLnRvU3RyaW5nKCkudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKVxuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24oa2V5KSB7IHJldHVybiBIRUFERVJTX1RPX0lHTk9SRVtrZXkudG9Mb3dlckNhc2UoKV0gPT0gbnVsbCB9KVxuICAgIC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEudG9Mb3dlckNhc2UoKSA8IGIudG9Mb3dlckNhc2UoKSA/IC0xIDogMSB9KVxuICAgIC5tYXAoZnVuY3Rpb24oa2V5KSB7IHJldHVybiBrZXkudG9Mb3dlckNhc2UoKSArICc6JyArIHRyaW1BbGwoaGVhZGVyc1trZXldKSB9KVxuICAgIC5qb2luKCdcXG4nKVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5zaWduZWRIZWFkZXJzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlcXVlc3QuaGVhZGVycylcbiAgICAubWFwKGZ1bmN0aW9uKGtleSkgeyByZXR1cm4ga2V5LnRvTG93ZXJDYXNlKCkgfSlcbiAgICAuZmlsdGVyKGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gSEVBREVSU19UT19JR05PUkVba2V5XSA9PSBudWxsIH0pXG4gICAgLnNvcnQoKVxuICAgIC5qb2luKCc7Jylcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuY3JlZGVudGlhbFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gW1xuICAgIHRoaXMuZ2V0RGF0ZSgpLFxuICAgIHRoaXMucmVnaW9uLFxuICAgIHRoaXMuc2VydmljZSxcbiAgICAnYXdzNF9yZXF1ZXN0JyxcbiAgXS5qb2luKCcvJylcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuZGVmYXVsdENyZWRlbnRpYWxzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBlbnYgPSBwcm9jZXNzLmVudlxuICByZXR1cm4ge1xuICAgIGFjY2Vzc0tleUlkOiBlbnYuQVdTX0FDQ0VTU19LRVlfSUQgfHwgZW52LkFXU19BQ0NFU1NfS0VZLFxuICAgIHNlY3JldEFjY2Vzc0tleTogZW52LkFXU19TRUNSRVRfQUNDRVNTX0tFWSB8fCBlbnYuQVdTX1NFQ1JFVF9LRVksXG4gICAgc2Vzc2lvblRva2VuOiBlbnYuQVdTX1NFU1NJT05fVE9LRU4sXG4gIH1cbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUucGFyc2VQYXRoID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRoID0gdGhpcy5yZXF1ZXN0LnBhdGggfHwgJy8nXG5cbiAgLy8gUzMgZG9lc24ndCBhbHdheXMgZW5jb2RlIGNoYXJhY3RlcnMgPiAxMjcgY29ycmVjdGx5IGFuZFxuICAvLyBhbGwgc2VydmljZXMgZG9uJ3QgZW5jb2RlIGNoYXJhY3RlcnMgPiAyNTUgY29ycmVjdGx5XG4gIC8vIFNvIGlmIHRoZXJlIGFyZSBub24tcmVzZXJ2ZWQgY2hhcnMgKGFuZCBpdCdzIG5vdCBhbHJlYWR5IGFsbCAlIGVuY29kZWQpLCBqdXN0IGVuY29kZSB0aGVtIGFsbFxuICBpZiAoL1teMC05QS1aYS16OywvPzpAJj0rJFxcLV8uIX4qJygpIyVdLy50ZXN0KHBhdGgpKSB7XG4gICAgcGF0aCA9IGVuY29kZVVSSShkZWNvZGVVUkkocGF0aCkpXG4gIH1cblxuICB2YXIgcXVlcnlJeCA9IHBhdGguaW5kZXhPZignPycpLFxuICAgICAgcXVlcnkgPSBudWxsXG5cbiAgaWYgKHF1ZXJ5SXggPj0gMCkge1xuICAgIHF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UocGF0aC5zbGljZShxdWVyeUl4ICsgMSkpXG4gICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgcXVlcnlJeClcbiAgfVxuXG4gIHRoaXMucGFyc2VkUGF0aCA9IHtcbiAgICBwYXRoOiBwYXRoLFxuICAgIHF1ZXJ5OiBxdWVyeSxcbiAgfVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5mb3JtYXRQYXRoID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRoID0gdGhpcy5wYXJzZWRQYXRoLnBhdGgsXG4gICAgICBxdWVyeSA9IHRoaXMucGFyc2VkUGF0aC5xdWVyeVxuXG4gIGlmICghcXVlcnkpIHJldHVybiBwYXRoXG5cbiAgLy8gU2VydmljZXMgZG9uJ3Qgc3VwcG9ydCBlbXB0eSBxdWVyeSBzdHJpbmcga2V5c1xuICBpZiAocXVlcnlbJyddICE9IG51bGwpIGRlbGV0ZSBxdWVyeVsnJ11cblxuICByZXR1cm4gcGF0aCArICc/JyArIGVuY29kZVJmYzM5ODYocXVlcnlzdHJpbmcuc3RyaW5naWZ5KHF1ZXJ5KSlcbn1cblxuYXdzNC5SZXF1ZXN0U2lnbmVyID0gUmVxdWVzdFNpZ25lclxuXG5hd3M0LnNpZ24gPSBmdW5jdGlvbihyZXF1ZXN0LCBjcmVkZW50aWFscykge1xuICByZXR1cm4gbmV3IFJlcXVlc3RTaWduZXIocmVxdWVzdCwgY3JlZGVudGlhbHMpLnNpZ24oKVxufVxuIiwgIi8vIENvcHlyaWdodCAoYykgMjAxMiwgTWFyayBDYXZhZ2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5cbi8vLy0tLSBHbG9iYWxzXG5cbi8qIEpTU1RZTEVEICovXG52YXIgVVVJRF9SRUdFWFAgPSAvXlthLWZBLUYwLTldezh9LVthLWZBLUYwLTldezR9LVthLWZBLUYwLTldezR9LVthLWZBLUYwLTldezR9LVthLWZBLUYwLTldezEyfSQvO1xuXG5cbi8vLy0tLSBJbnRlcm5hbFxuXG5mdW5jdGlvbiBfY2FwaXRhbGl6ZShzdHIpIHtcbiAgICByZXR1cm4gKHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKSk7XG59XG5cbmZ1bmN0aW9uIF90b3NzKG5hbWUsIGV4cGVjdGVkLCBvcGVyLCBhcmcsIGFjdHVhbCkge1xuICAgIHRocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe1xuICAgICAgICBtZXNzYWdlOiB1dGlsLmZvcm1hdCgnJXMgKCVzKSBpcyByZXF1aXJlZCcsIG5hbWUsIGV4cGVjdGVkKSxcbiAgICAgICAgYWN0dWFsOiAoYWN0dWFsID09PSB1bmRlZmluZWQpID8gdHlwZW9mIChhcmcpIDogYWN0dWFsKGFyZyksXG4gICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCxcbiAgICAgICAgb3BlcmF0b3I6IG9wZXIgfHwgJz09PScsXG4gICAgICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogX3Rvc3MuY2FsbGVyXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIF9nZXRDbGFzcyhhcmcpIHtcbiAgICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpLnNsaWNlKDgsIC0xKSk7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgLy8gV2h5IGV2ZW4gYm90aGVyIHdpdGggYXNzZXJ0cz9cbn1cblxuXG4vLy8tLS0gRXhwb3J0c1xuXG52YXIgdHlwZXMgPSB7XG4gICAgYm9vbDoge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gdHlwZW9mIChhcmcpID09PSAnYm9vbGVhbic7IH1cbiAgICB9LFxuICAgIGZ1bmM6IHtcbiAgICAgICAgY2hlY2s6IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHR5cGVvZiAoYXJnKSA9PT0gJ2Z1bmN0aW9uJzsgfVxuICAgIH0sXG4gICAgc3RyaW5nOiB7XG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoYXJnKSB7IHJldHVybiB0eXBlb2YgKGFyZykgPT09ICdzdHJpbmcnOyB9XG4gICAgfSxcbiAgICBvYmplY3Q6IHtcbiAgICAgICAgY2hlY2s6IGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbnVtYmVyOiB7XG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIChhcmcpID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oYXJnKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZmluaXRlOiB7XG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIChhcmcpID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oYXJnKSAmJiBpc0Zpbml0ZShhcmcpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBidWZmZXI6IHtcbiAgICAgICAgY2hlY2s6IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihhcmcpOyB9LFxuICAgICAgICBvcGVyYXRvcjogJ0J1ZmZlci5pc0J1ZmZlcidcbiAgICB9LFxuICAgIGFycmF5OiB7XG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7IH0sXG4gICAgICAgIG9wZXJhdG9yOiAnQXJyYXkuaXNBcnJheSdcbiAgICB9LFxuICAgIHN0cmVhbToge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gYXJnIGluc3RhbmNlb2YgU3RyZWFtOyB9LFxuICAgICAgICBvcGVyYXRvcjogJ2luc3RhbmNlb2YnLFxuICAgICAgICBhY3R1YWw6IF9nZXRDbGFzc1xuICAgIH0sXG4gICAgZGF0ZToge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gYXJnIGluc3RhbmNlb2YgRGF0ZTsgfSxcbiAgICAgICAgb3BlcmF0b3I6ICdpbnN0YW5jZW9mJyxcbiAgICAgICAgYWN0dWFsOiBfZ2V0Q2xhc3NcbiAgICB9LFxuICAgIHJlZ2V4cDoge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gYXJnIGluc3RhbmNlb2YgUmVnRXhwOyB9LFxuICAgICAgICBvcGVyYXRvcjogJ2luc3RhbmNlb2YnLFxuICAgICAgICBhY3R1YWw6IF9nZXRDbGFzc1xuICAgIH0sXG4gICAgdXVpZDoge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiAoYXJnKSA9PT0gJ3N0cmluZycgJiYgVVVJRF9SRUdFWFAudGVzdChhcmcpO1xuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRvcjogJ2lzVVVJRCdcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBfc2V0RXhwb3J0cyhuZGVidWcpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR5cGVzKTtcbiAgICB2YXIgb3V0O1xuXG4gICAgLyogcmUtZXhwb3J0IHN0YW5kYXJkIGFzc2VydCAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX05ERUJVRykge1xuICAgICAgICBvdXQgPSBub29wO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IGZ1bmN0aW9uIChhcmcsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgICAgICBfdG9zcyhtc2csICd0cnVlJywgYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiBzdGFuZGFyZCBjaGVja3MgKi9cbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgaWYgKG5kZWJ1Zykge1xuICAgICAgICAgICAgb3V0W2tdID0gbm9vcDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2tdO1xuICAgICAgICBvdXRba10gPSBmdW5jdGlvbiAoYXJnLCBtc2cpIHtcbiAgICAgICAgICAgIGlmICghdHlwZS5jaGVjayhhcmcpKSB7XG4gICAgICAgICAgICAgICAgX3Rvc3MobXNnLCBrLCB0eXBlLm9wZXJhdG9yLCBhcmcsIHR5cGUuYWN0dWFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qIG9wdGlvbmFsIGNoZWNrcyAqL1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICB2YXIgbmFtZSA9ICdvcHRpb25hbCcgKyBfY2FwaXRhbGl6ZShrKTtcbiAgICAgICAgaWYgKG5kZWJ1Zykge1xuICAgICAgICAgICAgb3V0W25hbWVdID0gbm9vcDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2tdO1xuICAgICAgICBvdXRbbmFtZV0gPSBmdW5jdGlvbiAoYXJnLCBtc2cpIHtcbiAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXR5cGUuY2hlY2soYXJnKSkge1xuICAgICAgICAgICAgICAgIF90b3NzKG1zZywgaywgdHlwZS5vcGVyYXRvciwgYXJnLCB0eXBlLmFjdHVhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiBhcnJheU9mIGNoZWNrcyAqL1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICB2YXIgbmFtZSA9ICdhcnJheU9mJyArIF9jYXBpdGFsaXplKGspO1xuICAgICAgICBpZiAobmRlYnVnKSB7XG4gICAgICAgICAgICBvdXRbbmFtZV0gPSBub29wO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0eXBlID0gdHlwZXNba107XG4gICAgICAgIHZhciBleHBlY3RlZCA9ICdbJyArIGsgKyAnXSc7XG4gICAgICAgIG91dFtuYW1lXSA9IGZ1bmN0aW9uIChhcmcsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgICAgICAgICAgICBfdG9zcyhtc2csIGV4cGVjdGVkLCB0eXBlLm9wZXJhdG9yLCBhcmcsIHR5cGUuYWN0dWFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdHlwZS5jaGVjayhhcmdbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIF90b3NzKG1zZywgZXhwZWN0ZWQsIHR5cGUub3BlcmF0b3IsIGFyZywgdHlwZS5hY3R1YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qIG9wdGlvbmFsQXJyYXlPZiBjaGVja3MgKi9cbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgdmFyIG5hbWUgPSAnb3B0aW9uYWxBcnJheU9mJyArIF9jYXBpdGFsaXplKGspO1xuICAgICAgICBpZiAobmRlYnVnKSB7XG4gICAgICAgICAgICBvdXRbbmFtZV0gPSBub29wO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0eXBlID0gdHlwZXNba107XG4gICAgICAgIHZhciBleHBlY3RlZCA9ICdbJyArIGsgKyAnXSc7XG4gICAgICAgIG91dFtuYW1lXSA9IGZ1bmN0aW9uIChhcmcsIG1zZykge1xuICAgICAgICAgICAgaWYgKGFyZyA9PT0gdW5kZWZpbmVkIHx8IGFyZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgICAgICAgX3Rvc3MobXNnLCBleHBlY3RlZCwgdHlwZS5vcGVyYXRvciwgYXJnLCB0eXBlLmFjdHVhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuY2hlY2soYXJnW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBfdG9zcyhtc2csIGV4cGVjdGVkLCB0eXBlLm9wZXJhdG9yLCBhcmcsIHR5cGUuYWN0dWFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiByZS1leHBvcnQgYnVpbHQtaW4gYXNzZXJ0aW9ucyAqL1xuICAgIE9iamVjdC5rZXlzKGFzc2VydCkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICBpZiAoayA9PT0gJ0Fzc2VydGlvbkVycm9yJykge1xuICAgICAgICAgICAgb3V0W2tdID0gYXNzZXJ0W2tdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZGVidWcpIHtcbiAgICAgICAgICAgIG91dFtrXSA9IG5vb3A7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3V0W2tdID0gYXNzZXJ0W2tdO1xuICAgIH0pO1xuXG4gICAgLyogZXhwb3J0IG91cnNlbHZlcyAoZm9yIHVuaXQgdGVzdHMgX29ubHlfKSAqL1xuICAgIG91dC5fc2V0RXhwb3J0cyA9IF9zZXRFeHBvcnRzO1xuXG4gICAgcmV0dXJuIG91dDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2V0RXhwb3J0cyhwcm9jZXNzLmVudi5OT0RFX05ERUJVRyk7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG52YXIgc2FmZXIgPSB7fVxuXG52YXIga2V5XG5cbmZvciAoa2V5IGluIGJ1ZmZlcikge1xuICBpZiAoIWJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnU2xvd0J1ZmZlcicgfHwga2V5ID09PSAnQnVmZmVyJykgY29udGludWVcbiAgc2FmZXJba2V5XSA9IGJ1ZmZlcltrZXldXG59XG5cbnZhciBTYWZlciA9IHNhZmVyLkJ1ZmZlciA9IHt9XG5mb3IgKGtleSBpbiBCdWZmZXIpIHtcbiAgaWYgKCFCdWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgaWYgKGtleSA9PT0gJ2FsbG9jVW5zYWZlJyB8fCBrZXkgPT09ICdhbGxvY1Vuc2FmZVNsb3cnKSBjb250aW51ZVxuICBTYWZlcltrZXldID0gQnVmZmVyW2tleV1cbn1cblxuc2FmZXIuQnVmZmVyLnByb3RvdHlwZSA9IEJ1ZmZlci5wcm90b3R5cGVcblxuaWYgKCFTYWZlci5mcm9tIHx8IFNhZmVyLmZyb20gPT09IFVpbnQ4QXJyYXkuZnJvbSkge1xuICBTYWZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKVxuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxufVxuXG5pZiAoIVNhZmVyLmFsbG9jKSB7XG4gIFNhZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzaXplKVxuICAgIH1cbiAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSAyICogKDEgPDwgMzApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICAgIGlmICghZmlsbCB8fCBmaWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYnVmLmZpbGwoMClcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgICByZXR1cm4gYnVmXG4gIH1cbn1cblxuaWYgKCFzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gIHRyeSB7XG4gICAgc2FmZXIua1N0cmluZ01heExlbmd0aCA9IHByb2Nlc3MuYmluZGluZygnYnVmZmVyJykua1N0cmluZ01heExlbmd0aFxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gd2UgY2FuJ3QgZGV0ZXJtaW5lIGtTdHJpbmdNYXhMZW5ndGggaW4gZW52aXJvbm1lbnRzIHdoZXJlIHByb2Nlc3MuYmluZGluZ1xuICAgIC8vIGlzIHVuc3VwcG9ydGVkLCBzbyBsZXQncyBub3Qgc2V0IGl0XG4gIH1cbn1cblxuaWYgKCFzYWZlci5jb25zdGFudHMpIHtcbiAgc2FmZXIuY29uc3RhbnRzID0ge1xuICAgIE1BWF9MRU5HVEg6IHNhZmVyLmtNYXhMZW5ndGhcbiAgfVxuICBpZiAoc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICAgIHNhZmVyLmNvbnN0YW50cy5NQVhfU1RSSU5HX0xFTkdUSCA9IHNhZmVyLmtTdHJpbmdNYXhMZW5ndGhcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVyXG4iLCAiLy8gQ29weXJpZ2h0IDIwMTUgSm95ZW50LCBJbmMuXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbnZhciBhbGdJbmZvID0ge1xuXHQnZHNhJzoge1xuXHRcdHBhcnRzOiBbJ3AnLCAncScsICdnJywgJ3knXSxcblx0XHRzaXplUGFydDogJ3AnXG5cdH0sXG5cdCdyc2EnOiB7XG5cdFx0cGFydHM6IFsnZScsICduJ10sXG5cdFx0c2l6ZVBhcnQ6ICduJ1xuXHR9LFxuXHQnZWNkc2EnOiB7XG5cdFx0cGFydHM6IFsnY3VydmUnLCAnUSddLFxuXHRcdHNpemVQYXJ0OiAnUSdcblx0fSxcblx0J2VkMjU1MTknOiB7XG5cdFx0cGFydHM6IFsnQSddLFxuXHRcdHNpemVQYXJ0OiAnQSdcblx0fVxufTtcbmFsZ0luZm9bJ2N1cnZlMjU1MTknXSA9IGFsZ0luZm9bJ2VkMjU1MTknXTtcblxudmFyIGFsZ1ByaXZJbmZvID0ge1xuXHQnZHNhJzoge1xuXHRcdHBhcnRzOiBbJ3AnLCAncScsICdnJywgJ3knLCAneCddXG5cdH0sXG5cdCdyc2EnOiB7XG5cdFx0cGFydHM6IFsnbicsICdlJywgJ2QnLCAnaXFtcCcsICdwJywgJ3EnXVxuXHR9LFxuXHQnZWNkc2EnOiB7XG5cdFx0cGFydHM6IFsnY3VydmUnLCAnUScsICdkJ11cblx0fSxcblx0J2VkMjU1MTknOiB7XG5cdFx0cGFydHM6IFsnQScsICdrJ11cblx0fVxufTtcbmFsZ1ByaXZJbmZvWydjdXJ2ZTI1NTE5J10gPSBhbGdQcml2SW5mb1snZWQyNTUxOSddO1xuXG52YXIgaGFzaEFsZ3MgPSB7XG5cdCdtZDUnOiB0cnVlLFxuXHQnc2hhMSc6IHRydWUsXG5cdCdzaGEyNTYnOiB0cnVlLFxuXHQnc2hhMzg0JzogdHJ1ZSxcblx0J3NoYTUxMic6IHRydWVcbn07XG5cbi8qXG4gKiBUYWtlbiBmcm9tXG4gKiBodHRwOi8vY3NyYy5uaXN0Lmdvdi9ncm91cHMvU1QvdG9vbGtpdC9kb2N1bWVudHMvZHNzL05JU1RSZUN1ci5wZGZcbiAqL1xudmFyIGN1cnZlcyA9IHtcblx0J25pc3RwMjU2Jzoge1xuXHRcdHNpemU6IDI1Nixcblx0XHRwa2NzOG9pZDogJzEuMi44NDAuMTAwNDUuMy4xLjcnLFxuXHRcdHA6IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwJyArXG5cdFx0ICAgICcwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdGE6IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ0ZGRkZGRkZGIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwJyArXG5cdFx0ICAgICcwMDAwMDAwMCBGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGQycpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdGI6IEJ1ZmZlci5mcm9tKChcblx0XHQgICAgJzVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjJyArXG5cdFx0ICAgICc2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YicpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdHM6IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ2M0OWQzNjA4IDg2ZTcwNDkzIDZhNjY3OGUxIDEzOWQyNmI3JyArXG5cdFx0ICAgICc4MTlmN2U5MCcpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdG46IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ2ZmZmZmZmZmIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmJyArXG5cdFx0ICAgICdiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MScpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdEc6IEJ1ZmZlci5mcm9tKCgnMDQnICtcblx0XHQgICAgJzZiMTdkMWYyIGUxMmM0MjQ3IGY4YmNlNmU1IDYzYTQ0MGYyJyArXG5cdFx0ICAgICc3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NicgK1xuXHRcdCAgICAnNGZlMzQyZTIgZmUxYTdmOWIgOGVlN2ViNGEgN2MwZjllMTYnICtcblx0XHQgICAgJzJiY2UzMzU3IDZiMzE1ZWNlIGNiYjY0MDY4IDM3YmY1MWY1JykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4Jylcblx0fSxcblx0J25pc3RwMzg0Jzoge1xuXHRcdHNpemU6IDM4NCxcblx0XHRwa2NzOG9pZDogJzEuMy4xMzIuMC4zNCcsXG5cdFx0cDogQnVmZmVyLmZyb20oKCcwMCcgK1xuXHRcdCAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnICtcblx0XHQgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlJyArXG5cdFx0ICAgICdmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZicpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdGE6IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ0ZGRkZGRkZGIEZGRkZGRkZGIEZGRkZGRkZGIEZGRkZGRkZGJyArXG5cdFx0ICAgICdGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRScgK1xuXHRcdCAgICAnRkZGRkZGRkYgMDAwMDAwMDAgMDAwMDAwMDAgRkZGRkZGRkMnKS5cblx0XHQgICAgcmVwbGFjZSgvIC9nLCAnJyksICdoZXgnKSxcblx0XHRiOiBCdWZmZXIuZnJvbSgoXG5cdFx0ICAgICdiMzMxMmZhNyBlMjNlZTdlNCA5ODhlMDU2YiBlM2Y4MmQxOScgK1xuXHRcdCAgICAnMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgNTAxMzg3NWEnICtcblx0XHQgICAgJ2M2NTYzOThkIDhhMmVkMTlkIDJhODVjOGVkIGQzZWMyYWVmJykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0czogQnVmZmVyLmZyb20oKCcwMCcgK1xuXHRcdCAgICAnYTMzNTkyNmEgYTMxOWEyN2EgMWQwMDg5NmEgNjc3M2E0ODInICtcblx0XHQgICAgJzdhY2RhYzczJykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0bjogQnVmZmVyLmZyb20oKCcwMCcgK1xuXHRcdCAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnICtcblx0XHQgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxIGY0MzcyZGRmJyArXG5cdFx0ICAgICc1ODFhMGRiMiA0OGIwYTc3YSBlY2VjMTk2YSBjY2M1Mjk3MycpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdEc6IEJ1ZmZlci5mcm9tKCgnMDQnICtcblx0XHQgICAgJ2FhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0JyArXG5cdFx0ICAgICc2ZTFkM2I2MiA4YmE3OWI5OCA1OWY3NDFlMCA4MjU0MmEzOCcgK1xuXHRcdCAgICAnNTUwMmYyNWQgYmY1NTI5NmMgM2E1NDVlMzggNzI3NjBhYjcnICtcblx0XHQgICAgJzM2MTdkZTRhIDk2MjYyYzZmIDVkOWU5OGJmIDkyOTJkYzI5JyArXG5cdFx0ICAgICdmOGY0MWRiZCAyODlhMTQ3YyBlOWRhMzExMyBiNWYwYjhjMCcgK1xuXHRcdCAgICAnMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYnKS5cblx0XHQgICAgcmVwbGFjZSgvIC9nLCAnJyksICdoZXgnKVxuXHR9LFxuXHQnbmlzdHA1MjEnOiB7XG5cdFx0c2l6ZTogNTIxLFxuXHRcdHBrY3M4b2lkOiAnMS4zLjEzMi4wLjM1Jyxcblx0XHRwOiBCdWZmZXIuZnJvbSgoXG5cdFx0ICAgICcwMWZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicgK1xuXHRcdCAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnICtcblx0XHQgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyArXG5cdFx0ICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicgK1xuXHRcdCAgICAnZmZmZicpLnJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0YTogQnVmZmVyLmZyb20oKCcwMUZGJyArXG5cdFx0ICAgICdGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRicgK1xuXHRcdCAgICAnRkZGRkZGRkYgRkZGRkZGRkYgRkZGRkZGRkYgRkZGRkZGRkYnICtcblx0XHQgICAgJ0ZGRkZGRkZGIEZGRkZGRkZGIEZGRkZGRkZGIEZGRkZGRkZGJyArXG5cdFx0ICAgICdGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGQycpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdGI6IEJ1ZmZlci5mcm9tKCgnNTEnICtcblx0XHQgICAgJzk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlJyArXG5cdFx0ICAgICdhMmRhNzI1YiA5OWIzMTVmMyBiOGI0ODk5MSA4ZWYxMDllMScgK1xuXHRcdCAgICAnNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgM2JiMWJmMDcnICtcblx0XHQgICAgJzM1NzNkZjg4IDNkMmMzNGYxIGVmNDUxZmQ0IDZiNTAzZjAwJykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0czogQnVmZmVyLmZyb20oKCcwMCcgK1xuXHRcdCAgICAnZDA5ZTg4MDAgMjkxY2I4NTMgOTZjYzY3MTcgMzkzMjg0YWEnICtcblx0XHQgICAgJ2EwZGE2NGJhJykucmVwbGFjZSgvIC9nLCAnJyksICdoZXgnKSxcblx0XHRuOiBCdWZmZXIuZnJvbSgoJzAxZmYnICtcblx0XHQgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyArXG5cdFx0ICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYScgK1xuXHRcdCAgICAnNTE4Njg3ODMgYmYyZjk2NmIgN2ZjYzAxNDggZjcwOWE1ZDAnICtcblx0XHQgICAgJzNiYjVjOWI4IDg5OWM0N2FlIGJiNmZiNzFlIDkxMzg2NDA5JykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0RzogQnVmZmVyLmZyb20oKCcwNCcgK1xuXHRcdCAgICAnMDBjNiA4NThlMDZiNyAwNDA0ZTljZCA5ZTNlY2I2NiAyMzk1YjQ0MicgK1xuXHRcdCAgICAgICAgICc5YzY0ODEzOSAwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYScgK1xuXHRcdCAgICAgICAgICdhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyBhMmZmYThkZScgK1xuXHRcdCAgICAgICAgICczMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NicgK1xuXHRcdCAgICAnMDExOCAzOTI5NmE3OCA5YTNiYzAwNCA1YzhhNWZiNCAyYzdkMWJkOScgK1xuXHRcdCAgICAgICAgICc5OGY1NDQ0OSA1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYycgK1xuXHRcdCAgICAgICAgICc5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAzZmFkMDc2MScgK1xuXHRcdCAgICAgICAgICczNTNjNzA4NiBhMjcyYzI0MCA4OGJlOTQ3NiA5ZmQxNjY1MCcpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpXG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRpbmZvOiBhbGdJbmZvLFxuXHRwcml2SW5mbzogYWxnUHJpdkluZm8sXG5cdGhhc2hBbGdzOiBoYXNoQWxncyxcblx0Y3VydmVzOiBjdXJ2ZXNcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTUgSm95ZW50LCBJbmMuXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIEZpbmdlcnByaW50Rm9ybWF0RXJyb3IoZnAsIGZvcm1hdCkge1xuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRmluZ2VycHJpbnRGb3JtYXRFcnJvcik7XG5cdHRoaXMubmFtZSA9ICdGaW5nZXJwcmludEZvcm1hdEVycm9yJztcblx0dGhpcy5maW5nZXJwcmludCA9IGZwO1xuXHR0aGlzLmZvcm1hdCA9IGZvcm1hdDtcblx0dGhpcy5tZXNzYWdlID0gJ0ZpbmdlcnByaW50IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLCBvciBpcyBpbnZhbGlkOiAnO1xuXHRpZiAoZnAgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLm1lc3NhZ2UgKz0gJyBmaW5nZXJwcmludCA9ICcgKyBmcDtcblx0aWYgKGZvcm1hdCAhPT0gdW5kZWZpbmVkKVxuXHRcdHRoaXMubWVzc2FnZSArPSAnIGZvcm1hdCA9ICcgKyBmb3JtYXQ7XG59XG51dGlsLmluaGVyaXRzKEZpbmdlcnByaW50Rm9ybWF0RXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gSW52YWxpZEFsZ29yaXRobUVycm9yKGFsZykge1xuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgSW52YWxpZEFsZ29yaXRobUVycm9yKTtcblx0dGhpcy5uYW1lID0gJ0ludmFsaWRBbGdvcml0aG1FcnJvcic7XG5cdHRoaXMuYWxnb3JpdGhtID0gYWxnO1xuXHR0aGlzLm1lc3NhZ2UgPSAnQWxnb3JpdGhtIFwiJyArIGFsZyArICdcIiBpcyBub3Qgc3VwcG9ydGVkJztcbn1cbnV0aWwuaW5oZXJpdHMoSW52YWxpZEFsZ29yaXRobUVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIEtleVBhcnNlRXJyb3IobmFtZSwgZm9ybWF0LCBpbm5lckVycikge1xuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgS2V5UGFyc2VFcnJvcik7XG5cdHRoaXMubmFtZSA9ICdLZXlQYXJzZUVycm9yJztcblx0dGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG5cdHRoaXMua2V5TmFtZSA9IG5hbWU7XG5cdHRoaXMuaW5uZXJFcnIgPSBpbm5lckVycjtcblx0dGhpcy5tZXNzYWdlID0gJ0ZhaWxlZCB0byBwYXJzZSAnICsgbmFtZSArICcgYXMgYSB2YWxpZCAnICsgZm9ybWF0ICtcblx0ICAgICcgZm9ybWF0IGtleTogJyArIGlubmVyRXJyLm1lc3NhZ2U7XG59XG51dGlsLmluaGVyaXRzKEtleVBhcnNlRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gU2lnbmF0dXJlUGFyc2VFcnJvcih0eXBlLCBmb3JtYXQsIGlubmVyRXJyKSB7XG5cdGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcblx0XHRFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTaWduYXR1cmVQYXJzZUVycm9yKTtcblx0dGhpcy5uYW1lID0gJ1NpZ25hdHVyZVBhcnNlRXJyb3InO1xuXHR0aGlzLnR5cGUgPSB0eXBlO1xuXHR0aGlzLmZvcm1hdCA9IGZvcm1hdDtcblx0dGhpcy5pbm5lckVyciA9IGlubmVyRXJyO1xuXHR0aGlzLm1lc3NhZ2UgPSAnRmFpbGVkIHRvIHBhcnNlIHRoZSBnaXZlbiBkYXRhIGFzIGEgJyArIHR5cGUgK1xuXHQgICAgJyBzaWduYXR1cmUgaW4gJyArIGZvcm1hdCArICcgZm9ybWF0OiAnICsgaW5uZXJFcnIubWVzc2FnZTtcbn1cbnV0aWwuaW5oZXJpdHMoU2lnbmF0dXJlUGFyc2VFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBDZXJ0aWZpY2F0ZVBhcnNlRXJyb3IobmFtZSwgZm9ybWF0LCBpbm5lckVycikge1xuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgQ2VydGlmaWNhdGVQYXJzZUVycm9yKTtcblx0dGhpcy5uYW1lID0gJ0NlcnRpZmljYXRlUGFyc2VFcnJvcic7XG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xuXHR0aGlzLmNlcnROYW1lID0gbmFtZTtcblx0dGhpcy5pbm5lckVyciA9IGlubmVyRXJyO1xuXHR0aGlzLm1lc3NhZ2UgPSAnRmFpbGVkIHRvIHBhcnNlICcgKyBuYW1lICsgJyBhcyBhIHZhbGlkICcgKyBmb3JtYXQgK1xuXHQgICAgJyBmb3JtYXQgY2VydGlmaWNhdGU6ICcgKyBpbm5lckVyci5tZXNzYWdlO1xufVxudXRpbC5pbmhlcml0cyhDZXJ0aWZpY2F0ZVBhcnNlRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gS2V5RW5jcnlwdGVkRXJyb3IobmFtZSwgZm9ybWF0KSB7XG5cdGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcblx0XHRFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBLZXlFbmNyeXB0ZWRFcnJvcik7XG5cdHRoaXMubmFtZSA9ICdLZXlFbmNyeXB0ZWRFcnJvcic7XG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xuXHR0aGlzLmtleU5hbWUgPSBuYW1lO1xuXHR0aGlzLm1lc3NhZ2UgPSAnVGhlICcgKyBmb3JtYXQgKyAnIGZvcm1hdCBrZXkgJyArIG5hbWUgKyAnIGlzICcgK1xuXHQgICAgJ2VuY3J5cHRlZCAocGFzc3dvcmQtcHJvdGVjdGVkKSwgYW5kIG5vIHBhc3NwaHJhc2Ugd2FzICcgK1xuXHQgICAgJ3Byb3ZpZGVkIGluIGBvcHRpb25zYCc7XG59XG51dGlsLmluaGVyaXRzKEtleUVuY3J5cHRlZEVycm9yLCBFcnJvcik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRGaW5nZXJwcmludEZvcm1hdEVycm9yOiBGaW5nZXJwcmludEZvcm1hdEVycm9yLFxuXHRJbnZhbGlkQWxnb3JpdGhtRXJyb3I6IEludmFsaWRBbGdvcml0aG1FcnJvcixcblx0S2V5UGFyc2VFcnJvcjogS2V5UGFyc2VFcnJvcixcblx0U2lnbmF0dXJlUGFyc2VFcnJvcjogU2lnbmF0dXJlUGFyc2VFcnJvcixcblx0S2V5RW5jcnlwdGVkRXJyb3I6IEtleUVuY3J5cHRlZEVycm9yLFxuXHRDZXJ0aWZpY2F0ZVBhcnNlRXJyb3I6IENlcnRpZmljYXRlUGFyc2VFcnJvclxufTtcbiIsICIvLyBDb3B5cmlnaHQgMjAxMSBNYXJrIENhdmFnZSA8bWNhdmFnZUBnbWFpbC5jb20+IEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgbmV3SW52YWxpZEFzbjFFcnJvcjogZnVuY3Rpb24gKG1zZykge1xuICAgIHZhciBlID0gbmV3IEVycm9yKCk7XG4gICAgZS5uYW1lID0gJ0ludmFsaWRBc24xRXJyb3InO1xuICAgIGUubWVzc2FnZSA9IG1zZyB8fCAnJztcbiAgICByZXR1cm4gZTtcbiAgfVxuXG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDExIE1hcmsgQ2F2YWdlIDxtY2F2YWdlQGdtYWlsLmNvbT4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRU9DOiAwLFxuICBCb29sZWFuOiAxLFxuICBJbnRlZ2VyOiAyLFxuICBCaXRTdHJpbmc6IDMsXG4gIE9jdGV0U3RyaW5nOiA0LFxuICBOdWxsOiA1LFxuICBPSUQ6IDYsXG4gIE9iamVjdERlc2NyaXB0b3I6IDcsXG4gIEV4dGVybmFsOiA4LFxuICBSZWFsOiA5LCAvLyBmbG9hdFxuICBFbnVtZXJhdGlvbjogMTAsXG4gIFBEVjogMTEsXG4gIFV0ZjhTdHJpbmc6IDEyLFxuICBSZWxhdGl2ZU9JRDogMTMsXG4gIFNlcXVlbmNlOiAxNixcbiAgU2V0OiAxNyxcbiAgTnVtZXJpY1N0cmluZzogMTgsXG4gIFByaW50YWJsZVN0cmluZzogMTksXG4gIFQ2MVN0cmluZzogMjAsXG4gIFZpZGVvdGV4U3RyaW5nOiAyMSxcbiAgSUE1U3RyaW5nOiAyMixcbiAgVVRDVGltZTogMjMsXG4gIEdlbmVyYWxpemVkVGltZTogMjQsXG4gIEdyYXBoaWNTdHJpbmc6IDI1LFxuICBWaXNpYmxlU3RyaW5nOiAyNixcbiAgR2VuZXJhbFN0cmluZzogMjgsXG4gIFVuaXZlcnNhbFN0cmluZzogMjksXG4gIENoYXJhY3RlclN0cmluZzogMzAsXG4gIEJNUFN0cmluZzogMzEsXG4gIENvbnN0cnVjdG9yOiAzMixcbiAgQ29udGV4dDogMTI4XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDExIE1hcmsgQ2F2YWdlIDxtY2F2YWdlQGdtYWlsLmNvbT4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIEFTTjEgPSByZXF1aXJlKCcuL3R5cGVzJyk7XG52YXIgZXJyb3JzID0gcmVxdWlyZSgnLi9lcnJvcnMnKTtcblxuXG4vLyAtLS0gR2xvYmFsc1xuXG52YXIgbmV3SW52YWxpZEFzbjFFcnJvciA9IGVycm9ycy5uZXdJbnZhbGlkQXNuMUVycm9yO1xuXG5cblxuLy8gLS0tIEFQSVxuXG5mdW5jdGlvbiBSZWFkZXIoZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIUJ1ZmZlci5pc0J1ZmZlcihkYXRhKSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYSBub2RlIEJ1ZmZlcicpO1xuXG4gIHRoaXMuX2J1ZiA9IGRhdGE7XG4gIHRoaXMuX3NpemUgPSBkYXRhLmxlbmd0aDtcblxuICAvLyBUaGVzZSBob2xkIHRoZSBcImN1cnJlbnRcIiBzdGF0ZVxuICB0aGlzLl9sZW4gPSAwO1xuICB0aGlzLl9vZmZzZXQgPSAwO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGVyLnByb3RvdHlwZSwgJ2xlbmd0aCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5fbGVuKTsgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkZXIucHJvdG90eXBlLCAnb2Zmc2V0Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLl9vZmZzZXQpOyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRlci5wcm90b3R5cGUsICdyZW1haW4nLCB7XG4gIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX3NpemUgLSB0aGlzLl9vZmZzZXQpOyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRlci5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX2J1Zi5zbGljZSh0aGlzLl9vZmZzZXQpKTsgfVxufSk7XG5cblxuLyoqXG4gKiBSZWFkcyBhIHNpbmdsZSBieXRlIGFuZCBhZHZhbmNlcyBvZmZzZXQ7IHlvdSBjYW4gcGFzcyBpbiBgdHJ1ZWAgdG8gbWFrZSB0aGlzXG4gKiBhIFwicGVla1wiIG9wZXJhdGlvbiAoaS5lLiwgZ2V0IHRoZSBieXRlLCBidXQgZG9uJ3QgYWR2YW5jZSB0aGUgb2Zmc2V0KS5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHBlZWsgdHJ1ZSBtZWFucyBkb24ndCBtb3ZlIG9mZnNldC5cbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIG5leHQgYnl0ZSwgbnVsbCBpZiBub3QgZW5vdWdoIGRhdGEuXG4gKi9cblJlYWRlci5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbiAocGVlaykge1xuICBpZiAodGhpcy5fc2l6ZSAtIHRoaXMuX29mZnNldCA8IDEpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIGIgPSB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0XSAmIDB4ZmY7XG5cbiAgaWYgKCFwZWVrKVxuICAgIHRoaXMuX29mZnNldCArPSAxO1xuXG4gIHJldHVybiBiO1xufTtcblxuXG5SZWFkZXIucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlYWRCeXRlKHRydWUpO1xufTtcblxuXG4vKipcbiAqIFJlYWRzIGEgKHBvdGVudGlhbGx5KSB2YXJpYWJsZSBsZW5ndGggb2ZmIHRoZSBCRVIgYnVmZmVyLiAgVGhpcyBjYWxsIGlzXG4gKiBub3QgcmVhbGx5IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseSwgYXMgY2FsbGVycyBoYXZlIHRvIG1hbmlwdWxhdGVcbiAqIHRoZSBpbnRlcm5hbCBidWZmZXIgYWZ0ZXJ3YXJkcy5cbiAqXG4gKiBBcyBhIHJlc3VsdCBvZiB0aGlzIGNhbGwsIHlvdSBjYW4gY2FsbCBgUmVhZGVyLmxlbmd0aGAsIHVudGlsIHRoZVxuICogbmV4dCB0aGluZyBjYWxsZWQgdGhhdCBkb2VzIGEgcmVhZExlbmd0aC5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBhbW91bnQgb2Ygb2Zmc2V0IHRvIGFkdmFuY2UgdGhlIGJ1ZmZlci5cbiAqIEB0aHJvd3Mge0ludmFsaWRBc24xRXJyb3J9IG9uIGJhZCBBU04uMVxuICovXG5SZWFkZXIucHJvdG90eXBlLnJlYWRMZW5ndGggPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZClcbiAgICBvZmZzZXQgPSB0aGlzLl9vZmZzZXQ7XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLl9zaXplKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciBsZW5CID0gdGhpcy5fYnVmW29mZnNldCsrXSAmIDB4ZmY7XG4gIGlmIChsZW5CID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmICgobGVuQiAmIDB4ODApID09PSAweDgwKSB7XG4gICAgbGVuQiAmPSAweDdmO1xuXG4gICAgaWYgKGxlbkIgPT09IDApXG4gICAgICB0aHJvdyBuZXdJbnZhbGlkQXNuMUVycm9yKCdJbmRlZmluaXRlIGxlbmd0aCBub3Qgc3VwcG9ydGVkJyk7XG5cbiAgICBpZiAobGVuQiA+IDQpXG4gICAgICB0aHJvdyBuZXdJbnZhbGlkQXNuMUVycm9yKCdlbmNvZGluZyB0b28gbG9uZycpO1xuXG4gICAgaWYgKHRoaXMuX3NpemUgLSBvZmZzZXQgPCBsZW5CKVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLl9sZW4gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuQjsgaSsrKVxuICAgICAgdGhpcy5fbGVuID0gKHRoaXMuX2xlbiA8PCA4KSArICh0aGlzLl9idWZbb2Zmc2V0KytdICYgMHhmZik7XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBXYXNuJ3QgYSB2YXJpYWJsZSBsZW5ndGhcbiAgICB0aGlzLl9sZW4gPSBsZW5CO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldDtcbn07XG5cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG5leHQgc2VxdWVuY2UgaW4gdGhpcyBCRVIgYnVmZmVyLlxuICpcbiAqIFRvIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgY2FsbCBgUmVhZGVyLmxlbmd0aGAuXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgc2VxdWVuY2UncyB0YWcuXG4gKi9cblJlYWRlci5wcm90b3R5cGUucmVhZFNlcXVlbmNlID0gZnVuY3Rpb24gKHRhZykge1xuICB2YXIgc2VxID0gdGhpcy5wZWVrKCk7XG4gIGlmIChzZXEgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0YWcgIT09IHVuZGVmaW5lZCAmJiB0YWcgIT09IHNlcSlcbiAgICB0aHJvdyBuZXdJbnZhbGlkQXNuMUVycm9yKCdFeHBlY3RlZCAweCcgKyB0YWcudG9TdHJpbmcoMTYpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc6IGdvdCAweCcgKyBzZXEudG9TdHJpbmcoMTYpKTtcblxuICB2YXIgbyA9IHRoaXMucmVhZExlbmd0aCh0aGlzLl9vZmZzZXQgKyAxKTsgLy8gc3RvcmVkIGluIGBsZW5ndGhgXG4gIGlmIChvID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHRoaXMuX29mZnNldCA9IG87XG4gIHJldHVybiBzZXE7XG59O1xuXG5cblJlYWRlci5wcm90b3R5cGUucmVhZEludCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRUYWcoQVNOMS5JbnRlZ2VyKTtcbn07XG5cblxuUmVhZGVyLnByb3RvdHlwZS5yZWFkQm9vbGVhbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLl9yZWFkVGFnKEFTTjEuQm9vbGVhbikgPT09IDAgPyBmYWxzZSA6IHRydWUpO1xufTtcblxuXG5SZWFkZXIucHJvdG90eXBlLnJlYWRFbnVtZXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRUYWcoQVNOMS5FbnVtZXJhdGlvbik7XG59O1xuXG5cblJlYWRlci5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uICh0YWcsIHJldGJ1Zikge1xuICBpZiAoIXRhZylcbiAgICB0YWcgPSBBU04xLk9jdGV0U3RyaW5nO1xuXG4gIHZhciBiID0gdGhpcy5wZWVrKCk7XG4gIGlmIChiID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmIChiICE9PSB0YWcpXG4gICAgdGhyb3cgbmV3SW52YWxpZEFzbjFFcnJvcignRXhwZWN0ZWQgMHgnICsgdGFnLnRvU3RyaW5nKDE2KSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiBnb3QgMHgnICsgYi50b1N0cmluZygxNikpO1xuXG4gIHZhciBvID0gdGhpcy5yZWFkTGVuZ3RoKHRoaXMuX29mZnNldCArIDEpOyAvLyBzdG9yZWQgaW4gYGxlbmd0aGBcblxuICBpZiAobyA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAodGhpcy5sZW5ndGggPiB0aGlzLl9zaXplIC0gbylcbiAgICByZXR1cm4gbnVsbDtcblxuICB0aGlzLl9vZmZzZXQgPSBvO1xuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gcmV0YnVmID8gQnVmZmVyLmFsbG9jKDApIDogJyc7XG5cbiAgdmFyIHN0ciA9IHRoaXMuX2J1Zi5zbGljZSh0aGlzLl9vZmZzZXQsIHRoaXMuX29mZnNldCArIHRoaXMubGVuZ3RoKTtcbiAgdGhpcy5fb2Zmc2V0ICs9IHRoaXMubGVuZ3RoO1xuXG4gIHJldHVybiByZXRidWYgPyBzdHIgOiBzdHIudG9TdHJpbmcoJ3V0ZjgnKTtcbn07XG5cblJlYWRlci5wcm90b3R5cGUucmVhZE9JRCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgaWYgKCF0YWcpXG4gICAgdGFnID0gQVNOMS5PSUQ7XG5cbiAgdmFyIGIgPSB0aGlzLnJlYWRTdHJpbmcodGFnLCB0cnVlKTtcbiAgaWYgKGIgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHZhbHVlcyA9IFtdO1xuICB2YXIgdmFsdWUgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBieXRlID0gYltpXSAmIDB4ZmY7XG5cbiAgICB2YWx1ZSA8PD0gNztcbiAgICB2YWx1ZSArPSBieXRlICYgMHg3ZjtcbiAgICBpZiAoKGJ5dGUgJiAweDgwKSA9PT0gMCkge1xuICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgdmFsdWUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHZhbHVlID0gdmFsdWVzLnNoaWZ0KCk7XG4gIHZhbHVlcy51bnNoaWZ0KHZhbHVlICUgNDApO1xuICB2YWx1ZXMudW5zaGlmdCgodmFsdWUgLyA0MCkgPj4gMCk7XG5cbiAgcmV0dXJuIHZhbHVlcy5qb2luKCcuJyk7XG59O1xuXG5cblJlYWRlci5wcm90b3R5cGUuX3JlYWRUYWcgPSBmdW5jdGlvbiAodGFnKSB7XG4gIGFzc2VydC5vayh0YWcgIT09IHVuZGVmaW5lZCk7XG5cbiAgdmFyIGIgPSB0aGlzLnBlZWsoKTtcblxuICBpZiAoYiA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAoYiAhPT0gdGFnKVxuICAgIHRocm93IG5ld0ludmFsaWRBc24xRXJyb3IoJ0V4cGVjdGVkIDB4JyArIHRhZy50b1N0cmluZygxNikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzogZ290IDB4JyArIGIudG9TdHJpbmcoMTYpKTtcblxuICB2YXIgbyA9IHRoaXMucmVhZExlbmd0aCh0aGlzLl9vZmZzZXQgKyAxKTsgLy8gc3RvcmVkIGluIGBsZW5ndGhgXG4gIGlmIChvID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmICh0aGlzLmxlbmd0aCA+IDQpXG4gICAgdGhyb3cgbmV3SW52YWxpZEFzbjFFcnJvcignSW50ZWdlciB0b28gbG9uZzogJyArIHRoaXMubGVuZ3RoKTtcblxuICBpZiAodGhpcy5sZW5ndGggPiB0aGlzLl9zaXplIC0gbylcbiAgICByZXR1cm4gbnVsbDtcbiAgdGhpcy5fb2Zmc2V0ID0gbztcblxuICB2YXIgZmIgPSB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0XTtcbiAgdmFyIHZhbHVlID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YWx1ZSA8PD0gODtcbiAgICB2YWx1ZSB8PSAodGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSAmIDB4ZmYpO1xuICB9XG5cbiAgaWYgKChmYiAmIDB4ODApID09PSAweDgwICYmIGkgIT09IDQpXG4gICAgdmFsdWUgLT0gKDEgPDwgKGkgKiA4KSk7XG5cbiAgcmV0dXJuIHZhbHVlID4+IDA7XG59O1xuXG5cblxuLy8gLS0tIEV4cG9ydGVkIEFQSVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRlcjtcbiIsICIvLyBDb3B5cmlnaHQgMjAxMSBNYXJrIENhdmFnZSA8bWNhdmFnZUBnbWFpbC5jb20+IEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgQVNOMSA9IHJlcXVpcmUoJy4vdHlwZXMnKTtcbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xuXG5cbi8vIC0tLSBHbG9iYWxzXG5cbnZhciBuZXdJbnZhbGlkQXNuMUVycm9yID0gZXJyb3JzLm5ld0ludmFsaWRBc24xRXJyb3I7XG5cbnZhciBERUZBVUxUX09QVFMgPSB7XG4gIHNpemU6IDEwMjQsXG4gIGdyb3d0aEZhY3RvcjogOFxufTtcblxuXG4vLyAtLS0gSGVscGVyc1xuXG5mdW5jdGlvbiBtZXJnZShmcm9tLCB0bykge1xuICBhc3NlcnQub2soZnJvbSk7XG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgKGZyb20pLCAnb2JqZWN0Jyk7XG4gIGFzc2VydC5vayh0byk7XG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgKHRvKSwgJ29iamVjdCcpO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZnJvbSk7XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKHRvW2tleV0pXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGZyb20sIGtleSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRvLCBrZXksIHZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRvO1xufVxuXG5cblxuLy8gLS0tIEFQSVxuXG5mdW5jdGlvbiBXcml0ZXIob3B0aW9ucykge1xuICBvcHRpb25zID0gbWVyZ2UoREVGQVVMVF9PUFRTLCBvcHRpb25zIHx8IHt9KTtcblxuICB0aGlzLl9idWYgPSBCdWZmZXIuYWxsb2Mob3B0aW9ucy5zaXplIHx8IDEwMjQpO1xuICB0aGlzLl9zaXplID0gdGhpcy5fYnVmLmxlbmd0aDtcbiAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgLy8gQSBsaXN0IG9mIG9mZnNldHMgaW4gdGhlIGJ1ZmZlciB3aGVyZSB3ZSBuZWVkIHRvIGluc2VydFxuICAvLyBzZXF1ZW5jZSB0YWcvbGVuIHBhaXJzLlxuICB0aGlzLl9zZXEgPSBbXTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRlci5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9zZXEubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3SW52YWxpZEFzbjFFcnJvcih0aGlzLl9zZXEubGVuZ3RoICsgJyB1bmVuZGVkIHNlcXVlbmNlKHMpJyk7XG5cbiAgICByZXR1cm4gKHRoaXMuX2J1Zi5zbGljZSgwLCB0aGlzLl9vZmZzZXQpKTtcbiAgfVxufSk7XG5cbldyaXRlci5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24gKGIpIHtcbiAgaWYgKHR5cGVvZiAoYikgIT09ICdudW1iZXInKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG11c3QgYmUgYSBOdW1iZXInKTtcblxuICB0aGlzLl9lbnN1cmUoMSk7XG4gIHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK10gPSBiO1xufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLndyaXRlSW50ID0gZnVuY3Rpb24gKGksIHRhZykge1xuICBpZiAodHlwZW9mIChpKSAhPT0gJ251bWJlcicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICBpZiAodHlwZW9mICh0YWcpICE9PSAnbnVtYmVyJylcbiAgICB0YWcgPSBBU04xLkludGVnZXI7XG5cbiAgdmFyIHN6ID0gNDtcblxuICB3aGlsZSAoKCgoaSAmIDB4ZmY4MDAwMDApID09PSAwKSB8fCAoKGkgJiAweGZmODAwMDAwKSA9PT0gMHhmZjgwMDAwMCA+PiAwKSkgJiZcbiAgICAgICAgKHN6ID4gMSkpIHtcbiAgICBzei0tO1xuICAgIGkgPDw9IDg7XG4gIH1cblxuICBpZiAoc3ogPiA0KVxuICAgIHRocm93IG5ld0ludmFsaWRBc24xRXJyb3IoJ0JFUiBpbnRzIGNhbm5vdCBiZSA+IDB4ZmZmZmZmZmYnKTtcblxuICB0aGlzLl9lbnN1cmUoMiArIHN6KTtcbiAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IHRhZztcbiAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IHN6O1xuXG4gIHdoaWxlIChzei0tID4gMCkge1xuICAgIHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK10gPSAoKGkgJiAweGZmMDAwMDAwKSA+Pj4gMjQpO1xuICAgIGkgPDw9IDg7XG4gIH1cblxufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLndyaXRlTnVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy53cml0ZUJ5dGUoQVNOMS5OdWxsKTtcbiAgdGhpcy53cml0ZUJ5dGUoMHgwMCk7XG59O1xuXG5cbldyaXRlci5wcm90b3R5cGUud3JpdGVFbnVtZXJhdGlvbiA9IGZ1bmN0aW9uIChpLCB0YWcpIHtcbiAgaWYgKHR5cGVvZiAoaSkgIT09ICdudW1iZXInKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgaWYgKHR5cGVvZiAodGFnKSAhPT0gJ251bWJlcicpXG4gICAgdGFnID0gQVNOMS5FbnVtZXJhdGlvbjtcblxuICByZXR1cm4gdGhpcy53cml0ZUludChpLCB0YWcpO1xufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLndyaXRlQm9vbGVhbiA9IGZ1bmN0aW9uIChiLCB0YWcpIHtcbiAgaWYgKHR5cGVvZiAoYikgIT09ICdib29sZWFuJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBtdXN0IGJlIGEgQm9vbGVhbicpO1xuICBpZiAodHlwZW9mICh0YWcpICE9PSAnbnVtYmVyJylcbiAgICB0YWcgPSBBU04xLkJvb2xlYW47XG5cbiAgdGhpcy5fZW5zdXJlKDMpO1xuICB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdID0gdGFnO1xuICB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdID0gMHgwMTtcbiAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGIgPyAweGZmIDogMHgwMDtcbn07XG5cblxuV3JpdGVyLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uIChzLCB0YWcpIHtcbiAgaWYgKHR5cGVvZiAocykgIT09ICdzdHJpbmcnKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgKHdhczogJyArIHR5cGVvZiAocykgKyAnKScpO1xuICBpZiAodHlwZW9mICh0YWcpICE9PSAnbnVtYmVyJylcbiAgICB0YWcgPSBBU04xLk9jdGV0U3RyaW5nO1xuXG4gIHZhciBsZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aChzKTtcbiAgdGhpcy53cml0ZUJ5dGUodGFnKTtcbiAgdGhpcy53cml0ZUxlbmd0aChsZW4pO1xuICBpZiAobGVuKSB7XG4gICAgdGhpcy5fZW5zdXJlKGxlbik7XG4gICAgdGhpcy5fYnVmLndyaXRlKHMsIHRoaXMuX29mZnNldCk7XG4gICAgdGhpcy5fb2Zmc2V0ICs9IGxlbjtcbiAgfVxufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLndyaXRlQnVmZmVyID0gZnVuY3Rpb24gKGJ1ZiwgdGFnKSB7XG4gIGlmICh0eXBlb2YgKHRhZykgIT09ICdudW1iZXInKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhZyBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbXVzdCBiZSBhIGJ1ZmZlcicpO1xuXG4gIHRoaXMud3JpdGVCeXRlKHRhZyk7XG4gIHRoaXMud3JpdGVMZW5ndGgoYnVmLmxlbmd0aCk7XG4gIHRoaXMuX2Vuc3VyZShidWYubGVuZ3RoKTtcbiAgYnVmLmNvcHkodGhpcy5fYnVmLCB0aGlzLl9vZmZzZXQsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLl9vZmZzZXQgKz0gYnVmLmxlbmd0aDtcbn07XG5cblxuV3JpdGVyLnByb3RvdHlwZS53cml0ZVN0cmluZ0FycmF5ID0gZnVuY3Rpb24gKHN0cmluZ3MpIHtcbiAgaWYgKCghc3RyaW5ncyBpbnN0YW5jZW9mIEFycmF5KSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5W1N0cmluZ10nKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICAgIHNlbGYud3JpdGVTdHJpbmcocyk7XG4gIH0pO1xufTtcblxuLy8gVGhpcyBpcyByZWFsbHkgdG8gc29sdmUgREVSIGNhc2VzLCBidXQgd2hhdGV2ZXIgZm9yIG5vd1xuV3JpdGVyLnByb3RvdHlwZS53cml0ZU9JRCA9IGZ1bmN0aW9uIChzLCB0YWcpIHtcbiAgaWYgKHR5cGVvZiAocykgIT09ICdzdHJpbmcnKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgaWYgKHR5cGVvZiAodGFnKSAhPT0gJ251bWJlcicpXG4gICAgdGFnID0gQVNOMS5PSUQ7XG5cbiAgaWYgKCEvXihbMC05XStcXC4pezMsfVswLTldKyQvLnRlc3QocykpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBPSUQgc3RyaW5nJyk7XG5cbiAgZnVuY3Rpb24gZW5jb2RlT2N0ZXQoYnl0ZXMsIG9jdGV0KSB7XG4gICAgaWYgKG9jdGV0IDwgMTI4KSB7XG4gICAgICAgIGJ5dGVzLnB1c2gob2N0ZXQpO1xuICAgIH0gZWxzZSBpZiAob2N0ZXQgPCAxNjM4NCkge1xuICAgICAgICBieXRlcy5wdXNoKChvY3RldCA+Pj4gNykgfCAweDgwKTtcbiAgICAgICAgYnl0ZXMucHVzaChvY3RldCAmIDB4N0YpO1xuICAgIH0gZWxzZSBpZiAob2N0ZXQgPCAyMDk3MTUyKSB7XG4gICAgICBieXRlcy5wdXNoKChvY3RldCA+Pj4gMTQpIHwgMHg4MCk7XG4gICAgICBieXRlcy5wdXNoKCgob2N0ZXQgPj4+IDcpIHwgMHg4MCkgJiAweEZGKTtcbiAgICAgIGJ5dGVzLnB1c2gob2N0ZXQgJiAweDdGKTtcbiAgICB9IGVsc2UgaWYgKG9jdGV0IDwgMjY4NDM1NDU2KSB7XG4gICAgICBieXRlcy5wdXNoKChvY3RldCA+Pj4gMjEpIHwgMHg4MCk7XG4gICAgICBieXRlcy5wdXNoKCgob2N0ZXQgPj4+IDE0KSB8IDB4ODApICYgMHhGRik7XG4gICAgICBieXRlcy5wdXNoKCgob2N0ZXQgPj4+IDcpIHwgMHg4MCkgJiAweEZGKTtcbiAgICAgIGJ5dGVzLnB1c2gob2N0ZXQgJiAweDdGKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnl0ZXMucHVzaCgoKG9jdGV0ID4+PiAyOCkgfCAweDgwKSAmIDB4RkYpO1xuICAgICAgYnl0ZXMucHVzaCgoKG9jdGV0ID4+PiAyMSkgfCAweDgwKSAmIDB4RkYpO1xuICAgICAgYnl0ZXMucHVzaCgoKG9jdGV0ID4+PiAxNCkgfCAweDgwKSAmIDB4RkYpO1xuICAgICAgYnl0ZXMucHVzaCgoKG9jdGV0ID4+PiA3KSB8IDB4ODApICYgMHhGRik7XG4gICAgICBieXRlcy5wdXNoKG9jdGV0ICYgMHg3Rik7XG4gICAgfVxuICB9XG5cbiAgdmFyIHRtcCA9IHMuc3BsaXQoJy4nKTtcbiAgdmFyIGJ5dGVzID0gW107XG4gIGJ5dGVzLnB1c2gocGFyc2VJbnQodG1wWzBdLCAxMCkgKiA0MCArIHBhcnNlSW50KHRtcFsxXSwgMTApKTtcbiAgdG1wLnNsaWNlKDIpLmZvckVhY2goZnVuY3Rpb24gKGIpIHtcbiAgICBlbmNvZGVPY3RldChieXRlcywgcGFyc2VJbnQoYiwgMTApKTtcbiAgfSk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9lbnN1cmUoMiArIGJ5dGVzLmxlbmd0aCk7XG4gIHRoaXMud3JpdGVCeXRlKHRhZyk7XG4gIHRoaXMud3JpdGVMZW5ndGgoYnl0ZXMubGVuZ3RoKTtcbiAgYnl0ZXMuZm9yRWFjaChmdW5jdGlvbiAoYikge1xuICAgIHNlbGYud3JpdGVCeXRlKGIpO1xuICB9KTtcbn07XG5cblxuV3JpdGVyLnByb3RvdHlwZS53cml0ZUxlbmd0aCA9IGZ1bmN0aW9uIChsZW4pIHtcbiAgaWYgKHR5cGVvZiAobGVuKSAhPT0gJ251bWJlcicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbXVzdCBiZSBhIE51bWJlcicpO1xuXG4gIHRoaXMuX2Vuc3VyZSg0KTtcblxuICBpZiAobGVuIDw9IDB4N2YpIHtcbiAgICB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdID0gbGVuO1xuICB9IGVsc2UgaWYgKGxlbiA8PSAweGZmKSB7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IDB4ODE7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGxlbjtcbiAgfSBlbHNlIGlmIChsZW4gPD0gMHhmZmZmKSB7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IDB4ODI7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGxlbiA+PiA4O1xuICAgIHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK10gPSBsZW47XG4gIH0gZWxzZSBpZiAobGVuIDw9IDB4ZmZmZmZmKSB7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IDB4ODM7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGxlbiA+PiAxNjtcbiAgICB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdID0gbGVuID4+IDg7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGxlbjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXdJbnZhbGlkQXNuMUVycm9yKCdMZW5ndGggdG9vIGxvbmcgKD4gNCBieXRlcyknKTtcbiAgfVxufTtcblxuV3JpdGVyLnByb3RvdHlwZS5zdGFydFNlcXVlbmNlID0gZnVuY3Rpb24gKHRhZykge1xuICBpZiAodHlwZW9mICh0YWcpICE9PSAnbnVtYmVyJylcbiAgICB0YWcgPSBBU04xLlNlcXVlbmNlIHwgQVNOMS5Db25zdHJ1Y3RvcjtcblxuICB0aGlzLndyaXRlQnl0ZSh0YWcpO1xuICB0aGlzLl9zZXEucHVzaCh0aGlzLl9vZmZzZXQpO1xuICB0aGlzLl9lbnN1cmUoMyk7XG4gIHRoaXMuX29mZnNldCArPSAzO1xufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLmVuZFNlcXVlbmNlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VxID0gdGhpcy5fc2VxLnBvcCgpO1xuICB2YXIgc3RhcnQgPSBzZXEgKyAzO1xuICB2YXIgbGVuID0gdGhpcy5fb2Zmc2V0IC0gc3RhcnQ7XG5cbiAgaWYgKGxlbiA8PSAweDdmKSB7XG4gICAgdGhpcy5fc2hpZnQoc3RhcnQsIGxlbiwgLTIpO1xuICAgIHRoaXMuX2J1ZltzZXFdID0gbGVuO1xuICB9IGVsc2UgaWYgKGxlbiA8PSAweGZmKSB7XG4gICAgdGhpcy5fc2hpZnQoc3RhcnQsIGxlbiwgLTEpO1xuICAgIHRoaXMuX2J1ZltzZXFdID0gMHg4MTtcbiAgICB0aGlzLl9idWZbc2VxICsgMV0gPSBsZW47XG4gIH0gZWxzZSBpZiAobGVuIDw9IDB4ZmZmZikge1xuICAgIHRoaXMuX2J1ZltzZXFdID0gMHg4MjtcbiAgICB0aGlzLl9idWZbc2VxICsgMV0gPSBsZW4gPj4gODtcbiAgICB0aGlzLl9idWZbc2VxICsgMl0gPSBsZW47XG4gIH0gZWxzZSBpZiAobGVuIDw9IDB4ZmZmZmZmKSB7XG4gICAgdGhpcy5fc2hpZnQoc3RhcnQsIGxlbiwgMSk7XG4gICAgdGhpcy5fYnVmW3NlcV0gPSAweDgzO1xuICAgIHRoaXMuX2J1ZltzZXEgKyAxXSA9IGxlbiA+PiAxNjtcbiAgICB0aGlzLl9idWZbc2VxICsgMl0gPSBsZW4gPj4gODtcbiAgICB0aGlzLl9idWZbc2VxICsgM10gPSBsZW47XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3SW52YWxpZEFzbjFFcnJvcignU2VxdWVuY2UgdG9vIGxvbmcnKTtcbiAgfVxufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLl9zaGlmdCA9IGZ1bmN0aW9uIChzdGFydCwgbGVuLCBzaGlmdCkge1xuICBhc3NlcnQub2soc3RhcnQgIT09IHVuZGVmaW5lZCk7XG4gIGFzc2VydC5vayhsZW4gIT09IHVuZGVmaW5lZCk7XG4gIGFzc2VydC5vayhzaGlmdCk7XG5cbiAgdGhpcy5fYnVmLmNvcHkodGhpcy5fYnVmLCBzdGFydCArIHNoaWZ0LCBzdGFydCwgc3RhcnQgKyBsZW4pO1xuICB0aGlzLl9vZmZzZXQgKz0gc2hpZnQ7XG59O1xuXG5Xcml0ZXIucHJvdG90eXBlLl9lbnN1cmUgPSBmdW5jdGlvbiAobGVuKSB7XG4gIGFzc2VydC5vayhsZW4pO1xuXG4gIGlmICh0aGlzLl9zaXplIC0gdGhpcy5fb2Zmc2V0IDwgbGVuKSB7XG4gICAgdmFyIHN6ID0gdGhpcy5fc2l6ZSAqIHRoaXMuX29wdGlvbnMuZ3Jvd3RoRmFjdG9yO1xuICAgIGlmIChzeiAtIHRoaXMuX29mZnNldCA8IGxlbilcbiAgICAgIHN6ICs9IGxlbjtcblxuICAgIHZhciBidWYgPSBCdWZmZXIuYWxsb2Moc3opO1xuXG4gICAgdGhpcy5fYnVmLmNvcHkoYnVmLCAwLCAwLCB0aGlzLl9vZmZzZXQpO1xuICAgIHRoaXMuX2J1ZiA9IGJ1ZjtcbiAgICB0aGlzLl9zaXplID0gc3o7XG4gIH1cbn07XG5cblxuXG4vLyAtLS0gRXhwb3J0ZWQgQVBJXG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGVyO1xuIiwgIi8vIENvcHlyaWdodCAyMDExIE1hcmsgQ2F2YWdlIDxtY2F2YWdlQGdtYWlsLmNvbT4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGVycm9ycyA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG52YXIgdHlwZXMgPSByZXF1aXJlKCcuL3R5cGVzJyk7XG5cbnZhciBSZWFkZXIgPSByZXF1aXJlKCcuL3JlYWRlcicpO1xudmFyIFdyaXRlciA9IHJlcXVpcmUoJy4vd3JpdGVyJyk7XG5cblxuLy8gLS0tIEV4cG9ydHNcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgUmVhZGVyOiBSZWFkZXIsXG5cbiAgV3JpdGVyOiBXcml0ZXJcblxufTtcblxuZm9yICh2YXIgdCBpbiB0eXBlcykge1xuICBpZiAodHlwZXMuaGFzT3duUHJvcGVydHkodCkpXG4gICAgbW9kdWxlLmV4cG9ydHNbdF0gPSB0eXBlc1t0XTtcbn1cbmZvciAodmFyIGUgaW4gZXJyb3JzKSB7XG4gIGlmIChlcnJvcnMuaGFzT3duUHJvcGVydHkoZSkpXG4gICAgbW9kdWxlLmV4cG9ydHNbZV0gPSBlcnJvcnNbZV07XG59XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTEgTWFyayBDYXZhZ2UgPG1jYXZhZ2VAZ21haWwuY29tPiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG4vLyBJZiB5b3UgaGF2ZSBubyBpZGVhIHdoYXQgQVNOLjEgb3IgQkVSIGlzLCBzZWUgdGhpczpcbi8vIGZ0cDovL2Z0cC5yc2EuY29tL3B1Yi9wa2NzL2FzY2lpL2xheW1hbi5hc2NcblxudmFyIEJlciA9IHJlcXVpcmUoJy4vYmVyL2luZGV4Jyk7XG5cblxuXG4vLyAtLS0gRXhwb3J0ZWQgQVBJXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIEJlcjogQmVyLFxuXG4gIEJlclJlYWRlcjogQmVyLlJlYWRlcixcblxuICBCZXJXcml0ZXI6IEJlci5Xcml0ZXJcblxufTtcbiIsICIoZnVuY3Rpb24oKXtcblxuICAgIC8vIENvcHlyaWdodCAoYykgMjAwNSAgVG9tIFd1XG4gICAgLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAvLyBTZWUgXCJMSUNFTlNFXCIgZm9yIGRldGFpbHMuXG5cbiAgICAvLyBCYXNpYyBKYXZhU2NyaXB0IEJOIGxpYnJhcnkgLSBzdWJzZXQgdXNlZnVsIGZvciBSU0EgZW5jcnlwdGlvbi5cblxuICAgIC8vIEJpdHMgcGVyIGRpZ2l0XG4gICAgdmFyIGRiaXRzO1xuXG4gICAgLy8gSmF2YVNjcmlwdCBlbmdpbmUgYW5hbHlzaXNcbiAgICB2YXIgY2FuYXJ5ID0gMHhkZWFkYmVlZmNhZmU7XG4gICAgdmFyIGpfbG0gPSAoKGNhbmFyeSYweGZmZmZmZik9PTB4ZWZjYWZlKTtcblxuICAgIC8vIChwdWJsaWMpIENvbnN0cnVjdG9yXG4gICAgZnVuY3Rpb24gQmlnSW50ZWdlcihhLGIsYykge1xuICAgICAgaWYoYSAhPSBudWxsKVxuICAgICAgICBpZihcIm51bWJlclwiID09IHR5cGVvZiBhKSB0aGlzLmZyb21OdW1iZXIoYSxiLGMpO1xuICAgICAgICBlbHNlIGlmKGIgPT0gbnVsbCAmJiBcInN0cmluZ1wiICE9IHR5cGVvZiBhKSB0aGlzLmZyb21TdHJpbmcoYSwyNTYpO1xuICAgICAgICBlbHNlIHRoaXMuZnJvbVN0cmluZyhhLGIpO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBuZXcsIHVuc2V0IEJpZ0ludGVnZXJcbiAgICBmdW5jdGlvbiBuYmkoKSB7IHJldHVybiBuZXcgQmlnSW50ZWdlcihudWxsKTsgfVxuXG4gICAgLy8gYW06IENvbXB1dGUgd19qICs9ICh4KnRoaXNfaSksIHByb3BhZ2F0ZSBjYXJyaWVzLFxuICAgIC8vIGMgaXMgaW5pdGlhbCBjYXJyeSwgcmV0dXJucyBmaW5hbCBjYXJyeS5cbiAgICAvLyBjIDwgMypkdmFsdWUsIHggPCAyKmR2YWx1ZSwgdGhpc19pIDwgZHZhbHVlXG4gICAgLy8gV2UgbmVlZCB0byBzZWxlY3QgdGhlIGZhc3Rlc3Qgb25lIHRoYXQgd29ya3MgaW4gdGhpcyBlbnZpcm9ubWVudC5cblxuICAgIC8vIGFtMTogdXNlIGEgc2luZ2xlIG11bHQgYW5kIGRpdmlkZSB0byBnZXQgdGhlIGhpZ2ggYml0cyxcbiAgICAvLyBtYXggZGlnaXQgYml0cyBzaG91bGQgYmUgMjYgYmVjYXVzZVxuICAgIC8vIG1heCBpbnRlcm5hbCB2YWx1ZSA9IDIqZHZhbHVlXjItMipkdmFsdWUgKDwgMl41MylcbiAgICBmdW5jdGlvbiBhbTEoaSx4LHcsaixjLG4pIHtcbiAgICAgIHdoaWxlKC0tbiA+PSAwKSB7XG4gICAgICAgIHZhciB2ID0geCp0aGlzW2krK10rd1tqXStjO1xuICAgICAgICBjID0gTWF0aC5mbG9vcih2LzB4NDAwMDAwMCk7XG4gICAgICAgIHdbaisrXSA9IHYmMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfVxuICAgIC8vIGFtMiBhdm9pZHMgYSBiaWcgbXVsdC1hbmQtZXh0cmFjdCBjb21wbGV0ZWx5LlxuICAgIC8vIE1heCBkaWdpdCBiaXRzIHNob3VsZCBiZSA8PSAzMCBiZWNhdXNlIHdlIGRvIGJpdHdpc2Ugb3BzXG4gICAgLy8gb24gdmFsdWVzIHVwIHRvIDIqaGR2YWx1ZV4yLWhkdmFsdWUtMSAoPCAyXjMxKVxuICAgIGZ1bmN0aW9uIGFtMihpLHgsdyxqLGMsbikge1xuICAgICAgdmFyIHhsID0geCYweDdmZmYsIHhoID0geD4+MTU7XG4gICAgICB3aGlsZSgtLW4gPj0gMCkge1xuICAgICAgICB2YXIgbCA9IHRoaXNbaV0mMHg3ZmZmO1xuICAgICAgICB2YXIgaCA9IHRoaXNbaSsrXT4+MTU7XG4gICAgICAgIHZhciBtID0geGgqbCtoKnhsO1xuICAgICAgICBsID0geGwqbCsoKG0mMHg3ZmZmKTw8MTUpK3dbal0rKGMmMHgzZmZmZmZmZik7XG4gICAgICAgIGMgPSAobD4+PjMwKSsobT4+PjE1KSt4aCpoKyhjPj4+MzApO1xuICAgICAgICB3W2orK10gPSBsJjB4M2ZmZmZmZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgLy8gQWx0ZXJuYXRlbHksIHNldCBtYXggZGlnaXQgYml0cyB0byAyOCBzaW5jZSBzb21lXG4gICAgLy8gYnJvd3NlcnMgc2xvdyBkb3duIHdoZW4gZGVhbGluZyB3aXRoIDMyLWJpdCBudW1iZXJzLlxuICAgIGZ1bmN0aW9uIGFtMyhpLHgsdyxqLGMsbikge1xuICAgICAgdmFyIHhsID0geCYweDNmZmYsIHhoID0geD4+MTQ7XG4gICAgICB3aGlsZSgtLW4gPj0gMCkge1xuICAgICAgICB2YXIgbCA9IHRoaXNbaV0mMHgzZmZmO1xuICAgICAgICB2YXIgaCA9IHRoaXNbaSsrXT4+MTQ7XG4gICAgICAgIHZhciBtID0geGgqbCtoKnhsO1xuICAgICAgICBsID0geGwqbCsoKG0mMHgzZmZmKTw8MTQpK3dbal0rYztcbiAgICAgICAgYyA9IChsPj4yOCkrKG0+PjE0KSt4aCpoO1xuICAgICAgICB3W2orK10gPSBsJjB4ZmZmZmZmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICB2YXIgaW5Ccm93c2VyID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICBpZihpbkJyb3dzZXIgJiYgal9sbSAmJiAobmF2aWdhdG9yLmFwcE5hbWUgPT0gXCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIikpIHtcbiAgICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0yO1xuICAgICAgZGJpdHMgPSAzMDtcbiAgICB9XG4gICAgZWxzZSBpZihpbkJyb3dzZXIgJiYgal9sbSAmJiAobmF2aWdhdG9yLmFwcE5hbWUgIT0gXCJOZXRzY2FwZVwiKSkge1xuICAgICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW0gPSBhbTE7XG4gICAgICBkYml0cyA9IDI2O1xuICAgIH1cbiAgICBlbHNlIHsgLy8gTW96aWxsYS9OZXRzY2FwZSBzZWVtcyB0byBwcmVmZXIgYW0zXG4gICAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMztcbiAgICAgIGRiaXRzID0gMjg7XG4gICAgfVxuXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuREIgPSBkYml0cztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETSA9ICgoMTw8ZGJpdHMpLTEpO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkRWID0gKDE8PGRiaXRzKTtcblxuICAgIHZhciBCSV9GUCA9IDUyO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkZWID0gTWF0aC5wb3coMixCSV9GUCk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRjEgPSBCSV9GUC1kYml0cztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMiA9IDIqZGJpdHMtQklfRlA7XG5cbiAgICAvLyBEaWdpdCBjb252ZXJzaW9uc1xuICAgIHZhciBCSV9STSA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gICAgdmFyIEJJX1JDID0gbmV3IEFycmF5KCk7XG4gICAgdmFyIHJyLHZ2O1xuICAgIHJyID0gXCIwXCIuY2hhckNvZGVBdCgwKTtcbiAgICBmb3IodnYgPSAwOyB2diA8PSA5OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xuICAgIHJyID0gXCJhXCIuY2hhckNvZGVBdCgwKTtcbiAgICBmb3IodnYgPSAxMDsgdnYgPCAzNjsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcbiAgICByciA9IFwiQVwiLmNoYXJDb2RlQXQoMCk7XG4gICAgZm9yKHZ2ID0gMTA7IHZ2IDwgMzY7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG5cbiAgICBmdW5jdGlvbiBpbnQyY2hhcihuKSB7IHJldHVybiBCSV9STS5jaGFyQXQobik7IH1cbiAgICBmdW5jdGlvbiBpbnRBdChzLGkpIHtcbiAgICAgIHZhciBjID0gQklfUkNbcy5jaGFyQ29kZUF0KGkpXTtcbiAgICAgIHJldHVybiAoYz09bnVsbCk/LTE6YztcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBjb3B5IHRoaXMgdG8gclxuICAgIGZ1bmN0aW9uIGJucENvcHlUbyhyKSB7XG4gICAgICBmb3IodmFyIGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHJbaV0gPSB0aGlzW2ldO1xuICAgICAgci50ID0gdGhpcy50O1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHNldCBmcm9tIGludGVnZXIgdmFsdWUgeCwgLURWIDw9IHggPCBEVlxuICAgIGZ1bmN0aW9uIGJucEZyb21JbnQoeCkge1xuICAgICAgdGhpcy50ID0gMTtcbiAgICAgIHRoaXMucyA9ICh4PDApPy0xOjA7XG4gICAgICBpZih4ID4gMCkgdGhpc1swXSA9IHg7XG4gICAgICBlbHNlIGlmKHggPCAtMSkgdGhpc1swXSA9IHgrdGhpcy5EVjtcbiAgICAgIGVsc2UgdGhpcy50ID0gMDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gYmlnaW50IGluaXRpYWxpemVkIHRvIHZhbHVlXG4gICAgZnVuY3Rpb24gbmJ2KGkpIHsgdmFyIHIgPSBuYmkoKTsgci5mcm9tSW50KGkpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gc3RyaW5nIGFuZCByYWRpeFxuICAgIGZ1bmN0aW9uIGJucEZyb21TdHJpbmcocyxiKSB7XG4gICAgICB2YXIgaztcbiAgICAgIGlmKGIgPT0gMTYpIGsgPSA0O1xuICAgICAgZWxzZSBpZihiID09IDgpIGsgPSAzO1xuICAgICAgZWxzZSBpZihiID09IDI1NikgayA9IDg7IC8vIGJ5dGUgYXJyYXlcbiAgICAgIGVsc2UgaWYoYiA9PSAyKSBrID0gMTtcbiAgICAgIGVsc2UgaWYoYiA9PSAzMikgayA9IDU7XG4gICAgICBlbHNlIGlmKGIgPT0gNCkgayA9IDI7XG4gICAgICBlbHNlIHsgdGhpcy5mcm9tUmFkaXgocyxiKTsgcmV0dXJuOyB9XG4gICAgICB0aGlzLnQgPSAwO1xuICAgICAgdGhpcy5zID0gMDtcbiAgICAgIHZhciBpID0gcy5sZW5ndGgsIG1pID0gZmFsc2UsIHNoID0gMDtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSB7XG4gICAgICAgIHZhciB4ID0gKGs9PTgpP3NbaV0mMHhmZjppbnRBdChzLGkpO1xuICAgICAgICBpZih4IDwgMCkge1xuICAgICAgICAgIGlmKHMuY2hhckF0KGkpID09IFwiLVwiKSBtaSA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWkgPSBmYWxzZTtcbiAgICAgICAgaWYoc2ggPT0gMClcbiAgICAgICAgICB0aGlzW3RoaXMudCsrXSA9IHg7XG4gICAgICAgIGVsc2UgaWYoc2grayA+IHRoaXMuREIpIHtcbiAgICAgICAgICB0aGlzW3RoaXMudC0xXSB8PSAoeCYoKDE8PCh0aGlzLkRCLXNoKSktMSkpPDxzaDtcbiAgICAgICAgICB0aGlzW3RoaXMudCsrXSA9ICh4Pj4odGhpcy5EQi1zaCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzW3RoaXMudC0xXSB8PSB4PDxzaDtcbiAgICAgICAgc2ggKz0gaztcbiAgICAgICAgaWYoc2ggPj0gdGhpcy5EQikgc2ggLT0gdGhpcy5EQjtcbiAgICAgIH1cbiAgICAgIGlmKGsgPT0gOCAmJiAoc1swXSYweDgwKSAhPSAwKSB7XG4gICAgICAgIHRoaXMucyA9IC0xO1xuICAgICAgICBpZihzaCA+IDApIHRoaXNbdGhpcy50LTFdIHw9ICgoMTw8KHRoaXMuREItc2gpKS0xKTw8c2g7XG4gICAgICB9XG4gICAgICB0aGlzLmNsYW1wKCk7XG4gICAgICBpZihtaSkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgY2xhbXAgb2ZmIGV4Y2VzcyBoaWdoIHdvcmRzXG4gICAgZnVuY3Rpb24gYm5wQ2xhbXAoKSB7XG4gICAgICB2YXIgYyA9IHRoaXMucyZ0aGlzLkRNO1xuICAgICAgd2hpbGUodGhpcy50ID4gMCAmJiB0aGlzW3RoaXMudC0xXSA9PSBjKSAtLXRoaXMudDtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIGdpdmVuIHJhZGl4XG4gICAgZnVuY3Rpb24gYm5Ub1N0cmluZyhiKSB7XG4gICAgICBpZih0aGlzLnMgPCAwKSByZXR1cm4gXCItXCIrdGhpcy5uZWdhdGUoKS50b1N0cmluZyhiKTtcbiAgICAgIHZhciBrO1xuICAgICAgaWYoYiA9PSAxNikgayA9IDQ7XG4gICAgICBlbHNlIGlmKGIgPT0gOCkgayA9IDM7XG4gICAgICBlbHNlIGlmKGIgPT0gMikgayA9IDE7XG4gICAgICBlbHNlIGlmKGIgPT0gMzIpIGsgPSA1O1xuICAgICAgZWxzZSBpZihiID09IDQpIGsgPSAyO1xuICAgICAgZWxzZSByZXR1cm4gdGhpcy50b1JhZGl4KGIpO1xuICAgICAgdmFyIGttID0gKDE8PGspLTEsIGQsIG0gPSBmYWxzZSwgciA9IFwiXCIsIGkgPSB0aGlzLnQ7XG4gICAgICB2YXIgcCA9IHRoaXMuREItKGkqdGhpcy5EQiklaztcbiAgICAgIGlmKGktLSA+IDApIHtcbiAgICAgICAgaWYocCA8IHRoaXMuREIgJiYgKGQgPSB0aGlzW2ldPj5wKSA+IDApIHsgbSA9IHRydWU7IHIgPSBpbnQyY2hhcihkKTsgfVxuICAgICAgICB3aGlsZShpID49IDApIHtcbiAgICAgICAgICBpZihwIDwgaykge1xuICAgICAgICAgICAgZCA9ICh0aGlzW2ldJigoMTw8cCktMSkpPDwoay1wKTtcbiAgICAgICAgICAgIGQgfD0gdGhpc1stLWldPj4ocCs9dGhpcy5EQi1rKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0+PihwLT1rKSkma207XG4gICAgICAgICAgICBpZihwIDw9IDApIHsgcCArPSB0aGlzLkRCOyAtLWk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZCA+IDApIG0gPSB0cnVlO1xuICAgICAgICAgIGlmKG0pIHIgKz0gaW50MmNoYXIoZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtP3I6XCIwXCI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgLXRoaXNcbiAgICBmdW5jdGlvbiBibk5lZ2F0ZSgpIHsgdmFyIHIgPSBuYmkoKTsgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB8dGhpc3xcbiAgICBmdW5jdGlvbiBibkFicygpIHsgcmV0dXJuICh0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzOyB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gKyBpZiB0aGlzID4gYSwgLSBpZiB0aGlzIDwgYSwgMCBpZiBlcXVhbFxuICAgIGZ1bmN0aW9uIGJuQ29tcGFyZVRvKGEpIHtcbiAgICAgIHZhciByID0gdGhpcy5zLWEucztcbiAgICAgIGlmKHIgIT0gMCkgcmV0dXJuIHI7XG4gICAgICB2YXIgaSA9IHRoaXMudDtcbiAgICAgIHIgPSBpLWEudDtcbiAgICAgIGlmKHIgIT0gMCkgcmV0dXJuICh0aGlzLnM8MCk/LXI6cjtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSBpZigocj10aGlzW2ldLWFbaV0pICE9IDApIHJldHVybiByO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBiaXQgbGVuZ3RoIG9mIHRoZSBpbnRlZ2VyIHhcbiAgICBmdW5jdGlvbiBuYml0cyh4KSB7XG4gICAgICB2YXIgciA9IDEsIHQ7XG4gICAgICBpZigodD14Pj4+MTYpICE9IDApIHsgeCA9IHQ7IHIgKz0gMTY7IH1cbiAgICAgIGlmKCh0PXg+PjgpICE9IDApIHsgeCA9IHQ7IHIgKz0gODsgfVxuICAgICAgaWYoKHQ9eD4+NCkgIT0gMCkgeyB4ID0gdDsgciArPSA0OyB9XG4gICAgICBpZigodD14Pj4yKSAhPSAwKSB7IHggPSB0OyByICs9IDI7IH1cbiAgICAgIGlmKCh0PXg+PjEpICE9IDApIHsgeCA9IHQ7IHIgKz0gMTsgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBcInRoaXNcIlxuICAgIGZ1bmN0aW9uIGJuQml0TGVuZ3RoKCkge1xuICAgICAgaWYodGhpcy50IDw9IDApIHJldHVybiAwO1xuICAgICAgcmV0dXJuIHRoaXMuREIqKHRoaXMudC0xKStuYml0cyh0aGlzW3RoaXMudC0xXV4odGhpcy5zJnRoaXMuRE0pKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA8PCBuKkRCXG4gICAgZnVuY3Rpb24gYm5wRExTaGlmdFRvKG4scikge1xuICAgICAgdmFyIGk7XG4gICAgICBmb3IoaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgcltpK25dID0gdGhpc1tpXTtcbiAgICAgIGZvcihpID0gbi0xOyBpID49IDA7IC0taSkgcltpXSA9IDA7XG4gICAgICByLnQgPSB0aGlzLnQrbjtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuKkRCXG4gICAgZnVuY3Rpb24gYm5wRFJTaGlmdFRvKG4scikge1xuICAgICAgZm9yKHZhciBpID0gbjsgaSA8IHRoaXMudDsgKytpKSByW2ktbl0gPSB0aGlzW2ldO1xuICAgICAgci50ID0gTWF0aC5tYXgodGhpcy50LW4sMCk7XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPDwgblxuICAgIGZ1bmN0aW9uIGJucExTaGlmdFRvKG4scikge1xuICAgICAgdmFyIGJzID0gbiV0aGlzLkRCO1xuICAgICAgdmFyIGNicyA9IHRoaXMuREItYnM7XG4gICAgICB2YXIgYm0gPSAoMTw8Y2JzKS0xO1xuICAgICAgdmFyIGRzID0gTWF0aC5mbG9vcihuL3RoaXMuREIpLCBjID0gKHRoaXMuczw8YnMpJnRoaXMuRE0sIGk7XG4gICAgICBmb3IoaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkge1xuICAgICAgICByW2krZHMrMV0gPSAodGhpc1tpXT4+Y2JzKXxjO1xuICAgICAgICBjID0gKHRoaXNbaV0mYm0pPDxicztcbiAgICAgIH1cbiAgICAgIGZvcihpID0gZHMtMTsgaSA+PSAwOyAtLWkpIHJbaV0gPSAwO1xuICAgICAgcltkc10gPSBjO1xuICAgICAgci50ID0gdGhpcy50K2RzKzE7XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPj4gblxuICAgIGZ1bmN0aW9uIGJucFJTaGlmdFRvKG4scikge1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgICAgdmFyIGRzID0gTWF0aC5mbG9vcihuL3RoaXMuREIpO1xuICAgICAgaWYoZHMgPj0gdGhpcy50KSB7IHIudCA9IDA7IHJldHVybjsgfVxuICAgICAgdmFyIGJzID0gbiV0aGlzLkRCO1xuICAgICAgdmFyIGNicyA9IHRoaXMuREItYnM7XG4gICAgICB2YXIgYm0gPSAoMTw8YnMpLTE7XG4gICAgICByWzBdID0gdGhpc1tkc10+PmJzO1xuICAgICAgZm9yKHZhciBpID0gZHMrMTsgaSA8IHRoaXMudDsgKytpKSB7XG4gICAgICAgIHJbaS1kcy0xXSB8PSAodGhpc1tpXSZibSk8PGNicztcbiAgICAgICAgcltpLWRzXSA9IHRoaXNbaV0+PmJzO1xuICAgICAgfVxuICAgICAgaWYoYnMgPiAwKSByW3RoaXMudC1kcy0xXSB8PSAodGhpcy5zJmJtKTw8Y2JzO1xuICAgICAgci50ID0gdGhpcy50LWRzO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIC0gYVxuICAgIGZ1bmN0aW9uIGJucFN1YlRvKGEscikge1xuICAgICAgdmFyIGkgPSAwLCBjID0gMCwgbSA9IE1hdGgubWluKGEudCx0aGlzLnQpO1xuICAgICAgd2hpbGUoaSA8IG0pIHtcbiAgICAgICAgYyArPSB0aGlzW2ldLWFbaV07XG4gICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgIH1cbiAgICAgIGlmKGEudCA8IHRoaXMudCkge1xuICAgICAgICBjIC09IGEucztcbiAgICAgICAgd2hpbGUoaSA8IHRoaXMudCkge1xuICAgICAgICAgIGMgKz0gdGhpc1tpXTtcbiAgICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgICAgfVxuICAgICAgICBjICs9IHRoaXMucztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjICs9IHRoaXMucztcbiAgICAgICAgd2hpbGUoaSA8IGEudCkge1xuICAgICAgICAgIGMgLT0gYVtpXTtcbiAgICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgICAgfVxuICAgICAgICBjIC09IGEucztcbiAgICAgIH1cbiAgICAgIHIucyA9IChjPDApPy0xOjA7XG4gICAgICBpZihjIDwgLTEpIHJbaSsrXSA9IHRoaXMuRFYrYztcbiAgICAgIGVsc2UgaWYoYyA+IDApIHJbaSsrXSA9IGM7XG4gICAgICByLnQgPSBpO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzICogYSwgciAhPSB0aGlzLGEgKEhBQyAxNC4xMilcbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgZnVuY3Rpb24gYm5wTXVsdGlwbHlUbyhhLHIpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5hYnMoKSwgeSA9IGEuYWJzKCk7XG4gICAgICB2YXIgaSA9IHgudDtcbiAgICAgIHIudCA9IGkreS50O1xuICAgICAgd2hpbGUoLS1pID49IDApIHJbaV0gPSAwO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgeS50OyArK2kpIHJbaSt4LnRdID0geC5hbSgwLHlbaV0scixpLDAseC50KTtcbiAgICAgIHIucyA9IDA7XG4gICAgICByLmNsYW1wKCk7XG4gICAgICBpZih0aGlzLnMgIT0gYS5zKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpc14yLCByICE9IHRoaXMgKEhBQyAxNC4xNilcbiAgICBmdW5jdGlvbiBibnBTcXVhcmVUbyhyKSB7XG4gICAgICB2YXIgeCA9IHRoaXMuYWJzKCk7XG4gICAgICB2YXIgaSA9IHIudCA9IDIqeC50O1xuICAgICAgd2hpbGUoLS1pID49IDApIHJbaV0gPSAwO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgeC50LTE7ICsraSkge1xuICAgICAgICB2YXIgYyA9IHguYW0oaSx4W2ldLHIsMippLDAsMSk7XG4gICAgICAgIGlmKChyW2kreC50XSs9eC5hbShpKzEsMip4W2ldLHIsMippKzEsYyx4LnQtaS0xKSkgPj0geC5EVikge1xuICAgICAgICAgIHJbaSt4LnRdIC09IHguRFY7XG4gICAgICAgICAgcltpK3gudCsxXSA9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKHIudCA+IDApIHJbci50LTFdICs9IHguYW0oaSx4W2ldLHIsMippLDAsMSk7XG4gICAgICByLnMgPSAwO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGRpdmlkZSB0aGlzIGJ5IG0sIHF1b3RpZW50IGFuZCByZW1haW5kZXIgdG8gcSwgciAoSEFDIDE0LjIwKVxuICAgIC8vIHIgIT0gcSwgdGhpcyAhPSBtLiAgcSBvciByIG1heSBiZSBudWxsLlxuICAgIGZ1bmN0aW9uIGJucERpdlJlbVRvKG0scSxyKSB7XG4gICAgICB2YXIgcG0gPSBtLmFicygpO1xuICAgICAgaWYocG0udCA8PSAwKSByZXR1cm47XG4gICAgICB2YXIgcHQgPSB0aGlzLmFicygpO1xuICAgICAgaWYocHQudCA8IHBtLnQpIHtcbiAgICAgICAgaWYocSAhPSBudWxsKSBxLmZyb21JbnQoMCk7XG4gICAgICAgIGlmKHIgIT0gbnVsbCkgdGhpcy5jb3B5VG8ocik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmKHIgPT0gbnVsbCkgciA9IG5iaSgpO1xuICAgICAgdmFyIHkgPSBuYmkoKSwgdHMgPSB0aGlzLnMsIG1zID0gbS5zO1xuICAgICAgdmFyIG5zaCA9IHRoaXMuREItbmJpdHMocG1bcG0udC0xXSk7ICAgLy8gbm9ybWFsaXplIG1vZHVsdXNcbiAgICAgIGlmKG5zaCA+IDApIHsgcG0ubFNoaWZ0VG8obnNoLHkpOyBwdC5sU2hpZnRUbyhuc2gscik7IH1cbiAgICAgIGVsc2UgeyBwbS5jb3B5VG8oeSk7IHB0LmNvcHlUbyhyKTsgfVxuICAgICAgdmFyIHlzID0geS50O1xuICAgICAgdmFyIHkwID0geVt5cy0xXTtcbiAgICAgIGlmKHkwID09IDApIHJldHVybjtcbiAgICAgIHZhciB5dCA9IHkwKigxPDx0aGlzLkYxKSsoKHlzPjEpP3lbeXMtMl0+PnRoaXMuRjI6MCk7XG4gICAgICB2YXIgZDEgPSB0aGlzLkZWL3l0LCBkMiA9ICgxPDx0aGlzLkYxKS95dCwgZSA9IDE8PHRoaXMuRjI7XG4gICAgICB2YXIgaSA9IHIudCwgaiA9IGkteXMsIHQgPSAocT09bnVsbCk/bmJpKCk6cTtcbiAgICAgIHkuZGxTaGlmdFRvKGosdCk7XG4gICAgICBpZihyLmNvbXBhcmVUbyh0KSA+PSAwKSB7XG4gICAgICAgIHJbci50KytdID0gMTtcbiAgICAgICAgci5zdWJUbyh0LHIpO1xuICAgICAgfVxuICAgICAgQmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHlzLHQpO1xuICAgICAgdC5zdWJUbyh5LHkpOyAgLy8gXCJuZWdhdGl2ZVwiIHkgc28gd2UgY2FuIHJlcGxhY2Ugc3ViIHdpdGggYW0gbGF0ZXJcbiAgICAgIHdoaWxlKHkudCA8IHlzKSB5W3kudCsrXSA9IDA7XG4gICAgICB3aGlsZSgtLWogPj0gMCkge1xuICAgICAgICAvLyBFc3RpbWF0ZSBxdW90aWVudCBkaWdpdFxuICAgICAgICB2YXIgcWQgPSAoclstLWldPT15MCk/dGhpcy5ETTpNYXRoLmZsb29yKHJbaV0qZDErKHJbaS0xXStlKSpkMik7XG4gICAgICAgIGlmKChyW2ldKz15LmFtKDAscWQscixqLDAseXMpKSA8IHFkKSB7ICAgLy8gVHJ5IGl0IG91dFxuICAgICAgICAgIHkuZGxTaGlmdFRvKGosdCk7XG4gICAgICAgICAgci5zdWJUbyh0LHIpO1xuICAgICAgICAgIHdoaWxlKHJbaV0gPCAtLXFkKSByLnN1YlRvKHQscik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKHEgIT0gbnVsbCkge1xuICAgICAgICByLmRyU2hpZnRUbyh5cyxxKTtcbiAgICAgICAgaWYodHMgIT0gbXMpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhxLHEpO1xuICAgICAgfVxuICAgICAgci50ID0geXM7XG4gICAgICByLmNsYW1wKCk7XG4gICAgICBpZihuc2ggPiAwKSByLnJTaGlmdFRvKG5zaCxyKTsgLy8gRGVub3JtYWxpemUgcmVtYWluZGVyXG4gICAgICBpZih0cyA8IDApIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhyLHIpO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgbW9kIGFcbiAgICBmdW5jdGlvbiBibk1vZChhKSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgdGhpcy5hYnMoKS5kaXZSZW1UbyhhLG51bGwscik7XG4gICAgICBpZih0aGlzLnMgPCAwICYmIHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPiAwKSBhLnN1YlRvKHIscik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyBNb2R1bGFyIHJlZHVjdGlvbiB1c2luZyBcImNsYXNzaWNcIiBhbGdvcml0aG1cbiAgICBmdW5jdGlvbiBDbGFzc2ljKG0pIHsgdGhpcy5tID0gbTsgfVxuICAgIGZ1bmN0aW9uIGNDb252ZXJ0KHgpIHtcbiAgICAgIGlmKHgucyA8IDAgfHwgeC5jb21wYXJlVG8odGhpcy5tKSA+PSAwKSByZXR1cm4geC5tb2QodGhpcy5tKTtcbiAgICAgIGVsc2UgcmV0dXJuIHg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNSZXZlcnQoeCkgeyByZXR1cm4geDsgfVxuICAgIGZ1bmN0aW9uIGNSZWR1Y2UoeCkgeyB4LmRpdlJlbVRvKHRoaXMubSxudWxsLHgpOyB9XG4gICAgZnVuY3Rpb24gY011bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuICAgIGZ1bmN0aW9uIGNTcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuICAgIENsYXNzaWMucHJvdG90eXBlLmNvbnZlcnQgPSBjQ29udmVydDtcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQgPSBjUmV2ZXJ0O1xuICAgIENsYXNzaWMucHJvdG90eXBlLnJlZHVjZSA9IGNSZWR1Y2U7XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUubXVsVG8gPSBjTXVsVG87XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUuc3FyVG8gPSBjU3FyVG87XG5cbiAgICAvLyAocHJvdGVjdGVkKSByZXR1cm4gXCItMS90aGlzICUgMl5EQlwiOyB1c2VmdWwgZm9yIE1vbnQuIHJlZHVjdGlvblxuICAgIC8vIGp1c3RpZmljYXRpb246XG4gICAgLy8gICAgICAgICB4eSA9PSAxIChtb2QgbSlcbiAgICAvLyAgICAgICAgIHh5ID0gIDEra21cbiAgICAvLyAgIHh5KDIteHkpID0gKDEra20pKDEta20pXG4gICAgLy8geFt5KDIteHkpXSA9IDEta14ybV4yXG4gICAgLy8geFt5KDIteHkpXSA9PSAxIChtb2QgbV4yKVxuICAgIC8vIGlmIHkgaXMgMS94IG1vZCBtLCB0aGVuIHkoMi14eSkgaXMgMS94IG1vZCBtXjJcbiAgICAvLyBzaG91bGQgcmVkdWNlIHggYW5kIHkoMi14eSkgYnkgbV4yIGF0IGVhY2ggc3RlcCB0byBrZWVwIHNpemUgYm91bmRlZC5cbiAgICAvLyBKUyBtdWx0aXBseSBcIm92ZXJmbG93c1wiIGRpZmZlcmVudGx5IGZyb20gQy9DKyssIHNvIGNhcmUgaXMgbmVlZGVkIGhlcmUuXG4gICAgZnVuY3Rpb24gYm5wSW52RGlnaXQoKSB7XG4gICAgICBpZih0aGlzLnQgPCAxKSByZXR1cm4gMDtcbiAgICAgIHZhciB4ID0gdGhpc1swXTtcbiAgICAgIGlmKCh4JjEpID09IDApIHJldHVybiAwO1xuICAgICAgdmFyIHkgPSB4JjM7ICAgICAgIC8vIHkgPT0gMS94IG1vZCAyXjJcbiAgICAgIHkgPSAoeSooMi0oeCYweGYpKnkpKSYweGY7IC8vIHkgPT0gMS94IG1vZCAyXjRcbiAgICAgIHkgPSAoeSooMi0oeCYweGZmKSp5KSkmMHhmZjsgICAvLyB5ID09IDEveCBtb2QgMl44XG4gICAgICB5ID0gKHkqKDItKCgoeCYweGZmZmYpKnkpJjB4ZmZmZikpKSYweGZmZmY7ICAgIC8vIHkgPT0gMS94IG1vZCAyXjE2XG4gICAgICAvLyBsYXN0IHN0ZXAgLSBjYWxjdWxhdGUgaW52ZXJzZSBtb2QgRFYgZGlyZWN0bHk7XG4gICAgICAvLyBhc3N1bWVzIDE2IDwgREIgPD0gMzIgYW5kIGFzc3VtZXMgYWJpbGl0eSB0byBoYW5kbGUgNDgtYml0IGludHNcbiAgICAgIHkgPSAoeSooMi14KnkldGhpcy5EVikpJXRoaXMuRFY7ICAgICAgIC8vIHkgPT0gMS94IG1vZCAyXmRiaXRzXG4gICAgICAvLyB3ZSByZWFsbHkgd2FudCB0aGUgbmVnYXRpdmUgaW52ZXJzZSwgYW5kIC1EViA8IHkgPCBEVlxuICAgICAgcmV0dXJuICh5PjApP3RoaXMuRFYteToteTtcbiAgICB9XG5cbiAgICAvLyBNb250Z29tZXJ5IHJlZHVjdGlvblxuICAgIGZ1bmN0aW9uIE1vbnRnb21lcnkobSkge1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMubXAgPSBtLmludkRpZ2l0KCk7XG4gICAgICB0aGlzLm1wbCA9IHRoaXMubXAmMHg3ZmZmO1xuICAgICAgdGhpcy5tcGggPSB0aGlzLm1wPj4xNTtcbiAgICAgIHRoaXMudW0gPSAoMTw8KG0uREItMTUpKS0xO1xuICAgICAgdGhpcy5tdDIgPSAyKm0udDtcbiAgICB9XG5cbiAgICAvLyB4UiBtb2QgbVxuICAgIGZ1bmN0aW9uIG1vbnRDb252ZXJ0KHgpIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICB4LmFicygpLmRsU2hpZnRUbyh0aGlzLm0udCxyKTtcbiAgICAgIHIuZGl2UmVtVG8odGhpcy5tLG51bGwscik7XG4gICAgICBpZih4LnMgPCAwICYmIHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPiAwKSB0aGlzLm0uc3ViVG8ocixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIHgvUiBtb2QgbVxuICAgIGZ1bmN0aW9uIG1vbnRSZXZlcnQoeCkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIHguY29weVRvKHIpO1xuICAgICAgdGhpcy5yZWR1Y2Uocik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyB4ID0geC9SIG1vZCBtIChIQUMgMTQuMzIpXG4gICAgZnVuY3Rpb24gbW9udFJlZHVjZSh4KSB7XG4gICAgICB3aGlsZSh4LnQgPD0gdGhpcy5tdDIpIC8vIHBhZCB4IHNvIGFtIGhhcyBlbm91Z2ggcm9vbSBsYXRlclxuICAgICAgICB4W3gudCsrXSA9IDA7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5tLnQ7ICsraSkge1xuICAgICAgICAvLyBmYXN0ZXIgd2F5IG9mIGNhbGN1bGF0aW5nIHUwID0geFtpXSptcCBtb2QgRFZcbiAgICAgICAgdmFyIGogPSB4W2ldJjB4N2ZmZjtcbiAgICAgICAgdmFyIHUwID0gKGoqdGhpcy5tcGwrKCgoaip0aGlzLm1waCsoeFtpXT4+MTUpKnRoaXMubXBsKSZ0aGlzLnVtKTw8MTUpKSZ4LkRNO1xuICAgICAgICAvLyB1c2UgYW0gdG8gY29tYmluZSB0aGUgbXVsdGlwbHktc2hpZnQtYWRkIGludG8gb25lIGNhbGxcbiAgICAgICAgaiA9IGkrdGhpcy5tLnQ7XG4gICAgICAgIHhbal0gKz0gdGhpcy5tLmFtKDAsdTAseCxpLDAsdGhpcy5tLnQpO1xuICAgICAgICAvLyBwcm9wYWdhdGUgY2FycnlcbiAgICAgICAgd2hpbGUoeFtqXSA+PSB4LkRWKSB7IHhbal0gLT0geC5EVjsgeFsrK2pdKys7IH1cbiAgICAgIH1cbiAgICAgIHguY2xhbXAoKTtcbiAgICAgIHguZHJTaGlmdFRvKHRoaXMubS50LHgpO1xuICAgICAgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA+PSAwKSB4LnN1YlRvKHRoaXMubSx4KTtcbiAgICB9XG5cbiAgICAvLyByID0gXCJ4XjIvUiBtb2QgbVwiOyB4ICE9IHJcbiAgICBmdW5jdGlvbiBtb250U3FyVG8oeCxyKSB7IHguc3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICAvLyByID0gXCJ4eS9SIG1vZCBtXCI7IHgseSAhPSByXG4gICAgZnVuY3Rpb24gbW9udE11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUuY29udmVydCA9IG1vbnRDb252ZXJ0O1xuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLnJldmVydCA9IG1vbnRSZXZlcnQ7XG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUucmVkdWNlID0gbW9udFJlZHVjZTtcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbyA9IG1vbnRNdWxUbztcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5zcXJUbyA9IG1vbnRTcXJUbztcblxuICAgIC8vIChwcm90ZWN0ZWQpIHRydWUgaWZmIHRoaXMgaXMgZXZlblxuICAgIGZ1bmN0aW9uIGJucElzRXZlbigpIHsgcmV0dXJuICgodGhpcy50PjApPyh0aGlzWzBdJjEpOnRoaXMucykgPT0gMDsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdGhpc15lLCBlIDwgMl4zMiwgZG9pbmcgc3FyIGFuZCBtdWwgd2l0aCBcInJcIiAoSEFDIDE0Ljc5KVxuICAgIGZ1bmN0aW9uIGJucEV4cChlLHopIHtcbiAgICAgIGlmKGUgPiAweGZmZmZmZmZmIHx8IGUgPCAxKSByZXR1cm4gQmlnSW50ZWdlci5PTkU7XG4gICAgICB2YXIgciA9IG5iaSgpLCByMiA9IG5iaSgpLCBnID0gei5jb252ZXJ0KHRoaXMpLCBpID0gbmJpdHMoZSktMTtcbiAgICAgIGcuY29weVRvKHIpO1xuICAgICAgd2hpbGUoLS1pID49IDApIHtcbiAgICAgICAgei5zcXJUbyhyLHIyKTtcbiAgICAgICAgaWYoKGUmKDE8PGkpKSA+IDApIHoubXVsVG8ocjIsZyxyKTtcbiAgICAgICAgZWxzZSB7IHZhciB0ID0gcjsgciA9IHIyOyByMiA9IHQ7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnJldmVydChyKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzXmUgJSBtLCAwIDw9IGUgPCAyXjMyXG4gICAgZnVuY3Rpb24gYm5Nb2RQb3dJbnQoZSxtKSB7XG4gICAgICB2YXIgejtcbiAgICAgIGlmKGUgPCAyNTYgfHwgbS5pc0V2ZW4oKSkgeiA9IG5ldyBDbGFzc2ljKG0pOyBlbHNlIHogPSBuZXcgTW9udGdvbWVyeShtKTtcbiAgICAgIHJldHVybiB0aGlzLmV4cChlLHopO1xuICAgIH1cblxuICAgIC8vIHByb3RlY3RlZFxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNvcHlUbyA9IGJucENvcHlUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50ID0gYm5wRnJvbUludDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tU3RyaW5nID0gYm5wRnJvbVN0cmluZztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGFtcCA9IGJucENsYW1wO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbyA9IGJucERMU2hpZnRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kclNoaWZ0VG8gPSBibnBEUlNoaWZ0VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubFNoaWZ0VG8gPSBibnBMU2hpZnRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbyA9IGJucFJTaGlmdFRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnN1YlRvID0gYm5wU3ViVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlUbyA9IGJucE11bHRpcGx5VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG8gPSBibnBTcXVhcmVUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZSZW1UbyA9IGJucERpdlJlbVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmludkRpZ2l0ID0gYm5wSW52RGlnaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuID0gYm5wSXNFdmVuO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmV4cCA9IGJucEV4cDtcblxuICAgIC8vIHB1YmxpY1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nID0gYm5Ub1N0cmluZztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5uZWdhdGUgPSBibk5lZ2F0ZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hYnMgPSBibkFicztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG8gPSBibkNvbXBhcmVUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGggPSBibkJpdExlbmd0aDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2QgPSBibk1vZDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQgPSBibk1vZFBvd0ludDtcblxuICAgIC8vIFwiY29uc3RhbnRzXCJcbiAgICBCaWdJbnRlZ2VyLlpFUk8gPSBuYnYoMCk7XG4gICAgQmlnSW50ZWdlci5PTkUgPSBuYnYoMSk7XG5cbiAgICAvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSAgVG9tIFd1XG4gICAgLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAvLyBTZWUgXCJMSUNFTlNFXCIgZm9yIGRldGFpbHMuXG5cbiAgICAvLyBFeHRlbmRlZCBKYXZhU2NyaXB0IEJOIGZ1bmN0aW9ucywgcmVxdWlyZWQgZm9yIFJTQSBwcml2YXRlIG9wcy5cblxuICAgIC8vIFZlcnNpb24gMS4xOiBuZXcgQmlnSW50ZWdlcihcIjBcIiwgMTApIHJldHVybnMgXCJwcm9wZXJcIiB6ZXJvXG4gICAgLy8gVmVyc2lvbiAxLjI6IHNxdWFyZSgpIEFQSSwgaXNQcm9iYWJsZVByaW1lIGZpeFxuXG4gICAgLy8gKHB1YmxpYylcbiAgICBmdW5jdGlvbiBibkNsb25lKCkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmNvcHlUbyhyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBpbnRlZ2VyXG4gICAgZnVuY3Rpb24gYm5JbnRWYWx1ZSgpIHtcbiAgICAgIGlmKHRoaXMucyA8IDApIHtcbiAgICAgICAgaWYodGhpcy50ID09IDEpIHJldHVybiB0aGlzWzBdLXRoaXMuRFY7XG4gICAgICAgIGVsc2UgaWYodGhpcy50ID09IDApIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYodGhpcy50ID09IDEpIHJldHVybiB0aGlzWzBdO1xuICAgICAgZWxzZSBpZih0aGlzLnQgPT0gMCkgcmV0dXJuIDA7XG4gICAgICAvLyBhc3N1bWVzIDE2IDwgREIgPCAzMlxuICAgICAgcmV0dXJuICgodGhpc1sxXSYoKDE8PCgzMi10aGlzLkRCKSktMSkpPDx0aGlzLkRCKXx0aGlzWzBdO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBieXRlXG4gICAgZnVuY3Rpb24gYm5CeXRlVmFsdWUoKSB7IHJldHVybiAodGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDI0KT4+MjQ7IH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBzaG9ydCAoYXNzdW1lcyBEQj49MTYpXG4gICAgZnVuY3Rpb24gYm5TaG9ydFZhbHVlKCkgeyByZXR1cm4gKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwxNik+PjE2OyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByZXR1cm4geCBzLnQuIHJeeCA8IERWXG4gICAgZnVuY3Rpb24gYm5wQ2h1bmtTaXplKHIpIHsgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5MTjIqdGhpcy5EQi9NYXRoLmxvZyhyKSk7IH1cblxuICAgIC8vIChwdWJsaWMpIDAgaWYgdGhpcyA9PSAwLCAxIGlmIHRoaXMgPiAwXG4gICAgZnVuY3Rpb24gYm5TaWdOdW0oKSB7XG4gICAgICBpZih0aGlzLnMgPCAwKSByZXR1cm4gLTE7XG4gICAgICBlbHNlIGlmKHRoaXMudCA8PSAwIHx8ICh0aGlzLnQgPT0gMSAmJiB0aGlzWzBdIDw9IDApKSByZXR1cm4gMDtcbiAgICAgIGVsc2UgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgY29udmVydCB0byByYWRpeCBzdHJpbmdcbiAgICBmdW5jdGlvbiBibnBUb1JhZGl4KGIpIHtcbiAgICAgIGlmKGIgPT0gbnVsbCkgYiA9IDEwO1xuICAgICAgaWYodGhpcy5zaWdudW0oKSA9PSAwIHx8IGIgPCAyIHx8IGIgPiAzNikgcmV0dXJuIFwiMFwiO1xuICAgICAgdmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7XG4gICAgICB2YXIgYSA9IE1hdGgucG93KGIsY3MpO1xuICAgICAgdmFyIGQgPSBuYnYoYSksIHkgPSBuYmkoKSwgeiA9IG5iaSgpLCByID0gXCJcIjtcbiAgICAgIHRoaXMuZGl2UmVtVG8oZCx5LHopO1xuICAgICAgd2hpbGUoeS5zaWdudW0oKSA+IDApIHtcbiAgICAgICAgciA9IChhK3ouaW50VmFsdWUoKSkudG9TdHJpbmcoYikuc3Vic3RyKDEpICsgcjtcbiAgICAgICAgeS5kaXZSZW1UbyhkLHkseik7XG4gICAgICB9XG4gICAgICByZXR1cm4gei5pbnRWYWx1ZSgpLnRvU3RyaW5nKGIpICsgcjtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBjb252ZXJ0IGZyb20gcmFkaXggc3RyaW5nXG4gICAgZnVuY3Rpb24gYm5wRnJvbVJhZGl4KHMsYikge1xuICAgICAgdGhpcy5mcm9tSW50KDApO1xuICAgICAgaWYoYiA9PSBudWxsKSBiID0gMTA7XG4gICAgICB2YXIgY3MgPSB0aGlzLmNodW5rU2l6ZShiKTtcbiAgICAgIHZhciBkID0gTWF0aC5wb3coYixjcyksIG1pID0gZmFsc2UsIGogPSAwLCB3ID0gMDtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciB4ID0gaW50QXQocyxpKTtcbiAgICAgICAgaWYoeCA8IDApIHtcbiAgICAgICAgICBpZihzLmNoYXJBdChpKSA9PSBcIi1cIiAmJiB0aGlzLnNpZ251bSgpID09IDApIG1pID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB3ID0gYip3K3g7XG4gICAgICAgIGlmKCsraiA+PSBjcykge1xuICAgICAgICAgIHRoaXMuZE11bHRpcGx5KGQpO1xuICAgICAgICAgIHRoaXMuZEFkZE9mZnNldCh3LDApO1xuICAgICAgICAgIGogPSAwO1xuICAgICAgICAgIHcgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihqID4gMCkge1xuICAgICAgICB0aGlzLmRNdWx0aXBseShNYXRoLnBvdyhiLGopKTtcbiAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KHcsMCk7XG4gICAgICB9XG4gICAgICBpZihtaSkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgYWx0ZXJuYXRlIGNvbnN0cnVjdG9yXG4gICAgZnVuY3Rpb24gYm5wRnJvbU51bWJlcihhLGIsYykge1xuICAgICAgaWYoXCJudW1iZXJcIiA9PSB0eXBlb2YgYikge1xuICAgICAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsaW50LFJORylcbiAgICAgICAgaWYoYSA8IDIpIHRoaXMuZnJvbUludCgxKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5mcm9tTnVtYmVyKGEsYyk7XG4gICAgICAgICAgaWYoIXRoaXMudGVzdEJpdChhLTEpKVx0Ly8gZm9yY2UgTVNCIHNldFxuICAgICAgICAgICAgdGhpcy5iaXR3aXNlVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEtMSksb3Bfb3IsdGhpcyk7XG4gICAgICAgICAgaWYodGhpcy5pc0V2ZW4oKSkgdGhpcy5kQWRkT2Zmc2V0KDEsMCk7IC8vIGZvcmNlIG9kZFxuICAgICAgICAgIHdoaWxlKCF0aGlzLmlzUHJvYmFibGVQcmltZShiKSkge1xuICAgICAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KDIsMCk7XG4gICAgICAgICAgICBpZih0aGlzLmJpdExlbmd0aCgpID4gYSkgdGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYS0xKSx0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsUk5HKVxuICAgICAgICB2YXIgeCA9IG5ldyBBcnJheSgpLCB0ID0gYSY3O1xuICAgICAgICB4Lmxlbmd0aCA9IChhPj4zKSsxO1xuICAgICAgICBiLm5leHRCeXRlcyh4KTtcbiAgICAgICAgaWYodCA+IDApIHhbMF0gJj0gKCgxPDx0KS0xKTsgZWxzZSB4WzBdID0gMDtcbiAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHgsMjU2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAocHVibGljKSBjb252ZXJ0IHRvIGJpZ2VuZGlhbiBieXRlIGFycmF5XG4gICAgZnVuY3Rpb24gYm5Ub0J5dGVBcnJheSgpIHtcbiAgICAgIHZhciBpID0gdGhpcy50LCByID0gbmV3IEFycmF5KCk7XG4gICAgICByWzBdID0gdGhpcy5zO1xuICAgICAgdmFyIHAgPSB0aGlzLkRCLShpKnRoaXMuREIpJTgsIGQsIGsgPSAwO1xuICAgICAgaWYoaS0tID4gMCkge1xuICAgICAgICBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXNbaV0+PnApICE9ICh0aGlzLnMmdGhpcy5ETSk+PnApXG4gICAgICAgICAgcltrKytdID0gZHwodGhpcy5zPDwodGhpcy5EQi1wKSk7XG4gICAgICAgIHdoaWxlKGkgPj0gMCkge1xuICAgICAgICAgIGlmKHAgPCA4KSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0mKCgxPDxwKS0xKSk8PCg4LXApO1xuICAgICAgICAgICAgZCB8PSB0aGlzWy0taV0+PihwKz10aGlzLkRCLTgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGQgPSAodGhpc1tpXT4+KHAtPTgpKSYweGZmO1xuICAgICAgICAgICAgaWYocCA8PSAwKSB7IHAgKz0gdGhpcy5EQjsgLS1pOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKChkJjB4ODApICE9IDApIGQgfD0gLTI1NjtcbiAgICAgICAgICBpZihrID09IDAgJiYgKHRoaXMucyYweDgwKSAhPSAoZCYweDgwKSkgKytrO1xuICAgICAgICAgIGlmKGsgPiAwIHx8IGQgIT0gdGhpcy5zKSByW2srK10gPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBibkVxdWFscyhhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT09MCk7IH1cbiAgICBmdW5jdGlvbiBibk1pbihhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKTwwKT90aGlzOmE7IH1cbiAgICBmdW5jdGlvbiBibk1heChhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT4wKT90aGlzOmE7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIG9wIGEgKGJpdHdpc2UpXG4gICAgZnVuY3Rpb24gYm5wQml0d2lzZVRvKGEsb3Ascikge1xuICAgICAgdmFyIGksIGYsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIGZvcihpID0gMDsgaSA8IG07ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sYVtpXSk7XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgZiA9IGEucyZ0aGlzLkRNO1xuICAgICAgICBmb3IoaSA9IG07IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sZik7XG4gICAgICAgIHIudCA9IHRoaXMudDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmID0gdGhpcy5zJnRoaXMuRE07XG4gICAgICAgIGZvcihpID0gbTsgaSA8IGEudDsgKytpKSByW2ldID0gb3AoZixhW2ldKTtcbiAgICAgICAgci50ID0gYS50O1xuICAgICAgfVxuICAgICAgci5zID0gb3AodGhpcy5zLGEucyk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIGFcbiAgICBmdW5jdGlvbiBvcF9hbmQoeCx5KSB7IHJldHVybiB4Jnk7IH1cbiAgICBmdW5jdGlvbiBibkFuZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfYW5kLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyB8IGFcbiAgICBmdW5jdGlvbiBvcF9vcih4LHkpIHsgcmV0dXJuIHh8eTsgfVxuICAgIGZ1bmN0aW9uIGJuT3IoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX29yLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyBeIGFcbiAgICBmdW5jdGlvbiBvcF94b3IoeCx5KSB7IHJldHVybiB4Xnk7IH1cbiAgICBmdW5jdGlvbiBiblhvcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfeG9yLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIH5hXG4gICAgZnVuY3Rpb24gb3BfYW5kbm90KHgseSkgeyByZXR1cm4geCZ+eTsgfVxuICAgIGZ1bmN0aW9uIGJuQW5kTm90KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9hbmRub3Qscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB+dGhpc1xuICAgIGZ1bmN0aW9uIGJuTm90KCkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IHRoaXMuRE0mfnRoaXNbaV07XG4gICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICByLnMgPSB+dGhpcy5zO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyA8PCBuXG4gICAgZnVuY3Rpb24gYm5TaGlmdExlZnQobikge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGlmKG4gPCAwKSB0aGlzLnJTaGlmdFRvKC1uLHIpOyBlbHNlIHRoaXMubFNoaWZ0VG8obixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgPj4gblxuICAgIGZ1bmN0aW9uIGJuU2hpZnRSaWdodChuKSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgaWYobiA8IDApIHRoaXMubFNoaWZ0VG8oLW4scik7IGVsc2UgdGhpcy5yU2hpZnRUbyhuLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGluZGV4IG9mIGxvd2VzdCAxLWJpdCBpbiB4LCB4IDwgMl4zMVxuICAgIGZ1bmN0aW9uIGxiaXQoeCkge1xuICAgICAgaWYoeCA9PSAwKSByZXR1cm4gLTE7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZigoeCYweGZmZmYpID09IDApIHsgeCA+Pj0gMTY7IHIgKz0gMTY7IH1cbiAgICAgIGlmKCh4JjB4ZmYpID09IDApIHsgeCA+Pj0gODsgciArPSA4OyB9XG4gICAgICBpZigoeCYweGYpID09IDApIHsgeCA+Pj0gNDsgciArPSA0OyB9XG4gICAgICBpZigoeCYzKSA9PSAwKSB7IHggPj49IDI7IHIgKz0gMjsgfVxuICAgICAgaWYoKHgmMSkgPT0gMCkgKytyO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJucyBpbmRleCBvZiBsb3dlc3QgMS1iaXQgKG9yIC0xIGlmIG5vbmUpXG4gICAgZnVuY3Rpb24gYm5HZXRMb3dlc3RTZXRCaXQoKSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpXG4gICAgICAgIGlmKHRoaXNbaV0gIT0gMCkgcmV0dXJuIGkqdGhpcy5EQitsYml0KHRoaXNbaV0pO1xuICAgICAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIHRoaXMudCp0aGlzLkRCO1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBudW1iZXIgb2YgMSBiaXRzIGluIHhcbiAgICBmdW5jdGlvbiBjYml0KHgpIHtcbiAgICAgIHZhciByID0gMDtcbiAgICAgIHdoaWxlKHggIT0gMCkgeyB4ICY9IHgtMTsgKytyOyB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gbnVtYmVyIG9mIHNldCBiaXRzXG4gICAgZnVuY3Rpb24gYm5CaXRDb3VudCgpIHtcbiAgICAgIHZhciByID0gMCwgeCA9IHRoaXMucyZ0aGlzLkRNO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKSByICs9IGNiaXQodGhpc1tpXV54KTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRydWUgaWZmIG50aCBiaXQgaXMgc2V0XG4gICAgZnVuY3Rpb24gYm5UZXN0Qml0KG4pIHtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcihuL3RoaXMuREIpO1xuICAgICAgaWYoaiA+PSB0aGlzLnQpIHJldHVybih0aGlzLnMhPTApO1xuICAgICAgcmV0dXJuKCh0aGlzW2pdJigxPDwobiV0aGlzLkRCKSkpIT0wKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzIG9wICgxPDxuKVxuICAgIGZ1bmN0aW9uIGJucENoYW5nZUJpdChuLG9wKSB7XG4gICAgICB2YXIgciA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChuKTtcbiAgICAgIHRoaXMuYml0d2lzZVRvKHIsb3Ascik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIHwgKDE8PG4pXG4gICAgZnVuY3Rpb24gYm5TZXRCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF9vcik7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJiB+KDE8PG4pXG4gICAgZnVuY3Rpb24gYm5DbGVhckJpdChuKSB7IHJldHVybiB0aGlzLmNoYW5nZUJpdChuLG9wX2FuZG5vdCk7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgXiAoMTw8bilcbiAgICBmdW5jdGlvbiBibkZsaXBCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF94b3IpOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyArIGFcbiAgICBmdW5jdGlvbiBibnBBZGRUbyhhLHIpIHtcbiAgICAgIHZhciBpID0gMCwgYyA9IDAsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIHdoaWxlKGkgPCBtKSB7XG4gICAgICAgIGMgKz0gdGhpc1tpXSthW2ldO1xuICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICB9XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgYyArPSBhLnM7XG4gICAgICAgIHdoaWxlKGkgPCB0aGlzLnQpIHtcbiAgICAgICAgICBjICs9IHRoaXNbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICAgIHdoaWxlKGkgPCBhLnQpIHtcbiAgICAgICAgICBjICs9IGFbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSBhLnM7XG4gICAgICB9XG4gICAgICByLnMgPSAoYzwwKT8tMTowO1xuICAgICAgaWYoYyA+IDApIHJbaSsrXSA9IGM7XG4gICAgICBlbHNlIGlmKGMgPCAtMSkgcltpKytdID0gdGhpcy5EVitjO1xuICAgICAgci50ID0gaTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzICsgYVxuICAgIGZ1bmN0aW9uIGJuQWRkKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5hZGRUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAtIGFcbiAgICBmdW5jdGlvbiBiblN1YnRyYWN0KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zdWJUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAqIGFcbiAgICBmdW5jdGlvbiBibk11bHRpcGx5KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5tdWx0aXBseVRvKGEscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzXjJcbiAgICBmdW5jdGlvbiBiblNxdWFyZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zcXVhcmVUbyhyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgLyBhXG4gICAgZnVuY3Rpb24gYm5EaXZpZGUoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEscixudWxsKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJSBhXG4gICAgZnVuY3Rpb24gYm5SZW1haW5kZXIoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEsbnVsbCxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIFt0aGlzL2EsdGhpcyVhXVxuICAgIGZ1bmN0aW9uIGJuRGl2aWRlQW5kUmVtYWluZGVyKGEpIHtcbiAgICAgIHZhciBxID0gbmJpKCksIHIgPSBuYmkoKTtcbiAgICAgIHRoaXMuZGl2UmVtVG8oYSxxLHIpO1xuICAgICAgcmV0dXJuIG5ldyBBcnJheShxLHIpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgKj0gbiwgdGhpcyA+PSAwLCAxIDwgbiA8IERWXG4gICAgZnVuY3Rpb24gYm5wRE11bHRpcGx5KG4pIHtcbiAgICAgIHRoaXNbdGhpcy50XSA9IHRoaXMuYW0oMCxuLTEsdGhpcywwLDAsdGhpcy50KTtcbiAgICAgICsrdGhpcy50O1xuICAgICAgdGhpcy5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgKz0gbiA8PCB3IHdvcmRzLCB0aGlzID49IDBcbiAgICBmdW5jdGlvbiBibnBEQWRkT2Zmc2V0KG4sdykge1xuICAgICAgaWYobiA9PSAwKSByZXR1cm47XG4gICAgICB3aGlsZSh0aGlzLnQgPD0gdykgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgdGhpc1t3XSArPSBuO1xuICAgICAgd2hpbGUodGhpc1t3XSA+PSB0aGlzLkRWKSB7XG4gICAgICAgIHRoaXNbd10gLT0gdGhpcy5EVjtcbiAgICAgICAgaWYoKyt3ID49IHRoaXMudCkgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgICArK3RoaXNbd107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQSBcIm51bGxcIiByZWR1Y2VyXG4gICAgZnVuY3Rpb24gTnVsbEV4cCgpIHt9XG4gICAgZnVuY3Rpb24gbk5vcCh4KSB7IHJldHVybiB4OyB9XG4gICAgZnVuY3Rpb24gbk11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB9XG4gICAgZnVuY3Rpb24gblNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB9XG5cbiAgICBOdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0ID0gbk5vcDtcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5yZXZlcnQgPSBuTm9wO1xuICAgIE51bGxFeHAucHJvdG90eXBlLm11bFRvID0gbk11bFRvO1xuICAgIE51bGxFeHAucHJvdG90eXBlLnNxclRvID0gblNxclRvO1xuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lXG4gICAgZnVuY3Rpb24gYm5Qb3coZSkgeyByZXR1cm4gdGhpcy5leHAoZSxuZXcgTnVsbEV4cCgpKTsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IGxvd2VyIG4gd29yZHMgb2YgXCJ0aGlzICogYVwiLCBhLnQgPD0gblxuICAgIC8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbiAgICBmdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYSxuLHIpIHtcbiAgICAgIHZhciBpID0gTWF0aC5taW4odGhpcy50K2EudCxuKTtcbiAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgIHIudCA9IGk7XG4gICAgICB3aGlsZShpID4gMCkgclstLWldID0gMDtcbiAgICAgIHZhciBqO1xuICAgICAgZm9yKGogPSByLnQtdGhpcy50OyBpIDwgajsgKytpKSByW2krdGhpcy50XSA9IHRoaXMuYW0oMCxhW2ldLHIsaSwwLHRoaXMudCk7XG4gICAgICBmb3IoaiA9IE1hdGgubWluKGEudCxuKTsgaSA8IGo7ICsraSkgdGhpcy5hbSgwLGFbaV0scixpLDAsbi1pKTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gXCJ0aGlzICogYVwiIHdpdGhvdXQgbG93ZXIgbiB3b3JkcywgbiA+IDBcbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGEsbixyKSB7XG4gICAgICAtLW47XG4gICAgICB2YXIgaSA9IHIudCA9IHRoaXMudCthLnQtbjtcbiAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgICAgIGZvcihpID0gTWF0aC5tYXgobi10aGlzLnQsMCk7IGkgPCBhLnQ7ICsraSlcbiAgICAgICAgclt0aGlzLnQraS1uXSA9IHRoaXMuYW0obi1pLGFbaV0sciwwLDAsdGhpcy50K2ktbik7XG4gICAgICByLmNsYW1wKCk7XG4gICAgICByLmRyU2hpZnRUbygxLHIpO1xuICAgIH1cblxuICAgIC8vIEJhcnJldHQgbW9kdWxhciByZWR1Y3Rpb25cbiAgICBmdW5jdGlvbiBCYXJyZXR0KG0pIHtcbiAgICAgIC8vIHNldHVwIEJhcnJldHRcbiAgICAgIHRoaXMucjIgPSBuYmkoKTtcbiAgICAgIHRoaXMucTMgPSBuYmkoKTtcbiAgICAgIEJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbygyKm0udCx0aGlzLnIyKTtcbiAgICAgIHRoaXMubXUgPSB0aGlzLnIyLmRpdmlkZShtKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmFycmV0dENvbnZlcnQoeCkge1xuICAgICAgaWYoeC5zIDwgMCB8fCB4LnQgPiAyKnRoaXMubS50KSByZXR1cm4geC5tb2QodGhpcy5tKTtcbiAgICAgIGVsc2UgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA8IDApIHJldHVybiB4O1xuICAgICAgZWxzZSB7IHZhciByID0gbmJpKCk7IHguY29weVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgcmV0dXJuIHI7IH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cblxuICAgIC8vIHggPSB4IG1vZCBtIChIQUMgMTQuNDIpXG4gICAgZnVuY3Rpb24gYmFycmV0dFJlZHVjZSh4KSB7XG4gICAgICB4LmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO1xuICAgICAgaWYoeC50ID4gdGhpcy5tLnQrMSkgeyB4LnQgPSB0aGlzLm0udCsxOyB4LmNsYW1wKCk7IH1cbiAgICAgIHRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhpcy5tLnQrMSx0aGlzLnEzKTtcbiAgICAgIHRoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO1xuICAgICAgd2hpbGUoeC5jb21wYXJlVG8odGhpcy5yMikgPCAwKSB4LmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKTtcbiAgICAgIHguc3ViVG8odGhpcy5yMix4KTtcbiAgICAgIHdoaWxlKHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7XG4gICAgfVxuXG4gICAgLy8gciA9IHheMiBtb2QgbTsgeCAhPSByXG4gICAgZnVuY3Rpb24gYmFycmV0dFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgLy8gciA9IHgqeSBtb2QgbTsgeCx5ICE9IHJcbiAgICBmdW5jdGlvbiBiYXJyZXR0TXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICBCYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0ID0gYmFycmV0dENvbnZlcnQ7XG4gICAgQmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0ID0gYmFycmV0dFJldmVydDtcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5yZWR1Y2UgPSBiYXJyZXR0UmVkdWNlO1xuICAgIEJhcnJldHQucHJvdG90eXBlLm11bFRvID0gYmFycmV0dE11bFRvO1xuICAgIEJhcnJldHQucHJvdG90eXBlLnNxclRvID0gYmFycmV0dFNxclRvO1xuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lICUgbSAoSEFDIDE0Ljg1KVxuICAgIGZ1bmN0aW9uIGJuTW9kUG93KGUsbSkge1xuICAgICAgdmFyIGkgPSBlLmJpdExlbmd0aCgpLCBrLCByID0gbmJ2KDEpLCB6O1xuICAgICAgaWYoaSA8PSAwKSByZXR1cm4gcjtcbiAgICAgIGVsc2UgaWYoaSA8IDE4KSBrID0gMTtcbiAgICAgIGVsc2UgaWYoaSA8IDQ4KSBrID0gMztcbiAgICAgIGVsc2UgaWYoaSA8IDE0NCkgayA9IDQ7XG4gICAgICBlbHNlIGlmKGkgPCA3NjgpIGsgPSA1O1xuICAgICAgZWxzZSBrID0gNjtcbiAgICAgIGlmKGkgPCA4KVxuICAgICAgICB6ID0gbmV3IENsYXNzaWMobSk7XG4gICAgICBlbHNlIGlmKG0uaXNFdmVuKCkpXG4gICAgICAgIHogPSBuZXcgQmFycmV0dChtKTtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuXG4gICAgICAvLyBwcmVjb21wdXRhdGlvblxuICAgICAgdmFyIGcgPSBuZXcgQXJyYXkoKSwgbiA9IDMsIGsxID0gay0xLCBrbSA9ICgxPDxrKS0xO1xuICAgICAgZ1sxXSA9IHouY29udmVydCh0aGlzKTtcbiAgICAgIGlmKGsgPiAxKSB7XG4gICAgICAgIHZhciBnMiA9IG5iaSgpO1xuICAgICAgICB6LnNxclRvKGdbMV0sZzIpO1xuICAgICAgICB3aGlsZShuIDw9IGttKSB7XG4gICAgICAgICAgZ1tuXSA9IG5iaSgpO1xuICAgICAgICAgIHoubXVsVG8oZzIsZ1tuLTJdLGdbbl0pO1xuICAgICAgICAgIG4gKz0gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaiA9IGUudC0xLCB3LCBpczEgPSB0cnVlLCByMiA9IG5iaSgpLCB0O1xuICAgICAgaSA9IG5iaXRzKGVbal0pLTE7XG4gICAgICB3aGlsZShqID49IDApIHtcbiAgICAgICAgaWYoaSA+PSBrMSkgdyA9IChlW2pdPj4oaS1rMSkpJmttO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB3ID0gKGVbal0mKCgxPDwoaSsxKSktMSkpPDwoazEtaSk7XG4gICAgICAgICAgaWYoaiA+IDApIHcgfD0gZVtqLTFdPj4odGhpcy5EQitpLWsxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG4gPSBrO1xuICAgICAgICB3aGlsZSgodyYxKSA9PSAwKSB7IHcgPj49IDE7IC0tbjsgfVxuICAgICAgICBpZigoaSAtPSBuKSA8IDApIHsgaSArPSB0aGlzLkRCOyAtLWo7IH1cbiAgICAgICAgaWYoaXMxKSB7XHQvLyByZXQgPT0gMSwgZG9uJ3QgYm90aGVyIHNxdWFyaW5nIG9yIG11bHRpcGx5aW5nIGl0XG4gICAgICAgICAgZ1t3XS5jb3B5VG8ocik7XG4gICAgICAgICAgaXMxID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgd2hpbGUobiA+IDEpIHsgei5zcXJUbyhyLHIyKTsgei5zcXJUbyhyMixyKTsgbiAtPSAyOyB9XG4gICAgICAgICAgaWYobiA+IDApIHouc3FyVG8ocixyMik7IGVsc2UgeyB0ID0gcjsgciA9IHIyOyByMiA9IHQ7IH1cbiAgICAgICAgICB6Lm11bFRvKHIyLGdbd10scik7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZShqID49IDAgJiYgKGVbal0mKDE8PGkpKSA9PSAwKSB7XG4gICAgICAgICAgei5zcXJUbyhyLHIyKTsgdCA9IHI7IHIgPSByMjsgcjIgPSB0O1xuICAgICAgICAgIGlmKC0taSA8IDApIHsgaSA9IHRoaXMuREItMTsgLS1qOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnJldmVydChyKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSBnY2QodGhpcyxhKSAoSEFDIDE0LjU0KVxuICAgIGZ1bmN0aW9uIGJuR0NEKGEpIHtcbiAgICAgIHZhciB4ID0gKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXMuY2xvbmUoKTtcbiAgICAgIHZhciB5ID0gKGEuczwwKT9hLm5lZ2F0ZSgpOmEuY2xvbmUoKTtcbiAgICAgIGlmKHguY29tcGFyZVRvKHkpIDwgMCkgeyB2YXIgdCA9IHg7IHggPSB5OyB5ID0gdDsgfVxuICAgICAgdmFyIGkgPSB4LmdldExvd2VzdFNldEJpdCgpLCBnID0geS5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgICAgIGlmKGcgPCAwKSByZXR1cm4geDtcbiAgICAgIGlmKGkgPCBnKSBnID0gaTtcbiAgICAgIGlmKGcgPiAwKSB7XG4gICAgICAgIHguclNoaWZ0VG8oZyx4KTtcbiAgICAgICAgeS5yU2hpZnRUbyhnLHkpO1xuICAgICAgfVxuICAgICAgd2hpbGUoeC5zaWdudW0oKSA+IDApIHtcbiAgICAgICAgaWYoKGkgPSB4LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHguclNoaWZ0VG8oaSx4KTtcbiAgICAgICAgaWYoKGkgPSB5LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHkuclNoaWZ0VG8oaSx5KTtcbiAgICAgICAgaWYoeC5jb21wYXJlVG8oeSkgPj0gMCkge1xuICAgICAgICAgIHguc3ViVG8oeSx4KTtcbiAgICAgICAgICB4LnJTaGlmdFRvKDEseCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgeS5zdWJUbyh4LHkpO1xuICAgICAgICAgIHkuclNoaWZ0VG8oMSx5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoZyA+IDApIHkubFNoaWZ0VG8oZyx5KTtcbiAgICAgIHJldHVybiB5O1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgJSBuLCBuIDwgMl4yNlxuICAgIGZ1bmN0aW9uIGJucE1vZEludChuKSB7XG4gICAgICBpZihuIDw9IDApIHJldHVybiAwO1xuICAgICAgdmFyIGQgPSB0aGlzLkRWJW4sIHIgPSAodGhpcy5zPDApP24tMTowO1xuICAgICAgaWYodGhpcy50ID4gMClcbiAgICAgICAgaWYoZCA9PSAwKSByID0gdGhpc1swXSVuO1xuICAgICAgICBlbHNlIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgciA9IChkKnIrdGhpc1tpXSklbjtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIDEvdGhpcyAlIG0gKEhBQyAxNC42MSlcbiAgICBmdW5jdGlvbiBibk1vZEludmVyc2UobSkge1xuICAgICAgdmFyIGFjID0gbS5pc0V2ZW4oKTtcbiAgICAgIGlmKCh0aGlzLmlzRXZlbigpICYmIGFjKSB8fCBtLnNpZ251bSgpID09IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICB2YXIgdSA9IG0uY2xvbmUoKSwgdiA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIHZhciBhID0gbmJ2KDEpLCBiID0gbmJ2KDApLCBjID0gbmJ2KDApLCBkID0gbmJ2KDEpO1xuICAgICAgd2hpbGUodS5zaWdudW0oKSAhPSAwKSB7XG4gICAgICAgIHdoaWxlKHUuaXNFdmVuKCkpIHtcbiAgICAgICAgICB1LnJTaGlmdFRvKDEsdSk7XG4gICAgICAgICAgaWYoYWMpIHtcbiAgICAgICAgICAgIGlmKCFhLmlzRXZlbigpIHx8ICFiLmlzRXZlbigpKSB7IGEuYWRkVG8odGhpcyxhKTsgYi5zdWJUbyhtLGIpOyB9XG4gICAgICAgICAgICBhLnJTaGlmdFRvKDEsYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYoIWIuaXNFdmVuKCkpIGIuc3ViVG8obSxiKTtcbiAgICAgICAgICBiLnJTaGlmdFRvKDEsYik7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUodi5pc0V2ZW4oKSkge1xuICAgICAgICAgIHYuclNoaWZ0VG8oMSx2KTtcbiAgICAgICAgICBpZihhYykge1xuICAgICAgICAgICAgaWYoIWMuaXNFdmVuKCkgfHwgIWQuaXNFdmVuKCkpIHsgYy5hZGRUbyh0aGlzLGMpOyBkLnN1YlRvKG0sZCk7IH1cbiAgICAgICAgICAgIGMuclNoaWZ0VG8oMSxjKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighZC5pc0V2ZW4oKSkgZC5zdWJUbyhtLGQpO1xuICAgICAgICAgIGQuclNoaWZ0VG8oMSxkKTtcbiAgICAgICAgfVxuICAgICAgICBpZih1LmNvbXBhcmVUbyh2KSA+PSAwKSB7XG4gICAgICAgICAgdS5zdWJUbyh2LHUpO1xuICAgICAgICAgIGlmKGFjKSBhLnN1YlRvKGMsYSk7XG4gICAgICAgICAgYi5zdWJUbyhkLGIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHYuc3ViVG8odSx2KTtcbiAgICAgICAgICBpZihhYykgYy5zdWJUbyhhLGMpO1xuICAgICAgICAgIGQuc3ViVG8oYixkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYodi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpICE9IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICBpZihkLmNvbXBhcmVUbyhtKSA+PSAwKSByZXR1cm4gZC5zdWJ0cmFjdChtKTtcbiAgICAgIGlmKGQuc2lnbnVtKCkgPCAwKSBkLmFkZFRvKG0sZCk7IGVsc2UgcmV0dXJuIGQ7XG4gICAgICBpZihkLnNpZ251bSgpIDwgMCkgcmV0dXJuIGQuYWRkKG0pOyBlbHNlIHJldHVybiBkO1xuICAgIH1cblxuICAgIHZhciBsb3dwcmltZXMgPSBbMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOSw1MjEsNTIzLDU0MSw1NDcsNTU3LDU2Myw1NjksNTcxLDU3Nyw1ODcsNTkzLDU5OSw2MDEsNjA3LDYxMyw2MTcsNjE5LDYzMSw2NDEsNjQzLDY0Nyw2NTMsNjU5LDY2MSw2NzMsNjc3LDY4Myw2OTEsNzAxLDcwOSw3MTksNzI3LDczMyw3MzksNzQzLDc1MSw3NTcsNzYxLDc2OSw3NzMsNzg3LDc5Nyw4MDksODExLDgyMSw4MjMsODI3LDgyOSw4MzksODUzLDg1Nyw4NTksODYzLDg3Nyw4ODEsODgzLDg4Nyw5MDcsOTExLDkxOSw5MjksOTM3LDk0MSw5NDcsOTUzLDk2Nyw5NzEsOTc3LDk4Myw5OTEsOTk3XTtcbiAgICB2YXIgbHBsaW0gPSAoMTw8MjYpL2xvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdO1xuXG4gICAgLy8gKHB1YmxpYykgdGVzdCBwcmltYWxpdHkgd2l0aCBjZXJ0YWludHkgPj0gMS0uNV50XG4gICAgZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUodCkge1xuICAgICAgdmFyIGksIHggPSB0aGlzLmFicygpO1xuICAgICAgaWYoeC50ID09IDEgJiYgeFswXSA8PSBsb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBsb3dwcmltZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgaWYoeFswXSA9PSBsb3dwcmltZXNbaV0pIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZih4LmlzRXZlbigpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpID0gMTtcbiAgICAgIHdoaWxlKGkgPCBsb3dwcmltZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtID0gbG93cHJpbWVzW2ldLCBqID0gaSsxO1xuICAgICAgICB3aGlsZShqIDwgbG93cHJpbWVzLmxlbmd0aCAmJiBtIDwgbHBsaW0pIG0gKj0gbG93cHJpbWVzW2orK107XG4gICAgICAgIG0gPSB4Lm1vZEludChtKTtcbiAgICAgICAgd2hpbGUoaSA8IGopIGlmKG0lbG93cHJpbWVzW2krK10gPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHgubWlsbGVyUmFiaW4odCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdHJ1ZSBpZiBwcm9iYWJseSBwcmltZSAoSEFDIDQuMjQsIE1pbGxlci1SYWJpbilcbiAgICBmdW5jdGlvbiBibnBNaWxsZXJSYWJpbih0KSB7XG4gICAgICB2YXIgbjEgPSB0aGlzLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICAgIHZhciBrID0gbjEuZ2V0TG93ZXN0U2V0Qml0KCk7XG4gICAgICBpZihrIDw9IDApIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciByID0gbjEuc2hpZnRSaWdodChrKTtcbiAgICAgIHQgPSAodCsxKT4+MTtcbiAgICAgIGlmKHQgPiBsb3dwcmltZXMubGVuZ3RoKSB0ID0gbG93cHJpbWVzLmxlbmd0aDtcbiAgICAgIHZhciBhID0gbmJpKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdDsgKytpKSB7XG4gICAgICAgIC8vUGljayBiYXNlcyBhdCByYW5kb20sIGluc3RlYWQgb2Ygc3RhcnRpbmcgYXQgMlxuICAgICAgICBhLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsb3dwcmltZXMubGVuZ3RoKV0pO1xuICAgICAgICB2YXIgeSA9IGEubW9kUG93KHIsdGhpcyk7XG4gICAgICAgIGlmKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICAgICAgdmFyIGogPSAxO1xuICAgICAgICAgIHdoaWxlKGorKyA8IGsgJiYgeS5jb21wYXJlVG8objEpICE9IDApIHtcbiAgICAgICAgICAgIHkgPSB5Lm1vZFBvd0ludCgyLHRoaXMpO1xuICAgICAgICAgICAgaWYoeS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoeS5jb21wYXJlVG8objEpICE9IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvdGVjdGVkXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplID0gYm5wQ2h1bmtTaXplO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXggPSBibnBUb1JhZGl4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeCA9IGJucEZyb21SYWRpeDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyID0gYm5wRnJvbU51bWJlcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG8gPSBibnBCaXR3aXNlVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2hhbmdlQml0ID0gYm5wQ2hhbmdlQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvID0gYm5wQWRkVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5ID0gYm5wRE11bHRpcGx5O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRBZGRPZmZzZXQgPSBibnBEQWRkT2Zmc2V0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5TG93ZXJUbyA9IGJucE11bHRpcGx5TG93ZXJUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG8gPSBibnBNdWx0aXBseVVwcGVyVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW50ID0gYm5wTW9kSW50O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluID0gYm5wTWlsbGVyUmFiaW47XG5cbiAgICAvLyBwdWJsaWNcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZSA9IGJuQ2xvbmU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWUgPSBibkludFZhbHVlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZSA9IGJuQnl0ZVZhbHVlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWUgPSBiblNob3J0VmFsdWU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtID0gYm5TaWdOdW07XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUudG9CeXRlQXJyYXkgPSBiblRvQnl0ZUFycmF5O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmVxdWFscyA9IGJuRXF1YWxzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbiA9IGJuTWluO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1heCA9IGJuTWF4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZCA9IGJuQW5kO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm9yID0gYm5PcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3IgPSBiblhvcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmROb3QgPSBibkFuZE5vdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3QgPSBibk5vdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQgPSBiblNoaWZ0TGVmdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0ID0gYm5TaGlmdFJpZ2h0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdCA9IGJuR2V0TG93ZXN0U2V0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50ID0gYm5CaXRDb3VudDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50ZXN0Qml0ID0gYm5UZXN0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdCA9IGJuU2V0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsZWFyQml0ID0gYm5DbGVhckJpdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mbGlwQml0ID0gYm5GbGlwQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZCA9IGJuQWRkO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0ID0gYm5TdWJ0cmFjdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseSA9IGJuTXVsdGlwbHk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlID0gYm5EaXZpZGU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyID0gYm5SZW1haW5kZXI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlQW5kUmVtYWluZGVyID0gYm5EaXZpZGVBbmRSZW1haW5kZXI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93ID0gYm5Nb2RQb3c7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW52ZXJzZSA9IGJuTW9kSW52ZXJzZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3cgPSBiblBvdztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2QgPSBibkdDRDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWUgPSBibklzUHJvYmFibGVQcmltZTtcblxuICAgIC8vIEpTQk4tc3BlY2lmaWMgZXh0ZW5zaW9uXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlID0gYm5TcXVhcmU7XG5cbiAgICAvLyBFeHBvc2UgdGhlIEJhcnJldHQgZnVuY3Rpb25cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5CYXJyZXR0ID0gQmFycmV0dFxuXG4gICAgLy8gQmlnSW50ZWdlciBpbnRlcmZhY2VzIG5vdCBpbXBsZW1lbnRlZCBpbiBqc2JuOlxuXG4gICAgLy8gQmlnSW50ZWdlcihpbnQgc2lnbnVtLCBieXRlW10gbWFnbml0dWRlKVxuICAgIC8vIGRvdWJsZSBkb3VibGVWYWx1ZSgpXG4gICAgLy8gZmxvYXQgZmxvYXRWYWx1ZSgpXG4gICAgLy8gaW50IGhhc2hDb2RlKClcbiAgICAvLyBsb25nIGxvbmdWYWx1ZSgpXG4gICAgLy8gc3RhdGljIEJpZ0ludGVnZXIgdmFsdWVPZihsb25nIHZhbClcblxuXHQvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciAtIHJlcXVpcmVzIGEgUFJORyBiYWNrZW5kLCBlLmcuIHBybmc0LmpzXG5cblx0Ly8gRm9yIGJlc3QgcmVzdWx0cywgcHV0IGNvZGUgbGlrZVxuXHQvLyA8Ym9keSBvbkNsaWNrPSdybmdfc2VlZF90aW1lKCk7JyBvbktleVByZXNzPSdybmdfc2VlZF90aW1lKCk7Jz5cblx0Ly8gaW4geW91ciBtYWluIEhUTUwgZG9jdW1lbnQuXG5cblx0dmFyIHJuZ19zdGF0ZTtcblx0dmFyIHJuZ19wb29sO1xuXHR2YXIgcm5nX3BwdHI7XG5cblx0Ly8gTWl4IGluIGEgMzItYml0IGludGVnZXIgaW50byB0aGUgcG9vbFxuXHRmdW5jdGlvbiBybmdfc2VlZF9pbnQoeCkge1xuXHQgIHJuZ19wb29sW3JuZ19wcHRyKytdIF49IHggJiAyNTU7XG5cdCAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gOCkgJiAyNTU7XG5cdCAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gMTYpICYgMjU1O1xuXHQgIHJuZ19wb29sW3JuZ19wcHRyKytdIF49ICh4ID4+IDI0KSAmIDI1NTtcblx0ICBpZihybmdfcHB0ciA+PSBybmdfcHNpemUpIHJuZ19wcHRyIC09IHJuZ19wc2l6ZTtcblx0fVxuXG5cdC8vIE1peCBpbiB0aGUgY3VycmVudCB0aW1lICh3L21pbGxpc2Vjb25kcykgaW50byB0aGUgcG9vbFxuXHRmdW5jdGlvbiBybmdfc2VlZF90aW1lKCkge1xuXHQgIHJuZ19zZWVkX2ludChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG5cdH1cblxuXHQvLyBJbml0aWFsaXplIHRoZSBwb29sIHdpdGgganVuayBpZiBuZWVkZWQuXG5cdGlmKHJuZ19wb29sID09IG51bGwpIHtcblx0ICBybmdfcG9vbCA9IG5ldyBBcnJheSgpO1xuXHQgIHJuZ19wcHRyID0gMDtcblx0ICB2YXIgdDtcblx0ICBpZih0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5jcnlwdG8pIHtcblx0XHRpZiAod2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcblx0XHQgIC8vIFVzZSB3ZWJjcnlwdG8gaWYgYXZhaWxhYmxlXG5cdFx0ICB2YXIgdWEgPSBuZXcgVWludDhBcnJheSgzMik7XG5cdFx0ICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1YSk7XG5cdFx0ICBmb3IodCA9IDA7IHQgPCAzMjsgKyt0KVxuXHRcdFx0cm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB1YVt0XTtcblx0XHR9XG5cdFx0ZWxzZSBpZihuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk5ldHNjYXBlXCIgJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24gPCBcIjVcIikge1xuXHRcdCAgLy8gRXh0cmFjdCBlbnRyb3B5ICgyNTYgYml0cykgZnJvbSBOUzQgUk5HIGlmIGF2YWlsYWJsZVxuXHRcdCAgdmFyIHogPSB3aW5kb3cuY3J5cHRvLnJhbmRvbSgzMik7XG5cdFx0ICBmb3IodCA9IDA7IHQgPCB6Lmxlbmd0aDsgKyt0KVxuXHRcdFx0cm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB6LmNoYXJDb2RlQXQodCkgJiAyNTU7XG5cdFx0fVxuXHQgIH1cblx0ICB3aGlsZShybmdfcHB0ciA8IHJuZ19wc2l6ZSkgeyAgLy8gZXh0cmFjdCBzb21lIHJhbmRvbW5lc3MgZnJvbSBNYXRoLnJhbmRvbSgpXG5cdFx0dCA9IE1hdGguZmxvb3IoNjU1MzYgKiBNYXRoLnJhbmRvbSgpKTtcblx0XHRybmdfcG9vbFtybmdfcHB0cisrXSA9IHQgPj4+IDg7XG5cdFx0cm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB0ICYgMjU1O1xuXHQgIH1cblx0ICBybmdfcHB0ciA9IDA7XG5cdCAgcm5nX3NlZWRfdGltZSgpO1xuXHQgIC8vcm5nX3NlZWRfaW50KHdpbmRvdy5zY3JlZW5YKTtcblx0ICAvL3JuZ19zZWVkX2ludCh3aW5kb3cuc2NyZWVuWSk7XG5cdH1cblxuXHRmdW5jdGlvbiBybmdfZ2V0X2J5dGUoKSB7XG5cdCAgaWYocm5nX3N0YXRlID09IG51bGwpIHtcblx0XHRybmdfc2VlZF90aW1lKCk7XG5cdFx0cm5nX3N0YXRlID0gcHJuZ19uZXdzdGF0ZSgpO1xuXHRcdHJuZ19zdGF0ZS5pbml0KHJuZ19wb29sKTtcblx0XHRmb3Iocm5nX3BwdHIgPSAwOyBybmdfcHB0ciA8IHJuZ19wb29sLmxlbmd0aDsgKytybmdfcHB0cilcblx0XHQgIHJuZ19wb29sW3JuZ19wcHRyXSA9IDA7XG5cdFx0cm5nX3BwdHIgPSAwO1xuXHRcdC8vcm5nX3Bvb2wgPSBudWxsO1xuXHQgIH1cblx0ICAvLyBUT0RPOiBhbGxvdyByZXNlZWRpbmcgYWZ0ZXIgZmlyc3QgcmVxdWVzdFxuXHQgIHJldHVybiBybmdfc3RhdGUubmV4dCgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcm5nX2dldF9ieXRlcyhiYSkge1xuXHQgIHZhciBpO1xuXHQgIGZvcihpID0gMDsgaSA8IGJhLmxlbmd0aDsgKytpKSBiYVtpXSA9IHJuZ19nZXRfYnl0ZSgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCkge31cblxuXHRTZWN1cmVSYW5kb20ucHJvdG90eXBlLm5leHRCeXRlcyA9IHJuZ19nZXRfYnl0ZXM7XG5cblx0Ly8gcHJuZzQuanMgLSB1c2VzIEFyY2ZvdXIgYXMgYSBQUk5HXG5cblx0ZnVuY3Rpb24gQXJjZm91cigpIHtcblx0ICB0aGlzLmkgPSAwO1xuXHQgIHRoaXMuaiA9IDA7XG5cdCAgdGhpcy5TID0gbmV3IEFycmF5KCk7XG5cdH1cblxuXHQvLyBJbml0aWFsaXplIGFyY2ZvdXIgY29udGV4dCBmcm9tIGtleSwgYW4gYXJyYXkgb2YgaW50cywgZWFjaCBmcm9tIFswLi4yNTVdXG5cdGZ1bmN0aW9uIEFSQzRpbml0KGtleSkge1xuXHQgIHZhciBpLCBqLCB0O1xuXHQgIGZvcihpID0gMDsgaSA8IDI1NjsgKytpKVxuXHRcdHRoaXMuU1tpXSA9IGk7XG5cdCAgaiA9IDA7XG5cdCAgZm9yKGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcblx0XHRqID0gKGogKyB0aGlzLlNbaV0gKyBrZXlbaSAlIGtleS5sZW5ndGhdKSAmIDI1NTtcblx0XHR0ID0gdGhpcy5TW2ldO1xuXHRcdHRoaXMuU1tpXSA9IHRoaXMuU1tqXTtcblx0XHR0aGlzLlNbal0gPSB0O1xuXHQgIH1cblx0ICB0aGlzLmkgPSAwO1xuXHQgIHRoaXMuaiA9IDA7XG5cdH1cblxuXHRmdW5jdGlvbiBBUkM0bmV4dCgpIHtcblx0ICB2YXIgdDtcblx0ICB0aGlzLmkgPSAodGhpcy5pICsgMSkgJiAyNTU7XG5cdCAgdGhpcy5qID0gKHRoaXMuaiArIHRoaXMuU1t0aGlzLmldKSAmIDI1NTtcblx0ICB0ID0gdGhpcy5TW3RoaXMuaV07XG5cdCAgdGhpcy5TW3RoaXMuaV0gPSB0aGlzLlNbdGhpcy5qXTtcblx0ICB0aGlzLlNbdGhpcy5qXSA9IHQ7XG5cdCAgcmV0dXJuIHRoaXMuU1sodCArIHRoaXMuU1t0aGlzLmldKSAmIDI1NV07XG5cdH1cblxuXHRBcmNmb3VyLnByb3RvdHlwZS5pbml0ID0gQVJDNGluaXQ7XG5cdEFyY2ZvdXIucHJvdG90eXBlLm5leHQgPSBBUkM0bmV4dDtcblxuXHQvLyBQbHVnIGluIHlvdXIgUk5HIGNvbnN0cnVjdG9yIGhlcmVcblx0ZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpIHtcblx0ICByZXR1cm4gbmV3IEFyY2ZvdXIoKTtcblx0fVxuXG5cdC8vIFBvb2wgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgZ3JlYXRlciB0aGFuIDMyLlxuXHQvLyBBbiBhcnJheSBvZiBieXRlcyB0aGUgc2l6ZSBvZiB0aGUgcG9vbCB3aWxsIGJlIHBhc3NlZCB0byBpbml0KClcblx0dmFyIHJuZ19wc2l6ZSA9IDI1NjtcblxuICBCaWdJbnRlZ2VyLlNlY3VyZVJhbmRvbSA9IFNlY3VyZVJhbmRvbTtcbiAgQmlnSW50ZWdlci5CaWdJbnRlZ2VyID0gQmlnSW50ZWdlcjtcbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEJpZ0ludGVnZXI7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5CaWdJbnRlZ2VyID0gQmlnSW50ZWdlcjtcbiAgICB0aGlzLlNlY3VyZVJhbmRvbSA9IFNlY3VyZVJhbmRvbTtcbiAgfVxuXG59KS5jYWxsKHRoaXMpO1xuIiwgIi8vIEJhc2ljIEphdmFzY3JpcHQgRWxsaXB0aWMgQ3VydmUgaW1wbGVtZW50YXRpb25cbi8vIFBvcnRlZCBsb29zZWx5IGZyb20gQm91bmN5Q2FzdGxlJ3MgSmF2YSBFQyBjb2RlXG4vLyBPbmx5IEZwIGN1cnZlcyBpbXBsZW1lbnRlZCBmb3Igbm93XG5cbi8vIFJlcXVpcmVzIGpzYm4uanMgYW5kIGpzYm4yLmpzXG52YXIgQmlnSW50ZWdlciA9IHJlcXVpcmUoJ2pzYm4nKS5CaWdJbnRlZ2VyXG52YXIgQmFycmV0dCA9IEJpZ0ludGVnZXIucHJvdG90eXBlLkJhcnJldHRcblxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuLy8gRUNGaWVsZEVsZW1lbnRGcFxuXG4vLyBjb25zdHJ1Y3RvclxuZnVuY3Rpb24gRUNGaWVsZEVsZW1lbnRGcChxLHgpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIC8vIFRPRE8gaWYoeC5jb21wYXJlVG8ocSkgPj0gMCkgZXJyb3JcbiAgICB0aGlzLnEgPSBxO1xufVxuXG5mdW5jdGlvbiBmZUZwRXF1YWxzKG90aGVyKSB7XG4gICAgaWYob3RoZXIgPT0gdGhpcykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICh0aGlzLnEuZXF1YWxzKG90aGVyLnEpICYmIHRoaXMueC5lcXVhbHMob3RoZXIueCkpO1xufVxuXG5mdW5jdGlvbiBmZUZwVG9CaWdJbnRlZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLng7XG59XG5cbmZ1bmN0aW9uIGZlRnBOZWdhdGUoKSB7XG4gICAgcmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSwgdGhpcy54Lm5lZ2F0ZSgpLm1vZCh0aGlzLnEpKTtcbn1cblxuZnVuY3Rpb24gZmVGcEFkZChiKSB7XG4gICAgcmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSwgdGhpcy54LmFkZChiLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSk7XG59XG5cbmZ1bmN0aW9uIGZlRnBTdWJ0cmFjdChiKSB7XG4gICAgcmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSwgdGhpcy54LnN1YnRyYWN0KGIudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKTtcbn1cblxuZnVuY3Rpb24gZmVGcE11bHRpcGx5KGIpIHtcbiAgICByZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLCB0aGlzLngubXVsdGlwbHkoYi50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpO1xufVxuXG5mdW5jdGlvbiBmZUZwU3F1YXJlKCkge1xuICAgIHJldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsIHRoaXMueC5zcXVhcmUoKS5tb2QodGhpcy5xKSk7XG59XG5cbmZ1bmN0aW9uIGZlRnBEaXZpZGUoYikge1xuICAgIHJldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsIHRoaXMueC5tdWx0aXBseShiLnRvQmlnSW50ZWdlcigpLm1vZEludmVyc2UodGhpcy5xKSkubW9kKHRoaXMucSkpO1xufVxuXG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5lcXVhbHMgPSBmZUZwRXF1YWxzO1xuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUudG9CaWdJbnRlZ2VyID0gZmVGcFRvQmlnSW50ZWdlcjtcbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm5lZ2F0ZSA9IGZlRnBOZWdhdGU7XG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5hZGQgPSBmZUZwQWRkO1xuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3VidHJhY3QgPSBmZUZwU3VidHJhY3Q7XG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5tdWx0aXBseSA9IGZlRnBNdWx0aXBseTtcbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnNxdWFyZSA9IGZlRnBTcXVhcmU7XG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5kaXZpZGUgPSBmZUZwRGl2aWRlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tXG4vLyBFQ1BvaW50RnBcblxuLy8gY29uc3RydWN0b3JcbmZ1bmN0aW9uIEVDUG9pbnRGcChjdXJ2ZSx4LHkseikge1xuICAgIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgLy8gUHJvamVjdGl2ZSBjb29yZGluYXRlczogZWl0aGVyIHppbnYgPT0gbnVsbCBvciB6ICogemludiA9PSAxXG4gICAgLy8geiBhbmQgemludiBhcmUganVzdCBCaWdJbnRlZ2Vycywgbm90IGZpZWxkRWxlbWVudHNcbiAgICBpZih6ID09IG51bGwpIHtcbiAgICAgIHRoaXMueiA9IEJpZ0ludGVnZXIuT05FO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMueiA9IHo7XG4gICAgfVxuICAgIHRoaXMuemludiA9IG51bGw7XG4gICAgLy9UT0RPOiBjb21wcmVzc2lvbiBmbGFnXG59XG5cbmZ1bmN0aW9uIHBvaW50RnBHZXRYKCkge1xuICAgIGlmKHRoaXMuemludiA9PSBudWxsKSB7XG4gICAgICB0aGlzLnppbnYgPSB0aGlzLnoubW9kSW52ZXJzZSh0aGlzLmN1cnZlLnEpO1xuICAgIH1cbiAgICB2YXIgciA9IHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnppbnYpO1xuICAgIHRoaXMuY3VydmUucmVkdWNlKHIpO1xuICAgIHJldHVybiB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHIpO1xufVxuXG5mdW5jdGlvbiBwb2ludEZwR2V0WSgpIHtcbiAgICBpZih0aGlzLnppbnYgPT0gbnVsbCkge1xuICAgICAgdGhpcy56aW52ID0gdGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKTtcbiAgICB9XG4gICAgdmFyIHIgPSB0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KTtcbiAgICB0aGlzLmN1cnZlLnJlZHVjZShyKTtcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihyKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRGcEVxdWFscyhvdGhlcikge1xuICAgIGlmKG90aGVyID09IHRoaXMpIHJldHVybiB0cnVlO1xuICAgIGlmKHRoaXMuaXNJbmZpbml0eSgpKSByZXR1cm4gb3RoZXIuaXNJbmZpbml0eSgpO1xuICAgIGlmKG90aGVyLmlzSW5maW5pdHkoKSkgcmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpO1xuICAgIHZhciB1LCB2O1xuICAgIC8vIHUgPSBZMiAqIFoxIC0gWTEgKiBaMlxuICAgIHUgPSBvdGhlci55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KG90aGVyLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICBpZighdS5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIHYgPSBYMiAqIFoxIC0gWDEgKiBaMlxuICAgIHYgPSBvdGhlci54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KG90aGVyLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICByZXR1cm4gdi5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRGcElzSW5maW5pdHkoKSB7XG4gICAgaWYoKHRoaXMueCA9PSBudWxsKSAmJiAodGhpcy55ID09IG51bGwpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy56LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pICYmICF0aGlzLnkudG9CaWdJbnRlZ2VyKCkuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTyk7XG59XG5cbmZ1bmN0aW9uIHBvaW50RnBOZWdhdGUoKSB7XG4gICAgcmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSwgdGhpcy54LCB0aGlzLnkubmVnYXRlKCksIHRoaXMueik7XG59XG5cbmZ1bmN0aW9uIHBvaW50RnBBZGQoYikge1xuICAgIGlmKHRoaXMuaXNJbmZpbml0eSgpKSByZXR1cm4gYjtcbiAgICBpZihiLmlzSW5maW5pdHkoKSkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyB1ID0gWTIgKiBaMSAtIFkxICogWjJcbiAgICB2YXIgdSA9IGIueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShiLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICAvLyB2ID0gWDIgKiBaMSAtIFgxICogWjJcbiAgICB2YXIgdiA9IGIueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShiLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtcblxuICAgIGlmKEJpZ0ludGVnZXIuWkVSTy5lcXVhbHModikpIHtcbiAgICAgICAgaWYoQmlnSW50ZWdlci5aRVJPLmVxdWFscyh1KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHdpY2UoKTsgLy8gdGhpcyA9PSBiLCBzbyBkb3VibGVcbiAgICAgICAgfVxuXHRyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpOyAvLyB0aGlzID0gLWIsIHNvIGluZmluaXR5XG4gICAgfVxuXG4gICAgdmFyIFRIUkVFID0gbmV3IEJpZ0ludGVnZXIoXCIzXCIpO1xuICAgIHZhciB4MSA9IHRoaXMueC50b0JpZ0ludGVnZXIoKTtcbiAgICB2YXIgeTEgPSB0aGlzLnkudG9CaWdJbnRlZ2VyKCk7XG4gICAgdmFyIHgyID0gYi54LnRvQmlnSW50ZWdlcigpO1xuICAgIHZhciB5MiA9IGIueS50b0JpZ0ludGVnZXIoKTtcblxuICAgIHZhciB2MiA9IHYuc3F1YXJlKCk7XG4gICAgdmFyIHYzID0gdjIubXVsdGlwbHkodik7XG4gICAgdmFyIHgxdjIgPSB4MS5tdWx0aXBseSh2Mik7XG4gICAgdmFyIHp1MiA9IHUuc3F1YXJlKCkubXVsdGlwbHkodGhpcy56KTtcblxuICAgIC8vIHgzID0gdiAqICh6MiAqICh6MSAqIHVeMiAtIDIgKiB4MSAqIHZeMikgLSB2XjMpXG4gICAgdmFyIHgzID0genUyLnN1YnRyYWN0KHgxdjIuc2hpZnRMZWZ0KDEpKS5tdWx0aXBseShiLnopLnN1YnRyYWN0KHYzKS5tdWx0aXBseSh2KS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICAvLyB5MyA9IHoyICogKDMgKiB4MSAqIHUgKiB2XjIgLSB5MSAqIHZeMyAtIHoxICogdV4zKSArIHUgKiB2XjNcbiAgICB2YXIgeTMgPSB4MXYyLm11bHRpcGx5KFRIUkVFKS5tdWx0aXBseSh1KS5zdWJ0cmFjdCh5MS5tdWx0aXBseSh2MykpLnN1YnRyYWN0KHp1Mi5tdWx0aXBseSh1KSkubXVsdGlwbHkoYi56KS5hZGQodS5tdWx0aXBseSh2MykpLm1vZCh0aGlzLmN1cnZlLnEpO1xuICAgIC8vIHozID0gdl4zICogejEgKiB6MlxuICAgIHZhciB6MyA9IHYzLm11bHRpcGx5KHRoaXMueikubXVsdGlwbHkoYi56KS5tb2QodGhpcy5jdXJ2ZS5xKTtcblxuICAgIHJldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsIHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoeDMpLCB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHkzKSwgejMpO1xufVxuXG5mdW5jdGlvbiBwb2ludEZwVHdpY2UoKSB7XG4gICAgaWYodGhpcy5pc0luZmluaXR5KCkpIHJldHVybiB0aGlzO1xuICAgIGlmKHRoaXMueS50b0JpZ0ludGVnZXIoKS5zaWdudW0oKSA9PSAwKSByZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpO1xuXG4gICAgLy8gVE9ETzogb3B0aW1pemVkIGhhbmRsaW5nIG9mIGNvbnN0YW50c1xuICAgIHZhciBUSFJFRSA9IG5ldyBCaWdJbnRlZ2VyKFwiM1wiKTtcbiAgICB2YXIgeDEgPSB0aGlzLngudG9CaWdJbnRlZ2VyKCk7XG4gICAgdmFyIHkxID0gdGhpcy55LnRvQmlnSW50ZWdlcigpO1xuXG4gICAgdmFyIHkxejEgPSB5MS5tdWx0aXBseSh0aGlzLnopO1xuICAgIHZhciB5MXNxejEgPSB5MXoxLm11bHRpcGx5KHkxKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICB2YXIgYSA9IHRoaXMuY3VydmUuYS50b0JpZ0ludGVnZXIoKTtcblxuICAgIC8vIHcgPSAzICogeDFeMiArIGEgKiB6MV4yXG4gICAgdmFyIHcgPSB4MS5zcXVhcmUoKS5tdWx0aXBseShUSFJFRSk7XG4gICAgaWYoIUJpZ0ludGVnZXIuWkVSTy5lcXVhbHMoYSkpIHtcbiAgICAgIHcgPSB3LmFkZCh0aGlzLnouc3F1YXJlKCkubXVsdGlwbHkoYSkpO1xuICAgIH1cbiAgICB3ID0gdy5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICAvL3RoaXMuY3VydmUucmVkdWNlKHcpO1xuICAgIC8vIHgzID0gMiAqIHkxICogejEgKiAod14yIC0gOCAqIHgxICogeTFeMiAqIHoxKVxuICAgIHZhciB4MyA9IHcuc3F1YXJlKCkuc3VidHJhY3QoeDEuc2hpZnRMZWZ0KDMpLm11bHRpcGx5KHkxc3F6MSkpLnNoaWZ0TGVmdCgxKS5tdWx0aXBseSh5MXoxKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICAvLyB5MyA9IDQgKiB5MV4yICogejEgKiAoMyAqIHcgKiB4MSAtIDIgKiB5MV4yICogejEpIC0gd14zXG4gICAgdmFyIHkzID0gdy5tdWx0aXBseShUSFJFRSkubXVsdGlwbHkoeDEpLnN1YnRyYWN0KHkxc3F6MS5zaGlmdExlZnQoMSkpLnNoaWZ0TGVmdCgyKS5tdWx0aXBseSh5MXNxejEpLnN1YnRyYWN0KHcuc3F1YXJlKCkubXVsdGlwbHkodykpLm1vZCh0aGlzLmN1cnZlLnEpO1xuICAgIC8vIHozID0gOCAqICh5MSAqIHoxKV4zXG4gICAgdmFyIHozID0geTF6MS5zcXVhcmUoKS5tdWx0aXBseSh5MXoxKS5zaGlmdExlZnQoMykubW9kKHRoaXMuY3VydmUucSk7XG5cbiAgICByZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLCB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHgzKSwgdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih5MyksIHozKTtcbn1cblxuLy8gU2ltcGxlIE5BRiAoTm9uLUFkamFjZW50IEZvcm0pIG11bHRpcGxpY2F0aW9uIGFsZ29yaXRobVxuLy8gVE9ETzogbW9kdWxhcml6ZSB0aGUgbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtXG5mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHkoaykge1xuICAgIGlmKHRoaXMuaXNJbmZpbml0eSgpKSByZXR1cm4gdGhpcztcbiAgICBpZihrLnNpZ251bSgpID09IDApIHJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCk7XG5cbiAgICB2YXIgZSA9IGs7XG4gICAgdmFyIGggPSBlLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7XG5cbiAgICB2YXIgbmVnID0gdGhpcy5uZWdhdGUoKTtcbiAgICB2YXIgUiA9IHRoaXM7XG5cbiAgICB2YXIgaTtcbiAgICBmb3IoaSA9IGguYml0TGVuZ3RoKCkgLSAyOyBpID4gMDsgLS1pKSB7XG5cdFIgPSBSLnR3aWNlKCk7XG5cblx0dmFyIGhCaXQgPSBoLnRlc3RCaXQoaSk7XG5cdHZhciBlQml0ID0gZS50ZXN0Qml0KGkpO1xuXG5cdGlmIChoQml0ICE9IGVCaXQpIHtcblx0ICAgIFIgPSBSLmFkZChoQml0ID8gdGhpcyA6IG5lZyk7XG5cdH1cbiAgICB9XG5cbiAgICByZXR1cm4gUjtcbn1cblxuLy8gQ29tcHV0ZSB0aGlzKmogKyB4KmsgKHNpbXVsdGFuZW91cyBtdWx0aXBsaWNhdGlvbilcbmZ1bmN0aW9uIHBvaW50RnBNdWx0aXBseVR3byhqLHgsaykge1xuICB2YXIgaTtcbiAgaWYoai5iaXRMZW5ndGgoKSA+IGsuYml0TGVuZ3RoKCkpXG4gICAgaSA9IGouYml0TGVuZ3RoKCkgLSAxO1xuICBlbHNlXG4gICAgaSA9IGsuYml0TGVuZ3RoKCkgLSAxO1xuXG4gIHZhciBSID0gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpO1xuICB2YXIgYm90aCA9IHRoaXMuYWRkKHgpO1xuICB3aGlsZShpID49IDApIHtcbiAgICBSID0gUi50d2ljZSgpO1xuICAgIGlmKGoudGVzdEJpdChpKSkge1xuICAgICAgaWYoay50ZXN0Qml0KGkpKSB7XG4gICAgICAgIFIgPSBSLmFkZChib3RoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBSID0gUi5hZGQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYoay50ZXN0Qml0KGkpKSB7XG4gICAgICAgIFIgPSBSLmFkZCh4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLS1pO1xuICB9XG5cbiAgcmV0dXJuIFI7XG59XG5cbkVDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WCA9IHBvaW50RnBHZXRYO1xuRUNQb2ludEZwLnByb3RvdHlwZS5nZXRZID0gcG9pbnRGcEdldFk7XG5FQ1BvaW50RnAucHJvdG90eXBlLmVxdWFscyA9IHBvaW50RnBFcXVhbHM7XG5FQ1BvaW50RnAucHJvdG90eXBlLmlzSW5maW5pdHkgPSBwb2ludEZwSXNJbmZpbml0eTtcbkVDUG9pbnRGcC5wcm90b3R5cGUubmVnYXRlID0gcG9pbnRGcE5lZ2F0ZTtcbkVDUG9pbnRGcC5wcm90b3R5cGUuYWRkID0gcG9pbnRGcEFkZDtcbkVDUG9pbnRGcC5wcm90b3R5cGUudHdpY2UgPSBwb2ludEZwVHdpY2U7XG5FQ1BvaW50RnAucHJvdG90eXBlLm11bHRpcGx5ID0gcG9pbnRGcE11bHRpcGx5O1xuRUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseVR3byA9IHBvaW50RnBNdWx0aXBseVR3bztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuLy8gRUNDdXJ2ZUZwXG5cbi8vIGNvbnN0cnVjdG9yXG5mdW5jdGlvbiBFQ0N1cnZlRnAocSxhLGIpIHtcbiAgICB0aGlzLnEgPSBxO1xuICAgIHRoaXMuYSA9IHRoaXMuZnJvbUJpZ0ludGVnZXIoYSk7XG4gICAgdGhpcy5iID0gdGhpcy5mcm9tQmlnSW50ZWdlcihiKTtcbiAgICB0aGlzLmluZmluaXR5ID0gbmV3IEVDUG9pbnRGcCh0aGlzLCBudWxsLCBudWxsKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgQmFycmV0dCh0aGlzLnEpO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwR2V0USgpIHtcbiAgICByZXR1cm4gdGhpcy5xO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwR2V0QSgpIHtcbiAgICByZXR1cm4gdGhpcy5hO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwR2V0QigpIHtcbiAgICByZXR1cm4gdGhpcy5iO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwRXF1YWxzKG90aGVyKSB7XG4gICAgaWYob3RoZXIgPT0gdGhpcykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuKHRoaXMucS5lcXVhbHMob3RoZXIucSkgJiYgdGhpcy5hLmVxdWFscyhvdGhlci5hKSAmJiB0aGlzLmIuZXF1YWxzKG90aGVyLmIpKTtcbn1cblxuZnVuY3Rpb24gY3VydmVGcEdldEluZmluaXR5KCkge1xuICAgIHJldHVybiB0aGlzLmluZmluaXR5O1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwRnJvbUJpZ0ludGVnZXIoeCkge1xuICAgIHJldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsIHgpO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZVJlZHVjZSh4KSB7XG4gICAgdGhpcy5yZWR1Y2VyLnJlZHVjZSh4KTtcbn1cblxuLy8gZm9yIG5vdywgd29yayB3aXRoIGhleCBzdHJpbmdzIGJlY2F1c2UgdGhleSdyZSBlYXNpZXIgaW4gSlNcbmZ1bmN0aW9uIGN1cnZlRnBEZWNvZGVQb2ludEhleChzKSB7XG4gICAgc3dpdGNoKHBhcnNlSW50KHMuc3Vic3RyKDAsMiksIDE2KSkgeyAvLyBmaXJzdCBieXRlXG4gICAgY2FzZSAwOlxuXHRyZXR1cm4gdGhpcy5pbmZpbml0eTtcbiAgICBjYXNlIDI6XG4gICAgY2FzZSAzOlxuXHQvLyBwb2ludCBjb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkIHlldFxuXHRyZXR1cm4gbnVsbDtcbiAgICBjYXNlIDQ6XG4gICAgY2FzZSA2OlxuICAgIGNhc2UgNzpcblx0dmFyIGxlbiA9IChzLmxlbmd0aCAtIDIpIC8gMjtcblx0dmFyIHhIZXggPSBzLnN1YnN0cigyLCBsZW4pO1xuXHR2YXIgeUhleCA9IHMuc3Vic3RyKGxlbisyLCBsZW4pO1xuXG5cdHJldHVybiBuZXcgRUNQb2ludEZwKHRoaXMsXG5cdFx0XHQgICAgIHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoeEhleCwgMTYpKSxcblx0XHRcdCAgICAgdGhpcy5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcih5SGV4LCAxNikpKTtcblxuICAgIGRlZmF1bHQ6IC8vIHVuc3VwcG9ydGVkXG5cdHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3VydmVGcEVuY29kZVBvaW50SGV4KHApIHtcblx0aWYgKHAuaXNJbmZpbml0eSgpKSByZXR1cm4gXCIwMFwiO1xuXHR2YXIgeEhleCA9IHAuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKDE2KTtcblx0dmFyIHlIZXggPSBwLmdldFkoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygxNik7XG5cdHZhciBvTGVuID0gdGhpcy5nZXRRKCkudG9TdHJpbmcoMTYpLmxlbmd0aDtcblx0aWYgKChvTGVuICUgMikgIT0gMCkgb0xlbisrO1xuXHR3aGlsZSAoeEhleC5sZW5ndGggPCBvTGVuKSB7XG5cdFx0eEhleCA9IFwiMFwiICsgeEhleDtcblx0fVxuXHR3aGlsZSAoeUhleC5sZW5ndGggPCBvTGVuKSB7XG5cdFx0eUhleCA9IFwiMFwiICsgeUhleDtcblx0fVxuXHRyZXR1cm4gXCIwNFwiICsgeEhleCArIHlIZXg7XG59XG5cbkVDQ3VydmVGcC5wcm90b3R5cGUuZ2V0USA9IGN1cnZlRnBHZXRRO1xuRUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRBID0gY3VydmVGcEdldEE7XG5FQ0N1cnZlRnAucHJvdG90eXBlLmdldEIgPSBjdXJ2ZUZwR2V0QjtcbkVDQ3VydmVGcC5wcm90b3R5cGUuZXF1YWxzID0gY3VydmVGcEVxdWFscztcbkVDQ3VydmVGcC5wcm90b3R5cGUuZ2V0SW5maW5pdHkgPSBjdXJ2ZUZwR2V0SW5maW5pdHk7XG5FQ0N1cnZlRnAucHJvdG90eXBlLmZyb21CaWdJbnRlZ2VyID0gY3VydmVGcEZyb21CaWdJbnRlZ2VyO1xuRUNDdXJ2ZUZwLnByb3RvdHlwZS5yZWR1Y2UgPSBjdXJ2ZVJlZHVjZTtcbi8vRUNDdXJ2ZUZwLnByb3RvdHlwZS5kZWNvZGVQb2ludEhleCA9IGN1cnZlRnBEZWNvZGVQb2ludEhleDtcbkVDQ3VydmVGcC5wcm90b3R5cGUuZW5jb2RlUG9pbnRIZXggPSBjdXJ2ZUZwRW5jb2RlUG9pbnRIZXg7XG5cbi8vIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9rYWllbHZpbi9qc2JuLWVjLXBvaW50LWNvbXByZXNzaW9uXG5FQ0N1cnZlRnAucHJvdG90eXBlLmRlY29kZVBvaW50SGV4ID0gZnVuY3Rpb24ocylcbntcblx0dmFyIHlJc0V2ZW47XG4gICAgc3dpdGNoKHBhcnNlSW50KHMuc3Vic3RyKDAsMiksIDE2KSkgeyAvLyBmaXJzdCBieXRlXG4gICAgY2FzZSAwOlxuXHRyZXR1cm4gdGhpcy5pbmZpbml0eTtcbiAgICBjYXNlIDI6XG5cdHlJc0V2ZW4gPSBmYWxzZTtcbiAgICBjYXNlIDM6XG5cdGlmKHlJc0V2ZW4gPT0gdW5kZWZpbmVkKSB5SXNFdmVuID0gdHJ1ZTtcblx0dmFyIGxlbiA9IHMubGVuZ3RoIC0gMjtcblx0dmFyIHhIZXggPSBzLnN1YnN0cigyLCBsZW4pO1xuXHR2YXIgeCA9IHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoeEhleCwxNikpO1xuXHR2YXIgYWxwaGEgPSB4Lm11bHRpcGx5KHguc3F1YXJlKCkuYWRkKHRoaXMuZ2V0QSgpKSkuYWRkKHRoaXMuZ2V0QigpKTtcblx0dmFyIGJldGEgPSBhbHBoYS5zcXJ0KCk7XG5cbiAgICBpZiAoYmV0YSA9PSBudWxsKSB0aHJvdyBcIkludmFsaWQgcG9pbnQgY29tcHJlc3Npb25cIjtcblxuICAgIHZhciBiZXRhVmFsdWUgPSBiZXRhLnRvQmlnSW50ZWdlcigpO1xuICAgIGlmIChiZXRhVmFsdWUudGVzdEJpdCgwKSAhPSB5SXNFdmVuKVxuICAgIHtcbiAgICAgICAgLy8gVXNlIHRoZSBvdGhlciByb290XG4gICAgICAgIGJldGEgPSB0aGlzLmZyb21CaWdJbnRlZ2VyKHRoaXMuZ2V0USgpLnN1YnRyYWN0KGJldGFWYWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLHgsYmV0YSk7XG4gICAgY2FzZSA0OlxuICAgIGNhc2UgNjpcbiAgICBjYXNlIDc6XG5cdHZhciBsZW4gPSAocy5sZW5ndGggLSAyKSAvIDI7XG5cdHZhciB4SGV4ID0gcy5zdWJzdHIoMiwgbGVuKTtcblx0dmFyIHlIZXggPSBzLnN1YnN0cihsZW4rMiwgbGVuKTtcblxuXHRyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLFxuXHRcdFx0ICAgICB0aGlzLmZyb21CaWdJbnRlZ2VyKG5ldyBCaWdJbnRlZ2VyKHhIZXgsIDE2KSksXG5cdFx0XHQgICAgIHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoeUhleCwgMTYpKSk7XG5cbiAgICBkZWZhdWx0OiAvLyB1bnN1cHBvcnRlZFxuXHRyZXR1cm4gbnVsbDtcbiAgICB9XG59XG5FQ0N1cnZlRnAucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWRQb2ludEhleCA9IGZ1bmN0aW9uKHApXG57XG5cdGlmIChwLmlzSW5maW5pdHkoKSkgcmV0dXJuIFwiMDBcIjtcblx0dmFyIHhIZXggPSBwLmdldFgoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygxNik7XG5cdHZhciBvTGVuID0gdGhpcy5nZXRRKCkudG9TdHJpbmcoMTYpLmxlbmd0aDtcblx0aWYgKChvTGVuICUgMikgIT0gMCkgb0xlbisrO1xuXHR3aGlsZSAoeEhleC5sZW5ndGggPCBvTGVuKVxuXHRcdHhIZXggPSBcIjBcIiArIHhIZXg7XG5cdHZhciB5UHJlZml4O1xuXHRpZihwLmdldFkoKS50b0JpZ0ludGVnZXIoKS5pc0V2ZW4oKSkgeVByZWZpeCA9IFwiMDJcIjtcblx0ZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQcmVmaXggPSBcIjAzXCI7XG5cblx0cmV0dXJuIHlQcmVmaXggKyB4SGV4O1xufVxuXG5cbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmdldFIgPSBmdW5jdGlvbigpXG57XG5cdGlmKHRoaXMuciAhPSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnI7XG5cbiAgICB0aGlzLnIgPSBudWxsO1xuICAgIHZhciBiaXRMZW5ndGggPSB0aGlzLnEuYml0TGVuZ3RoKCk7XG4gICAgaWYgKGJpdExlbmd0aCA+IDEyOClcbiAgICB7XG4gICAgICAgIHZhciBmaXJzdFdvcmQgPSB0aGlzLnEuc2hpZnRSaWdodChiaXRMZW5ndGggLSA2NCk7XG4gICAgICAgIGlmIChmaXJzdFdvcmQuaW50VmFsdWUoKSA9PSAtMSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5yID0gQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGJpdExlbmd0aCkuc3VidHJhY3QodGhpcy5xKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yO1xufVxuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubW9kTXVsdCA9IGZ1bmN0aW9uKHgxLHgyKVxue1xuICAgIHJldHVybiB0aGlzLm1vZFJlZHVjZSh4MS5tdWx0aXBseSh4MikpO1xufVxuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubW9kUmVkdWNlID0gZnVuY3Rpb24oeClcbntcbiAgICBpZiAodGhpcy5nZXRSKCkgIT0gbnVsbClcbiAgICB7XG4gICAgICAgIHZhciBxTGVuID0gcS5iaXRMZW5ndGgoKTtcbiAgICAgICAgd2hpbGUgKHguYml0TGVuZ3RoKCkgPiAocUxlbiArIDEpKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdSA9IHguc2hpZnRSaWdodChxTGVuKTtcbiAgICAgICAgICAgIHZhciB2ID0geC5zdWJ0cmFjdCh1LnNoaWZ0TGVmdChxTGVuKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0UigpLmVxdWFscyhCaWdJbnRlZ2VyLk9ORSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdSA9IHUubXVsdGlwbHkodGhpcy5nZXRSKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeCA9IHUuYWRkKHYpOyBcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoeC5jb21wYXJlVG8ocSkgPj0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgeCA9IHguc3VidHJhY3QocSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgeCA9IHgubW9kKHEpO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn1cbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbigpXG57XG4gICAgaWYgKCF0aGlzLnEudGVzdEJpdCgwKSkgdGhyb3cgXCJ1bnN1cHBvcnRlZFwiO1xuXG4gICAgLy8gcCBtb2QgNCA9PSAzXG4gICAgaWYgKHRoaXMucS50ZXN0Qml0KDEpKVxuICAgIHtcbiAgICBcdHZhciB6ID0gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tb2RQb3codGhpcy5xLnNoaWZ0UmlnaHQoMikuYWRkKEJpZ0ludGVnZXIuT05FKSx0aGlzLnEpKTtcbiAgICBcdHJldHVybiB6LnNxdWFyZSgpLmVxdWFscyh0aGlzKSA/IHogOiBudWxsO1xuICAgIH1cblxuICAgIC8vIHAgbW9kIDQgPT0gMVxuICAgIHZhciBxTWludXNPbmUgPSB0aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xuXG4gICAgdmFyIGxlZ2VuZHJlRXhwb25lbnQgPSBxTWludXNPbmUuc2hpZnRSaWdodCgxKTtcbiAgICBpZiAoISh0aGlzLngubW9kUG93KGxlZ2VuZHJlRXhwb25lbnQsIHRoaXMucSkuZXF1YWxzKEJpZ0ludGVnZXIuT05FKSkpXG4gICAge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdSA9IHFNaW51c09uZS5zaGlmdFJpZ2h0KDIpO1xuICAgIHZhciBrID0gdS5zaGlmdExlZnQoMSkuYWRkKEJpZ0ludGVnZXIuT05FKTtcblxuICAgIHZhciBRID0gdGhpcy54O1xuICAgIHZhciBmb3VyUSA9IG1vZERvdWJsZShtb2REb3VibGUoUSkpO1xuXG4gICAgdmFyIFUsIFY7XG4gICAgZG9cbiAgICB7XG4gICAgICAgIHZhciBQO1xuICAgICAgICBkb1xuICAgICAgICB7XG4gICAgICAgICAgICBQID0gbmV3IEJpZ0ludGVnZXIodGhpcy5xLmJpdExlbmd0aCgpLCBuZXcgU2VjdXJlUmFuZG9tKCkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChQLmNvbXBhcmVUbyh0aGlzLnEpID49IDBcbiAgICAgICAgICAgIHx8ICEoUC5tdWx0aXBseShQKS5zdWJ0cmFjdChmb3VyUSkubW9kUG93KGxlZ2VuZHJlRXhwb25lbnQsIHRoaXMucSkuZXF1YWxzKHFNaW51c09uZSkpKTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5sdWNhc1NlcXVlbmNlKFAsIFEsIGspO1xuICAgICAgICBVID0gcmVzdWx0WzBdO1xuICAgICAgICBWID0gcmVzdWx0WzFdO1xuXG4gICAgICAgIGlmICh0aGlzLm1vZE11bHQoViwgVikuZXF1YWxzKGZvdXJRKSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gSW50ZWdlciBkaXZpc2lvbiBieSAyLCBtb2QgcVxuICAgICAgICAgICAgaWYgKFYudGVzdEJpdCgwKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBWID0gVi5hZGQocSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFYgPSBWLnNoaWZ0UmlnaHQoMSk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcChxLFYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChVLmVxdWFscyhCaWdJbnRlZ2VyLk9ORSkgfHwgVS5lcXVhbHMocU1pbnVzT25lKSk7XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmx1Y2FzU2VxdWVuY2UgPSBmdW5jdGlvbihQLFEsaylcbntcbiAgICB2YXIgbiA9IGsuYml0TGVuZ3RoKCk7XG4gICAgdmFyIHMgPSBrLmdldExvd2VzdFNldEJpdCgpO1xuXG4gICAgdmFyIFVoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIFZsID0gQmlnSW50ZWdlci5UV087XG4gICAgdmFyIFZoID0gUDtcbiAgICB2YXIgUWwgPSBCaWdJbnRlZ2VyLk9ORTtcbiAgICB2YXIgUWggPSBCaWdJbnRlZ2VyLk9ORTtcblxuICAgIGZvciAodmFyIGogPSBuIC0gMTsgaiA+PSBzICsgMTsgLS1qKVxuICAgIHtcbiAgICAgICAgUWwgPSB0aGlzLm1vZE11bHQoUWwsIFFoKTtcblxuICAgICAgICBpZiAoay50ZXN0Qml0KGopKVxuICAgICAgICB7XG4gICAgICAgICAgICBRaCA9IHRoaXMubW9kTXVsdChRbCwgUSk7XG4gICAgICAgICAgICBVaCA9IHRoaXMubW9kTXVsdChVaCwgVmgpO1xuICAgICAgICAgICAgVmwgPSB0aGlzLm1vZFJlZHVjZShWaC5tdWx0aXBseShWbCkuc3VidHJhY3QoUC5tdWx0aXBseShRbCkpKTtcbiAgICAgICAgICAgIFZoID0gdGhpcy5tb2RSZWR1Y2UoVmgubXVsdGlwbHkoVmgpLnN1YnRyYWN0KFFoLnNoaWZ0TGVmdCgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgUWggPSBRbDtcbiAgICAgICAgICAgIFVoID0gdGhpcy5tb2RSZWR1Y2UoVWgubXVsdGlwbHkoVmwpLnN1YnRyYWN0KFFsKSk7XG4gICAgICAgICAgICBWaCA9IHRoaXMubW9kUmVkdWNlKFZoLm11bHRpcGx5KFZsKS5zdWJ0cmFjdChQLm11bHRpcGx5KFFsKSkpO1xuICAgICAgICAgICAgVmwgPSB0aGlzLm1vZFJlZHVjZShWbC5tdWx0aXBseShWbCkuc3VidHJhY3QoUWwuc2hpZnRMZWZ0KDEpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBRbCA9IHRoaXMubW9kTXVsdChRbCwgUWgpO1xuICAgIFFoID0gdGhpcy5tb2RNdWx0KFFsLCBRKTtcbiAgICBVaCA9IHRoaXMubW9kUmVkdWNlKFVoLm11bHRpcGx5KFZsKS5zdWJ0cmFjdChRbCkpO1xuICAgIFZsID0gdGhpcy5tb2RSZWR1Y2UoVmgubXVsdGlwbHkoVmwpLnN1YnRyYWN0KFAubXVsdGlwbHkoUWwpKSk7XG4gICAgUWwgPSB0aGlzLm1vZE11bHQoUWwsIFFoKTtcblxuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IHM7ICsrailcbiAgICB7XG4gICAgICAgIFVoID0gdGhpcy5tb2RNdWx0KFVoLCBWbCk7XG4gICAgICAgIFZsID0gdGhpcy5tb2RSZWR1Y2UoVmwubXVsdGlwbHkoVmwpLnN1YnRyYWN0KFFsLnNoaWZ0TGVmdCgxKSkpO1xuICAgICAgICBRbCA9IHRoaXMubW9kTXVsdChRbCwgUWwpO1xuICAgIH1cblxuICAgIHJldHVybiBbIFVoLCBWbCBdO1xufVxuXG52YXIgZXhwb3J0cyA9IHtcbiAgRUNDdXJ2ZUZwOiBFQ0N1cnZlRnAsXG4gIEVDUG9pbnRGcDogRUNQb2ludEZwLFxuICBFQ0ZpZWxkRWxlbWVudEZwOiBFQ0ZpZWxkRWxlbWVudEZwXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1xuIiwgIihmdW5jdGlvbihuYWNsKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFBvcnRlZCBpbiAyMDE0IGJ5IERtaXRyeSBDaGVzdG55a2ggYW5kIERldmkgTWFuZGlyaS5cbi8vIFB1YmxpYyBkb21haW4uXG4vL1xuLy8gSW1wbGVtZW50YXRpb24gZGVyaXZlZCBmcm9tIFR3ZWV0TmFDbCB2ZXJzaW9uIDIwMTQwNDI3LlxuLy8gU2VlIGZvciBkZXRhaWxzOiBodHRwOi8vdHdlZXRuYWNsLmNyLnlwLnRvL1xuXG52YXIgZ2YgPSBmdW5jdGlvbihpbml0KSB7XG4gIHZhciBpLCByID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gIGlmIChpbml0KSBmb3IgKGkgPSAwOyBpIDwgaW5pdC5sZW5ndGg7IGkrKykgcltpXSA9IGluaXRbaV07XG4gIHJldHVybiByO1xufTtcblxuLy8gIFBsdWdnYWJsZSwgaW5pdGlhbGl6ZWQgaW4gaGlnaC1sZXZlbCBBUEkgYmVsb3cuXG52YXIgcmFuZG9tYnl0ZXMgPSBmdW5jdGlvbigvKiB4LCBuICovKSB7IHRocm93IG5ldyBFcnJvcignbm8gUFJORycpOyB9O1xuXG52YXIgXzAgPSBuZXcgVWludDhBcnJheSgxNik7XG52YXIgXzkgPSBuZXcgVWludDhBcnJheSgzMik7IF85WzBdID0gOTtcblxudmFyIGdmMCA9IGdmKCksXG4gICAgZ2YxID0gZ2YoWzFdKSxcbiAgICBfMTIxNjY1ID0gZ2YoWzB4ZGI0MSwgMV0pLFxuICAgIEQgPSBnZihbMHg3OGEzLCAweDEzNTksIDB4NGRjYSwgMHg3NWViLCAweGQ4YWIsIDB4NDE0MSwgMHgwYTRkLCAweDAwNzAsIDB4ZTg5OCwgMHg3Nzc5LCAweDQwNzksIDB4OGNjNywgMHhmZTczLCAweDJiNmYsIDB4NmNlZSwgMHg1MjAzXSksXG4gICAgRDIgPSBnZihbMHhmMTU5LCAweDI2YjIsIDB4OWI5NCwgMHhlYmQ2LCAweGIxNTYsIDB4ODI4MywgMHgxNDlhLCAweDAwZTAsIDB4ZDEzMCwgMHhlZWYzLCAweDgwZjIsIDB4MTk4ZSwgMHhmY2U3LCAweDU2ZGYsIDB4ZDlkYywgMHgyNDA2XSksXG4gICAgWCA9IGdmKFsweGQ1MWEsIDB4OGYyNSwgMHgyZDYwLCAweGM5NTYsIDB4YTdiMiwgMHg5NTI1LCAweGM3NjAsIDB4NjkyYywgMHhkYzVjLCAweGZkZDYsIDB4ZTIzMSwgMHhjMGE0LCAweDUzZmUsIDB4Y2Q2ZSwgMHgzNmQzLCAweDIxNjldKSxcbiAgICBZID0gZ2YoWzB4NjY1OCwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2Nl0pLFxuICAgIEkgPSBnZihbMHhhMGIwLCAweDRhMGUsIDB4MWIyNywgMHhjNGVlLCAweGU0NzgsIDB4YWQyZiwgMHgxODA2LCAweDJmNDMsIDB4ZDdhNywgMHgzZGZiLCAweDAwOTksIDB4MmI0ZCwgMHhkZjBiLCAweDRmYzEsIDB4MjQ4MCwgMHgyYjgzXSk7XG5cbmZ1bmN0aW9uIHRzNjQoeCwgaSwgaCwgbCkge1xuICB4W2ldICAgPSAoaCA+PiAyNCkgJiAweGZmO1xuICB4W2krMV0gPSAoaCA+PiAxNikgJiAweGZmO1xuICB4W2krMl0gPSAoaCA+PiAgOCkgJiAweGZmO1xuICB4W2krM10gPSBoICYgMHhmZjtcbiAgeFtpKzRdID0gKGwgPj4gMjQpICAmIDB4ZmY7XG4gIHhbaSs1XSA9IChsID4+IDE2KSAgJiAweGZmO1xuICB4W2krNl0gPSAobCA+PiAgOCkgICYgMHhmZjtcbiAgeFtpKzddID0gbCAmIDB4ZmY7XG59XG5cbmZ1bmN0aW9uIHZuKHgsIHhpLCB5LCB5aSwgbikge1xuICB2YXIgaSxkID0gMDtcbiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZCB8PSB4W3hpK2ldXnlbeWkraV07XG4gIHJldHVybiAoMSAmICgoZCAtIDEpID4+PiA4KSkgLSAxO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fdmVyaWZ5XzE2KHgsIHhpLCB5LCB5aSkge1xuICByZXR1cm4gdm4oeCx4aSx5LHlpLDE2KTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3ZlcmlmeV8zMih4LCB4aSwgeSwgeWkpIHtcbiAgcmV0dXJuIHZuKHgseGkseSx5aSwzMik7XG59XG5cbmZ1bmN0aW9uIGNvcmVfc2Fsc2EyMChvLCBwLCBrLCBjKSB7XG4gIHZhciBqMCAgPSBjWyAwXSAmIDB4ZmYgfCAoY1sgMV0gJiAweGZmKTw8OCB8IChjWyAyXSAmIDB4ZmYpPDwxNiB8IChjWyAzXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxICA9IGtbIDBdICYgMHhmZiB8IChrWyAxXSAmIDB4ZmYpPDw4IHwgKGtbIDJdICYgMHhmZik8PDE2IHwgKGtbIDNdICYgMHhmZik8PDI0LFxuICAgICAgajIgID0ga1sgNF0gJiAweGZmIHwgKGtbIDVdICYgMHhmZik8PDggfCAoa1sgNl0gJiAweGZmKTw8MTYgfCAoa1sgN10gJiAweGZmKTw8MjQsXG4gICAgICBqMyAgPSBrWyA4XSAmIDB4ZmYgfCAoa1sgOV0gJiAweGZmKTw8OCB8IChrWzEwXSAmIDB4ZmYpPDwxNiB8IChrWzExXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo0ICA9IGtbMTJdICYgMHhmZiB8IChrWzEzXSAmIDB4ZmYpPDw4IHwgKGtbMTRdICYgMHhmZik8PDE2IHwgKGtbMTVdICYgMHhmZik8PDI0LFxuICAgICAgajUgID0gY1sgNF0gJiAweGZmIHwgKGNbIDVdICYgMHhmZik8PDggfCAoY1sgNl0gJiAweGZmKTw8MTYgfCAoY1sgN10gJiAweGZmKTw8MjQsXG4gICAgICBqNiAgPSBwWyAwXSAmIDB4ZmYgfCAocFsgMV0gJiAweGZmKTw8OCB8IChwWyAyXSAmIDB4ZmYpPDwxNiB8IChwWyAzXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo3ICA9IHBbIDRdICYgMHhmZiB8IChwWyA1XSAmIDB4ZmYpPDw4IHwgKHBbIDZdICYgMHhmZik8PDE2IHwgKHBbIDddICYgMHhmZik8PDI0LFxuICAgICAgajggID0gcFsgOF0gJiAweGZmIHwgKHBbIDldICYgMHhmZik8PDggfCAocFsxMF0gJiAweGZmKTw8MTYgfCAocFsxMV0gJiAweGZmKTw8MjQsXG4gICAgICBqOSAgPSBwWzEyXSAmIDB4ZmYgfCAocFsxM10gJiAweGZmKTw8OCB8IChwWzE0XSAmIDB4ZmYpPDwxNiB8IChwWzE1XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxMCA9IGNbIDhdICYgMHhmZiB8IChjWyA5XSAmIDB4ZmYpPDw4IHwgKGNbMTBdICYgMHhmZik8PDE2IHwgKGNbMTFdICYgMHhmZik8PDI0LFxuICAgICAgajExID0ga1sxNl0gJiAweGZmIHwgKGtbMTddICYgMHhmZik8PDggfCAoa1sxOF0gJiAweGZmKTw8MTYgfCAoa1sxOV0gJiAweGZmKTw8MjQsXG4gICAgICBqMTIgPSBrWzIwXSAmIDB4ZmYgfCAoa1syMV0gJiAweGZmKTw8OCB8IChrWzIyXSAmIDB4ZmYpPDwxNiB8IChrWzIzXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxMyA9IGtbMjRdICYgMHhmZiB8IChrWzI1XSAmIDB4ZmYpPDw4IHwgKGtbMjZdICYgMHhmZik8PDE2IHwgKGtbMjddICYgMHhmZik8PDI0LFxuICAgICAgajE0ID0ga1syOF0gJiAweGZmIHwgKGtbMjldICYgMHhmZik8PDggfCAoa1szMF0gJiAweGZmKTw8MTYgfCAoa1szMV0gJiAweGZmKTw8MjQsXG4gICAgICBqMTUgPSBjWzEyXSAmIDB4ZmYgfCAoY1sxM10gJiAweGZmKTw8OCB8IChjWzE0XSAmIDB4ZmYpPDwxNiB8IChjWzE1XSAmIDB4ZmYpPDwyNDtcblxuICB2YXIgeDAgPSBqMCwgeDEgPSBqMSwgeDIgPSBqMiwgeDMgPSBqMywgeDQgPSBqNCwgeDUgPSBqNSwgeDYgPSBqNiwgeDcgPSBqNyxcbiAgICAgIHg4ID0gajgsIHg5ID0gajksIHgxMCA9IGoxMCwgeDExID0gajExLCB4MTIgPSBqMTIsIHgxMyA9IGoxMywgeDE0ID0gajE0LFxuICAgICAgeDE1ID0gajE1LCB1O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkgKz0gMikge1xuICAgIHUgPSB4MCArIHgxMiB8IDA7XG4gICAgeDQgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHg0ICsgeDAgfCAwO1xuICAgIHg4IF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4OCArIHg0IHwgMDtcbiAgICB4MTIgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDEyICsgeDggfCAwO1xuICAgIHgwIF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDUgKyB4MSB8IDA7XG4gICAgeDkgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHg5ICsgeDUgfCAwO1xuICAgIHgxMyBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDEzICsgeDkgfCAwO1xuICAgIHgxIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxICsgeDEzIHwgMDtcbiAgICB4NSBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxMCArIHg2IHwgMDtcbiAgICB4MTQgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxNCArIHgxMCB8IDA7XG4gICAgeDIgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgyICsgeDE0IHwgMDtcbiAgICB4NiBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4NiArIHgyIHwgMDtcbiAgICB4MTAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MTUgKyB4MTEgfCAwO1xuICAgIHgzIF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4MyArIHgxNSB8IDA7XG4gICAgeDcgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg3ICsgeDMgfCAwO1xuICAgIHgxMSBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MTEgKyB4NyB8IDA7XG4gICAgeDE1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDAgKyB4MyB8IDA7XG4gICAgeDEgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxICsgeDAgfCAwO1xuICAgIHgyIF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4MiArIHgxIHwgMDtcbiAgICB4MyBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MyArIHgyIHwgMDtcbiAgICB4MCBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHg1ICsgeDQgfCAwO1xuICAgIHg2IF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4NiArIHg1IHwgMDtcbiAgICB4NyBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDcgKyB4NiB8IDA7XG4gICAgeDQgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDQgKyB4NyB8IDA7XG4gICAgeDUgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MTAgKyB4OSB8IDA7XG4gICAgeDExIF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4MTEgKyB4MTAgfCAwO1xuICAgIHg4IF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4OCArIHgxMSB8IDA7XG4gICAgeDkgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDkgKyB4OCB8IDA7XG4gICAgeDEwIF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDE1ICsgeDE0IHwgMDtcbiAgICB4MTIgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxMiArIHgxNSB8IDA7XG4gICAgeDEzIF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4MTMgKyB4MTIgfCAwO1xuICAgIHgxNCBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MTQgKyB4MTMgfCAwO1xuICAgIHgxNSBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuICB9XG4gICB4MCA9ICB4MCArICBqMCB8IDA7XG4gICB4MSA9ICB4MSArICBqMSB8IDA7XG4gICB4MiA9ICB4MiArICBqMiB8IDA7XG4gICB4MyA9ICB4MyArICBqMyB8IDA7XG4gICB4NCA9ICB4NCArICBqNCB8IDA7XG4gICB4NSA9ICB4NSArICBqNSB8IDA7XG4gICB4NiA9ICB4NiArICBqNiB8IDA7XG4gICB4NyA9ICB4NyArICBqNyB8IDA7XG4gICB4OCA9ICB4OCArICBqOCB8IDA7XG4gICB4OSA9ICB4OSArICBqOSB8IDA7XG4gIHgxMCA9IHgxMCArIGoxMCB8IDA7XG4gIHgxMSA9IHgxMSArIGoxMSB8IDA7XG4gIHgxMiA9IHgxMiArIGoxMiB8IDA7XG4gIHgxMyA9IHgxMyArIGoxMyB8IDA7XG4gIHgxNCA9IHgxNCArIGoxNCB8IDA7XG4gIHgxNSA9IHgxNSArIGoxNSB8IDA7XG5cbiAgb1sgMF0gPSB4MCA+Pj4gIDAgJiAweGZmO1xuICBvWyAxXSA9IHgwID4+PiAgOCAmIDB4ZmY7XG4gIG9bIDJdID0geDAgPj4+IDE2ICYgMHhmZjtcbiAgb1sgM10gPSB4MCA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bIDRdID0geDEgPj4+ICAwICYgMHhmZjtcbiAgb1sgNV0gPSB4MSA+Pj4gIDggJiAweGZmO1xuICBvWyA2XSA9IHgxID4+PiAxNiAmIDB4ZmY7XG4gIG9bIDddID0geDEgPj4+IDI0ICYgMHhmZjtcblxuICBvWyA4XSA9IHgyID4+PiAgMCAmIDB4ZmY7XG4gIG9bIDldID0geDIgPj4+ICA4ICYgMHhmZjtcbiAgb1sxMF0gPSB4MiA+Pj4gMTYgJiAweGZmO1xuICBvWzExXSA9IHgyID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sxMl0gPSB4MyA+Pj4gIDAgJiAweGZmO1xuICBvWzEzXSA9IHgzID4+PiAgOCAmIDB4ZmY7XG4gIG9bMTRdID0geDMgPj4+IDE2ICYgMHhmZjtcbiAgb1sxNV0gPSB4MyA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMTZdID0geDQgPj4+ICAwICYgMHhmZjtcbiAgb1sxN10gPSB4NCA+Pj4gIDggJiAweGZmO1xuICBvWzE4XSA9IHg0ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMTldID0geDQgPj4+IDI0ICYgMHhmZjtcblxuICBvWzIwXSA9IHg1ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMjFdID0geDUgPj4+ICA4ICYgMHhmZjtcbiAgb1syMl0gPSB4NSA+Pj4gMTYgJiAweGZmO1xuICBvWzIzXSA9IHg1ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1syNF0gPSB4NiA+Pj4gIDAgJiAweGZmO1xuICBvWzI1XSA9IHg2ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMjZdID0geDYgPj4+IDE2ICYgMHhmZjtcbiAgb1syN10gPSB4NiA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMjhdID0geDcgPj4+ICAwICYgMHhmZjtcbiAgb1syOV0gPSB4NyA+Pj4gIDggJiAweGZmO1xuICBvWzMwXSA9IHg3ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMzFdID0geDcgPj4+IDI0ICYgMHhmZjtcblxuICBvWzMyXSA9IHg4ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMzNdID0geDggPj4+ICA4ICYgMHhmZjtcbiAgb1szNF0gPSB4OCA+Pj4gMTYgJiAweGZmO1xuICBvWzM1XSA9IHg4ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1szNl0gPSB4OSA+Pj4gIDAgJiAweGZmO1xuICBvWzM3XSA9IHg5ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMzhdID0geDkgPj4+IDE2ICYgMHhmZjtcbiAgb1szOV0gPSB4OSA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bNDBdID0geDEwID4+PiAgMCAmIDB4ZmY7XG4gIG9bNDFdID0geDEwID4+PiAgOCAmIDB4ZmY7XG4gIG9bNDJdID0geDEwID4+PiAxNiAmIDB4ZmY7XG4gIG9bNDNdID0geDEwID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1s0NF0gPSB4MTEgPj4+ICAwICYgMHhmZjtcbiAgb1s0NV0gPSB4MTEgPj4+ICA4ICYgMHhmZjtcbiAgb1s0Nl0gPSB4MTEgPj4+IDE2ICYgMHhmZjtcbiAgb1s0N10gPSB4MTEgPj4+IDI0ICYgMHhmZjtcblxuICBvWzQ4XSA9IHgxMiA+Pj4gIDAgJiAweGZmO1xuICBvWzQ5XSA9IHgxMiA+Pj4gIDggJiAweGZmO1xuICBvWzUwXSA9IHgxMiA+Pj4gMTYgJiAweGZmO1xuICBvWzUxXSA9IHgxMiA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bNTJdID0geDEzID4+PiAgMCAmIDB4ZmY7XG4gIG9bNTNdID0geDEzID4+PiAgOCAmIDB4ZmY7XG4gIG9bNTRdID0geDEzID4+PiAxNiAmIDB4ZmY7XG4gIG9bNTVdID0geDEzID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1s1Nl0gPSB4MTQgPj4+ICAwICYgMHhmZjtcbiAgb1s1N10gPSB4MTQgPj4+ICA4ICYgMHhmZjtcbiAgb1s1OF0gPSB4MTQgPj4+IDE2ICYgMHhmZjtcbiAgb1s1OV0gPSB4MTQgPj4+IDI0ICYgMHhmZjtcblxuICBvWzYwXSA9IHgxNSA+Pj4gIDAgJiAweGZmO1xuICBvWzYxXSA9IHgxNSA+Pj4gIDggJiAweGZmO1xuICBvWzYyXSA9IHgxNSA+Pj4gMTYgJiAweGZmO1xuICBvWzYzXSA9IHgxNSA+Pj4gMjQgJiAweGZmO1xufVxuXG5mdW5jdGlvbiBjb3JlX2hzYWxzYTIwKG8scCxrLGMpIHtcbiAgdmFyIGowICA9IGNbIDBdICYgMHhmZiB8IChjWyAxXSAmIDB4ZmYpPDw4IHwgKGNbIDJdICYgMHhmZik8PDE2IHwgKGNbIDNdICYgMHhmZik8PDI0LFxuICAgICAgajEgID0ga1sgMF0gJiAweGZmIHwgKGtbIDFdICYgMHhmZik8PDggfCAoa1sgMl0gJiAweGZmKTw8MTYgfCAoa1sgM10gJiAweGZmKTw8MjQsXG4gICAgICBqMiAgPSBrWyA0XSAmIDB4ZmYgfCAoa1sgNV0gJiAweGZmKTw8OCB8IChrWyA2XSAmIDB4ZmYpPDwxNiB8IChrWyA3XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGozICA9IGtbIDhdICYgMHhmZiB8IChrWyA5XSAmIDB4ZmYpPDw4IHwgKGtbMTBdICYgMHhmZik8PDE2IHwgKGtbMTFdICYgMHhmZik8PDI0LFxuICAgICAgajQgID0ga1sxMl0gJiAweGZmIHwgKGtbMTNdICYgMHhmZik8PDggfCAoa1sxNF0gJiAweGZmKTw8MTYgfCAoa1sxNV0gJiAweGZmKTw8MjQsXG4gICAgICBqNSAgPSBjWyA0XSAmIDB4ZmYgfCAoY1sgNV0gJiAweGZmKTw8OCB8IChjWyA2XSAmIDB4ZmYpPDwxNiB8IChjWyA3XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo2ICA9IHBbIDBdICYgMHhmZiB8IChwWyAxXSAmIDB4ZmYpPDw4IHwgKHBbIDJdICYgMHhmZik8PDE2IHwgKHBbIDNdICYgMHhmZik8PDI0LFxuICAgICAgajcgID0gcFsgNF0gJiAweGZmIHwgKHBbIDVdICYgMHhmZik8PDggfCAocFsgNl0gJiAweGZmKTw8MTYgfCAocFsgN10gJiAweGZmKTw8MjQsXG4gICAgICBqOCAgPSBwWyA4XSAmIDB4ZmYgfCAocFsgOV0gJiAweGZmKTw8OCB8IChwWzEwXSAmIDB4ZmYpPDwxNiB8IChwWzExXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo5ICA9IHBbMTJdICYgMHhmZiB8IChwWzEzXSAmIDB4ZmYpPDw4IHwgKHBbMTRdICYgMHhmZik8PDE2IHwgKHBbMTVdICYgMHhmZik8PDI0LFxuICAgICAgajEwID0gY1sgOF0gJiAweGZmIHwgKGNbIDldICYgMHhmZik8PDggfCAoY1sxMF0gJiAweGZmKTw8MTYgfCAoY1sxMV0gJiAweGZmKTw8MjQsXG4gICAgICBqMTEgPSBrWzE2XSAmIDB4ZmYgfCAoa1sxN10gJiAweGZmKTw8OCB8IChrWzE4XSAmIDB4ZmYpPDwxNiB8IChrWzE5XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxMiA9IGtbMjBdICYgMHhmZiB8IChrWzIxXSAmIDB4ZmYpPDw4IHwgKGtbMjJdICYgMHhmZik8PDE2IHwgKGtbMjNdICYgMHhmZik8PDI0LFxuICAgICAgajEzID0ga1syNF0gJiAweGZmIHwgKGtbMjVdICYgMHhmZik8PDggfCAoa1syNl0gJiAweGZmKTw8MTYgfCAoa1syN10gJiAweGZmKTw8MjQsXG4gICAgICBqMTQgPSBrWzI4XSAmIDB4ZmYgfCAoa1syOV0gJiAweGZmKTw8OCB8IChrWzMwXSAmIDB4ZmYpPDwxNiB8IChrWzMxXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxNSA9IGNbMTJdICYgMHhmZiB8IChjWzEzXSAmIDB4ZmYpPDw4IHwgKGNbMTRdICYgMHhmZik8PDE2IHwgKGNbMTVdICYgMHhmZik8PDI0O1xuXG4gIHZhciB4MCA9IGowLCB4MSA9IGoxLCB4MiA9IGoyLCB4MyA9IGozLCB4NCA9IGo0LCB4NSA9IGo1LCB4NiA9IGo2LCB4NyA9IGo3LFxuICAgICAgeDggPSBqOCwgeDkgPSBqOSwgeDEwID0gajEwLCB4MTEgPSBqMTEsIHgxMiA9IGoxMiwgeDEzID0gajEzLCB4MTQgPSBqMTQsXG4gICAgICB4MTUgPSBqMTUsIHU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMDsgaSArPSAyKSB7XG4gICAgdSA9IHgwICsgeDEyIHwgMDtcbiAgICB4NCBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDQgKyB4MCB8IDA7XG4gICAgeDggXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg4ICsgeDQgfCAwO1xuICAgIHgxMiBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MTIgKyB4OCB8IDA7XG4gICAgeDAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4NSArIHgxIHwgMDtcbiAgICB4OSBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDkgKyB4NSB8IDA7XG4gICAgeDEzIF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4MTMgKyB4OSB8IDA7XG4gICAgeDEgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDEgKyB4MTMgfCAwO1xuICAgIHg1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDEwICsgeDYgfCAwO1xuICAgIHgxNCBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDE0ICsgeDEwIHwgMDtcbiAgICB4MiBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDIgKyB4MTQgfCAwO1xuICAgIHg2IF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHg2ICsgeDIgfCAwO1xuICAgIHgxMCBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxNSArIHgxMSB8IDA7XG4gICAgeDMgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgzICsgeDE1IHwgMDtcbiAgICB4NyBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDcgKyB4MyB8IDA7XG4gICAgeDExIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxMSArIHg3IHwgMDtcbiAgICB4MTUgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MCArIHgzIHwgMDtcbiAgICB4MSBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDEgKyB4MCB8IDA7XG4gICAgeDIgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgyICsgeDEgfCAwO1xuICAgIHgzIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgzICsgeDIgfCAwO1xuICAgIHgwIF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDUgKyB4NCB8IDA7XG4gICAgeDYgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHg2ICsgeDUgfCAwO1xuICAgIHg3IF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4NyArIHg2IHwgMDtcbiAgICB4NCBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4NCArIHg3IHwgMDtcbiAgICB4NSBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxMCArIHg5IHwgMDtcbiAgICB4MTEgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxMSArIHgxMCB8IDA7XG4gICAgeDggXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg4ICsgeDExIHwgMDtcbiAgICB4OSBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4OSArIHg4IHwgMDtcbiAgICB4MTAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MTUgKyB4MTQgfCAwO1xuICAgIHgxMiBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDEyICsgeDE1IHwgMDtcbiAgICB4MTMgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgxMyArIHgxMiB8IDA7XG4gICAgeDE0IF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxNCArIHgxMyB8IDA7XG4gICAgeDE1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG4gIH1cblxuICBvWyAwXSA9IHgwID4+PiAgMCAmIDB4ZmY7XG4gIG9bIDFdID0geDAgPj4+ICA4ICYgMHhmZjtcbiAgb1sgMl0gPSB4MCA+Pj4gMTYgJiAweGZmO1xuICBvWyAzXSA9IHgwID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sgNF0gPSB4NSA+Pj4gIDAgJiAweGZmO1xuICBvWyA1XSA9IHg1ID4+PiAgOCAmIDB4ZmY7XG4gIG9bIDZdID0geDUgPj4+IDE2ICYgMHhmZjtcbiAgb1sgN10gPSB4NSA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bIDhdID0geDEwID4+PiAgMCAmIDB4ZmY7XG4gIG9bIDldID0geDEwID4+PiAgOCAmIDB4ZmY7XG4gIG9bMTBdID0geDEwID4+PiAxNiAmIDB4ZmY7XG4gIG9bMTFdID0geDEwID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sxMl0gPSB4MTUgPj4+ICAwICYgMHhmZjtcbiAgb1sxM10gPSB4MTUgPj4+ICA4ICYgMHhmZjtcbiAgb1sxNF0gPSB4MTUgPj4+IDE2ICYgMHhmZjtcbiAgb1sxNV0gPSB4MTUgPj4+IDI0ICYgMHhmZjtcblxuICBvWzE2XSA9IHg2ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMTddID0geDYgPj4+ICA4ICYgMHhmZjtcbiAgb1sxOF0gPSB4NiA+Pj4gMTYgJiAweGZmO1xuICBvWzE5XSA9IHg2ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1syMF0gPSB4NyA+Pj4gIDAgJiAweGZmO1xuICBvWzIxXSA9IHg3ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMjJdID0geDcgPj4+IDE2ICYgMHhmZjtcbiAgb1syM10gPSB4NyA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMjRdID0geDggPj4+ICAwICYgMHhmZjtcbiAgb1syNV0gPSB4OCA+Pj4gIDggJiAweGZmO1xuICBvWzI2XSA9IHg4ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMjddID0geDggPj4+IDI0ICYgMHhmZjtcblxuICBvWzI4XSA9IHg5ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMjldID0geDkgPj4+ICA4ICYgMHhmZjtcbiAgb1szMF0gPSB4OSA+Pj4gMTYgJiAweGZmO1xuICBvWzMxXSA9IHg5ID4+PiAyNCAmIDB4ZmY7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19jb3JlX3NhbHNhMjAob3V0LGlucCxrLGMpIHtcbiAgY29yZV9zYWxzYTIwKG91dCxpbnAsayxjKTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX2NvcmVfaHNhbHNhMjAob3V0LGlucCxrLGMpIHtcbiAgY29yZV9oc2Fsc2EyMChvdXQsaW5wLGssYyk7XG59XG5cbnZhciBzaWdtYSA9IG5ldyBVaW50OEFycmF5KFsxMDEsIDEyMCwgMTEyLCA5NywgMTEwLCAxMDAsIDMyLCA1MSwgNTAsIDQ1LCA5OCwgMTIxLCAxMTYsIDEwMSwgMzIsIDEwN10pO1xuICAgICAgICAgICAgLy8gXCJleHBhbmQgMzItYnl0ZSBrXCJcblxuZnVuY3Rpb24gY3J5cHRvX3N0cmVhbV9zYWxzYTIwX3hvcihjLGNwb3MsbSxtcG9zLGIsbixrKSB7XG4gIHZhciB6ID0gbmV3IFVpbnQ4QXJyYXkoMTYpLCB4ID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgdSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHpbaV0gPSAwO1xuICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB6W2ldID0gbltpXTtcbiAgd2hpbGUgKGIgPj0gNjQpIHtcbiAgICBjcnlwdG9fY29yZV9zYWxzYTIwKHgseixrLHNpZ21hKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgY1tjcG9zK2ldID0gbVttcG9zK2ldIF4geFtpXTtcbiAgICB1ID0gMTtcbiAgICBmb3IgKGkgPSA4OyBpIDwgMTY7IGkrKykge1xuICAgICAgdSA9IHUgKyAoeltpXSAmIDB4ZmYpIHwgMDtcbiAgICAgIHpbaV0gPSB1ICYgMHhmZjtcbiAgICAgIHUgPj4+PSA4O1xuICAgIH1cbiAgICBiIC09IDY0O1xuICAgIGNwb3MgKz0gNjQ7XG4gICAgbXBvcyArPSA2NDtcbiAgfVxuICBpZiAoYiA+IDApIHtcbiAgICBjcnlwdG9fY29yZV9zYWxzYTIwKHgseixrLHNpZ21hKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYjsgaSsrKSBjW2Nwb3MraV0gPSBtW21wb3MraV0gXiB4W2ldO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fc3RyZWFtX3NhbHNhMjAoYyxjcG9zLGIsbixrKSB7XG4gIHZhciB6ID0gbmV3IFVpbnQ4QXJyYXkoMTYpLCB4ID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgdSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHpbaV0gPSAwO1xuICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB6W2ldID0gbltpXTtcbiAgd2hpbGUgKGIgPj0gNjQpIHtcbiAgICBjcnlwdG9fY29yZV9zYWxzYTIwKHgseixrLHNpZ21hKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgY1tjcG9zK2ldID0geFtpXTtcbiAgICB1ID0gMTtcbiAgICBmb3IgKGkgPSA4OyBpIDwgMTY7IGkrKykge1xuICAgICAgdSA9IHUgKyAoeltpXSAmIDB4ZmYpIHwgMDtcbiAgICAgIHpbaV0gPSB1ICYgMHhmZjtcbiAgICAgIHUgPj4+PSA4O1xuICAgIH1cbiAgICBiIC09IDY0O1xuICAgIGNwb3MgKz0gNjQ7XG4gIH1cbiAgaWYgKGIgPiAwKSB7XG4gICAgY3J5cHRvX2NvcmVfc2Fsc2EyMCh4LHosayxzaWdtYSk7XG4gICAgZm9yIChpID0gMDsgaSA8IGI7IGkrKykgY1tjcG9zK2ldID0geFtpXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3N0cmVhbShjLGNwb3MsZCxuLGspIHtcbiAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGNyeXB0b19jb3JlX2hzYWxzYTIwKHMsbixrLHNpZ21hKTtcbiAgdmFyIHNuID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSBzbltpXSA9IG5baSsxNl07XG4gIHJldHVybiBjcnlwdG9fc3RyZWFtX3NhbHNhMjAoYyxjcG9zLGQsc24scyk7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zdHJlYW1feG9yKGMsY3BvcyxtLG1wb3MsZCxuLGspIHtcbiAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGNyeXB0b19jb3JlX2hzYWxzYTIwKHMsbixrLHNpZ21hKTtcbiAgdmFyIHNuID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSBzbltpXSA9IG5baSsxNl07XG4gIHJldHVybiBjcnlwdG9fc3RyZWFtX3NhbHNhMjBfeG9yKGMsY3BvcyxtLG1wb3MsZCxzbixzKTtcbn1cblxuLypcbiogUG9ydCBvZiBBbmRyZXcgTW9vbidzIFBvbHkxMzA1LWRvbm5hLTE2LiBQdWJsaWMgZG9tYWluLlxuKiBodHRwczovL2dpdGh1Yi5jb20vZmxvb2R5YmVycnkvcG9seTEzMDUtZG9ubmFcbiovXG5cbnZhciBwb2x5MTMwNSA9IGZ1bmN0aW9uKGtleSkge1xuICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgdGhpcy5yID0gbmV3IFVpbnQxNkFycmF5KDEwKTtcbiAgdGhpcy5oID0gbmV3IFVpbnQxNkFycmF5KDEwKTtcbiAgdGhpcy5wYWQgPSBuZXcgVWludDE2QXJyYXkoOCk7XG4gIHRoaXMubGVmdG92ZXIgPSAwO1xuICB0aGlzLmZpbiA9IDA7XG5cbiAgdmFyIHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NztcblxuICB0MCA9IGtleVsgMF0gJiAweGZmIHwgKGtleVsgMV0gJiAweGZmKSA8PCA4OyB0aGlzLnJbMF0gPSAoIHQwICAgICAgICAgICAgICAgICAgICAgKSAmIDB4MWZmZjtcbiAgdDEgPSBrZXlbIDJdICYgMHhmZiB8IChrZXlbIDNdICYgMHhmZikgPDwgODsgdGhpcy5yWzFdID0gKCh0MCA+Pj4gMTMpIHwgKHQxIDw8ICAzKSkgJiAweDFmZmY7XG4gIHQyID0ga2V5WyA0XSAmIDB4ZmYgfCAoa2V5WyA1XSAmIDB4ZmYpIDw8IDg7IHRoaXMuclsyXSA9ICgodDEgPj4+IDEwKSB8ICh0MiA8PCAgNikpICYgMHgxZjAzO1xuICB0MyA9IGtleVsgNl0gJiAweGZmIHwgKGtleVsgN10gJiAweGZmKSA8PCA4OyB0aGlzLnJbM10gPSAoKHQyID4+PiAgNykgfCAodDMgPDwgIDkpKSAmIDB4MWZmZjtcbiAgdDQgPSBrZXlbIDhdICYgMHhmZiB8IChrZXlbIDldICYgMHhmZikgPDwgODsgdGhpcy5yWzRdID0gKCh0MyA+Pj4gIDQpIHwgKHQ0IDw8IDEyKSkgJiAweDAwZmY7XG4gIHRoaXMucls1XSA9ICgodDQgPj4+ICAxKSkgJiAweDFmZmU7XG4gIHQ1ID0ga2V5WzEwXSAmIDB4ZmYgfCAoa2V5WzExXSAmIDB4ZmYpIDw8IDg7IHRoaXMucls2XSA9ICgodDQgPj4+IDE0KSB8ICh0NSA8PCAgMikpICYgMHgxZmZmO1xuICB0NiA9IGtleVsxMl0gJiAweGZmIHwgKGtleVsxM10gJiAweGZmKSA8PCA4OyB0aGlzLnJbN10gPSAoKHQ1ID4+PiAxMSkgfCAodDYgPDwgIDUpKSAmIDB4MWY4MTtcbiAgdDcgPSBrZXlbMTRdICYgMHhmZiB8IChrZXlbMTVdICYgMHhmZikgPDwgODsgdGhpcy5yWzhdID0gKCh0NiA+Pj4gIDgpIHwgKHQ3IDw8ICA4KSkgJiAweDFmZmY7XG4gIHRoaXMucls5XSA9ICgodDcgPj4+ICA1KSkgJiAweDAwN2Y7XG5cbiAgdGhpcy5wYWRbMF0gPSBrZXlbMTZdICYgMHhmZiB8IChrZXlbMTddICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbMV0gPSBrZXlbMThdICYgMHhmZiB8IChrZXlbMTldICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbMl0gPSBrZXlbMjBdICYgMHhmZiB8IChrZXlbMjFdICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbM10gPSBrZXlbMjJdICYgMHhmZiB8IChrZXlbMjNdICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbNF0gPSBrZXlbMjRdICYgMHhmZiB8IChrZXlbMjVdICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbNV0gPSBrZXlbMjZdICYgMHhmZiB8IChrZXlbMjddICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbNl0gPSBrZXlbMjhdICYgMHhmZiB8IChrZXlbMjldICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbN10gPSBrZXlbMzBdICYgMHhmZiB8IChrZXlbMzFdICYgMHhmZikgPDwgODtcbn07XG5cbnBvbHkxMzA1LnByb3RvdHlwZS5ibG9ja3MgPSBmdW5jdGlvbihtLCBtcG9zLCBieXRlcykge1xuICB2YXIgaGliaXQgPSB0aGlzLmZpbiA/IDAgOiAoMSA8PCAxMSk7XG4gIHZhciB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIGM7XG4gIHZhciBkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOTtcblxuICB2YXIgaDAgPSB0aGlzLmhbMF0sXG4gICAgICBoMSA9IHRoaXMuaFsxXSxcbiAgICAgIGgyID0gdGhpcy5oWzJdLFxuICAgICAgaDMgPSB0aGlzLmhbM10sXG4gICAgICBoNCA9IHRoaXMuaFs0XSxcbiAgICAgIGg1ID0gdGhpcy5oWzVdLFxuICAgICAgaDYgPSB0aGlzLmhbNl0sXG4gICAgICBoNyA9IHRoaXMuaFs3XSxcbiAgICAgIGg4ID0gdGhpcy5oWzhdLFxuICAgICAgaDkgPSB0aGlzLmhbOV07XG5cbiAgdmFyIHIwID0gdGhpcy5yWzBdLFxuICAgICAgcjEgPSB0aGlzLnJbMV0sXG4gICAgICByMiA9IHRoaXMuclsyXSxcbiAgICAgIHIzID0gdGhpcy5yWzNdLFxuICAgICAgcjQgPSB0aGlzLnJbNF0sXG4gICAgICByNSA9IHRoaXMucls1XSxcbiAgICAgIHI2ID0gdGhpcy5yWzZdLFxuICAgICAgcjcgPSB0aGlzLnJbN10sXG4gICAgICByOCA9IHRoaXMucls4XSxcbiAgICAgIHI5ID0gdGhpcy5yWzldO1xuXG4gIHdoaWxlIChieXRlcyA+PSAxNikge1xuICAgIHQwID0gbVttcG9zKyAwXSAmIDB4ZmYgfCAobVttcG9zKyAxXSAmIDB4ZmYpIDw8IDg7IGgwICs9ICggdDAgICAgICAgICAgICAgICAgICAgICApICYgMHgxZmZmO1xuICAgIHQxID0gbVttcG9zKyAyXSAmIDB4ZmYgfCAobVttcG9zKyAzXSAmIDB4ZmYpIDw8IDg7IGgxICs9ICgodDAgPj4+IDEzKSB8ICh0MSA8PCAgMykpICYgMHgxZmZmO1xuICAgIHQyID0gbVttcG9zKyA0XSAmIDB4ZmYgfCAobVttcG9zKyA1XSAmIDB4ZmYpIDw8IDg7IGgyICs9ICgodDEgPj4+IDEwKSB8ICh0MiA8PCAgNikpICYgMHgxZmZmO1xuICAgIHQzID0gbVttcG9zKyA2XSAmIDB4ZmYgfCAobVttcG9zKyA3XSAmIDB4ZmYpIDw8IDg7IGgzICs9ICgodDIgPj4+ICA3KSB8ICh0MyA8PCAgOSkpICYgMHgxZmZmO1xuICAgIHQ0ID0gbVttcG9zKyA4XSAmIDB4ZmYgfCAobVttcG9zKyA5XSAmIDB4ZmYpIDw8IDg7IGg0ICs9ICgodDMgPj4+ICA0KSB8ICh0NCA8PCAxMikpICYgMHgxZmZmO1xuICAgIGg1ICs9ICgodDQgPj4+ICAxKSkgJiAweDFmZmY7XG4gICAgdDUgPSBtW21wb3MrMTBdICYgMHhmZiB8IChtW21wb3MrMTFdICYgMHhmZikgPDwgODsgaDYgKz0gKCh0NCA+Pj4gMTQpIHwgKHQ1IDw8ICAyKSkgJiAweDFmZmY7XG4gICAgdDYgPSBtW21wb3MrMTJdICYgMHhmZiB8IChtW21wb3MrMTNdICYgMHhmZikgPDwgODsgaDcgKz0gKCh0NSA+Pj4gMTEpIHwgKHQ2IDw8ICA1KSkgJiAweDFmZmY7XG4gICAgdDcgPSBtW21wb3MrMTRdICYgMHhmZiB8IChtW21wb3MrMTVdICYgMHhmZikgPDwgODsgaDggKz0gKCh0NiA+Pj4gIDgpIHwgKHQ3IDw8ICA4KSkgJiAweDFmZmY7XG4gICAgaDkgKz0gKCh0NyA+Pj4gNSkpIHwgaGliaXQ7XG5cbiAgICBjID0gMDtcblxuICAgIGQwID0gYztcbiAgICBkMCArPSBoMCAqIHIwO1xuICAgIGQwICs9IGgxICogKDUgKiByOSk7XG4gICAgZDAgKz0gaDIgKiAoNSAqIHI4KTtcbiAgICBkMCArPSBoMyAqICg1ICogcjcpO1xuICAgIGQwICs9IGg0ICogKDUgKiByNik7XG4gICAgYyA9IChkMCA+Pj4gMTMpOyBkMCAmPSAweDFmZmY7XG4gICAgZDAgKz0gaDUgKiAoNSAqIHI1KTtcbiAgICBkMCArPSBoNiAqICg1ICogcjQpO1xuICAgIGQwICs9IGg3ICogKDUgKiByMyk7XG4gICAgZDAgKz0gaDggKiAoNSAqIHIyKTtcbiAgICBkMCArPSBoOSAqICg1ICogcjEpO1xuICAgIGMgKz0gKGQwID4+PiAxMyk7IGQwICY9IDB4MWZmZjtcblxuICAgIGQxID0gYztcbiAgICBkMSArPSBoMCAqIHIxO1xuICAgIGQxICs9IGgxICogcjA7XG4gICAgZDEgKz0gaDIgKiAoNSAqIHI5KTtcbiAgICBkMSArPSBoMyAqICg1ICogcjgpO1xuICAgIGQxICs9IGg0ICogKDUgKiByNyk7XG4gICAgYyA9IChkMSA+Pj4gMTMpOyBkMSAmPSAweDFmZmY7XG4gICAgZDEgKz0gaDUgKiAoNSAqIHI2KTtcbiAgICBkMSArPSBoNiAqICg1ICogcjUpO1xuICAgIGQxICs9IGg3ICogKDUgKiByNCk7XG4gICAgZDEgKz0gaDggKiAoNSAqIHIzKTtcbiAgICBkMSArPSBoOSAqICg1ICogcjIpO1xuICAgIGMgKz0gKGQxID4+PiAxMyk7IGQxICY9IDB4MWZmZjtcblxuICAgIGQyID0gYztcbiAgICBkMiArPSBoMCAqIHIyO1xuICAgIGQyICs9IGgxICogcjE7XG4gICAgZDIgKz0gaDIgKiByMDtcbiAgICBkMiArPSBoMyAqICg1ICogcjkpO1xuICAgIGQyICs9IGg0ICogKDUgKiByOCk7XG4gICAgYyA9IChkMiA+Pj4gMTMpOyBkMiAmPSAweDFmZmY7XG4gICAgZDIgKz0gaDUgKiAoNSAqIHI3KTtcbiAgICBkMiArPSBoNiAqICg1ICogcjYpO1xuICAgIGQyICs9IGg3ICogKDUgKiByNSk7XG4gICAgZDIgKz0gaDggKiAoNSAqIHI0KTtcbiAgICBkMiArPSBoOSAqICg1ICogcjMpO1xuICAgIGMgKz0gKGQyID4+PiAxMyk7IGQyICY9IDB4MWZmZjtcblxuICAgIGQzID0gYztcbiAgICBkMyArPSBoMCAqIHIzO1xuICAgIGQzICs9IGgxICogcjI7XG4gICAgZDMgKz0gaDIgKiByMTtcbiAgICBkMyArPSBoMyAqIHIwO1xuICAgIGQzICs9IGg0ICogKDUgKiByOSk7XG4gICAgYyA9IChkMyA+Pj4gMTMpOyBkMyAmPSAweDFmZmY7XG4gICAgZDMgKz0gaDUgKiAoNSAqIHI4KTtcbiAgICBkMyArPSBoNiAqICg1ICogcjcpO1xuICAgIGQzICs9IGg3ICogKDUgKiByNik7XG4gICAgZDMgKz0gaDggKiAoNSAqIHI1KTtcbiAgICBkMyArPSBoOSAqICg1ICogcjQpO1xuICAgIGMgKz0gKGQzID4+PiAxMyk7IGQzICY9IDB4MWZmZjtcblxuICAgIGQ0ID0gYztcbiAgICBkNCArPSBoMCAqIHI0O1xuICAgIGQ0ICs9IGgxICogcjM7XG4gICAgZDQgKz0gaDIgKiByMjtcbiAgICBkNCArPSBoMyAqIHIxO1xuICAgIGQ0ICs9IGg0ICogcjA7XG4gICAgYyA9IChkNCA+Pj4gMTMpOyBkNCAmPSAweDFmZmY7XG4gICAgZDQgKz0gaDUgKiAoNSAqIHI5KTtcbiAgICBkNCArPSBoNiAqICg1ICogcjgpO1xuICAgIGQ0ICs9IGg3ICogKDUgKiByNyk7XG4gICAgZDQgKz0gaDggKiAoNSAqIHI2KTtcbiAgICBkNCArPSBoOSAqICg1ICogcjUpO1xuICAgIGMgKz0gKGQ0ID4+PiAxMyk7IGQ0ICY9IDB4MWZmZjtcblxuICAgIGQ1ID0gYztcbiAgICBkNSArPSBoMCAqIHI1O1xuICAgIGQ1ICs9IGgxICogcjQ7XG4gICAgZDUgKz0gaDIgKiByMztcbiAgICBkNSArPSBoMyAqIHIyO1xuICAgIGQ1ICs9IGg0ICogcjE7XG4gICAgYyA9IChkNSA+Pj4gMTMpOyBkNSAmPSAweDFmZmY7XG4gICAgZDUgKz0gaDUgKiByMDtcbiAgICBkNSArPSBoNiAqICg1ICogcjkpO1xuICAgIGQ1ICs9IGg3ICogKDUgKiByOCk7XG4gICAgZDUgKz0gaDggKiAoNSAqIHI3KTtcbiAgICBkNSArPSBoOSAqICg1ICogcjYpO1xuICAgIGMgKz0gKGQ1ID4+PiAxMyk7IGQ1ICY9IDB4MWZmZjtcblxuICAgIGQ2ID0gYztcbiAgICBkNiArPSBoMCAqIHI2O1xuICAgIGQ2ICs9IGgxICogcjU7XG4gICAgZDYgKz0gaDIgKiByNDtcbiAgICBkNiArPSBoMyAqIHIzO1xuICAgIGQ2ICs9IGg0ICogcjI7XG4gICAgYyA9IChkNiA+Pj4gMTMpOyBkNiAmPSAweDFmZmY7XG4gICAgZDYgKz0gaDUgKiByMTtcbiAgICBkNiArPSBoNiAqIHIwO1xuICAgIGQ2ICs9IGg3ICogKDUgKiByOSk7XG4gICAgZDYgKz0gaDggKiAoNSAqIHI4KTtcbiAgICBkNiArPSBoOSAqICg1ICogcjcpO1xuICAgIGMgKz0gKGQ2ID4+PiAxMyk7IGQ2ICY9IDB4MWZmZjtcblxuICAgIGQ3ID0gYztcbiAgICBkNyArPSBoMCAqIHI3O1xuICAgIGQ3ICs9IGgxICogcjY7XG4gICAgZDcgKz0gaDIgKiByNTtcbiAgICBkNyArPSBoMyAqIHI0O1xuICAgIGQ3ICs9IGg0ICogcjM7XG4gICAgYyA9IChkNyA+Pj4gMTMpOyBkNyAmPSAweDFmZmY7XG4gICAgZDcgKz0gaDUgKiByMjtcbiAgICBkNyArPSBoNiAqIHIxO1xuICAgIGQ3ICs9IGg3ICogcjA7XG4gICAgZDcgKz0gaDggKiAoNSAqIHI5KTtcbiAgICBkNyArPSBoOSAqICg1ICogcjgpO1xuICAgIGMgKz0gKGQ3ID4+PiAxMyk7IGQ3ICY9IDB4MWZmZjtcblxuICAgIGQ4ID0gYztcbiAgICBkOCArPSBoMCAqIHI4O1xuICAgIGQ4ICs9IGgxICogcjc7XG4gICAgZDggKz0gaDIgKiByNjtcbiAgICBkOCArPSBoMyAqIHI1O1xuICAgIGQ4ICs9IGg0ICogcjQ7XG4gICAgYyA9IChkOCA+Pj4gMTMpOyBkOCAmPSAweDFmZmY7XG4gICAgZDggKz0gaDUgKiByMztcbiAgICBkOCArPSBoNiAqIHIyO1xuICAgIGQ4ICs9IGg3ICogcjE7XG4gICAgZDggKz0gaDggKiByMDtcbiAgICBkOCArPSBoOSAqICg1ICogcjkpO1xuICAgIGMgKz0gKGQ4ID4+PiAxMyk7IGQ4ICY9IDB4MWZmZjtcblxuICAgIGQ5ID0gYztcbiAgICBkOSArPSBoMCAqIHI5O1xuICAgIGQ5ICs9IGgxICogcjg7XG4gICAgZDkgKz0gaDIgKiByNztcbiAgICBkOSArPSBoMyAqIHI2O1xuICAgIGQ5ICs9IGg0ICogcjU7XG4gICAgYyA9IChkOSA+Pj4gMTMpOyBkOSAmPSAweDFmZmY7XG4gICAgZDkgKz0gaDUgKiByNDtcbiAgICBkOSArPSBoNiAqIHIzO1xuICAgIGQ5ICs9IGg3ICogcjI7XG4gICAgZDkgKz0gaDggKiByMTtcbiAgICBkOSArPSBoOSAqIHIwO1xuICAgIGMgKz0gKGQ5ID4+PiAxMyk7IGQ5ICY9IDB4MWZmZjtcblxuICAgIGMgPSAoKChjIDw8IDIpICsgYykpIHwgMDtcbiAgICBjID0gKGMgKyBkMCkgfCAwO1xuICAgIGQwID0gYyAmIDB4MWZmZjtcbiAgICBjID0gKGMgPj4+IDEzKTtcbiAgICBkMSArPSBjO1xuXG4gICAgaDAgPSBkMDtcbiAgICBoMSA9IGQxO1xuICAgIGgyID0gZDI7XG4gICAgaDMgPSBkMztcbiAgICBoNCA9IGQ0O1xuICAgIGg1ID0gZDU7XG4gICAgaDYgPSBkNjtcbiAgICBoNyA9IGQ3O1xuICAgIGg4ID0gZDg7XG4gICAgaDkgPSBkOTtcblxuICAgIG1wb3MgKz0gMTY7XG4gICAgYnl0ZXMgLT0gMTY7XG4gIH1cbiAgdGhpcy5oWzBdID0gaDA7XG4gIHRoaXMuaFsxXSA9IGgxO1xuICB0aGlzLmhbMl0gPSBoMjtcbiAgdGhpcy5oWzNdID0gaDM7XG4gIHRoaXMuaFs0XSA9IGg0O1xuICB0aGlzLmhbNV0gPSBoNTtcbiAgdGhpcy5oWzZdID0gaDY7XG4gIHRoaXMuaFs3XSA9IGg3O1xuICB0aGlzLmhbOF0gPSBoODtcbiAgdGhpcy5oWzldID0gaDk7XG59O1xuXG5wb2x5MTMwNS5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24obWFjLCBtYWNwb3MpIHtcbiAgdmFyIGcgPSBuZXcgVWludDE2QXJyYXkoMTApO1xuICB2YXIgYywgbWFzaywgZiwgaTtcblxuICBpZiAodGhpcy5sZWZ0b3Zlcikge1xuICAgIGkgPSB0aGlzLmxlZnRvdmVyO1xuICAgIHRoaXMuYnVmZmVyW2krK10gPSAxO1xuICAgIGZvciAoOyBpIDwgMTY7IGkrKykgdGhpcy5idWZmZXJbaV0gPSAwO1xuICAgIHRoaXMuZmluID0gMTtcbiAgICB0aGlzLmJsb2Nrcyh0aGlzLmJ1ZmZlciwgMCwgMTYpO1xuICB9XG5cbiAgYyA9IHRoaXMuaFsxXSA+Pj4gMTM7XG4gIHRoaXMuaFsxXSAmPSAweDFmZmY7XG4gIGZvciAoaSA9IDI7IGkgPCAxMDsgaSsrKSB7XG4gICAgdGhpcy5oW2ldICs9IGM7XG4gICAgYyA9IHRoaXMuaFtpXSA+Pj4gMTM7XG4gICAgdGhpcy5oW2ldICY9IDB4MWZmZjtcbiAgfVxuICB0aGlzLmhbMF0gKz0gKGMgKiA1KTtcbiAgYyA9IHRoaXMuaFswXSA+Pj4gMTM7XG4gIHRoaXMuaFswXSAmPSAweDFmZmY7XG4gIHRoaXMuaFsxXSArPSBjO1xuICBjID0gdGhpcy5oWzFdID4+PiAxMztcbiAgdGhpcy5oWzFdICY9IDB4MWZmZjtcbiAgdGhpcy5oWzJdICs9IGM7XG5cbiAgZ1swXSA9IHRoaXMuaFswXSArIDU7XG4gIGMgPSBnWzBdID4+PiAxMztcbiAgZ1swXSAmPSAweDFmZmY7XG4gIGZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKSB7XG4gICAgZ1tpXSA9IHRoaXMuaFtpXSArIGM7XG4gICAgYyA9IGdbaV0gPj4+IDEzO1xuICAgIGdbaV0gJj0gMHgxZmZmO1xuICB9XG4gIGdbOV0gLT0gKDEgPDwgMTMpO1xuXG4gIG1hc2sgPSAoYyBeIDEpIC0gMTtcbiAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIGdbaV0gJj0gbWFzaztcbiAgbWFzayA9IH5tYXNrO1xuICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgdGhpcy5oW2ldID0gKHRoaXMuaFtpXSAmIG1hc2spIHwgZ1tpXTtcblxuICB0aGlzLmhbMF0gPSAoKHRoaXMuaFswXSAgICAgICApIHwgKHRoaXMuaFsxXSA8PCAxMykgICAgICAgICAgICAgICAgICAgICkgJiAweGZmZmY7XG4gIHRoaXMuaFsxXSA9ICgodGhpcy5oWzFdID4+PiAgMykgfCAodGhpcy5oWzJdIDw8IDEwKSAgICAgICAgICAgICAgICAgICAgKSAmIDB4ZmZmZjtcbiAgdGhpcy5oWzJdID0gKCh0aGlzLmhbMl0gPj4+ICA2KSB8ICh0aGlzLmhbM10gPDwgIDcpICAgICAgICAgICAgICAgICAgICApICYgMHhmZmZmO1xuICB0aGlzLmhbM10gPSAoKHRoaXMuaFszXSA+Pj4gIDkpIHwgKHRoaXMuaFs0XSA8PCAgNCkgICAgICAgICAgICAgICAgICAgICkgJiAweGZmZmY7XG4gIHRoaXMuaFs0XSA9ICgodGhpcy5oWzRdID4+PiAxMikgfCAodGhpcy5oWzVdIDw8ICAxKSB8ICh0aGlzLmhbNl0gPDwgMTQpKSAmIDB4ZmZmZjtcbiAgdGhpcy5oWzVdID0gKCh0aGlzLmhbNl0gPj4+ICAyKSB8ICh0aGlzLmhbN10gPDwgMTEpICAgICAgICAgICAgICAgICAgICApICYgMHhmZmZmO1xuICB0aGlzLmhbNl0gPSAoKHRoaXMuaFs3XSA+Pj4gIDUpIHwgKHRoaXMuaFs4XSA8PCAgOCkgICAgICAgICAgICAgICAgICAgICkgJiAweGZmZmY7XG4gIHRoaXMuaFs3XSA9ICgodGhpcy5oWzhdID4+PiAgOCkgfCAodGhpcy5oWzldIDw8ICA1KSAgICAgICAgICAgICAgICAgICAgKSAmIDB4ZmZmZjtcblxuICBmID0gdGhpcy5oWzBdICsgdGhpcy5wYWRbMF07XG4gIHRoaXMuaFswXSA9IGYgJiAweGZmZmY7XG4gIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHtcbiAgICBmID0gKCgodGhpcy5oW2ldICsgdGhpcy5wYWRbaV0pIHwgMCkgKyAoZiA+Pj4gMTYpKSB8IDA7XG4gICAgdGhpcy5oW2ldID0gZiAmIDB4ZmZmZjtcbiAgfVxuXG4gIG1hY1ttYWNwb3MrIDBdID0gKHRoaXMuaFswXSA+Pj4gMCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyAxXSA9ICh0aGlzLmhbMF0gPj4+IDgpICYgMHhmZjtcbiAgbWFjW21hY3BvcysgMl0gPSAodGhpcy5oWzFdID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDNdID0gKHRoaXMuaFsxXSA+Pj4gOCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyA0XSA9ICh0aGlzLmhbMl0gPj4+IDApICYgMHhmZjtcbiAgbWFjW21hY3BvcysgNV0gPSAodGhpcy5oWzJdID4+PiA4KSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDZdID0gKHRoaXMuaFszXSA+Pj4gMCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyA3XSA9ICh0aGlzLmhbM10gPj4+IDgpICYgMHhmZjtcbiAgbWFjW21hY3BvcysgOF0gPSAodGhpcy5oWzRdID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDldID0gKHRoaXMuaFs0XSA+Pj4gOCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKzEwXSA9ICh0aGlzLmhbNV0gPj4+IDApICYgMHhmZjtcbiAgbWFjW21hY3BvcysxMV0gPSAodGhpcy5oWzVdID4+PiA4KSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrMTJdID0gKHRoaXMuaFs2XSA+Pj4gMCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKzEzXSA9ICh0aGlzLmhbNl0gPj4+IDgpICYgMHhmZjtcbiAgbWFjW21hY3BvcysxNF0gPSAodGhpcy5oWzddID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrMTVdID0gKHRoaXMuaFs3XSA+Pj4gOCkgJiAweGZmO1xufTtcblxucG9seTEzMDUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG0sIG1wb3MsIGJ5dGVzKSB7XG4gIHZhciBpLCB3YW50O1xuXG4gIGlmICh0aGlzLmxlZnRvdmVyKSB7XG4gICAgd2FudCA9ICgxNiAtIHRoaXMubGVmdG92ZXIpO1xuICAgIGlmICh3YW50ID4gYnl0ZXMpXG4gICAgICB3YW50ID0gYnl0ZXM7XG4gICAgZm9yIChpID0gMDsgaSA8IHdhbnQ7IGkrKylcbiAgICAgIHRoaXMuYnVmZmVyW3RoaXMubGVmdG92ZXIgKyBpXSA9IG1bbXBvcytpXTtcbiAgICBieXRlcyAtPSB3YW50O1xuICAgIG1wb3MgKz0gd2FudDtcbiAgICB0aGlzLmxlZnRvdmVyICs9IHdhbnQ7XG4gICAgaWYgKHRoaXMubGVmdG92ZXIgPCAxNilcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmJsb2Nrcyh0aGlzLmJ1ZmZlciwgMCwgMTYpO1xuICAgIHRoaXMubGVmdG92ZXIgPSAwO1xuICB9XG5cbiAgaWYgKGJ5dGVzID49IDE2KSB7XG4gICAgd2FudCA9IGJ5dGVzIC0gKGJ5dGVzICUgMTYpO1xuICAgIHRoaXMuYmxvY2tzKG0sIG1wb3MsIHdhbnQpO1xuICAgIG1wb3MgKz0gd2FudDtcbiAgICBieXRlcyAtPSB3YW50O1xuICB9XG5cbiAgaWYgKGJ5dGVzKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzOyBpKyspXG4gICAgICB0aGlzLmJ1ZmZlclt0aGlzLmxlZnRvdmVyICsgaV0gPSBtW21wb3MraV07XG4gICAgdGhpcy5sZWZ0b3ZlciArPSBieXRlcztcbiAgfVxufTtcblxuZnVuY3Rpb24gY3J5cHRvX29uZXRpbWVhdXRoKG91dCwgb3V0cG9zLCBtLCBtcG9zLCBuLCBrKSB7XG4gIHZhciBzID0gbmV3IHBvbHkxMzA1KGspO1xuICBzLnVwZGF0ZShtLCBtcG9zLCBuKTtcbiAgcy5maW5pc2gob3V0LCBvdXRwb3MpO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX29uZXRpbWVhdXRoX3ZlcmlmeShoLCBocG9zLCBtLCBtcG9zLCBuLCBrKSB7XG4gIHZhciB4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICBjcnlwdG9fb25ldGltZWF1dGgoeCwwLG0sbXBvcyxuLGspO1xuICByZXR1cm4gY3J5cHRvX3ZlcmlmeV8xNihoLGhwb3MseCwwKTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3NlY3JldGJveChjLG0sZCxuLGspIHtcbiAgdmFyIGk7XG4gIGlmIChkIDwgMzIpIHJldHVybiAtMTtcbiAgY3J5cHRvX3N0cmVhbV94b3IoYywwLG0sMCxkLG4sayk7XG4gIGNyeXB0b19vbmV0aW1lYXV0aChjLCAxNiwgYywgMzIsIGQgLSAzMiwgYyk7XG4gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSBjW2ldID0gMDtcbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zZWNyZXRib3hfb3BlbihtLGMsZCxuLGspIHtcbiAgdmFyIGk7XG4gIHZhciB4ID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBpZiAoZCA8IDMyKSByZXR1cm4gLTE7XG4gIGNyeXB0b19zdHJlYW0oeCwwLDMyLG4sayk7XG4gIGlmIChjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5KGMsIDE2LGMsIDMyLGQgLSAzMix4KSAhPT0gMCkgcmV0dXJuIC0xO1xuICBjcnlwdG9fc3RyZWFtX3hvcihtLDAsYywwLGQsbixrKTtcbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIG1baV0gPSAwO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gc2V0MjU1MTkociwgYSkge1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHJbaV0gPSBhW2ldfDA7XG59XG5cbmZ1bmN0aW9uIGNhcjI1NTE5KG8pIHtcbiAgdmFyIGksIHYsIGMgPSAxO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIHYgPSBvW2ldICsgYyArIDY1NTM1O1xuICAgIGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7XG4gICAgb1tpXSA9IHYgLSBjICogNjU1MzY7XG4gIH1cbiAgb1swXSArPSBjLTEgKyAzNyAqIChjLTEpO1xufVxuXG5mdW5jdGlvbiBzZWwyNTUxOShwLCBxLCBiKSB7XG4gIHZhciB0LCBjID0gfihiLTEpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICB0ID0gYyAmIChwW2ldIF4gcVtpXSk7XG4gICAgcFtpXSBePSB0O1xuICAgIHFbaV0gXj0gdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYWNrMjU1MTkobywgbikge1xuICB2YXIgaSwgaiwgYjtcbiAgdmFyIG0gPSBnZigpLCB0ID0gZ2YoKTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHRbaV0gPSBuW2ldO1xuICBjYXIyNTUxOSh0KTtcbiAgY2FyMjU1MTkodCk7XG4gIGNhcjI1NTE5KHQpO1xuICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7XG4gICAgbVswXSA9IHRbMF0gLSAweGZmZWQ7XG4gICAgZm9yIChpID0gMTsgaSA8IDE1OyBpKyspIHtcbiAgICAgIG1baV0gPSB0W2ldIC0gMHhmZmZmIC0gKChtW2ktMV0+PjE2KSAmIDEpO1xuICAgICAgbVtpLTFdICY9IDB4ZmZmZjtcbiAgICB9XG4gICAgbVsxNV0gPSB0WzE1XSAtIDB4N2ZmZiAtICgobVsxNF0+PjE2KSAmIDEpO1xuICAgIGIgPSAobVsxNV0+PjE2KSAmIDE7XG4gICAgbVsxNF0gJj0gMHhmZmZmO1xuICAgIHNlbDI1NTE5KHQsIG0sIDEtYik7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICBvWzIqaV0gPSB0W2ldICYgMHhmZjtcbiAgICBvWzIqaSsxXSA9IHRbaV0+Pjg7XG4gIH1cbn1cblxuZnVuY3Rpb24gbmVxMjU1MTkoYSwgYikge1xuICB2YXIgYyA9IG5ldyBVaW50OEFycmF5KDMyKSwgZCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgcGFjazI1NTE5KGMsIGEpO1xuICBwYWNrMjU1MTkoZCwgYik7XG4gIHJldHVybiBjcnlwdG9fdmVyaWZ5XzMyKGMsIDAsIGQsIDApO1xufVxuXG5mdW5jdGlvbiBwYXIyNTUxOShhKSB7XG4gIHZhciBkID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBwYWNrMjU1MTkoZCwgYSk7XG4gIHJldHVybiBkWzBdICYgMTtcbn1cblxuZnVuY3Rpb24gdW5wYWNrMjU1MTkobywgbikge1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIG9baV0gPSBuWzIqaV0gKyAoblsyKmkrMV0gPDwgOCk7XG4gIG9bMTVdICY9IDB4N2ZmZjtcbn1cblxuZnVuY3Rpb24gQShvLCBhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykgb1tpXSA9IGFbaV0gKyBiW2ldO1xufVxuXG5mdW5jdGlvbiBaKG8sIGEsIGIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSBvW2ldID0gYVtpXSAtIGJbaV07XG59XG5cbmZ1bmN0aW9uIE0obywgYSwgYikge1xuICB2YXIgdiwgYyxcbiAgICAgdDAgPSAwLCAgdDEgPSAwLCAgdDIgPSAwLCAgdDMgPSAwLCAgdDQgPSAwLCAgdDUgPSAwLCAgdDYgPSAwLCAgdDcgPSAwLFxuICAgICB0OCA9IDAsICB0OSA9IDAsIHQxMCA9IDAsIHQxMSA9IDAsIHQxMiA9IDAsIHQxMyA9IDAsIHQxNCA9IDAsIHQxNSA9IDAsXG4gICAgdDE2ID0gMCwgdDE3ID0gMCwgdDE4ID0gMCwgdDE5ID0gMCwgdDIwID0gMCwgdDIxID0gMCwgdDIyID0gMCwgdDIzID0gMCxcbiAgICB0MjQgPSAwLCB0MjUgPSAwLCB0MjYgPSAwLCB0MjcgPSAwLCB0MjggPSAwLCB0MjkgPSAwLCB0MzAgPSAwLFxuICAgIGIwID0gYlswXSxcbiAgICBiMSA9IGJbMV0sXG4gICAgYjIgPSBiWzJdLFxuICAgIGIzID0gYlszXSxcbiAgICBiNCA9IGJbNF0sXG4gICAgYjUgPSBiWzVdLFxuICAgIGI2ID0gYls2XSxcbiAgICBiNyA9IGJbN10sXG4gICAgYjggPSBiWzhdLFxuICAgIGI5ID0gYls5XSxcbiAgICBiMTAgPSBiWzEwXSxcbiAgICBiMTEgPSBiWzExXSxcbiAgICBiMTIgPSBiWzEyXSxcbiAgICBiMTMgPSBiWzEzXSxcbiAgICBiMTQgPSBiWzE0XSxcbiAgICBiMTUgPSBiWzE1XTtcblxuICB2ID0gYVswXTtcbiAgdDAgKz0gdiAqIGIwO1xuICB0MSArPSB2ICogYjE7XG4gIHQyICs9IHYgKiBiMjtcbiAgdDMgKz0gdiAqIGIzO1xuICB0NCArPSB2ICogYjQ7XG4gIHQ1ICs9IHYgKiBiNTtcbiAgdDYgKz0gdiAqIGI2O1xuICB0NyArPSB2ICogYjc7XG4gIHQ4ICs9IHYgKiBiODtcbiAgdDkgKz0gdiAqIGI5O1xuICB0MTAgKz0gdiAqIGIxMDtcbiAgdDExICs9IHYgKiBiMTE7XG4gIHQxMiArPSB2ICogYjEyO1xuICB0MTMgKz0gdiAqIGIxMztcbiAgdDE0ICs9IHYgKiBiMTQ7XG4gIHQxNSArPSB2ICogYjE1O1xuICB2ID0gYVsxXTtcbiAgdDEgKz0gdiAqIGIwO1xuICB0MiArPSB2ICogYjE7XG4gIHQzICs9IHYgKiBiMjtcbiAgdDQgKz0gdiAqIGIzO1xuICB0NSArPSB2ICogYjQ7XG4gIHQ2ICs9IHYgKiBiNTtcbiAgdDcgKz0gdiAqIGI2O1xuICB0OCArPSB2ICogYjc7XG4gIHQ5ICs9IHYgKiBiODtcbiAgdDEwICs9IHYgKiBiOTtcbiAgdDExICs9IHYgKiBiMTA7XG4gIHQxMiArPSB2ICogYjExO1xuICB0MTMgKz0gdiAqIGIxMjtcbiAgdDE0ICs9IHYgKiBiMTM7XG4gIHQxNSArPSB2ICogYjE0O1xuICB0MTYgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMl07XG4gIHQyICs9IHYgKiBiMDtcbiAgdDMgKz0gdiAqIGIxO1xuICB0NCArPSB2ICogYjI7XG4gIHQ1ICs9IHYgKiBiMztcbiAgdDYgKz0gdiAqIGI0O1xuICB0NyArPSB2ICogYjU7XG4gIHQ4ICs9IHYgKiBiNjtcbiAgdDkgKz0gdiAqIGI3O1xuICB0MTAgKz0gdiAqIGI4O1xuICB0MTEgKz0gdiAqIGI5O1xuICB0MTIgKz0gdiAqIGIxMDtcbiAgdDEzICs9IHYgKiBiMTE7XG4gIHQxNCArPSB2ICogYjEyO1xuICB0MTUgKz0gdiAqIGIxMztcbiAgdDE2ICs9IHYgKiBiMTQ7XG4gIHQxNyArPSB2ICogYjE1O1xuICB2ID0gYVszXTtcbiAgdDMgKz0gdiAqIGIwO1xuICB0NCArPSB2ICogYjE7XG4gIHQ1ICs9IHYgKiBiMjtcbiAgdDYgKz0gdiAqIGIzO1xuICB0NyArPSB2ICogYjQ7XG4gIHQ4ICs9IHYgKiBiNTtcbiAgdDkgKz0gdiAqIGI2O1xuICB0MTAgKz0gdiAqIGI3O1xuICB0MTEgKz0gdiAqIGI4O1xuICB0MTIgKz0gdiAqIGI5O1xuICB0MTMgKz0gdiAqIGIxMDtcbiAgdDE0ICs9IHYgKiBiMTE7XG4gIHQxNSArPSB2ICogYjEyO1xuICB0MTYgKz0gdiAqIGIxMztcbiAgdDE3ICs9IHYgKiBiMTQ7XG4gIHQxOCArPSB2ICogYjE1O1xuICB2ID0gYVs0XTtcbiAgdDQgKz0gdiAqIGIwO1xuICB0NSArPSB2ICogYjE7XG4gIHQ2ICs9IHYgKiBiMjtcbiAgdDcgKz0gdiAqIGIzO1xuICB0OCArPSB2ICogYjQ7XG4gIHQ5ICs9IHYgKiBiNTtcbiAgdDEwICs9IHYgKiBiNjtcbiAgdDExICs9IHYgKiBiNztcbiAgdDEyICs9IHYgKiBiODtcbiAgdDEzICs9IHYgKiBiOTtcbiAgdDE0ICs9IHYgKiBiMTA7XG4gIHQxNSArPSB2ICogYjExO1xuICB0MTYgKz0gdiAqIGIxMjtcbiAgdDE3ICs9IHYgKiBiMTM7XG4gIHQxOCArPSB2ICogYjE0O1xuICB0MTkgKz0gdiAqIGIxNTtcbiAgdiA9IGFbNV07XG4gIHQ1ICs9IHYgKiBiMDtcbiAgdDYgKz0gdiAqIGIxO1xuICB0NyArPSB2ICogYjI7XG4gIHQ4ICs9IHYgKiBiMztcbiAgdDkgKz0gdiAqIGI0O1xuICB0MTAgKz0gdiAqIGI1O1xuICB0MTEgKz0gdiAqIGI2O1xuICB0MTIgKz0gdiAqIGI3O1xuICB0MTMgKz0gdiAqIGI4O1xuICB0MTQgKz0gdiAqIGI5O1xuICB0MTUgKz0gdiAqIGIxMDtcbiAgdDE2ICs9IHYgKiBiMTE7XG4gIHQxNyArPSB2ICogYjEyO1xuICB0MTggKz0gdiAqIGIxMztcbiAgdDE5ICs9IHYgKiBiMTQ7XG4gIHQyMCArPSB2ICogYjE1O1xuICB2ID0gYVs2XTtcbiAgdDYgKz0gdiAqIGIwO1xuICB0NyArPSB2ICogYjE7XG4gIHQ4ICs9IHYgKiBiMjtcbiAgdDkgKz0gdiAqIGIzO1xuICB0MTAgKz0gdiAqIGI0O1xuICB0MTEgKz0gdiAqIGI1O1xuICB0MTIgKz0gdiAqIGI2O1xuICB0MTMgKz0gdiAqIGI3O1xuICB0MTQgKz0gdiAqIGI4O1xuICB0MTUgKz0gdiAqIGI5O1xuICB0MTYgKz0gdiAqIGIxMDtcbiAgdDE3ICs9IHYgKiBiMTE7XG4gIHQxOCArPSB2ICogYjEyO1xuICB0MTkgKz0gdiAqIGIxMztcbiAgdDIwICs9IHYgKiBiMTQ7XG4gIHQyMSArPSB2ICogYjE1O1xuICB2ID0gYVs3XTtcbiAgdDcgKz0gdiAqIGIwO1xuICB0OCArPSB2ICogYjE7XG4gIHQ5ICs9IHYgKiBiMjtcbiAgdDEwICs9IHYgKiBiMztcbiAgdDExICs9IHYgKiBiNDtcbiAgdDEyICs9IHYgKiBiNTtcbiAgdDEzICs9IHYgKiBiNjtcbiAgdDE0ICs9IHYgKiBiNztcbiAgdDE1ICs9IHYgKiBiODtcbiAgdDE2ICs9IHYgKiBiOTtcbiAgdDE3ICs9IHYgKiBiMTA7XG4gIHQxOCArPSB2ICogYjExO1xuICB0MTkgKz0gdiAqIGIxMjtcbiAgdDIwICs9IHYgKiBiMTM7XG4gIHQyMSArPSB2ICogYjE0O1xuICB0MjIgKz0gdiAqIGIxNTtcbiAgdiA9IGFbOF07XG4gIHQ4ICs9IHYgKiBiMDtcbiAgdDkgKz0gdiAqIGIxO1xuICB0MTAgKz0gdiAqIGIyO1xuICB0MTEgKz0gdiAqIGIzO1xuICB0MTIgKz0gdiAqIGI0O1xuICB0MTMgKz0gdiAqIGI1O1xuICB0MTQgKz0gdiAqIGI2O1xuICB0MTUgKz0gdiAqIGI3O1xuICB0MTYgKz0gdiAqIGI4O1xuICB0MTcgKz0gdiAqIGI5O1xuICB0MTggKz0gdiAqIGIxMDtcbiAgdDE5ICs9IHYgKiBiMTE7XG4gIHQyMCArPSB2ICogYjEyO1xuICB0MjEgKz0gdiAqIGIxMztcbiAgdDIyICs9IHYgKiBiMTQ7XG4gIHQyMyArPSB2ICogYjE1O1xuICB2ID0gYVs5XTtcbiAgdDkgKz0gdiAqIGIwO1xuICB0MTAgKz0gdiAqIGIxO1xuICB0MTEgKz0gdiAqIGIyO1xuICB0MTIgKz0gdiAqIGIzO1xuICB0MTMgKz0gdiAqIGI0O1xuICB0MTQgKz0gdiAqIGI1O1xuICB0MTUgKz0gdiAqIGI2O1xuICB0MTYgKz0gdiAqIGI3O1xuICB0MTcgKz0gdiAqIGI4O1xuICB0MTggKz0gdiAqIGI5O1xuICB0MTkgKz0gdiAqIGIxMDtcbiAgdDIwICs9IHYgKiBiMTE7XG4gIHQyMSArPSB2ICogYjEyO1xuICB0MjIgKz0gdiAqIGIxMztcbiAgdDIzICs9IHYgKiBiMTQ7XG4gIHQyNCArPSB2ICogYjE1O1xuICB2ID0gYVsxMF07XG4gIHQxMCArPSB2ICogYjA7XG4gIHQxMSArPSB2ICogYjE7XG4gIHQxMiArPSB2ICogYjI7XG4gIHQxMyArPSB2ICogYjM7XG4gIHQxNCArPSB2ICogYjQ7XG4gIHQxNSArPSB2ICogYjU7XG4gIHQxNiArPSB2ICogYjY7XG4gIHQxNyArPSB2ICogYjc7XG4gIHQxOCArPSB2ICogYjg7XG4gIHQxOSArPSB2ICogYjk7XG4gIHQyMCArPSB2ICogYjEwO1xuICB0MjEgKz0gdiAqIGIxMTtcbiAgdDIyICs9IHYgKiBiMTI7XG4gIHQyMyArPSB2ICogYjEzO1xuICB0MjQgKz0gdiAqIGIxNDtcbiAgdDI1ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzExXTtcbiAgdDExICs9IHYgKiBiMDtcbiAgdDEyICs9IHYgKiBiMTtcbiAgdDEzICs9IHYgKiBiMjtcbiAgdDE0ICs9IHYgKiBiMztcbiAgdDE1ICs9IHYgKiBiNDtcbiAgdDE2ICs9IHYgKiBiNTtcbiAgdDE3ICs9IHYgKiBiNjtcbiAgdDE4ICs9IHYgKiBiNztcbiAgdDE5ICs9IHYgKiBiODtcbiAgdDIwICs9IHYgKiBiOTtcbiAgdDIxICs9IHYgKiBiMTA7XG4gIHQyMiArPSB2ICogYjExO1xuICB0MjMgKz0gdiAqIGIxMjtcbiAgdDI0ICs9IHYgKiBiMTM7XG4gIHQyNSArPSB2ICogYjE0O1xuICB0MjYgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMTJdO1xuICB0MTIgKz0gdiAqIGIwO1xuICB0MTMgKz0gdiAqIGIxO1xuICB0MTQgKz0gdiAqIGIyO1xuICB0MTUgKz0gdiAqIGIzO1xuICB0MTYgKz0gdiAqIGI0O1xuICB0MTcgKz0gdiAqIGI1O1xuICB0MTggKz0gdiAqIGI2O1xuICB0MTkgKz0gdiAqIGI3O1xuICB0MjAgKz0gdiAqIGI4O1xuICB0MjEgKz0gdiAqIGI5O1xuICB0MjIgKz0gdiAqIGIxMDtcbiAgdDIzICs9IHYgKiBiMTE7XG4gIHQyNCArPSB2ICogYjEyO1xuICB0MjUgKz0gdiAqIGIxMztcbiAgdDI2ICs9IHYgKiBiMTQ7XG4gIHQyNyArPSB2ICogYjE1O1xuICB2ID0gYVsxM107XG4gIHQxMyArPSB2ICogYjA7XG4gIHQxNCArPSB2ICogYjE7XG4gIHQxNSArPSB2ICogYjI7XG4gIHQxNiArPSB2ICogYjM7XG4gIHQxNyArPSB2ICogYjQ7XG4gIHQxOCArPSB2ICogYjU7XG4gIHQxOSArPSB2ICogYjY7XG4gIHQyMCArPSB2ICogYjc7XG4gIHQyMSArPSB2ICogYjg7XG4gIHQyMiArPSB2ICogYjk7XG4gIHQyMyArPSB2ICogYjEwO1xuICB0MjQgKz0gdiAqIGIxMTtcbiAgdDI1ICs9IHYgKiBiMTI7XG4gIHQyNiArPSB2ICogYjEzO1xuICB0MjcgKz0gdiAqIGIxNDtcbiAgdDI4ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzE0XTtcbiAgdDE0ICs9IHYgKiBiMDtcbiAgdDE1ICs9IHYgKiBiMTtcbiAgdDE2ICs9IHYgKiBiMjtcbiAgdDE3ICs9IHYgKiBiMztcbiAgdDE4ICs9IHYgKiBiNDtcbiAgdDE5ICs9IHYgKiBiNTtcbiAgdDIwICs9IHYgKiBiNjtcbiAgdDIxICs9IHYgKiBiNztcbiAgdDIyICs9IHYgKiBiODtcbiAgdDIzICs9IHYgKiBiOTtcbiAgdDI0ICs9IHYgKiBiMTA7XG4gIHQyNSArPSB2ICogYjExO1xuICB0MjYgKz0gdiAqIGIxMjtcbiAgdDI3ICs9IHYgKiBiMTM7XG4gIHQyOCArPSB2ICogYjE0O1xuICB0MjkgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMTVdO1xuICB0MTUgKz0gdiAqIGIwO1xuICB0MTYgKz0gdiAqIGIxO1xuICB0MTcgKz0gdiAqIGIyO1xuICB0MTggKz0gdiAqIGIzO1xuICB0MTkgKz0gdiAqIGI0O1xuICB0MjAgKz0gdiAqIGI1O1xuICB0MjEgKz0gdiAqIGI2O1xuICB0MjIgKz0gdiAqIGI3O1xuICB0MjMgKz0gdiAqIGI4O1xuICB0MjQgKz0gdiAqIGI5O1xuICB0MjUgKz0gdiAqIGIxMDtcbiAgdDI2ICs9IHYgKiBiMTE7XG4gIHQyNyArPSB2ICogYjEyO1xuICB0MjggKz0gdiAqIGIxMztcbiAgdDI5ICs9IHYgKiBiMTQ7XG4gIHQzMCArPSB2ICogYjE1O1xuXG4gIHQwICArPSAzOCAqIHQxNjtcbiAgdDEgICs9IDM4ICogdDE3O1xuICB0MiAgKz0gMzggKiB0MTg7XG4gIHQzICArPSAzOCAqIHQxOTtcbiAgdDQgICs9IDM4ICogdDIwO1xuICB0NSAgKz0gMzggKiB0MjE7XG4gIHQ2ICArPSAzOCAqIHQyMjtcbiAgdDcgICs9IDM4ICogdDIzO1xuICB0OCAgKz0gMzggKiB0MjQ7XG4gIHQ5ICArPSAzOCAqIHQyNTtcbiAgdDEwICs9IDM4ICogdDI2O1xuICB0MTEgKz0gMzggKiB0Mjc7XG4gIHQxMiArPSAzOCAqIHQyODtcbiAgdDEzICs9IDM4ICogdDI5O1xuICB0MTQgKz0gMzggKiB0MzA7XG4gIC8vIHQxNSBsZWZ0IGFzIGlzXG5cbiAgLy8gZmlyc3QgY2FyXG4gIGMgPSAxO1xuICB2ID0gIHQwICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDAgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQxICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDEgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQyICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDIgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQzICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDMgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ0ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDQgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ1ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDUgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ2ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDYgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ3ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDcgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ4ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDggPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ5ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDkgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEwICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTAgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDExICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTEgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEyICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTIgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEzICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTMgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDE0ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTQgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDE1ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTUgPSB2IC0gYyAqIDY1NTM2O1xuICB0MCArPSBjLTEgKyAzNyAqIChjLTEpO1xuXG4gIC8vIHNlY29uZCBjYXJcbiAgYyA9IDE7XG4gIHYgPSAgdDAgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDEgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDIgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDMgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDQgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDUgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDYgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDcgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDggKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0OCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDkgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0OSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTAgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTEgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTIgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTMgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTQgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxNCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTUgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxNSA9IHYgLSBjICogNjU1MzY7XG4gIHQwICs9IGMtMSArIDM3ICogKGMtMSk7XG5cbiAgb1sgMF0gPSB0MDtcbiAgb1sgMV0gPSB0MTtcbiAgb1sgMl0gPSB0MjtcbiAgb1sgM10gPSB0MztcbiAgb1sgNF0gPSB0NDtcbiAgb1sgNV0gPSB0NTtcbiAgb1sgNl0gPSB0NjtcbiAgb1sgN10gPSB0NztcbiAgb1sgOF0gPSB0ODtcbiAgb1sgOV0gPSB0OTtcbiAgb1sxMF0gPSB0MTA7XG4gIG9bMTFdID0gdDExO1xuICBvWzEyXSA9IHQxMjtcbiAgb1sxM10gPSB0MTM7XG4gIG9bMTRdID0gdDE0O1xuICBvWzE1XSA9IHQxNTtcbn1cblxuZnVuY3Rpb24gUyhvLCBhKSB7XG4gIE0obywgYSwgYSk7XG59XG5cbmZ1bmN0aW9uIGludjI1NTE5KG8sIGkpIHtcbiAgdmFyIGMgPSBnZigpO1xuICB2YXIgYTtcbiAgZm9yIChhID0gMDsgYSA8IDE2OyBhKyspIGNbYV0gPSBpW2FdO1xuICBmb3IgKGEgPSAyNTM7IGEgPj0gMDsgYS0tKSB7XG4gICAgUyhjLCBjKTtcbiAgICBpZihhICE9PSAyICYmIGEgIT09IDQpIE0oYywgYywgaSk7XG4gIH1cbiAgZm9yIChhID0gMDsgYSA8IDE2OyBhKyspIG9bYV0gPSBjW2FdO1xufVxuXG5mdW5jdGlvbiBwb3cyNTIzKG8sIGkpIHtcbiAgdmFyIGMgPSBnZigpO1xuICB2YXIgYTtcbiAgZm9yIChhID0gMDsgYSA8IDE2OyBhKyspIGNbYV0gPSBpW2FdO1xuICBmb3IgKGEgPSAyNTA7IGEgPj0gMDsgYS0tKSB7XG4gICAgICBTKGMsIGMpO1xuICAgICAgaWYoYSAhPT0gMSkgTShjLCBjLCBpKTtcbiAgfVxuICBmb3IgKGEgPSAwOyBhIDwgMTY7IGErKykgb1thXSA9IGNbYV07XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zY2FsYXJtdWx0KHEsIG4sIHApIHtcbiAgdmFyIHogPSBuZXcgVWludDhBcnJheSgzMik7XG4gIHZhciB4ID0gbmV3IEZsb2F0NjRBcnJheSg4MCksIHIsIGk7XG4gIHZhciBhID0gZ2YoKSwgYiA9IGdmKCksIGMgPSBnZigpLFxuICAgICAgZCA9IGdmKCksIGUgPSBnZigpLCBmID0gZ2YoKTtcbiAgZm9yIChpID0gMDsgaSA8IDMxOyBpKyspIHpbaV0gPSBuW2ldO1xuICB6WzMxXT0oblszMV0mMTI3KXw2NDtcbiAgelswXSY9MjQ4O1xuICB1bnBhY2syNTUxOSh4LHApO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIGJbaV09eFtpXTtcbiAgICBkW2ldPWFbaV09Y1tpXT0wO1xuICB9XG4gIGFbMF09ZFswXT0xO1xuICBmb3IgKGk9MjU0OyBpPj0wOyAtLWkpIHtcbiAgICByPSh6W2k+Pj4zXT4+PihpJjcpKSYxO1xuICAgIHNlbDI1NTE5KGEsYixyKTtcbiAgICBzZWwyNTUxOShjLGQscik7XG4gICAgQShlLGEsYyk7XG4gICAgWihhLGEsYyk7XG4gICAgQShjLGIsZCk7XG4gICAgWihiLGIsZCk7XG4gICAgUyhkLGUpO1xuICAgIFMoZixhKTtcbiAgICBNKGEsYyxhKTtcbiAgICBNKGMsYixlKTtcbiAgICBBKGUsYSxjKTtcbiAgICBaKGEsYSxjKTtcbiAgICBTKGIsYSk7XG4gICAgWihjLGQsZik7XG4gICAgTShhLGMsXzEyMTY2NSk7XG4gICAgQShhLGEsZCk7XG4gICAgTShjLGMsYSk7XG4gICAgTShhLGQsZik7XG4gICAgTShkLGIseCk7XG4gICAgUyhiLGUpO1xuICAgIHNlbDI1NTE5KGEsYixyKTtcbiAgICBzZWwyNTUxOShjLGQscik7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICB4W2krMTZdPWFbaV07XG4gICAgeFtpKzMyXT1jW2ldO1xuICAgIHhbaSs0OF09YltpXTtcbiAgICB4W2krNjRdPWRbaV07XG4gIH1cbiAgdmFyIHgzMiA9IHguc3ViYXJyYXkoMzIpO1xuICB2YXIgeDE2ID0geC5zdWJhcnJheSgxNik7XG4gIGludjI1NTE5KHgzMix4MzIpO1xuICBNKHgxNix4MTYseDMyKTtcbiAgcGFjazI1NTE5KHEseDE2KTtcbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zY2FsYXJtdWx0X2Jhc2UocSwgbikge1xuICByZXR1cm4gY3J5cHRvX3NjYWxhcm11bHQocSwgbiwgXzkpO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fYm94X2tleXBhaXIoeSwgeCkge1xuICByYW5kb21ieXRlcyh4LCAzMik7XG4gIHJldHVybiBjcnlwdG9fc2NhbGFybXVsdF9iYXNlKHksIHgpO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fYm94X2JlZm9yZW5tKGssIHksIHgpIHtcbiAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGNyeXB0b19zY2FsYXJtdWx0KHMsIHgsIHkpO1xuICByZXR1cm4gY3J5cHRvX2NvcmVfaHNhbHNhMjAoaywgXzAsIHMsIHNpZ21hKTtcbn1cblxudmFyIGNyeXB0b19ib3hfYWZ0ZXJubSA9IGNyeXB0b19zZWNyZXRib3g7XG52YXIgY3J5cHRvX2JveF9vcGVuX2FmdGVybm0gPSBjcnlwdG9fc2VjcmV0Ym94X29wZW47XG5cbmZ1bmN0aW9uIGNyeXB0b19ib3goYywgbSwgZCwgbiwgeSwgeCkge1xuICB2YXIgayA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgY3J5cHRvX2JveF9iZWZvcmVubShrLCB5LCB4KTtcbiAgcmV0dXJuIGNyeXB0b19ib3hfYWZ0ZXJubShjLCBtLCBkLCBuLCBrKTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX2JveF9vcGVuKG0sIGMsIGQsIG4sIHksIHgpIHtcbiAgdmFyIGsgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGNyeXB0b19ib3hfYmVmb3Jlbm0oaywgeSwgeCk7XG4gIHJldHVybiBjcnlwdG9fYm94X29wZW5fYWZ0ZXJubShtLCBjLCBkLCBuLCBrKTtcbn1cblxudmFyIEsgPSBbXG4gIDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QsXG4gIDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMsXG4gIDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgsIDB4NTlmMTExZjEsIDB4YjYwNWQwMTksXG4gIDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIsIDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgsXG4gIDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsIDB4NDU3MDZmYmUsXG4gIDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIsXG4gIDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYsIDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEsXG4gIDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQsXG4gIDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIsIDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMsXG4gIDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsIDB4NzdhYzljNjUsXG4gIDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMsXG4gIDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQsIDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUsXG4gIDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIsIDB4YTgzMWM2NmQsIDB4MmRiNDMyMTAsXG4gIDB4YjAwMzI3YzgsIDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQsXG4gIDB4YzZlMDBiZjMsIDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUsXG4gIDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYsIDB4MTQyOTI5NjcsIDB4MGEwZTZlNzAsXG4gIDB4MjdiNzBhODUsIDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYsXG4gIDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQsIDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYsXG4gIDB4NjUwYTczNTQsIDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgsXG4gIDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IsXG4gIDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQsIDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEsXG4gIDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEsIDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzAsXG4gIDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTAsXG4gIDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgsXG4gIDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgsIDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMsXG4gIDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgsXG4gIDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMsIDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IsXG4gIDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMsXG4gIDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsIDB4NDMxNzJmNjAsXG4gIDB4ODRjODc4MTQsIDB4YTFmMGFiNzIsIDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMsXG4gIDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgsIDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTksXG4gIDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIsXG4gIDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcsXG4gIDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUsIDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgsXG4gIDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsIDB4YTJjODk4YTYsXG4gIDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUsIDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIsXG4gIDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMsXG4gIDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMsXG4gIDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYsIDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEsXG4gIDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMsIDB4NmM0NDE5OGMsIDB4NGE0NzU4MTdcbl07XG5cbmZ1bmN0aW9uIGNyeXB0b19oYXNoYmxvY2tzX2hsKGhoLCBobCwgbSwgbikge1xuICB2YXIgd2ggPSBuZXcgSW50MzJBcnJheSgxNiksIHdsID0gbmV3IEludDMyQXJyYXkoMTYpLFxuICAgICAgYmgwLCBiaDEsIGJoMiwgYmgzLCBiaDQsIGJoNSwgYmg2LCBiaDcsXG4gICAgICBibDAsIGJsMSwgYmwyLCBibDMsIGJsNCwgYmw1LCBibDYsIGJsNyxcbiAgICAgIHRoLCB0bCwgaSwgaiwgaCwgbCwgYSwgYiwgYywgZDtcblxuICB2YXIgYWgwID0gaGhbMF0sXG4gICAgICBhaDEgPSBoaFsxXSxcbiAgICAgIGFoMiA9IGhoWzJdLFxuICAgICAgYWgzID0gaGhbM10sXG4gICAgICBhaDQgPSBoaFs0XSxcbiAgICAgIGFoNSA9IGhoWzVdLFxuICAgICAgYWg2ID0gaGhbNl0sXG4gICAgICBhaDcgPSBoaFs3XSxcblxuICAgICAgYWwwID0gaGxbMF0sXG4gICAgICBhbDEgPSBobFsxXSxcbiAgICAgIGFsMiA9IGhsWzJdLFxuICAgICAgYWwzID0gaGxbM10sXG4gICAgICBhbDQgPSBobFs0XSxcbiAgICAgIGFsNSA9IGhsWzVdLFxuICAgICAgYWw2ID0gaGxbNl0sXG4gICAgICBhbDcgPSBobFs3XTtcblxuICB2YXIgcG9zID0gMDtcbiAgd2hpbGUgKG4gPj0gMTI4KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGogPSA4ICogaSArIHBvcztcbiAgICAgIHdoW2ldID0gKG1baiswXSA8PCAyNCkgfCAobVtqKzFdIDw8IDE2KSB8IChtW2orMl0gPDwgOCkgfCBtW2orM107XG4gICAgICB3bFtpXSA9IChtW2orNF0gPDwgMjQpIHwgKG1bais1XSA8PCAxNikgfCAobVtqKzZdIDw8IDgpIHwgbVtqKzddO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykge1xuICAgICAgYmgwID0gYWgwO1xuICAgICAgYmgxID0gYWgxO1xuICAgICAgYmgyID0gYWgyO1xuICAgICAgYmgzID0gYWgzO1xuICAgICAgYmg0ID0gYWg0O1xuICAgICAgYmg1ID0gYWg1O1xuICAgICAgYmg2ID0gYWg2O1xuICAgICAgYmg3ID0gYWg3O1xuXG4gICAgICBibDAgPSBhbDA7XG4gICAgICBibDEgPSBhbDE7XG4gICAgICBibDIgPSBhbDI7XG4gICAgICBibDMgPSBhbDM7XG4gICAgICBibDQgPSBhbDQ7XG4gICAgICBibDUgPSBhbDU7XG4gICAgICBibDYgPSBhbDY7XG4gICAgICBibDcgPSBhbDc7XG5cbiAgICAgIC8vIGFkZFxuICAgICAgaCA9IGFoNztcbiAgICAgIGwgPSBhbDc7XG5cbiAgICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgICBjID0gaCAmIDB4ZmZmZjsgZCA9IGggPj4+IDE2O1xuXG4gICAgICAvLyBTaWdtYTFcbiAgICAgIGggPSAoKGFoNCA+Pj4gMTQpIHwgKGFsNCA8PCAoMzItMTQpKSkgXiAoKGFoNCA+Pj4gMTgpIHwgKGFsNCA8PCAoMzItMTgpKSkgXiAoKGFsNCA+Pj4gKDQxLTMyKSkgfCAoYWg0IDw8ICgzMi0oNDEtMzIpKSkpO1xuICAgICAgbCA9ICgoYWw0ID4+PiAxNCkgfCAoYWg0IDw8ICgzMi0xNCkpKSBeICgoYWw0ID4+PiAxOCkgfCAoYWg0IDw8ICgzMi0xOCkpKSBeICgoYWg0ID4+PiAoNDEtMzIpKSB8IChhbDQgPDwgKDMyLSg0MS0zMikpKSk7XG5cbiAgICAgIGEgKz0gbCAmIDB4ZmZmZjsgYiArPSBsID4+PiAxNjtcbiAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgLy8gQ2hcbiAgICAgIGggPSAoYWg0ICYgYWg1KSBeICh+YWg0ICYgYWg2KTtcbiAgICAgIGwgPSAoYWw0ICYgYWw1KSBeICh+YWw0ICYgYWw2KTtcblxuICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICAvLyBLXG4gICAgICBoID0gS1tpKjJdO1xuICAgICAgbCA9IEtbaSoyKzFdO1xuXG4gICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICBjICs9IGggJiAweGZmZmY7IGQgKz0gaCA+Pj4gMTY7XG5cbiAgICAgIC8vIHdcbiAgICAgIGggPSB3aFtpJTE2XTtcbiAgICAgIGwgPSB3bFtpJTE2XTtcblxuICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICBiICs9IGEgPj4+IDE2O1xuICAgICAgYyArPSBiID4+PiAxNjtcbiAgICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICAgIHRoID0gYyAmIDB4ZmZmZiB8IGQgPDwgMTY7XG4gICAgICB0bCA9IGEgJiAweGZmZmYgfCBiIDw8IDE2O1xuXG4gICAgICAvLyBhZGRcbiAgICAgIGggPSB0aDtcbiAgICAgIGwgPSB0bDtcblxuICAgICAgYSA9IGwgJiAweGZmZmY7IGIgPSBsID4+PiAxNjtcbiAgICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICAgIC8vIFNpZ21hMFxuICAgICAgaCA9ICgoYWgwID4+PiAyOCkgfCAoYWwwIDw8ICgzMi0yOCkpKSBeICgoYWwwID4+PiAoMzQtMzIpKSB8IChhaDAgPDwgKDMyLSgzNC0zMikpKSkgXiAoKGFsMCA+Pj4gKDM5LTMyKSkgfCAoYWgwIDw8ICgzMi0oMzktMzIpKSkpO1xuICAgICAgbCA9ICgoYWwwID4+PiAyOCkgfCAoYWgwIDw8ICgzMi0yOCkpKSBeICgoYWgwID4+PiAoMzQtMzIpKSB8IChhbDAgPDwgKDMyLSgzNC0zMikpKSkgXiAoKGFoMCA+Pj4gKDM5LTMyKSkgfCAoYWwwIDw8ICgzMi0oMzktMzIpKSkpO1xuXG4gICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICBjICs9IGggJiAweGZmZmY7IGQgKz0gaCA+Pj4gMTY7XG5cbiAgICAgIC8vIE1halxuICAgICAgaCA9IChhaDAgJiBhaDEpIF4gKGFoMCAmIGFoMikgXiAoYWgxICYgYWgyKTtcbiAgICAgIGwgPSAoYWwwICYgYWwxKSBeIChhbDAgJiBhbDIpIF4gKGFsMSAmIGFsMik7XG5cbiAgICAgIGEgKz0gbCAmIDB4ZmZmZjsgYiArPSBsID4+PiAxNjtcbiAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgYiArPSBhID4+PiAxNjtcbiAgICAgIGMgKz0gYiA+Pj4gMTY7XG4gICAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgICBiaDcgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgICBibDcgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICAgIC8vIGFkZFxuICAgICAgaCA9IGJoMztcbiAgICAgIGwgPSBibDM7XG5cbiAgICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgICBjID0gaCAmIDB4ZmZmZjsgZCA9IGggPj4+IDE2O1xuXG4gICAgICBoID0gdGg7XG4gICAgICBsID0gdGw7XG5cbiAgICAgIGEgKz0gbCAmIDB4ZmZmZjsgYiArPSBsID4+PiAxNjtcbiAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgYiArPSBhID4+PiAxNjtcbiAgICAgIGMgKz0gYiA+Pj4gMTY7XG4gICAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgICBiaDMgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgICBibDMgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICAgIGFoMSA9IGJoMDtcbiAgICAgIGFoMiA9IGJoMTtcbiAgICAgIGFoMyA9IGJoMjtcbiAgICAgIGFoNCA9IGJoMztcbiAgICAgIGFoNSA9IGJoNDtcbiAgICAgIGFoNiA9IGJoNTtcbiAgICAgIGFoNyA9IGJoNjtcbiAgICAgIGFoMCA9IGJoNztcblxuICAgICAgYWwxID0gYmwwO1xuICAgICAgYWwyID0gYmwxO1xuICAgICAgYWwzID0gYmwyO1xuICAgICAgYWw0ID0gYmwzO1xuICAgICAgYWw1ID0gYmw0O1xuICAgICAgYWw2ID0gYmw1O1xuICAgICAgYWw3ID0gYmw2O1xuICAgICAgYWwwID0gYmw3O1xuXG4gICAgICBpZiAoaSUxNiA9PT0gMTUpIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHtcbiAgICAgICAgICAvLyBhZGRcbiAgICAgICAgICBoID0gd2hbal07XG4gICAgICAgICAgbCA9IHdsW2pdO1xuXG4gICAgICAgICAgYSA9IGwgJiAweGZmZmY7IGIgPSBsID4+PiAxNjtcbiAgICAgICAgICBjID0gaCAmIDB4ZmZmZjsgZCA9IGggPj4+IDE2O1xuXG4gICAgICAgICAgaCA9IHdoWyhqKzkpJTE2XTtcbiAgICAgICAgICBsID0gd2xbKGorOSklMTZdO1xuXG4gICAgICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgICAgIC8vIHNpZ21hMFxuICAgICAgICAgIHRoID0gd2hbKGorMSklMTZdO1xuICAgICAgICAgIHRsID0gd2xbKGorMSklMTZdO1xuICAgICAgICAgIGggPSAoKHRoID4+PiAxKSB8ICh0bCA8PCAoMzItMSkpKSBeICgodGggPj4+IDgpIHwgKHRsIDw8ICgzMi04KSkpIF4gKHRoID4+PiA3KTtcbiAgICAgICAgICBsID0gKCh0bCA+Pj4gMSkgfCAodGggPDwgKDMyLTEpKSkgXiAoKHRsID4+PiA4KSB8ICh0aCA8PCAoMzItOCkpKSBeICgodGwgPj4+IDcpIHwgKHRoIDw8ICgzMi03KSkpO1xuXG4gICAgICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgICAgIC8vIHNpZ21hMVxuICAgICAgICAgIHRoID0gd2hbKGorMTQpJTE2XTtcbiAgICAgICAgICB0bCA9IHdsWyhqKzE0KSUxNl07XG4gICAgICAgICAgaCA9ICgodGggPj4+IDE5KSB8ICh0bCA8PCAoMzItMTkpKSkgXiAoKHRsID4+PiAoNjEtMzIpKSB8ICh0aCA8PCAoMzItKDYxLTMyKSkpKSBeICh0aCA+Pj4gNik7XG4gICAgICAgICAgbCA9ICgodGwgPj4+IDE5KSB8ICh0aCA8PCAoMzItMTkpKSkgXiAoKHRoID4+PiAoNjEtMzIpKSB8ICh0bCA8PCAoMzItKDYxLTMyKSkpKSBeICgodGwgPj4+IDYpIHwgKHRoIDw8ICgzMi02KSkpO1xuXG4gICAgICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgICAgICAgYyArPSBiID4+PiAxNjtcbiAgICAgICAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgICAgICAgd2hbal0gPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgICAgICAgd2xbal0gPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGRcbiAgICBoID0gYWgwO1xuICAgIGwgPSBhbDA7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbMF07XG4gICAgbCA9IGhsWzBdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbMF0gPSBhaDAgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbMF0gPSBhbDAgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWgxO1xuICAgIGwgPSBhbDE7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbMV07XG4gICAgbCA9IGhsWzFdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbMV0gPSBhaDEgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbMV0gPSBhbDEgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWgyO1xuICAgIGwgPSBhbDI7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbMl07XG4gICAgbCA9IGhsWzJdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbMl0gPSBhaDIgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbMl0gPSBhbDIgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWgzO1xuICAgIGwgPSBhbDM7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbM107XG4gICAgbCA9IGhsWzNdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbM10gPSBhaDMgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbM10gPSBhbDMgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWg0O1xuICAgIGwgPSBhbDQ7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbNF07XG4gICAgbCA9IGhsWzRdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbNF0gPSBhaDQgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbNF0gPSBhbDQgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWg1O1xuICAgIGwgPSBhbDU7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbNV07XG4gICAgbCA9IGhsWzVdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbNV0gPSBhaDUgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbNV0gPSBhbDUgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWg2O1xuICAgIGwgPSBhbDY7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbNl07XG4gICAgbCA9IGhsWzZdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbNl0gPSBhaDYgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbNl0gPSBhbDYgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWg3O1xuICAgIGwgPSBhbDc7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbN107XG4gICAgbCA9IGhsWzddO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbN10gPSBhaDcgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbN10gPSBhbDcgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBwb3MgKz0gMTI4O1xuICAgIG4gLT0gMTI4O1xuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19oYXNoKG91dCwgbSwgbikge1xuICB2YXIgaGggPSBuZXcgSW50MzJBcnJheSg4KSxcbiAgICAgIGhsID0gbmV3IEludDMyQXJyYXkoOCksXG4gICAgICB4ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KSxcbiAgICAgIGksIGIgPSBuO1xuXG4gIGhoWzBdID0gMHg2YTA5ZTY2NztcbiAgaGhbMV0gPSAweGJiNjdhZTg1O1xuICBoaFsyXSA9IDB4M2M2ZWYzNzI7XG4gIGhoWzNdID0gMHhhNTRmZjUzYTtcbiAgaGhbNF0gPSAweDUxMGU1MjdmO1xuICBoaFs1XSA9IDB4OWIwNTY4OGM7XG4gIGhoWzZdID0gMHgxZjgzZDlhYjtcbiAgaGhbN10gPSAweDViZTBjZDE5O1xuXG4gIGhsWzBdID0gMHhmM2JjYzkwODtcbiAgaGxbMV0gPSAweDg0Y2FhNzNiO1xuICBobFsyXSA9IDB4ZmU5NGY4MmI7XG4gIGhsWzNdID0gMHg1ZjFkMzZmMTtcbiAgaGxbNF0gPSAweGFkZTY4MmQxO1xuICBobFs1XSA9IDB4MmIzZTZjMWY7XG4gIGhsWzZdID0gMHhmYjQxYmQ2YjtcbiAgaGxbN10gPSAweDEzN2UyMTc5O1xuXG4gIGNyeXB0b19oYXNoYmxvY2tzX2hsKGhoLCBobCwgbSwgbik7XG4gIG4gJT0gMTI4O1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHhbaV0gPSBtW2ItbitpXTtcbiAgeFtuXSA9IDEyODtcblxuICBuID0gMjU2LTEyOCoobjwxMTI/MTowKTtcbiAgeFtuLTldID0gMDtcbiAgdHM2NCh4LCBuLTgsICAoYiAvIDB4MjAwMDAwMDApIHwgMCwgYiA8PCAzKTtcbiAgY3J5cHRvX2hhc2hibG9ja3NfaGwoaGgsIGhsLCB4LCBuKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB0czY0KG91dCwgOCppLCBoaFtpXSwgaGxbaV0pO1xuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBhZGQocCwgcSkge1xuICB2YXIgYSA9IGdmKCksIGIgPSBnZigpLCBjID0gZ2YoKSxcbiAgICAgIGQgPSBnZigpLCBlID0gZ2YoKSwgZiA9IGdmKCksXG4gICAgICBnID0gZ2YoKSwgaCA9IGdmKCksIHQgPSBnZigpO1xuXG4gIFooYSwgcFsxXSwgcFswXSk7XG4gIFoodCwgcVsxXSwgcVswXSk7XG4gIE0oYSwgYSwgdCk7XG4gIEEoYiwgcFswXSwgcFsxXSk7XG4gIEEodCwgcVswXSwgcVsxXSk7XG4gIE0oYiwgYiwgdCk7XG4gIE0oYywgcFszXSwgcVszXSk7XG4gIE0oYywgYywgRDIpO1xuICBNKGQsIHBbMl0sIHFbMl0pO1xuICBBKGQsIGQsIGQpO1xuICBaKGUsIGIsIGEpO1xuICBaKGYsIGQsIGMpO1xuICBBKGcsIGQsIGMpO1xuICBBKGgsIGIsIGEpO1xuXG4gIE0ocFswXSwgZSwgZik7XG4gIE0ocFsxXSwgaCwgZyk7XG4gIE0ocFsyXSwgZywgZik7XG4gIE0ocFszXSwgZSwgaCk7XG59XG5cbmZ1bmN0aW9uIGNzd2FwKHAsIHEsIGIpIHtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBzZWwyNTUxOShwW2ldLCBxW2ldLCBiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYWNrKHIsIHApIHtcbiAgdmFyIHR4ID0gZ2YoKSwgdHkgPSBnZigpLCB6aSA9IGdmKCk7XG4gIGludjI1NTE5KHppLCBwWzJdKTtcbiAgTSh0eCwgcFswXSwgemkpO1xuICBNKHR5LCBwWzFdLCB6aSk7XG4gIHBhY2syNTUxOShyLCB0eSk7XG4gIHJbMzFdIF49IHBhcjI1NTE5KHR4KSA8PCA3O1xufVxuXG5mdW5jdGlvbiBzY2FsYXJtdWx0KHAsIHEsIHMpIHtcbiAgdmFyIGIsIGk7XG4gIHNldDI1NTE5KHBbMF0sIGdmMCk7XG4gIHNldDI1NTE5KHBbMV0sIGdmMSk7XG4gIHNldDI1NTE5KHBbMl0sIGdmMSk7XG4gIHNldDI1NTE5KHBbM10sIGdmMCk7XG4gIGZvciAoaSA9IDI1NTsgaSA+PSAwOyAtLWkpIHtcbiAgICBiID0gKHNbKGkvOCl8MF0gPj4gKGkmNykpICYgMTtcbiAgICBjc3dhcChwLCBxLCBiKTtcbiAgICBhZGQocSwgcCk7XG4gICAgYWRkKHAsIHApO1xuICAgIGNzd2FwKHAsIHEsIGIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjYWxhcmJhc2UocCwgcykge1xuICB2YXIgcSA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXTtcbiAgc2V0MjU1MTkocVswXSwgWCk7XG4gIHNldDI1NTE5KHFbMV0sIFkpO1xuICBzZXQyNTUxOShxWzJdLCBnZjEpO1xuICBNKHFbM10sIFgsIFkpO1xuICBzY2FsYXJtdWx0KHAsIHEsIHMpO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fc2lnbl9rZXlwYWlyKHBrLCBzaywgc2VlZGVkKSB7XG4gIHZhciBkID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgcCA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXTtcbiAgdmFyIGk7XG5cbiAgaWYgKCFzZWVkZWQpIHJhbmRvbWJ5dGVzKHNrLCAzMik7XG4gIGNyeXB0b19oYXNoKGQsIHNrLCAzMik7XG4gIGRbMF0gJj0gMjQ4O1xuICBkWzMxXSAmPSAxMjc7XG4gIGRbMzFdIHw9IDY0O1xuXG4gIHNjYWxhcmJhc2UocCwgZCk7XG4gIHBhY2socGssIHApO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSBza1tpKzMyXSA9IHBrW2ldO1xuICByZXR1cm4gMDtcbn1cblxudmFyIEwgPSBuZXcgRmxvYXQ2NEFycmF5KFsweGVkLCAweGQzLCAweGY1LCAweDVjLCAweDFhLCAweDYzLCAweDEyLCAweDU4LCAweGQ2LCAweDljLCAweGY3LCAweGEyLCAweGRlLCAweGY5LCAweGRlLCAweDE0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDEwXSk7XG5cbmZ1bmN0aW9uIG1vZEwociwgeCkge1xuICB2YXIgY2FycnksIGksIGosIGs7XG4gIGZvciAoaSA9IDYzOyBpID49IDMyOyAtLWkpIHtcbiAgICBjYXJyeSA9IDA7XG4gICAgZm9yIChqID0gaSAtIDMyLCBrID0gaSAtIDEyOyBqIDwgazsgKytqKSB7XG4gICAgICB4W2pdICs9IGNhcnJ5IC0gMTYgKiB4W2ldICogTFtqIC0gKGkgLSAzMildO1xuICAgICAgY2FycnkgPSAoeFtqXSArIDEyOCkgPj4gODtcbiAgICAgIHhbal0gLT0gY2FycnkgKiAyNTY7XG4gICAgfVxuICAgIHhbal0gKz0gY2Fycnk7XG4gICAgeFtpXSA9IDA7XG4gIH1cbiAgY2FycnkgPSAwO1xuICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykge1xuICAgIHhbal0gKz0gY2FycnkgLSAoeFszMV0gPj4gNCkgKiBMW2pdO1xuICAgIGNhcnJ5ID0geFtqXSA+PiA4O1xuICAgIHhbal0gJj0gMjU1O1xuICB9XG4gIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB4W2pdIC09IGNhcnJ5ICogTFtqXTtcbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICB4W2krMV0gKz0geFtpXSA+PiA4O1xuICAgIHJbaV0gPSB4W2ldICYgMjU1O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZShyKSB7XG4gIHZhciB4ID0gbmV3IEZsb2F0NjRBcnJheSg2NCksIGk7XG4gIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB4W2ldID0gcltpXTtcbiAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHJbaV0gPSAwO1xuICBtb2RMKHIsIHgpO1xufVxuXG4vLyBOb3RlOiBkaWZmZXJlbmNlIGZyb20gQyAtIHNtbGVuIHJldHVybmVkLCBub3QgcGFzc2VkIGFzIGFyZ3VtZW50LlxuZnVuY3Rpb24gY3J5cHRvX3NpZ24oc20sIG0sIG4sIHNrKSB7XG4gIHZhciBkID0gbmV3IFVpbnQ4QXJyYXkoNjQpLCBoID0gbmV3IFVpbnQ4QXJyYXkoNjQpLCByID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgaSwgaiwgeCA9IG5ldyBGbG9hdDY0QXJyYXkoNjQpO1xuICB2YXIgcCA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXTtcblxuICBjcnlwdG9faGFzaChkLCBzaywgMzIpO1xuICBkWzBdICY9IDI0ODtcbiAgZFszMV0gJj0gMTI3O1xuICBkWzMxXSB8PSA2NDtcblxuICB2YXIgc21sZW4gPSBuICsgNjQ7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHNtWzY0ICsgaV0gPSBtW2ldO1xuICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgc21bMzIgKyBpXSA9IGRbMzIgKyBpXTtcblxuICBjcnlwdG9faGFzaChyLCBzbS5zdWJhcnJheSgzMiksIG4rMzIpO1xuICByZWR1Y2Uocik7XG4gIHNjYWxhcmJhc2UocCwgcik7XG4gIHBhY2soc20sIHApO1xuXG4gIGZvciAoaSA9IDMyOyBpIDwgNjQ7IGkrKykgc21baV0gPSBza1tpXTtcbiAgY3J5cHRvX2hhc2goaCwgc20sIG4gKyA2NCk7XG4gIHJlZHVjZShoKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeFtpXSA9IDA7XG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB4W2ldID0gcltpXTtcbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykge1xuICAgICAgeFtpK2pdICs9IGhbaV0gKiBkW2pdO1xuICAgIH1cbiAgfVxuXG4gIG1vZEwoc20uc3ViYXJyYXkoMzIpLCB4KTtcbiAgcmV0dXJuIHNtbGVuO1xufVxuXG5mdW5jdGlvbiB1bnBhY2tuZWcociwgcCkge1xuICB2YXIgdCA9IGdmKCksIGNoayA9IGdmKCksIG51bSA9IGdmKCksXG4gICAgICBkZW4gPSBnZigpLCBkZW4yID0gZ2YoKSwgZGVuNCA9IGdmKCksXG4gICAgICBkZW42ID0gZ2YoKTtcblxuICBzZXQyNTUxOShyWzJdLCBnZjEpO1xuICB1bnBhY2syNTUxOShyWzFdLCBwKTtcbiAgUyhudW0sIHJbMV0pO1xuICBNKGRlbiwgbnVtLCBEKTtcbiAgWihudW0sIG51bSwgclsyXSk7XG4gIEEoZGVuLCByWzJdLCBkZW4pO1xuXG4gIFMoZGVuMiwgZGVuKTtcbiAgUyhkZW40LCBkZW4yKTtcbiAgTShkZW42LCBkZW40LCBkZW4yKTtcbiAgTSh0LCBkZW42LCBudW0pO1xuICBNKHQsIHQsIGRlbik7XG5cbiAgcG93MjUyMyh0LCB0KTtcbiAgTSh0LCB0LCBudW0pO1xuICBNKHQsIHQsIGRlbik7XG4gIE0odCwgdCwgZGVuKTtcbiAgTShyWzBdLCB0LCBkZW4pO1xuXG4gIFMoY2hrLCByWzBdKTtcbiAgTShjaGssIGNoaywgZGVuKTtcbiAgaWYgKG5lcTI1NTE5KGNoaywgbnVtKSkgTShyWzBdLCByWzBdLCBJKTtcblxuICBTKGNoaywgclswXSk7XG4gIE0oY2hrLCBjaGssIGRlbik7XG4gIGlmIChuZXEyNTUxOShjaGssIG51bSkpIHJldHVybiAtMTtcblxuICBpZiAocGFyMjU1MTkoclswXSkgPT09IChwWzMxXT4+NykpIFooclswXSwgZ2YwLCByWzBdKTtcblxuICBNKHJbM10sIHJbMF0sIHJbMV0pO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3NpZ25fb3BlbihtLCBzbSwgbiwgcGspIHtcbiAgdmFyIGksIG1sZW47XG4gIHZhciB0ID0gbmV3IFVpbnQ4QXJyYXkoMzIpLCBoID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgcCA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXSxcbiAgICAgIHEgPSBbZ2YoKSwgZ2YoKSwgZ2YoKSwgZ2YoKV07XG5cbiAgbWxlbiA9IC0xO1xuICBpZiAobiA8IDY0KSByZXR1cm4gLTE7XG5cbiAgaWYgKHVucGFja25lZyhxLCBwaykpIHJldHVybiAtMTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBtW2ldID0gc21baV07XG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSBtW2krMzJdID0gcGtbaV07XG4gIGNyeXB0b19oYXNoKGgsIG0sIG4pO1xuICByZWR1Y2UoaCk7XG4gIHNjYWxhcm11bHQocCwgcSwgaCk7XG5cbiAgc2NhbGFyYmFzZShxLCBzbS5zdWJhcnJheSgzMikpO1xuICBhZGQocCwgcSk7XG4gIHBhY2sodCwgcCk7XG5cbiAgbiAtPSA2NDtcbiAgaWYgKGNyeXB0b192ZXJpZnlfMzIoc20sIDAsIHQsIDApKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgbVtpXSA9IDA7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgbVtpXSA9IHNtW2kgKyA2NF07XG4gIG1sZW4gPSBuO1xuICByZXR1cm4gbWxlbjtcbn1cblxudmFyIGNyeXB0b19zZWNyZXRib3hfS0VZQllURVMgPSAzMixcbiAgICBjcnlwdG9fc2VjcmV0Ym94X05PTkNFQllURVMgPSAyNCxcbiAgICBjcnlwdG9fc2VjcmV0Ym94X1pFUk9CWVRFUyA9IDMyLFxuICAgIGNyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTID0gMTYsXG4gICAgY3J5cHRvX3NjYWxhcm11bHRfQllURVMgPSAzMixcbiAgICBjcnlwdG9fc2NhbGFybXVsdF9TQ0FMQVJCWVRFUyA9IDMyLFxuICAgIGNyeXB0b19ib3hfUFVCTElDS0VZQllURVMgPSAzMixcbiAgICBjcnlwdG9fYm94X1NFQ1JFVEtFWUJZVEVTID0gMzIsXG4gICAgY3J5cHRvX2JveF9CRUZPUkVOTUJZVEVTID0gMzIsXG4gICAgY3J5cHRvX2JveF9OT05DRUJZVEVTID0gY3J5cHRvX3NlY3JldGJveF9OT05DRUJZVEVTLFxuICAgIGNyeXB0b19ib3hfWkVST0JZVEVTID0gY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVMsXG4gICAgY3J5cHRvX2JveF9CT1haRVJPQllURVMgPSBjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUyxcbiAgICBjcnlwdG9fc2lnbl9CWVRFUyA9IDY0LFxuICAgIGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTID0gMzIsXG4gICAgY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMgPSA2NCxcbiAgICBjcnlwdG9fc2lnbl9TRUVEQllURVMgPSAzMixcbiAgICBjcnlwdG9faGFzaF9CWVRFUyA9IDY0O1xuXG5uYWNsLmxvd2xldmVsID0ge1xuICBjcnlwdG9fY29yZV9oc2Fsc2EyMDogY3J5cHRvX2NvcmVfaHNhbHNhMjAsXG4gIGNyeXB0b19zdHJlYW1feG9yOiBjcnlwdG9fc3RyZWFtX3hvcixcbiAgY3J5cHRvX3N0cmVhbTogY3J5cHRvX3N0cmVhbSxcbiAgY3J5cHRvX3N0cmVhbV9zYWxzYTIwX3hvcjogY3J5cHRvX3N0cmVhbV9zYWxzYTIwX3hvcixcbiAgY3J5cHRvX3N0cmVhbV9zYWxzYTIwOiBjcnlwdG9fc3RyZWFtX3NhbHNhMjAsXG4gIGNyeXB0b19vbmV0aW1lYXV0aDogY3J5cHRvX29uZXRpbWVhdXRoLFxuICBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5OiBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5LFxuICBjcnlwdG9fdmVyaWZ5XzE2OiBjcnlwdG9fdmVyaWZ5XzE2LFxuICBjcnlwdG9fdmVyaWZ5XzMyOiBjcnlwdG9fdmVyaWZ5XzMyLFxuICBjcnlwdG9fc2VjcmV0Ym94OiBjcnlwdG9fc2VjcmV0Ym94LFxuICBjcnlwdG9fc2VjcmV0Ym94X29wZW46IGNyeXB0b19zZWNyZXRib3hfb3BlbixcbiAgY3J5cHRvX3NjYWxhcm11bHQ6IGNyeXB0b19zY2FsYXJtdWx0LFxuICBjcnlwdG9fc2NhbGFybXVsdF9iYXNlOiBjcnlwdG9fc2NhbGFybXVsdF9iYXNlLFxuICBjcnlwdG9fYm94X2JlZm9yZW5tOiBjcnlwdG9fYm94X2JlZm9yZW5tLFxuICBjcnlwdG9fYm94X2FmdGVybm06IGNyeXB0b19ib3hfYWZ0ZXJubSxcbiAgY3J5cHRvX2JveDogY3J5cHRvX2JveCxcbiAgY3J5cHRvX2JveF9vcGVuOiBjcnlwdG9fYm94X29wZW4sXG4gIGNyeXB0b19ib3hfa2V5cGFpcjogY3J5cHRvX2JveF9rZXlwYWlyLFxuICBjcnlwdG9faGFzaDogY3J5cHRvX2hhc2gsXG4gIGNyeXB0b19zaWduOiBjcnlwdG9fc2lnbixcbiAgY3J5cHRvX3NpZ25fa2V5cGFpcjogY3J5cHRvX3NpZ25fa2V5cGFpcixcbiAgY3J5cHRvX3NpZ25fb3BlbjogY3J5cHRvX3NpZ25fb3BlbixcblxuICBjcnlwdG9fc2VjcmV0Ym94X0tFWUJZVEVTOiBjcnlwdG9fc2VjcmV0Ym94X0tFWUJZVEVTLFxuICBjcnlwdG9fc2VjcmV0Ym94X05PTkNFQllURVM6IGNyeXB0b19zZWNyZXRib3hfTk9OQ0VCWVRFUyxcbiAgY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVM6IGNyeXB0b19zZWNyZXRib3hfWkVST0JZVEVTLFxuICBjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUzogY3J5cHRvX3NlY3JldGJveF9CT1haRVJPQllURVMsXG4gIGNyeXB0b19zY2FsYXJtdWx0X0JZVEVTOiBjcnlwdG9fc2NhbGFybXVsdF9CWVRFUyxcbiAgY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVM6IGNyeXB0b19zY2FsYXJtdWx0X1NDQUxBUkJZVEVTLFxuICBjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTOiBjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTLFxuICBjcnlwdG9fYm94X1NFQ1JFVEtFWUJZVEVTOiBjcnlwdG9fYm94X1NFQ1JFVEtFWUJZVEVTLFxuICBjcnlwdG9fYm94X0JFRk9SRU5NQllURVM6IGNyeXB0b19ib3hfQkVGT1JFTk1CWVRFUyxcbiAgY3J5cHRvX2JveF9OT05DRUJZVEVTOiBjcnlwdG9fYm94X05PTkNFQllURVMsXG4gIGNyeXB0b19ib3hfWkVST0JZVEVTOiBjcnlwdG9fYm94X1pFUk9CWVRFUyxcbiAgY3J5cHRvX2JveF9CT1haRVJPQllURVM6IGNyeXB0b19ib3hfQk9YWkVST0JZVEVTLFxuICBjcnlwdG9fc2lnbl9CWVRFUzogY3J5cHRvX3NpZ25fQllURVMsXG4gIGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTOiBjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFUyxcbiAgY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVM6IGNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTLFxuICBjcnlwdG9fc2lnbl9TRUVEQllURVM6IGNyeXB0b19zaWduX1NFRURCWVRFUyxcbiAgY3J5cHRvX2hhc2hfQllURVM6IGNyeXB0b19oYXNoX0JZVEVTXG59O1xuXG4vKiBIaWdoLWxldmVsIEFQSSAqL1xuXG5mdW5jdGlvbiBjaGVja0xlbmd0aHMoaywgbikge1xuICBpZiAoay5sZW5ndGggIT09IGNyeXB0b19zZWNyZXRib3hfS0VZQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIGtleSBzaXplJyk7XG4gIGlmIChuLmxlbmd0aCAhPT0gY3J5cHRvX3NlY3JldGJveF9OT05DRUJZVEVTKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBub25jZSBzaXplJyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQm94TGVuZ3Rocyhwaywgc2spIHtcbiAgaWYgKHBrLmxlbmd0aCAhPT0gY3J5cHRvX2JveF9QVUJMSUNLRVlCWVRFUykgdGhyb3cgbmV3IEVycm9yKCdiYWQgcHVibGljIGtleSBzaXplJyk7XG4gIGlmIChzay5sZW5ndGggIT09IGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIHNlY3JldCBrZXkgc2l6ZScpO1xufVxuXG5mdW5jdGlvbiBjaGVja0FycmF5VHlwZXMoKSB7XG4gIHZhciB0LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgIGlmICgodCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHNbaV0pKSAhPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKVxuICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZXhwZWN0ZWQgdHlwZSAnICsgdCArICcsIHVzZSBVaW50OEFycmF5Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW51cChhcnIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIGFycltpXSA9IDA7XG59XG5cbi8vIFRPRE86IENvbXBsZXRlbHkgcmVtb3ZlIHRoaXMgaW4gdjAuMTUuXG5pZiAoIW5hY2wudXRpbCkge1xuICBuYWNsLnV0aWwgPSB7fTtcbiAgbmFjbC51dGlsLmRlY29kZVVURjggPSBuYWNsLnV0aWwuZW5jb2RlVVRGOCA9IG5hY2wudXRpbC5lbmNvZGVCYXNlNjQgPSBuYWNsLnV0aWwuZGVjb2RlQmFzZTY0ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCduYWNsLnV0aWwgbW92ZWQgaW50byBzZXBhcmF0ZSBwYWNrYWdlOiBodHRwczovL2dpdGh1Yi5jb20vZGNoZXN0L3R3ZWV0bmFjbC11dGlsLWpzJyk7XG4gIH07XG59XG5cbm5hY2wucmFuZG9tQnl0ZXMgPSBmdW5jdGlvbihuKSB7XG4gIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIHJhbmRvbWJ5dGVzKGIsIG4pO1xuICByZXR1cm4gYjtcbn07XG5cbm5hY2wuc2VjcmV0Ym94ID0gZnVuY3Rpb24obXNnLCBub25jZSwga2V5KSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhtc2csIG5vbmNlLCBrZXkpO1xuICBjaGVja0xlbmd0aHMoa2V5LCBub25jZSk7XG4gIHZhciBtID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVMgKyBtc2cubGVuZ3RoKTtcbiAgdmFyIGMgPSBuZXcgVWludDhBcnJheShtLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSBtW2krY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVNdID0gbXNnW2ldO1xuICBjcnlwdG9fc2VjcmV0Ym94KGMsIG0sIG0ubGVuZ3RoLCBub25jZSwga2V5KTtcbiAgcmV0dXJuIGMuc3ViYXJyYXkoY3J5cHRvX3NlY3JldGJveF9CT1haRVJPQllURVMpO1xufTtcblxubmFjbC5zZWNyZXRib3gub3BlbiA9IGZ1bmN0aW9uKGJveCwgbm9uY2UsIGtleSkge1xuICBjaGVja0FycmF5VHlwZXMoYm94LCBub25jZSwga2V5KTtcbiAgY2hlY2tMZW5ndGhzKGtleSwgbm9uY2UpO1xuICB2YXIgYyA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTICsgYm94Lmxlbmd0aCk7XG4gIHZhciBtID0gbmV3IFVpbnQ4QXJyYXkoYy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJveC5sZW5ndGg7IGkrKykgY1tpK2NyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTXSA9IGJveFtpXTtcbiAgaWYgKGMubGVuZ3RoIDwgMzIpIHJldHVybiBmYWxzZTtcbiAgaWYgKGNyeXB0b19zZWNyZXRib3hfb3BlbihtLCBjLCBjLmxlbmd0aCwgbm9uY2UsIGtleSkgIT09IDApIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG0uc3ViYXJyYXkoY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVMpO1xufTtcblxubmFjbC5zZWNyZXRib3gua2V5TGVuZ3RoID0gY3J5cHRvX3NlY3JldGJveF9LRVlCWVRFUztcbm5hY2wuc2VjcmV0Ym94Lm5vbmNlTGVuZ3RoID0gY3J5cHRvX3NlY3JldGJveF9OT05DRUJZVEVTO1xubmFjbC5zZWNyZXRib3gub3ZlcmhlYWRMZW5ndGggPSBjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUztcblxubmFjbC5zY2FsYXJNdWx0ID0gZnVuY3Rpb24obiwgcCkge1xuICBjaGVja0FycmF5VHlwZXMobiwgcCk7XG4gIGlmIChuLmxlbmd0aCAhPT0gY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIG4gc2l6ZScpO1xuICBpZiAocC5sZW5ndGggIT09IGNyeXB0b19zY2FsYXJtdWx0X0JZVEVTKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwIHNpemUnKTtcbiAgdmFyIHEgPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2NhbGFybXVsdF9CWVRFUyk7XG4gIGNyeXB0b19zY2FsYXJtdWx0KHEsIG4sIHApO1xuICByZXR1cm4gcTtcbn07XG5cbm5hY2wuc2NhbGFyTXVsdC5iYXNlID0gZnVuY3Rpb24obikge1xuICBjaGVja0FycmF5VHlwZXMobik7XG4gIGlmIChuLmxlbmd0aCAhPT0gY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIG4gc2l6ZScpO1xuICB2YXIgcSA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zY2FsYXJtdWx0X0JZVEVTKTtcbiAgY3J5cHRvX3NjYWxhcm11bHRfYmFzZShxLCBuKTtcbiAgcmV0dXJuIHE7XG59O1xuXG5uYWNsLnNjYWxhck11bHQuc2NhbGFyTGVuZ3RoID0gY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVM7XG5uYWNsLnNjYWxhck11bHQuZ3JvdXBFbGVtZW50TGVuZ3RoID0gY3J5cHRvX3NjYWxhcm11bHRfQllURVM7XG5cbm5hY2wuYm94ID0gZnVuY3Rpb24obXNnLCBub25jZSwgcHVibGljS2V5LCBzZWNyZXRLZXkpIHtcbiAgdmFyIGsgPSBuYWNsLmJveC5iZWZvcmUocHVibGljS2V5LCBzZWNyZXRLZXkpO1xuICByZXR1cm4gbmFjbC5zZWNyZXRib3gobXNnLCBub25jZSwgayk7XG59O1xuXG5uYWNsLmJveC5iZWZvcmUgPSBmdW5jdGlvbihwdWJsaWNLZXksIHNlY3JldEtleSkge1xuICBjaGVja0FycmF5VHlwZXMocHVibGljS2V5LCBzZWNyZXRLZXkpO1xuICBjaGVja0JveExlbmd0aHMocHVibGljS2V5LCBzZWNyZXRLZXkpO1xuICB2YXIgayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19ib3hfQkVGT1JFTk1CWVRFUyk7XG4gIGNyeXB0b19ib3hfYmVmb3Jlbm0oaywgcHVibGljS2V5LCBzZWNyZXRLZXkpO1xuICByZXR1cm4gaztcbn07XG5cbm5hY2wuYm94LmFmdGVyID0gbmFjbC5zZWNyZXRib3g7XG5cbm5hY2wuYm94Lm9wZW4gPSBmdW5jdGlvbihtc2csIG5vbmNlLCBwdWJsaWNLZXksIHNlY3JldEtleSkge1xuICB2YXIgayA9IG5hY2wuYm94LmJlZm9yZShwdWJsaWNLZXksIHNlY3JldEtleSk7XG4gIHJldHVybiBuYWNsLnNlY3JldGJveC5vcGVuKG1zZywgbm9uY2UsIGspO1xufTtcblxubmFjbC5ib3gub3Blbi5hZnRlciA9IG5hY2wuc2VjcmV0Ym94Lm9wZW47XG5cbm5hY2wuYm94LmtleVBhaXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX2JveF9QVUJMSUNLRVlCWVRFUyk7XG4gIHZhciBzayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVMpO1xuICBjcnlwdG9fYm94X2tleXBhaXIocGssIHNrKTtcbiAgcmV0dXJuIHtwdWJsaWNLZXk6IHBrLCBzZWNyZXRLZXk6IHNrfTtcbn07XG5cbm5hY2wuYm94LmtleVBhaXIuZnJvbVNlY3JldEtleSA9IGZ1bmN0aW9uKHNlY3JldEtleSkge1xuICBjaGVja0FycmF5VHlwZXMoc2VjcmV0S2V5KTtcbiAgaWYgKHNlY3JldEtleS5sZW5ndGggIT09IGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2VjcmV0IGtleSBzaXplJyk7XG4gIHZhciBwayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19ib3hfUFVCTElDS0VZQllURVMpO1xuICBjcnlwdG9fc2NhbGFybXVsdF9iYXNlKHBrLCBzZWNyZXRLZXkpO1xuICByZXR1cm4ge3B1YmxpY0tleTogcGssIHNlY3JldEtleTogbmV3IFVpbnQ4QXJyYXkoc2VjcmV0S2V5KX07XG59O1xuXG5uYWNsLmJveC5wdWJsaWNLZXlMZW5ndGggPSBjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTO1xubmFjbC5ib3guc2VjcmV0S2V5TGVuZ3RoID0gY3J5cHRvX2JveF9TRUNSRVRLRVlCWVRFUztcbm5hY2wuYm94LnNoYXJlZEtleUxlbmd0aCA9IGNyeXB0b19ib3hfQkVGT1JFTk1CWVRFUztcbm5hY2wuYm94Lm5vbmNlTGVuZ3RoID0gY3J5cHRvX2JveF9OT05DRUJZVEVTO1xubmFjbC5ib3gub3ZlcmhlYWRMZW5ndGggPSBuYWNsLnNlY3JldGJveC5vdmVyaGVhZExlbmd0aDtcblxubmFjbC5zaWduID0gZnVuY3Rpb24obXNnLCBzZWNyZXRLZXkpIHtcbiAgY2hlY2tBcnJheVR5cGVzKG1zZywgc2VjcmV0S2V5KTtcbiAgaWYgKHNlY3JldEtleS5sZW5ndGggIT09IGNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTKVxuICAgIHRocm93IG5ldyBFcnJvcignYmFkIHNlY3JldCBrZXkgc2l6ZScpO1xuICB2YXIgc2lnbmVkTXNnID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fQllURVMrbXNnLmxlbmd0aCk7XG4gIGNyeXB0b19zaWduKHNpZ25lZE1zZywgbXNnLCBtc2cubGVuZ3RoLCBzZWNyZXRLZXkpO1xuICByZXR1cm4gc2lnbmVkTXNnO1xufTtcblxubmFjbC5zaWduLm9wZW4gPSBmdW5jdGlvbihzaWduZWRNc2csIHB1YmxpY0tleSkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25hY2wuc2lnbi5vcGVuIGFjY2VwdHMgMiBhcmd1bWVudHM7IGRpZCB5b3UgbWVhbiB0byB1c2UgbmFjbC5zaWduLmRldGFjaGVkLnZlcmlmeT8nKTtcbiAgY2hlY2tBcnJheVR5cGVzKHNpZ25lZE1zZywgcHVibGljS2V5KTtcbiAgaWYgKHB1YmxpY0tleS5sZW5ndGggIT09IGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKVxuICAgIHRocm93IG5ldyBFcnJvcignYmFkIHB1YmxpYyBrZXkgc2l6ZScpO1xuICB2YXIgdG1wID0gbmV3IFVpbnQ4QXJyYXkoc2lnbmVkTXNnLmxlbmd0aCk7XG4gIHZhciBtbGVuID0gY3J5cHRvX3NpZ25fb3Blbih0bXAsIHNpZ25lZE1zZywgc2lnbmVkTXNnLmxlbmd0aCwgcHVibGljS2V5KTtcbiAgaWYgKG1sZW4gPCAwKSByZXR1cm4gbnVsbDtcbiAgdmFyIG0gPSBuZXcgVWludDhBcnJheShtbGVuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtLmxlbmd0aDsgaSsrKSBtW2ldID0gdG1wW2ldO1xuICByZXR1cm4gbTtcbn07XG5cbm5hY2wuc2lnbi5kZXRhY2hlZCA9IGZ1bmN0aW9uKG1zZywgc2VjcmV0S2V5KSB7XG4gIHZhciBzaWduZWRNc2cgPSBuYWNsLnNpZ24obXNnLCBzZWNyZXRLZXkpO1xuICB2YXIgc2lnID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fQllURVMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZy5sZW5ndGg7IGkrKykgc2lnW2ldID0gc2lnbmVkTXNnW2ldO1xuICByZXR1cm4gc2lnO1xufTtcblxubmFjbC5zaWduLmRldGFjaGVkLnZlcmlmeSA9IGZ1bmN0aW9uKG1zZywgc2lnLCBwdWJsaWNLZXkpIHtcbiAgY2hlY2tBcnJheVR5cGVzKG1zZywgc2lnLCBwdWJsaWNLZXkpO1xuICBpZiAoc2lnLmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2lnbmF0dXJlIHNpemUnKTtcbiAgaWYgKHB1YmxpY0tleS5sZW5ndGggIT09IGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKVxuICAgIHRocm93IG5ldyBFcnJvcignYmFkIHB1YmxpYyBrZXkgc2l6ZScpO1xuICB2YXIgc20gPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2lnbl9CWVRFUyArIG1zZy5sZW5ndGgpO1xuICB2YXIgbSA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX0JZVEVTICsgbXNnLmxlbmd0aCk7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgY3J5cHRvX3NpZ25fQllURVM7IGkrKykgc21baV0gPSBzaWdbaV07XG4gIGZvciAoaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHNtW2krY3J5cHRvX3NpZ25fQllURVNdID0gbXNnW2ldO1xuICByZXR1cm4gKGNyeXB0b19zaWduX29wZW4obSwgc20sIHNtLmxlbmd0aCwgcHVibGljS2V5KSA+PSAwKTtcbn07XG5cbm5hY2wuc2lnbi5rZXlQYWlyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKTtcbiAgdmFyIHNrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMpO1xuICBjcnlwdG9fc2lnbl9rZXlwYWlyKHBrLCBzayk7XG4gIHJldHVybiB7cHVibGljS2V5OiBwaywgc2VjcmV0S2V5OiBza307XG59O1xuXG5uYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VjcmV0S2V5ID0gZnVuY3Rpb24oc2VjcmV0S2V5KSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhzZWNyZXRLZXkpO1xuICBpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2VjcmV0IGtleSBzaXplJyk7XG4gIHZhciBwayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBway5sZW5ndGg7IGkrKykgcGtbaV0gPSBzZWNyZXRLZXlbMzIraV07XG4gIHJldHVybiB7cHVibGljS2V5OiBwaywgc2VjcmV0S2V5OiBuZXcgVWludDhBcnJheShzZWNyZXRLZXkpfTtcbn07XG5cbm5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkID0gZnVuY3Rpb24oc2VlZCkge1xuICBjaGVja0FycmF5VHlwZXMoc2VlZCk7XG4gIGlmIChzZWVkLmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fU0VFREJZVEVTKVxuICAgIHRocm93IG5ldyBFcnJvcignYmFkIHNlZWQgc2l6ZScpO1xuICB2YXIgcGsgPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFUyk7XG4gIHZhciBzayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKSBza1tpXSA9IHNlZWRbaV07XG4gIGNyeXB0b19zaWduX2tleXBhaXIocGssIHNrLCB0cnVlKTtcbiAgcmV0dXJuIHtwdWJsaWNLZXk6IHBrLCBzZWNyZXRLZXk6IHNrfTtcbn07XG5cbm5hY2wuc2lnbi5wdWJsaWNLZXlMZW5ndGggPSBjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFUztcbm5hY2wuc2lnbi5zZWNyZXRLZXlMZW5ndGggPSBjcnlwdG9fc2lnbl9TRUNSRVRLRVlCWVRFUztcbm5hY2wuc2lnbi5zZWVkTGVuZ3RoID0gY3J5cHRvX3NpZ25fU0VFREJZVEVTO1xubmFjbC5zaWduLnNpZ25hdHVyZUxlbmd0aCA9IGNyeXB0b19zaWduX0JZVEVTO1xuXG5uYWNsLmhhc2ggPSBmdW5jdGlvbihtc2cpIHtcbiAgY2hlY2tBcnJheVR5cGVzKG1zZyk7XG4gIHZhciBoID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX2hhc2hfQllURVMpO1xuICBjcnlwdG9faGFzaChoLCBtc2csIG1zZy5sZW5ndGgpO1xuICByZXR1cm4gaDtcbn07XG5cbm5hY2wuaGFzaC5oYXNoTGVuZ3RoID0gY3J5cHRvX2hhc2hfQllURVM7XG5cbm5hY2wudmVyaWZ5ID0gZnVuY3Rpb24oeCwgeSkge1xuICBjaGVja0FycmF5VHlwZXMoeCwgeSk7XG4gIC8vIFplcm8gbGVuZ3RoIGFyZ3VtZW50cyBhcmUgY29uc2lkZXJlZCBub3QgZXF1YWwuXG4gIGlmICh4Lmxlbmd0aCA9PT0gMCB8fCB5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAodm4oeCwgMCwgeSwgMCwgeC5sZW5ndGgpID09PSAwKSA/IHRydWUgOiBmYWxzZTtcbn07XG5cbm5hY2wuc2V0UFJORyA9IGZ1bmN0aW9uKGZuKSB7XG4gIHJhbmRvbWJ5dGVzID0gZm47XG59O1xuXG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluaXRpYWxpemUgUFJORyBpZiBlbnZpcm9ubWVudCBwcm92aWRlcyBDU1BSTkcuXG4gIC8vIElmIG5vdCwgbWV0aG9kcyBjYWxsaW5nIHJhbmRvbWJ5dGVzIHdpbGwgdGhyb3cuXG4gIHZhciBjcnlwdG8gPSB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyAoc2VsZi5jcnlwdG8gfHwgc2VsZi5tc0NyeXB0bykgOiBudWxsO1xuICBpZiAoY3J5cHRvICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBCcm93c2Vycy5cbiAgICB2YXIgUVVPVEEgPSA2NTUzNjtcbiAgICBuYWNsLnNldFBSTkcoZnVuY3Rpb24oeCwgbikge1xuICAgICAgdmFyIGksIHYgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICs9IFFVT1RBKSB7XG4gICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXModi5zdWJhcnJheShpLCBpICsgTWF0aC5taW4obiAtIGksIFFVT1RBKSkpO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeFtpXSA9IHZbaV07XG4gICAgICBjbGVhbnVwKHYpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIE5vZGUuanMuXG4gICAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgaWYgKGNyeXB0byAmJiBjcnlwdG8ucmFuZG9tQnl0ZXMpIHtcbiAgICAgIG5hY2wuc2V0UFJORyhmdW5jdGlvbih4LCBuKSB7XG4gICAgICAgIHZhciBpLCB2ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKG4pO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB4W2ldID0gdltpXTtcbiAgICAgICAgY2xlYW51cCh2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSkoKTtcblxufSkodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMgPyBtb2R1bGUuZXhwb3J0cyA6IChzZWxmLm5hY2wgPSBzZWxmLm5hY2wgfHwge30pKTtcbiIsICIvLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGJ1ZmZlclNwbGl0OiBidWZmZXJTcGxpdCxcblx0YWRkUlNBTWlzc2luZzogYWRkUlNBTWlzc2luZyxcblx0Y2FsY3VsYXRlRFNBUHVibGljOiBjYWxjdWxhdGVEU0FQdWJsaWMsXG5cdGNhbGN1bGF0ZUVEMjU1MTlQdWJsaWM6IGNhbGN1bGF0ZUVEMjU1MTlQdWJsaWMsXG5cdGNhbGN1bGF0ZVgyNTUxOVB1YmxpYzogY2FsY3VsYXRlWDI1NTE5UHVibGljLFxuXHRtcE5vcm1hbGl6ZTogbXBOb3JtYWxpemUsXG5cdG1wRGVub3JtYWxpemU6IG1wRGVub3JtYWxpemUsXG5cdGVjTm9ybWFsaXplOiBlY05vcm1hbGl6ZSxcblx0Y291bnRaZXJvczogY291bnRaZXJvcyxcblx0YXNzZXJ0Q29tcGF0aWJsZTogYXNzZXJ0Q29tcGF0aWJsZSxcblx0aXNDb21wYXRpYmxlOiBpc0NvbXBhdGlibGUsXG5cdG9wZW5zc2xLZXlEZXJpdjogb3BlbnNzbEtleURlcml2LFxuXHRvcGVuc3NoQ2lwaGVySW5mbzogb3BlbnNzaENpcGhlckluZm8sXG5cdHB1YmxpY0Zyb21Qcml2YXRlRUNEU0E6IHB1YmxpY0Zyb21Qcml2YXRlRUNEU0EsXG5cdHplcm9QYWRUb0xlbmd0aDogemVyb1BhZFRvTGVuZ3RoLFxuXHR3cml0ZUJpdFN0cmluZzogd3JpdGVCaXRTdHJpbmcsXG5cdHJlYWRCaXRTdHJpbmc6IHJlYWRCaXRTdHJpbmcsXG5cdHBia2RmMjogcGJrZGYyXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4vcHJpdmF0ZS1rZXknKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuL2tleScpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuL2FsZ3MnKTtcbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMScpO1xuXG52YXIgZWMgPSByZXF1aXJlKCdlY2MtanNibi9saWIvZWMnKTtcbnZhciBqc2JuID0gcmVxdWlyZSgnanNibicpLkJpZ0ludGVnZXI7XG52YXIgbmFjbCA9IHJlcXVpcmUoJ3R3ZWV0bmFjbCcpO1xuXG52YXIgTUFYX0NMQVNTX0RFUFRIID0gMztcblxuZnVuY3Rpb24gaXNDb21wYXRpYmxlKG9iaiwga2xhc3MsIG5lZWRWZXIpIHtcblx0aWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHRpZiAobmVlZFZlciA9PT0gdW5kZWZpbmVkKVxuXHRcdG5lZWRWZXIgPSBrbGFzcy5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbjtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIGtsYXNzICYmXG5cdCAgICBrbGFzcy5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvblswXSA9PSBuZWVkVmVyWzBdKVxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXHR2YXIgZGVwdGggPSAwO1xuXHR3aGlsZSAocHJvdG8uY29uc3RydWN0b3IubmFtZSAhPT0ga2xhc3MubmFtZSkge1xuXHRcdHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0XHRpZiAoIXByb3RvIHx8ICsrZGVwdGggPiBNQVhfQ0xBU1NfREVQVEgpXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXHRpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSAhPT0ga2xhc3MubmFtZSlcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0dmFyIHZlciA9IHByb3RvLl9zc2hwa0FwaVZlcnNpb247XG5cdGlmICh2ZXIgPT09IHVuZGVmaW5lZClcblx0XHR2ZXIgPSBrbGFzcy5fb2xkVmVyc2lvbkRldGVjdChvYmopO1xuXHRpZiAodmVyWzBdICE9IG5lZWRWZXJbMF0gfHwgdmVyWzFdIDwgbmVlZFZlclsxXSlcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0cmV0dXJuICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29tcGF0aWJsZShvYmosIGtsYXNzLCBuZWVkVmVyLCBuYW1lKSB7XG5cdGlmIChuYW1lID09PSB1bmRlZmluZWQpXG5cdFx0bmFtZSA9ICdvYmplY3QnO1xuXHRhc3NlcnQub2sob2JqLCBuYW1lICsgJyBtdXN0IG5vdCBiZSBudWxsJyk7XG5cdGFzc2VydC5vYmplY3Qob2JqLCBuYW1lICsgJyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuXHRpZiAobmVlZFZlciA9PT0gdW5kZWZpbmVkKVxuXHRcdG5lZWRWZXIgPSBrbGFzcy5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbjtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIGtsYXNzICYmXG5cdCAgICBrbGFzcy5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvblswXSA9PSBuZWVkVmVyWzBdKVxuXHRcdHJldHVybjtcblx0dmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cdHZhciBkZXB0aCA9IDA7XG5cdHdoaWxlIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lICE9PSBrbGFzcy5uYW1lKSB7XG5cdFx0cHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHRcdGFzc2VydC5vayhwcm90byAmJiArK2RlcHRoIDw9IE1BWF9DTEFTU19ERVBUSCxcblx0XHQgICAgbmFtZSArICcgbXVzdCBiZSBhICcgKyBrbGFzcy5uYW1lICsgJyBpbnN0YW5jZScpO1xuXHR9XG5cdGFzc2VydC5zdHJpY3RFcXVhbChwcm90by5jb25zdHJ1Y3Rvci5uYW1lLCBrbGFzcy5uYW1lLFxuXHQgICAgbmFtZSArICcgbXVzdCBiZSBhICcgKyBrbGFzcy5uYW1lICsgJyBpbnN0YW5jZScpO1xuXHR2YXIgdmVyID0gcHJvdG8uX3NzaHBrQXBpVmVyc2lvbjtcblx0aWYgKHZlciA9PT0gdW5kZWZpbmVkKVxuXHRcdHZlciA9IGtsYXNzLl9vbGRWZXJzaW9uRGV0ZWN0KG9iaik7XG5cdGFzc2VydC5vayh2ZXJbMF0gPT0gbmVlZFZlclswXSAmJiB2ZXJbMV0gPj0gbmVlZFZlclsxXSxcblx0ICAgIG5hbWUgKyAnIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoICcgKyBrbGFzcy5uYW1lICsgJyBrbGFzcyAnICtcblx0ICAgICd2ZXJzaW9uICcgKyBuZWVkVmVyWzBdICsgJy4nICsgbmVlZFZlclsxXSk7XG59XG5cbnZhciBDSVBIRVJfTEVOID0ge1xuXHQnZGVzLWVkZTMtY2JjJzogeyBrZXk6IDI0LCBpdjogOCB9LFxuXHQnYWVzLTEyOC1jYmMnOiB7IGtleTogMTYsIGl2OiAxNiB9LFxuXHQnYWVzLTI1Ni1jYmMnOiB7IGtleTogMzIsIGl2OiAxNiB9XG59O1xudmFyIFBLQ1M1X1NBTFRfTEVOID0gODtcblxuZnVuY3Rpb24gb3BlbnNzbEtleURlcml2KGNpcGhlciwgc2FsdCwgcGFzc3BocmFzZSwgY291bnQpIHtcblx0YXNzZXJ0LmJ1ZmZlcihzYWx0LCAnc2FsdCcpO1xuXHRhc3NlcnQuYnVmZmVyKHBhc3NwaHJhc2UsICdwYXNzcGhyYXNlJyk7XG5cdGFzc2VydC5udW1iZXIoY291bnQsICdpdGVyYXRpb24gY291bnQnKTtcblxuXHR2YXIgY2xlbiA9IENJUEhFUl9MRU5bY2lwaGVyXTtcblx0YXNzZXJ0Lm9iamVjdChjbGVuLCAnc3VwcG9ydGVkIGNpcGhlcicpO1xuXG5cdHNhbHQgPSBzYWx0LnNsaWNlKDAsIFBLQ1M1X1NBTFRfTEVOKTtcblxuXHR2YXIgRCwgRF9wcmV2LCBidWZzO1xuXHR2YXIgbWF0ZXJpYWwgPSBCdWZmZXIuYWxsb2MoMCk7XG5cdHdoaWxlIChtYXRlcmlhbC5sZW5ndGggPCBjbGVuLmtleSArIGNsZW4uaXYpIHtcblx0XHRidWZzID0gW107XG5cdFx0aWYgKERfcHJldilcblx0XHRcdGJ1ZnMucHVzaChEX3ByZXYpO1xuXHRcdGJ1ZnMucHVzaChwYXNzcGhyYXNlKTtcblx0XHRidWZzLnB1c2goc2FsdCk7XG5cdFx0RCA9IEJ1ZmZlci5jb25jYXQoYnVmcyk7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjb3VudDsgKytqKVxuXHRcdFx0RCA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoRCkuZGlnZXN0KCk7XG5cdFx0bWF0ZXJpYWwgPSBCdWZmZXIuY29uY2F0KFttYXRlcmlhbCwgRF0pO1xuXHRcdERfcHJldiA9IEQ7XG5cdH1cblxuXHRyZXR1cm4gKHtcblx0ICAgIGtleTogbWF0ZXJpYWwuc2xpY2UoMCwgY2xlbi5rZXkpLFxuXHQgICAgaXY6IG1hdGVyaWFsLnNsaWNlKGNsZW4ua2V5LCBjbGVuLmtleSArIGNsZW4uaXYpXG5cdH0pO1xufVxuXG4vKiBTZWU6IFJGQzI4OTggKi9cbmZ1bmN0aW9uIHBia2RmMihoYXNoQWxnLCBzYWx0LCBpdGVyYXRpb25zLCBzaXplLCBwYXNzcGhyYXNlKSB7XG5cdHZhciBoa2V5ID0gQnVmZmVyLmFsbG9jKHNhbHQubGVuZ3RoICsgNCk7XG5cdHNhbHQuY29weShoa2V5KTtcblxuXHR2YXIgZ2VuID0gMCwgdHMgPSBbXTtcblx0dmFyIGkgPSAxO1xuXHR3aGlsZSAoZ2VuIDwgc2l6ZSkge1xuXHRcdHZhciB0ID0gVChpKyspO1xuXHRcdGdlbiArPSB0Lmxlbmd0aDtcblx0XHR0cy5wdXNoKHQpO1xuXHR9XG5cdHJldHVybiAoQnVmZmVyLmNvbmNhdCh0cykuc2xpY2UoMCwgc2l6ZSkpO1xuXG5cdGZ1bmN0aW9uIFQoSSkge1xuXHRcdGhrZXkud3JpdGVVSW50MzJCRShJLCBoa2V5Lmxlbmd0aCAtIDQpO1xuXG5cdFx0dmFyIGhtYWMgPSBjcnlwdG8uY3JlYXRlSG1hYyhoYXNoQWxnLCBwYXNzcGhyYXNlKTtcblx0XHRobWFjLnVwZGF0ZShoa2V5KTtcblxuXHRcdHZhciBUaSA9IGhtYWMuZGlnZXN0KCk7XG5cdFx0dmFyIFVjID0gVGk7XG5cdFx0dmFyIGMgPSAxO1xuXHRcdHdoaWxlIChjKysgPCBpdGVyYXRpb25zKSB7XG5cdFx0XHRobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoaGFzaEFsZywgcGFzc3BocmFzZSk7XG5cdFx0XHRobWFjLnVwZGF0ZShVYyk7XG5cdFx0XHRVYyA9IGhtYWMuZGlnZXN0KCk7XG5cdFx0XHRmb3IgKHZhciB4ID0gMDsgeCA8IFRpLmxlbmd0aDsgKyt4KVxuXHRcdFx0XHRUaVt4XSBePSBVY1t4XTtcblx0XHR9XG5cdFx0cmV0dXJuIChUaSk7XG5cdH1cbn1cblxuLyogQ291bnQgbGVhZGluZyB6ZXJvIGJpdHMgb24gYSBidWZmZXIgKi9cbmZ1bmN0aW9uIGNvdW50WmVyb3MoYnVmKSB7XG5cdHZhciBvID0gMCwgb2JpdCA9IDg7XG5cdHdoaWxlIChvIDwgYnVmLmxlbmd0aCkge1xuXHRcdHZhciBtYXNrID0gKDEgPDwgb2JpdCk7XG5cdFx0aWYgKChidWZbb10gJiBtYXNrKSA9PT0gbWFzaylcblx0XHRcdGJyZWFrO1xuXHRcdG9iaXQtLTtcblx0XHRpZiAob2JpdCA8IDApIHtcblx0XHRcdG8rKztcblx0XHRcdG9iaXQgPSA4O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gKG8qOCArICg4IC0gb2JpdCkgLSAxKTtcbn1cblxuZnVuY3Rpb24gYnVmZmVyU3BsaXQoYnVmLCBjaHIpIHtcblx0YXNzZXJ0LmJ1ZmZlcihidWYpO1xuXHRhc3NlcnQuc3RyaW5nKGNocik7XG5cblx0dmFyIHBhcnRzID0gW107XG5cdHZhciBsYXN0UGFydCA9IDA7XG5cdHZhciBtYXRjaGVzID0gMDtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyArK2kpIHtcblx0XHRpZiAoYnVmW2ldID09PSBjaHIuY2hhckNvZGVBdChtYXRjaGVzKSlcblx0XHRcdCsrbWF0Y2hlcztcblx0XHRlbHNlIGlmIChidWZbaV0gPT09IGNoci5jaGFyQ29kZUF0KDApKVxuXHRcdFx0bWF0Y2hlcyA9IDE7XG5cdFx0ZWxzZVxuXHRcdFx0bWF0Y2hlcyA9IDA7XG5cblx0XHRpZiAobWF0Y2hlcyA+PSBjaHIubGVuZ3RoKSB7XG5cdFx0XHR2YXIgbmV3UGFydCA9IGkgKyAxO1xuXHRcdFx0cGFydHMucHVzaChidWYuc2xpY2UobGFzdFBhcnQsIG5ld1BhcnQgLSBtYXRjaGVzKSk7XG5cdFx0XHRsYXN0UGFydCA9IG5ld1BhcnQ7XG5cdFx0XHRtYXRjaGVzID0gMDtcblx0XHR9XG5cdH1cblx0aWYgKGxhc3RQYXJ0IDw9IGJ1Zi5sZW5ndGgpXG5cdFx0cGFydHMucHVzaChidWYuc2xpY2UobGFzdFBhcnQsIGJ1Zi5sZW5ndGgpKTtcblxuXHRyZXR1cm4gKHBhcnRzKTtcbn1cblxuZnVuY3Rpb24gZWNOb3JtYWxpemUoYnVmLCBhZGRaZXJvKSB7XG5cdGFzc2VydC5idWZmZXIoYnVmKTtcblx0aWYgKGJ1ZlswXSA9PT0gMHgwMCAmJiBidWZbMV0gPT09IDB4MDQpIHtcblx0XHRpZiAoYWRkWmVybylcblx0XHRcdHJldHVybiAoYnVmKTtcblx0XHRyZXR1cm4gKGJ1Zi5zbGljZSgxKSk7XG5cdH0gZWxzZSBpZiAoYnVmWzBdID09PSAweDA0KSB7XG5cdFx0aWYgKCFhZGRaZXJvKVxuXHRcdFx0cmV0dXJuIChidWYpO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlIChidWZbMF0gPT09IDB4MDApXG5cdFx0XHRidWYgPSBidWYuc2xpY2UoMSk7XG5cdFx0aWYgKGJ1ZlswXSA9PT0gMHgwMiB8fCBidWZbMF0gPT09IDB4MDMpXG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdDb21wcmVzc2VkIGVsbGlwdGljIGN1cnZlIHBvaW50cyAnICtcblx0XHRcdCAgICAnYXJlIG5vdCBzdXBwb3J0ZWQnKSk7XG5cdFx0aWYgKGJ1ZlswXSAhPT0gMHgwNClcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIGVsbGlwdGljIGN1cnZlIHBvaW50JykpO1xuXHRcdGlmICghYWRkWmVybylcblx0XHRcdHJldHVybiAoYnVmKTtcblx0fVxuXHR2YXIgYiA9IEJ1ZmZlci5hbGxvYyhidWYubGVuZ3RoICsgMSk7XG5cdGJbMF0gPSAweDA7XG5cdGJ1Zi5jb3B5KGIsIDEpO1xuXHRyZXR1cm4gKGIpO1xufVxuXG5mdW5jdGlvbiByZWFkQml0U3RyaW5nKGRlciwgdGFnKSB7XG5cdGlmICh0YWcgPT09IHVuZGVmaW5lZClcblx0XHR0YWcgPSBhc24xLkJlci5CaXRTdHJpbmc7XG5cdHZhciBidWYgPSBkZXIucmVhZFN0cmluZyh0YWcsIHRydWUpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwoYnVmWzBdLCAweDAwLCAnYml0IHN0cmluZ3Mgd2l0aCB1bnVzZWQgYml0cyBhcmUgJyArXG5cdCAgICAnbm90IHN1cHBvcnRlZCAoMHgnICsgYnVmWzBdLnRvU3RyaW5nKDE2KSArICcpJyk7XG5cdHJldHVybiAoYnVmLnNsaWNlKDEpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVCaXRTdHJpbmcoZGVyLCBidWYsIHRhZykge1xuXHRpZiAodGFnID09PSB1bmRlZmluZWQpXG5cdFx0dGFnID0gYXNuMS5CZXIuQml0U3RyaW5nO1xuXHR2YXIgYiA9IEJ1ZmZlci5hbGxvYyhidWYubGVuZ3RoICsgMSk7XG5cdGJbMF0gPSAweDAwO1xuXHRidWYuY29weShiLCAxKTtcblx0ZGVyLndyaXRlQnVmZmVyKGIsIHRhZyk7XG59XG5cbmZ1bmN0aW9uIG1wTm9ybWFsaXplKGJ1Zikge1xuXHRhc3NlcnQuYnVmZmVyKGJ1Zik7XG5cdHdoaWxlIChidWYubGVuZ3RoID4gMSAmJiBidWZbMF0gPT09IDB4MDAgJiYgKGJ1ZlsxXSAmIDB4ODApID09PSAweDAwKVxuXHRcdGJ1ZiA9IGJ1Zi5zbGljZSgxKTtcblx0aWYgKChidWZbMF0gJiAweDgwKSA9PT0gMHg4MCkge1xuXHRcdHZhciBiID0gQnVmZmVyLmFsbG9jKGJ1Zi5sZW5ndGggKyAxKTtcblx0XHRiWzBdID0gMHgwMDtcblx0XHRidWYuY29weShiLCAxKTtcblx0XHRidWYgPSBiO1xuXHR9XG5cdHJldHVybiAoYnVmKTtcbn1cblxuZnVuY3Rpb24gbXBEZW5vcm1hbGl6ZShidWYpIHtcblx0YXNzZXJ0LmJ1ZmZlcihidWYpO1xuXHR3aGlsZSAoYnVmLmxlbmd0aCA+IDEgJiYgYnVmWzBdID09PSAweDAwKVxuXHRcdGJ1ZiA9IGJ1Zi5zbGljZSgxKTtcblx0cmV0dXJuIChidWYpO1xufVxuXG5mdW5jdGlvbiB6ZXJvUGFkVG9MZW5ndGgoYnVmLCBsZW4pIHtcblx0YXNzZXJ0LmJ1ZmZlcihidWYpO1xuXHRhc3NlcnQubnVtYmVyKGxlbik7XG5cdHdoaWxlIChidWYubGVuZ3RoID4gbGVuKSB7XG5cdFx0YXNzZXJ0LmVxdWFsKGJ1ZlswXSwgMHgwMCk7XG5cdFx0YnVmID0gYnVmLnNsaWNlKDEpO1xuXHR9XG5cdHdoaWxlIChidWYubGVuZ3RoIDwgbGVuKSB7XG5cdFx0dmFyIGIgPSBCdWZmZXIuYWxsb2MoYnVmLmxlbmd0aCArIDEpO1xuXHRcdGJbMF0gPSAweDAwO1xuXHRcdGJ1Zi5jb3B5KGIsIDEpO1xuXHRcdGJ1ZiA9IGI7XG5cdH1cblx0cmV0dXJuIChidWYpO1xufVxuXG5mdW5jdGlvbiBiaWdpbnRUb01wQnVmKGJpZ2ludCkge1xuXHR2YXIgYnVmID0gQnVmZmVyLmZyb20oYmlnaW50LnRvQnl0ZUFycmF5KCkpO1xuXHRidWYgPSBtcE5vcm1hbGl6ZShidWYpO1xuXHRyZXR1cm4gKGJ1Zik7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZURTQVB1YmxpYyhnLCBwLCB4KSB7XG5cdGFzc2VydC5idWZmZXIoZyk7XG5cdGFzc2VydC5idWZmZXIocCk7XG5cdGFzc2VydC5idWZmZXIoeCk7XG5cdGcgPSBuZXcganNibihnKTtcblx0cCA9IG5ldyBqc2JuKHApO1xuXHR4ID0gbmV3IGpzYm4oeCk7XG5cdHZhciB5ID0gZy5tb2RQb3coeCwgcCk7XG5cdHZhciB5YnVmID0gYmlnaW50VG9NcEJ1Zih5KTtcblx0cmV0dXJuICh5YnVmKTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlRUQyNTUxOVB1YmxpYyhrKSB7XG5cdGFzc2VydC5idWZmZXIoayk7XG5cblx0dmFyIGtwID0gbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQobmV3IFVpbnQ4QXJyYXkoaykpO1xuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKGtwLnB1YmxpY0tleSkpO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVYMjU1MTlQdWJsaWMoaykge1xuXHRhc3NlcnQuYnVmZmVyKGspO1xuXG5cdHZhciBrcCA9IG5hY2wuYm94LmtleVBhaXIuZnJvbVNlZWQobmV3IFVpbnQ4QXJyYXkoaykpO1xuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKGtwLnB1YmxpY0tleSkpO1xufVxuXG5mdW5jdGlvbiBhZGRSU0FNaXNzaW5nKGtleSkge1xuXHRhc3NlcnQub2JqZWN0KGtleSk7XG5cdGFzc2VydENvbXBhdGlibGUoa2V5LCBQcml2YXRlS2V5LCBbMSwgMV0pO1xuXG5cdHZhciBkID0gbmV3IGpzYm4oa2V5LnBhcnQuZC5kYXRhKTtcblx0dmFyIGJ1ZjtcblxuXHRpZiAoIWtleS5wYXJ0LmRtb2RwKSB7XG5cdFx0dmFyIHAgPSBuZXcganNibihrZXkucGFydC5wLmRhdGEpO1xuXHRcdHZhciBkbW9kcCA9IGQubW9kKHAuc3VidHJhY3QoMSkpO1xuXG5cdFx0YnVmID0gYmlnaW50VG9NcEJ1ZihkbW9kcCk7XG5cdFx0a2V5LnBhcnQuZG1vZHAgPSB7bmFtZTogJ2Rtb2RwJywgZGF0YTogYnVmfTtcblx0XHRrZXkucGFydHMucHVzaChrZXkucGFydC5kbW9kcCk7XG5cdH1cblx0aWYgKCFrZXkucGFydC5kbW9kcSkge1xuXHRcdHZhciBxID0gbmV3IGpzYm4oa2V5LnBhcnQucS5kYXRhKTtcblx0XHR2YXIgZG1vZHEgPSBkLm1vZChxLnN1YnRyYWN0KDEpKTtcblxuXHRcdGJ1ZiA9IGJpZ2ludFRvTXBCdWYoZG1vZHEpO1xuXHRcdGtleS5wYXJ0LmRtb2RxID0ge25hbWU6ICdkbW9kcScsIGRhdGE6IGJ1Zn07XG5cdFx0a2V5LnBhcnRzLnB1c2goa2V5LnBhcnQuZG1vZHEpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHB1YmxpY0Zyb21Qcml2YXRlRUNEU0EoY3VydmVOYW1lLCBwcml2KSB7XG5cdGFzc2VydC5zdHJpbmcoY3VydmVOYW1lLCAnY3VydmVOYW1lJyk7XG5cdGFzc2VydC5idWZmZXIocHJpdik7XG5cdHZhciBwYXJhbXMgPSBhbGdzLmN1cnZlc1tjdXJ2ZU5hbWVdO1xuXHR2YXIgcCA9IG5ldyBqc2JuKHBhcmFtcy5wKTtcblx0dmFyIGEgPSBuZXcganNibihwYXJhbXMuYSk7XG5cdHZhciBiID0gbmV3IGpzYm4ocGFyYW1zLmIpO1xuXHR2YXIgY3VydmUgPSBuZXcgZWMuRUNDdXJ2ZUZwKHAsIGEsIGIpO1xuXHR2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KHBhcmFtcy5HLnRvU3RyaW5nKCdoZXgnKSk7XG5cblx0dmFyIGQgPSBuZXcganNibihtcE5vcm1hbGl6ZShwcml2KSk7XG5cdHZhciBwdWIgPSBHLm11bHRpcGx5KGQpO1xuXHRwdWIgPSBCdWZmZXIuZnJvbShjdXJ2ZS5lbmNvZGVQb2ludEhleChwdWIpLCAnaGV4Jyk7XG5cblx0dmFyIHBhcnRzID0gW107XG5cdHBhcnRzLnB1c2goe25hbWU6ICdjdXJ2ZScsIGRhdGE6IEJ1ZmZlci5mcm9tKGN1cnZlTmFtZSl9KTtcblx0cGFydHMucHVzaCh7bmFtZTogJ1EnLCBkYXRhOiBwdWJ9KTtcblxuXHR2YXIga2V5ID0gbmV3IEtleSh7dHlwZTogJ2VjZHNhJywgY3VydmU6IGN1cnZlLCBwYXJ0czogcGFydHN9KTtcblx0cmV0dXJuIChrZXkpO1xufVxuXG5mdW5jdGlvbiBvcGVuc3NoQ2lwaGVySW5mbyhjaXBoZXIpIHtcblx0dmFyIGluZiA9IHt9O1xuXHRzd2l0Y2ggKGNpcGhlcikge1xuXHRjYXNlICczZGVzLWNiYyc6XG5cdFx0aW5mLmtleVNpemUgPSAyNDtcblx0XHRpbmYuYmxvY2tTaXplID0gODtcblx0XHRpbmYub3BlbnNzbE5hbWUgPSAnZGVzLWVkZTMtY2JjJztcblx0XHRicmVhaztcblx0Y2FzZSAnYmxvd2Zpc2gtY2JjJzpcblx0XHRpbmYua2V5U2l6ZSA9IDE2O1xuXHRcdGluZi5ibG9ja1NpemUgPSA4O1xuXHRcdGluZi5vcGVuc3NsTmFtZSA9ICdiZi1jYmMnO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdhZXMxMjgtY2JjJzpcblx0Y2FzZSAnYWVzMTI4LWN0cic6XG5cdGNhc2UgJ2FlczEyOC1nY21Ab3BlbnNzaC5jb20nOlxuXHRcdGluZi5rZXlTaXplID0gMTY7XG5cdFx0aW5mLmJsb2NrU2l6ZSA9IDE2O1xuXHRcdGluZi5vcGVuc3NsTmFtZSA9ICdhZXMtMTI4LScgKyBjaXBoZXIuc2xpY2UoNywgMTApO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdhZXMxOTItY2JjJzpcblx0Y2FzZSAnYWVzMTkyLWN0cic6XG5cdGNhc2UgJ2FlczE5Mi1nY21Ab3BlbnNzaC5jb20nOlxuXHRcdGluZi5rZXlTaXplID0gMjQ7XG5cdFx0aW5mLmJsb2NrU2l6ZSA9IDE2O1xuXHRcdGluZi5vcGVuc3NsTmFtZSA9ICdhZXMtMTkyLScgKyBjaXBoZXIuc2xpY2UoNywgMTApO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdhZXMyNTYtY2JjJzpcblx0Y2FzZSAnYWVzMjU2LWN0cic6XG5cdGNhc2UgJ2FlczI1Ni1nY21Ab3BlbnNzaC5jb20nOlxuXHRcdGluZi5rZXlTaXplID0gMzI7XG5cdFx0aW5mLmJsb2NrU2l6ZSA9IDE2O1xuXHRcdGluZi5vcGVuc3NsTmFtZSA9ICdhZXMtMjU2LScgKyBjaXBoZXIuc2xpY2UoNywgMTApO1xuXHRcdGJyZWFrO1xuXHRkZWZhdWx0OlxuXHRcdHRocm93IChuZXcgRXJyb3IoXG5cdFx0ICAgICdVbnN1cHBvcnRlZCBvcGVuc3NsIGNpcGhlciBcIicgKyBjaXBoZXIgKyAnXCInKSk7XG5cdH1cblx0cmV0dXJuIChpbmYpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFNTSEJ1ZmZlcjtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5mdW5jdGlvbiBTU0hCdWZmZXIob3B0cykge1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKVxuXHRcdGFzc2VydC5idWZmZXIob3B0cy5idWZmZXIsICdvcHRpb25zLmJ1ZmZlcicpO1xuXG5cdHRoaXMuX3NpemUgPSBvcHRzLmJ1ZmZlciA/IG9wdHMuYnVmZmVyLmxlbmd0aCA6IDEwMjQ7XG5cdHRoaXMuX2J1ZmZlciA9IG9wdHMuYnVmZmVyIHx8IEJ1ZmZlci5hbGxvYyh0aGlzLl9zaXplKTtcblx0dGhpcy5fb2Zmc2V0ID0gMDtcbn1cblxuU1NIQnVmZmVyLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICh0aGlzLl9idWZmZXIuc2xpY2UoMCwgdGhpcy5fb2Zmc2V0KSk7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLmF0RW5kID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gKHRoaXMuX29mZnNldCA+PSB0aGlzLl9idWZmZXIubGVuZ3RoKTtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUucmVtYWluZGVyID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gKHRoaXMuX2J1ZmZlci5zbGljZSh0aGlzLl9vZmZzZXQpKTtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uIChuKSB7XG5cdHRoaXMuX29mZnNldCArPSBuO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMuX3NpemUgKj0gMjtcblx0dmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyh0aGlzLl9zaXplKTtcblx0dGhpcy5fYnVmZmVyLmNvcHkoYnVmLCAwKTtcblx0dGhpcy5fYnVmZmVyID0gYnVmO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS5yZWFkUGFydCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICh7ZGF0YTogdGhpcy5yZWFkQnVmZmVyKCl9KTtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUucmVhZEJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGxlbiA9IHRoaXMuX2J1ZmZlci5yZWFkVUludDMyQkUodGhpcy5fb2Zmc2V0KTtcblx0dGhpcy5fb2Zmc2V0ICs9IDQ7XG5cdGFzc2VydC5vayh0aGlzLl9vZmZzZXQgKyBsZW4gPD0gdGhpcy5fYnVmZmVyLmxlbmd0aCxcblx0ICAgICdsZW5ndGggb3V0IG9mIGJvdW5kcyBhdCArMHgnICsgdGhpcy5fb2Zmc2V0LnRvU3RyaW5nKDE2KSArXG5cdCAgICAnIChkYXRhIHRydW5jYXRlZD8pJyk7XG5cdHZhciBidWYgPSB0aGlzLl9idWZmZXIuc2xpY2UodGhpcy5fb2Zmc2V0LCB0aGlzLl9vZmZzZXQgKyBsZW4pO1xuXHR0aGlzLl9vZmZzZXQgKz0gbGVuO1xuXHRyZXR1cm4gKGJ1Zik7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiAodGhpcy5yZWFkQnVmZmVyKCkudG9TdHJpbmcoKSk7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLnJlYWRDU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0O1xuXHR3aGlsZSAob2Zmc2V0IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCAmJlxuXHQgICAgdGhpcy5fYnVmZmVyW29mZnNldF0gIT09IDB4MDApXG5cdFx0b2Zmc2V0Kys7XG5cdGFzc2VydC5vayhvZmZzZXQgPCB0aGlzLl9idWZmZXIubGVuZ3RoLCAnYyBzdHJpbmcgZG9lcyBub3QgdGVybWluYXRlJyk7XG5cdHZhciBzdHIgPSB0aGlzLl9idWZmZXIuc2xpY2UodGhpcy5fb2Zmc2V0LCBvZmZzZXQpLnRvU3RyaW5nKCk7XG5cdHRoaXMuX29mZnNldCA9IG9mZnNldCArIDE7XG5cdHJldHVybiAoc3RyKTtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUucmVhZEludCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHYgPSB0aGlzLl9idWZmZXIucmVhZFVJbnQzMkJFKHRoaXMuX29mZnNldCk7XG5cdHRoaXMuX29mZnNldCArPSA0O1xuXHRyZXR1cm4gKHYpO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50NjQgPSBmdW5jdGlvbiAoKSB7XG5cdGFzc2VydC5vayh0aGlzLl9vZmZzZXQgKyA4IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCxcblx0ICAgICdidWZmZXIgbm90IGxvbmcgZW5vdWdoIHRvIHJlYWQgSW50NjQnKTtcblx0dmFyIHYgPSB0aGlzLl9idWZmZXIuc2xpY2UodGhpcy5fb2Zmc2V0LCB0aGlzLl9vZmZzZXQgKyA4KTtcblx0dGhpcy5fb2Zmc2V0ICs9IDg7XG5cdHJldHVybiAodik7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLnJlYWRDaGFyID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgdiA9IHRoaXMuX2J1ZmZlclt0aGlzLl9vZmZzZXQrK107XG5cdHJldHVybiAodik7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLndyaXRlQnVmZmVyID0gZnVuY3Rpb24gKGJ1Zikge1xuXHR3aGlsZSAodGhpcy5fb2Zmc2V0ICsgNCArIGJ1Zi5sZW5ndGggPiB0aGlzLl9zaXplKVxuXHRcdHRoaXMuZXhwYW5kKCk7XG5cdHRoaXMuX2J1ZmZlci53cml0ZVVJbnQzMkJFKGJ1Zi5sZW5ndGgsIHRoaXMuX29mZnNldCk7XG5cdHRoaXMuX29mZnNldCArPSA0O1xuXHRidWYuY29weSh0aGlzLl9idWZmZXIsIHRoaXMuX29mZnNldCk7XG5cdHRoaXMuX29mZnNldCArPSBidWYubGVuZ3RoO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uIChzdHIpIHtcblx0dGhpcy53cml0ZUJ1ZmZlcihCdWZmZXIuZnJvbShzdHIsICd1dGY4JykpO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS53cml0ZUNTdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdHdoaWxlICh0aGlzLl9vZmZzZXQgKyAxICsgc3RyLmxlbmd0aCA+IHRoaXMuX3NpemUpXG5cdFx0dGhpcy5leHBhbmQoKTtcblx0dGhpcy5fYnVmZmVyLndyaXRlKHN0ciwgdGhpcy5fb2Zmc2V0KTtcblx0dGhpcy5fb2Zmc2V0ICs9IHN0ci5sZW5ndGg7XG5cdHRoaXMuX2J1ZmZlclt0aGlzLl9vZmZzZXQrK10gPSAwO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS53cml0ZUludCA9IGZ1bmN0aW9uICh2KSB7XG5cdHdoaWxlICh0aGlzLl9vZmZzZXQgKyA0ID4gdGhpcy5fc2l6ZSlcblx0XHR0aGlzLmV4cGFuZCgpO1xuXHR0aGlzLl9idWZmZXIud3JpdGVVSW50MzJCRSh2LCB0aGlzLl9vZmZzZXQpO1xuXHR0aGlzLl9vZmZzZXQgKz0gNDtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ2NCA9IGZ1bmN0aW9uICh2KSB7XG5cdGFzc2VydC5idWZmZXIodiwgJ3ZhbHVlJyk7XG5cdGlmICh2Lmxlbmd0aCA+IDgpIHtcblx0XHR2YXIgbGVhZCA9IHYuc2xpY2UoMCwgdi5sZW5ndGggLSA4KTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlYWQubGVuZ3RoOyArK2kpIHtcblx0XHRcdGFzc2VydC5zdHJpY3RFcXVhbChsZWFkW2ldLCAwLFxuXHRcdFx0ICAgICdtdXN0IGZpdCBpbiA2NCBiaXRzIG9mIHByZWNpc2lvbicpO1xuXHRcdH1cblx0XHR2ID0gdi5zbGljZSh2Lmxlbmd0aCAtIDgsIHYubGVuZ3RoKTtcblx0fVxuXHR3aGlsZSAodGhpcy5fb2Zmc2V0ICsgOCA+IHRoaXMuX3NpemUpXG5cdFx0dGhpcy5leHBhbmQoKTtcblx0di5jb3B5KHRoaXMuX2J1ZmZlciwgdGhpcy5fb2Zmc2V0KTtcblx0dGhpcy5fb2Zmc2V0ICs9IDg7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLndyaXRlQ2hhciA9IGZ1bmN0aW9uICh2KSB7XG5cdHdoaWxlICh0aGlzLl9vZmZzZXQgKyAxID4gdGhpcy5fc2l6ZSlcblx0XHR0aGlzLmV4cGFuZCgpO1xuXHR0aGlzLl9idWZmZXJbdGhpcy5fb2Zmc2V0KytdID0gdjtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUud3JpdGVQYXJ0ID0gZnVuY3Rpb24gKHApIHtcblx0dGhpcy53cml0ZUJ1ZmZlcihwLmRhdGEpO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcblx0d2hpbGUgKHRoaXMuX29mZnNldCArIGJ1Zi5sZW5ndGggPiB0aGlzLl9zaXplKVxuXHRcdHRoaXMuZXhwYW5kKCk7XG5cdGJ1Zi5jb3B5KHRoaXMuX2J1ZmZlciwgdGhpcy5fb2Zmc2V0KTtcblx0dGhpcy5fb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuL2FsZ3MnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBlcnJzID0gcmVxdWlyZSgnLi9lcnJvcnMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMScpO1xudmFyIFNTSEJ1ZmZlciA9IHJlcXVpcmUoJy4vc3NoLWJ1ZmZlcicpO1xuXG52YXIgSW52YWxpZEFsZ29yaXRobUVycm9yID0gZXJycy5JbnZhbGlkQWxnb3JpdGhtRXJyb3I7XG52YXIgU2lnbmF0dXJlUGFyc2VFcnJvciA9IGVycnMuU2lnbmF0dXJlUGFyc2VFcnJvcjtcblxuZnVuY3Rpb24gU2lnbmF0dXJlKG9wdHMpIHtcblx0YXNzZXJ0Lm9iamVjdChvcHRzLCAnb3B0aW9ucycpO1xuXHRhc3NlcnQuYXJyYXlPZk9iamVjdChvcHRzLnBhcnRzLCAnb3B0aW9ucy5wYXJ0cycpO1xuXHRhc3NlcnQuc3RyaW5nKG9wdHMudHlwZSwgJ29wdGlvbnMudHlwZScpO1xuXG5cdHZhciBwYXJ0TG9va3VwID0ge307XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgb3B0cy5wYXJ0cy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBwYXJ0ID0gb3B0cy5wYXJ0c1tpXTtcblx0XHRwYXJ0TG9va3VwW3BhcnQubmFtZV0gPSBwYXJ0O1xuXHR9XG5cblx0dGhpcy50eXBlID0gb3B0cy50eXBlO1xuXHR0aGlzLmhhc2hBbGdvcml0aG0gPSBvcHRzLmhhc2hBbGdvO1xuXHR0aGlzLmN1cnZlID0gb3B0cy5jdXJ2ZTtcblx0dGhpcy5wYXJ0cyA9IG9wdHMucGFydHM7XG5cdHRoaXMucGFydCA9IHBhcnRMb29rdXA7XG59XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG5cdGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZClcblx0XHRmb3JtYXQgPSAnYXNuMSc7XG5cdGFzc2VydC5zdHJpbmcoZm9ybWF0LCAnZm9ybWF0Jyk7XG5cblx0dmFyIGJ1Zjtcblx0dmFyIHN0eXBlID0gJ3NzaC0nICsgdGhpcy50eXBlO1xuXG5cdHN3aXRjaCAodGhpcy50eXBlKSB7XG5cdGNhc2UgJ3JzYSc6XG5cdFx0c3dpdGNoICh0aGlzLmhhc2hBbGdvcml0aG0pIHtcblx0XHRjYXNlICdzaGEyNTYnOlxuXHRcdFx0c3R5cGUgPSAncnNhLXNoYTItMjU2Jztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3NoYTUxMic6XG5cdFx0XHRzdHlwZSA9ICdyc2Etc2hhMi01MTInO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnc2hhMSc6XG5cdFx0Y2FzZSB1bmRlZmluZWQ6XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignU1NIIHNpZ25hdHVyZSAnICtcblx0XHRcdCAgICAnZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgaGFzaCAnICtcblx0XHRcdCAgICAnYWxnb3JpdGhtICcgKyB0aGlzLmhhc2hBbGdvcml0aG0pKTtcblx0XHR9XG5cdFx0aWYgKGZvcm1hdCA9PT0gJ3NzaCcpIHtcblx0XHRcdGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe30pO1xuXHRcdFx0YnVmLndyaXRlU3RyaW5nKHN0eXBlKTtcblx0XHRcdGJ1Zi53cml0ZVBhcnQodGhpcy5wYXJ0LnNpZyk7XG5cdFx0XHRyZXR1cm4gKGJ1Zi50b0J1ZmZlcigpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuICh0aGlzLnBhcnQuc2lnLmRhdGEpO1xuXHRcdH1cblx0XHRicmVhaztcblxuXHRjYXNlICdlZDI1NTE5Jzpcblx0XHRpZiAoZm9ybWF0ID09PSAnc3NoJykge1xuXHRcdFx0YnVmID0gbmV3IFNTSEJ1ZmZlcih7fSk7XG5cdFx0XHRidWYud3JpdGVTdHJpbmcoc3R5cGUpO1xuXHRcdFx0YnVmLndyaXRlUGFydCh0aGlzLnBhcnQuc2lnKTtcblx0XHRcdHJldHVybiAoYnVmLnRvQnVmZmVyKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gKHRoaXMucGFydC5zaWcuZGF0YSk7XG5cdFx0fVxuXHRcdGJyZWFrO1xuXG5cdGNhc2UgJ2RzYSc6XG5cdGNhc2UgJ2VjZHNhJzpcblx0XHR2YXIgciwgcztcblx0XHRpZiAoZm9ybWF0ID09PSAnYXNuMScpIHtcblx0XHRcdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRyID0gdXRpbHMubXBOb3JtYWxpemUodGhpcy5wYXJ0LnIuZGF0YSk7XG5cdFx0XHRzID0gdXRpbHMubXBOb3JtYWxpemUodGhpcy5wYXJ0LnMuZGF0YSk7XG5cdFx0XHRkZXIud3JpdGVCdWZmZXIociwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdFx0XHRkZXIud3JpdGVCdWZmZXIocywgYXNuMS5CZXIuSW50ZWdlcik7XG5cdFx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHRcdHJldHVybiAoZGVyLmJ1ZmZlcik7XG5cdFx0fSBlbHNlIGlmIChmb3JtYXQgPT09ICdzc2gnICYmIHRoaXMudHlwZSA9PT0gJ2RzYScpIHtcblx0XHRcdGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe30pO1xuXHRcdFx0YnVmLndyaXRlU3RyaW5nKCdzc2gtZHNzJyk7XG5cdFx0XHRyID0gdGhpcy5wYXJ0LnIuZGF0YTtcblx0XHRcdGlmIChyLmxlbmd0aCA+IDIwICYmIHJbMF0gPT09IDB4MDApXG5cdFx0XHRcdHIgPSByLnNsaWNlKDEpO1xuXHRcdFx0cyA9IHRoaXMucGFydC5zLmRhdGE7XG5cdFx0XHRpZiAocy5sZW5ndGggPiAyMCAmJiBzWzBdID09PSAweDAwKVxuXHRcdFx0XHRzID0gcy5zbGljZSgxKTtcblx0XHRcdGlmICgodGhpcy5oYXNoQWxnb3JpdGhtICYmXG5cdFx0XHQgICAgdGhpcy5oYXNoQWxnb3JpdGhtICE9PSAnc2hhMScpIHx8XG5cdFx0XHQgICAgci5sZW5ndGggKyBzLmxlbmd0aCAhPT0gNDApIHtcblx0XHRcdFx0dGhyb3cgKG5ldyBFcnJvcignT3BlblNTSCBvbmx5IHN1cHBvcnRzICcgK1xuXHRcdFx0XHQgICAgJ0RTQSBzaWduYXR1cmVzIHdpdGggU0hBMSBoYXNoJykpO1xuXHRcdFx0fVxuXHRcdFx0YnVmLndyaXRlQnVmZmVyKEJ1ZmZlci5jb25jYXQoW3IsIHNdKSk7XG5cdFx0XHRyZXR1cm4gKGJ1Zi50b0J1ZmZlcigpKTtcblx0XHR9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ3NzaCcgJiYgdGhpcy50eXBlID09PSAnZWNkc2EnKSB7XG5cdFx0XHR2YXIgaW5uZXIgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0XHRcdHIgPSB0aGlzLnBhcnQuci5kYXRhO1xuXHRcdFx0aW5uZXIud3JpdGVCdWZmZXIocik7XG5cdFx0XHRpbm5lci53cml0ZVBhcnQodGhpcy5wYXJ0LnMpO1xuXG5cdFx0XHRidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0XHRcdC8qIFhYWDogZmluZCBhIG1vcmUgcHJvcGVyIHdheSB0byBkbyB0aGlzPyAqL1xuXHRcdFx0dmFyIGN1cnZlO1xuXHRcdFx0aWYgKHJbMF0gPT09IDB4MDApXG5cdFx0XHRcdHIgPSByLnNsaWNlKDEpO1xuXHRcdFx0dmFyIHN6ID0gci5sZW5ndGggKiA4O1xuXHRcdFx0aWYgKHN6ID09PSAyNTYpXG5cdFx0XHRcdGN1cnZlID0gJ25pc3RwMjU2Jztcblx0XHRcdGVsc2UgaWYgKHN6ID09PSAzODQpXG5cdFx0XHRcdGN1cnZlID0gJ25pc3RwMzg0Jztcblx0XHRcdGVsc2UgaWYgKHN6ID09PSA1MjgpXG5cdFx0XHRcdGN1cnZlID0gJ25pc3RwNTIxJztcblx0XHRcdGJ1Zi53cml0ZVN0cmluZygnZWNkc2Etc2hhMi0nICsgY3VydmUpO1xuXHRcdFx0YnVmLndyaXRlQnVmZmVyKGlubmVyLnRvQnVmZmVyKCkpO1xuXHRcdFx0cmV0dXJuIChidWYudG9CdWZmZXIoKSk7XG5cdFx0fVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlIGZvcm1hdCcpKTtcblx0ZGVmYXVsdDpcblx0XHR0aHJvdyAobmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBkYXRhJykpO1xuXHR9XG59O1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGZvcm1hdCkge1xuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcoZm9ybWF0LCAnZm9ybWF0Jyk7XG5cdHJldHVybiAodGhpcy50b0J1ZmZlcihmb3JtYXQpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG59O1xuXG5TaWduYXR1cmUucGFyc2UgPSBmdW5jdGlvbiAoZGF0YSwgdHlwZSwgZm9ybWF0KSB7XG5cdGlmICh0eXBlb2YgKGRhdGEpID09PSAnc3RyaW5nJylcblx0XHRkYXRhID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpO1xuXHRhc3NlcnQuYnVmZmVyKGRhdGEsICdkYXRhJyk7XG5cdGFzc2VydC5zdHJpbmcoZm9ybWF0LCAnZm9ybWF0Jyk7XG5cdGFzc2VydC5zdHJpbmcodHlwZSwgJ3R5cGUnKTtcblxuXHR2YXIgb3B0cyA9IHt9O1xuXHRvcHRzLnR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG5cdG9wdHMucGFydHMgPSBbXTtcblxuXHR0cnkge1xuXHRcdGFzc2VydC5vayhkYXRhLmxlbmd0aCA+IDAsICdzaWduYXR1cmUgbXVzdCBub3QgYmUgZW1wdHknKTtcblx0XHRzd2l0Y2ggKG9wdHMudHlwZSkge1xuXHRcdGNhc2UgJ3JzYSc6XG5cdFx0XHRyZXR1cm4gKHBhcnNlT25lTnVtKGRhdGEsIHR5cGUsIGZvcm1hdCwgb3B0cykpO1xuXHRcdGNhc2UgJ2VkMjU1MTknOlxuXHRcdFx0cmV0dXJuIChwYXJzZU9uZU51bShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpKTtcblxuXHRcdGNhc2UgJ2RzYSc6XG5cdFx0Y2FzZSAnZWNkc2EnOlxuXHRcdFx0aWYgKGZvcm1hdCA9PT0gJ2FzbjEnKVxuXHRcdFx0XHRyZXR1cm4gKHBhcnNlRFNBYXNuMShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpKTtcblx0XHRcdGVsc2UgaWYgKG9wdHMudHlwZSA9PT0gJ2RzYScpXG5cdFx0XHRcdHJldHVybiAocGFyc2VEU0EoZGF0YSwgdHlwZSwgZm9ybWF0LCBvcHRzKSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiAocGFyc2VFQ0RTQShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpKTtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcih0eXBlKSk7XG5cdFx0fVxuXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAoZSBpbnN0YW5jZW9mIEludmFsaWRBbGdvcml0aG1FcnJvcilcblx0XHRcdHRocm93IChlKTtcblx0XHR0aHJvdyAobmV3IFNpZ25hdHVyZVBhcnNlRXJyb3IodHlwZSwgZm9ybWF0LCBlKSk7XG5cdH1cbn07XG5cbmZ1bmN0aW9uIHBhcnNlT25lTnVtKGRhdGEsIHR5cGUsIGZvcm1hdCwgb3B0cykge1xuXHRpZiAoZm9ybWF0ID09PSAnc3NoJykge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgYnVmID0gbmV3IFNTSEJ1ZmZlcih7YnVmZmVyOiBkYXRhfSk7XG5cdFx0XHR2YXIgaGVhZCA9IGJ1Zi5yZWFkU3RyaW5nKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0LyogZmFsbCB0aHJvdWdoICovXG5cdFx0fVxuXHRcdGlmIChidWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFyIG1zZyA9ICdTU0ggc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICcgK1xuXHRcdFx0ICAgICd0eXBlIChleHBlY3RlZCAnICsgdHlwZSArICcsIGdvdCAnICsgaGVhZCArICcpJztcblx0XHRcdHN3aXRjaCAoaGVhZCkge1xuXHRcdFx0Y2FzZSAnc3NoLXJzYSc6XG5cdFx0XHRcdGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlLCAncnNhJywgbXNnKTtcblx0XHRcdFx0b3B0cy5oYXNoQWxnbyA9ICdzaGExJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyc2Etc2hhMi0yNTYnOlxuXHRcdFx0XHRhc3NlcnQuc3RyaWN0RXF1YWwodHlwZSwgJ3JzYScsIG1zZyk7XG5cdFx0XHRcdG9wdHMuaGFzaEFsZ28gPSAnc2hhMjU2Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyc2Etc2hhMi01MTInOlxuXHRcdFx0XHRhc3NlcnQuc3RyaWN0RXF1YWwodHlwZSwgJ3JzYScsIG1zZyk7XG5cdFx0XHRcdG9wdHMuaGFzaEFsZ28gPSAnc2hhNTEyJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzc2gtZWQyNTUxOSc6XG5cdFx0XHRcdGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlLCAnZWQyNTUxOScsIG1zZyk7XG5cdFx0XHRcdG9wdHMuaGFzaEFsZ28gPSAnc2hhNTEyJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIFNTSCBzaWduYXR1cmUgJyArXG5cdFx0XHRcdCAgICAndHlwZTogJyArIGhlYWQpKTtcblx0XHRcdH1cblx0XHRcdHZhciBzaWcgPSBidWYucmVhZFBhcnQoKTtcblx0XHRcdGFzc2VydC5vayhidWYuYXRFbmQoKSwgJ2V4dHJhIHRyYWlsaW5nIGJ5dGVzJyk7XG5cdFx0XHRzaWcubmFtZSA9ICdzaWcnO1xuXHRcdFx0b3B0cy5wYXJ0cy5wdXNoKHNpZyk7XG5cdFx0XHRyZXR1cm4gKG5ldyBTaWduYXR1cmUob3B0cykpO1xuXHRcdH1cblx0fVxuXHRvcHRzLnBhcnRzLnB1c2goe25hbWU6ICdzaWcnLCBkYXRhOiBkYXRhfSk7XG5cdHJldHVybiAobmV3IFNpZ25hdHVyZShvcHRzKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRFNBYXNuMShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpIHtcblx0dmFyIGRlciA9IG5ldyBhc24xLkJlclJlYWRlcihkYXRhKTtcblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHR2YXIgciA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkludGVnZXIsIHRydWUpO1xuXHR2YXIgcyA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkludGVnZXIsIHRydWUpO1xuXG5cdG9wdHMucGFydHMucHVzaCh7bmFtZTogJ3InLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShyKX0pO1xuXHRvcHRzLnBhcnRzLnB1c2goe25hbWU6ICdzJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocyl9KTtcblxuXHRyZXR1cm4gKG5ldyBTaWduYXR1cmUob3B0cykpO1xufVxuXG5mdW5jdGlvbiBwYXJzZURTQShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpIHtcblx0aWYgKGRhdGEubGVuZ3RoICE9IDQwKSB7XG5cdFx0dmFyIGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe2J1ZmZlcjogZGF0YX0pO1xuXHRcdHZhciBkID0gYnVmLnJlYWRCdWZmZXIoKTtcblx0XHRpZiAoZC50b1N0cmluZygnYXNjaWknKSA9PT0gJ3NzaC1kc3MnKVxuXHRcdFx0ZCA9IGJ1Zi5yZWFkQnVmZmVyKCk7XG5cdFx0YXNzZXJ0Lm9rKGJ1Zi5hdEVuZCgpLCAnZXh0cmEgdHJhaWxpbmcgYnl0ZXMnKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwoZC5sZW5ndGgsIDQwLCAnaW52YWxpZCBpbm5lciBsZW5ndGgnKTtcblx0XHRkYXRhID0gZDtcblx0fVxuXHRvcHRzLnBhcnRzLnB1c2goe25hbWU6ICdyJywgZGF0YTogZGF0YS5zbGljZSgwLCAyMCl9KTtcblx0b3B0cy5wYXJ0cy5wdXNoKHtuYW1lOiAncycsIGRhdGE6IGRhdGEuc2xpY2UoMjAsIDQwKX0pO1xuXHRyZXR1cm4gKG5ldyBTaWduYXR1cmUob3B0cykpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVDRFNBKGRhdGEsIHR5cGUsIGZvcm1hdCwgb3B0cykge1xuXHR2YXIgYnVmID0gbmV3IFNTSEJ1ZmZlcih7YnVmZmVyOiBkYXRhfSk7XG5cblx0dmFyIHIsIHM7XG5cdHZhciBpbm5lciA9IGJ1Zi5yZWFkQnVmZmVyKCk7XG5cdHZhciBzdHlwZSA9IGlubmVyLnRvU3RyaW5nKCdhc2NpaScpO1xuXHRpZiAoc3R5cGUuc2xpY2UoMCwgNikgPT09ICdlY2RzYS0nKSB7XG5cdFx0dmFyIHBhcnRzID0gc3R5cGUuc3BsaXQoJy0nKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocGFydHNbMF0sICdlY2RzYScpO1xuXHRcdGFzc2VydC5zdHJpY3RFcXVhbChwYXJ0c1sxXSwgJ3NoYTInKTtcblx0XHRvcHRzLmN1cnZlID0gcGFydHNbMl07XG5cdFx0c3dpdGNoIChvcHRzLmN1cnZlKSB7XG5cdFx0Y2FzZSAnbmlzdHAyNTYnOlxuXHRcdFx0b3B0cy5oYXNoQWxnbyA9ICdzaGEyNTYnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnbmlzdHAzODQnOlxuXHRcdFx0b3B0cy5oYXNoQWxnbyA9ICdzaGEzODQnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnbmlzdHA1MjEnOlxuXHRcdFx0b3B0cy5oYXNoQWxnbyA9ICdzaGE1MTInO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIEVDRFNBIGN1cnZlOiAnICtcblx0XHRcdCAgICBvcHRzLmN1cnZlKSk7XG5cdFx0fVxuXHRcdGlubmVyID0gYnVmLnJlYWRCdWZmZXIoKTtcblx0XHRhc3NlcnQub2soYnVmLmF0RW5kKCksICdleHRyYSB0cmFpbGluZyBieXRlcyBvbiBvdXRlcicpO1xuXHRcdGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe2J1ZmZlcjogaW5uZXJ9KTtcblx0XHRyID0gYnVmLnJlYWRQYXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0ciA9IHtkYXRhOiBpbm5lcn07XG5cdH1cblxuXHRzID0gYnVmLnJlYWRQYXJ0KCk7XG5cdGFzc2VydC5vayhidWYuYXRFbmQoKSwgJ2V4dHJhIHRyYWlsaW5nIGJ5dGVzJyk7XG5cblx0ci5uYW1lID0gJ3InO1xuXHRzLm5hbWUgPSAncyc7XG5cblx0b3B0cy5wYXJ0cy5wdXNoKHIpO1xuXHRvcHRzLnBhcnRzLnB1c2gocyk7XG5cdHJldHVybiAobmV3IFNpZ25hdHVyZShvcHRzKSk7XG59XG5cblNpZ25hdHVyZS5pc1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChvYmosIHZlcikge1xuXHRyZXR1cm4gKHV0aWxzLmlzQ29tcGF0aWJsZShvYmosIFNpZ25hdHVyZSwgdmVyKSk7XG59O1xuXG4vKlxuICogQVBJIHZlcnNpb25zIGZvciBTaWduYXR1cmU6XG4gKiBbMSwwXSAtLSBpbml0aWFsIHZlclxuICogWzIsMF0gLS0gc3VwcG9ydCBmb3IgcnNhIGluIGZ1bGwgc3NoIGZvcm1hdCwgY29tcGF0IHdpdGggc3NocGstYWdlbnRcbiAqICAgICAgICAgIGhhc2hBbGdvcml0aG0gcHJvcGVydHlcbiAqIFsyLDFdIC0tIGZpcnN0IHRhZ2dlZCB2ZXJzaW9uXG4gKi9cblNpZ25hdHVyZS5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbiA9IFsyLCAxXTtcblxuU2lnbmF0dXJlLl9vbGRWZXJzaW9uRGV0ZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuXHRhc3NlcnQuZnVuYyhvYmoudG9CdWZmZXIpO1xuXHRpZiAob2JqLmhhc093blByb3BlcnR5KCdoYXNoQWxnb3JpdGhtJykpXG5cdFx0cmV0dXJuIChbMiwgMF0pO1xuXHRyZXR1cm4gKFsxLCAwXSk7XG59O1xuIiwgIi8vIE5hbWVkIEVDIGN1cnZlc1xuXG4vLyBSZXF1aXJlcyBlYy5qcywganNibi5qcywgYW5kIGpzYm4yLmpzXG52YXIgQmlnSW50ZWdlciA9IHJlcXVpcmUoJ2pzYm4nKS5CaWdJbnRlZ2VyXG52YXIgRUNDdXJ2ZUZwID0gcmVxdWlyZSgnLi9lYy5qcycpLkVDQ3VydmVGcFxuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS1cbi8vIFg5RUNQYXJhbWV0ZXJzXG5cbi8vIGNvbnN0cnVjdG9yXG5mdW5jdGlvbiBYOUVDUGFyYW1ldGVycyhjdXJ2ZSxnLG4saCkge1xuICAgIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgICB0aGlzLmcgPSBnO1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy5oID0gaDtcbn1cblxuZnVuY3Rpb24geDlnZXRDdXJ2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZTtcbn1cblxuZnVuY3Rpb24geDlnZXRHKCkge1xuICAgIHJldHVybiB0aGlzLmc7XG59XG5cbmZ1bmN0aW9uIHg5Z2V0TigpIHtcbiAgICByZXR1cm4gdGhpcy5uO1xufVxuXG5mdW5jdGlvbiB4OWdldEgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaDtcbn1cblxuWDlFQ1BhcmFtZXRlcnMucHJvdG90eXBlLmdldEN1cnZlID0geDlnZXRDdXJ2ZTtcblg5RUNQYXJhbWV0ZXJzLnByb3RvdHlwZS5nZXRHID0geDlnZXRHO1xuWDlFQ1BhcmFtZXRlcnMucHJvdG90eXBlLmdldE4gPSB4OWdldE47XG5YOUVDUGFyYW1ldGVycy5wcm90b3R5cGUuZ2V0SCA9IHg5Z2V0SDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuLy8gU0VDTmFtZWRDdXJ2ZXNcblxuZnVuY3Rpb24gZnJvbUhleChzKSB7IHJldHVybiBuZXcgQmlnSW50ZWdlcihzLCAxNik7IH1cblxuZnVuY3Rpb24gc2VjcDEyOHIxKCkge1xuICAgIC8vIHAgPSAyXjEyOCAtIDJeOTcgLSAxXG4gICAgdmFyIHAgPSBmcm9tSGV4KFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIik7XG4gICAgdmFyIGEgPSBmcm9tSGV4KFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIik7XG4gICAgdmFyIGIgPSBmcm9tSGV4KFwiRTg3NTc5QzExMDc5RjQzREQ4MjQ5OTNDMkNFRTVFRDNcIik7XG4gICAgLy9ieXRlW10gUyA9IEhleC5kZWNvZGUoXCIwMDBFMEQ0RDY5NkU2NzY4NzU2MTUxNzUwQ0MwM0E0NDczRDAzNjc5XCIpO1xuICAgIHZhciBuID0gZnJvbUhleChcIkZGRkZGRkZFMDAwMDAwMDA3NUEzMEQxQjkwMzhBMTE1XCIpO1xuICAgIHZhciBoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIGN1cnZlID0gbmV3IEVDQ3VydmVGcChwLCBhLCBiKTtcbiAgICB2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KFwiMDRcIlxuICAgICAgICAgICAgICAgICsgXCIxNjFGRjc1MjhCODk5QjJEMEMyODYwN0NBNTJDNUI4NlwiXG5cdFx0KyBcIkNGNUFDODM5NUJBRkVCMTNDMDJEQTI5MkRERUQ3QTgzXCIpO1xuICAgIHJldHVybiBuZXcgWDlFQ1BhcmFtZXRlcnMoY3VydmUsIEcsIG4sIGgpO1xufVxuXG5mdW5jdGlvbiBzZWNwMTYwazEoKSB7XG4gICAgLy8gcCA9IDJeMTYwIC0gMl4zMiAtIDJeMTQgLSAyXjEyIC0gMl45IC0gMl44IC0gMl43IC0gMl4zIC0gMl4yIC0gMVxuICAgIHZhciBwID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkFDNzNcIik7XG4gICAgdmFyIGEgPSBCaWdJbnRlZ2VyLlpFUk87XG4gICAgdmFyIGIgPSBmcm9tSGV4KFwiN1wiKTtcbiAgICAvL2J5dGVbXSBTID0gbnVsbDtcbiAgICB2YXIgbiA9IGZyb21IZXgoXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxQjhGQTE2REZBQjlBQ0ExNkI2QjNcIik7XG4gICAgdmFyIGggPSBCaWdJbnRlZ2VyLk9ORTtcbiAgICB2YXIgY3VydmUgPSBuZXcgRUNDdXJ2ZUZwKHAsIGEsIGIpO1xuICAgIHZhciBHID0gY3VydmUuZGVjb2RlUG9pbnRIZXgoXCIwNFwiXG4gICAgICAgICAgICAgICAgKyBcIjNCNEMzODJDRTM3QUExOTJBNDAxOUU3NjMwMzZGNEY1REQ0RDdFQkJcIlxuICAgICAgICAgICAgICAgICsgXCI5MzhDRjkzNTMxOEZEQ0VENkJDMjgyODY1MzE3MzNDM0YwM0M0RkVFXCIpO1xuICAgIHJldHVybiBuZXcgWDlFQ1BhcmFtZXRlcnMoY3VydmUsIEcsIG4sIGgpO1xufVxuXG5mdW5jdGlvbiBzZWNwMTYwcjEoKSB7XG4gICAgLy8gcCA9IDJeMTYwIC0gMl4zMSAtIDFcbiAgICB2YXIgcCA9IGZyb21IZXgoXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZGXCIpO1xuICAgIHZhciBhID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkNcIik7XG4gICAgdmFyIGIgPSBmcm9tSGV4KFwiMUM5N0JFRkM1NEJEN0E4QjY1QUNGODlGODFENEQ0QURDNTY1RkE0NVwiKTtcbiAgICAvL2J5dGVbXSBTID0gSGV4LmRlY29kZShcIjEwNTNDREU0MkMxNEQ2OTZFNjc2ODc1NjE1MTc1MzNCRjNGODMzNDVcIik7XG4gICAgdmFyIG4gPSBmcm9tSGV4KFwiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMUY0QzhGOTI3QUVEM0NBNzUyMjU3XCIpO1xuICAgIHZhciBoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIGN1cnZlID0gbmV3IEVDQ3VydmVGcChwLCBhLCBiKTtcbiAgICB2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KFwiMDRcIlxuXHRcdCsgXCI0QTk2QjU2ODhFRjU3MzI4NDY2NDY5ODk2OEMzOEJCOTEzQ0JGQzgyXCJcblx0XHQrIFwiMjNBNjI4NTUzMTY4OTQ3RDU5RENDOTEyMDQyMzUxMzc3QUM1RkIzMlwiKTtcbiAgICByZXR1cm4gbmV3IFg5RUNQYXJhbWV0ZXJzKGN1cnZlLCBHLCBuLCBoKTtcbn1cblxuZnVuY3Rpb24gc2VjcDE5MmsxKCkge1xuICAgIC8vIHAgPSAyXjE5MiAtIDJeMzIgLSAyXjEyIC0gMl44IC0gMl43IC0gMl42IC0gMl4zIC0gMVxuICAgIHZhciBwID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRUUzN1wiKTtcbiAgICB2YXIgYSA9IEJpZ0ludGVnZXIuWkVSTztcbiAgICB2YXIgYiA9IGZyb21IZXgoXCIzXCIpO1xuICAgIC8vYnl0ZVtdIFMgPSBudWxsO1xuICAgIHZhciBuID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRTI2RjJGQzE3MEY2OTQ2NkE3NERFRkQ4RFwiKTtcbiAgICB2YXIgaCA9IEJpZ0ludGVnZXIuT05FO1xuICAgIHZhciBjdXJ2ZSA9IG5ldyBFQ0N1cnZlRnAocCwgYSwgYik7XG4gICAgdmFyIEcgPSBjdXJ2ZS5kZWNvZGVQb2ludEhleChcIjA0XCJcbiAgICAgICAgICAgICAgICArIFwiREI0RkYxMEVDMDU3RTlBRTI2QjA3RDAyODBCN0Y0MzQxREE1RDFCMUVBRTA2QzdEXCJcbiAgICAgICAgICAgICAgICArIFwiOUIyRjJGNkQ5QzU2MjhBNzg0NDE2M0QwMTVCRTg2MzQ0MDgyQUE4OEQ5NUUyRjlEXCIpO1xuICAgIHJldHVybiBuZXcgWDlFQ1BhcmFtZXRlcnMoY3VydmUsIEcsIG4sIGgpO1xufVxuXG5mdW5jdGlvbiBzZWNwMTkycjEoKSB7XG4gICAgLy8gcCA9IDJeMTkyIC0gMl42NCAtIDFcbiAgICB2YXIgcCA9IGZyb21IZXgoXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZcIik7XG4gICAgdmFyIGEgPSBmcm9tSGV4KFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZDXCIpO1xuICAgIHZhciBiID0gZnJvbUhleChcIjY0MjEwNTE5RTU5QzgwRTcwRkE3RTlBQjcyMjQzMDQ5RkVCOERFRUNDMTQ2QjlCMVwiKTtcbiAgICAvL2J5dGVbXSBTID0gSGV4LmRlY29kZShcIjMwNDVBRTZGQzg0MjJGNjRFRDU3OTUyOEQzODEyMEVBRTEyMTk2RDVcIik7XG4gICAgdmFyIG4gPSBmcm9tSGV4KFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGOTlERUY4MzYxNDZCQzlCMUI0RDIyODMxXCIpO1xuICAgIHZhciBoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIGN1cnZlID0gbmV3IEVDQ3VydmVGcChwLCBhLCBiKTtcbiAgICB2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KFwiMDRcIlxuICAgICAgICAgICAgICAgICsgXCIxODhEQTgwRUIwMzA5MEY2N0NCRjIwRUI0M0ExODgwMEY0RkYwQUZEODJGRjEwMTJcIlxuICAgICAgICAgICAgICAgICsgXCIwNzE5MkI5NUZGQzhEQTc4NjMxMDExRUQ2QjI0Q0RENTczRjk3N0ExMUU3OTQ4MTFcIik7XG4gICAgcmV0dXJuIG5ldyBYOUVDUGFyYW1ldGVycyhjdXJ2ZSwgRywgbiwgaCk7XG59XG5cbmZ1bmN0aW9uIHNlY3AyMjRyMSgpIHtcbiAgICAvLyBwID0gMl4yMjQgLSAyXjk2ICsgMVxuICAgIHZhciBwID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxXCIpO1xuICAgIHZhciBhID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFXCIpO1xuICAgIHZhciBiID0gZnJvbUhleChcIkI0MDUwQTg1MEMwNEIzQUJGNTQxMzI1NjUwNDRCMEI3RDdCRkQ4QkEyNzBCMzk0MzIzNTVGRkI0XCIpO1xuICAgIC8vYnl0ZVtdIFMgPSBIZXguZGVjb2RlKFwiQkQ3MTM0NDc5OUQ1QzdGQ0RDNDVCNTlGQTNCOUFCOEY2QTk0OEJDNVwiKTtcbiAgICB2YXIgbiA9IGZyb21IZXgoXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMTZBMkUwQjhGMDNFMTNERDI5NDU1QzVDMkEzRFwiKTtcbiAgICB2YXIgaCA9IEJpZ0ludGVnZXIuT05FO1xuICAgIHZhciBjdXJ2ZSA9IG5ldyBFQ0N1cnZlRnAocCwgYSwgYik7XG4gICAgdmFyIEcgPSBjdXJ2ZS5kZWNvZGVQb2ludEhleChcIjA0XCJcbiAgICAgICAgICAgICAgICArIFwiQjcwRTBDQkQ2QkI0QkY3RjMyMTM5MEI5NEEwM0MxRDM1NkMyMTEyMjM0MzI4MEQ2MTE1QzFEMjFcIlxuICAgICAgICAgICAgICAgICsgXCJCRDM3NjM4OEI1RjcyM0ZCNEMyMkRGRTZDRDQzNzVBMDVBMDc0NzY0NDRENTgxOTk4NTAwN0UzNFwiKTtcbiAgICByZXR1cm4gbmV3IFg5RUNQYXJhbWV0ZXJzKGN1cnZlLCBHLCBuLCBoKTtcbn1cblxuZnVuY3Rpb24gc2VjcDI1NnIxKCkge1xuICAgIC8vIHAgPSAyXjIyNCAoMl4zMiAtIDEpICsgMl4xOTIgKyAyXjk2IC0gMVxuICAgIHZhciBwID0gZnJvbUhleChcIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIik7XG4gICAgdmFyIGEgPSBmcm9tSGV4KFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiKTtcbiAgICB2YXIgYiA9IGZyb21IZXgoXCI1QUM2MzVEOEFBM0E5M0U3QjNFQkJENTU3Njk4ODZCQzY1MUQwNkIwQ0M1M0IwRjYzQkNFM0MzRTI3RDI2MDRCXCIpO1xuICAgIC8vYnl0ZVtdIFMgPSBIZXguZGVjb2RlKFwiQzQ5RDM2MDg4NkU3MDQ5MzZBNjY3OEUxMTM5RDI2Qjc4MTlGN0U5MFwiKTtcbiAgICB2YXIgbiA9IGZyb21IZXgoXCJGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkJDRTZGQUFEQTcxNzlFODRGM0I5Q0FDMkZDNjMyNTUxXCIpO1xuICAgIHZhciBoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIGN1cnZlID0gbmV3IEVDQ3VydmVGcChwLCBhLCBiKTtcbiAgICB2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KFwiMDRcIlxuICAgICAgICAgICAgICAgICsgXCI2QjE3RDFGMkUxMkM0MjQ3RjhCQ0U2RTU2M0E0NDBGMjc3MDM3RDgxMkRFQjMzQTBGNEExMzk0NUQ4OThDMjk2XCJcblx0XHQrIFwiNEZFMzQyRTJGRTFBN0Y5QjhFRTdFQjRBN0MwRjlFMTYyQkNFMzM1NzZCMzE1RUNFQ0JCNjQwNjgzN0JGNTFGNVwiKTtcbiAgICByZXR1cm4gbmV3IFg5RUNQYXJhbWV0ZXJzKGN1cnZlLCBHLCBuLCBoKTtcbn1cblxuLy8gVE9ETzogbWFrZSB0aGlzIGludG8gYSBwcm9wZXIgaGFzaHRhYmxlXG5mdW5jdGlvbiBnZXRTRUNDdXJ2ZUJ5TmFtZShuYW1lKSB7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxMjhyMVwiKSByZXR1cm4gc2VjcDEyOHIxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxNjBrMVwiKSByZXR1cm4gc2VjcDE2MGsxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxNjByMVwiKSByZXR1cm4gc2VjcDE2MHIxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxOTJrMVwiKSByZXR1cm4gc2VjcDE5MmsxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxOTJyMVwiKSByZXR1cm4gc2VjcDE5MnIxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AyMjRyMVwiKSByZXR1cm4gc2VjcDIyNHIxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AyNTZyMVwiKSByZXR1cm4gc2VjcDI1NnIxKCk7XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBcInNlY3AxMjhyMVwiOnNlY3AxMjhyMSxcbiAgXCJzZWNwMTYwazFcIjpzZWNwMTYwazEsXG4gIFwic2VjcDE2MHIxXCI6c2VjcDE2MHIxLFxuICBcInNlY3AxOTJrMVwiOnNlY3AxOTJrMSxcbiAgXCJzZWNwMTkycjFcIjpzZWNwMTkycjEsXG4gIFwic2VjcDIyNHIxXCI6c2VjcDIyNHIxLFxuICBcInNlY3AyNTZyMVwiOnNlY3AyNTZyMVxufVxuIiwgInZhciBjcnlwdG8gPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xudmFyIEJpZ0ludGVnZXIgPSByZXF1aXJlKFwianNiblwiKS5CaWdJbnRlZ2VyO1xudmFyIEVDUG9pbnRGcCA9IHJlcXVpcmUoXCIuL2xpYi9lYy5qc1wiKS5FQ1BvaW50RnA7XG52YXIgQnVmZmVyID0gcmVxdWlyZShcInNhZmVyLWJ1ZmZlclwiKS5CdWZmZXI7XG5leHBvcnRzLkVDQ3VydmVzID0gcmVxdWlyZShcIi4vbGliL3NlYy5qc1wiKTtcblxuLy8gemVybyBwcmVwYWRcbmZ1bmN0aW9uIHVuc3R1cGlkKGhleCxsZW4pXG57XG5cdHJldHVybiAoaGV4Lmxlbmd0aCA+PSBsZW4pID8gaGV4IDogdW5zdHVwaWQoXCIwXCIraGV4LGxlbik7XG59XG5cbmV4cG9ydHMuRUNLZXkgPSBmdW5jdGlvbihjdXJ2ZSwga2V5LCBpc1B1YmxpYylcbntcbiAgdmFyIHByaXY7XG5cdHZhciBjID0gY3VydmUoKTtcblx0dmFyIG4gPSBjLmdldE4oKTtcbiAgdmFyIGJ5dGVzID0gTWF0aC5mbG9vcihuLmJpdExlbmd0aCgpLzgpO1xuXG4gIGlmKGtleSlcbiAge1xuICAgIGlmKGlzUHVibGljKVxuICAgIHtcbiAgICAgIHZhciBjdXJ2ZSA9IGMuZ2V0Q3VydmUoKTtcbi8vICAgICAgdmFyIHggPSBrZXkuc2xpY2UoMSxieXRlcysxKTsgLy8gc2tpcCB0aGUgMDQgZm9yIHVuY29tcHJlc3NlZCBmb3JtYXRcbi8vICAgICAgdmFyIHkgPSBrZXkuc2xpY2UoYnl0ZXMrMSk7XG4vLyAgICAgIHRoaXMuUCA9IG5ldyBFQ1BvaW50RnAoY3VydmUsXG4vLyAgICAgICAgY3VydmUuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoeC50b1N0cmluZyhcImhleFwiKSwgMTYpKSxcbi8vICAgICAgICBjdXJ2ZS5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcih5LnRvU3RyaW5nKFwiaGV4XCIpLCAxNikpKTsgICAgICBcbiAgICAgIHRoaXMuUCA9IGN1cnZlLmRlY29kZVBvaW50SGV4KGtleS50b1N0cmluZyhcImhleFwiKSk7XG4gICAgfWVsc2V7XG4gICAgICBpZihrZXkubGVuZ3RoICE9IGJ5dGVzKSByZXR1cm4gZmFsc2U7XG4gICAgICBwcml2ID0gbmV3IEJpZ0ludGVnZXIoa2V5LnRvU3RyaW5nKFwiaGV4XCIpLCAxNik7ICAgICAgXG4gICAgfVxuICB9ZWxzZXtcbiAgICB2YXIgbjEgPSBuLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICB2YXIgciA9IG5ldyBCaWdJbnRlZ2VyKGNyeXB0by5yYW5kb21CeXRlcyhuLmJpdExlbmd0aCgpKSk7XG4gICAgcHJpdiA9IHIubW9kKG4xKS5hZGQoQmlnSW50ZWdlci5PTkUpO1xuICAgIHRoaXMuUCA9IGMuZ2V0RygpLm11bHRpcGx5KHByaXYpO1xuICB9XG4gIGlmKHRoaXMuUClcbiAge1xuLy8gIHZhciBwdWJoZXggPSB1bnN0dXBpZCh0aGlzLlAuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKDE2KSxieXRlcyoyKSt1bnN0dXBpZCh0aGlzLlAuZ2V0WSgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKDE2KSxieXRlcyoyKTtcbi8vICB0aGlzLlB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKFwiMDRcIitwdWJoZXgsXCJoZXhcIik7XG4gICAgdGhpcy5QdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShjLmdldEN1cnZlKCkuZW5jb2RlQ29tcHJlc3NlZFBvaW50SGV4KHRoaXMuUCksXCJoZXhcIik7XG4gIH1cbiAgaWYocHJpdilcbiAge1xuICAgIHRoaXMuUHJpdmF0ZUtleSA9IEJ1ZmZlci5mcm9tKHVuc3R1cGlkKHByaXYudG9TdHJpbmcoMTYpLGJ5dGVzKjIpLFwiaGV4XCIpO1xuICAgIHRoaXMuZGVyaXZlU2hhcmVkU2VjcmV0ID0gZnVuY3Rpb24oa2V5KVxuICAgIHtcbiAgICAgIGlmKCFrZXkgfHwgIWtleS5QKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgUyA9IGtleS5QLm11bHRpcGx5KHByaXYpO1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHVuc3R1cGlkKFMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKDE2KSxieXRlcyoyKSxcImhleFwiKTtcbiAgIH0gICAgIFxuICB9XG59XG5cbiIsICIvLyBDb3B5cmlnaHQgMjAxNyBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdERpZmZpZUhlbGxtYW46IERpZmZpZUhlbGxtYW4sXG5cdGdlbmVyYXRlRUNEU0E6IGdlbmVyYXRlRUNEU0EsXG5cdGdlbmVyYXRlRUQyNTUxOTogZ2VuZXJhdGVFRDI1NTE5XG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgYWxncyA9IHJlcXVpcmUoJy4vYWxncycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIG5hY2wgPSByZXF1aXJlKCd0d2VldG5hY2wnKTtcblxudmFyIEtleSA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4vcHJpdmF0ZS1rZXknKTtcblxudmFyIENSWVBUT19IQVZFX0VDREggPSAoY3J5cHRvLmNyZWF0ZUVDREggIT09IHVuZGVmaW5lZCk7XG5cbnZhciBlY2RoID0gcmVxdWlyZSgnZWNjLWpzYm4nKTtcbnZhciBlYyA9IHJlcXVpcmUoJ2VjYy1qc2JuL2xpYi9lYycpO1xudmFyIGpzYm4gPSByZXF1aXJlKCdqc2JuJykuQmlnSW50ZWdlcjtcblxuZnVuY3Rpb24gRGlmZmllSGVsbG1hbihrZXkpIHtcblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShrZXksIEtleSwgWzEsIDRdLCAna2V5Jyk7XG5cdHRoaXMuX2lzUHJpdiA9IFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSwgWzEsIDNdKTtcblx0dGhpcy5fYWxnbyA9IGtleS50eXBlO1xuXHR0aGlzLl9jdXJ2ZSA9IGtleS5jdXJ2ZTtcblx0dGhpcy5fa2V5ID0ga2V5O1xuXHRpZiAoa2V5LnR5cGUgPT09ICdkc2EnKSB7XG5cdFx0aWYgKCFDUllQVE9fSEFWRV9FQ0RIKSB7XG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdEdWUgdG8gYnVncyBpbiB0aGUgbm9kZSAwLjEwICcgK1xuXHRcdFx0ICAgICdjcnlwdG8gQVBJLCBub2RlIDAuMTIueCBvciBsYXRlciBpcyByZXF1aXJlZCAnICtcblx0XHRcdCAgICAndG8gdXNlIERIJykpO1xuXHRcdH1cblx0XHR0aGlzLl9kaCA9IGNyeXB0by5jcmVhdGVEaWZmaWVIZWxsbWFuKFxuXHRcdCAgICBrZXkucGFydC5wLmRhdGEsIHVuZGVmaW5lZCxcblx0XHQgICAga2V5LnBhcnQuZy5kYXRhLCB1bmRlZmluZWQpO1xuXHRcdHRoaXMuX3AgPSBrZXkucGFydC5wO1xuXHRcdHRoaXMuX2cgPSBrZXkucGFydC5nO1xuXHRcdGlmICh0aGlzLl9pc1ByaXYpXG5cdFx0XHR0aGlzLl9kaC5zZXRQcml2YXRlS2V5KGtleS5wYXJ0LnguZGF0YSk7XG5cdFx0dGhpcy5fZGguc2V0UHVibGljS2V5KGtleS5wYXJ0LnkuZGF0YSk7XG5cblx0fSBlbHNlIGlmIChrZXkudHlwZSA9PT0gJ2VjZHNhJykge1xuXHRcdGlmICghQ1JZUFRPX0hBVkVfRUNESCkge1xuXHRcdFx0dGhpcy5fZWNQYXJhbXMgPSBuZXcgWDlFQ1BhcmFtZXRlcnModGhpcy5fY3VydmUpO1xuXG5cdFx0XHRpZiAodGhpcy5faXNQcml2KSB7XG5cdFx0XHRcdHRoaXMuX3ByaXYgPSBuZXcgRUNQcml2YXRlKFxuXHRcdFx0XHQgICAgdGhpcy5fZWNQYXJhbXMsIGtleS5wYXJ0LmQuZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGN1cnZlID0ge1xuXHRcdFx0J25pc3RwMjU2JzogJ3ByaW1lMjU2djEnLFxuXHRcdFx0J25pc3RwMzg0JzogJ3NlY3AzODRyMScsXG5cdFx0XHQnbmlzdHA1MjEnOiAnc2VjcDUyMXIxJ1xuXHRcdH1ba2V5LmN1cnZlXTtcblx0XHR0aGlzLl9kaCA9IGNyeXB0by5jcmVhdGVFQ0RIKGN1cnZlKTtcblx0XHRpZiAodHlwZW9mICh0aGlzLl9kaCkgIT09ICdvYmplY3QnIHx8XG5cdFx0ICAgIHR5cGVvZiAodGhpcy5fZGguc2V0UHJpdmF0ZUtleSkgIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdENSWVBUT19IQVZFX0VDREggPSBmYWxzZTtcblx0XHRcdERpZmZpZUhlbGxtYW4uY2FsbCh0aGlzLCBrZXkpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5faXNQcml2KVxuXHRcdFx0dGhpcy5fZGguc2V0UHJpdmF0ZUtleShrZXkucGFydC5kLmRhdGEpO1xuXHRcdHRoaXMuX2RoLnNldFB1YmxpY0tleShrZXkucGFydC5RLmRhdGEpO1xuXG5cdH0gZWxzZSBpZiAoa2V5LnR5cGUgPT09ICdjdXJ2ZTI1NTE5Jykge1xuXHRcdGlmICh0aGlzLl9pc1ByaXYpIHtcblx0XHRcdHV0aWxzLmFzc2VydENvbXBhdGlibGUoa2V5LCBQcml2YXRlS2V5LCBbMSwgNV0sICdrZXknKTtcblx0XHRcdHRoaXMuX3ByaXYgPSBrZXkucGFydC5rLmRhdGE7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignREggbm90IHN1cHBvcnRlZCBmb3IgJyArIGtleS50eXBlICsgJyBrZXlzJykpO1xuXHR9XG59XG5cbkRpZmZpZUhlbGxtYW4ucHJvdG90eXBlLmdldFB1YmxpY0tleSA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKHRoaXMuX2lzUHJpdilcblx0XHRyZXR1cm4gKHRoaXMuX2tleS50b1B1YmxpYygpKTtcblx0cmV0dXJuICh0aGlzLl9rZXkpO1xufTtcblxuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuZ2V0UHJpdmF0ZUtleSA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKHRoaXMuX2lzUHJpdilcblx0XHRyZXR1cm4gKHRoaXMuX2tleSk7XG5cdGVsc2Vcblx0XHRyZXR1cm4gKHVuZGVmaW5lZCk7XG59O1xuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuZ2V0S2V5ID0gRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuZ2V0UHJpdmF0ZUtleTtcblxuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuX2tleUNoZWNrID0gZnVuY3Rpb24gKHBrLCBpc1B1Yikge1xuXHRhc3NlcnQub2JqZWN0KHBrLCAna2V5Jyk7XG5cdGlmICghaXNQdWIpXG5cdFx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShwaywgUHJpdmF0ZUtleSwgWzEsIDNdLCAna2V5Jyk7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUocGssIEtleSwgWzEsIDRdLCAna2V5Jyk7XG5cblx0aWYgKHBrLnR5cGUgIT09IHRoaXMuX2FsZ28pIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdBICcgKyBway50eXBlICsgJyBrZXkgY2Fubm90IGJlIHVzZWQgaW4gJyArXG5cdFx0ICAgIHRoaXMuX2FsZ28gKyAnIERpZmZpZS1IZWxsbWFuJykpO1xuXHR9XG5cblx0aWYgKHBrLmN1cnZlICE9PSB0aGlzLl9jdXJ2ZSkge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0Ega2V5IGZyb20gdGhlICcgKyBway5jdXJ2ZSArICcgY3VydmUgJyArXG5cdFx0ICAgICdjYW5ub3QgYmUgdXNlZCB3aXRoIGEgJyArIHRoaXMuX2N1cnZlICtcblx0XHQgICAgJyBEaWZmaWUtSGVsbG1hbicpKTtcblx0fVxuXG5cdGlmIChway50eXBlID09PSAnZHNhJykge1xuXHRcdGFzc2VydC5kZWVwRXF1YWwocGsucGFydC5wLCB0aGlzLl9wLFxuXHRcdCAgICAnRFNBIGtleSBwcmltZSBkb2VzIG5vdCBtYXRjaCcpO1xuXHRcdGFzc2VydC5kZWVwRXF1YWwocGsucGFydC5nLCB0aGlzLl9nLFxuXHRcdCAgICAnRFNBIGtleSBnZW5lcmF0b3IgZG9lcyBub3QgbWF0Y2gnKTtcblx0fVxufTtcblxuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuc2V0S2V5ID0gZnVuY3Rpb24gKHBrKSB7XG5cdHRoaXMuX2tleUNoZWNrKHBrKTtcblxuXHRpZiAocGsudHlwZSA9PT0gJ2RzYScpIHtcblx0XHR0aGlzLl9kaC5zZXRQcml2YXRlS2V5KHBrLnBhcnQueC5kYXRhKTtcblx0XHR0aGlzLl9kaC5zZXRQdWJsaWNLZXkocGsucGFydC55LmRhdGEpO1xuXG5cdH0gZWxzZSBpZiAocGsudHlwZSA9PT0gJ2VjZHNhJykge1xuXHRcdGlmIChDUllQVE9fSEFWRV9FQ0RIKSB7XG5cdFx0XHR0aGlzLl9kaC5zZXRQcml2YXRlS2V5KHBrLnBhcnQuZC5kYXRhKTtcblx0XHRcdHRoaXMuX2RoLnNldFB1YmxpY0tleShway5wYXJ0LlEuZGF0YSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX3ByaXYgPSBuZXcgRUNQcml2YXRlKFxuXHRcdFx0ICAgIHRoaXMuX2VjUGFyYW1zLCBway5wYXJ0LmQuZGF0YSk7XG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAocGsudHlwZSA9PT0gJ2N1cnZlMjU1MTknKSB7XG5cdFx0dmFyIGsgPSBway5wYXJ0Lms7XG5cdFx0aWYgKCFway5wYXJ0LmspXG5cdFx0XHRrID0gcGsucGFydC5yO1xuXHRcdHRoaXMuX3ByaXYgPSBrLmRhdGE7XG5cdFx0aWYgKHRoaXMuX3ByaXZbMF0gPT09IDB4MDApXG5cdFx0XHR0aGlzLl9wcml2ID0gdGhpcy5fcHJpdi5zbGljZSgxKTtcblx0XHR0aGlzLl9wcml2ID0gdGhpcy5fcHJpdi5zbGljZSgwLCAzMik7XG5cdH1cblx0dGhpcy5fa2V5ID0gcGs7XG5cdHRoaXMuX2lzUHJpdiA9IHRydWU7XG59O1xuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuc2V0UHJpdmF0ZUtleSA9IERpZmZpZUhlbGxtYW4ucHJvdG90eXBlLnNldEtleTtcblxuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuY29tcHV0ZVNlY3JldCA9IGZ1bmN0aW9uIChvdGhlcnBrKSB7XG5cdHRoaXMuX2tleUNoZWNrKG90aGVycGssIHRydWUpO1xuXHRpZiAoIXRoaXMuX2lzUHJpdilcblx0XHR0aHJvdyAobmV3IEVycm9yKCdESCBleGNoYW5nZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCAnICtcblx0XHQgICAgJ2EgcHJpdmF0ZSBrZXkgeWV0JykpO1xuXG5cdHZhciBwdWI7XG5cdGlmICh0aGlzLl9hbGdvID09PSAnZHNhJykge1xuXHRcdHJldHVybiAodGhpcy5fZGguY29tcHV0ZVNlY3JldChcblx0XHQgICAgb3RoZXJway5wYXJ0LnkuZGF0YSkpO1xuXG5cdH0gZWxzZSBpZiAodGhpcy5fYWxnbyA9PT0gJ2VjZHNhJykge1xuXHRcdGlmIChDUllQVE9fSEFWRV9FQ0RIKSB7XG5cdFx0XHRyZXR1cm4gKHRoaXMuX2RoLmNvbXB1dGVTZWNyZXQoXG5cdFx0XHQgICAgb3RoZXJway5wYXJ0LlEuZGF0YSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwdWIgPSBuZXcgRUNQdWJsaWMoXG5cdFx0XHQgICAgdGhpcy5fZWNQYXJhbXMsIG90aGVycGsucGFydC5RLmRhdGEpO1xuXHRcdFx0cmV0dXJuICh0aGlzLl9wcml2LmRlcml2ZVNoYXJlZFNlY3JldChwdWIpKTtcblx0XHR9XG5cblx0fSBlbHNlIGlmICh0aGlzLl9hbGdvID09PSAnY3VydmUyNTUxOScpIHtcblx0XHRwdWIgPSBvdGhlcnBrLnBhcnQuQS5kYXRhO1xuXHRcdHdoaWxlIChwdWJbMF0gPT09IDB4MDAgJiYgcHViLmxlbmd0aCA+IDMyKVxuXHRcdFx0cHViID0gcHViLnNsaWNlKDEpO1xuXHRcdHZhciBwcml2ID0gdGhpcy5fcHJpdjtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocHViLmxlbmd0aCwgMzIpO1xuXHRcdGFzc2VydC5zdHJpY3RFcXVhbChwcml2Lmxlbmd0aCwgMzIpO1xuXG5cdFx0dmFyIHNlY3JldCA9IG5hY2wuYm94LmJlZm9yZShuZXcgVWludDhBcnJheShwdWIpLFxuXHRcdCAgICBuZXcgVWludDhBcnJheShwcml2KSk7XG5cblx0XHRyZXR1cm4gKEJ1ZmZlci5mcm9tKHNlY3JldCkpO1xuXHR9XG5cblx0dGhyb3cgKG5ldyBFcnJvcignSW52YWxpZCBhbGdvcml0aG06ICcgKyB0aGlzLl9hbGdvKSk7XG59O1xuXG5EaWZmaWVIZWxsbWFuLnByb3RvdHlwZS5nZW5lcmF0ZUtleSA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHBhcnRzID0gW107XG5cdHZhciBwcml2LCBwdWI7XG5cdGlmICh0aGlzLl9hbGdvID09PSAnZHNhJykge1xuXHRcdHRoaXMuX2RoLmdlbmVyYXRlS2V5cygpO1xuXG5cdFx0cGFydHMucHVzaCh7bmFtZTogJ3AnLCBkYXRhOiB0aGlzLl9wLmRhdGF9KTtcblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAncScsIGRhdGE6IHRoaXMuX2tleS5wYXJ0LnEuZGF0YX0pO1xuXHRcdHBhcnRzLnB1c2goe25hbWU6ICdnJywgZGF0YTogdGhpcy5fZy5kYXRhfSk7XG5cdFx0cGFydHMucHVzaCh7bmFtZTogJ3knLCBkYXRhOiB0aGlzLl9kaC5nZXRQdWJsaWNLZXkoKX0pO1xuXHRcdHBhcnRzLnB1c2goe25hbWU6ICd4JywgZGF0YTogdGhpcy5fZGguZ2V0UHJpdmF0ZUtleSgpfSk7XG5cdFx0dGhpcy5fa2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0dHlwZTogJ2RzYScsXG5cdFx0XHRwYXJ0czogcGFydHNcblx0XHR9KTtcblx0XHR0aGlzLl9pc1ByaXYgPSB0cnVlO1xuXHRcdHJldHVybiAodGhpcy5fa2V5KTtcblxuXHR9IGVsc2UgaWYgKHRoaXMuX2FsZ28gPT09ICdlY2RzYScpIHtcblx0XHRpZiAoQ1JZUFRPX0hBVkVfRUNESCkge1xuXHRcdFx0dGhpcy5fZGguZ2VuZXJhdGVLZXlzKCk7XG5cblx0XHRcdHBhcnRzLnB1c2goe25hbWU6ICdjdXJ2ZScsXG5cdFx0XHQgICAgZGF0YTogQnVmZmVyLmZyb20odGhpcy5fY3VydmUpfSk7XG5cdFx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnUScsIGRhdGE6IHRoaXMuX2RoLmdldFB1YmxpY0tleSgpfSk7XG5cdFx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnZCcsIGRhdGE6IHRoaXMuX2RoLmdldFByaXZhdGVLZXkoKX0pO1xuXHRcdFx0dGhpcy5fa2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0XHR0eXBlOiAnZWNkc2EnLFxuXHRcdFx0XHRjdXJ2ZTogdGhpcy5fY3VydmUsXG5cdFx0XHRcdHBhcnRzOiBwYXJ0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9pc1ByaXYgPSB0cnVlO1xuXHRcdFx0cmV0dXJuICh0aGlzLl9rZXkpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBuID0gdGhpcy5fZWNQYXJhbXMuZ2V0TigpO1xuXHRcdFx0dmFyIHIgPSBuZXcganNibihjcnlwdG8ucmFuZG9tQnl0ZXMobi5iaXRMZW5ndGgoKSkpO1xuXHRcdFx0dmFyIG4xID0gbi5zdWJ0cmFjdChqc2JuLk9ORSk7XG5cdFx0XHRwcml2ID0gci5tb2QobjEpLmFkZChqc2JuLk9ORSk7XG5cdFx0XHRwdWIgPSB0aGlzLl9lY1BhcmFtcy5nZXRHKCkubXVsdGlwbHkocHJpdik7XG5cblx0XHRcdHByaXYgPSBCdWZmZXIuZnJvbShwcml2LnRvQnl0ZUFycmF5KCkpO1xuXHRcdFx0cHViID0gQnVmZmVyLmZyb20odGhpcy5fZWNQYXJhbXMuZ2V0Q3VydmUoKS5cblx0XHRcdCAgICBlbmNvZGVQb2ludEhleChwdWIpLCAnaGV4Jyk7XG5cblx0XHRcdHRoaXMuX3ByaXYgPSBuZXcgRUNQcml2YXRlKHRoaXMuX2VjUGFyYW1zLCBwcml2KTtcblxuXHRcdFx0cGFydHMucHVzaCh7bmFtZTogJ2N1cnZlJyxcblx0XHRcdCAgICBkYXRhOiBCdWZmZXIuZnJvbSh0aGlzLl9jdXJ2ZSl9KTtcblx0XHRcdHBhcnRzLnB1c2goe25hbWU6ICdRJywgZGF0YTogcHVifSk7XG5cdFx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnZCcsIGRhdGE6IHByaXZ9KTtcblxuXHRcdFx0dGhpcy5fa2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0XHR0eXBlOiAnZWNkc2EnLFxuXHRcdFx0XHRjdXJ2ZTogdGhpcy5fY3VydmUsXG5cdFx0XHRcdHBhcnRzOiBwYXJ0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9pc1ByaXYgPSB0cnVlO1xuXHRcdFx0cmV0dXJuICh0aGlzLl9rZXkpO1xuXHRcdH1cblxuXHR9IGVsc2UgaWYgKHRoaXMuX2FsZ28gPT09ICdjdXJ2ZTI1NTE5Jykge1xuXHRcdHZhciBwYWlyID0gbmFjbC5ib3gua2V5UGFpcigpO1xuXHRcdHByaXYgPSBCdWZmZXIuZnJvbShwYWlyLnNlY3JldEtleSk7XG5cdFx0cHViID0gQnVmZmVyLmZyb20ocGFpci5wdWJsaWNLZXkpO1xuXHRcdHByaXYgPSBCdWZmZXIuY29uY2F0KFtwcml2LCBwdWJdKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocHJpdi5sZW5ndGgsIDY0KTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocHViLmxlbmd0aCwgMzIpO1xuXG5cdFx0cGFydHMucHVzaCh7bmFtZTogJ0EnLCBkYXRhOiBwdWJ9KTtcblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnaycsIGRhdGE6IHByaXZ9KTtcblx0XHR0aGlzLl9rZXkgPSBuZXcgUHJpdmF0ZUtleSh7XG5cdFx0XHR0eXBlOiAnY3VydmUyNTUxOScsXG5cdFx0XHRwYXJ0czogcGFydHNcblx0XHR9KTtcblx0XHR0aGlzLl9pc1ByaXYgPSB0cnVlO1xuXHRcdHJldHVybiAodGhpcy5fa2V5KTtcblx0fVxuXG5cdHRocm93IChuZXcgRXJyb3IoJ0ludmFsaWQgYWxnb3JpdGhtOiAnICsgdGhpcy5fYWxnbykpO1xufTtcbkRpZmZpZUhlbGxtYW4ucHJvdG90eXBlLmdlbmVyYXRlS2V5cyA9IERpZmZpZUhlbGxtYW4ucHJvdG90eXBlLmdlbmVyYXRlS2V5O1xuXG4vKiBUaGVzZSBhcmUgaGVscGVycyBmb3IgdXNpbmcgZWNjLWpzYm4gKGZvciBub2RlIDAuMTAgY29tcGF0aWJpbGl0eSkuICovXG5cbmZ1bmN0aW9uIFg5RUNQYXJhbWV0ZXJzKG5hbWUpIHtcblx0dmFyIHBhcmFtcyA9IGFsZ3MuY3VydmVzW25hbWVdO1xuXHRhc3NlcnQub2JqZWN0KHBhcmFtcyk7XG5cblx0dmFyIHAgPSBuZXcganNibihwYXJhbXMucCk7XG5cdHZhciBhID0gbmV3IGpzYm4ocGFyYW1zLmEpO1xuXHR2YXIgYiA9IG5ldyBqc2JuKHBhcmFtcy5iKTtcblx0dmFyIG4gPSBuZXcganNibihwYXJhbXMubik7XG5cdHZhciBoID0ganNibi5PTkU7XG5cdHZhciBjdXJ2ZSA9IG5ldyBlYy5FQ0N1cnZlRnAocCwgYSwgYik7XG5cdHZhciBHID0gY3VydmUuZGVjb2RlUG9pbnRIZXgocGFyYW1zLkcudG9TdHJpbmcoJ2hleCcpKTtcblxuXHR0aGlzLmN1cnZlID0gY3VydmU7XG5cdHRoaXMuZyA9IEc7XG5cdHRoaXMubiA9IG47XG5cdHRoaXMuaCA9IGg7XG59XG5YOUVDUGFyYW1ldGVycy5wcm90b3R5cGUuZ2V0Q3VydmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJ2ZSk7IH07XG5YOUVDUGFyYW1ldGVycy5wcm90b3R5cGUuZ2V0RyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmcpOyB9O1xuWDlFQ1BhcmFtZXRlcnMucHJvdG90eXBlLmdldE4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5uKTsgfTtcblg5RUNQYXJhbWV0ZXJzLnByb3RvdHlwZS5nZXRIID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuaCk7IH07XG5cbmZ1bmN0aW9uIEVDUHVibGljKHBhcmFtcywgYnVmZmVyKSB7XG5cdHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcblx0aWYgKGJ1ZmZlclswXSA9PT0gMHgwMClcblx0XHRidWZmZXIgPSBidWZmZXIuc2xpY2UoMSk7XG5cdHRoaXMuX3B1YiA9IHBhcmFtcy5nZXRDdXJ2ZSgpLmRlY29kZVBvaW50SGV4KGJ1ZmZlci50b1N0cmluZygnaGV4JykpO1xufVxuXG5mdW5jdGlvbiBFQ1ByaXZhdGUocGFyYW1zLCBidWZmZXIpIHtcblx0dGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuXHR0aGlzLl9wcml2ID0gbmV3IGpzYm4odXRpbHMubXBOb3JtYWxpemUoYnVmZmVyKSk7XG59XG5FQ1ByaXZhdGUucHJvdG90eXBlLmRlcml2ZVNoYXJlZFNlY3JldCA9IGZ1bmN0aW9uIChwdWJLZXkpIHtcblx0YXNzZXJ0Lm9rKHB1YktleSBpbnN0YW5jZW9mIEVDUHVibGljKTtcblx0dmFyIFMgPSBwdWJLZXkuX3B1Yi5tdWx0aXBseSh0aGlzLl9wcml2KTtcblx0cmV0dXJuIChCdWZmZXIuZnJvbShTLmdldFgoKS50b0JpZ0ludGVnZXIoKS50b0J5dGVBcnJheSgpKSk7XG59O1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUVEMjU1MTkoKSB7XG5cdHZhciBwYWlyID0gbmFjbC5zaWduLmtleVBhaXIoKTtcblx0dmFyIHByaXYgPSBCdWZmZXIuZnJvbShwYWlyLnNlY3JldEtleSk7XG5cdHZhciBwdWIgPSBCdWZmZXIuZnJvbShwYWlyLnB1YmxpY0tleSk7XG5cdGFzc2VydC5zdHJpY3RFcXVhbChwcml2Lmxlbmd0aCwgNjQpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwocHViLmxlbmd0aCwgMzIpO1xuXG5cdHZhciBwYXJ0cyA9IFtdO1xuXHRwYXJ0cy5wdXNoKHtuYW1lOiAnQScsIGRhdGE6IHB1Yn0pO1xuXHRwYXJ0cy5wdXNoKHtuYW1lOiAnaycsIGRhdGE6IHByaXYuc2xpY2UoMCwgMzIpfSk7XG5cdHZhciBrZXkgPSBuZXcgUHJpdmF0ZUtleSh7XG5cdFx0dHlwZTogJ2VkMjU1MTknLFxuXHRcdHBhcnRzOiBwYXJ0c1xuXHR9KTtcblx0cmV0dXJuIChrZXkpO1xufVxuXG4vKiBHZW5lcmF0ZXMgYSBuZXcgRUNEU0EgcHJpdmF0ZSBrZXkgb24gYSBnaXZlbiBjdXJ2ZS4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRUNEU0EoY3VydmUpIHtcblx0dmFyIHBhcnRzID0gW107XG5cdHZhciBrZXk7XG5cblx0aWYgKENSWVBUT19IQVZFX0VDREgpIHtcblx0XHQvKlxuXHRcdCAqIE5vZGUgY3J5cHRvIGRvZXNuJ3QgZXhwb3NlIGtleSBnZW5lcmF0aW9uIGRpcmVjdGx5LCBidXQgdGhlXG5cdFx0ICogRUNESCBpbnN0YW5jZXMgY2FuIGdlbmVyYXRlIGtleXMuIEl0IHR1cm5zIG91dCB0aGlzIGp1c3Rcblx0XHQgKiBjYWxscyBpbnRvIHRoZSBPcGVuU1NMIGdlbmVyaWMga2V5IGdlbmVyYXRvciwgYW5kIHdlIGNhblxuXHRcdCAqIHJlYWQgaXRzIG91dHB1dCBoYXBwaWx5IHdpdGhvdXQgZG9pbmcgYW4gYWN0dWFsIERILiBTbyB3ZVxuXHRcdCAqIHVzZSB0aGF0IGhlcmUuXG5cdFx0ICovXG5cdFx0dmFyIG9zQ3VydmUgPSB7XG5cdFx0XHQnbmlzdHAyNTYnOiAncHJpbWUyNTZ2MScsXG5cdFx0XHQnbmlzdHAzODQnOiAnc2VjcDM4NHIxJyxcblx0XHRcdCduaXN0cDUyMSc6ICdzZWNwNTIxcjEnXG5cdFx0fVtjdXJ2ZV07XG5cblx0XHR2YXIgZGggPSBjcnlwdG8uY3JlYXRlRUNESChvc0N1cnZlKTtcblx0XHRkaC5nZW5lcmF0ZUtleXMoKTtcblxuXHRcdHBhcnRzLnB1c2goe25hbWU6ICdjdXJ2ZScsXG5cdFx0ICAgIGRhdGE6IEJ1ZmZlci5mcm9tKGN1cnZlKX0pO1xuXHRcdHBhcnRzLnB1c2goe25hbWU6ICdRJywgZGF0YTogZGguZ2V0UHVibGljS2V5KCl9KTtcblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnZCcsIGRhdGE6IGRoLmdldFByaXZhdGVLZXkoKX0pO1xuXG5cdFx0a2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRcdGN1cnZlOiBjdXJ2ZSxcblx0XHRcdHBhcnRzOiBwYXJ0c1xuXHRcdH0pO1xuXHRcdHJldHVybiAoa2V5KTtcblx0fSBlbHNlIHtcblxuXHRcdHZhciBlY1BhcmFtcyA9IG5ldyBYOUVDUGFyYW1ldGVycyhjdXJ2ZSk7XG5cblx0XHQvKiBUaGlzIGFsZ29yaXRobSB0YWtlbiBmcm9tIEZJUFMgUFVCIDE4Ni00IChzZWN0aW9uIEIuNC4xKSAqL1xuXHRcdHZhciBuID0gZWNQYXJhbXMuZ2V0TigpO1xuXHRcdC8qXG5cdFx0ICogVGhlIGNyeXB0by5yYW5kb21CeXRlcygpIGZ1bmN0aW9uIGNhbiBvbmx5IGdpdmUgdXMgd2hvbGVcblx0XHQgKiBieXRlcywgc28gdGFraW5nIGEgbm9kIGZyb20gWDkuNjIsIHdlIHJvdW5kIHVwLlxuXHRcdCAqL1xuXHRcdHZhciBjQnl0ZUxlbiA9IE1hdGguY2VpbCgobi5iaXRMZW5ndGgoKSArIDY0KSAvIDgpO1xuXHRcdHZhciBjID0gbmV3IGpzYm4oY3J5cHRvLnJhbmRvbUJ5dGVzKGNCeXRlTGVuKSk7XG5cblx0XHR2YXIgbjEgPSBuLnN1YnRyYWN0KGpzYm4uT05FKTtcblx0XHR2YXIgcHJpdiA9IGMubW9kKG4xKS5hZGQoanNibi5PTkUpO1xuXHRcdHZhciBwdWIgPSBlY1BhcmFtcy5nZXRHKCkubXVsdGlwbHkocHJpdik7XG5cblx0XHRwcml2ID0gQnVmZmVyLmZyb20ocHJpdi50b0J5dGVBcnJheSgpKTtcblx0XHRwdWIgPSBCdWZmZXIuZnJvbShlY1BhcmFtcy5nZXRDdXJ2ZSgpLlxuXHRcdCAgICBlbmNvZGVQb2ludEhleChwdWIpLCAnaGV4Jyk7XG5cblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnY3VydmUnLCBkYXRhOiBCdWZmZXIuZnJvbShjdXJ2ZSl9KTtcblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnUScsIGRhdGE6IHB1Yn0pO1xuXHRcdHBhcnRzLnB1c2goe25hbWU6ICdkJywgZGF0YTogcHJpdn0pO1xuXG5cdFx0a2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRcdGN1cnZlOiBjdXJ2ZSxcblx0XHRcdHBhcnRzOiBwYXJ0c1xuXHRcdH0pO1xuXHRcdHJldHVybiAoa2V5KTtcblx0fVxufVxuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0VmVyaWZpZXI6IFZlcmlmaWVyLFxuXHRTaWduZXI6IFNpZ25lclxufTtcblxudmFyIG5hY2wgPSByZXF1aXJlKCd0d2VldG5hY2wnKTtcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG5cbmZ1bmN0aW9uIFZlcmlmaWVyKGtleSwgaGFzaEFsZ28pIHtcblx0aWYgKGhhc2hBbGdvLnRvTG93ZXJDYXNlKCkgIT09ICdzaGE1MTInKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ0VEMjU1MTkgb25seSBzdXBwb3J0cyB0aGUgdXNlIG9mICcgK1xuXHRcdCAgICAnU0hBLTUxMiBoYXNoZXMnKSk7XG5cblx0dGhpcy5rZXkgPSBrZXk7XG5cdHRoaXMuY2h1bmtzID0gW107XG5cblx0c3RyZWFtLldyaXRhYmxlLmNhbGwodGhpcywge30pO1xufVxudXRpbC5pbmhlcml0cyhWZXJpZmllciwgc3RyZWFtLldyaXRhYmxlKTtcblxuVmVyaWZpZXIucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jLCBjYikge1xuXHR0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcblx0Y2IoKTtcbn07XG5cblZlcmlmaWVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoY2h1bmspIHtcblx0aWYgKHR5cGVvZiAoY2h1bmspID09PSAnc3RyaW5nJylcblx0XHRjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCAnYmluYXJ5Jyk7XG5cdHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuVmVyaWZpZXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIChzaWduYXR1cmUsIGZtdCkge1xuXHR2YXIgc2lnO1xuXHRpZiAoU2lnbmF0dXJlLmlzU2lnbmF0dXJlKHNpZ25hdHVyZSwgWzIsIDBdKSkge1xuXHRcdGlmIChzaWduYXR1cmUudHlwZSAhPT0gJ2VkMjU1MTknKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cdFx0c2lnID0gc2lnbmF0dXJlLnRvQnVmZmVyKCdyYXcnKTtcblxuXHR9IGVsc2UgaWYgKHR5cGVvZiAoc2lnbmF0dXJlKSA9PT0gJ3N0cmluZycpIHtcblx0XHRzaWcgPSBCdWZmZXIuZnJvbShzaWduYXR1cmUsICdiYXNlNjQnKTtcblxuXHR9IGVsc2UgaWYgKFNpZ25hdHVyZS5pc1NpZ25hdHVyZShzaWduYXR1cmUsIFsxLCAwXSkpIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdzaWduYXR1cmUgd2FzIGNyZWF0ZWQgYnkgdG9vIG9sZCAnICtcblx0XHQgICAgJ2EgdmVyc2lvbiBvZiBzc2hwayBhbmQgY2Fubm90IGJlIHZlcmlmaWVkJykpO1xuXHR9XG5cblx0YXNzZXJ0LmJ1ZmZlcihzaWcpO1xuXHRyZXR1cm4gKG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkoXG5cdCAgICBuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KHRoaXMuY2h1bmtzKSksXG5cdCAgICBuZXcgVWludDhBcnJheShzaWcpLFxuXHQgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5rZXkucGFydC5BLmRhdGEpKSk7XG59O1xuXG5mdW5jdGlvbiBTaWduZXIoa2V5LCBoYXNoQWxnbykge1xuXHRpZiAoaGFzaEFsZ28udG9Mb3dlckNhc2UoKSAhPT0gJ3NoYTUxMicpXG5cdFx0dGhyb3cgKG5ldyBFcnJvcignRUQyNTUxOSBvbmx5IHN1cHBvcnRzIHRoZSB1c2Ugb2YgJyArXG5cdFx0ICAgICdTSEEtNTEyIGhhc2hlcycpKTtcblxuXHR0aGlzLmtleSA9IGtleTtcblx0dGhpcy5jaHVua3MgPSBbXTtcblxuXHRzdHJlYW0uV3JpdGFibGUuY2FsbCh0aGlzLCB7fSk7XG59XG51dGlsLmluaGVyaXRzKFNpZ25lciwgc3RyZWFtLldyaXRhYmxlKTtcblxuU2lnbmVyLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcblx0dGhpcy5jaHVua3MucHVzaChjaHVuayk7XG5cdGNiKCk7XG59O1xuXG5TaWduZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuXHRpZiAodHlwZW9mIChjaHVuaykgPT09ICdzdHJpbmcnKVxuXHRcdGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssICdiaW5hcnknKTtcblx0dGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5TaWduZXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzaWcgPSBuYWNsLnNpZ24uZGV0YWNoZWQoXG5cdCAgICBuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KHRoaXMuY2h1bmtzKSksXG5cdCAgICBuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KFtcblx0XHR0aGlzLmtleS5wYXJ0LmsuZGF0YSwgdGhpcy5rZXkucGFydC5BLmRhdGFdKSkpO1xuXHR2YXIgc2lnQnVmID0gQnVmZmVyLmZyb20oc2lnKTtcblx0dmFyIHNpZ09iaiA9IFNpZ25hdHVyZS5wYXJzZShzaWdCdWYsICdlZDI1NTE5JywgJ3JhdycpO1xuXHRzaWdPYmouaGFzaEFsZ29yaXRobSA9ICdzaGE1MTInO1xuXHRyZXR1cm4gKHNpZ09iaik7XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDE4IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0cmVhZFBrY3M4OiByZWFkUGtjczgsXG5cdHdyaXRlOiB3cml0ZSxcblx0d3JpdGVQa2NzODogd3JpdGVQa2NzOCxcblx0cGtjczhUb0J1ZmZlcjogcGtjczhUb0J1ZmZlcixcblxuXHRyZWFkRUNEU0FDdXJ2ZTogcmVhZEVDRFNBQ3VydmUsXG5cdHdyaXRlRUNEU0FDdXJ2ZTogd3JpdGVFQ0RTQUN1cnZlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMScpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi4vYWxncycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi4vcHJpdmF0ZS1rZXknKTtcbnZhciBwZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucykge1xuXHRyZXR1cm4gKHBlbS5yZWFkKGJ1Ziwgb3B0aW9ucywgJ3BrY3M4JykpO1xufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMpIHtcblx0cmV0dXJuIChwZW0ud3JpdGUoa2V5LCBvcHRpb25zLCAncGtjczgnKSk7XG59XG5cbi8qIEhlbHBlciB0byByZWFkIGluIGEgc2luZ2xlIG1waW50ICovXG5mdW5jdGlvbiByZWFkTVBJbnQoZGVyLCBubSkge1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwoZGVyLnBlZWsoKSwgYXNuMS5CZXIuSW50ZWdlcixcblx0ICAgIG5tICsgJyBpcyBub3QgYW4gSW50ZWdlcicpO1xuXHRyZXR1cm4gKHV0aWxzLm1wTm9ybWFsaXplKGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkludGVnZXIsIHRydWUpKSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzOChhbGcsIHR5cGUsIGRlcikge1xuXHQvKiBQcml2YXRlIGtleXMgaW4gcGtjcyM4IGZvcm1hdCBoYXZlIGEgd2VpcmQgZXh0cmEgaW50ICovXG5cdGlmIChkZXIucGVlaygpID09PSBhc24xLkJlci5JbnRlZ2VyKSB7XG5cdFx0YXNzZXJ0LnN0cmljdEVxdWFsKHR5cGUsICdwcml2YXRlJyxcblx0XHQgICAgJ3VuZXhwZWN0ZWQgSW50ZWdlciBhdCBzdGFydCBvZiBwdWJsaWMga2V5Jyk7XG5cdFx0ZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSk7XG5cdH1cblxuXHRkZXIucmVhZFNlcXVlbmNlKCk7XG5cdHZhciBuZXh0ID0gZGVyLm9mZnNldCArIGRlci5sZW5ndGg7XG5cblx0dmFyIG9pZCA9IGRlci5yZWFkT0lEKCk7XG5cdHN3aXRjaCAob2lkKSB7XG5cdGNhc2UgJzEuMi44NDAuMTEzNTQ5LjEuMS4xJzpcblx0XHRkZXIuX29mZnNldCA9IG5leHQ7XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhSU0FQdWJsaWMoZGVyKSk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhSU0FQcml2YXRlKGRlcikpO1xuXHRjYXNlICcxLjIuODQwLjEwMDQwLjQuMSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhEU0FQdWJsaWMoZGVyKSk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhEU0FQcml2YXRlKGRlcikpO1xuXHRjYXNlICcxLjIuODQwLjEwMDQ1LjIuMSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhFQ0RTQVB1YmxpYyhkZXIpKTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gKHJlYWRQa2NzOEVDRFNBUHJpdmF0ZShkZXIpKTtcblx0Y2FzZSAnMS4zLjEwMS4xMTInOlxuXHRcdGlmICh0eXBlID09PSAncHVibGljJykge1xuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhFZERTQVB1YmxpYyhkZXIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhFZERTQVByaXZhdGUoZGVyKSk7XG5cdFx0fVxuXHRjYXNlICcxLjMuMTAxLjExMCc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKSB7XG5cdFx0XHRyZXR1cm4gKHJlYWRQa2NzOFgyNTUxOVB1YmxpYyhkZXIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhYMjU1MTlQcml2YXRlKGRlcikpO1xuXHRcdH1cblx0ZGVmYXVsdDpcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIGtleSB0eXBlIE9JRCAnICsgb2lkKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4UlNBUHVibGljKGRlcikge1xuXHQvLyBiaXQgc3RyaW5nIHNlcXVlbmNlXG5cdGRlci5yZWFkU2VxdWVuY2UoYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0ZGVyLnJlYWRCeXRlKCk7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblxuXHQvLyBtb2R1bHVzXG5cdHZhciBuID0gcmVhZE1QSW50KGRlciwgJ21vZHVsdXMnKTtcblx0dmFyIGUgPSByZWFkTVBJbnQoZGVyLCAnZXhwb25lbnQnKTtcblxuXHQvLyBub3csIG1ha2UgdGhlIGtleVxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdyc2EnLFxuXHRcdHNvdXJjZTogZGVyLm9yaWdpbmFsSW5wdXQsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ2UnLCBkYXRhOiBlIH0sXG5cdFx0XHR7IG5hbWU6ICduJywgZGF0YTogbiB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4UlNBUHJpdmF0ZShkZXIpIHtcblx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblxuXHR2YXIgdmVyID0gcmVhZE1QSW50KGRlciwgJ3ZlcnNpb24nKTtcblx0YXNzZXJ0LmVxdWFsKHZlclswXSwgMHgwLCAndW5rbm93biBSU0EgcHJpdmF0ZSBrZXkgdmVyc2lvbicpO1xuXG5cdC8vIG1vZHVsdXMgdGhlbiBwdWJsaWMgZXhwb25lbnRcblx0dmFyIG4gPSByZWFkTVBJbnQoZGVyLCAnbW9kdWx1cycpO1xuXHR2YXIgZSA9IHJlYWRNUEludChkZXIsICdwdWJsaWMgZXhwb25lbnQnKTtcblx0dmFyIGQgPSByZWFkTVBJbnQoZGVyLCAncHJpdmF0ZSBleHBvbmVudCcpO1xuXHR2YXIgcCA9IHJlYWRNUEludChkZXIsICdwcmltZTEnKTtcblx0dmFyIHEgPSByZWFkTVBJbnQoZGVyLCAncHJpbWUyJyk7XG5cdHZhciBkbW9kcCA9IHJlYWRNUEludChkZXIsICdleHBvbmVudDEnKTtcblx0dmFyIGRtb2RxID0gcmVhZE1QSW50KGRlciwgJ2V4cG9uZW50MicpO1xuXHR2YXIgaXFtcCA9IHJlYWRNUEludChkZXIsICdpcW1wJyk7XG5cblx0Ly8gbm93LCBtYWtlIHRoZSBrZXlcblx0dmFyIGtleSA9IHtcblx0XHR0eXBlOiAncnNhJyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnbicsIGRhdGE6IG4gfSxcblx0XHRcdHsgbmFtZTogJ2UnLCBkYXRhOiBlIH0sXG5cdFx0XHR7IG5hbWU6ICdkJywgZGF0YTogZCB9LFxuXHRcdFx0eyBuYW1lOiAnaXFtcCcsIGRhdGE6IGlxbXAgfSxcblx0XHRcdHsgbmFtZTogJ3AnLCBkYXRhOiBwIH0sXG5cdFx0XHR7IG5hbWU6ICdxJywgZGF0YTogcSB9LFxuXHRcdFx0eyBuYW1lOiAnZG1vZHAnLCBkYXRhOiBkbW9kcCB9LFxuXHRcdFx0eyBuYW1lOiAnZG1vZHEnLCBkYXRhOiBkbW9kcSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IFByaXZhdGVLZXkoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzOERTQVB1YmxpYyhkZXIpIHtcblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXG5cdHZhciBwID0gcmVhZE1QSW50KGRlciwgJ3AnKTtcblx0dmFyIHEgPSByZWFkTVBJbnQoZGVyLCAncScpO1xuXHR2YXIgZyA9IHJlYWRNUEludChkZXIsICdnJyk7XG5cblx0Ly8gYml0IHN0cmluZyBzZXF1ZW5jZVxuXHRkZXIucmVhZFNlcXVlbmNlKGFzbjEuQmVyLkJpdFN0cmluZyk7XG5cdGRlci5yZWFkQnl0ZSgpO1xuXG5cdHZhciB5ID0gcmVhZE1QSW50KGRlciwgJ3knKTtcblxuXHQvLyBub3csIG1ha2UgdGhlIGtleVxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdkc2EnLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICdwJywgZGF0YTogcCB9LFxuXHRcdFx0eyBuYW1lOiAncScsIGRhdGE6IHEgfSxcblx0XHRcdHsgbmFtZTogJ2cnLCBkYXRhOiBnIH0sXG5cdFx0XHR7IG5hbWU6ICd5JywgZGF0YTogeSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4RFNBUHJpdmF0ZShkZXIpIHtcblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXG5cdHZhciBwID0gcmVhZE1QSW50KGRlciwgJ3AnKTtcblx0dmFyIHEgPSByZWFkTVBJbnQoZGVyLCAncScpO1xuXHR2YXIgZyA9IHJlYWRNUEludChkZXIsICdnJyk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdHZhciB4ID0gcmVhZE1QSW50KGRlciwgJ3gnKTtcblxuXHQvKiBUaGUgcGtjcyM4IGZvcm1hdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwdWJsaWMga2V5ICovXG5cdHZhciB5ID0gdXRpbHMuY2FsY3VsYXRlRFNBUHVibGljKGcsIHAsIHgpO1xuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2RzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ3AnLCBkYXRhOiBwIH0sXG5cdFx0XHR7IG5hbWU6ICdxJywgZGF0YTogcSB9LFxuXHRcdFx0eyBuYW1lOiAnZycsIGRhdGE6IGcgfSxcblx0XHRcdHsgbmFtZTogJ3knLCBkYXRhOiB5IH0sXG5cdFx0XHR7IG5hbWU6ICd4JywgZGF0YTogeCB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IFByaXZhdGVLZXkoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRFQ0RTQUN1cnZlKGRlcikge1xuXHR2YXIgY3VydmVOYW1lLCBjdXJ2ZU5hbWVzO1xuXHR2YXIgaiwgYywgY2Q7XG5cblx0aWYgKGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLk9JRCkge1xuXHRcdHZhciBvaWQgPSBkZXIucmVhZE9JRCgpO1xuXG5cdFx0Y3VydmVOYW1lcyA9IE9iamVjdC5rZXlzKGFsZ3MuY3VydmVzKTtcblx0XHRmb3IgKGogPSAwOyBqIDwgY3VydmVOYW1lcy5sZW5ndGg7ICsraikge1xuXHRcdFx0YyA9IGN1cnZlTmFtZXNbal07XG5cdFx0XHRjZCA9IGFsZ3MuY3VydmVzW2NdO1xuXHRcdFx0aWYgKGNkLnBrY3M4b2lkID09PSBvaWQpIHtcblx0XHRcdFx0Y3VydmVOYW1lID0gYztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8gRUNQYXJhbWV0ZXJzIHNlcXVlbmNlXG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdHZhciB2ZXJzaW9uID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSk7XG5cdFx0YXNzZXJ0LnN0cmljdEVxdWFsKHZlcnNpb25bMF0sIDEsICdFQ0RTQSBrZXkgbm90IHZlcnNpb24gMScpO1xuXG5cdFx0dmFyIGN1cnZlID0ge307XG5cblx0XHQvLyBGaWVsZElEIHNlcXVlbmNlXG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdHZhciBmaWVsZFR5cGVPaWQgPSBkZXIucmVhZE9JRCgpO1xuXHRcdGFzc2VydC5zdHJpY3RFcXVhbChmaWVsZFR5cGVPaWQsICcxLjIuODQwLjEwMDQ1LjEuMScsXG5cdFx0ICAgICdFQ0RTQSBrZXkgaXMgbm90IGZyb20gYSBwcmltZS1maWVsZCcpO1xuXHRcdHZhciBwID0gY3VydmUucCA9IHV0aWxzLm1wTm9ybWFsaXplKFxuXHRcdCAgICBkZXIucmVhZFN0cmluZyhhc24xLkJlci5JbnRlZ2VyLCB0cnVlKSk7XG5cdFx0Lypcblx0XHQgKiBwIGFsd2F5cyBzdGFydHMgd2l0aCBhIDEgYml0LCBzbyBjb3VudCB0aGUgemVyb3MgdG8gZ2V0IGl0c1xuXHRcdCAqIHJlYWwgc2l6ZS5cblx0XHQgKi9cblx0XHRjdXJ2ZS5zaXplID0gcC5sZW5ndGggKiA4IC0gdXRpbHMuY291bnRaZXJvcyhwKTtcblxuXHRcdC8vIEN1cnZlIHNlcXVlbmNlXG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdGN1cnZlLmEgPSB1dGlscy5tcE5vcm1hbGl6ZShcblx0XHQgICAgZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuT2N0ZXRTdHJpbmcsIHRydWUpKTtcblx0XHRjdXJ2ZS5iID0gdXRpbHMubXBOb3JtYWxpemUoXG5cdFx0ICAgIGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKSk7XG5cdFx0aWYgKGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLkJpdFN0cmluZylcblx0XHRcdGN1cnZlLnMgPSBkZXIucmVhZFN0cmluZyhhc24xLkJlci5CaXRTdHJpbmcsIHRydWUpO1xuXG5cdFx0Ly8gQ29tYmluZWQgR3ggYW5kIEd5XG5cdFx0Y3VydmUuRyA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwoY3VydmUuR1swXSwgMHg0LFxuXHRcdCAgICAndW5jb21wcmVzc2VkIEcgaXMgcmVxdWlyZWQnKTtcblxuXHRcdGN1cnZlLm4gPSB1dGlscy5tcE5vcm1hbGl6ZShcblx0XHQgICAgZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSkpO1xuXHRcdGN1cnZlLmggPSB1dGlscy5tcE5vcm1hbGl6ZShcblx0XHQgICAgZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSkpO1xuXHRcdGFzc2VydC5zdHJpY3RFcXVhbChjdXJ2ZS5oWzBdLCAweDEsICdhIGNvZmFjdG9yPTEgY3VydmUgaXMgJyArXG5cdFx0ICAgICdyZXF1aXJlZCcpO1xuXG5cdFx0Y3VydmVOYW1lcyA9IE9iamVjdC5rZXlzKGFsZ3MuY3VydmVzKTtcblx0XHR2YXIga3MgPSBPYmplY3Qua2V5cyhjdXJ2ZSk7XG5cdFx0Zm9yIChqID0gMDsgaiA8IGN1cnZlTmFtZXMubGVuZ3RoOyArK2opIHtcblx0XHRcdGMgPSBjdXJ2ZU5hbWVzW2pdO1xuXHRcdFx0Y2QgPSBhbGdzLmN1cnZlc1tjXTtcblx0XHRcdHZhciBlcXVhbCA9IHRydWU7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGtzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHZhciBrID0ga3NbaV07XG5cdFx0XHRcdGlmIChjZFtrXSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRpZiAodHlwZW9mIChjZFtrXSkgPT09ICdvYmplY3QnICYmXG5cdFx0XHRcdCAgICBjZFtrXS5lcXVhbHMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmICghY2Rba10uZXF1YWxzKGN1cnZlW2tdKSkge1xuXHRcdFx0XHRcdFx0ZXF1YWwgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoY2Rba10pKSB7XG5cdFx0XHRcdFx0aWYgKGNkW2tdLnRvU3RyaW5nKCdiaW5hcnknKVxuXHRcdFx0XHRcdCAgICAhPT0gY3VydmVba10udG9TdHJpbmcoJ2JpbmFyeScpKSB7XG5cdFx0XHRcdFx0XHRlcXVhbCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChjZFtrXSAhPT0gY3VydmVba10pIHtcblx0XHRcdFx0XHRcdGVxdWFsID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChlcXVhbCkge1xuXHRcdFx0XHRjdXJ2ZU5hbWUgPSBjO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIChjdXJ2ZU5hbWUpO1xufVxuXG5mdW5jdGlvbiByZWFkUGtjczhFQ0RTQVByaXZhdGUoZGVyKSB7XG5cdHZhciBjdXJ2ZU5hbWUgPSByZWFkRUNEU0FDdXJ2ZShkZXIpO1xuXHRhc3NlcnQuc3RyaW5nKGN1cnZlTmFtZSwgJ2Ega25vd24gZWxsaXB0aWMgY3VydmUnKTtcblxuXHRkZXIucmVhZFNlcXVlbmNlKGFzbjEuQmVyLk9jdGV0U3RyaW5nKTtcblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXG5cdHZhciB2ZXJzaW9uID0gcmVhZE1QSW50KGRlciwgJ3ZlcnNpb24nKTtcblx0YXNzZXJ0LmVxdWFsKHZlcnNpb25bMF0sIDEsICd1bmtub3duIHZlcnNpb24gb2YgRUNEU0Ega2V5Jyk7XG5cblx0dmFyIGQgPSBkZXIucmVhZFN0cmluZyhhc24xLkJlci5PY3RldFN0cmluZywgdHJ1ZSk7XG5cdHZhciBRO1xuXG5cdGlmIChkZXIucGVlaygpID09IDB4YTApIHtcblx0XHRkZXIucmVhZFNlcXVlbmNlKDB4YTApO1xuXHRcdGRlci5fb2Zmc2V0ICs9IGRlci5sZW5ndGg7XG5cdH1cblx0aWYgKGRlci5wZWVrKCkgPT0gMHhhMSkge1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoMHhhMSk7XG5cdFx0USA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkJpdFN0cmluZywgdHJ1ZSk7XG5cdFx0USA9IHV0aWxzLmVjTm9ybWFsaXplKFEpO1xuXHR9XG5cblx0aWYgKFEgPT09IHVuZGVmaW5lZCkge1xuXHRcdHZhciBwdWIgPSB1dGlscy5wdWJsaWNGcm9tUHJpdmF0ZUVDRFNBKGN1cnZlTmFtZSwgZCk7XG5cdFx0USA9IHB1Yi5wYXJ0LlEuZGF0YTtcblx0fVxuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnY3VydmUnLCBkYXRhOiBCdWZmZXIuZnJvbShjdXJ2ZU5hbWUpIH0sXG5cdFx0XHR7IG5hbWU6ICdRJywgZGF0YTogUSB9LFxuXHRcdFx0eyBuYW1lOiAnZCcsIGRhdGE6IGQgfVxuXHRcdF1cblx0fTtcblxuXHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KGtleSkpO1xufVxuXG5mdW5jdGlvbiByZWFkUGtjczhFQ0RTQVB1YmxpYyhkZXIpIHtcblx0dmFyIGN1cnZlTmFtZSA9IHJlYWRFQ0RTQUN1cnZlKGRlcik7XG5cdGFzc2VydC5zdHJpbmcoY3VydmVOYW1lLCAnYSBrbm93biBlbGxpcHRpYyBjdXJ2ZScpO1xuXG5cdHZhciBRID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuQml0U3RyaW5nLCB0cnVlKTtcblx0USA9IHV0aWxzLmVjTm9ybWFsaXplKFEpO1xuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnY3VydmUnLCBkYXRhOiBCdWZmZXIuZnJvbShjdXJ2ZU5hbWUpIH0sXG5cdFx0XHR7IG5hbWU6ICdRJywgZGF0YTogUSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4RWREU0FQdWJsaWMoZGVyKSB7XG5cdGlmIChkZXIucGVlaygpID09PSAweDAwKVxuXHRcdGRlci5yZWFkQnl0ZSgpO1xuXG5cdHZhciBBID0gdXRpbHMucmVhZEJpdFN0cmluZyhkZXIpO1xuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2VkMjU1MTknLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICdBJywgZGF0YTogdXRpbHMuemVyb1BhZFRvTGVuZ3RoKEEsIDMyKSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4WDI1NTE5UHVibGljKGRlcikge1xuXHR2YXIgQSA9IHV0aWxzLnJlYWRCaXRTdHJpbmcoZGVyKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdjdXJ2ZTI1NTE5Jyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnQScsIGRhdGE6IHV0aWxzLnplcm9QYWRUb0xlbmd0aChBLCAzMikgfVxuXHRcdF1cblx0fTtcblxuXHRyZXR1cm4gKG5ldyBLZXkoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzOEVkRFNBUHJpdmF0ZShkZXIpIHtcblx0aWYgKGRlci5wZWVrKCkgPT09IDB4MDApXG5cdFx0ZGVyLnJlYWRCeXRlKCk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdHZhciBrID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuT2N0ZXRTdHJpbmcsIHRydWUpO1xuXHRrID0gdXRpbHMuemVyb1BhZFRvTGVuZ3RoKGssIDMyKTtcblxuXHR2YXIgQTtcblx0aWYgKGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLkJpdFN0cmluZykge1xuXHRcdEEgPSB1dGlscy5yZWFkQml0U3RyaW5nKGRlcik7XG5cdFx0QSA9IHV0aWxzLnplcm9QYWRUb0xlbmd0aChBLCAzMik7XG5cdH0gZWxzZSB7XG5cdFx0QSA9IHV0aWxzLmNhbGN1bGF0ZUVEMjU1MTlQdWJsaWMoayk7XG5cdH1cblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdlZDI1NTE5Jyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnQScsIGRhdGE6IHV0aWxzLnplcm9QYWRUb0xlbmd0aChBLCAzMikgfSxcblx0XHRcdHsgbmFtZTogJ2snLCBkYXRhOiB1dGlscy56ZXJvUGFkVG9MZW5ndGgoaywgMzIpIH1cblx0XHRdXG5cdH07XG5cblx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4WDI1NTE5UHJpdmF0ZShkZXIpIHtcblx0aWYgKGRlci5wZWVrKCkgPT09IDB4MDApXG5cdFx0ZGVyLnJlYWRCeXRlKCk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdHZhciBrID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuT2N0ZXRTdHJpbmcsIHRydWUpO1xuXHRrID0gdXRpbHMuemVyb1BhZFRvTGVuZ3RoKGssIDMyKTtcblxuXHR2YXIgQSA9IHV0aWxzLmNhbGN1bGF0ZVgyNTUxOVB1YmxpYyhrKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdjdXJ2ZTI1NTE5Jyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnQScsIGRhdGE6IHV0aWxzLnplcm9QYWRUb0xlbmd0aChBLCAzMikgfSxcblx0XHRcdHsgbmFtZTogJ2snLCBkYXRhOiB1dGlscy56ZXJvUGFkVG9MZW5ndGgoaywgMzIpIH1cblx0XHRdXG5cdH07XG5cblx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcGtjczhUb0J1ZmZlcihrZXkpIHtcblx0dmFyIGRlciA9IG5ldyBhc24xLkJlcldyaXRlcigpO1xuXHR3cml0ZVBrY3M4KGRlciwga2V5KTtcblx0cmV0dXJuIChkZXIuYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzOChkZXIsIGtleSkge1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdGlmIChQcml2YXRlS2V5LmlzUHJpdmF0ZUtleShrZXkpKSB7XG5cdFx0dmFyIHNpbGx5SW50ID0gQnVmZmVyLmZyb20oWzBdKTtcblx0XHRkZXIud3JpdGVCdWZmZXIoc2lsbHlJbnQsIGFzbjEuQmVyLkludGVnZXIpO1xuXHR9XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoKTtcblx0c3dpdGNoIChrZXkudHlwZSkge1xuXHRjYXNlICdyc2EnOlxuXHRcdGRlci53cml0ZU9JRCgnMS4yLjg0MC4xMTM1NDkuMS4xLjEnKTtcblx0XHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSlcblx0XHRcdHdyaXRlUGtjczhSU0FQcml2YXRlKGtleSwgZGVyKTtcblx0XHRlbHNlXG5cdFx0XHR3cml0ZVBrY3M4UlNBUHVibGljKGtleSwgZGVyKTtcblx0XHRicmVhaztcblx0Y2FzZSAnZHNhJzpcblx0XHRkZXIud3JpdGVPSUQoJzEuMi44NDAuMTAwNDAuNC4xJyk7XG5cdFx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0XHR3cml0ZVBrY3M4RFNBUHJpdmF0ZShrZXksIGRlcik7XG5cdFx0ZWxzZVxuXHRcdFx0d3JpdGVQa2NzOERTQVB1YmxpYyhrZXksIGRlcik7XG5cdFx0YnJlYWs7XG5cdGNhc2UgJ2VjZHNhJzpcblx0XHRkZXIud3JpdGVPSUQoJzEuMi44NDAuMTAwNDUuMi4xJyk7XG5cdFx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0XHR3cml0ZVBrY3M4RUNEU0FQcml2YXRlKGtleSwgZGVyKTtcblx0XHRlbHNlXG5cdFx0XHR3cml0ZVBrY3M4RUNEU0FQdWJsaWMoa2V5LCBkZXIpO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdlZDI1NTE5Jzpcblx0XHRkZXIud3JpdGVPSUQoJzEuMy4xMDEuMTEyJyk7XG5cdFx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdFZDI1NTE5IHByaXZhdGUga2V5cyBpbiBwa2NzOCAnICtcblx0XHRcdCAgICAnZm9ybWF0IGFyZSBub3Qgc3VwcG9ydGVkJykpO1xuXHRcdHdyaXRlUGtjczhFZERTQVB1YmxpYyhrZXksIGRlcik7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQga2V5IHR5cGU6ICcgKyBrZXkudHlwZSkpO1xuXHR9XG5cblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGtjczhSU0FQcml2YXRlKGtleSwgZGVyKSB7XG5cdGRlci53cml0ZU51bGwoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdHZhciB2ZXJzaW9uID0gQnVmZmVyLmZyb20oWzBdKTtcblx0ZGVyLndyaXRlQnVmZmVyKHZlcnNpb24sIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5uLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQuZS5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmQuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5wLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucS5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0aWYgKCFrZXkucGFydC5kbW9kcCB8fCAha2V5LnBhcnQuZG1vZHEpXG5cdFx0dXRpbHMuYWRkUlNBTWlzc2luZyhrZXkpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQuZG1vZHAuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5kbW9kcS5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmlxbXAuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3M4UlNBUHVibGljKGtleSwgZGVyKSB7XG5cdGRlci53cml0ZU51bGwoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0ZGVyLndyaXRlQnl0ZSgweDAwKTtcblxuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQubi5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmUuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3M4RFNBUHJpdmF0ZShrZXksIGRlcikge1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucC5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5nLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblxuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblxuXHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC54LmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzOERTQVB1YmxpYyhrZXksIGRlcikge1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucC5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5nLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0ZGVyLndyaXRlQnl0ZSgweDAwKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnkuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUVDRFNBQ3VydmUoa2V5LCBkZXIpIHtcblx0dmFyIGN1cnZlID0gYWxncy5jdXJ2ZXNba2V5LmN1cnZlXTtcblx0aWYgKGN1cnZlLnBrY3M4b2lkKSB7XG5cdFx0LyogVGhpcyBvbmUgaGFzIGEgbmFtZSBpbiBwa2NzIzgsIHNvIGp1c3Qgd3JpdGUgdGhlIG9pZCAqL1xuXHRcdGRlci53cml0ZU9JRChjdXJ2ZS5wa2NzOG9pZCk7XG5cblx0fSBlbHNlIHtcblx0XHQvLyBFQ1BhcmFtZXRlcnMgc2VxdWVuY2Vcblx0XHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdFx0dmFyIHZlcnNpb24gPSBCdWZmZXIuZnJvbShbMV0pO1xuXHRcdGRlci53cml0ZUJ1ZmZlcih2ZXJzaW9uLCBhc24xLkJlci5JbnRlZ2VyKTtcblxuXHRcdC8vIEZpZWxkSUQgc2VxdWVuY2Vcblx0XHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXHRcdGRlci53cml0ZU9JRCgnMS4yLjg0MC4xMDA0NS4xLjEnKTsgLy8gcHJpbWUtZmllbGRcblx0XHRkZXIud3JpdGVCdWZmZXIoY3VydmUucCwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0XHQvLyBDdXJ2ZSBzZXF1ZW5jZVxuXHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0dmFyIGEgPSBjdXJ2ZS5wO1xuXHRcdGlmIChhWzBdID09PSAweDApXG5cdFx0XHRhID0gYS5zbGljZSgxKTtcblx0XHRkZXIud3JpdGVCdWZmZXIoYSwgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci53cml0ZUJ1ZmZlcihjdXJ2ZS5iLCBhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0ZGVyLndyaXRlQnVmZmVyKGN1cnZlLnMsIGFzbjEuQmVyLkJpdFN0cmluZyk7XG5cdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0XHRkZXIud3JpdGVCdWZmZXIoY3VydmUuRywgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci53cml0ZUJ1ZmZlcihjdXJ2ZS5uLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0XHR2YXIgaCA9IGN1cnZlLmg7XG5cdFx0aWYgKCFoKSB7XG5cdFx0XHRoID0gQnVmZmVyLmZyb20oWzFdKTtcblx0XHR9XG5cdFx0ZGVyLndyaXRlQnVmZmVyKGgsIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdFx0Ly8gRUNQYXJhbWV0ZXJzXG5cdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzOEVDRFNBUHVibGljKGtleSwgZGVyKSB7XG5cdHdyaXRlRUNEU0FDdXJ2ZShrZXksIGRlcik7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdHZhciBRID0gdXRpbHMuZWNOb3JtYWxpemUoa2V5LnBhcnQuUS5kYXRhLCB0cnVlKTtcblx0ZGVyLndyaXRlQnVmZmVyKFEsIGFzbjEuQmVyLkJpdFN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGtjczhFQ0RTQVByaXZhdGUoa2V5LCBkZXIpIHtcblx0d3JpdGVFQ0RTQUN1cnZlKGtleSwgZGVyKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdHZhciB2ZXJzaW9uID0gQnVmZmVyLmZyb20oWzFdKTtcblx0ZGVyLndyaXRlQnVmZmVyKHZlcnNpb24sIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5kLmRhdGEsIGFzbjEuQmVyLk9jdGV0U3RyaW5nKTtcblxuXHRkZXIuc3RhcnRTZXF1ZW5jZSgweGExKTtcblx0dmFyIFEgPSB1dGlscy5lY05vcm1hbGl6ZShrZXkucGFydC5RLmRhdGEsIHRydWUpO1xuXHRkZXIud3JpdGVCdWZmZXIoUSwgYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3M4RWREU0FQdWJsaWMoa2V5LCBkZXIpIHtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0dXRpbHMud3JpdGVCaXRTdHJpbmcoZGVyLCBrZXkucGFydC5BLmRhdGEpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3M4RWREU0FQcml2YXRlKGtleSwgZGVyKSB7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdHZhciBrID0gdXRpbHMubXBOb3JtYWxpemUoa2V5LnBhcnQuay5kYXRhLCB0cnVlKTtcblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRkZXIud3JpdGVCdWZmZXIoaywgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHJlYWRQa2NzMTogcmVhZFBrY3MxLFxuXHR3cml0ZTogd3JpdGUsXG5cdHdyaXRlUGtjczE6IHdyaXRlUGtjczFcbn07XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuLi9hbGdzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG52YXIgS2V5ID0gcmVxdWlyZSgnLi4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG52YXIgcGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcblxudmFyIHBrY3M4ID0gcmVxdWlyZSgnLi9wa2NzOCcpO1xudmFyIHJlYWRFQ0RTQUN1cnZlID0gcGtjczgucmVhZEVDRFNBQ3VydmU7XG5cbmZ1bmN0aW9uIHJlYWQoYnVmLCBvcHRpb25zKSB7XG5cdHJldHVybiAocGVtLnJlYWQoYnVmLCBvcHRpb25zLCAncGtjczEnKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlKGtleSwgb3B0aW9ucykge1xuXHRyZXR1cm4gKHBlbS53cml0ZShrZXksIG9wdGlvbnMsICdwa2NzMScpKTtcbn1cblxuLyogSGVscGVyIHRvIHJlYWQgaW4gYSBzaW5nbGUgbXBpbnQgKi9cbmZ1bmN0aW9uIHJlYWRNUEludChkZXIsIG5tKSB7XG5cdGFzc2VydC5zdHJpY3RFcXVhbChkZXIucGVlaygpLCBhc24xLkJlci5JbnRlZ2VyLFxuXHQgICAgbm0gKyAnIGlzIG5vdCBhbiBJbnRlZ2VyJyk7XG5cdHJldHVybiAodXRpbHMubXBOb3JtYWxpemUoZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxKGFsZywgdHlwZSwgZGVyKSB7XG5cdHN3aXRjaCAoYWxnKSB7XG5cdGNhc2UgJ1JTQSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczFSU0FQdWJsaWMoZGVyKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gJ3ByaXZhdGUnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczFSU0FQcml2YXRlKGRlcikpO1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ1Vua25vd24ga2V5IHR5cGU6ICcgKyB0eXBlKSk7XG5cdGNhc2UgJ0RTQSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczFEU0FQdWJsaWMoZGVyKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gJ3ByaXZhdGUnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczFEU0FQcml2YXRlKGRlcikpO1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ1Vua25vd24ga2V5IHR5cGU6ICcgKyB0eXBlKSk7XG5cdGNhc2UgJ0VDJzpcblx0Y2FzZSAnRUNEU0EnOlxuXHRcdGlmICh0eXBlID09PSAncHJpdmF0ZScpXG5cdFx0XHRyZXR1cm4gKHJlYWRQa2NzMUVDRFNBUHJpdmF0ZShkZXIpKTtcblx0XHRlbHNlIGlmICh0eXBlID09PSAncHVibGljJylcblx0XHRcdHJldHVybiAocmVhZFBrY3MxRUNEU0FQdWJsaWMoZGVyKSk7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5rbm93biBrZXkgdHlwZTogJyArIHR5cGUpKTtcblx0Y2FzZSAnRUREU0EnOlxuXHRjYXNlICdFZERTQSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwcml2YXRlJylcblx0XHRcdHJldHVybiAocmVhZFBrY3MxRWREU0FQcml2YXRlKGRlcikpO1xuXHRcdHRocm93IChuZXcgRXJyb3IodHlwZSArICcga2V5cyBub3Qgc3VwcG9ydGVkIHdpdGggRWREU0EnKSk7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5rbm93biBrZXkgYWxnbzogJyArIGFsZykpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzMVJTQVB1YmxpYyhkZXIpIHtcblx0Ly8gbW9kdWx1cyBhbmQgZXhwb25lbnRcblx0dmFyIG4gPSByZWFkTVBJbnQoZGVyLCAnbW9kdWx1cycpO1xuXHR2YXIgZSA9IHJlYWRNUEludChkZXIsICdleHBvbmVudCcpO1xuXG5cdC8vIG5vdywgbWFrZSB0aGUga2V5XG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ3JzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ2UnLCBkYXRhOiBlIH0sXG5cdFx0XHR7IG5hbWU6ICduJywgZGF0YTogbiB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxUlNBUHJpdmF0ZShkZXIpIHtcblx0dmFyIHZlcnNpb24gPSByZWFkTVBJbnQoZGVyLCAndmVyc2lvbicpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwodmVyc2lvblswXSwgMCk7XG5cblx0Ly8gbW9kdWx1cyB0aGVuIHB1YmxpYyBleHBvbmVudFxuXHR2YXIgbiA9IHJlYWRNUEludChkZXIsICdtb2R1bHVzJyk7XG5cdHZhciBlID0gcmVhZE1QSW50KGRlciwgJ3B1YmxpYyBleHBvbmVudCcpO1xuXHR2YXIgZCA9IHJlYWRNUEludChkZXIsICdwcml2YXRlIGV4cG9uZW50Jyk7XG5cdHZhciBwID0gcmVhZE1QSW50KGRlciwgJ3ByaW1lMScpO1xuXHR2YXIgcSA9IHJlYWRNUEludChkZXIsICdwcmltZTInKTtcblx0dmFyIGRtb2RwID0gcmVhZE1QSW50KGRlciwgJ2V4cG9uZW50MScpO1xuXHR2YXIgZG1vZHEgPSByZWFkTVBJbnQoZGVyLCAnZXhwb25lbnQyJyk7XG5cdHZhciBpcW1wID0gcmVhZE1QSW50KGRlciwgJ2lxbXAnKTtcblxuXHQvLyBub3csIG1ha2UgdGhlIGtleVxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdyc2EnLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICduJywgZGF0YTogbiB9LFxuXHRcdFx0eyBuYW1lOiAnZScsIGRhdGE6IGUgfSxcblx0XHRcdHsgbmFtZTogJ2QnLCBkYXRhOiBkIH0sXG5cdFx0XHR7IG5hbWU6ICdpcW1wJywgZGF0YTogaXFtcCB9LFxuXHRcdFx0eyBuYW1lOiAncCcsIGRhdGE6IHAgfSxcblx0XHRcdHsgbmFtZTogJ3EnLCBkYXRhOiBxIH0sXG5cdFx0XHR7IG5hbWU6ICdkbW9kcCcsIGRhdGE6IGRtb2RwIH0sXG5cdFx0XHR7IG5hbWU6ICdkbW9kcScsIGRhdGE6IGRtb2RxIH1cblx0XHRdXG5cdH07XG5cblx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxRFNBUHJpdmF0ZShkZXIpIHtcblx0dmFyIHZlcnNpb24gPSByZWFkTVBJbnQoZGVyLCAndmVyc2lvbicpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwodmVyc2lvbi5yZWFkVUludDgoMCksIDApO1xuXG5cdHZhciBwID0gcmVhZE1QSW50KGRlciwgJ3AnKTtcblx0dmFyIHEgPSByZWFkTVBJbnQoZGVyLCAncScpO1xuXHR2YXIgZyA9IHJlYWRNUEludChkZXIsICdnJyk7XG5cdHZhciB5ID0gcmVhZE1QSW50KGRlciwgJ3knKTtcblx0dmFyIHggPSByZWFkTVBJbnQoZGVyLCAneCcpO1xuXG5cdC8vIG5vdywgbWFrZSB0aGUga2V5XG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2RzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ3AnLCBkYXRhOiBwIH0sXG5cdFx0XHR7IG5hbWU6ICdxJywgZGF0YTogcSB9LFxuXHRcdFx0eyBuYW1lOiAnZycsIGRhdGE6IGcgfSxcblx0XHRcdHsgbmFtZTogJ3knLCBkYXRhOiB5IH0sXG5cdFx0XHR7IG5hbWU6ICd4JywgZGF0YTogeCB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IFByaXZhdGVLZXkoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzMUVkRFNBUHJpdmF0ZShkZXIpIHtcblx0dmFyIHZlcnNpb24gPSByZWFkTVBJbnQoZGVyLCAndmVyc2lvbicpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwodmVyc2lvbi5yZWFkVUludDgoMCksIDEpO1xuXG5cdC8vIHByaXZhdGUga2V5XG5cdHZhciBrID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuT2N0ZXRTdHJpbmcsIHRydWUpO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoMHhhMCk7XG5cdHZhciBvaWQgPSBkZXIucmVhZE9JRCgpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwob2lkLCAnMS4zLjEwMS4xMTInLCAndGhlIGVkMjU1MTkgY3VydmUgaWRlbnRpZmllcicpO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoMHhhMSk7XG5cdHZhciBBID0gdXRpbHMucmVhZEJpdFN0cmluZyhkZXIpO1xuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2VkMjU1MTknLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICdBJywgZGF0YTogdXRpbHMuemVyb1BhZFRvTGVuZ3RoKEEsIDMyKSB9LFxuXHRcdFx0eyBuYW1lOiAnaycsIGRhdGE6IGsgfVxuXHRcdF1cblx0fTtcblxuXHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KGtleSkpO1xufVxuXG5mdW5jdGlvbiByZWFkUGtjczFEU0FQdWJsaWMoZGVyKSB7XG5cdHZhciB5ID0gcmVhZE1QSW50KGRlciwgJ3knKTtcblx0dmFyIHAgPSByZWFkTVBJbnQoZGVyLCAncCcpO1xuXHR2YXIgcSA9IHJlYWRNUEludChkZXIsICdxJyk7XG5cdHZhciBnID0gcmVhZE1QSW50KGRlciwgJ2cnKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdkc2EnLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICd5JywgZGF0YTogeSB9LFxuXHRcdFx0eyBuYW1lOiAncCcsIGRhdGE6IHAgfSxcblx0XHRcdHsgbmFtZTogJ3EnLCBkYXRhOiBxIH0sXG5cdFx0XHR7IG5hbWU6ICdnJywgZGF0YTogZyB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxRUNEU0FQdWJsaWMoZGVyKSB7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblxuXHR2YXIgb2lkID0gZGVyLnJlYWRPSUQoKTtcblx0YXNzZXJ0LnN0cmljdEVxdWFsKG9pZCwgJzEuMi44NDAuMTAwNDUuMi4xJywgJ211c3QgYmUgZWNQdWJsaWNLZXknKTtcblxuXHR2YXIgY3VydmVPaWQgPSBkZXIucmVhZE9JRCgpO1xuXG5cdHZhciBjdXJ2ZTtcblx0dmFyIGN1cnZlcyA9IE9iamVjdC5rZXlzKGFsZ3MuY3VydmVzKTtcblx0Zm9yICh2YXIgaiA9IDA7IGogPCBjdXJ2ZXMubGVuZ3RoOyArK2opIHtcblx0XHR2YXIgYyA9IGN1cnZlc1tqXTtcblx0XHR2YXIgY2QgPSBhbGdzLmN1cnZlc1tjXTtcblx0XHRpZiAoY2QucGtjczhvaWQgPT09IGN1cnZlT2lkKSB7XG5cdFx0XHRjdXJ2ZSA9IGM7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0YXNzZXJ0LnN0cmluZyhjdXJ2ZSwgJ2Ega25vd24gRUNEU0EgbmFtZWQgY3VydmUnKTtcblxuXHR2YXIgUSA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkJpdFN0cmluZywgdHJ1ZSk7XG5cdFEgPSB1dGlscy5lY05vcm1hbGl6ZShRKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdlY2RzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ2N1cnZlJywgZGF0YTogQnVmZmVyLmZyb20oY3VydmUpIH0sXG5cdFx0XHR7IG5hbWU6ICdRJywgZGF0YTogUSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxRUNEU0FQcml2YXRlKGRlcikge1xuXHR2YXIgdmVyc2lvbiA9IHJlYWRNUEludChkZXIsICd2ZXJzaW9uJyk7XG5cdGFzc2VydC5zdHJpY3RFcXVhbCh2ZXJzaW9uLnJlYWRVSW50OCgwKSwgMSk7XG5cblx0Ly8gcHJpdmF0ZSBrZXlcblx0dmFyIGQgPSBkZXIucmVhZFN0cmluZyhhc24xLkJlci5PY3RldFN0cmluZywgdHJ1ZSk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZSgweGEwKTtcblx0dmFyIGN1cnZlID0gcmVhZEVDRFNBQ3VydmUoZGVyKTtcblx0YXNzZXJ0LnN0cmluZyhjdXJ2ZSwgJ2Ega25vd24gZWxsaXB0aWMgY3VydmUnKTtcblxuXHRkZXIucmVhZFNlcXVlbmNlKDB4YTEpO1xuXHR2YXIgUSA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkJpdFN0cmluZywgdHJ1ZSk7XG5cdFEgPSB1dGlscy5lY05vcm1hbGl6ZShRKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdlY2RzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ2N1cnZlJywgZGF0YTogQnVmZmVyLmZyb20oY3VydmUpIH0sXG5cdFx0XHR7IG5hbWU6ICdRJywgZGF0YTogUSB9LFxuXHRcdFx0eyBuYW1lOiAnZCcsIGRhdGE6IGQgfVxuXHRcdF1cblx0fTtcblxuXHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KGtleSkpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxKGRlciwga2V5KSB7XG5cdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cblx0c3dpdGNoIChrZXkudHlwZSkge1xuXHRjYXNlICdyc2EnOlxuXHRcdGlmIChQcml2YXRlS2V5LmlzUHJpdmF0ZUtleShrZXkpKVxuXHRcdFx0d3JpdGVQa2NzMVJTQVByaXZhdGUoZGVyLCBrZXkpO1xuXHRcdGVsc2Vcblx0XHRcdHdyaXRlUGtjczFSU0FQdWJsaWMoZGVyLCBrZXkpO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdkc2EnOlxuXHRcdGlmIChQcml2YXRlS2V5LmlzUHJpdmF0ZUtleShrZXkpKVxuXHRcdFx0d3JpdGVQa2NzMURTQVByaXZhdGUoZGVyLCBrZXkpO1xuXHRcdGVsc2Vcblx0XHRcdHdyaXRlUGtjczFEU0FQdWJsaWMoZGVyLCBrZXkpO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdlY2RzYSc6XG5cdFx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0XHR3cml0ZVBrY3MxRUNEU0FQcml2YXRlKGRlciwga2V5KTtcblx0XHRlbHNlXG5cdFx0XHR3cml0ZVBrY3MxRUNEU0FQdWJsaWMoZGVyLCBrZXkpO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdlZDI1NTE5Jzpcblx0XHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSlcblx0XHRcdHdyaXRlUGtjczFFZERTQVByaXZhdGUoZGVyLCBrZXkpO1xuXHRcdGVsc2Vcblx0XHRcdHdyaXRlUGtjczFFZERTQVB1YmxpYyhkZXIsIGtleSk7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5rbm93biBrZXkgYWxnbzogJyArIGtleS50eXBlKSk7XG5cdH1cblxuXHRkZXIuZW5kU2VxdWVuY2UoKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzMVJTQVB1YmxpYyhkZXIsIGtleSkge1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQubi5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmUuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGtjczFSU0FQcml2YXRlKGRlciwga2V5KSB7XG5cdHZhciB2ZXIgPSBCdWZmZXIuZnJvbShbMF0pO1xuXHRkZXIud3JpdGVCdWZmZXIodmVyLCBhc24xLkJlci5JbnRlZ2VyKTtcblxuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQubi5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmUuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5kLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucC5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGlmICgha2V5LnBhcnQuZG1vZHAgfHwgIWtleS5wYXJ0LmRtb2RxKVxuXHRcdHV0aWxzLmFkZFJTQU1pc3Npbmcoa2V5KTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmRtb2RwLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQuZG1vZHEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5pcW1wLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxRFNBUHJpdmF0ZShkZXIsIGtleSkge1xuXHR2YXIgdmVyID0gQnVmZmVyLmZyb20oWzBdKTtcblx0ZGVyLndyaXRlQnVmZmVyKHZlciwgYXNuMS5CZXIuSW50ZWdlcik7XG5cblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnAuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5xLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQuZy5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnkuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC54LmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxRFNBUHVibGljKGRlciwga2V5KSB7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC55LmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucC5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5nLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxRUNEU0FQdWJsaWMoZGVyLCBrZXkpIHtcblx0ZGVyLnN0YXJ0U2VxdWVuY2UoKTtcblxuXHRkZXIud3JpdGVPSUQoJzEuMi44NDAuMTAwNDUuMi4xJyk7IC8qIGVjUHVibGljS2V5ICovXG5cdHZhciBjdXJ2ZSA9IGtleS5wYXJ0LmN1cnZlLmRhdGEudG9TdHJpbmcoKTtcblx0dmFyIGN1cnZlT2lkID0gYWxncy5jdXJ2ZXNbY3VydmVdLnBrY3M4b2lkO1xuXHRhc3NlcnQuc3RyaW5nKGN1cnZlT2lkLCAnYSBrbm93biBFQ0RTQSBuYW1lZCBjdXJ2ZScpO1xuXHRkZXIud3JpdGVPSUQoY3VydmVPaWQpO1xuXG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdHZhciBRID0gdXRpbHMuZWNOb3JtYWxpemUoa2V5LnBhcnQuUS5kYXRhLCB0cnVlKTtcblx0ZGVyLndyaXRlQnVmZmVyKFEsIGFzbjEuQmVyLkJpdFN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGtjczFFQ0RTQVByaXZhdGUoZGVyLCBrZXkpIHtcblx0dmFyIHZlciA9IEJ1ZmZlci5mcm9tKFsxXSk7XG5cdGRlci53cml0ZUJ1ZmZlcih2ZXIsIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5kLmRhdGEsIGFzbjEuQmVyLk9jdGV0U3RyaW5nKTtcblxuXHRkZXIuc3RhcnRTZXF1ZW5jZSgweGEwKTtcblx0dmFyIGN1cnZlID0ga2V5LnBhcnQuY3VydmUuZGF0YS50b1N0cmluZygpO1xuXHR2YXIgY3VydmVPaWQgPSBhbGdzLmN1cnZlc1tjdXJ2ZV0ucGtjczhvaWQ7XG5cdGFzc2VydC5zdHJpbmcoY3VydmVPaWQsICdhIGtub3duIEVDRFNBIG5hbWVkIGN1cnZlJyk7XG5cdGRlci53cml0ZU9JRChjdXJ2ZU9pZCk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKDB4YTEpO1xuXHR2YXIgUSA9IHV0aWxzLmVjTm9ybWFsaXplKGtleS5wYXJ0LlEuZGF0YSwgdHJ1ZSk7XG5cdGRlci53cml0ZUJ1ZmZlcihRLCBhc24xLkJlci5CaXRTdHJpbmcpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzMUVkRFNBUHJpdmF0ZShkZXIsIGtleSkge1xuXHR2YXIgdmVyID0gQnVmZmVyLmZyb20oWzFdKTtcblx0ZGVyLndyaXRlQnVmZmVyKHZlciwgYXNuMS5CZXIuSW50ZWdlcik7XG5cblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmsuZGF0YSwgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKDB4YTApO1xuXHRkZXIud3JpdGVPSUQoJzEuMy4xMDEuMTEyJyk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKDB4YTEpO1xuXHR1dGlscy53cml0ZUJpdFN0cmluZyhkZXIsIGtleS5wYXJ0LkEuZGF0YSk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxRWREU0FQdWJsaWMoZGVyLCBrZXkpIHtcblx0dGhyb3cgKG5ldyBFcnJvcignUHVibGljIGtleXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIEVkRFNBIFBLQ1MjMScpKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQuYmluZCh1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQpLFxuXHRyZWFkVHlwZTogcmVhZC5iaW5kKHVuZGVmaW5lZCwgZmFsc2UpLFxuXHR3cml0ZTogd3JpdGUsXG5cdC8qIHNlbWktcHJpdmF0ZSBhcGksIHVzZWQgYnkgc3NocGstYWdlbnQgKi9cblx0cmVhZFBhcnRpYWw6IHJlYWQuYmluZCh1bmRlZmluZWQsIHRydWUpLFxuXG5cdC8qIHNoYXJlZCB3aXRoIHNzaCBmb3JtYXQgKi9cblx0cmVhZEludGVybmFsOiByZWFkLFxuXHRrZXlUeXBlVG9BbGc6IGtleVR5cGVUb0FsZyxcblx0YWxnVG9LZXlUeXBlOiBhbGdUb0tleVR5cGVcbn07XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi4vYWxncycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi4vcHJpdmF0ZS1rZXknKTtcbnZhciBTU0hCdWZmZXIgPSByZXF1aXJlKCcuLi9zc2gtYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIGFsZ1RvS2V5VHlwZShhbGcpIHtcblx0YXNzZXJ0LnN0cmluZyhhbGcpO1xuXHRpZiAoYWxnID09PSAnc3NoLWRzcycpXG5cdFx0cmV0dXJuICgnZHNhJyk7XG5cdGVsc2UgaWYgKGFsZyA9PT0gJ3NzaC1yc2EnKVxuXHRcdHJldHVybiAoJ3JzYScpO1xuXHRlbHNlIGlmIChhbGcgPT09ICdzc2gtZWQyNTUxOScpXG5cdFx0cmV0dXJuICgnZWQyNTUxOScpO1xuXHRlbHNlIGlmIChhbGcgPT09ICdzc2gtY3VydmUyNTUxOScpXG5cdFx0cmV0dXJuICgnY3VydmUyNTUxOScpO1xuXHRlbHNlIGlmIChhbGcubWF0Y2goL15lY2RzYS1zaGEyLS8pKVxuXHRcdHJldHVybiAoJ2VjZHNhJyk7XG5cdGVsc2Vcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIGFsZ29yaXRobSAnICsgYWxnKSk7XG59XG5cbmZ1bmN0aW9uIGtleVR5cGVUb0FsZyhrZXkpIHtcblx0YXNzZXJ0Lm9iamVjdChrZXkpO1xuXHRpZiAoa2V5LnR5cGUgPT09ICdkc2EnKVxuXHRcdHJldHVybiAoJ3NzaC1kc3MnKTtcblx0ZWxzZSBpZiAoa2V5LnR5cGUgPT09ICdyc2EnKVxuXHRcdHJldHVybiAoJ3NzaC1yc2EnKTtcblx0ZWxzZSBpZiAoa2V5LnR5cGUgPT09ICdlZDI1NTE5Jylcblx0XHRyZXR1cm4gKCdzc2gtZWQyNTUxOScpO1xuXHRlbHNlIGlmIChrZXkudHlwZSA9PT0gJ2N1cnZlMjU1MTknKVxuXHRcdHJldHVybiAoJ3NzaC1jdXJ2ZTI1NTE5Jyk7XG5cdGVsc2UgaWYgKGtleS50eXBlID09PSAnZWNkc2EnKVxuXHRcdHJldHVybiAoJ2VjZHNhLXNoYTItJyArIGtleS5wYXJ0LmN1cnZlLmRhdGEudG9TdHJpbmcoKSk7XG5cdGVsc2Vcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIGtleSB0eXBlICcgKyBrZXkudHlwZSkpO1xufVxuXG5mdW5jdGlvbiByZWFkKHBhcnRpYWwsIHR5cGUsIGJ1Ziwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIChidWYpID09PSAnc3RyaW5nJylcblx0XHRidWYgPSBCdWZmZXIuZnJvbShidWYpO1xuXHRhc3NlcnQuYnVmZmVyKGJ1ZiwgJ2J1ZicpO1xuXG5cdHZhciBrZXkgPSB7fTtcblxuXHR2YXIgcGFydHMgPSBrZXkucGFydHMgPSBbXTtcblx0dmFyIHNzaGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe2J1ZmZlcjogYnVmfSk7XG5cblx0dmFyIGFsZyA9IHNzaGJ1Zi5yZWFkU3RyaW5nKCk7XG5cdGFzc2VydC5vayghc3NoYnVmLmF0RW5kKCksICdrZXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwYXJ0Jyk7XG5cblx0a2V5LnR5cGUgPSBhbGdUb0tleVR5cGUoYWxnKTtcblxuXHR2YXIgcGFydENvdW50ID0gYWxncy5pbmZvW2tleS50eXBlXS5wYXJ0cy5sZW5ndGg7XG5cdGlmICh0eXBlICYmIHR5cGUgPT09ICdwcml2YXRlJylcblx0XHRwYXJ0Q291bnQgPSBhbGdzLnByaXZJbmZvW2tleS50eXBlXS5wYXJ0cy5sZW5ndGg7XG5cblx0d2hpbGUgKCFzc2hidWYuYXRFbmQoKSAmJiBwYXJ0cy5sZW5ndGggPCBwYXJ0Q291bnQpXG5cdFx0cGFydHMucHVzaChzc2hidWYucmVhZFBhcnQoKSk7XG5cdHdoaWxlICghcGFydGlhbCAmJiAhc3NoYnVmLmF0RW5kKCkpXG5cdFx0cGFydHMucHVzaChzc2hidWYucmVhZFBhcnQoKSk7XG5cblx0YXNzZXJ0Lm9rKHBhcnRzLmxlbmd0aCA+PSAxLFxuXHQgICAgJ2tleSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHBhcnQnKTtcblx0YXNzZXJ0Lm9rKHBhcnRpYWwgfHwgc3NoYnVmLmF0RW5kKCksXG5cdCAgICAnbGVmdG92ZXIgYnl0ZXMgYXQgZW5kIG9mIGtleScpO1xuXG5cdHZhciBDb25zdHJ1Y3RvciA9IEtleTtcblx0dmFyIGFsZ0luZm8gPSBhbGdzLmluZm9ba2V5LnR5cGVdO1xuXHRpZiAodHlwZSA9PT0gJ3ByaXZhdGUnIHx8IGFsZ0luZm8ucGFydHMubGVuZ3RoICE9PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRhbGdJbmZvID0gYWxncy5wcml2SW5mb1trZXkudHlwZV07XG5cdFx0Q29uc3RydWN0b3IgPSBQcml2YXRlS2V5O1xuXHR9XG5cdGFzc2VydC5zdHJpY3RFcXVhbChhbGdJbmZvLnBhcnRzLmxlbmd0aCwgcGFydHMubGVuZ3RoKTtcblxuXHRpZiAoa2V5LnR5cGUgPT09ICdlY2RzYScpIHtcblx0XHR2YXIgcmVzID0gL15lY2RzYS1zaGEyLSguKykkLy5leGVjKGFsZyk7XG5cdFx0YXNzZXJ0Lm9rKHJlcyAhPT0gbnVsbCk7XG5cdFx0YXNzZXJ0LnN0cmljdEVxdWFsKHJlc1sxXSwgcGFydHNbMF0uZGF0YS50b1N0cmluZygpKTtcblx0fVxuXG5cdHZhciBub3JtYWxpemVkID0gdHJ1ZTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhbGdJbmZvLnBhcnRzLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHAgPSBwYXJ0c1tpXTtcblx0XHRwLm5hbWUgPSBhbGdJbmZvLnBhcnRzW2ldO1xuXHRcdC8qXG5cdFx0ICogT3BlblNTSCBzdG9yZXMgZWQyNTUxOSBcInByaXZhdGVcIiBrZXlzIGFzIHNlZWQgKyBwdWJsaWMga2V5XG5cdFx0ICogY29uY2F0J2QgdG9nZXRoZXIgKGsgZm9sbG93ZWQgYnkgQSkuIFdlIHdhbnQgdG8ga2VlcCB0aGVtXG5cdFx0ICogc2VwYXJhdGUgZm9yIG90aGVyIGZvcm1hdHMgdGhhdCBkb24ndCBkbyB0aGlzLlxuXHRcdCAqL1xuXHRcdGlmIChrZXkudHlwZSA9PT0gJ2VkMjU1MTknICYmIHAubmFtZSA9PT0gJ2snKVxuXHRcdFx0cC5kYXRhID0gcC5kYXRhLnNsaWNlKDAsIDMyKTtcblxuXHRcdGlmIChwLm5hbWUgIT09ICdjdXJ2ZScgJiYgYWxnSW5mby5ub3JtYWxpemUgIT09IGZhbHNlKSB7XG5cdFx0XHR2YXIgbmQ7XG5cdFx0XHRpZiAoa2V5LnR5cGUgPT09ICdlZDI1NTE5Jykge1xuXHRcdFx0XHRuZCA9IHV0aWxzLnplcm9QYWRUb0xlbmd0aChwLmRhdGEsIDMyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5kID0gdXRpbHMubXBOb3JtYWxpemUocC5kYXRhKTtcblx0XHRcdH1cblx0XHRcdGlmIChuZC50b1N0cmluZygnYmluYXJ5JykgIT09XG5cdFx0XHQgICAgcC5kYXRhLnRvU3RyaW5nKCdiaW5hcnknKSkge1xuXHRcdFx0XHRwLmRhdGEgPSBuZDtcblx0XHRcdFx0bm9ybWFsaXplZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChub3JtYWxpemVkKVxuXHRcdGtleS5fcmZjNDI1M0NhY2hlID0gc3NoYnVmLnRvQnVmZmVyKCk7XG5cblx0aWYgKHBhcnRpYWwgJiYgdHlwZW9mIChwYXJ0aWFsKSA9PT0gJ29iamVjdCcpIHtcblx0XHRwYXJ0aWFsLnJlbWFpbmRlciA9IHNzaGJ1Zi5yZW1haW5kZXIoKTtcblx0XHRwYXJ0aWFsLmNvbnN1bWVkID0gc3NoYnVmLl9vZmZzZXQ7XG5cdH1cblxuXHRyZXR1cm4gKG5ldyBDb25zdHJ1Y3RvcihrZXkpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGUoa2V5LCBvcHRpb25zKSB7XG5cdGFzc2VydC5vYmplY3Qoa2V5KTtcblxuXHR2YXIgYWxnID0ga2V5VHlwZVRvQWxnKGtleSk7XG5cdHZhciBpO1xuXG5cdHZhciBhbGdJbmZvID0gYWxncy5pbmZvW2tleS50eXBlXTtcblx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0YWxnSW5mbyA9IGFsZ3MucHJpdkluZm9ba2V5LnR5cGVdO1xuXHR2YXIgcGFydHMgPSBhbGdJbmZvLnBhcnRzO1xuXG5cdHZhciBidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblxuXHRidWYud3JpdGVTdHJpbmcoYWxnKTtcblxuXHRmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgZGF0YSA9IGtleS5wYXJ0W3BhcnRzW2ldXS5kYXRhO1xuXHRcdGlmIChhbGdJbmZvLm5vcm1hbGl6ZSAhPT0gZmFsc2UpIHtcblx0XHRcdGlmIChrZXkudHlwZSA9PT0gJ2VkMjU1MTknKVxuXHRcdFx0XHRkYXRhID0gdXRpbHMuemVyb1BhZFRvTGVuZ3RoKGRhdGEsIDMyKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGF0YSA9IHV0aWxzLm1wTm9ybWFsaXplKGRhdGEpO1xuXHRcdH1cblx0XHRpZiAoa2V5LnR5cGUgPT09ICdlZDI1NTE5JyAmJiBwYXJ0c1tpXSA9PT0gJ2snKVxuXHRcdFx0ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGtleS5wYXJ0LkEuZGF0YV0pO1xuXHRcdGJ1Zi53cml0ZUJ1ZmZlcihkYXRhKTtcblx0fVxuXG5cdHJldHVybiAoYnVmLnRvQnVmZmVyKCkpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNyeXB0b19oYXNoX3NoYTUxMiA9IHJlcXVpcmUoJ3R3ZWV0bmFjbCcpLmxvd2xldmVsLmNyeXB0b19oYXNoO1xuXG4vKlxuICogVGhpcyBmaWxlIGlzIGEgMToxIHBvcnQgZnJvbSB0aGUgT3BlbkJTRCBibG93ZmlzaC5jIGFuZCBiY3J5cHRfcGJrZGYuYy4gQXMgYVxuICogcmVzdWx0LCBpdCByZXRhaW5zIHRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuIFRoZSB0d28gZmlsZXMgYXJlXG4gKiB1bmRlciBzbGlnaHRseSBkaWZmZXJlbnQgKGJ1dCBjb21wYXRpYmxlKSBsaWNlbnNlcywgYW5kIGFyZSBoZXJlIGNvbWJpbmVkIGluXG4gKiBvbmUgZmlsZS5cbiAqXG4gKiBDcmVkaXQgZm9yIHRoZSBhY3R1YWwgcG9ydGluZyB3b3JrIGdvZXMgdG86XG4gKiAgRGV2aSBNYW5kaXJpIDxtZUBkZXZpLndlYi5pZD5cbiAqL1xuXG4vKlxuICogVGhlIEJsb3dmaXNoIHBvcnRpb25zIGFyZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6XG4gKlxuICogQmxvd2Zpc2ggYmxvY2sgY2lwaGVyIGZvciBPcGVuQlNEXG4gKiBDb3B5cmlnaHQgMTk5NyBOaWVscyBQcm92b3MgPHByb3Zvc0BwaHlzbmV0LnVuaS1oYW1idXJnLmRlPlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBhZHZpY2UgYnkgRGF2aWQgTWF6aWVyZXMgPGRtQGxjcy5taXQuZWR1Pi5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICogYXJlIG1ldDpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0c1xuICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1JcbiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuXG4gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVRcbiAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8qXG4gKiBUaGUgYmNyeXB0X3Bia2RmIHBvcnRpb25zIGFyZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzIFRlZCBVbmFuZ3N0IDx0ZWR1QG9wZW5ic2Qub3JnPlxuICpcbiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxuICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZVxuICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFU1xuICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRlxuICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1JcbiAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVNcbiAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTlxuICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0ZcbiAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4gKi9cblxuLypcbiAqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyAoSmF2YXNjcmlwdC1zcGVjaWZpYyk6XG4gKlxuICogQ29weXJpZ2h0IDIwMTYsIEpveWVudCBJbmNcbiAqIEF1dGhvcjogQWxleCBXaWxzb24gPGFsZXgud2lsc29uQGpveWVudC5jb20+XG4gKlxuICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG4gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlXG4gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTXG4gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GXG4gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUlxuICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFU1xuICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOXG4gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRlxuICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbiAqL1xuXG4vLyBQb3J0ZWQgZnJvbSBPcGVuQlNEIGJjcnlwdF9wYmtkZi5jIHYxLjlcblxudmFyIEJMRl9KID0gMDtcblxudmFyIEJsb3dmaXNoID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuUyA9IFtcbiAgICBuZXcgVWludDMyQXJyYXkoW1xuICAgICAgMHhkMTMxMGJhNiwgMHg5OGRmYjVhYywgMHgyZmZkNzJkYiwgMHhkMDFhZGZiNyxcbiAgICAgIDB4YjhlMWFmZWQsIDB4NmEyNjdlOTYsIDB4YmE3YzkwNDUsIDB4ZjEyYzdmOTksXG4gICAgICAweDI0YTE5OTQ3LCAweGIzOTE2Y2Y3LCAweDA4MDFmMmUyLCAweDg1OGVmYzE2LFxuICAgICAgMHg2MzY5MjBkOCwgMHg3MTU3NGU2OSwgMHhhNDU4ZmVhMywgMHhmNDkzM2Q3ZSxcbiAgICAgIDB4MGQ5NTc0OGYsIDB4NzI4ZWI2NTgsIDB4NzE4YmNkNTgsIDB4ODIxNTRhZWUsXG4gICAgICAweDdiNTRhNDFkLCAweGMyNWE1OWI1LCAweDljMzBkNTM5LCAweDJhZjI2MDEzLFxuICAgICAgMHhjNWQxYjAyMywgMHgyODYwODVmMCwgMHhjYTQxNzkxOCwgMHhiOGRiMzhlZixcbiAgICAgIDB4OGU3OWRjYjAsIDB4NjAzYTE4MGUsIDB4NmM5ZTBlOGIsIDB4YjAxZThhM2UsXG4gICAgICAweGQ3MTU3N2MxLCAweGJkMzE0YjI3LCAweDc4YWYyZmRhLCAweDU1NjA1YzYwLFxuICAgICAgMHhlNjU1MjVmMywgMHhhYTU1YWI5NCwgMHg1NzQ4OTg2MiwgMHg2M2U4MTQ0MCxcbiAgICAgIDB4NTVjYTM5NmEsIDB4MmFhYjEwYjYsIDB4YjRjYzVjMzQsIDB4MTE0MWU4Y2UsXG4gICAgICAweGExNTQ4NmFmLCAweDdjNzJlOTkzLCAweGIzZWUxNDExLCAweDYzNmZiYzJhLFxuICAgICAgMHgyYmE5YzU1ZCwgMHg3NDE4MzFmNiwgMHhjZTVjM2UxNiwgMHg5Yjg3OTMxZSxcbiAgICAgIDB4YWZkNmJhMzMsIDB4NmMyNGNmNWMsIDB4N2EzMjUzODEsIDB4Mjg5NTg2NzcsXG4gICAgICAweDNiOGY0ODk4LCAweDZiNGJiOWFmLCAweGM0YmZlODFiLCAweDY2MjgyMTkzLFxuICAgICAgMHg2MWQ4MDljYywgMHhmYjIxYTk5MSwgMHg0ODdjYWM2MCwgMHg1ZGVjODAzMixcbiAgICAgIDB4ZWY4NDVkNWQsIDB4ZTk4NTc1YjEsIDB4ZGMyNjIzMDIsIDB4ZWI2NTFiODgsXG4gICAgICAweDIzODkzZTgxLCAweGQzOTZhY2M1LCAweDBmNmQ2ZmYzLCAweDgzZjQ0MjM5LFxuICAgICAgMHgyZTBiNDQ4MiwgMHhhNDg0MjAwNCwgMHg2OWM4ZjA0YSwgMHg5ZTFmOWI1ZSxcbiAgICAgIDB4MjFjNjY4NDIsIDB4ZjZlOTZjOWEsIDB4NjcwYzljNjEsIDB4YWJkMzg4ZjAsXG4gICAgICAweDZhNTFhMGQyLCAweGQ4NTQyZjY4LCAweDk2MGZhNzI4LCAweGFiNTEzM2EzLFxuICAgICAgMHg2ZWVmMGI2YywgMHgxMzdhM2JlNCwgMHhiYTNiZjA1MCwgMHg3ZWZiMmE5OCxcbiAgICAgIDB4YTFmMTY1MWQsIDB4MzlhZjAxNzYsIDB4NjZjYTU5M2UsIDB4ODI0MzBlODgsXG4gICAgICAweDhjZWU4NjE5LCAweDQ1NmY5ZmI0LCAweDdkODRhNWMzLCAweDNiOGI1ZWJlLFxuICAgICAgMHhlMDZmNzVkOCwgMHg4NWMxMjA3MywgMHg0MDFhNDQ5ZiwgMHg1NmMxNmFhNixcbiAgICAgIDB4NGVkM2FhNjIsIDB4MzYzZjc3MDYsIDB4MWJmZWRmNzIsIDB4NDI5YjAyM2QsXG4gICAgICAweDM3ZDBkNzI0LCAweGQwMGExMjQ4LCAweGRiMGZlYWQzLCAweDQ5ZjFjMDliLFxuICAgICAgMHgwNzUzNzJjOSwgMHg4MDk5MWI3YiwgMHgyNWQ0NzlkOCwgMHhmNmU4ZGVmNyxcbiAgICAgIDB4ZTNmZTUwMWEsIDB4YjY3OTRjM2IsIDB4OTc2Y2UwYmQsIDB4MDRjMDA2YmEsXG4gICAgICAweGMxYTk0ZmI2LCAweDQwOWY2MGM0LCAweDVlNWM5ZWMyLCAweDE5NmEyNDYzLFxuICAgICAgMHg2OGZiNmZhZiwgMHgzZTZjNTNiNSwgMHgxMzM5YjJlYiwgMHgzYjUyZWM2ZixcbiAgICAgIDB4NmRmYzUxMWYsIDB4OWIzMDk1MmMsIDB4Y2M4MTQ1NDQsIDB4YWY1ZWJkMDksXG4gICAgICAweGJlZTNkMDA0LCAweGRlMzM0YWZkLCAweDY2MGYyODA3LCAweDE5MmU0YmIzLFxuICAgICAgMHhjMGNiYTg1NywgMHg0NWM4NzQwZiwgMHhkMjBiNWYzOSwgMHhiOWQzZmJkYixcbiAgICAgIDB4NTU3OWMwYmQsIDB4MWE2MDMyMGEsIDB4ZDZhMTAwYzYsIDB4NDAyYzcyNzksXG4gICAgICAweDY3OWYyNWZlLCAweGZiMWZhM2NjLCAweDhlYTVlOWY4LCAweGRiMzIyMmY4LFxuICAgICAgMHgzYzc1MTZkZiwgMHhmZDYxNmIxNSwgMHgyZjUwMWVjOCwgMHhhZDA1NTJhYixcbiAgICAgIDB4MzIzZGI1ZmEsIDB4ZmQyMzg3NjAsIDB4NTMzMTdiNDgsIDB4M2UwMGRmODIsXG4gICAgICAweDllNWM1N2JiLCAweGNhNmY4Y2EwLCAweDFhODc1NjJlLCAweGRmMTc2OWRiLFxuICAgICAgMHhkNTQyYThmNiwgMHgyODdlZmZjMywgMHhhYzY3MzJjNiwgMHg4YzRmNTU3MyxcbiAgICAgIDB4Njk1YjI3YjAsIDB4YmJjYTU4YzgsIDB4ZTFmZmEzNWQsIDB4YjhmMDExYTAsXG4gICAgICAweDEwZmEzZDk4LCAweGZkMjE4M2I4LCAweDRhZmNiNTZjLCAweDJkZDFkMzViLFxuICAgICAgMHg5YTUzZTQ3OSwgMHhiNmY4NDU2NSwgMHhkMjhlNDliYywgMHg0YmZiOTc5MCxcbiAgICAgIDB4ZTFkZGYyZGEsIDB4YTRjYjdlMzMsIDB4NjJmYjEzNDEsIDB4Y2VlNGM2ZTgsXG4gICAgICAweGVmMjBjYWRhLCAweDM2Nzc0YzAxLCAweGQwN2U5ZWZlLCAweDJiZjExZmI0LFxuICAgICAgMHg5NWRiZGE0ZCwgMHhhZTkwOTE5OCwgMHhlYWFkOGU3MSwgMHg2YjkzZDVhMCxcbiAgICAgIDB4ZDA4ZWQxZDAsIDB4YWZjNzI1ZTAsIDB4OGUzYzViMmYsIDB4OGU3NTk0YjcsXG4gICAgICAweDhmZjZlMmZiLCAweGYyMTIyYjY0LCAweDg4ODhiODEyLCAweDkwMGRmMDFjLFxuICAgICAgMHg0ZmFkNWVhMCwgMHg2ODhmYzMxYywgMHhkMWNmZjE5MSwgMHhiM2E4YzFhZCxcbiAgICAgIDB4MmYyZjIyMTgsIDB4YmUwZTE3NzcsIDB4ZWE3NTJkZmUsIDB4OGIwMjFmYTEsXG4gICAgICAweGU1YTBjYzBmLCAweGI1NmY3NGU4LCAweDE4YWNmM2Q2LCAweGNlODllMjk5LFxuICAgICAgMHhiNGE4NGZlMCwgMHhmZDEzZTBiNywgMHg3Y2M0M2I4MSwgMHhkMmFkYThkOSxcbiAgICAgIDB4MTY1ZmEyNjYsIDB4ODA5NTc3MDUsIDB4OTNjYzczMTQsIDB4MjExYTE0NzcsXG4gICAgICAweGU2YWQyMDY1LCAweDc3YjVmYTg2LCAweGM3NTQ0MmY1LCAweGZiOWQzNWNmLFxuICAgICAgMHhlYmNkYWYwYywgMHg3YjNlODlhMCwgMHhkNjQxMWJkMywgMHhhZTFlN2U0OSxcbiAgICAgIDB4MDAyNTBlMmQsIDB4MjA3MWIzNWUsIDB4MjI2ODAwYmIsIDB4NTdiOGUwYWYsXG4gICAgICAweDI0NjQzNjliLCAweGYwMDliOTFlLCAweDU1NjM5MTFkLCAweDU5ZGZhNmFhLFxuICAgICAgMHg3OGMxNDM4OSwgMHhkOTVhNTM3ZiwgMHgyMDdkNWJhMiwgMHgwMmU1YjljNSxcbiAgICAgIDB4ODMyNjAzNzYsIDB4NjI5NWNmYTksIDB4MTFjODE5NjgsIDB4NGU3MzRhNDEsXG4gICAgICAweGIzNDcyZGNhLCAweDdiMTRhOTRhLCAweDFiNTEwMDUyLCAweDlhNTMyOTE1LFxuICAgICAgMHhkNjBmNTczZiwgMHhiYzliYzZlNCwgMHgyYjYwYTQ3NiwgMHg4MWU2NzQwMCxcbiAgICAgIDB4MDhiYTZmYjUsIDB4NTcxYmU5MWYsIDB4ZjI5NmVjNmIsIDB4MmEwZGQ5MTUsXG4gICAgICAweGI2NjM2NTIxLCAweGU3YjlmOWI2LCAweGZmMzQwNTJlLCAweGM1ODU1NjY0LFxuICAgICAgMHg1M2IwMmQ1ZCwgMHhhOTlmOGZhMSwgMHgwOGJhNDc5OSwgMHg2ZTg1MDc2YV0pLFxuICAgIG5ldyBVaW50MzJBcnJheShbXG4gICAgICAweDRiN2E3MGU5LCAweGI1YjMyOTQ0LCAweGRiNzUwOTJlLCAweGM0MTkyNjIzLFxuICAgICAgMHhhZDZlYTZiMCwgMHg0OWE3ZGY3ZCwgMHg5Y2VlNjBiOCwgMHg4ZmVkYjI2NixcbiAgICAgIDB4ZWNhYThjNzEsIDB4Njk5YTE3ZmYsIDB4NTY2NDUyNmMsIDB4YzJiMTllZTEsXG4gICAgICAweDE5MzYwMmE1LCAweDc1MDk0YzI5LCAweGEwNTkxMzQwLCAweGU0MTgzYTNlLFxuICAgICAgMHgzZjU0OTg5YSwgMHg1YjQyOWQ2NSwgMHg2YjhmZTRkNiwgMHg5OWY3M2ZkNixcbiAgICAgIDB4YTFkMjljMDcsIDB4ZWZlODMwZjUsIDB4NGQyZDM4ZTYsIDB4ZjAyNTVkYzEsXG4gICAgICAweDRjZGQyMDg2LCAweDg0NzBlYjI2LCAweDYzODJlOWM2LCAweDAyMWVjYzVlLFxuICAgICAgMHgwOTY4NmIzZiwgMHgzZWJhZWZjOSwgMHgzYzk3MTgxNCwgMHg2YjZhNzBhMSxcbiAgICAgIDB4Njg3ZjM1ODQsIDB4NTJhMGUyODYsIDB4Yjc5YzUzMDUsIDB4YWE1MDA3MzcsXG4gICAgICAweDNlMDc4NDFjLCAweDdmZGVhZTVjLCAweDhlN2Q0NGVjLCAweDU3MTZmMmI4LFxuICAgICAgMHhiMDNhZGEzNywgMHhmMDUwMGMwZCwgMHhmMDFjMWYwNCwgMHgwMjAwYjNmZixcbiAgICAgIDB4YWUwY2Y1MWEsIDB4M2NiNTc0YjIsIDB4MjU4MzdhNTgsIDB4ZGMwOTIxYmQsXG4gICAgICAweGQxOTExM2Y5LCAweDdjYTkyZmY2LCAweDk0MzI0NzczLCAweDIyZjU0NzAxLFxuICAgICAgMHgzYWU1ZTU4MSwgMHgzN2MyZGFkYywgMHhjOGI1NzYzNCwgMHg5YWYzZGRhNyxcbiAgICAgIDB4YTk0NDYxNDYsIDB4MGZkMDAzMGUsIDB4ZWNjOGM3M2UsIDB4YTQ3NTFlNDEsXG4gICAgICAweGUyMzhjZDk5LCAweDNiZWEwZTJmLCAweDMyODBiYmExLCAweDE4M2ViMzMxLFxuICAgICAgMHg0ZTU0OGIzOCwgMHg0ZjZkYjkwOCwgMHg2ZjQyMGQwMywgMHhmNjBhMDRiZixcbiAgICAgIDB4MmNiODEyOTAsIDB4MjQ5NzdjNzksIDB4NTY3OWIwNzIsIDB4YmNhZjg5YWYsXG4gICAgICAweGRlOWE3NzFmLCAweGQ5OTMwODEwLCAweGIzOGJhZTEyLCAweGRjY2YzZjJlLFxuICAgICAgMHg1NTEyNzIxZiwgMHgyZTZiNzEyNCwgMHg1MDFhZGRlNiwgMHg5Zjg0Y2Q4NyxcbiAgICAgIDB4N2E1ODQ3MTgsIDB4NzQwOGRhMTcsIDB4YmM5ZjlhYmMsIDB4ZTk0YjdkOGMsXG4gICAgICAweGVjN2FlYzNhLCAweGRiODUxZGZhLCAweDYzMDk0MzY2LCAweGM0NjRjM2QyLFxuICAgICAgMHhlZjFjMTg0NywgMHgzMjE1ZDkwOCwgMHhkZDQzM2IzNywgMHgyNGMyYmExNixcbiAgICAgIDB4MTJhMTRkNDMsIDB4MmE2NWM0NTEsIDB4NTA5NDAwMDIsIDB4MTMzYWU0ZGQsXG4gICAgICAweDcxZGZmODllLCAweDEwMzE0ZTU1LCAweDgxYWM3N2Q2LCAweDVmMTExOTliLFxuICAgICAgMHgwNDM1NTZmMSwgMHhkN2EzYzc2YiwgMHgzYzExMTgzYiwgMHg1OTI0YTUwOSxcbiAgICAgIDB4ZjI4ZmU2ZWQsIDB4OTdmMWZiZmEsIDB4OWViYWJmMmMsIDB4MWUxNTNjNmUsXG4gICAgICAweDg2ZTM0NTcwLCAweGVhZTk2ZmIxLCAweDg2MGU1ZTBhLCAweDVhM2UyYWIzLFxuICAgICAgMHg3NzFmZTcxYywgMHg0ZTNkMDZmYSwgMHgyOTY1ZGNiOSwgMHg5OWU3MWQwZixcbiAgICAgIDB4ODAzZTg5ZDYsIDB4NTI2NmM4MjUsIDB4MmU0Y2M5NzgsIDB4OWMxMGIzNmEsXG4gICAgICAweGM2MTUwZWJhLCAweDk0ZTJlYTc4LCAweGE1ZmMzYzUzLCAweDFlMGEyZGY0LFxuICAgICAgMHhmMmY3NGVhNywgMHgzNjFkMmIzZCwgMHgxOTM5MjYwZiwgMHgxOWMyNzk2MCxcbiAgICAgIDB4NTIyM2E3MDgsIDB4ZjcxMzEyYjYsIDB4ZWJhZGZlNmUsIDB4ZWFjMzFmNjYsXG4gICAgICAweGUzYmM0NTk1LCAweGE2N2JjODgzLCAweGIxN2YzN2QxLCAweDAxOGNmZjI4LFxuICAgICAgMHhjMzMyZGRlZiwgMHhiZTZjNWFhNSwgMHg2NTU4MjE4NSwgMHg2OGFiOTgwMixcbiAgICAgIDB4ZWVjZWE1MGYsIDB4ZGIyZjk1M2IsIDB4MmFlZjdkYWQsIDB4NWI2ZTJmODQsXG4gICAgICAweDE1MjFiNjI4LCAweDI5MDc2MTcwLCAweGVjZGQ0Nzc1LCAweDYxOWYxNTEwLFxuICAgICAgMHgxM2NjYTgzMCwgMHhlYjYxYmQ5NiwgMHgwMzM0ZmUxZSwgMHhhYTAzNjNjZixcbiAgICAgIDB4YjU3MzVjOTAsIDB4NGM3MGEyMzksIDB4ZDU5ZTllMGIsIDB4Y2JhYWRlMTQsXG4gICAgICAweGVlY2M4NmJjLCAweDYwNjIyY2E3LCAweDljYWI1Y2FiLCAweGIyZjM4NDZlLFxuICAgICAgMHg2NDhiMWVhZiwgMHgxOWJkZjBjYSwgMHhhMDIzNjliOSwgMHg2NTVhYmI1MCxcbiAgICAgIDB4NDA2ODVhMzIsIDB4M2MyYWI0YjMsIDB4MzE5ZWU5ZDUsIDB4YzAyMWI4ZjcsXG4gICAgICAweDliNTQwYjE5LCAweDg3NWZhMDk5LCAweDk1Zjc5OTdlLCAweDYyM2Q3ZGE4LFxuICAgICAgMHhmODM3ODg5YSwgMHg5N2UzMmQ3NywgMHgxMWVkOTM1ZiwgMHgxNjY4MTI4MSxcbiAgICAgIDB4MGUzNTg4MjksIDB4YzdlNjFmZDYsIDB4OTZkZWRmYTEsIDB4Nzg1OGJhOTksXG4gICAgICAweDU3ZjU4NGE1LCAweDFiMjI3MjYzLCAweDliODNjM2ZmLCAweDFhYzI0Njk2LFxuICAgICAgMHhjZGIzMGFlYiwgMHg1MzJlMzA1NCwgMHg4ZmQ5NDhlNCwgMHg2ZGJjMzEyOCxcbiAgICAgIDB4NThlYmYyZWYsIDB4MzRjNmZmZWEsIDB4ZmUyOGVkNjEsIDB4ZWU3YzNjNzMsXG4gICAgICAweDVkNGExNGQ5LCAweGU4NjRiN2UzLCAweDQyMTA1ZDE0LCAweDIwM2UxM2UwLFxuICAgICAgMHg0NWVlZTJiNiwgMHhhM2FhYWJlYSwgMHhkYjZjNGYxNSwgMHhmYWNiNGZkMCxcbiAgICAgIDB4Yzc0MmY0NDIsIDB4ZWY2YWJiYjUsIDB4NjU0ZjNiMWQsIDB4NDFjZDIxMDUsXG4gICAgICAweGQ4MWU3OTllLCAweDg2ODU0ZGM3LCAweGU0NGI0NzZhLCAweDNkODE2MjUwLFxuICAgICAgMHhjZjYyYTFmMiwgMHg1YjhkMjY0NiwgMHhmYzg4ODNhMCwgMHhjMWM3YjZhMyxcbiAgICAgIDB4N2YxNTI0YzMsIDB4NjljYjc0OTIsIDB4NDc4NDhhMGIsIDB4NTY5MmIyODUsXG4gICAgICAweDA5NWJiZjAwLCAweGFkMTk0ODlkLCAweDE0NjJiMTc0LCAweDIzODIwZTAwLFxuICAgICAgMHg1ODQyOGQyYSwgMHgwYzU1ZjVlYSwgMHgxZGFkZjQzZSwgMHgyMzNmNzA2MSxcbiAgICAgIDB4MzM3MmYwOTIsIDB4OGQ5MzdlNDEsIDB4ZDY1ZmVjZjEsIDB4NmMyMjNiZGIsXG4gICAgICAweDdjZGUzNzU5LCAweGNiZWU3NDYwLCAweDQwODVmMmE3LCAweGNlNzczMjZlLFxuICAgICAgMHhhNjA3ODA4NCwgMHgxOWY4NTA5ZSwgMHhlOGVmZDg1NSwgMHg2MWQ5OTczNSxcbiAgICAgIDB4YTk2OWE3YWEsIDB4YzUwYzA2YzIsIDB4NWEwNGFiZmMsIDB4ODAwYmNhZGMsXG4gICAgICAweDllNDQ3YTJlLCAweGMzNDUzNDg0LCAweGZkZDU2NzA1LCAweDBlMWU5ZWM5LFxuICAgICAgMHhkYjczZGJkMywgMHgxMDU1ODhjZCwgMHg2NzVmZGE3OSwgMHhlMzY3NDM0MCxcbiAgICAgIDB4YzVjNDM0NjUsIDB4NzEzZTM4ZDgsIDB4M2QyOGY4OWUsIDB4ZjE2ZGZmMjAsXG4gICAgICAweDE1M2UyMWU3LCAweDhmYjAzZDRhLCAweGU2ZTM5ZjJiLCAweGRiODNhZGY3XSksXG4gICAgbmV3IFVpbnQzMkFycmF5KFtcbiAgICAgIDB4ZTkzZDVhNjgsIDB4OTQ4MTQwZjcsIDB4ZjY0YzI2MWMsIDB4OTQ2OTI5MzQsXG4gICAgICAweDQxMTUyMGY3LCAweDc2MDJkNGY3LCAweGJjZjQ2YjJlLCAweGQ0YTIwMDY4LFxuICAgICAgMHhkNDA4MjQ3MSwgMHgzMzIwZjQ2YSwgMHg0M2I3ZDRiNywgMHg1MDAwNjFhZixcbiAgICAgIDB4MWUzOWY2MmUsIDB4OTcyNDQ1NDYsIDB4MTQyMTRmNzQsIDB4YmY4Yjg4NDAsXG4gICAgICAweDRkOTVmYzFkLCAweDk2YjU5MWFmLCAweDcwZjRkZGQzLCAweDY2YTAyZjQ1LFxuICAgICAgMHhiZmJjMDllYywgMHgwM2JkOTc4NSwgMHg3ZmFjNmRkMCwgMHgzMWNiODUwNCxcbiAgICAgIDB4OTZlYjI3YjMsIDB4NTVmZDM5NDEsIDB4ZGEyNTQ3ZTYsIDB4YWJjYTBhOWEsXG4gICAgICAweDI4NTA3ODI1LCAweDUzMDQyOWY0LCAweDBhMmM4NmRhLCAweGU5YjY2ZGZiLFxuICAgICAgMHg2OGRjMTQ2MiwgMHhkNzQ4NjkwMCwgMHg2ODBlYzBhNCwgMHgyN2ExOGRlZSxcbiAgICAgIDB4NGYzZmZlYTIsIDB4ZTg4N2FkOGMsIDB4YjU4Y2UwMDYsIDB4N2FmNGQ2YjYsXG4gICAgICAweGFhY2UxZTdjLCAweGQzMzc1ZmVjLCAweGNlNzhhMzk5LCAweDQwNmIyYTQyLFxuICAgICAgMHgyMGZlOWUzNSwgMHhkOWYzODViOSwgMHhlZTM5ZDdhYiwgMHgzYjEyNGU4YixcbiAgICAgIDB4MWRjOWZhZjcsIDB4NGI2ZDE4NTYsIDB4MjZhMzY2MzEsIDB4ZWFlMzk3YjIsXG4gICAgICAweDNhNmVmYTc0LCAweGRkNWI0MzMyLCAweDY4NDFlN2Y3LCAweGNhNzgyMGZiLFxuICAgICAgMHhmYjBhZjU0ZSwgMHhkOGZlYjM5NywgMHg0NTQwNTZhYywgMHhiYTQ4OTUyNyxcbiAgICAgIDB4NTU1MzNhM2EsIDB4MjA4MzhkODcsIDB4ZmU2YmE5YjcsIDB4ZDA5Njk1NGIsXG4gICAgICAweDU1YTg2N2JjLCAweGExMTU5YTU4LCAweGNjYTkyOTYzLCAweDk5ZTFkYjMzLFxuICAgICAgMHhhNjJhNGE1NiwgMHgzZjMxMjVmOSwgMHg1ZWY0N2UxYywgMHg5MDI5MzE3YyxcbiAgICAgIDB4ZmRmOGU4MDIsIDB4MDQyNzJmNzAsIDB4ODBiYjE1NWMsIDB4MDUyODJjZTMsXG4gICAgICAweDk1YzExNTQ4LCAweGU0YzY2ZDIyLCAweDQ4YzExMzNmLCAweGM3MGY4NmRjLFxuICAgICAgMHgwN2Y5YzllZSwgMHg0MTA0MWYwZiwgMHg0MDQ3NzlhNCwgMHg1ZDg4NmUxNyxcbiAgICAgIDB4MzI1ZjUxZWIsIDB4ZDU5YmMwZDEsIDB4ZjJiY2MxOGYsIDB4NDExMTM1NjQsXG4gICAgICAweDI1N2I3ODM0LCAweDYwMmE5YzYwLCAweGRmZjhlOGEzLCAweDFmNjM2YzFiLFxuICAgICAgMHgwZTEyYjRjMiwgMHgwMmUxMzI5ZSwgMHhhZjY2NGZkMSwgMHhjYWQxODExNSxcbiAgICAgIDB4NmIyMzk1ZTAsIDB4MzMzZTkyZTEsIDB4M2IyNDBiNjIsIDB4ZWViZWI5MjIsXG4gICAgICAweDg1YjJhMjBlLCAweGU2YmEwZDk5LCAweGRlNzIwYzhjLCAweDJkYTJmNzI4LFxuICAgICAgMHhkMDEyNzg0NSwgMHg5NWI3OTRmZCwgMHg2NDdkMDg2MiwgMHhlN2NjZjVmMCxcbiAgICAgIDB4NTQ0OWEzNmYsIDB4ODc3ZDQ4ZmEsIDB4YzM5ZGZkMjcsIDB4ZjMzZThkMWUsXG4gICAgICAweDBhNDc2MzQxLCAweDk5MmVmZjc0LCAweDNhNmY2ZWFiLCAweGY0ZjhmZDM3LFxuICAgICAgMHhhODEyZGM2MCwgMHhhMWViZGRmOCwgMHg5OTFiZTE0YywgMHhkYjZlNmIwZCxcbiAgICAgIDB4YzY3YjU1MTAsIDB4NmQ2NzJjMzcsIDB4Mjc2NWQ0M2IsIDB4ZGNkMGU4MDQsXG4gICAgICAweGYxMjkwZGM3LCAweGNjMDBmZmEzLCAweGI1MzkwZjkyLCAweDY5MGZlZDBiLFxuICAgICAgMHg2NjdiOWZmYiwgMHhjZWRiN2Q5YywgMHhhMDkxY2YwYiwgMHhkOTE1NWVhMyxcbiAgICAgIDB4YmIxMzJmODgsIDB4NTE1YmFkMjQsIDB4N2I5NDc5YmYsIDB4NzYzYmQ2ZWIsXG4gICAgICAweDM3MzkyZWIzLCAweGNjMTE1OTc5LCAweDgwMjZlMjk3LCAweGY0MmUzMTJkLFxuICAgICAgMHg2ODQyYWRhNywgMHhjNjZhMmIzYiwgMHgxMjc1NGNjYywgMHg3ODJlZjExYyxcbiAgICAgIDB4NmExMjQyMzcsIDB4Yjc5MjUxZTcsIDB4MDZhMWJiZTYsIDB4NGJmYjYzNTAsXG4gICAgICAweDFhNmIxMDE4LCAweDExY2FlZGZhLCAweDNkMjViZGQ4LCAweGUyZTFjM2M5LFxuICAgICAgMHg0NDQyMTY1OSwgMHgwYTEyMTM4NiwgMHhkOTBjZWM2ZSwgMHhkNWFiZWEyYSxcbiAgICAgIDB4NjRhZjY3NGUsIDB4ZGE4NmE4NWYsIDB4YmViZmU5ODgsIDB4NjRlNGMzZmUsXG4gICAgICAweDlkYmM4MDU3LCAweGYwZjdjMDg2LCAweDYwNzg3YmY4LCAweDYwMDM2MDRkLFxuICAgICAgMHhkMWZkODM0NiwgMHhmNjM4MWZiMCwgMHg3NzQ1YWUwNCwgMHhkNzM2ZmNjYyxcbiAgICAgIDB4ODM0MjZiMzMsIDB4ZjAxZWFiNzEsIDB4YjA4MDQxODcsIDB4M2MwMDVlNWYsXG4gICAgICAweDc3YTA1N2JlLCAweGJkZThhZTI0LCAweDU1NDY0Mjk5LCAweGJmNTgyZTYxLFxuICAgICAgMHg0ZTU4ZjQ4ZiwgMHhmMmRkZmRhMiwgMHhmNDc0ZWYzOCwgMHg4Nzg5YmRjMixcbiAgICAgIDB4NTM2NmY5YzMsIDB4YzhiMzhlNzQsIDB4YjQ3NWYyNTUsIDB4NDZmY2Q5YjksXG4gICAgICAweDdhZWIyNjYxLCAweDhiMWRkZjg0LCAweDg0NmEwZTc5LCAweDkxNWY5NWUyLFxuICAgICAgMHg0NjZlNTk4ZSwgMHgyMGI0NTc3MCwgMHg4Y2Q1NTU5MSwgMHhjOTAyZGU0YyxcbiAgICAgIDB4YjkwYmFjZTEsIDB4YmI4MjA1ZDAsIDB4MTFhODYyNDgsIDB4NzU3NGE5OWUsXG4gICAgICAweGI3N2YxOWI2LCAweGUwYTlkYzA5LCAweDY2MmQwOWExLCAweGM0MzI0NjMzLFxuICAgICAgMHhlODVhMWYwMiwgMHgwOWYwYmU4YywgMHg0YTk5YTAyNSwgMHgxZDZlZmUxMCxcbiAgICAgIDB4MWFiOTNkMWQsIDB4MGJhNWE0ZGYsIDB4YTE4NmYyMGYsIDB4Mjg2OGYxNjksXG4gICAgICAweGRjYjdkYTgzLCAweDU3MzkwNmZlLCAweGExZTJjZTliLCAweDRmY2Q3ZjUyLFxuICAgICAgMHg1MDExNWUwMSwgMHhhNzA2ODNmYSwgMHhhMDAyYjVjNCwgMHgwZGU2ZDAyNyxcbiAgICAgIDB4OWFmODhjMjcsIDB4NzczZjg2NDEsIDB4YzM2MDRjMDYsIDB4NjFhODA2YjUsXG4gICAgICAweGYwMTc3YTI4LCAweGMwZjU4NmUwLCAweDAwNjA1OGFhLCAweDMwZGM3ZDYyLFxuICAgICAgMHgxMWU2OWVkNywgMHgyMzM4ZWE2MywgMHg1M2MyZGQ5NCwgMHhjMmMyMTYzNCxcbiAgICAgIDB4YmJjYmVlNTYsIDB4OTBiY2I2ZGUsIDB4ZWJmYzdkYTEsIDB4Y2U1OTFkNzYsXG4gICAgICAweDZmMDVlNDA5LCAweDRiN2MwMTg4LCAweDM5NzIwYTNkLCAweDdjOTI3YzI0LFxuICAgICAgMHg4NmUzNzI1ZiwgMHg3MjRkOWRiOSwgMHgxYWMxNWJiNCwgMHhkMzllYjhmYyxcbiAgICAgIDB4ZWQ1NDU1NzgsIDB4MDhmY2E1YjUsIDB4ZDgzZDdjZDMsIDB4NGRhZDBmYzQsXG4gICAgICAweDFlNTBlZjVlLCAweGIxNjFlNmY4LCAweGEyODUxNGQ5LCAweDZjNTExMzNjLFxuICAgICAgMHg2ZmQ1YzdlNywgMHg1NmUxNGVjNCwgMHgzNjJhYmZjZSwgMHhkZGM2YzgzNyxcbiAgICAgIDB4ZDc5YTMyMzQsIDB4OTI2MzgyMTIsIDB4NjcwZWZhOGUsIDB4NDA2MDAwZTBdKSxcbiAgICBuZXcgVWludDMyQXJyYXkoW1xuICAgICAgMHgzYTM5Y2UzNywgMHhkM2ZhZjVjZiwgMHhhYmMyNzczNywgMHg1YWM1MmQxYixcbiAgICAgIDB4NWNiMDY3OWUsIDB4NGZhMzM3NDIsIDB4ZDM4MjI3NDAsIDB4OTliYzliYmUsXG4gICAgICAweGQ1MTE4ZTlkLCAweGJmMGY3MzE1LCAweGQ2MmQxYzdlLCAweGM3MDBjNDdiLFxuICAgICAgMHhiNzhjMWI2YiwgMHgyMWExOTA0NSwgMHhiMjZlYjFiZSwgMHg2YTM2NmViNCxcbiAgICAgIDB4NTc0OGFiMmYsIDB4YmM5NDZlNzksIDB4YzZhMzc2ZDIsIDB4NjU0OWMyYzgsXG4gICAgICAweDUzMGZmOGVlLCAweDQ2OGRkZTdkLCAweGQ1NzMwYTFkLCAweDRjZDA0ZGM2LFxuICAgICAgMHgyOTM5YmJkYiwgMHhhOWJhNDY1MCwgMHhhYzk1MjZlOCwgMHhiZTVlZTMwNCxcbiAgICAgIDB4YTFmYWQ1ZjAsIDB4NmEyZDUxOWEsIDB4NjNlZjhjZTIsIDB4OWE4NmVlMjIsXG4gICAgICAweGMwODljMmI4LCAweDQzMjQyZWY2LCAweGE1MWUwM2FhLCAweDljZjJkMGE0LFxuICAgICAgMHg4M2MwNjFiYSwgMHg5YmU5NmE0ZCwgMHg4ZmU1MTU1MCwgMHhiYTY0NWJkNixcbiAgICAgIDB4MjgyNmEyZjksIDB4YTczYTNhZTEsIDB4NGJhOTk1ODYsIDB4ZWY1NTYyZTksXG4gICAgICAweGM3MmZlZmQzLCAweGY3NTJmN2RhLCAweDNmMDQ2ZjY5LCAweDc3ZmEwYTU5LFxuICAgICAgMHg4MGU0YTkxNSwgMHg4N2IwODYwMSwgMHg5YjA5ZTZhZCwgMHgzYjNlZTU5MyxcbiAgICAgIDB4ZTk5MGZkNWEsIDB4OWUzNGQ3OTcsIDB4MmNmMGI3ZDksIDB4MDIyYjhiNTEsXG4gICAgICAweDk2ZDVhYzNhLCAweDAxN2RhNjdkLCAweGQxY2YzZWQ2LCAweDdjN2QyZDI4LFxuICAgICAgMHgxZjlmMjVjZiwgMHhhZGYyYjg5YiwgMHg1YWQ2YjQ3MiwgMHg1YTg4ZjU0YyxcbiAgICAgIDB4ZTAyOWFjNzEsIDB4ZTAxOWE1ZTYsIDB4NDdiMGFjZmQsIDB4ZWQ5M2ZhOWIsXG4gICAgICAweGU4ZDNjNDhkLCAweDI4M2I1N2NjLCAweGY4ZDU2NjI5LCAweDc5MTMyZTI4LFxuICAgICAgMHg3ODVmMDE5MSwgMHhlZDc1NjA1NSwgMHhmNzk2MGU0NCwgMHhlM2QzNWU4YyxcbiAgICAgIDB4MTUwNTZkZDQsIDB4ODhmNDZkYmEsIDB4MDNhMTYxMjUsIDB4MDU2NGYwYmQsXG4gICAgICAweGMzZWI5ZTE1LCAweDNjOTA1N2EyLCAweDk3MjcxYWVjLCAweGE5M2EwNzJhLFxuICAgICAgMHgxYjNmNmQ5YiwgMHgxZTYzMjFmNSwgMHhmNTljNjZmYiwgMHgyNmRjZjMxOSxcbiAgICAgIDB4NzUzM2Q5MjgsIDB4YjE1NWZkZjUsIDB4MDM1NjM0ODIsIDB4OGFiYTNjYmIsXG4gICAgICAweDI4NTE3NzExLCAweGMyMGFkOWY4LCAweGFiY2M1MTY3LCAweGNjYWQ5MjVmLFxuICAgICAgMHg0ZGU4MTc1MSwgMHgzODMwZGM4ZSwgMHgzNzlkNTg2MiwgMHg5MzIwZjk5MSxcbiAgICAgIDB4ZWE3YTkwYzIsIDB4ZmIzZTdiY2UsIDB4NTEyMWNlNjQsIDB4Nzc0ZmJlMzIsXG4gICAgICAweGE4YjZlMzdlLCAweGMzMjkzZDQ2LCAweDQ4ZGU1MzY5LCAweDY0MTNlNjgwLFxuICAgICAgMHhhMmFlMDgxMCwgMHhkZDZkYjIyNCwgMHg2OTg1MmRmZCwgMHgwOTA3MjE2NixcbiAgICAgIDB4YjM5YTQ2MGEsIDB4NjQ0NWMwZGQsIDB4NTg2Y2RlY2YsIDB4MWMyMGM4YWUsXG4gICAgICAweDViYmVmN2RkLCAweDFiNTg4ZDQwLCAweGNjZDIwMTdmLCAweDZiYjRlM2JiLFxuICAgICAgMHhkZGEyNmE3ZSwgMHgzYTU5ZmY0NSwgMHgzZTM1MGE0NCwgMHhiY2I0Y2RkNSxcbiAgICAgIDB4NzJlYWNlYTgsIDB4ZmE2NDg0YmIsIDB4OGQ2NjEyYWUsIDB4YmYzYzZmNDcsXG4gICAgICAweGQyOWJlNDYzLCAweDU0MmY1ZDllLCAweGFlYzI3NzFiLCAweGY2NGU2MzcwLFxuICAgICAgMHg3NDBlMGQ4ZCwgMHhlNzViMTM1NywgMHhmODcyMTY3MSwgMHhhZjUzN2Q1ZCxcbiAgICAgIDB4NDA0MGNiMDgsIDB4NGViNGUyY2MsIDB4MzRkMjQ2NmEsIDB4MDExNWFmODQsXG4gICAgICAweGUxYjAwNDI4LCAweDk1OTgzYTFkLCAweDA2Yjg5ZmI0LCAweGNlNmVhMDQ4LFxuICAgICAgMHg2ZjNmM2I4MiwgMHgzNTIwYWI4MiwgMHgwMTFhMWQ0YiwgMHgyNzcyMjdmOCxcbiAgICAgIDB4NjExNTYwYjEsIDB4ZTc5MzNmZGMsIDB4YmIzYTc5MmIsIDB4MzQ0NTI1YmQsXG4gICAgICAweGEwODgzOWUxLCAweDUxY2U3OTRiLCAweDJmMzJjOWI3LCAweGEwMWZiYWM5LFxuICAgICAgMHhlMDFjYzg3ZSwgMHhiY2M3ZDFmNiwgMHhjZjAxMTFjMywgMHhhMWU4YWFjNyxcbiAgICAgIDB4MWE5MDg3NDksIDB4ZDQ0ZmJkOWEsIDB4ZDBkYWRlY2IsIDB4ZDUwYWRhMzgsXG4gICAgICAweDAzMzljMzJhLCAweGM2OTEzNjY3LCAweDhkZjkzMTdjLCAweGUwYjEyYjRmLFxuICAgICAgMHhmNzllNTliNywgMHg0M2Y1YmIzYSwgMHhmMmQ1MTlmZiwgMHgyN2Q5NDU5YyxcbiAgICAgIDB4YmY5NzIyMmMsIDB4MTVlNmZjMmEsIDB4MGY5MWZjNzEsIDB4OWI5NDE1MjUsXG4gICAgICAweGZhZTU5MzYxLCAweGNlYjY5Y2ViLCAweGMyYTg2NDU5LCAweDEyYmFhOGQxLFxuICAgICAgMHhiNmMxMDc1ZSwgMHhlMzA1NmEwYywgMHgxMGQyNTA2NSwgMHhjYjAzYTQ0MixcbiAgICAgIDB4ZTBlYzZlMGUsIDB4MTY5OGRiM2IsIDB4NGM5OGEwYmUsIDB4MzI3OGU5NjQsXG4gICAgICAweDlmMWY5NTMyLCAweGUwZDM5MmRmLCAweGQzYTAzNDJiLCAweDg5NzFmMjFlLFxuICAgICAgMHgxYjBhNzQ0MSwgMHg0YmEzMzQ4YywgMHhjNWJlNzEyMCwgMHhjMzc2MzJkOCxcbiAgICAgIDB4ZGYzNTlmOGQsIDB4OWI5OTJmMmUsIDB4ZTYwYjZmNDcsIDB4MGZlM2YxMWQsXG4gICAgICAweGU1NGNkYTU0LCAweDFlZGFkODkxLCAweGNlNjI3OWNmLCAweGNkM2U3ZTZmLFxuICAgICAgMHgxNjE4YjE2NiwgMHhmZDJjMWQwNSwgMHg4NDhmZDJjNSwgMHhmNmZiMjI5OSxcbiAgICAgIDB4ZjUyM2YzNTcsIDB4YTYzMjc2MjMsIDB4OTNhODM1MzEsIDB4NTZjY2NkMDIsXG4gICAgICAweGFjZjA4MTYyLCAweDVhNzVlYmI1LCAweDZlMTYzNjk3LCAweDg4ZDI3M2NjLFxuICAgICAgMHhkZTk2NjI5MiwgMHg4MWI5NDlkMCwgMHg0YzUwOTAxYiwgMHg3MWM2NTYxNCxcbiAgICAgIDB4ZTZjNmM3YmQsIDB4MzI3YTE0MGEsIDB4NDVlMWQwMDYsIDB4YzNmMjdiOWEsXG4gICAgICAweGM5YWE1M2ZkLCAweDYyYTgwZjAwLCAweGJiMjViZmUyLCAweDM1YmRkMmY2LFxuICAgICAgMHg3MTEyNjkwNSwgMHhiMjA0MDIyMiwgMHhiNmNiY2Y3YywgMHhjZDc2OWMyYixcbiAgICAgIDB4NTMxMTNlYzAsIDB4MTY0MGUzZDMsIDB4MzhhYmJkNjAsIDB4MjU0N2FkZjAsXG4gICAgICAweGJhMzgyMDljLCAweGY3NDZjZTc2LCAweDc3YWZhMWM1LCAweDIwNzU2MDYwLFxuICAgICAgMHg4NWNiZmU0ZSwgMHg4YWU4OGRkOCwgMHg3YWFhZjliMCwgMHg0Y2Y5YWE3ZSxcbiAgICAgIDB4MTk0OGMyNWMsIDB4MDJmYjhhOGMsIDB4MDFjMzZhZTQsIDB4ZDZlYmUxZjksXG4gICAgICAweDkwZDRmODY5LCAweGE2NWNkZWEwLCAweDNmMDkyNTJkLCAweGMyMDhlNjlmLFxuICAgICAgMHhiNzRlNjEzMiwgMHhjZTc3ZTI1YiwgMHg1NzhmZGZlMywgMHgzYWMzNzJlNl0pXG4gICAgXTtcbiAgdGhpcy5QID0gbmV3IFVpbnQzMkFycmF5KFtcbiAgICAweDI0M2Y2YTg4LCAweDg1YTMwOGQzLCAweDEzMTk4YTJlLCAweDAzNzA3MzQ0LFxuICAgIDB4YTQwOTM4MjIsIDB4Mjk5ZjMxZDAsIDB4MDgyZWZhOTgsIDB4ZWM0ZTZjODksXG4gICAgMHg0NTI4MjFlNiwgMHgzOGQwMTM3NywgMHhiZTU0NjZjZiwgMHgzNGU5MGM2YyxcbiAgICAweGMwYWMyOWI3LCAweGM5N2M1MGRkLCAweDNmODRkNWI1LCAweGI1NDcwOTE3LFxuICAgIDB4OTIxNmQ1ZDksIDB4ODk3OWZiMWJdKTtcbn07XG5cbmZ1bmN0aW9uIEYoUywgeDgsIGkpIHtcbiAgcmV0dXJuICgoKFNbMF1beDhbaSszXV0gK1xuICAgICAgICAgICAgU1sxXVt4OFtpKzJdXSkgXlxuICAgICAgICAgICAgU1syXVt4OFtpKzFdXSkgK1xuICAgICAgICAgICAgU1szXVt4OFtpXV0pO1xufTtcblxuQmxvd2Zpc2gucHJvdG90eXBlLmVuY2lwaGVyID0gZnVuY3Rpb24oeCwgeDgpIHtcbiAgaWYgKHg4ID09PSB1bmRlZmluZWQpIHtcbiAgICB4OCA9IG5ldyBVaW50OEFycmF5KHguYnVmZmVyKTtcbiAgICBpZiAoeC5ieXRlT2Zmc2V0ICE9PSAwKVxuICAgICAgeDggPSB4OC5zdWJhcnJheSh4LmJ5dGVPZmZzZXQpO1xuICB9XG4gIHhbMF0gXj0gdGhpcy5QWzBdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IDE2OyBpICs9IDIpIHtcbiAgICB4WzFdIF49IEYodGhpcy5TLCB4OCwgMCkgXiB0aGlzLlBbaV07XG4gICAgeFswXSBePSBGKHRoaXMuUywgeDgsIDQpIF4gdGhpcy5QW2krMV07XG4gIH1cbiAgdmFyIHQgPSB4WzBdO1xuICB4WzBdID0geFsxXSBeIHRoaXMuUFsxN107XG4gIHhbMV0gPSB0O1xufTtcblxuQmxvd2Zpc2gucHJvdG90eXBlLmRlY2lwaGVyID0gZnVuY3Rpb24oeCkge1xuICB2YXIgeDggPSBuZXcgVWludDhBcnJheSh4LmJ1ZmZlcik7XG4gIGlmICh4LmJ5dGVPZmZzZXQgIT09IDApXG4gICAgeDggPSB4OC5zdWJhcnJheSh4LmJ5dGVPZmZzZXQpO1xuICB4WzBdIF49IHRoaXMuUFsxN107XG4gIGZvciAodmFyIGkgPSAxNjsgaSA+IDA7IGkgLT0gMikge1xuICAgIHhbMV0gXj0gRih0aGlzLlMsIHg4LCAwKSBeIHRoaXMuUFtpXTtcbiAgICB4WzBdIF49IEYodGhpcy5TLCB4OCwgNCkgXiB0aGlzLlBbaS0xXTtcbiAgfVxuICB2YXIgdCA9IHhbMF07XG4gIHhbMF0gPSB4WzFdIF4gdGhpcy5QWzBdO1xuICB4WzFdID0gdDtcbn07XG5cbmZ1bmN0aW9uIHN0cmVhbTJ3b3JkKGRhdGEsIGRhdGFieXRlcyl7XG4gIHZhciBpLCB0ZW1wID0gMDtcbiAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgQkxGX0orKykge1xuICAgIGlmIChCTEZfSiA+PSBkYXRhYnl0ZXMpIEJMRl9KID0gMDtcbiAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBkYXRhW0JMRl9KXTtcbiAgfVxuICByZXR1cm4gdGVtcDtcbn07XG5cbkJsb3dmaXNoLnByb3RvdHlwZS5leHBhbmQwc3RhdGUgPSBmdW5jdGlvbihrZXksIGtleWJ5dGVzKSB7XG4gIHZhciBkID0gbmV3IFVpbnQzMkFycmF5KDIpLCBpLCBrO1xuICB2YXIgZDggPSBuZXcgVWludDhBcnJheShkLmJ1ZmZlcik7XG5cbiAgZm9yIChpID0gMCwgQkxGX0ogPSAwOyBpIDwgMTg7IGkrKykge1xuICAgIHRoaXMuUFtpXSBePSBzdHJlYW0yd29yZChrZXksIGtleWJ5dGVzKTtcbiAgfVxuICBCTEZfSiA9IDA7XG5cbiAgZm9yIChpID0gMDsgaSA8IDE4OyBpICs9IDIpIHtcbiAgICB0aGlzLmVuY2lwaGVyKGQsIGQ4KTtcbiAgICB0aGlzLlBbaV0gICA9IGRbMF07XG4gICAgdGhpcy5QW2krMV0gPSBkWzFdO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIGZvciAoayA9IDA7IGsgPCAyNTY7IGsgKz0gMikge1xuICAgICAgdGhpcy5lbmNpcGhlcihkLCBkOCk7XG4gICAgICB0aGlzLlNbaV1ba10gICA9IGRbMF07XG4gICAgICB0aGlzLlNbaV1baysxXSA9IGRbMV07XG4gICAgfVxuICB9XG59O1xuXG5CbG93ZmlzaC5wcm90b3R5cGUuZXhwYW5kc3RhdGUgPSBmdW5jdGlvbihkYXRhLCBkYXRhYnl0ZXMsIGtleSwga2V5Ynl0ZXMpIHtcbiAgdmFyIGQgPSBuZXcgVWludDMyQXJyYXkoMiksIGksIGs7XG5cbiAgZm9yIChpID0gMCwgQkxGX0ogPSAwOyBpIDwgMTg7IGkrKykge1xuICAgIHRoaXMuUFtpXSBePSBzdHJlYW0yd29yZChrZXksIGtleWJ5dGVzKTtcbiAgfVxuXG4gIGZvciAoaSA9IDAsIEJMRl9KID0gMDsgaSA8IDE4OyBpICs9IDIpIHtcbiAgICBkWzBdIF49IHN0cmVhbTJ3b3JkKGRhdGEsIGRhdGFieXRlcyk7XG4gICAgZFsxXSBePSBzdHJlYW0yd29yZChkYXRhLCBkYXRhYnl0ZXMpO1xuICAgIHRoaXMuZW5jaXBoZXIoZCk7XG4gICAgdGhpcy5QW2ldICAgPSBkWzBdO1xuICAgIHRoaXMuUFtpKzFdID0gZFsxXTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBmb3IgKGsgPSAwOyBrIDwgMjU2OyBrICs9IDIpIHtcbiAgICAgIGRbMF0gXj0gc3RyZWFtMndvcmQoZGF0YSwgZGF0YWJ5dGVzKTtcbiAgICAgIGRbMV0gXj0gc3RyZWFtMndvcmQoZGF0YSwgZGF0YWJ5dGVzKTtcbiAgICAgIHRoaXMuZW5jaXBoZXIoZCk7XG4gICAgICB0aGlzLlNbaV1ba10gICA9IGRbMF07XG4gICAgICB0aGlzLlNbaV1baysxXSA9IGRbMV07XG4gICAgfVxuICB9XG4gIEJMRl9KID0gMDtcbn07XG5cbkJsb3dmaXNoLnByb3RvdHlwZS5lbmMgPSBmdW5jdGlvbihkYXRhLCBibG9ja3MpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3M7IGkrKykge1xuICAgIHRoaXMuZW5jaXBoZXIoZGF0YS5zdWJhcnJheShpKjIpKTtcbiAgfVxufTtcblxuQmxvd2Zpc2gucHJvdG90eXBlLmRlYyA9IGZ1bmN0aW9uKGRhdGEsIGJsb2Nrcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrczsgaSsrKSB7XG4gICAgdGhpcy5kZWNpcGhlcihkYXRhLnN1YmFycmF5KGkqMikpO1xuICB9XG59O1xuXG52YXIgQkNSWVBUX0JMT0NLUyA9IDgsXG4gICAgQkNSWVBUX0hBU0hTSVpFID0gMzI7XG5cbmZ1bmN0aW9uIGJjcnlwdF9oYXNoKHNoYTJwYXNzLCBzaGEyc2FsdCwgb3V0KSB7XG4gIHZhciBzdGF0ZSA9IG5ldyBCbG93ZmlzaCgpLFxuICAgICAgY2RhdGEgPSBuZXcgVWludDMyQXJyYXkoQkNSWVBUX0JMT0NLUyksIGksXG4gICAgICBjaXBoZXJ0ZXh0ID0gbmV3IFVpbnQ4QXJyYXkoWzc5LDEyMCwxMjEsOTksMTA0LDExNCwxMTEsMTA5LDk3LDExNiwxMDUsXG4gICAgICAgICAgICA5OSw2NiwxMDgsMTExLDExOSwxMDIsMTA1LDExNSwxMDQsODMsMTE5LDk3LDExNiw2OCwxMjEsMTEwLDk3LDEwOSxcbiAgICAgICAgICAgIDEwNSwxMTYsMTAxXSk7IC8vXCJPeHljaHJvbWF0aWNCbG93ZmlzaFN3YXREeW5hbWl0ZVwiXG5cbiAgc3RhdGUuZXhwYW5kc3RhdGUoc2hhMnNhbHQsIDY0LCBzaGEycGFzcywgNjQpO1xuICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgIHN0YXRlLmV4cGFuZDBzdGF0ZShzaGEyc2FsdCwgNjQpO1xuICAgIHN0YXRlLmV4cGFuZDBzdGF0ZShzaGEycGFzcywgNjQpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IEJDUllQVF9CTE9DS1M7IGkrKylcbiAgICBjZGF0YVtpXSA9IHN0cmVhbTJ3b3JkKGNpcGhlcnRleHQsIGNpcGhlcnRleHQuYnl0ZUxlbmd0aCk7XG4gIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKVxuICAgIHN0YXRlLmVuYyhjZGF0YSwgY2RhdGEuYnl0ZUxlbmd0aCAvIDgpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBCQ1JZUFRfQkxPQ0tTOyBpKyspIHtcbiAgICBvdXRbNCppKzNdID0gY2RhdGFbaV0gPj4+IDI0O1xuICAgIG91dFs0KmkrMl0gPSBjZGF0YVtpXSA+Pj4gMTY7XG4gICAgb3V0WzQqaSsxXSA9IGNkYXRhW2ldID4+PiA4O1xuICAgIG91dFs0KmkrMF0gPSBjZGF0YVtpXTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYmNyeXB0X3Bia2RmKHBhc3MsIHBhc3NsZW4sIHNhbHQsIHNhbHRsZW4sIGtleSwga2V5bGVuLCByb3VuZHMpIHtcbiAgdmFyIHNoYTJwYXNzID0gbmV3IFVpbnQ4QXJyYXkoNjQpLFxuICAgICAgc2hhMnNhbHQgPSBuZXcgVWludDhBcnJheSg2NCksXG4gICAgICBvdXQgPSBuZXcgVWludDhBcnJheShCQ1JZUFRfSEFTSFNJWkUpLFxuICAgICAgdG1wb3V0ID0gbmV3IFVpbnQ4QXJyYXkoQkNSWVBUX0hBU0hTSVpFKSxcbiAgICAgIGNvdW50c2FsdCA9IG5ldyBVaW50OEFycmF5KHNhbHRsZW4rNCksXG4gICAgICBpLCBqLCBhbXQsIHN0cmlkZSwgZGVzdCwgY291bnQsXG4gICAgICBvcmlna2V5bGVuID0ga2V5bGVuO1xuXG4gIGlmIChyb3VuZHMgPCAxKVxuICAgIHJldHVybiAtMTtcbiAgaWYgKHBhc3NsZW4gPT09IDAgfHwgc2FsdGxlbiA9PT0gMCB8fCBrZXlsZW4gPT09IDAgfHxcbiAgICAgIGtleWxlbiA+IChvdXQuYnl0ZUxlbmd0aCAqIG91dC5ieXRlTGVuZ3RoKSB8fCBzYWx0bGVuID4gKDE8PDIwKSlcbiAgICByZXR1cm4gLTE7XG5cbiAgc3RyaWRlID0gTWF0aC5mbG9vcigoa2V5bGVuICsgb3V0LmJ5dGVMZW5ndGggLSAxKSAvIG91dC5ieXRlTGVuZ3RoKTtcbiAgYW10ID0gTWF0aC5mbG9vcigoa2V5bGVuICsgc3RyaWRlIC0gMSkgLyBzdHJpZGUpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzYWx0bGVuOyBpKyspXG4gICAgY291bnRzYWx0W2ldID0gc2FsdFtpXTtcblxuICBjcnlwdG9faGFzaF9zaGE1MTIoc2hhMnBhc3MsIHBhc3MsIHBhc3NsZW4pO1xuXG4gIGZvciAoY291bnQgPSAxOyBrZXlsZW4gPiAwOyBjb3VudCsrKSB7XG4gICAgY291bnRzYWx0W3NhbHRsZW4rMF0gPSBjb3VudCA+Pj4gMjQ7XG4gICAgY291bnRzYWx0W3NhbHRsZW4rMV0gPSBjb3VudCA+Pj4gMTY7XG4gICAgY291bnRzYWx0W3NhbHRsZW4rMl0gPSBjb3VudCA+Pj4gIDg7XG4gICAgY291bnRzYWx0W3NhbHRsZW4rM10gPSBjb3VudDtcblxuICAgIGNyeXB0b19oYXNoX3NoYTUxMihzaGEyc2FsdCwgY291bnRzYWx0LCBzYWx0bGVuICsgNCk7XG4gICAgYmNyeXB0X2hhc2goc2hhMnBhc3MsIHNoYTJzYWx0LCB0bXBvdXQpO1xuICAgIGZvciAoaSA9IG91dC5ieXRlTGVuZ3RoOyBpLS07KVxuICAgICAgb3V0W2ldID0gdG1wb3V0W2ldO1xuXG4gICAgZm9yIChpID0gMTsgaSA8IHJvdW5kczsgaSsrKSB7XG4gICAgICBjcnlwdG9faGFzaF9zaGE1MTIoc2hhMnNhbHQsIHRtcG91dCwgdG1wb3V0LmJ5dGVMZW5ndGgpO1xuICAgICAgYmNyeXB0X2hhc2goc2hhMnBhc3MsIHNoYTJzYWx0LCB0bXBvdXQpO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG91dC5ieXRlTGVuZ3RoOyBqKyspXG4gICAgICAgIG91dFtqXSBePSB0bXBvdXRbal07XG4gICAgfVxuXG4gICAgYW10ID0gTWF0aC5taW4oYW10LCBrZXlsZW4pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhbXQ7IGkrKykge1xuICAgICAgZGVzdCA9IGkgKiBzdHJpZGUgKyAoY291bnQgLSAxKTtcbiAgICAgIGlmIChkZXN0ID49IG9yaWdrZXlsZW4pXG4gICAgICAgIGJyZWFrO1xuICAgICAga2V5W2Rlc3RdID0gb3V0W2ldO1xuICAgIH1cbiAgICBrZXlsZW4gLT0gaTtcbiAgfVxuXG4gIHJldHVybiAwO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICBCTE9DS1M6IEJDUllQVF9CTE9DS1MsXG4gICAgICBIQVNIU0laRTogQkNSWVBUX0hBU0hTSVpFLFxuICAgICAgaGFzaDogYmNyeXB0X2hhc2gsXG4gICAgICBwYmtkZjogYmNyeXB0X3Bia2RmXG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0cmVhZFNTSFByaXZhdGU6IHJlYWRTU0hQcml2YXRlLFxuXHR3cml0ZTogd3JpdGVcbn07XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuLi9hbGdzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG52YXIgS2V5ID0gcmVxdWlyZSgnLi4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG52YXIgcGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbnZhciByZmM0MjUzID0gcmVxdWlyZSgnLi9yZmM0MjUzJyk7XG52YXIgU1NIQnVmZmVyID0gcmVxdWlyZSgnLi4vc3NoLWJ1ZmZlcicpO1xudmFyIGVycm9ycyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpO1xuXG52YXIgYmNyeXB0O1xuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucykge1xuXHRyZXR1cm4gKHBlbS5yZWFkKGJ1Ziwgb3B0aW9ucykpO1xufVxuXG52YXIgTUFHSUMgPSAnb3BlbnNzaC1rZXktdjEnO1xuXG5mdW5jdGlvbiByZWFkU1NIUHJpdmF0ZSh0eXBlLCBidWYsIG9wdGlvbnMpIHtcblx0YnVmID0gbmV3IFNTSEJ1ZmZlcih7YnVmZmVyOiBidWZ9KTtcblxuXHR2YXIgbWFnaWMgPSBidWYucmVhZENTdHJpbmcoKTtcblx0YXNzZXJ0LnN0cmljdEVxdWFsKG1hZ2ljLCBNQUdJQywgJ2JhZCBtYWdpYyBzdHJpbmcnKTtcblxuXHR2YXIgY2lwaGVyID0gYnVmLnJlYWRTdHJpbmcoKTtcblx0dmFyIGtkZiA9IGJ1Zi5yZWFkU3RyaW5nKCk7XG5cdHZhciBrZGZPcHRzID0gYnVmLnJlYWRCdWZmZXIoKTtcblxuXHR2YXIgbmtleXMgPSBidWYucmVhZEludCgpO1xuXHRpZiAobmtleXMgIT09IDEpIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdPcGVuU1NILWZvcm1hdCBrZXkgZmlsZSBjb250YWlucyAnICtcblx0XHQgICAgJ211bHRpcGxlIGtleXM6IHRoaXMgaXMgdW5zdXBwb3J0ZWQuJykpO1xuXHR9XG5cblx0dmFyIHB1YktleSA9IGJ1Zi5yZWFkQnVmZmVyKCk7XG5cblx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKSB7XG5cdFx0YXNzZXJ0Lm9rKGJ1Zi5hdEVuZCgpLCAnZXhjZXNzIGJ5dGVzIGxlZnQgYWZ0ZXIga2V5Jyk7XG5cdFx0cmV0dXJuIChyZmM0MjUzLnJlYWQocHViS2V5KSk7XG5cdH1cblxuXHR2YXIgcHJpdktleUJsb2IgPSBidWYucmVhZEJ1ZmZlcigpO1xuXHRhc3NlcnQub2soYnVmLmF0RW5kKCksICdleGNlc3MgYnl0ZXMgbGVmdCBhZnRlciBrZXknKTtcblxuXHR2YXIga2RmT3B0c0J1ZiA9IG5ldyBTU0hCdWZmZXIoeyBidWZmZXI6IGtkZk9wdHMgfSk7XG5cdHN3aXRjaCAoa2RmKSB7XG5cdGNhc2UgJ25vbmUnOlxuXHRcdGlmIChjaXBoZXIgIT09ICdub25lJykge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignT3BlblNTSC1mb3JtYXQga2V5IHVzZXMgS0RGIFwibm9uZVwiICcgK1xuXHRcdFx0ICAgICAnYnV0IHNwZWNpZmllcyBhIGNpcGhlciBvdGhlciB0aGFuIFwibm9uZVwiJykpO1xuXHRcdH1cblx0XHRicmVhaztcblx0Y2FzZSAnYmNyeXB0Jzpcblx0XHR2YXIgc2FsdCA9IGtkZk9wdHNCdWYucmVhZEJ1ZmZlcigpO1xuXHRcdHZhciByb3VuZHMgPSBrZGZPcHRzQnVmLnJlYWRJbnQoKTtcblx0XHR2YXIgY2luZiA9IHV0aWxzLm9wZW5zc2hDaXBoZXJJbmZvKGNpcGhlcik7XG5cdFx0aWYgKGJjcnlwdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHQtcGJrZGYnKTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIChvcHRpb25zLnBhc3NwaHJhc2UpID09PSAnc3RyaW5nJykge1xuXHRcdFx0b3B0aW9ucy5wYXNzcGhyYXNlID0gQnVmZmVyLmZyb20ob3B0aW9ucy5wYXNzcGhyYXNlLFxuXHRcdFx0ICAgICd1dGYtOCcpO1xuXHRcdH1cblx0XHRpZiAoIUJ1ZmZlci5pc0J1ZmZlcihvcHRpb25zLnBhc3NwaHJhc2UpKSB7XG5cdFx0XHR0aHJvdyAobmV3IGVycm9ycy5LZXlFbmNyeXB0ZWRFcnJvcihcblx0XHRcdCAgICBvcHRpb25zLmZpbGVuYW1lLCAnT3BlblNTSCcpKTtcblx0XHR9XG5cblx0XHR2YXIgcGFzcyA9IG5ldyBVaW50OEFycmF5KG9wdGlvbnMucGFzc3BocmFzZSk7XG5cdFx0dmFyIHNhbHRpID0gbmV3IFVpbnQ4QXJyYXkoc2FsdCk7XG5cdFx0LyogVXNlIHRoZSBwYmtkZiB0byBkZXJpdmUgYm90aCB0aGUga2V5IGFuZCB0aGUgSVYuICovXG5cdFx0dmFyIG91dCA9IG5ldyBVaW50OEFycmF5KGNpbmYua2V5U2l6ZSArIGNpbmYuYmxvY2tTaXplKTtcblx0XHR2YXIgcmVzID0gYmNyeXB0LnBia2RmKHBhc3MsIHBhc3MubGVuZ3RoLCBzYWx0aSwgc2FsdGkubGVuZ3RoLFxuXHRcdCAgICBvdXQsIG91dC5sZW5ndGgsIHJvdW5kcyk7XG5cdFx0aWYgKHJlcyAhPT0gMCkge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignYmNyeXB0X3Bia2RmIGZ1bmN0aW9uIHJldHVybmVkICcgK1xuXHRcdFx0ICAgICdmYWlsdXJlLCBwYXJhbWV0ZXJzIGludmFsaWQnKSk7XG5cdFx0fVxuXHRcdG91dCA9IEJ1ZmZlci5mcm9tKG91dCk7XG5cdFx0dmFyIGNrZXkgPSBvdXQuc2xpY2UoMCwgY2luZi5rZXlTaXplKTtcblx0XHR2YXIgaXYgPSBvdXQuc2xpY2UoY2luZi5rZXlTaXplLCBjaW5mLmtleVNpemUgKyBjaW5mLmJsb2NrU2l6ZSk7XG5cdFx0dmFyIGNpcGhlclN0cmVhbSA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KGNpbmYub3BlbnNzbE5hbWUsXG5cdFx0ICAgIGNrZXksIGl2KTtcblx0XHRjaXBoZXJTdHJlYW0uc2V0QXV0b1BhZGRpbmcoZmFsc2UpO1xuXHRcdHZhciBjaHVuaywgY2h1bmtzID0gW107XG5cdFx0Y2lwaGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdGlmIChlLnRvU3RyaW5nKCkuaW5kZXhPZignYmFkIGRlY3J5cHQnKSAhPT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgKG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3NwaHJhc2UgJyArXG5cdFx0XHRcdCAgICAnc3VwcGxpZWQsIGNvdWxkIG5vdCBkZWNyeXB0IGtleScpKTtcblx0XHRcdH1cblx0XHRcdHRocm93IChlKTtcblx0XHR9KTtcblx0XHRjaXBoZXJTdHJlYW0ud3JpdGUocHJpdktleUJsb2IpO1xuXHRcdGNpcGhlclN0cmVhbS5lbmQoKTtcblx0XHR3aGlsZSAoKGNodW5rID0gY2lwaGVyU3RyZWFtLnJlYWQoKSkgIT09IG51bGwpXG5cdFx0XHRjaHVua3MucHVzaChjaHVuayk7XG5cdFx0cHJpdktleUJsb2IgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcihcblx0XHQgICAgJ09wZW5TU0gtZm9ybWF0IGtleSB1c2VzIHVua25vd24gS0RGIFwiJyArIGtkZiArICdcIicpKTtcblx0fVxuXG5cdGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe2J1ZmZlcjogcHJpdktleUJsb2J9KTtcblxuXHR2YXIgY2hlY2tJbnQxID0gYnVmLnJlYWRJbnQoKTtcblx0dmFyIGNoZWNrSW50MiA9IGJ1Zi5yZWFkSW50KCk7XG5cdGlmIChjaGVja0ludDEgIT09IGNoZWNrSW50Mikge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0luY29ycmVjdCBwYXNzcGhyYXNlIHN1cHBsaWVkLCBjb3VsZCBub3QgJyArXG5cdFx0ICAgICdkZWNyeXB0IGtleScpKTtcblx0fVxuXG5cdHZhciByZXQgPSB7fTtcblx0dmFyIGtleSA9IHJmYzQyNTMucmVhZEludGVybmFsKHJldCwgJ3ByaXZhdGUnLCBidWYucmVtYWluZGVyKCkpO1xuXG5cdGJ1Zi5za2lwKHJldC5jb25zdW1lZCk7XG5cblx0dmFyIGNvbW1lbnQgPSBidWYucmVhZFN0cmluZygpO1xuXHRrZXkuY29tbWVudCA9IGNvbW1lbnQ7XG5cblx0cmV0dXJuIChrZXkpO1xufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMpIHtcblx0dmFyIHB1YktleTtcblx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0cHViS2V5ID0ga2V5LnRvUHVibGljKCk7XG5cdGVsc2Vcblx0XHRwdWJLZXkgPSBrZXk7XG5cblx0dmFyIGNpcGhlciA9ICdub25lJztcblx0dmFyIGtkZiA9ICdub25lJztcblx0dmFyIGtkZm9wdHMgPSBCdWZmZXIuYWxsb2MoMCk7XG5cdHZhciBjaW5mID0geyBibG9ja1NpemU6IDggfTtcblx0dmFyIHBhc3NwaHJhc2U7XG5cdGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXNzcGhyYXNlID0gb3B0aW9ucy5wYXNzcGhyYXNlO1xuXHRcdGlmICh0eXBlb2YgKHBhc3NwaHJhc2UpID09PSAnc3RyaW5nJylcblx0XHRcdHBhc3NwaHJhc2UgPSBCdWZmZXIuZnJvbShwYXNzcGhyYXNlLCAndXRmLTgnKTtcblx0XHRpZiAocGFzc3BocmFzZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRhc3NlcnQuYnVmZmVyKHBhc3NwaHJhc2UsICdvcHRpb25zLnBhc3NwaHJhc2UnKTtcblx0XHRcdGFzc2VydC5vcHRpb25hbFN0cmluZyhvcHRpb25zLmNpcGhlciwgJ29wdGlvbnMuY2lwaGVyJyk7XG5cdFx0XHRjaXBoZXIgPSBvcHRpb25zLmNpcGhlcjtcblx0XHRcdGlmIChjaXBoZXIgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0Y2lwaGVyID0gJ2FlczEyOC1jdHInO1xuXHRcdFx0Y2luZiA9IHV0aWxzLm9wZW5zc2hDaXBoZXJJbmZvKGNpcGhlcik7XG5cdFx0XHRrZGYgPSAnYmNyeXB0Jztcblx0XHR9XG5cdH1cblxuXHR2YXIgcHJpdkJ1Zjtcblx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpIHtcblx0XHRwcml2QnVmID0gbmV3IFNTSEJ1ZmZlcih7fSk7XG5cdFx0dmFyIGNoZWNrSW50ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLnJlYWRVSW50MzJCRSgwKTtcblx0XHRwcml2QnVmLndyaXRlSW50KGNoZWNrSW50KTtcblx0XHRwcml2QnVmLndyaXRlSW50KGNoZWNrSW50KTtcblx0XHRwcml2QnVmLndyaXRlKGtleS50b0J1ZmZlcigncmZjNDI1MycpKTtcblx0XHRwcml2QnVmLndyaXRlU3RyaW5nKGtleS5jb21tZW50IHx8ICcnKTtcblxuXHRcdHZhciBuID0gMTtcblx0XHR3aGlsZSAocHJpdkJ1Zi5fb2Zmc2V0ICUgY2luZi5ibG9ja1NpemUgIT09IDApXG5cdFx0XHRwcml2QnVmLndyaXRlQ2hhcihuKyspO1xuXHRcdHByaXZCdWYgPSBwcml2QnVmLnRvQnVmZmVyKCk7XG5cdH1cblxuXHRzd2l0Y2ggKGtkZikge1xuXHRjYXNlICdub25lJzpcblx0XHRicmVhaztcblx0Y2FzZSAnYmNyeXB0Jzpcblx0XHR2YXIgc2FsdCA9IGNyeXB0by5yYW5kb21CeXRlcygxNik7XG5cdFx0dmFyIHJvdW5kcyA9IDE2O1xuXHRcdHZhciBrZGZzc2ggPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0XHRrZGZzc2gud3JpdGVCdWZmZXIoc2FsdCk7XG5cdFx0a2Rmc3NoLndyaXRlSW50KHJvdW5kcyk7XG5cdFx0a2Rmb3B0cyA9IGtkZnNzaC50b0J1ZmZlcigpO1xuXG5cdFx0aWYgKGJjcnlwdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHQtcGJrZGYnKTtcblx0XHR9XG5cdFx0dmFyIHBhc3MgPSBuZXcgVWludDhBcnJheShwYXNzcGhyYXNlKTtcblx0XHR2YXIgc2FsdGkgPSBuZXcgVWludDhBcnJheShzYWx0KTtcblx0XHQvKiBVc2UgdGhlIHBia2RmIHRvIGRlcml2ZSBib3RoIHRoZSBrZXkgYW5kIHRoZSBJVi4gKi9cblx0XHR2YXIgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoY2luZi5rZXlTaXplICsgY2luZi5ibG9ja1NpemUpO1xuXHRcdHZhciByZXMgPSBiY3J5cHQucGJrZGYocGFzcywgcGFzcy5sZW5ndGgsIHNhbHRpLCBzYWx0aS5sZW5ndGgsXG5cdFx0ICAgIG91dCwgb3V0Lmxlbmd0aCwgcm91bmRzKTtcblx0XHRpZiAocmVzICE9PSAwKSB7XG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdiY3J5cHRfcGJrZGYgZnVuY3Rpb24gcmV0dXJuZWQgJyArXG5cdFx0XHQgICAgJ2ZhaWx1cmUsIHBhcmFtZXRlcnMgaW52YWxpZCcpKTtcblx0XHR9XG5cdFx0b3V0ID0gQnVmZmVyLmZyb20ob3V0KTtcblx0XHR2YXIgY2tleSA9IG91dC5zbGljZSgwLCBjaW5mLmtleVNpemUpO1xuXHRcdHZhciBpdiA9IG91dC5zbGljZShjaW5mLmtleVNpemUsIGNpbmYua2V5U2l6ZSArIGNpbmYuYmxvY2tTaXplKTtcblxuXHRcdHZhciBjaXBoZXJTdHJlYW0gPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoY2luZi5vcGVuc3NsTmFtZSxcblx0XHQgICAgY2tleSwgaXYpO1xuXHRcdGNpcGhlclN0cmVhbS5zZXRBdXRvUGFkZGluZyhmYWxzZSk7XG5cdFx0dmFyIGNodW5rLCBjaHVua3MgPSBbXTtcblx0XHRjaXBoZXJTdHJlYW0ub25jZSgnZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0dGhyb3cgKGUpO1xuXHRcdH0pO1xuXHRcdGNpcGhlclN0cmVhbS53cml0ZShwcml2QnVmKTtcblx0XHRjaXBoZXJTdHJlYW0uZW5kKCk7XG5cdFx0d2hpbGUgKChjaHVuayA9IGNpcGhlclN0cmVhbS5yZWFkKCkpICE9PSBudWxsKVxuXHRcdFx0Y2h1bmtzLnB1c2goY2h1bmspO1xuXHRcdHByaXZCdWYgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQga2RmICcgKyBrZGYpKTtcblx0fVxuXG5cdHZhciBidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblxuXHRidWYud3JpdGVDU3RyaW5nKE1BR0lDKTtcblx0YnVmLndyaXRlU3RyaW5nKGNpcGhlcik7XHQvKiBjaXBoZXIgKi9cblx0YnVmLndyaXRlU3RyaW5nKGtkZik7XHRcdC8qIGtkZiAqL1xuXHRidWYud3JpdGVCdWZmZXIoa2Rmb3B0cyk7XHQvKiBrZGZvcHRpb25zICovXG5cblx0YnVmLndyaXRlSW50KDEpO1x0XHQvKiBua2V5cyAqL1xuXHRidWYud3JpdGVCdWZmZXIocHViS2V5LnRvQnVmZmVyKCdyZmM0MjUzJykpO1xuXG5cdGlmIChwcml2QnVmKVxuXHRcdGJ1Zi53cml0ZUJ1ZmZlcihwcml2QnVmKTtcblxuXHRidWYgPSBidWYudG9CdWZmZXIoKTtcblxuXHR2YXIgaGVhZGVyO1xuXHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSlcblx0XHRoZWFkZXIgPSAnT1BFTlNTSCBQUklWQVRFIEtFWSc7XG5cdGVsc2Vcblx0XHRoZWFkZXIgPSAnT1BFTlNTSCBQVUJMSUMgS0VZJztcblxuXHR2YXIgdG1wID0gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0dmFyIGxlbiA9IHRtcC5sZW5ndGggKyAodG1wLmxlbmd0aCAvIDcwKSArXG5cdCAgICAxOCArIDE2ICsgaGVhZGVyLmxlbmd0aCoyICsgMTA7XG5cdGJ1ZiA9IEJ1ZmZlci5hbGxvYyhsZW4pO1xuXHR2YXIgbyA9IDA7XG5cdG8gKz0gYnVmLndyaXRlKCctLS0tLUJFR0lOICcgKyBoZWFkZXIgKyAnLS0tLS1cXG4nLCBvKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyApIHtcblx0XHR2YXIgbGltaXQgPSBpICsgNzA7XG5cdFx0aWYgKGxpbWl0ID4gdG1wLmxlbmd0aClcblx0XHRcdGxpbWl0ID0gdG1wLmxlbmd0aDtcblx0XHRvICs9IGJ1Zi53cml0ZSh0bXAuc2xpY2UoaSwgbGltaXQpLCBvKTtcblx0XHRidWZbbysrXSA9IDEwO1xuXHRcdGkgPSBsaW1pdDtcblx0fVxuXHRvICs9IGJ1Zi53cml0ZSgnLS0tLS1FTkQgJyArIGhlYWRlciArICctLS0tLVxcbicsIG8pO1xuXG5cdHJldHVybiAoYnVmLnNsaWNlKDAsIG8pKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxOCBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHdyaXRlOiB3cml0ZVxufTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgYWxncyA9IHJlcXVpcmUoJy4uL2FsZ3MnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgS2V5ID0gcmVxdWlyZSgnLi4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG5cbnZhciBwa2NzMSA9IHJlcXVpcmUoJy4vcGtjczEnKTtcbnZhciBwa2NzOCA9IHJlcXVpcmUoJy4vcGtjczgnKTtcbnZhciBzc2hwcml2ID0gcmVxdWlyZSgnLi9zc2gtcHJpdmF0ZScpO1xudmFyIHJmYzQyNTMgPSByZXF1aXJlKCcuL3JmYzQyNTMnKTtcblxudmFyIGVycm9ycyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpO1xuXG52YXIgT0lEX1BCRVMyID0gJzEuMi44NDAuMTEzNTQ5LjEuNS4xMyc7XG52YXIgT0lEX1BCS0RGMiA9ICcxLjIuODQwLjExMzU0OS4xLjUuMTInO1xuXG52YXIgT0lEX1RPX0NJUEhFUiA9IHtcblx0JzEuMi44NDAuMTEzNTQ5LjMuNyc6ICczZGVzLWNiYycsXG5cdCcyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yJzogJ2FlczEyOC1jYmMnLFxuXHQnMi4xNi44NDAuMS4xMDEuMy40LjEuNDInOiAnYWVzMjU2LWNiYydcbn07XG52YXIgQ0lQSEVSX1RPX09JRCA9IHt9O1xuT2JqZWN0LmtleXMoT0lEX1RPX0NJUEhFUikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHRDSVBIRVJfVE9fT0lEW09JRF9UT19DSVBIRVJba11dID0gaztcbn0pO1xuXG52YXIgT0lEX1RPX0hBU0ggPSB7XG5cdCcxLjIuODQwLjExMzU0OS4yLjcnOiAnc2hhMScsXG5cdCcxLjIuODQwLjExMzU0OS4yLjknOiAnc2hhMjU2Jyxcblx0JzEuMi44NDAuMTEzNTQ5LjIuMTEnOiAnc2hhNTEyJ1xufTtcbnZhciBIQVNIX1RPX09JRCA9IHt9O1xuT2JqZWN0LmtleXMoT0lEX1RPX0hBU0gpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0SEFTSF9UT19PSURbT0lEX1RPX0hBU0hba11dID0gaztcbn0pO1xuXG4vKlxuICogRm9yIHJlYWRpbmcgd2Ugc3VwcG9ydCBib3RoIFBLQ1MjMSBhbmQgUEtDUyM4LiBJZiB3ZSBmaW5kIGEgcHJpdmF0ZSBrZXksXG4gKiB3ZSBqdXN0IHRha2UgdGhlIHB1YmxpYyBjb21wb25lbnQgb2YgaXQgYW5kIHVzZSB0aGF0LlxuICovXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucywgZm9yY2VUeXBlKSB7XG5cdHZhciBpbnB1dCA9IGJ1Zjtcblx0aWYgKHR5cGVvZiAoYnVmKSAhPT0gJ3N0cmluZycpIHtcblx0XHRhc3NlcnQuYnVmZmVyKGJ1ZiwgJ2J1ZicpO1xuXHRcdGJ1ZiA9IGJ1Zi50b1N0cmluZygnYXNjaWknKTtcblx0fVxuXG5cdHZhciBsaW5lcyA9IGJ1Zi50cmltKCkuc3BsaXQoL1tcXHJcXG5dKy9nKTtcblxuXHR2YXIgbTtcblx0dmFyIHNpID0gLTE7XG5cdHdoaWxlICghbSAmJiBzaSA8IGxpbmVzLmxlbmd0aCkge1xuXHRcdG0gPSBsaW5lc1srK3NpXS5tYXRjaCgvKkpTU1RZTEVEKi9cblx0XHQgICAgL1stXStbIF0qQkVHSU4gKFtBLVowLTldW0EtWmEtejAtOV0rICk/KFBVQkxJQ3xQUklWQVRFKSBLRVlbIF0qWy1dKy8pO1xuXHR9XG5cdGFzc2VydC5vayhtLCAnaW52YWxpZCBQRU0gaGVhZGVyJyk7XG5cblx0dmFyIG0yO1xuXHR2YXIgZWkgPSBsaW5lcy5sZW5ndGg7XG5cdHdoaWxlICghbTIgJiYgZWkgPiAwKSB7XG5cdFx0bTIgPSBsaW5lc1stLWVpXS5tYXRjaCgvKkpTU1RZTEVEKi9cblx0XHQgICAgL1stXStbIF0qRU5EIChbQS1aMC05XVtBLVphLXowLTldKyApPyhQVUJMSUN8UFJJVkFURSkgS0VZWyBdKlstXSsvKTtcblx0fVxuXHRhc3NlcnQub2sobTIsICdpbnZhbGlkIFBFTSBmb290ZXInKTtcblxuXHQvKiBCZWdpbiBhbmQgZW5kIGJhbm5lcnMgbXVzdCBtYXRjaCBrZXkgdHlwZSAqL1xuXHRhc3NlcnQuZXF1YWwobVsyXSwgbTJbMl0pO1xuXHR2YXIgdHlwZSA9IG1bMl0udG9Mb3dlckNhc2UoKTtcblxuXHR2YXIgYWxnO1xuXHRpZiAobVsxXSkge1xuXHRcdC8qIFRoZXkgYWxzbyBtdXN0IG1hdGNoIGFsZ29yaXRobXMsIGlmIGdpdmVuICovXG5cdFx0YXNzZXJ0LmVxdWFsKG1bMV0sIG0yWzFdLCAnUEVNIGhlYWRlciBhbmQgZm9vdGVyIG1pc21hdGNoJyk7XG5cdFx0YWxnID0gbVsxXS50cmltKCk7XG5cdH1cblxuXHRsaW5lcyA9IGxpbmVzLnNsaWNlKHNpLCBlaSArIDEpO1xuXG5cdHZhciBoZWFkZXJzID0ge307XG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0bGluZXMgPSBsaW5lcy5zbGljZSgxKTtcblx0XHRtID0gbGluZXNbMF0ubWF0Y2goLypKU1NUWUxFRCovXG5cdFx0ICAgIC9eKFtBLVphLXowLTktXSspOiAoLispJC8pO1xuXHRcdGlmICghbSlcblx0XHRcdGJyZWFrO1xuXHRcdGhlYWRlcnNbbVsxXS50b0xvd2VyQ2FzZSgpXSA9IG1bMl07XG5cdH1cblxuXHQvKiBDaG9wIG9mZiB0aGUgZmlyc3QgYW5kIGxhc3QgbGluZXMgKi9cblx0bGluZXMgPSBsaW5lcy5zbGljZSgwLCAtMSkuam9pbignJyk7XG5cdGJ1ZiA9IEJ1ZmZlci5mcm9tKGxpbmVzLCAnYmFzZTY0Jyk7XG5cblx0dmFyIGNpcGhlciwga2V5LCBpdjtcblx0aWYgKGhlYWRlcnNbJ3Byb2MtdHlwZSddKSB7XG5cdFx0dmFyIHBhcnRzID0gaGVhZGVyc1sncHJvYy10eXBlJ10uc3BsaXQoJywnKTtcblx0XHRpZiAocGFydHNbMF0gPT09ICc0JyAmJiBwYXJ0c1sxXSA9PT0gJ0VOQ1JZUFRFRCcpIHtcblx0XHRcdGlmICh0eXBlb2YgKG9wdGlvbnMucGFzc3BocmFzZSkgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdG9wdGlvbnMucGFzc3BocmFzZSA9IEJ1ZmZlci5mcm9tKFxuXHRcdFx0XHQgICAgb3B0aW9ucy5wYXNzcGhyYXNlLCAndXRmLTgnKTtcblx0XHRcdH1cblx0XHRcdGlmICghQnVmZmVyLmlzQnVmZmVyKG9wdGlvbnMucGFzc3BocmFzZSkpIHtcblx0XHRcdFx0dGhyb3cgKG5ldyBlcnJvcnMuS2V5RW5jcnlwdGVkRXJyb3IoXG5cdFx0XHRcdCAgICBvcHRpb25zLmZpbGVuYW1lLCAnUEVNJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cGFydHMgPSBoZWFkZXJzWydkZWstaW5mbyddLnNwbGl0KCcsJyk7XG5cdFx0XHRcdGFzc2VydC5vayhwYXJ0cy5sZW5ndGggPT09IDIpO1xuXHRcdFx0XHRjaXBoZXIgPSBwYXJ0c1swXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRpdiA9IEJ1ZmZlci5mcm9tKHBhcnRzWzFdLCAnaGV4Jyk7XG5cdFx0XHRcdGtleSA9IHV0aWxzLm9wZW5zc2xLZXlEZXJpdihjaXBoZXIsIGl2LFxuXHRcdFx0XHQgICAgb3B0aW9ucy5wYXNzcGhyYXNlLCAxKS5rZXk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFsZyAmJiBhbGcudG9Mb3dlckNhc2UoKSA9PT0gJ2VuY3J5cHRlZCcpIHtcblx0XHR2YXIgZWRlciA9IG5ldyBhc24xLkJlclJlYWRlcihidWYpO1xuXHRcdHZhciBwYmVzRW5kO1xuXHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XG5cblx0XHRlZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdHBiZXNFbmQgPSBlZGVyLm9mZnNldCArIGVkZXIubGVuZ3RoO1xuXG5cdFx0dmFyIG1ldGhvZCA9IGVkZXIucmVhZE9JRCgpO1xuXHRcdGlmIChtZXRob2QgIT09IE9JRF9QQkVTMikge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgUEVNL1BLQ1M4IGVuY3J5cHRpb24gJyArXG5cdFx0XHQgICAgJ3NjaGVtZTogJyArIG1ldGhvZCkpO1xuXHRcdH1cblxuXHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XHQvKiBQQkVTMi1wYXJhbXMgKi9cblxuXHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XHQvKiBrZXlEZXJpdmF0aW9uRnVuYyAqL1xuXHRcdHZhciBrZGZFbmQgPSBlZGVyLm9mZnNldCArIGVkZXIubGVuZ3RoO1xuXHRcdHZhciBrZGZPaWQgPSBlZGVyLnJlYWRPSUQoKTtcblx0XHRpZiAoa2RmT2lkICE9PSBPSURfUEJLREYyKVxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgUEJFUzIgS0RGOiAnICsga2RmT2lkKSk7XG5cdFx0ZWRlci5yZWFkU2VxdWVuY2UoKTtcblx0XHR2YXIgc2FsdCA9IGVkZXIucmVhZFN0cmluZyhhc24xLkJlci5PY3RldFN0cmluZywgdHJ1ZSk7XG5cdFx0dmFyIGl0ZXJhdGlvbnMgPSBlZGVyLnJlYWRJbnQoKTtcblx0XHR2YXIgaGFzaEFsZyA9ICdzaGExJztcblx0XHRpZiAoZWRlci5vZmZzZXQgPCBrZGZFbmQpIHtcblx0XHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XG5cdFx0XHR2YXIgaGFzaEFsZ09pZCA9IGVkZXIucmVhZE9JRCgpO1xuXHRcdFx0aGFzaEFsZyA9IE9JRF9UT19IQVNIW2hhc2hBbGdPaWRdO1xuXHRcdFx0aWYgKGhhc2hBbGcgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBQQktERjIgaGFzaDogJyArXG5cdFx0XHRcdCAgICBoYXNoQWxnT2lkKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVkZXIuX29mZnNldCA9IGtkZkVuZDtcblxuXHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XHQvKiBlbmNyeXB0aW9uU2NoZW1lICovXG5cdFx0dmFyIGNpcGhlck9pZCA9IGVkZXIucmVhZE9JRCgpO1xuXHRcdGNpcGhlciA9IE9JRF9UT19DSVBIRVJbY2lwaGVyT2lkXTtcblx0XHRpZiAoY2lwaGVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIFBCRVMyIGNpcGhlcjogJyArXG5cdFx0XHQgICAgY2lwaGVyT2lkKSk7XG5cdFx0fVxuXHRcdGl2ID0gZWRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKTtcblxuXHRcdGVkZXIuX29mZnNldCA9IHBiZXNFbmQ7XG5cdFx0YnVmID0gZWRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKTtcblxuXHRcdGlmICh0eXBlb2YgKG9wdGlvbnMucGFzc3BocmFzZSkgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRvcHRpb25zLnBhc3NwaHJhc2UgPSBCdWZmZXIuZnJvbShcblx0XHRcdCAgICBvcHRpb25zLnBhc3NwaHJhc2UsICd1dGYtOCcpO1xuXHRcdH1cblx0XHRpZiAoIUJ1ZmZlci5pc0J1ZmZlcihvcHRpb25zLnBhc3NwaHJhc2UpKSB7XG5cdFx0XHR0aHJvdyAobmV3IGVycm9ycy5LZXlFbmNyeXB0ZWRFcnJvcihcblx0XHRcdCAgICBvcHRpb25zLmZpbGVuYW1lLCAnUEVNJykpO1xuXHRcdH1cblxuXHRcdHZhciBjaW5mbyA9IHV0aWxzLm9wZW5zc2hDaXBoZXJJbmZvKGNpcGhlcik7XG5cblx0XHRjaXBoZXIgPSBjaW5mby5vcGVuc3NsTmFtZTtcblx0XHRrZXkgPSB1dGlscy5wYmtkZjIoaGFzaEFsZywgc2FsdCwgaXRlcmF0aW9ucywgY2luZm8ua2V5U2l6ZSxcblx0XHQgICAgb3B0aW9ucy5wYXNzcGhyYXNlKTtcblx0XHRhbGcgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoY2lwaGVyICYmIGtleSAmJiBpdikge1xuXHRcdHZhciBjaXBoZXJTdHJlYW0gPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihjaXBoZXIsIGtleSwgaXYpO1xuXHRcdHZhciBjaHVuaywgY2h1bmtzID0gW107XG5cdFx0Y2lwaGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdGlmIChlLnRvU3RyaW5nKCkuaW5kZXhPZignYmFkIGRlY3J5cHQnKSAhPT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgKG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3NwaHJhc2UgJyArXG5cdFx0XHRcdCAgICAnc3VwcGxpZWQsIGNvdWxkIG5vdCBkZWNyeXB0IGtleScpKTtcblx0XHRcdH1cblx0XHRcdHRocm93IChlKTtcblx0XHR9KTtcblx0XHRjaXBoZXJTdHJlYW0ud3JpdGUoYnVmKTtcblx0XHRjaXBoZXJTdHJlYW0uZW5kKCk7XG5cdFx0d2hpbGUgKChjaHVuayA9IGNpcGhlclN0cmVhbS5yZWFkKCkpICE9PSBudWxsKVxuXHRcdFx0Y2h1bmtzLnB1c2goY2h1bmspO1xuXHRcdGJ1ZiA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKTtcblx0fVxuXG5cdC8qIFRoZSBuZXcgT3BlblNTSCBpbnRlcm5hbCBmb3JtYXQgYWJ1c2VzIFBFTSBoZWFkZXJzICovXG5cdGlmIChhbGcgJiYgYWxnLnRvTG93ZXJDYXNlKCkgPT09ICdvcGVuc3NoJylcblx0XHRyZXR1cm4gKHNzaHByaXYucmVhZFNTSFByaXZhdGUodHlwZSwgYnVmLCBvcHRpb25zKSk7XG5cdGlmIChhbGcgJiYgYWxnLnRvTG93ZXJDYXNlKCkgPT09ICdzc2gyJylcblx0XHRyZXR1cm4gKHJmYzQyNTMucmVhZFR5cGUodHlwZSwgYnVmLCBvcHRpb25zKSk7XG5cblx0dmFyIGRlciA9IG5ldyBhc24xLkJlclJlYWRlcihidWYpO1xuXHRkZXIub3JpZ2luYWxJbnB1dCA9IGlucHV0O1xuXG5cdC8qXG5cdCAqIEFsbCBvZiB0aGUgUEVNIGZpbGUgdHlwZXMgc3RhcnQgd2l0aCBhIHNlcXVlbmNlIHRhZywgc28gY2hvcCBpdFxuXHQgKiBvZmYgaGVyZVxuXHQgKi9cblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXG5cdC8qIFBLQ1MjMSB0eXBlIGtleXMgbmFtZSBhbiBhbGdvcml0aG0gaW4gdGhlIGJhbm5lciBleHBsaWNpdGx5ICovXG5cdGlmIChhbGcpIHtcblx0XHRpZiAoZm9yY2VUeXBlKVxuXHRcdFx0YXNzZXJ0LnN0cmljdEVxdWFsKGZvcmNlVHlwZSwgJ3BrY3MxJyk7XG5cdFx0cmV0dXJuIChwa2NzMS5yZWFkUGtjczEoYWxnLCB0eXBlLCBkZXIpKTtcblx0fSBlbHNlIHtcblx0XHRpZiAoZm9yY2VUeXBlKVxuXHRcdFx0YXNzZXJ0LnN0cmljdEVxdWFsKGZvcmNlVHlwZSwgJ3BrY3M4Jyk7XG5cdFx0cmV0dXJuIChwa2NzOC5yZWFkUGtjczgoYWxnLCB0eXBlLCBkZXIpKTtcblx0fVxufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMsIHR5cGUpIHtcblx0YXNzZXJ0Lm9iamVjdChrZXkpO1xuXG5cdHZhciBhbGcgPSB7XG5cdCAgICAnZWNkc2EnOiAnRUMnLFxuXHQgICAgJ3JzYSc6ICdSU0EnLFxuXHQgICAgJ2RzYSc6ICdEU0EnLFxuXHQgICAgJ2VkMjU1MTknOiAnRWREU0EnXG5cdH1ba2V5LnR5cGVdO1xuXHR2YXIgaGVhZGVyO1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblxuXHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSkge1xuXHRcdGlmICh0eXBlICYmIHR5cGUgPT09ICdwa2NzOCcpIHtcblx0XHRcdGhlYWRlciA9ICdQUklWQVRFIEtFWSc7XG5cdFx0XHRwa2NzOC53cml0ZVBrY3M4KGRlciwga2V5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGUpXG5cdFx0XHRcdGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlLCAncGtjczEnKTtcblx0XHRcdGhlYWRlciA9IGFsZyArICcgUFJJVkFURSBLRVknO1xuXHRcdFx0cGtjczEud3JpdGVQa2NzMShkZXIsIGtleSk7XG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAoS2V5LmlzS2V5KGtleSkpIHtcblx0XHRpZiAodHlwZSAmJiB0eXBlID09PSAncGtjczEnKSB7XG5cdFx0XHRoZWFkZXIgPSBhbGcgKyAnIFBVQkxJQyBLRVknO1xuXHRcdFx0cGtjczEud3JpdGVQa2NzMShkZXIsIGtleSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0eXBlKVxuXHRcdFx0XHRhc3NlcnQuc3RyaWN0RXF1YWwodHlwZSwgJ3BrY3M4Jyk7XG5cdFx0XHRoZWFkZXIgPSAnUFVCTElDIEtFWSc7XG5cdFx0XHRwa2NzOC53cml0ZVBrY3M4KGRlciwga2V5KTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdrZXkgaXMgbm90IGEgS2V5IG9yIFByaXZhdGVLZXknKSk7XG5cdH1cblxuXHR2YXIgdG1wID0gZGVyLmJ1ZmZlci50b1N0cmluZygnYmFzZTY0Jyk7XG5cdHZhciBsZW4gPSB0bXAubGVuZ3RoICsgKHRtcC5sZW5ndGggLyA2NCkgK1xuXHQgICAgMTggKyAxNiArIGhlYWRlci5sZW5ndGgqMiArIDEwO1xuXHR2YXIgYnVmID0gQnVmZmVyLmFsbG9jKGxlbik7XG5cdHZhciBvID0gMDtcblx0byArPSBidWYud3JpdGUoJy0tLS0tQkVHSU4gJyArIGhlYWRlciArICctLS0tLVxcbicsIG8pO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7ICkge1xuXHRcdHZhciBsaW1pdCA9IGkgKyA2NDtcblx0XHRpZiAobGltaXQgPiB0bXAubGVuZ3RoKVxuXHRcdFx0bGltaXQgPSB0bXAubGVuZ3RoO1xuXHRcdG8gKz0gYnVmLndyaXRlKHRtcC5zbGljZShpLCBsaW1pdCksIG8pO1xuXHRcdGJ1ZltvKytdID0gMTA7XG5cdFx0aSA9IGxpbWl0O1xuXHR9XG5cdG8gKz0gYnVmLndyaXRlKCctLS0tLUVORCAnICsgaGVhZGVyICsgJy0tLS0tXFxuJywgbyk7XG5cblx0cmV0dXJuIChidWYuc2xpY2UoMCwgbykpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0d3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgcmZjNDI1MyA9IHJlcXVpcmUoJy4vcmZjNDI1MycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi4vcHJpdmF0ZS1rZXknKTtcblxudmFyIHNzaHByaXYgPSByZXF1aXJlKCcuL3NzaC1wcml2YXRlJyk7XG5cbi8qSlNTVFlMRUQqL1xudmFyIFNTSEtFWV9SRSA9IC9eKFthLXowLTktXSspWyBcXHRdKyhbYS16QS1aMC05K1xcL10rWz1dKikoWyBcXHRdKyhbXiBcXHRdW15cXG5dKltcXG5dKik/KT8kLztcbi8qSlNTVFlMRUQqL1xudmFyIFNTSEtFWV9SRTIgPSAvXihbYS16MC05LV0rKVsgXFx0XFxuXSsoW2EtekEtWjAtOStcXC9dW2EtekEtWjAtOStcXC8gXFx0XFxuPV0qKShbXmEtekEtWjAtOStcXC8gXFx0XFxuPV0uKik/JC87XG5cbmZ1bmN0aW9uIHJlYWQoYnVmLCBvcHRpb25zKSB7XG5cdGlmICh0eXBlb2YgKGJ1ZikgIT09ICdzdHJpbmcnKSB7XG5cdFx0YXNzZXJ0LmJ1ZmZlcihidWYsICdidWYnKTtcblx0XHRidWYgPSBidWYudG9TdHJpbmcoJ2FzY2lpJyk7XG5cdH1cblxuXHR2YXIgdHJpbW1lZCA9IGJ1Zi50cmltKCkucmVwbGFjZSgvW1xcXFxcXHJdL2csICcnKTtcblx0dmFyIG0gPSB0cmltbWVkLm1hdGNoKFNTSEtFWV9SRSk7XG5cdGlmICghbSlcblx0XHRtID0gdHJpbW1lZC5tYXRjaChTU0hLRVlfUkUyKTtcblx0YXNzZXJ0Lm9rKG0sICdrZXkgbXVzdCBtYXRjaCByZWdleCcpO1xuXG5cdHZhciB0eXBlID0gcmZjNDI1My5hbGdUb0tleVR5cGUobVsxXSk7XG5cdHZhciBrYnVmID0gQnVmZmVyLmZyb20obVsyXSwgJ2Jhc2U2NCcpO1xuXG5cdC8qXG5cdCAqIFRoaXMgaXMgYSBiaXQgdHJpY2t5LiBJZiB3ZSBtYW5hZ2VkIHRvIHBhcnNlIHRoZSBrZXkgYW5kIGxvY2F0ZSB0aGVcblx0ICoga2V5IGNvbW1lbnQgd2l0aCB0aGUgcmVnZXgsIHRoZW4gZG8gYSBub24tcGFydGlhbCByZWFkIGFuZCBhc3NlcnRcblx0ICogdGhhdCB3ZSBoYXZlIGNvbnN1bWVkIGFsbCBieXRlcy4gSWYgd2UgY291bGRuJ3QgbG9jYXRlIHRoZSBrZXlcblx0ICogY29tbWVudCwgdGhvdWdoLCB0aGVyZSBtYXkgYmUgd2hpdGVzcGFjZSBzaGVuYW5pZ2FucyBnb2luZyBvbiB0aGF0XG5cdCAqIGhhdmUgY29uam9pbmVkIHRoZSBjb21tZW50IHRvIHRoZSByZXN0IG9mIHRoZSBrZXkuIFdlIGRvIGEgcGFydGlhbFxuXHQgKiByZWFkIGluIHRoaXMgY2FzZSB0byB0cnkgdG8gbWFrZSB0aGUgYmVzdCBvdXQgb2YgYSBzb3JyeSBzaXR1YXRpb24uXG5cdCAqL1xuXHR2YXIga2V5O1xuXHR2YXIgcmV0ID0ge307XG5cdGlmIChtWzRdKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGtleSA9IHJmYzQyNTMucmVhZChrYnVmKTtcblxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG0gPSB0cmltbWVkLm1hdGNoKFNTSEtFWV9SRTIpO1xuXHRcdFx0YXNzZXJ0Lm9rKG0sICdrZXkgbXVzdCBtYXRjaCByZWdleCcpO1xuXHRcdFx0a2J1ZiA9IEJ1ZmZlci5mcm9tKG1bMl0sICdiYXNlNjQnKTtcblx0XHRcdGtleSA9IHJmYzQyNTMucmVhZEludGVybmFsKHJldCwgJ3B1YmxpYycsIGtidWYpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRrZXkgPSByZmM0MjUzLnJlYWRJbnRlcm5hbChyZXQsICdwdWJsaWMnLCBrYnVmKTtcblx0fVxuXG5cdGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlLCBrZXkudHlwZSk7XG5cblx0aWYgKG1bNF0gJiYgbVs0XS5sZW5ndGggPiAwKSB7XG5cdFx0a2V5LmNvbW1lbnQgPSBtWzRdO1xuXG5cdH0gZWxzZSBpZiAocmV0LmNvbnN1bWVkKSB7XG5cdFx0Lypcblx0XHQgKiBOb3cgdGhlIG1hZ2ljOiB0cnlpbmcgdG8gcmVjb3ZlciB0aGUga2V5IGNvbW1lbnQgd2hlbiBpdCdzXG5cdFx0ICogZ290dGVuIGNvbmpvaW5lZCB0byB0aGUga2V5IG9yIG90aGVyd2lzZSBzaGVuYW5pZ2FuJ2QuXG5cdFx0ICpcblx0XHQgKiBXb3JrIG91dCBob3cgbXVjaCBiYXNlNjQgd2UgdXNlZCwgdGhlbiBkcm9wIGFsbCBub24tYmFzZTY0XG5cdFx0ICogY2hhcnMgZnJvbSB0aGUgYmVnaW5uaW5nIHVwIHRvIHRoaXMgcG9pbnQgaW4gdGhlIHRoZSBzdHJpbmcuXG5cdFx0ICogVGhlbiBvZmZzZXQgaW4gdGhpcyBhbmQgdHJ5IHRvIG1ha2UgdXAgZm9yIG1pc3NpbmcgPSBjaGFycy5cblx0XHQgKi9cblx0XHR2YXIgZGF0YSA9IG1bMl0gKyAobVszXSA/IG1bM10gOiAnJyk7XG5cdFx0dmFyIHJlYWxPZmZzZXQgPSBNYXRoLmNlaWwocmV0LmNvbnN1bWVkIC8gMykgKiA0O1xuXHRcdGRhdGEgPSBkYXRhLnNsaWNlKDAsIHJlYWxPZmZzZXQgLSAyKS4gLypKU1NUWUxFRCovXG5cdFx0ICAgIHJlcGxhY2UoL1teYS16QS1aMC05K1xcLz1dL2csICcnKSArXG5cdFx0ICAgIGRhdGEuc2xpY2UocmVhbE9mZnNldCAtIDIpO1xuXG5cdFx0dmFyIHBhZGRpbmcgPSByZXQuY29uc3VtZWQgJSAzO1xuXHRcdGlmIChwYWRkaW5nID4gMCAmJlxuXHRcdCAgICBkYXRhLnNsaWNlKHJlYWxPZmZzZXQgLSAxLCByZWFsT2Zmc2V0KSAhPT0gJz0nKVxuXHRcdFx0cmVhbE9mZnNldC0tO1xuXHRcdHdoaWxlIChkYXRhLnNsaWNlKHJlYWxPZmZzZXQsIHJlYWxPZmZzZXQgKyAxKSA9PT0gJz0nKVxuXHRcdFx0cmVhbE9mZnNldCsrO1xuXG5cdFx0LyogRmluYWxseSwgZ3JhYiB3aGF0IHdlIHRoaW5rIGlzIHRoZSBjb21tZW50ICYgY2xlYW4gaXQgdXAuICovXG5cdFx0dmFyIHRyYWlsZXIgPSBkYXRhLnNsaWNlKHJlYWxPZmZzZXQpO1xuXHRcdHRyYWlsZXIgPSB0cmFpbGVyLnJlcGxhY2UoL1tcXHJcXG5dL2csICcgJykuXG5cdFx0ICAgIHJlcGxhY2UoL15cXHMrLywgJycpO1xuXHRcdGlmICh0cmFpbGVyLm1hdGNoKC9eW2EtekEtWjAtOV0vKSlcblx0XHRcdGtleS5jb21tZW50ID0gdHJhaWxlcjtcblx0fVxuXG5cdHJldHVybiAoa2V5KTtcbn1cblxuZnVuY3Rpb24gd3JpdGUoa2V5LCBvcHRpb25zKSB7XG5cdGFzc2VydC5vYmplY3Qoa2V5KTtcblx0aWYgKCFLZXkuaXNLZXkoa2V5KSlcblx0XHR0aHJvdyAobmV3IEVycm9yKCdNdXN0IGJlIGEgcHVibGljIGtleScpKTtcblxuXHR2YXIgcGFydHMgPSBbXTtcblx0dmFyIGFsZyA9IHJmYzQyNTMua2V5VHlwZVRvQWxnKGtleSk7XG5cdHBhcnRzLnB1c2goYWxnKTtcblxuXHR2YXIgYnVmID0gcmZjNDI1My53cml0ZShrZXkpO1xuXHRwYXJ0cy5wdXNoKGJ1Zi50b1N0cmluZygnYmFzZTY0JykpO1xuXG5cdGlmIChrZXkuY29tbWVudClcblx0XHRwYXJ0cy5wdXNoKGtleS5jb21tZW50KTtcblxuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKHBhcnRzLmpvaW4oJyAnKSkpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE3IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0d3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgS2V5ID0gcmVxdWlyZSgnLi4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIFNTSEJ1ZmZlciA9IHJlcXVpcmUoJy4uL3NzaC1idWZmZXInKTtcbnZhciBEaGUgPSByZXF1aXJlKCcuLi9kaGUnKTtcblxudmFyIHN1cHBvcnRlZEFsZ29zID0ge1xuXHQncnNhLXNoYTEnIDogNSxcblx0J3JzYS1zaGEyNTYnIDogOCxcblx0J3JzYS1zaGE1MTInIDogMTAsXG5cdCdlY2RzYS1wMjU2LXNoYTI1NicgOiAxMyxcblx0J2VjZHNhLXAzODQtc2hhMzg0JyA6IDE0XG5cdC8qXG5cdCAqIGVkMjU1MTkgaXMgaHlwb3RoZXRpY2FsbHkgc3VwcG9ydGVkIHdpdGggaWQgMTVcblx0ICogYnV0IHRoZSBjb21tb24gdG9vbHMgYXZhaWxhYmxlIGRvbid0IGFwcGVhciB0byBiZVxuXHQgKiBjYXBhYmxlIG9mIGdlbmVyYXRpbmcvdXNpbmcgZWQyNTUxOSBrZXlzXG5cdCAqL1xufTtcblxudmFyIHN1cHBvcnRlZEFsZ29zQnlJZCA9IHt9O1xuT2JqZWN0LmtleXMoc3VwcG9ydGVkQWxnb3MpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0c3VwcG9ydGVkQWxnb3NCeUlkW3N1cHBvcnRlZEFsZ29zW2tdXSA9IGsudG9VcHBlckNhc2UoKTtcbn0pO1xuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIChidWYpICE9PSAnc3RyaW5nJykge1xuXHRcdGFzc2VydC5idWZmZXIoYnVmLCAnYnVmJyk7XG5cdFx0YnVmID0gYnVmLnRvU3RyaW5nKCdhc2NpaScpO1xuXHR9XG5cdHZhciBsaW5lcyA9IGJ1Zi5zcGxpdCgnXFxuJyk7XG5cdGlmIChsaW5lc1swXS5tYXRjaCgvXlByaXZhdGUta2V5LWZvcm1hdFxcOiB2MS8pKSB7XG5cdFx0dmFyIGFsZ0VsZW1zID0gbGluZXNbMV0uc3BsaXQoJyAnKTtcblx0XHR2YXIgYWxnb051bSA9IHBhcnNlSW50KGFsZ0VsZW1zWzFdLCAxMCk7XG5cdFx0dmFyIGFsZ29OYW1lID0gYWxnRWxlbXNbMl07XG5cdFx0aWYgKCFzdXBwb3J0ZWRBbGdvc0J5SWRbYWxnb051bV0pXG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBhbGdvcml0aG06ICcgKyBhbGdvTmFtZSkpO1xuXHRcdHJldHVybiAocmVhZEROU1NFQ1ByaXZhdGVLZXkoYWxnb051bSwgbGluZXMuc2xpY2UoMikpKTtcblx0fVxuXG5cdC8vIHNraXAgYW55IGNvbW1lbnQtbGluZXNcblx0dmFyIGxpbmUgPSAwO1xuXHQvKiBKU1NUWUxFRCAqL1xuXHR3aGlsZSAobGluZXNbbGluZV0ubWF0Y2goL15cXDsvKSlcblx0XHRsaW5lKys7XG5cdC8vIHdlIHNob3VsZCBub3cgaGF2ZSAqb25lIHNpbmdsZSogbGluZSBsZWZ0IHdpdGggb3VyIEtFWSBvbiBpdC5cblx0aWYgKChsaW5lc1tsaW5lXS5tYXRjaCgvXFwuIElOIEtFWSAvKSB8fFxuXHQgICAgbGluZXNbbGluZV0ubWF0Y2goL1xcLiBJTiBETlNLRVkgLykpICYmIGxpbmVzW2xpbmUrMV0ubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIChyZWFkUkZDMzExMChsaW5lc1tsaW5lXSkpO1xuXHR9XG5cdHRocm93IChuZXcgRXJyb3IoJ0Nhbm5vdCBwYXJzZSBkbnNzZWMga2V5JykpO1xufVxuXG5mdW5jdGlvbiByZWFkUkZDMzExMChrZXlTdHJpbmcpIHtcblx0dmFyIGVsZW1zID0ga2V5U3RyaW5nLnNwbGl0KCcgJyk7XG5cdC8vdW51c2VkIHZhciBmbGFncyA9IHBhcnNlSW50KGVsZW1zWzNdLCAxMCk7XG5cdC8vdW51c2VkIHZhciBwcm90b2NvbCA9IHBhcnNlSW50KGVsZW1zWzRdLCAxMCk7XG5cdHZhciBhbGdvcml0aG0gPSBwYXJzZUludChlbGVtc1s1XSwgMTApO1xuXHRpZiAoIXN1cHBvcnRlZEFsZ29zQnlJZFthbGdvcml0aG1dKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGFsZ29yaXRobTogJyArIGFsZ29yaXRobSkpO1xuXHR2YXIgYmFzZTY0a2V5ID0gZWxlbXMuc2xpY2UoNiwgZWxlbXMubGVuZ3RoKS5qb2luKCk7XG5cdHZhciBrZXlCdWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjRrZXksICdiYXNlNjQnKTtcblx0aWYgKHN1cHBvcnRlZEFsZ29zQnlJZFthbGdvcml0aG1dLm1hdGNoKC9eUlNBLS8pKSB7XG5cdFx0Ly8gam9pbiB0aGUgcmVzdCBvZiB0aGUgYm9keSBpbnRvIGEgc2luZ2xlIGJhc2U2NC1ibG9iXG5cdFx0dmFyIHB1YmxpY0V4cG9uZW50TGVuID0ga2V5QnVmZmVyLnJlYWRVSW50OCgwKTtcblx0XHRpZiAocHVibGljRXhwb25lbnRMZW4gIT0gMyAmJiBwdWJsaWNFeHBvbmVudExlbiAhPSAxKVxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIGRuc3NlYyBrZXk6ICcgK1xuXHRcdFx0ICAgICd1bnN1cHBvcnRlZCBleHBvbmVudCBsZW5ndGgnKSk7XG5cblx0XHR2YXIgcHVibGljRXhwb25lbnQgPSBrZXlCdWZmZXIuc2xpY2UoMSwgcHVibGljRXhwb25lbnRMZW4rMSk7XG5cdFx0cHVibGljRXhwb25lbnQgPSB1dGlscy5tcE5vcm1hbGl6ZShwdWJsaWNFeHBvbmVudCk7XG5cdFx0dmFyIG1vZHVsdXMgPSBrZXlCdWZmZXIuc2xpY2UoMStwdWJsaWNFeHBvbmVudExlbik7XG5cdFx0bW9kdWx1cyA9IHV0aWxzLm1wTm9ybWFsaXplKG1vZHVsdXMpO1xuXHRcdC8vIG5vdywgbWFrZSB0aGUga2V5XG5cdFx0dmFyIHJzYUtleSA9IHtcblx0XHRcdHR5cGU6ICdyc2EnLFxuXHRcdFx0cGFydHM6IFtdXG5cdFx0fTtcblx0XHRyc2FLZXkucGFydHMucHVzaCh7IG5hbWU6ICdlJywgZGF0YTogcHVibGljRXhwb25lbnR9KTtcblx0XHRyc2FLZXkucGFydHMucHVzaCh7IG5hbWU6ICduJywgZGF0YTogbW9kdWx1c30pO1xuXHRcdHJldHVybiAobmV3IEtleShyc2FLZXkpKTtcblx0fVxuXHRpZiAoc3VwcG9ydGVkQWxnb3NCeUlkW2FsZ29yaXRobV0gPT09ICdFQ0RTQS1QMzg0LVNIQTM4NCcgfHxcblx0ICAgIHN1cHBvcnRlZEFsZ29zQnlJZFthbGdvcml0aG1dID09PSAnRUNEU0EtUDI1Ni1TSEEyNTYnKSB7XG5cdFx0dmFyIGN1cnZlID0gJ25pc3RwMzg0Jztcblx0XHR2YXIgc2l6ZSA9IDM4NDtcblx0XHRpZiAoc3VwcG9ydGVkQWxnb3NCeUlkW2FsZ29yaXRobV0ubWF0Y2goL15FQ0RTQS1QMjU2LVNIQTI1Ni8pKSB7XG5cdFx0XHRjdXJ2ZSA9ICduaXN0cDI1Nic7XG5cdFx0XHRzaXplID0gMjU2O1xuXHRcdH1cblxuXHRcdHZhciBlY2RzYUtleSA9IHtcblx0XHRcdHR5cGU6ICdlY2RzYScsXG5cdFx0XHRjdXJ2ZTogY3VydmUsXG5cdFx0XHRzaXplOiBzaXplLFxuXHRcdFx0cGFydHM6IFtcblx0XHRcdFx0e25hbWU6ICdjdXJ2ZScsIGRhdGE6IEJ1ZmZlci5mcm9tKGN1cnZlKSB9LFxuXHRcdFx0XHR7bmFtZTogJ1EnLCBkYXRhOiB1dGlscy5lY05vcm1hbGl6ZShrZXlCdWZmZXIpIH1cblx0XHRcdF1cblx0XHR9O1xuXHRcdHJldHVybiAobmV3IEtleShlY2RzYUtleSkpO1xuXHR9XG5cdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGFsZ29yaXRobTogJyArXG5cdCAgICBzdXBwb3J0ZWRBbGdvc0J5SWRbYWxnb3JpdGhtXSkpO1xufVxuXG5mdW5jdGlvbiBlbGVtZW50VG9CdWYoZSkge1xuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKGUuc3BsaXQoJyAnKVsxXSwgJ2Jhc2U2NCcpKTtcbn1cblxuZnVuY3Rpb24gcmVhZEROU1NFQ1JTQVByaXZhdGVLZXkoZWxlbWVudHMpIHtcblx0dmFyIHJzYVBhcmFtcyA9IHt9O1xuXHRlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG5cdFx0aWYgKGVsZW1lbnQuc3BsaXQoJyAnKVswXSA9PT0gJ01vZHVsdXM6Jylcblx0XHRcdHJzYVBhcmFtc1snbiddID0gZWxlbWVudFRvQnVmKGVsZW1lbnQpO1xuXHRcdGVsc2UgaWYgKGVsZW1lbnQuc3BsaXQoJyAnKVswXSA9PT0gJ1B1YmxpY0V4cG9uZW50OicpXG5cdFx0XHRyc2FQYXJhbXNbJ2UnXSA9IGVsZW1lbnRUb0J1ZihlbGVtZW50KTtcblx0XHRlbHNlIGlmIChlbGVtZW50LnNwbGl0KCcgJylbMF0gPT09ICdQcml2YXRlRXhwb25lbnQ6Jylcblx0XHRcdHJzYVBhcmFtc1snZCddID0gZWxlbWVudFRvQnVmKGVsZW1lbnQpO1xuXHRcdGVsc2UgaWYgKGVsZW1lbnQuc3BsaXQoJyAnKVswXSA9PT0gJ1ByaW1lMTonKVxuXHRcdFx0cnNhUGFyYW1zWydwJ10gPSBlbGVtZW50VG9CdWYoZWxlbWVudCk7XG5cdFx0ZWxzZSBpZiAoZWxlbWVudC5zcGxpdCgnICcpWzBdID09PSAnUHJpbWUyOicpXG5cdFx0XHRyc2FQYXJhbXNbJ3EnXSA9IGVsZW1lbnRUb0J1ZihlbGVtZW50KTtcblx0XHRlbHNlIGlmIChlbGVtZW50LnNwbGl0KCcgJylbMF0gPT09ICdFeHBvbmVudDE6Jylcblx0XHRcdHJzYVBhcmFtc1snZG1vZHAnXSA9IGVsZW1lbnRUb0J1ZihlbGVtZW50KTtcblx0XHRlbHNlIGlmIChlbGVtZW50LnNwbGl0KCcgJylbMF0gPT09ICdFeHBvbmVudDI6Jylcblx0XHRcdHJzYVBhcmFtc1snZG1vZHEnXSA9IGVsZW1lbnRUb0J1ZihlbGVtZW50KTtcblx0XHRlbHNlIGlmIChlbGVtZW50LnNwbGl0KCcgJylbMF0gPT09ICdDb2VmZmljaWVudDonKVxuXHRcdFx0cnNhUGFyYW1zWydpcW1wJ10gPSBlbGVtZW50VG9CdWYoZWxlbWVudCk7XG5cdH0pO1xuXHQvLyBub3csIG1ha2UgdGhlIGtleVxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdyc2EnLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICdlJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocnNhUGFyYW1zWydlJ10pfSxcblx0XHRcdHsgbmFtZTogJ24nLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShyc2FQYXJhbXNbJ24nXSl9LFxuXHRcdFx0eyBuYW1lOiAnZCcsIGRhdGE6IHV0aWxzLm1wTm9ybWFsaXplKHJzYVBhcmFtc1snZCddKX0sXG5cdFx0XHR7IG5hbWU6ICdwJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocnNhUGFyYW1zWydwJ10pfSxcblx0XHRcdHsgbmFtZTogJ3EnLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShyc2FQYXJhbXNbJ3EnXSl9LFxuXHRcdFx0eyBuYW1lOiAnZG1vZHAnLFxuXHRcdFx0ICAgIGRhdGE6IHV0aWxzLm1wTm9ybWFsaXplKHJzYVBhcmFtc1snZG1vZHAnXSl9LFxuXHRcdFx0eyBuYW1lOiAnZG1vZHEnLFxuXHRcdFx0ICAgIGRhdGE6IHV0aWxzLm1wTm9ybWFsaXplKHJzYVBhcmFtc1snZG1vZHEnXSl9LFxuXHRcdFx0eyBuYW1lOiAnaXFtcCcsXG5cdFx0XHQgICAgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocnNhUGFyYW1zWydpcW1wJ10pfVxuXHRcdF1cblx0fTtcblx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZEROU1NFQ1ByaXZhdGVLZXkoYWxnLCBlbGVtZW50cykge1xuXHRpZiAoc3VwcG9ydGVkQWxnb3NCeUlkW2FsZ10ubWF0Y2goL15SU0EtLykpIHtcblx0XHRyZXR1cm4gKHJlYWRETlNTRUNSU0FQcml2YXRlS2V5KGVsZW1lbnRzKSk7XG5cdH1cblx0aWYgKHN1cHBvcnRlZEFsZ29zQnlJZFthbGddID09PSAnRUNEU0EtUDM4NC1TSEEzODQnIHx8XG5cdCAgICBzdXBwb3J0ZWRBbGdvc0J5SWRbYWxnXSA9PT0gJ0VDRFNBLVAyNTYtU0hBMjU2Jykge1xuXHRcdHZhciBkID0gQnVmZmVyLmZyb20oZWxlbWVudHNbMF0uc3BsaXQoJyAnKVsxXSwgJ2Jhc2U2NCcpO1xuXHRcdHZhciBjdXJ2ZSA9ICduaXN0cDM4NCc7XG5cdFx0dmFyIHNpemUgPSAzODQ7XG5cdFx0aWYgKHN1cHBvcnRlZEFsZ29zQnlJZFthbGddID09PSAnRUNEU0EtUDI1Ni1TSEEyNTYnKSB7XG5cdFx0XHRjdXJ2ZSA9ICduaXN0cDI1Nic7XG5cdFx0XHRzaXplID0gMjU2O1xuXHRcdH1cblx0XHQvLyBETlNTRUMgZ2VuZXJhdGVzIHRoZSBwdWJsaWMta2V5IG9uIHRoZSBmbHkgKGdvIGNhbGN1bGF0ZSBpdClcblx0XHR2YXIgcHVibGljS2V5ID0gdXRpbHMucHVibGljRnJvbVByaXZhdGVFQ0RTQShjdXJ2ZSwgZCk7XG5cdFx0dmFyIFEgPSBwdWJsaWNLZXkucGFydFsnUSddLmRhdGE7XG5cdFx0dmFyIGVjZHNhS2V5ID0ge1xuXHRcdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRcdGN1cnZlOiBjdXJ2ZSxcblx0XHRcdHNpemU6IHNpemUsXG5cdFx0XHRwYXJ0czogW1xuXHRcdFx0XHR7bmFtZTogJ2N1cnZlJywgZGF0YTogQnVmZmVyLmZyb20oY3VydmUpIH0sXG5cdFx0XHRcdHtuYW1lOiAnZCcsIGRhdGE6IGQgfSxcblx0XHRcdFx0e25hbWU6ICdRJywgZGF0YTogUSB9XG5cdFx0XHRdXG5cdFx0fTtcblx0XHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KGVjZHNhS2V5KSk7XG5cdH1cblx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiAnICsgc3VwcG9ydGVkQWxnb3NCeUlkW2FsZ10pKTtcbn1cblxuZnVuY3Rpb24gZG5zc2VjVGltZXN0YW1wKGRhdGUpIHtcblx0dmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyAnJzsgLy9zdHJpbmdpZnlcblx0dmFyIG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuXHR2YXIgdGltZXN0YW1wU3RyID0geWVhciArIG1vbnRoICsgZGF0ZS5nZXRVVENEYXRlKCk7XG5cdHRpbWVzdGFtcFN0ciArPSAnJyArIGRhdGUuZ2V0VVRDSG91cnMoKSArIGRhdGUuZ2V0VVRDTWludXRlcygpO1xuXHR0aW1lc3RhbXBTdHIgKz0gZGF0ZS5nZXRVVENTZWNvbmRzKCk7XG5cdHJldHVybiAodGltZXN0YW1wU3RyKTtcbn1cblxuZnVuY3Rpb24gcnNhQWxnRnJvbU9wdGlvbnMob3B0cykge1xuXHRpZiAoIW9wdHMgfHwgIW9wdHMuaGFzaEFsZ28gfHwgb3B0cy5oYXNoQWxnbyA9PT0gJ3NoYTEnKVxuXHRcdHJldHVybiAoJzUgKFJTQVNIQTEpJyk7XG5cdGVsc2UgaWYgKG9wdHMuaGFzaEFsZ28gPT09ICdzaGEyNTYnKVxuXHRcdHJldHVybiAoJzggKFJTQVNIQTI1NiknKTtcblx0ZWxzZSBpZiAob3B0cy5oYXNoQWxnbyA9PT0gJ3NoYTUxMicpXG5cdFx0cmV0dXJuICgnMTAgKFJTQVNIQTUxMiknKTtcblx0ZWxzZVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ1Vua25vd24gb3IgdW5zdXBwb3J0ZWQgaGFzaDogJyArXG5cdFx0ICAgIG9wdHMuaGFzaEFsZ28pKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVSU0Eoa2V5LCBvcHRpb25zKSB7XG5cdC8vIGlmIHdlJ3JlIG1pc3NpbmcgcGFydHMsIGFkZCB0aGVtLlxuXHRpZiAoIWtleS5wYXJ0LmRtb2RwIHx8ICFrZXkucGFydC5kbW9kcSkge1xuXHRcdHV0aWxzLmFkZFJTQU1pc3Npbmcoa2V5KTtcblx0fVxuXG5cdHZhciBvdXQgPSAnJztcblx0b3V0ICs9ICdQcml2YXRlLWtleS1mb3JtYXQ6IHYxLjNcXG4nO1xuXHRvdXQgKz0gJ0FsZ29yaXRobTogJyArIHJzYUFsZ0Zyb21PcHRpb25zKG9wdGlvbnMpICsgJ1xcbic7XG5cdHZhciBuID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsnbiddLmRhdGEpO1xuXHRvdXQgKz0gJ01vZHVsdXM6ICcgKyBuLnRvU3RyaW5nKCdiYXNlNjQnKSArICdcXG4nO1xuXHR2YXIgZSA9IHV0aWxzLm1wRGVub3JtYWxpemUoa2V5LnBhcnRbJ2UnXS5kYXRhKTtcblx0b3V0ICs9ICdQdWJsaWNFeHBvbmVudDogJyArIGUudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBkID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsnZCddLmRhdGEpO1xuXHRvdXQgKz0gJ1ByaXZhdGVFeHBvbmVudDogJyArIGQudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBwID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsncCddLmRhdGEpO1xuXHRvdXQgKz0gJ1ByaW1lMTogJyArIHAudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBxID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsncSddLmRhdGEpO1xuXHRvdXQgKz0gJ1ByaW1lMjogJyArIHEudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBkbW9kcCA9IHV0aWxzLm1wRGVub3JtYWxpemUoa2V5LnBhcnRbJ2Rtb2RwJ10uZGF0YSk7XG5cdG91dCArPSAnRXhwb25lbnQxOiAnICsgZG1vZHAudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBkbW9kcSA9IHV0aWxzLm1wRGVub3JtYWxpemUoa2V5LnBhcnRbJ2Rtb2RxJ10uZGF0YSk7XG5cdG91dCArPSAnRXhwb25lbnQyOiAnICsgZG1vZHEudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBpcW1wID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsnaXFtcCddLmRhdGEpO1xuXHRvdXQgKz0gJ0NvZWZmaWNpZW50OiAnICsgaXFtcC50b1N0cmluZygnYmFzZTY0JykgKyAnXFxuJztcblx0Ly8gQXNzdW1lIHRoYXQgd2UncmUgdmFsaWQgYXMtb2Ygbm93XG5cdHZhciB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuXHRvdXQgKz0gJ0NyZWF0ZWQ6ICcgKyBkbnNzZWNUaW1lc3RhbXAodGltZXN0YW1wKSArICdcXG4nO1xuXHRvdXQgKz0gJ1B1Ymxpc2g6ICcgKyBkbnNzZWNUaW1lc3RhbXAodGltZXN0YW1wKSArICdcXG4nO1xuXHRvdXQgKz0gJ0FjdGl2YXRlOiAnICsgZG5zc2VjVGltZXN0YW1wKHRpbWVzdGFtcCkgKyAnXFxuJztcblx0cmV0dXJuIChCdWZmZXIuZnJvbShvdXQsICdhc2NpaScpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVFQ0RTQShrZXksIG9wdGlvbnMpIHtcblx0dmFyIG91dCA9ICcnO1xuXHRvdXQgKz0gJ1ByaXZhdGUta2V5LWZvcm1hdDogdjEuM1xcbic7XG5cblx0aWYgKGtleS5jdXJ2ZSA9PT0gJ25pc3RwMjU2Jykge1xuXHRcdG91dCArPSAnQWxnb3JpdGhtOiAxMyAoRUNEU0FQMjU2U0hBMjU2KVxcbic7XG5cdH0gZWxzZSBpZiAoa2V5LmN1cnZlID09PSAnbmlzdHAzODQnKSB7XG5cdFx0b3V0ICs9ICdBbGdvcml0aG06IDE0IChFQ0RTQVAzODRTSEEzODQpXFxuJztcblx0fSBlbHNlIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjdXJ2ZScpKTtcblx0fVxuXHR2YXIgYmFzZTY0S2V5ID0ga2V5LnBhcnRbJ2QnXS5kYXRhLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0b3V0ICs9ICdQcml2YXRlS2V5OiAnICsgYmFzZTY0S2V5ICsgJ1xcbic7XG5cblx0Ly8gQXNzdW1lIHRoYXQgd2UncmUgdmFsaWQgYXMtb2Ygbm93XG5cdHZhciB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuXHRvdXQgKz0gJ0NyZWF0ZWQ6ICcgKyBkbnNzZWNUaW1lc3RhbXAodGltZXN0YW1wKSArICdcXG4nO1xuXHRvdXQgKz0gJ1B1Ymxpc2g6ICcgKyBkbnNzZWNUaW1lc3RhbXAodGltZXN0YW1wKSArICdcXG4nO1xuXHRvdXQgKz0gJ0FjdGl2YXRlOiAnICsgZG5zc2VjVGltZXN0YW1wKHRpbWVzdGFtcCkgKyAnXFxuJztcblxuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKG91dCwgJ2FzY2lpJykpO1xufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMpIHtcblx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpIHtcblx0XHRpZiAoa2V5LnR5cGUgPT09ICdyc2EnKSB7XG5cdFx0XHRyZXR1cm4gKHdyaXRlUlNBKGtleSwgb3B0aW9ucykpO1xuXHRcdH0gZWxzZSBpZiAoa2V5LnR5cGUgPT09ICdlY2RzYScpIHtcblx0XHRcdHJldHVybiAod3JpdGVFQ0RTQShrZXksIG9wdGlvbnMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiAnICsga2V5LnR5cGUpKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoS2V5LmlzS2V5KGtleSkpIHtcblx0XHQvKlxuXHRcdCAqIFJGQzMxMTAgcmVxdWlyZXMgYSBrZXluYW1lLCBhbmQgYSBrZXl0eXBlLCB3aGljaCB3ZVxuXHRcdCAqIGRvbid0IHJlYWxseSBoYXZlIGEgbWVjaGFuaXNtIGZvciBzcGVjaWZ5aW5nIHN1Y2hcblx0XHQgKiBhZGRpdGlvbmFsIG1ldGFkYXRhLlxuXHRcdCAqL1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0Zvcm1hdCBcImRuc3NlY1wiIG9ubHkgc3VwcG9ydHMgJyArXG5cdFx0ICAgICd3cml0aW5nIHByaXZhdGUga2V5cycpKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdrZXkgaXMgbm90IGEgS2V5IG9yIFByaXZhdGVLZXknKSk7XG5cdH1cbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxOCBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHdyaXRlOiB3cml0ZVxufTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIHJmYzQyNTMgPSByZXF1aXJlKCcuL3JmYzQyNTMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBTU0hCdWZmZXIgPSByZXF1aXJlKCcuLi9zc2gtYnVmZmVyJyk7XG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG5cbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKTtcblxuLy8gaHR0cHM6Ly90YXJ0YXJ1cy5vcmcvfnNpbW9uL3B1dHR5LXByZXJlbC1zbmFwc2hvdHMvaHRtbGRvYy9BcHBlbmRpeEMuaHRtbFxuZnVuY3Rpb24gcmVhZChidWYsIG9wdGlvbnMpIHtcblx0dmFyIGxpbmVzID0gYnVmLnRvU3RyaW5nKCdhc2NpaScpLnNwbGl0KC9bXFxyXFxuXSsvKTtcblx0dmFyIGZvdW5kID0gZmFsc2U7XG5cdHZhciBwYXJ0cztcblx0dmFyIHNpID0gMDtcblx0dmFyIGZvcm1hdFZlcnNpb247XG5cdHdoaWxlIChzaSA8IGxpbmVzLmxlbmd0aCkge1xuXHRcdHBhcnRzID0gc3BsaXRIZWFkZXIobGluZXNbc2krK10pO1xuXHRcdGlmIChwYXJ0cykge1xuXHRcdFx0Zm9ybWF0VmVyc2lvbiA9IHtcblx0XHRcdFx0J3B1dHR5LXVzZXIta2V5LWZpbGUtMic6IDIsXG5cdFx0XHRcdCdwdXR0eS11c2VyLWtleS1maWxlLTMnOiAzXG5cdFx0XHR9W3BhcnRzWzBdLnRvTG93ZXJDYXNlKCldO1xuXHRcdFx0aWYgKGZvcm1hdFZlcnNpb24pIHtcblx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKCFmb3VuZCkge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ05vIFB1VFRZIGZvcm1hdCBmaXJzdCBsaW5lIGZvdW5kJykpO1xuXHR9XG5cdHZhciBhbGcgPSBwYXJ0c1sxXTtcblxuXHRwYXJ0cyA9IHNwbGl0SGVhZGVyKGxpbmVzW3NpKytdKTtcblx0YXNzZXJ0LmVxdWFsKHBhcnRzWzBdLnRvTG93ZXJDYXNlKCksICdlbmNyeXB0aW9uJyk7XG5cdHZhciBlbmNyeXB0aW9uID0gcGFydHNbMV07XG5cblx0cGFydHMgPSBzcGxpdEhlYWRlcihsaW5lc1tzaSsrXSk7XG5cdGFzc2VydC5lcXVhbChwYXJ0c1swXS50b0xvd2VyQ2FzZSgpLCAnY29tbWVudCcpO1xuXHR2YXIgY29tbWVudCA9IHBhcnRzWzFdO1xuXG5cdHBhcnRzID0gc3BsaXRIZWFkZXIobGluZXNbc2krK10pO1xuXHRhc3NlcnQuZXF1YWwocGFydHNbMF0udG9Mb3dlckNhc2UoKSwgJ3B1YmxpYy1saW5lcycpO1xuXHR2YXIgcHVibGljTGluZXMgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuXHRpZiAoIWlzRmluaXRlKHB1YmxpY0xpbmVzKSB8fCBwdWJsaWNMaW5lcyA8IDAgfHxcblx0ICAgIHB1YmxpY0xpbmVzID4gbGluZXMubGVuZ3RoKSB7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignSW52YWxpZCBwdWJsaWMtbGluZXMgY291bnQnKSk7XG5cdH1cblxuXHR2YXIgcHVibGljQnVmID0gQnVmZmVyLmZyb20oXG5cdCAgICBsaW5lcy5zbGljZShzaSwgc2kgKyBwdWJsaWNMaW5lcykuam9pbignJyksICdiYXNlNjQnKTtcblx0dmFyIGtleVR5cGUgPSByZmM0MjUzLmFsZ1RvS2V5VHlwZShhbGcpO1xuXHR2YXIga2V5ID0gcmZjNDI1My5yZWFkKHB1YmxpY0J1Zik7XG5cdGlmIChrZXkudHlwZSAhPT0ga2V5VHlwZSkge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ091dGVyIGtleSBhbGdvcml0aG0gbWlzbWF0Y2gnKSk7XG5cdH1cblxuXHRzaSArPSBwdWJsaWNMaW5lcztcblx0aWYgKGxpbmVzW3NpXSkge1xuXHRcdHBhcnRzID0gc3BsaXRIZWFkZXIobGluZXNbc2krK10pO1xuXHRcdGFzc2VydC5lcXVhbChwYXJ0c1swXS50b0xvd2VyQ2FzZSgpLCAncHJpdmF0ZS1saW5lcycpO1xuXHRcdHZhciBwcml2YXRlTGluZXMgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuXHRcdGlmICghaXNGaW5pdGUocHJpdmF0ZUxpbmVzKSB8fCBwcml2YXRlTGluZXMgPCAwIHx8XG5cdFx0ICAgIHByaXZhdGVMaW5lcyA+IGxpbmVzLmxlbmd0aCkge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignSW52YWxpZCBwcml2YXRlLWxpbmVzIGNvdW50JykpO1xuXHRcdH1cblxuXHRcdHZhciBwcml2YXRlQnVmID0gQnVmZmVyLmZyb20oXG5cdFx0XHRsaW5lcy5zbGljZShzaSwgc2kgKyBwcml2YXRlTGluZXMpLmpvaW4oJycpLCAnYmFzZTY0Jyk7XG5cblx0XHRpZiAoZW5jcnlwdGlvbiAhPT0gJ25vbmUnICYmIGZvcm1hdFZlcnNpb24gPT09IDMpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignRW5jcnlwdGVkIGtleXMgYXJlbm90IHN1cHBvcnRlZCBmb3InICtcblx0XHRcdCcgUHVUVFkgZm9ybWF0IHZlcnNpb24gMycpO1xuXHRcdH1cblxuXHRcdGlmIChlbmNyeXB0aW9uID09PSAnYWVzMjU2LWNiYycpIHtcblx0XHRcdGlmICghb3B0aW9ucy5wYXNzcGhyYXNlKSB7XG5cdFx0XHRcdHRocm93IChuZXcgZXJyb3JzLktleUVuY3J5cHRlZEVycm9yKFxuXHRcdFx0XHRcdG9wdGlvbnMuZmlsZW5hbWUsICdQRU0nKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpdiA9IEJ1ZmZlci5hbGxvYygxNiwgMCk7XG5cdFx0XHR2YXIgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihcblx0XHRcdFx0J2Flcy0yNTYtY2JjJyxcblx0XHRcdFx0ZGVyaXZlUFBLMkVuY3J5cHRpb25LZXkob3B0aW9ucy5wYXNzcGhyYXNlKSxcblx0XHRcdFx0aXYpO1xuXHRcdFx0ZGVjaXBoZXIuc2V0QXV0b1BhZGRpbmcoZmFsc2UpO1xuXHRcdFx0cHJpdmF0ZUJ1ZiA9IEJ1ZmZlci5jb25jYXQoW1xuXHRcdFx0XHRkZWNpcGhlci51cGRhdGUocHJpdmF0ZUJ1ZiksIGRlY2lwaGVyLmZpbmFsKCldKTtcblx0XHR9XG5cblx0XHRrZXkgPSBuZXcgUHJpdmF0ZUtleShrZXkpO1xuXHRcdGlmIChrZXkudHlwZSAhPT0ga2V5VHlwZSkge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignT3V0ZXIga2V5IGFsZ29yaXRobSBtaXNtYXRjaCcpKTtcblx0XHR9XG5cblx0XHR2YXIgc3NoYnVmID0gbmV3IFNTSEJ1ZmZlcih7YnVmZmVyOiBwcml2YXRlQnVmfSk7XG5cdFx0dmFyIHByaXZhdGVLZXlQYXJ0cztcblx0XHRpZiAoYWxnID09PSAnc3NoLWRzcycpIHtcblx0XHRcdHByaXZhdGVLZXlQYXJ0cyA9IFsge1xuXHRcdFx0XHRuYW1lOiAneCcsXG5cdFx0XHRcdGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKClcblx0XHRcdH1dO1xuXHRcdH0gZWxzZSBpZiAoYWxnID09PSAnc3NoLXJzYScpIHtcblx0XHRcdHByaXZhdGVLZXlQYXJ0cyA9IFtcblx0XHRcdFx0eyBuYW1lOiAnZCcsIGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfSxcblx0XHRcdFx0eyBuYW1lOiAncCcsIGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfSxcblx0XHRcdFx0eyBuYW1lOiAncScsIGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfSxcblx0XHRcdFx0eyBuYW1lOiAnaXFtcCcsIGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfVxuXHRcdFx0XTtcblx0XHR9IGVsc2UgaWYgKGFsZy5tYXRjaCgvXmVjZHNhLXNoYTItbmlzdHAvKSkge1xuXHRcdFx0cHJpdmF0ZUtleVBhcnRzID0gWyB7XG5cdFx0XHRcdG5hbWU6ICdkJywgZGF0YTogc3NoYnVmLnJlYWRCdWZmZXIoKVxuXHRcdFx0fSBdO1xuXHRcdH0gZWxzZSBpZiAoYWxnID09PSAnc3NoLWVkMjU1MTknKSB7XG5cdFx0XHRwcml2YXRlS2V5UGFydHMgPSBbIHtcblx0XHRcdFx0bmFtZTogJ2snLCBkYXRhOiBzc2hidWYucmVhZEJ1ZmZlcigpXG5cdFx0XHR9IF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgUFBLIGtleSB0eXBlOiAnICsgYWxnKTtcblx0XHR9XG5cblx0XHRrZXkgPSBuZXcgUHJpdmF0ZUtleSh7XG5cdFx0XHR0eXBlOiBrZXkudHlwZSxcblx0XHRcdHBhcnRzOiBrZXkucGFydHMuY29uY2F0KHByaXZhdGVLZXlQYXJ0cylcblx0XHR9KTtcblx0fVxuXG5cdGtleS5jb21tZW50ID0gY29tbWVudDtcblx0cmV0dXJuIChrZXkpO1xufVxuXG5mdW5jdGlvbiBkZXJpdmVQUEsyRW5jcnlwdGlvbktleShwYXNzcGhyYXNlKSB7XG5cdHZhciBoYXNoMSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKEJ1ZmZlci5jb25jYXQoW1xuXHRcdEJ1ZmZlci5mcm9tKFswLCAwLCAwLCAwXSksXG5cdFx0QnVmZmVyLmZyb20ocGFzc3BocmFzZSlcblx0XSkpLmRpZ2VzdCgpO1xuXHR2YXIgaGFzaDIgPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtcblx0XHRCdWZmZXIuZnJvbShbMCwgMCwgMCwgMV0pLFxuXHRcdEJ1ZmZlci5mcm9tKHBhc3NwaHJhc2UpXG5cdF0pKS5kaWdlc3QoKTtcblx0cmV0dXJuIChCdWZmZXIuY29uY2F0KFtoYXNoMSwgaGFzaDJdKS5zbGljZSgwLCAzMikpO1xufVxuXG5mdW5jdGlvbiBzcGxpdEhlYWRlcihsaW5lKSB7XG5cdHZhciBpZHggPSBsaW5lLmluZGV4T2YoJzonKTtcblx0aWYgKGlkeCA9PT0gLTEpXG5cdFx0cmV0dXJuIChudWxsKTtcblx0dmFyIGhlYWRlciA9IGxpbmUuc2xpY2UoMCwgaWR4KTtcblx0KytpZHg7XG5cdHdoaWxlIChsaW5lW2lkeF0gPT09ICcgJylcblx0XHQrK2lkeDtcblx0dmFyIHJlc3QgPSBsaW5lLnNsaWNlKGlkeCk7XG5cdHJldHVybiAoW2hlYWRlciwgcmVzdF0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMpIHtcblx0YXNzZXJ0Lm9iamVjdChrZXkpO1xuXHRpZiAoIUtleS5pc0tleShrZXkpKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ011c3QgYmUgYSBwdWJsaWMga2V5JykpO1xuXG5cdHZhciBhbGcgPSByZmM0MjUzLmtleVR5cGVUb0FsZyhrZXkpO1xuXHR2YXIgYnVmID0gcmZjNDI1My53cml0ZShrZXkpO1xuXHR2YXIgY29tbWVudCA9IGtleS5jb21tZW50IHx8ICcnO1xuXG5cdHZhciBiNjQgPSBidWYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHR2YXIgbGluZXMgPSB3cmFwKGI2NCwgNjQpO1xuXG5cdGxpbmVzLnVuc2hpZnQoJ1B1YmxpYy1MaW5lczogJyArIGxpbmVzLmxlbmd0aCk7XG5cdGxpbmVzLnVuc2hpZnQoJ0NvbW1lbnQ6ICcgKyBjb21tZW50KTtcblx0bGluZXMudW5zaGlmdCgnRW5jcnlwdGlvbjogbm9uZScpO1xuXHRsaW5lcy51bnNoaWZ0KCdQdVRUWS1Vc2VyLUtleS1GaWxlLTI6ICcgKyBhbGcpO1xuXG5cdHJldHVybiAoQnVmZmVyLmZyb20obGluZXMuam9pbignXFxuJykgKyAnXFxuJykpO1xufVxuXG5mdW5jdGlvbiB3cmFwKHR4dCwgbGVuKSB7XG5cdHZhciBsaW5lcyA9IFtdO1xuXHR2YXIgcG9zID0gMDtcblx0d2hpbGUgKHBvcyA8IHR4dC5sZW5ndGgpIHtcblx0XHRsaW5lcy5wdXNoKHR4dC5zbGljZShwb3MsIHBvcyArIDY0KSk7XG5cdFx0cG9zICs9IDY0O1xuXHR9XG5cdHJldHVybiAobGluZXMpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE4IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0d3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEtleSA9IHJlcXVpcmUoJy4uL2tleScpO1xudmFyIFByaXZhdGVLZXkgPSByZXF1aXJlKCcuLi9wcml2YXRlLWtleScpO1xuXG52YXIgcGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbnZhciBzc2ggPSByZXF1aXJlKCcuL3NzaCcpO1xudmFyIHJmYzQyNTMgPSByZXF1aXJlKCcuL3JmYzQyNTMnKTtcbnZhciBkbnNzZWMgPSByZXF1aXJlKCcuL2Ruc3NlYycpO1xudmFyIHB1dHR5ID0gcmVxdWlyZSgnLi9wdXR0eScpO1xuXG52YXIgRE5TU0VDX1BSSVZLRVlfSEVBREVSX1BSRUZJWCA9ICdQcml2YXRlLWtleS1mb3JtYXQ6IHYxJztcblxuZnVuY3Rpb24gcmVhZChidWYsIG9wdGlvbnMpIHtcblx0aWYgKHR5cGVvZiAoYnVmKSA9PT0gJ3N0cmluZycpIHtcblx0XHRpZiAoYnVmLnRyaW0oKS5tYXRjaCgvXlstXStbIF0qQkVHSU4vKSlcblx0XHRcdHJldHVybiAocGVtLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0aWYgKGJ1Zi5tYXRjaCgvXlxccypzc2gtW2Etel0vKSlcblx0XHRcdHJldHVybiAoc3NoLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0aWYgKGJ1Zi5tYXRjaCgvXlxccyplY2RzYS0vKSlcblx0XHRcdHJldHVybiAoc3NoLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0aWYgKGJ1Zi5tYXRjaCgvXnB1dHR5LXVzZXIta2V5LWZpbGUtMjovaSkpXG5cdFx0XHRyZXR1cm4gKHB1dHR5LnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0aWYgKGZpbmRETlNTRUNIZWFkZXIoYnVmKSlcblx0XHRcdHJldHVybiAoZG5zc2VjLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0YnVmID0gQnVmZmVyLmZyb20oYnVmLCAnYmluYXJ5Jyk7XG5cdH0gZWxzZSB7XG5cdFx0YXNzZXJ0LmJ1ZmZlcihidWYpO1xuXHRcdGlmIChmaW5kUEVNSGVhZGVyKGJ1ZikpXG5cdFx0XHRyZXR1cm4gKHBlbS5yZWFkKGJ1Ziwgb3B0aW9ucykpO1xuXHRcdGlmIChmaW5kU1NISGVhZGVyKGJ1ZikpXG5cdFx0XHRyZXR1cm4gKHNzaC5yZWFkKGJ1Ziwgb3B0aW9ucykpO1xuXHRcdGlmIChmaW5kUHVUVFlIZWFkZXIoYnVmKSlcblx0XHRcdHJldHVybiAocHV0dHkucmVhZChidWYsIG9wdGlvbnMpKTtcblx0XHRpZiAoZmluZEROU1NFQ0hlYWRlcihidWYpKVxuXHRcdFx0cmV0dXJuIChkbnNzZWMucmVhZChidWYsIG9wdGlvbnMpKTtcblx0fVxuXHRpZiAoYnVmLnJlYWRVSW50MzJCRSgwKSA8IGJ1Zi5sZW5ndGgpXG5cdFx0cmV0dXJuIChyZmM0MjUzLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdHRocm93IChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBhdXRvLWRldGVjdCBmb3JtYXQgb2Yga2V5JykpO1xufVxuXG5mdW5jdGlvbiBmaW5kUHVUVFlIZWFkZXIoYnVmKSB7XG5cdHZhciBvZmZzZXQgPSAwO1xuXHR3aGlsZSAob2Zmc2V0IDwgYnVmLmxlbmd0aCAmJlxuXHQgICAgKGJ1ZltvZmZzZXRdID09PSAzMiB8fCBidWZbb2Zmc2V0XSA9PT0gMTAgfHwgYnVmW29mZnNldF0gPT09IDkpKVxuXHRcdCsrb2Zmc2V0O1xuXHRpZiAob2Zmc2V0ICsgMjIgPD0gYnVmLmxlbmd0aCAmJlxuXHQgICAgYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMjIpLnRvU3RyaW5nKCdhc2NpaScpLnRvTG93ZXJDYXNlKCkgPT09XG5cdCAgICAncHV0dHktdXNlci1rZXktZmlsZS0yOicpXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0cmV0dXJuIChmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRTU0hIZWFkZXIoYnVmKSB7XG5cdHZhciBvZmZzZXQgPSAwO1xuXHR3aGlsZSAob2Zmc2V0IDwgYnVmLmxlbmd0aCAmJlxuXHQgICAgKGJ1ZltvZmZzZXRdID09PSAzMiB8fCBidWZbb2Zmc2V0XSA9PT0gMTAgfHwgYnVmW29mZnNldF0gPT09IDkpKVxuXHRcdCsrb2Zmc2V0O1xuXHRpZiAob2Zmc2V0ICsgNCA8PSBidWYubGVuZ3RoICYmXG5cdCAgICBidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyA0KS50b1N0cmluZygnYXNjaWknKSA9PT0gJ3NzaC0nKVxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdGlmIChvZmZzZXQgKyA2IDw9IGJ1Zi5sZW5ndGggJiZcblx0ICAgIGJ1Zi5zbGljZShvZmZzZXQsIG9mZnNldCArIDYpLnRvU3RyaW5nKCdhc2NpaScpID09PSAnZWNkc2EtJylcblx0XHRyZXR1cm4gKHRydWUpO1xuXHRyZXR1cm4gKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gZmluZFBFTUhlYWRlcihidWYpIHtcblx0dmFyIG9mZnNldCA9IDA7XG5cdHdoaWxlIChvZmZzZXQgPCBidWYubGVuZ3RoICYmXG5cdCAgICAoYnVmW29mZnNldF0gPT09IDMyIHx8IGJ1ZltvZmZzZXRdID09PSAxMCkpXG5cdFx0KytvZmZzZXQ7XG5cdGlmIChidWZbb2Zmc2V0XSAhPT0gNDUpXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cdHdoaWxlIChvZmZzZXQgPCBidWYubGVuZ3RoICYmXG5cdCAgICAoYnVmW29mZnNldF0gPT09IDQ1KSlcblx0XHQrK29mZnNldDtcblx0d2hpbGUgKG9mZnNldCA8IGJ1Zi5sZW5ndGggJiZcblx0ICAgIChidWZbb2Zmc2V0XSA9PT0gMzIpKVxuXHRcdCsrb2Zmc2V0O1xuXHRpZiAob2Zmc2V0ICsgNSA+IGJ1Zi5sZW5ndGggfHxcblx0ICAgIGJ1Zi5zbGljZShvZmZzZXQsIG9mZnNldCArIDUpLnRvU3RyaW5nKCdhc2NpaScpICE9PSAnQkVHSU4nKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHRyZXR1cm4gKHRydWUpO1xufVxuXG5mdW5jdGlvbiBmaW5kRE5TU0VDSGVhZGVyKGJ1Zikge1xuXHQvLyBwcml2YXRlIGNhc2UgZmlyc3Rcblx0aWYgKGJ1Zi5sZW5ndGggPD0gRE5TU0VDX1BSSVZLRVlfSEVBREVSX1BSRUZJWC5sZW5ndGgpXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cdHZhciBoZWFkZXJDaGVjayA9IGJ1Zi5zbGljZSgwLCBETlNTRUNfUFJJVktFWV9IRUFERVJfUFJFRklYLmxlbmd0aCk7XG5cdGlmIChoZWFkZXJDaGVjay50b1N0cmluZygnYXNjaWknKSA9PT0gRE5TU0VDX1BSSVZLRVlfSEVBREVSX1BSRUZJWClcblx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdC8vIHB1YmxpYy1rZXkgUkZDMzExMCA/XG5cdC8vICdkb21haW4uY29tLiBJTiBLRVkgLi4uJyBvciAnZG9tYWluLmNvbS4gSU4gRE5TS0VZIC4uLidcblx0Ly8gc2tpcCBhbnkgY29tbWVudC1saW5lc1xuXHRpZiAodHlwZW9mIChidWYpICE9PSAnc3RyaW5nJykge1xuXHRcdGJ1ZiA9IGJ1Zi50b1N0cmluZygnYXNjaWknKTtcblx0fVxuXHR2YXIgbGluZXMgPSBidWYuc3BsaXQoJ1xcbicpO1xuXHR2YXIgbGluZSA9IDA7XG5cdC8qIEpTU1RZTEVEICovXG5cdHdoaWxlIChsaW5lc1tsaW5lXS5tYXRjaCgvXlxcOy8pKVxuXHRcdGxpbmUrKztcblx0aWYgKGxpbmVzW2xpbmVdLnRvU3RyaW5nKCdhc2NpaScpLm1hdGNoKC9cXC4gSU4gS0VZIC8pKVxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdGlmIChsaW5lc1tsaW5lXS50b1N0cmluZygnYXNjaWknKS5tYXRjaCgvXFwuIElOIEROU0tFWSAvKSlcblx0XHRyZXR1cm4gKHRydWUpO1xuXHRyZXR1cm4gKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gd3JpdGUoa2V5LCBvcHRpb25zKSB7XG5cdHRocm93IChuZXcgRXJyb3IoJ1wiYXV0b1wiIGZvcm1hdCBjYW5ub3QgYmUgdXNlZCBmb3Igd3JpdGluZycpKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNyBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSBQcml2YXRlS2V5O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgYWxncyA9IHJlcXVpcmUoJy4vYWxncycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIEZpbmdlcnByaW50ID0gcmVxdWlyZSgnLi9maW5nZXJwcmludCcpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgZXJycyA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBkaGUgPSByZXF1aXJlKCcuL2RoZScpO1xudmFyIGdlbmVyYXRlRUNEU0EgPSBkaGUuZ2VuZXJhdGVFQ0RTQTtcbnZhciBnZW5lcmF0ZUVEMjU1MTkgPSBkaGUuZ2VuZXJhdGVFRDI1NTE5O1xudmFyIGVkQ29tcGF0ID0gcmVxdWlyZSgnLi9lZC1jb21wYXQnKTtcbnZhciBuYWNsID0gcmVxdWlyZSgndHdlZXRuYWNsJyk7XG5cbnZhciBLZXkgPSByZXF1aXJlKCcuL2tleScpO1xuXG52YXIgSW52YWxpZEFsZ29yaXRobUVycm9yID0gZXJycy5JbnZhbGlkQWxnb3JpdGhtRXJyb3I7XG52YXIgS2V5UGFyc2VFcnJvciA9IGVycnMuS2V5UGFyc2VFcnJvcjtcbnZhciBLZXlFbmNyeXB0ZWRFcnJvciA9IGVycnMuS2V5RW5jcnlwdGVkRXJyb3I7XG5cbnZhciBmb3JtYXRzID0ge307XG5mb3JtYXRzWydhdXRvJ10gPSByZXF1aXJlKCcuL2Zvcm1hdHMvYXV0bycpO1xuZm9ybWF0c1sncGVtJ10gPSByZXF1aXJlKCcuL2Zvcm1hdHMvcGVtJyk7XG5mb3JtYXRzWydwa2NzMSddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3BrY3MxJyk7XG5mb3JtYXRzWydwa2NzOCddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3BrY3M4Jyk7XG5mb3JtYXRzWydyZmM0MjUzJ10gPSByZXF1aXJlKCcuL2Zvcm1hdHMvcmZjNDI1MycpO1xuZm9ybWF0c1snc3NoLXByaXZhdGUnXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9zc2gtcHJpdmF0ZScpO1xuZm9ybWF0c1snb3BlbnNzaCddID0gZm9ybWF0c1snc3NoLXByaXZhdGUnXTtcbmZvcm1hdHNbJ3NzaCddID0gZm9ybWF0c1snc3NoLXByaXZhdGUnXTtcbmZvcm1hdHNbJ2Ruc3NlYyddID0gcmVxdWlyZSgnLi9mb3JtYXRzL2Ruc3NlYycpO1xuZm9ybWF0c1sncHV0dHknXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9wdXR0eScpO1xuXG5mdW5jdGlvbiBQcml2YXRlS2V5KG9wdHMpIHtcblx0YXNzZXJ0Lm9iamVjdChvcHRzLCAnb3B0aW9ucycpO1xuXHRLZXkuY2FsbCh0aGlzLCBvcHRzKTtcblxuXHR0aGlzLl9wdWJDYWNoZSA9IHVuZGVmaW5lZDtcbn1cbnV0aWwuaW5oZXJpdHMoUHJpdmF0ZUtleSwgS2V5KTtcblxuUHJpdmF0ZUtleS5mb3JtYXRzID0gZm9ybWF0cztcblxuUHJpdmF0ZUtleS5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiAoZm9ybWF0LCBvcHRpb25zKSB7XG5cdGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZClcblx0XHRmb3JtYXQgPSAncGtjczEnO1xuXHRhc3NlcnQuc3RyaW5nKGZvcm1hdCwgJ2Zvcm1hdCcpO1xuXHRhc3NlcnQub2JqZWN0KGZvcm1hdHNbZm9ybWF0XSwgJ2Zvcm1hdHNbZm9ybWF0XScpO1xuXHRhc3NlcnQub3B0aW9uYWxPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKTtcblxuXHRyZXR1cm4gKGZvcm1hdHNbZm9ybWF0XS53cml0ZSh0aGlzLCBvcHRpb25zKSk7XG59O1xuXG5Qcml2YXRlS2V5LnByb3RvdHlwZS5oYXNoID0gZnVuY3Rpb24gKGFsZ28sIHR5cGUpIHtcblx0cmV0dXJuICh0aGlzLnRvUHVibGljKCkuaGFzaChhbGdvLCB0eXBlKSk7XG59O1xuXG5Qcml2YXRlS2V5LnByb3RvdHlwZS5maW5nZXJwcmludCA9IGZ1bmN0aW9uIChhbGdvLCB0eXBlKSB7XG5cdHJldHVybiAodGhpcy50b1B1YmxpYygpLmZpbmdlcnByaW50KGFsZ28sIHR5cGUpKTtcbn07XG5cblByaXZhdGVLZXkucHJvdG90eXBlLnRvUHVibGljID0gZnVuY3Rpb24gKCkge1xuXHRpZiAodGhpcy5fcHViQ2FjaGUpXG5cdFx0cmV0dXJuICh0aGlzLl9wdWJDYWNoZSk7XG5cblx0dmFyIGFsZ0luZm8gPSBhbGdzLmluZm9bdGhpcy50eXBlXTtcblx0dmFyIHB1YlBhcnRzID0gW107XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYWxnSW5mby5wYXJ0cy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBwID0gYWxnSW5mby5wYXJ0c1tpXTtcblx0XHRwdWJQYXJ0cy5wdXNoKHRoaXMucGFydFtwXSk7XG5cdH1cblxuXHR0aGlzLl9wdWJDYWNoZSA9IG5ldyBLZXkoe1xuXHRcdHR5cGU6IHRoaXMudHlwZSxcblx0XHRzb3VyY2U6IHRoaXMsXG5cdFx0cGFydHM6IHB1YlBhcnRzXG5cdH0pO1xuXHRpZiAodGhpcy5jb21tZW50KVxuXHRcdHRoaXMuX3B1YkNhY2hlLmNvbW1lbnQgPSB0aGlzLmNvbW1lbnQ7XG5cdHJldHVybiAodGhpcy5fcHViQ2FjaGUpO1xufTtcblxuUHJpdmF0ZUtleS5wcm90b3R5cGUuZGVyaXZlID0gZnVuY3Rpb24gKG5ld1R5cGUpIHtcblx0YXNzZXJ0LnN0cmluZyhuZXdUeXBlLCAndHlwZScpO1xuXHR2YXIgcHJpdiwgcHViLCBwYWlyO1xuXG5cdGlmICh0aGlzLnR5cGUgPT09ICdlZDI1NTE5JyAmJiBuZXdUeXBlID09PSAnY3VydmUyNTUxOScpIHtcblx0XHRwcml2ID0gdGhpcy5wYXJ0LmsuZGF0YTtcblx0XHRpZiAocHJpdlswXSA9PT0gMHgwMClcblx0XHRcdHByaXYgPSBwcml2LnNsaWNlKDEpO1xuXG5cdFx0cGFpciA9IG5hY2wuYm94LmtleVBhaXIuZnJvbVNlY3JldEtleShuZXcgVWludDhBcnJheShwcml2KSk7XG5cdFx0cHViID0gQnVmZmVyLmZyb20ocGFpci5wdWJsaWNLZXkpO1xuXG5cdFx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleSh7XG5cdFx0XHR0eXBlOiAnY3VydmUyNTUxOScsXG5cdFx0XHRwYXJ0czogW1xuXHRcdFx0XHR7IG5hbWU6ICdBJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocHViKSB9LFxuXHRcdFx0XHR7IG5hbWU6ICdrJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocHJpdikgfVxuXHRcdFx0XVxuXHRcdH0pKTtcblx0fSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdjdXJ2ZTI1NTE5JyAmJiBuZXdUeXBlID09PSAnZWQyNTUxOScpIHtcblx0XHRwcml2ID0gdGhpcy5wYXJ0LmsuZGF0YTtcblx0XHRpZiAocHJpdlswXSA9PT0gMHgwMClcblx0XHRcdHByaXYgPSBwcml2LnNsaWNlKDEpO1xuXG5cdFx0cGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKG5ldyBVaW50OEFycmF5KHByaXYpKTtcblx0XHRwdWIgPSBCdWZmZXIuZnJvbShwYWlyLnB1YmxpY0tleSk7XG5cblx0XHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KHtcblx0XHRcdHR5cGU6ICdlZDI1NTE5Jyxcblx0XHRcdHBhcnRzOiBbXG5cdFx0XHRcdHsgbmFtZTogJ0EnLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShwdWIpIH0sXG5cdFx0XHRcdHsgbmFtZTogJ2snLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShwcml2KSB9XG5cdFx0XHRdXG5cdFx0fSkpO1xuXHR9XG5cdHRocm93IChuZXcgRXJyb3IoJ0tleSBkZXJpdmF0aW9uIG5vdCBzdXBwb3J0ZWQgZnJvbSAnICsgdGhpcy50eXBlICtcblx0ICAgICcgdG8gJyArIG5ld1R5cGUpKTtcbn07XG5cblByaXZhdGVLZXkucHJvdG90eXBlLmNyZWF0ZVZlcmlmeSA9IGZ1bmN0aW9uIChoYXNoQWxnbykge1xuXHRyZXR1cm4gKHRoaXMudG9QdWJsaWMoKS5jcmVhdGVWZXJpZnkoaGFzaEFsZ28pKTtcbn07XG5cblByaXZhdGVLZXkucHJvdG90eXBlLmNyZWF0ZVNpZ24gPSBmdW5jdGlvbiAoaGFzaEFsZ28pIHtcblx0aWYgKGhhc2hBbGdvID09PSB1bmRlZmluZWQpXG5cdFx0aGFzaEFsZ28gPSB0aGlzLmRlZmF1bHRIYXNoQWxnb3JpdGhtKCk7XG5cdGFzc2VydC5zdHJpbmcoaGFzaEFsZ28sICdoYXNoIGFsZ29yaXRobScpO1xuXG5cdC8qIEVEMjU1MTkgaXMgbm90IHN1cHBvcnRlZCBieSBPcGVuU1NMLCB1c2UgYSBqYXZhc2NyaXB0IGltcGwuICovXG5cdGlmICh0aGlzLnR5cGUgPT09ICdlZDI1NTE5JyAmJiBlZENvbXBhdCAhPT0gdW5kZWZpbmVkKVxuXHRcdHJldHVybiAobmV3IGVkQ29tcGF0LlNpZ25lcih0aGlzLCBoYXNoQWxnbykpO1xuXHRpZiAodGhpcy50eXBlID09PSAnY3VydmUyNTUxOScpXG5cdFx0dGhyb3cgKG5ldyBFcnJvcignQ3VydmUyNTUxOSBrZXlzIGFyZSBub3Qgc3VpdGFibGUgZm9yICcgK1xuXHRcdCAgICAnc2lnbmluZyBvciB2ZXJpZmljYXRpb24nKSk7XG5cblx0dmFyIHYsIG5tLCBlcnI7XG5cdHRyeSB7XG5cdFx0bm0gPSBoYXNoQWxnby50b1VwcGVyQ2FzZSgpO1xuXHRcdHYgPSBjcnlwdG8uY3JlYXRlU2lnbihubSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRlcnIgPSBlO1xuXHR9XG5cdGlmICh2ID09PSB1bmRlZmluZWQgfHwgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmXG5cdCAgICBlcnIubWVzc2FnZS5tYXRjaCgvVW5rbm93biBtZXNzYWdlIGRpZ2VzdC8pKSkge1xuXHRcdG5tID0gJ1JTQS0nO1xuXHRcdG5tICs9IGhhc2hBbGdvLnRvVXBwZXJDYXNlKCk7XG5cdFx0diA9IGNyeXB0by5jcmVhdGVTaWduKG5tKTtcblx0fVxuXHRhc3NlcnQub2sodiwgJ2ZhaWxlZCB0byBjcmVhdGUgdmVyaWZpZXInKTtcblx0dmFyIG9sZFNpZ24gPSB2LnNpZ24uYmluZCh2KTtcblx0dmFyIGtleSA9IHRoaXMudG9CdWZmZXIoJ3BrY3MxJyk7XG5cdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXHR2YXIgY3VydmUgPSB0aGlzLmN1cnZlO1xuXHR2LnNpZ24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHNpZyA9IG9sZFNpZ24oa2V5KTtcblx0XHRpZiAodHlwZW9mIChzaWcpID09PSAnc3RyaW5nJylcblx0XHRcdHNpZyA9IEJ1ZmZlci5mcm9tKHNpZywgJ2JpbmFyeScpO1xuXHRcdHNpZyA9IFNpZ25hdHVyZS5wYXJzZShzaWcsIHR5cGUsICdhc24xJyk7XG5cdFx0c2lnLmhhc2hBbGdvcml0aG0gPSBoYXNoQWxnbztcblx0XHRzaWcuY3VydmUgPSBjdXJ2ZTtcblx0XHRyZXR1cm4gKHNpZyk7XG5cdH07XG5cdHJldHVybiAodik7XG59O1xuXG5Qcml2YXRlS2V5LnBhcnNlID0gZnVuY3Rpb24gKGRhdGEsIGZvcm1hdCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIChkYXRhKSAhPT0gJ3N0cmluZycpXG5cdFx0YXNzZXJ0LmJ1ZmZlcihkYXRhLCAnZGF0YScpO1xuXHRpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpXG5cdFx0Zm9ybWF0ID0gJ2F1dG8nO1xuXHRhc3NlcnQuc3RyaW5nKGZvcm1hdCwgJ2Zvcm1hdCcpO1xuXHRpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpXG5cdFx0b3B0aW9ucyA9IHsgZmlsZW5hbWU6IG9wdGlvbnMgfTtcblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcob3B0aW9ucy5maWxlbmFtZSwgJ29wdGlvbnMuZmlsZW5hbWUnKTtcblx0aWYgKG9wdGlvbnMuZmlsZW5hbWUgPT09IHVuZGVmaW5lZClcblx0XHRvcHRpb25zLmZpbGVuYW1lID0gJyh1bm5hbWVkKSc7XG5cblx0YXNzZXJ0Lm9iamVjdChmb3JtYXRzW2Zvcm1hdF0sICdmb3JtYXRzW2Zvcm1hdF0nKTtcblxuXHR0cnkge1xuXHRcdHZhciBrID0gZm9ybWF0c1tmb3JtYXRdLnJlYWQoZGF0YSwgb3B0aW9ucyk7XG5cdFx0YXNzZXJ0Lm9rKGsgaW5zdGFuY2VvZiBQcml2YXRlS2V5LCAna2V5IGlzIG5vdCBhIHByaXZhdGUga2V5Jyk7XG5cdFx0aWYgKCFrLmNvbW1lbnQpXG5cdFx0XHRrLmNvbW1lbnQgPSBvcHRpb25zLmZpbGVuYW1lO1xuXHRcdHJldHVybiAoayk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAoZS5uYW1lID09PSAnS2V5RW5jcnlwdGVkRXJyb3InKVxuXHRcdFx0dGhyb3cgKGUpO1xuXHRcdHRocm93IChuZXcgS2V5UGFyc2VFcnJvcihvcHRpb25zLmZpbGVuYW1lLCBmb3JtYXQsIGUpKTtcblx0fVxufTtcblxuUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkgPSBmdW5jdGlvbiAob2JqLCB2ZXIpIHtcblx0cmV0dXJuICh1dGlscy5pc0NvbXBhdGlibGUob2JqLCBQcml2YXRlS2V5LCB2ZXIpKTtcbn07XG5cblByaXZhdGVLZXkuZ2VuZXJhdGUgPSBmdW5jdGlvbiAodHlwZSwgb3B0aW9ucykge1xuXHRpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKVxuXHRcdG9wdGlvbnMgPSB7fTtcblx0YXNzZXJ0Lm9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpO1xuXG5cdHN3aXRjaCAodHlwZSkge1xuXHRjYXNlICdlY2RzYSc6XG5cdFx0aWYgKG9wdGlvbnMuY3VydmUgPT09IHVuZGVmaW5lZClcblx0XHRcdG9wdGlvbnMuY3VydmUgPSAnbmlzdHAyNTYnO1xuXHRcdGFzc2VydC5zdHJpbmcob3B0aW9ucy5jdXJ2ZSwgJ29wdGlvbnMuY3VydmUnKTtcblx0XHRyZXR1cm4gKGdlbmVyYXRlRUNEU0Eob3B0aW9ucy5jdXJ2ZSkpO1xuXHRjYXNlICdlZDI1NTE5Jzpcblx0XHRyZXR1cm4gKGdlbmVyYXRlRUQyNTUxOSgpKTtcblx0ZGVmYXVsdDpcblx0XHR0aHJvdyAobmV3IEVycm9yKCdLZXkgZ2VuZXJhdGlvbiBub3Qgc3VwcG9ydGVkIHdpdGgga2V5ICcgK1xuXHRcdCAgICAndHlwZSBcIicgKyB0eXBlICsgJ1wiJykpO1xuXHR9XG59O1xuXG4vKlxuICogQVBJIHZlcnNpb25zIGZvciBQcml2YXRlS2V5OlxuICogWzEsMF0gLS0gaW5pdGlhbCB2ZXJcbiAqIFsxLDFdIC0tIGFkZGVkIGF1dG8sIHBrY3NbMThdLCBvcGVuc3NoL3NzaC1wcml2YXRlIGZvcm1hdHNcbiAqIFsxLDJdIC0tIGFkZGVkIGRlZmF1bHRIYXNoQWxnb3JpdGhtXG4gKiBbMSwzXSAtLSBhZGRlZCBkZXJpdmUsIGVkLCBjcmVhdGVESFxuICogWzEsNF0gLS0gZmlyc3QgdGFnZ2VkIHZlcnNpb25cbiAqIFsxLDVdIC0tIGNoYW5nZWQgZWQyNTUxOSBwYXJ0IG5hbWVzIGFuZCBmb3JtYXRcbiAqIFsxLDZdIC0tIHR5cGUgYXJndW1lbnRzIGZvciBoYXNoKCkgYW5kIGZpbmdlcnByaW50KClcbiAqL1xuUHJpdmF0ZUtleS5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbiA9IFsxLCA2XTtcblxuUHJpdmF0ZUtleS5fb2xkVmVyc2lvbkRldGVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0YXNzZXJ0LmZ1bmMob2JqLnRvUHVibGljKTtcblx0YXNzZXJ0LmZ1bmMob2JqLmNyZWF0ZVNpZ24pO1xuXHRpZiAob2JqLmRlcml2ZSlcblx0XHRyZXR1cm4gKFsxLCAzXSk7XG5cdGlmIChvYmouZGVmYXVsdEhhc2hBbGdvcml0aG0pXG5cdFx0cmV0dXJuIChbMSwgMl0pO1xuXHRpZiAob2JqLmZvcm1hdHNbJ2F1dG8nXSlcblx0XHRyZXR1cm4gKFsxLCAxXSk7XG5cdHJldHVybiAoWzEsIDBdKTtcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTcgSm95ZW50LCBJbmMuXG5cbm1vZHVsZS5leHBvcnRzID0gSWRlbnRpdHk7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuL2FsZ3MnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBGaW5nZXJwcmludCA9IHJlcXVpcmUoJy4vZmluZ2VycHJpbnQnKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xudmFyIGVycnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbi8qSlNTVFlMRUQqL1xudmFyIEROU19OQU1FX1JFID0gL14oWypdfFthLXowLTldW2EtejAtOVxcLV17MCw2Mn0pKD86XFwuKFsqXXxbYS16MC05XVthLXowLTlcXC1dezAsNjJ9KSkqJC9pO1xuXG52YXIgb2lkcyA9IHt9O1xub2lkcy5jbiA9ICcyLjUuNC4zJztcbm9pZHMubyA9ICcyLjUuNC4xMCc7XG5vaWRzLm91ID0gJzIuNS40LjExJztcbm9pZHMubCA9ICcyLjUuNC43Jztcbm9pZHMucyA9ICcyLjUuNC44Jztcbm9pZHMuYyA9ICcyLjUuNC42Jztcbm9pZHMuc24gPSAnMi41LjQuNCc7XG5vaWRzLnBvc3RhbENvZGUgPSAnMi41LjQuMTcnO1xub2lkcy5zZXJpYWxOdW1iZXIgPSAnMi41LjQuNSc7XG5vaWRzLnN0cmVldCA9ICcyLjUuNC45Jztcbm9pZHMueDUwMFVuaXF1ZUlkZW50aWZpZXIgPSAnMi41LjQuNDUnO1xub2lkcy5yb2xlID0gJzIuNS40LjcyJztcbm9pZHMudGVsZXBob25lTnVtYmVyID0gJzIuNS40LjIwJztcbm9pZHMuZGVzY3JpcHRpb24gPSAnMi41LjQuMTMnO1xub2lkcy5kYyA9ICcwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4yNSc7XG5vaWRzLnVpZCA9ICcwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4xJztcbm9pZHMubWFpbCA9ICcwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4zJztcbm9pZHMudGl0bGUgPSAnMi41LjQuMTInO1xub2lkcy5nbiA9ICcyLjUuNC40Mic7XG5vaWRzLmluaXRpYWxzID0gJzIuNS40LjQzJztcbm9pZHMucHNldWRvbnltID0gJzIuNS40LjY1Jztcbm9pZHMuZW1haWxBZGRyZXNzID0gJzEuMi44NDAuMTEzNTQ5LjEuOS4xJztcblxudmFyIHVub2lkcyA9IHt9O1xuT2JqZWN0LmtleXMob2lkcykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHR1bm9pZHNbb2lkc1trXV0gPSBrO1xufSk7XG5cbmZ1bmN0aW9uIElkZW50aXR5KG9wdHMpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KG9wdHMuY29tcG9uZW50cywgJ29wdGlvbnMuY29tcG9uZW50cycpO1xuXHR0aGlzLmNvbXBvbmVudHMgPSBvcHRzLmNvbXBvbmVudHM7XG5cdHRoaXMuY29tcG9uZW50TG9va3VwID0ge307XG5cdHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG5cdFx0aWYgKGMubmFtZSAmJiAhYy5vaWQpXG5cdFx0XHRjLm9pZCA9IG9pZHNbYy5uYW1lXTtcblx0XHRpZiAoYy5vaWQgJiYgIWMubmFtZSlcblx0XHRcdGMubmFtZSA9IHVub2lkc1tjLm9pZF07XG5cdFx0aWYgKHNlbGYuY29tcG9uZW50TG9va3VwW2MubmFtZV0gPT09IHVuZGVmaW5lZClcblx0XHRcdHNlbGYuY29tcG9uZW50TG9va3VwW2MubmFtZV0gPSBbXTtcblx0XHRzZWxmLmNvbXBvbmVudExvb2t1cFtjLm5hbWVdLnB1c2goYyk7XG5cdH0pO1xuXHRpZiAodGhpcy5jb21wb25lbnRMb29rdXAuY24gJiYgdGhpcy5jb21wb25lbnRMb29rdXAuY24ubGVuZ3RoID4gMCkge1xuXHRcdHRoaXMuY24gPSB0aGlzLmNvbXBvbmVudExvb2t1cC5jblswXS52YWx1ZTtcblx0fVxuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcob3B0cy50eXBlLCAnb3B0aW9ucy50eXBlJyk7XG5cdGlmIChvcHRzLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0aGlzLmNvbXBvbmVudHMubGVuZ3RoID09PSAxICYmXG5cdFx0ICAgIHRoaXMuY29tcG9uZW50TG9va3VwLmNuICYmXG5cdFx0ICAgIHRoaXMuY29tcG9uZW50TG9va3VwLmNuLmxlbmd0aCA9PT0gMSAmJlxuXHRcdCAgICB0aGlzLmNvbXBvbmVudExvb2t1cC5jblswXS52YWx1ZS5tYXRjaChETlNfTkFNRV9SRSkpIHtcblx0XHRcdHRoaXMudHlwZSA9ICdob3N0Jztcblx0XHRcdHRoaXMuaG9zdG5hbWUgPSB0aGlzLmNvbXBvbmVudExvb2t1cC5jblswXS52YWx1ZTtcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRMb29rdXAuZGMgJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRzLmxlbmd0aCA9PT0gdGhpcy5jb21wb25lbnRMb29rdXAuZGMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLnR5cGUgPSAnaG9zdCc7XG5cdFx0XHR0aGlzLmhvc3RuYW1lID0gdGhpcy5jb21wb25lbnRMb29rdXAuZGMubWFwKFxuXHRcdFx0ICAgIGZ1bmN0aW9uIChjKSB7XG5cdFx0XHRcdHJldHVybiAoYy52YWx1ZSk7XG5cdFx0XHR9KS5qb2luKCcuJyk7XG5cblx0XHR9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50TG9va3VwLnVpZCAmJlxuXHRcdCAgICB0aGlzLmNvbXBvbmVudHMubGVuZ3RoID09PVxuXHRcdCAgICB0aGlzLmNvbXBvbmVudExvb2t1cC51aWQubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLnR5cGUgPSAndXNlcic7XG5cdFx0XHR0aGlzLnVpZCA9IHRoaXMuY29tcG9uZW50TG9va3VwLnVpZFswXS52YWx1ZTtcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRMb29rdXAuY24gJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRMb29rdXAuY24ubGVuZ3RoID09PSAxICYmXG5cdFx0ICAgIHRoaXMuY29tcG9uZW50TG9va3VwLmNuWzBdLnZhbHVlLm1hdGNoKEROU19OQU1FX1JFKSkge1xuXHRcdFx0dGhpcy50eXBlID0gJ2hvc3QnO1xuXHRcdFx0dGhpcy5ob3N0bmFtZSA9IHRoaXMuY29tcG9uZW50TG9va3VwLmNuWzBdLnZhbHVlO1xuXG5cdFx0fSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudExvb2t1cC51aWQgJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRMb29rdXAudWlkLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0dGhpcy50eXBlID0gJ3VzZXInO1xuXHRcdFx0dGhpcy51aWQgPSB0aGlzLmNvbXBvbmVudExvb2t1cC51aWRbMF0udmFsdWU7XG5cblx0XHR9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50TG9va3VwLm1haWwgJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRMb29rdXAubWFpbC5sZW5ndGggPT09IDEpIHtcblx0XHRcdHRoaXMudHlwZSA9ICdlbWFpbCc7XG5cdFx0XHR0aGlzLmVtYWlsID0gdGhpcy5jb21wb25lbnRMb29rdXAubWFpbFswXS52YWx1ZTtcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRMb29rdXAuY24gJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRMb29rdXAuY24ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHR0aGlzLnR5cGUgPSAndXNlcic7XG5cdFx0XHR0aGlzLnVpZCA9IHRoaXMuY29tcG9uZW50TG9va3VwLmNuWzBdLnZhbHVlO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudHlwZSA9ICd1bmtub3duJztcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gb3B0cy50eXBlO1xuXHRcdGlmICh0aGlzLnR5cGUgPT09ICdob3N0Jylcblx0XHRcdHRoaXMuaG9zdG5hbWUgPSBvcHRzLmhvc3RuYW1lO1xuXHRcdGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ3VzZXInKVxuXHRcdFx0dGhpcy51aWQgPSBvcHRzLnVpZDtcblx0XHRlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdlbWFpbCcpXG5cdFx0XHR0aGlzLmVtYWlsID0gb3B0cy5lbWFpbDtcblx0XHRlbHNlXG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIHR5cGUgJyArIHRoaXMudHlwZSkpO1xuXHR9XG59XG5cbklkZW50aXR5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICh0aGlzLmNvbXBvbmVudHMubWFwKGZ1bmN0aW9uIChjKSB7XG5cdFx0dmFyIG4gPSBjLm5hbWUudG9VcHBlckNhc2UoKTtcblx0XHQvKkpTU1RZTEVEKi9cblx0XHRuID0gbi5yZXBsYWNlKC89L2csICdcXFxcPScpO1xuXHRcdHZhciB2ID0gYy52YWx1ZTtcblx0XHQvKkpTU1RZTEVEKi9cblx0XHR2ID0gdi5yZXBsYWNlKC8sL2csICdcXFxcLCcpO1xuXHRcdHJldHVybiAobiArICc9JyArIHYpO1xuXHR9KS5qb2luKCcsICcpKTtcbn07XG5cbklkZW50aXR5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSwgYXNBcnJheSkge1xuXHRhc3NlcnQuc3RyaW5nKG5hbWUsICduYW1lJyk7XG5cdHZhciBhcnIgPSB0aGlzLmNvbXBvbmVudExvb2t1cFtuYW1lXTtcblx0aWYgKGFyciA9PT0gdW5kZWZpbmVkIHx8IGFyci5sZW5ndGggPT09IDApXG5cdFx0cmV0dXJuICh1bmRlZmluZWQpO1xuXHRpZiAoIWFzQXJyYXkgJiYgYXJyLmxlbmd0aCA+IDEpXG5cdFx0dGhyb3cgKG5ldyBFcnJvcignTXVsdGlwbGUgdmFsdWVzIGZvciBhdHRyaWJ1dGUgJyArIG5hbWUpKTtcblx0aWYgKCFhc0FycmF5KVxuXHRcdHJldHVybiAoYXJyWzBdLnZhbHVlKTtcblx0cmV0dXJuIChhcnIubWFwKGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuIChjLnZhbHVlKTtcblx0fSkpO1xufTtcblxuSWRlbnRpdHkucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoaWR4KSB7XG5cdHJldHVybiAodGhpcy5jb21wb25lbnRzLm1hcChmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAoe1xuXHRcdFx0bmFtZTogYy5uYW1lLFxuXHRcdFx0dmFsdWU6IGMudmFsdWVcblx0XHR9KTtcblx0fSkpO1xufTtcblxuLypcbiAqIFRoZXNlIGFyZSBmcm9tIFguNjgwIC0tIFByaW50YWJsZVN0cmluZyBhbGxvd2VkIGNoYXJzIGFyZSBpbiBzZWN0aW9uIDM3LjRcbiAqIHRhYmxlIDguIFNwZWMgZm9yIElBNVN0cmluZ3MgaXMgXCIxLDYgKyBTUEFDRSArIERFTFwiIHdoZXJlIDEgcmVmZXJzIHRvXG4gKiBJU08gSVIgIzAwMSAoc3RhbmRhcmQgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzKSBhbmQgNiByZWZlcnMgdG8gSVNPIElSICMwMDZcbiAqICh0aGUgYmFzaWMgQVNDSUkgY2hhcmFjdGVyIHNldCkuXG4gKi9cbi8qIEpTU1RZTEVEICovXG52YXIgTk9UX1BSSU5UQUJMRSA9IC9bXmEtekEtWjAtOSAnKCksKy5cXC86PT8tXS87XG4vKiBKU1NUWUxFRCAqL1xudmFyIE5PVF9JQTUgPSAvW15cXHgwMC1cXHg3Zl0vO1xuXG5JZGVudGl0eS5wcm90b3R5cGUudG9Bc24xID0gZnVuY3Rpb24gKGRlciwgdGFnKSB7XG5cdGRlci5zdGFydFNlcXVlbmNlKHRhZyk7XG5cdHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG5cdFx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuQ29uc3RydWN0b3IgfCBhc24xLkJlci5TZXQpO1xuXHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0ZGVyLndyaXRlT0lEKGMub2lkKTtcblx0XHQvKlxuXHRcdCAqIElmIHdlIGZpdCBpbiBhIFByaW50YWJsZVN0cmluZywgdXNlIHRoYXQuIE90aGVyd2lzZSB1c2UgYW5cblx0XHQgKiBJQTVTdHJpbmcgb3IgVVRGOFN0cmluZy5cblx0XHQgKlxuXHRcdCAqIElmIHRoaXMgaWRlbnRpdHkgd2FzIHBhcnNlZCBmcm9tIGEgRE4sIHVzZSB0aGUgQVNOLjEgdHlwZXNcblx0XHQgKiBmcm9tIHRoZSBvcmlnaW5hbCByZXByZXNlbnRhdGlvbiAob3RoZXJ3aXNlIHRoaXMgbWlnaHQgbm90XG5cdFx0ICogYmUgYSBmdWxsIG1hdGNoIGZvciB0aGUgb3JpZ2luYWwgaW4gc29tZSB2YWxpZGF0b3JzKS5cblx0XHQgKi9cblx0XHRpZiAoYy5hc24xdHlwZSA9PT0gYXNuMS5CZXIuVXRmOFN0cmluZyB8fFxuXHRcdCAgICBjLnZhbHVlLm1hdGNoKE5PVF9JQTUpKSB7XG5cdFx0XHR2YXIgdiA9IEJ1ZmZlci5mcm9tKGMudmFsdWUsICd1dGY4Jyk7XG5cdFx0XHRkZXIud3JpdGVCdWZmZXIodiwgYXNuMS5CZXIuVXRmOFN0cmluZyk7XG5cblx0XHR9IGVsc2UgaWYgKGMuYXNuMXR5cGUgPT09IGFzbjEuQmVyLklBNVN0cmluZyB8fFxuXHRcdCAgICBjLnZhbHVlLm1hdGNoKE5PVF9QUklOVEFCTEUpKSB7XG5cdFx0XHRkZXIud3JpdGVTdHJpbmcoYy52YWx1ZSwgYXNuMS5CZXIuSUE1U3RyaW5nKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgdHlwZSA9IGFzbjEuQmVyLlByaW50YWJsZVN0cmluZztcblx0XHRcdGlmIChjLmFzbjF0eXBlICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdHR5cGUgPSBjLmFzbjF0eXBlO1xuXHRcdFx0ZGVyLndyaXRlU3RyaW5nKGMudmFsdWUsIHR5cGUpO1xuXHRcdH1cblx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0fSk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufTtcblxuZnVuY3Rpb24gZ2xvYk1hdGNoKGEsIGIpIHtcblx0aWYgKGEgPT09ICcqKicgfHwgYiA9PT0gJyoqJylcblx0XHRyZXR1cm4gKHRydWUpO1xuXHR2YXIgYVBhcnRzID0gYS5zcGxpdCgnLicpO1xuXHR2YXIgYlBhcnRzID0gYi5zcGxpdCgnLicpO1xuXHRpZiAoYVBhcnRzLmxlbmd0aCAhPT0gYlBhcnRzLmxlbmd0aClcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhUGFydHMubGVuZ3RoOyArK2kpIHtcblx0XHRpZiAoYVBhcnRzW2ldID09PSAnKicgfHwgYlBhcnRzW2ldID09PSAnKicpXG5cdFx0XHRjb250aW51ZTtcblx0XHRpZiAoYVBhcnRzW2ldICE9PSBiUGFydHNbaV0pXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXHRyZXR1cm4gKHRydWUpO1xufVxuXG5JZGVudGl0eS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG5cdGlmICghSWRlbnRpdHkuaXNJZGVudGl0eShvdGhlciwgWzEsIDBdKSlcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0aWYgKG90aGVyLmNvbXBvbmVudHMubGVuZ3RoICE9PSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7ICsraSkge1xuXHRcdGlmICh0aGlzLmNvbXBvbmVudHNbaV0ub2lkICE9PSBvdGhlci5jb21wb25lbnRzW2ldLm9pZClcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXHRcdGlmICghZ2xvYk1hdGNoKHRoaXMuY29tcG9uZW50c1tpXS52YWx1ZSxcblx0XHQgICAgb3RoZXIuY29tcG9uZW50c1tpXS52YWx1ZSkpIHtcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gKHRydWUpO1xufTtcblxuSWRlbnRpdHkuZm9ySG9zdCA9IGZ1bmN0aW9uIChob3N0bmFtZSkge1xuXHRhc3NlcnQuc3RyaW5nKGhvc3RuYW1lLCAnaG9zdG5hbWUnKTtcblx0cmV0dXJuIChuZXcgSWRlbnRpdHkoe1xuXHRcdHR5cGU6ICdob3N0Jyxcblx0XHRob3N0bmFtZTogaG9zdG5hbWUsXG5cdFx0Y29tcG9uZW50czogWyB7IG5hbWU6ICdjbicsIHZhbHVlOiBob3N0bmFtZSB9IF1cblx0fSkpO1xufTtcblxuSWRlbnRpdHkuZm9yVXNlciA9IGZ1bmN0aW9uICh1aWQpIHtcblx0YXNzZXJ0LnN0cmluZyh1aWQsICd1aWQnKTtcblx0cmV0dXJuIChuZXcgSWRlbnRpdHkoe1xuXHRcdHR5cGU6ICd1c2VyJyxcblx0XHR1aWQ6IHVpZCxcblx0XHRjb21wb25lbnRzOiBbIHsgbmFtZTogJ3VpZCcsIHZhbHVlOiB1aWQgfSBdXG5cdH0pKTtcbn07XG5cbklkZW50aXR5LmZvckVtYWlsID0gZnVuY3Rpb24gKGVtYWlsKSB7XG5cdGFzc2VydC5zdHJpbmcoZW1haWwsICdlbWFpbCcpO1xuXHRyZXR1cm4gKG5ldyBJZGVudGl0eSh7XG5cdFx0dHlwZTogJ2VtYWlsJyxcblx0XHRlbWFpbDogZW1haWwsXG5cdFx0Y29tcG9uZW50czogWyB7IG5hbWU6ICdtYWlsJywgdmFsdWU6IGVtYWlsIH0gXVxuXHR9KSk7XG59O1xuXG5JZGVudGl0eS5wYXJzZUROID0gZnVuY3Rpb24gKGRuKSB7XG5cdGFzc2VydC5zdHJpbmcoZG4sICdkbicpO1xuXHR2YXIgcGFydHMgPSBbJyddO1xuXHR2YXIgaWR4ID0gMDtcblx0dmFyIHJlbSA9IGRuO1xuXHR3aGlsZSAocmVtLmxlbmd0aCA+IDApIHtcblx0XHR2YXIgbTtcblx0XHQvKkpTU1RZTEVEKi9cblx0XHRpZiAoKG0gPSAvXiwvLmV4ZWMocmVtKSkgIT09IG51bGwpIHtcblx0XHRcdHBhcnRzWysraWR4XSA9ICcnO1xuXHRcdFx0cmVtID0gcmVtLnNsaWNlKG1bMF0ubGVuZ3RoKTtcblx0XHQvKkpTU1RZTEVEKi9cblx0XHR9IGVsc2UgaWYgKChtID0gL15cXFxcLC8uZXhlYyhyZW0pKSAhPT0gbnVsbCkge1xuXHRcdFx0cGFydHNbaWR4XSArPSAnLCc7XG5cdFx0XHRyZW0gPSByZW0uc2xpY2UobVswXS5sZW5ndGgpO1xuXHRcdC8qSlNTVFlMRUQqL1xuXHRcdH0gZWxzZSBpZiAoKG0gPSAvXlxcXFwuLy5leGVjKHJlbSkpICE9PSBudWxsKSB7XG5cdFx0XHRwYXJ0c1tpZHhdICs9IG1bMF07XG5cdFx0XHRyZW0gPSByZW0uc2xpY2UobVswXS5sZW5ndGgpO1xuXHRcdC8qSlNTVFlMRUQqL1xuXHRcdH0gZWxzZSBpZiAoKG0gPSAvXlteXFxcXCxdKy8uZXhlYyhyZW0pKSAhPT0gbnVsbCkge1xuXHRcdFx0cGFydHNbaWR4XSArPSBtWzBdO1xuXHRcdFx0cmVtID0gcmVtLnNsaWNlKG1bMF0ubGVuZ3RoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIEROJykpO1xuXHRcdH1cblx0fVxuXHR2YXIgY21wcyA9IHBhcnRzLm1hcChmdW5jdGlvbiAoYykge1xuXHRcdGMgPSBjLnRyaW0oKTtcblx0XHR2YXIgZXFQb3MgPSBjLmluZGV4T2YoJz0nKTtcblx0XHR3aGlsZSAoZXFQb3MgPiAwICYmIGMuY2hhckF0KGVxUG9zIC0gMSkgPT09ICdcXFxcJylcblx0XHRcdGVxUG9zID0gYy5pbmRleE9mKCc9JywgZXFQb3MgKyAxKTtcblx0XHRpZiAoZXFQb3MgPT09IC0xKSB7XG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgRE4nKSk7XG5cdFx0fVxuXHRcdC8qSlNTVFlMRUQqL1xuXHRcdHZhciBuYW1lID0gYy5zbGljZSgwLCBlcVBvcykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcPS9nLCAnPScpO1xuXHRcdHZhciB2YWx1ZSA9IGMuc2xpY2UoZXFQb3MgKyAxKTtcblx0XHRyZXR1cm4gKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuXHR9KTtcblx0cmV0dXJuIChuZXcgSWRlbnRpdHkoeyBjb21wb25lbnRzOiBjbXBzIH0pKTtcbn07XG5cbklkZW50aXR5LmZyb21BcnJheSA9IGZ1bmN0aW9uIChjb21wb25lbnRzKSB7XG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KGNvbXBvbmVudHMsICdjb21wb25lbnRzJyk7XG5cdGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY21wKSB7XG5cdFx0YXNzZXJ0Lm9iamVjdChjbXAsICdjb21wb25lbnQnKTtcblx0XHRhc3NlcnQuc3RyaW5nKGNtcC5uYW1lLCAnY29tcG9uZW50Lm5hbWUnKTtcblx0XHRpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjbXAudmFsdWUpICYmXG5cdFx0ICAgICEodHlwZW9mIChjbXAudmFsdWUpID09PSAnc3RyaW5nJykpIHtcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ0ludmFsaWQgY29tcG9uZW50IHZhbHVlJykpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiAobmV3IElkZW50aXR5KHsgY29tcG9uZW50czogY29tcG9uZW50cyB9KSk7XG59O1xuXG5JZGVudGl0eS5wYXJzZUFzbjEgPSBmdW5jdGlvbiAoZGVyLCB0b3ApIHtcblx0dmFyIGNvbXBvbmVudHMgPSBbXTtcblx0ZGVyLnJlYWRTZXF1ZW5jZSh0b3ApO1xuXHR2YXIgZW5kID0gZGVyLm9mZnNldCArIGRlci5sZW5ndGg7XG5cdHdoaWxlIChkZXIub2Zmc2V0IDwgZW5kKSB7XG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5Db25zdHJ1Y3RvciB8IGFzbjEuQmVyLlNldCk7XG5cdFx0dmFyIGFmdGVyID0gZGVyLm9mZnNldCArIGRlci5sZW5ndGg7XG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdHZhciBvaWQgPSBkZXIucmVhZE9JRCgpO1xuXHRcdHZhciB0eXBlID0gZGVyLnBlZWsoKTtcblx0XHR2YXIgdmFsdWU7XG5cdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0Y2FzZSBhc24xLkJlci5QcmludGFibGVTdHJpbmc6XG5cdFx0Y2FzZSBhc24xLkJlci5JQTVTdHJpbmc6XG5cdFx0Y2FzZSBhc24xLkJlci5PY3RldFN0cmluZzpcblx0XHRjYXNlIGFzbjEuQmVyLlQ2MVN0cmluZzpcblx0XHRcdHZhbHVlID0gZGVyLnJlYWRTdHJpbmcodHlwZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIGFzbjEuQmVyLlV0ZjhTdHJpbmc6XG5cdFx0XHR2YWx1ZSA9IGRlci5yZWFkU3RyaW5nKHR5cGUsIHRydWUpO1xuXHRcdFx0dmFsdWUgPSB2YWx1ZS50b1N0cmluZygndXRmOCcpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBhc24xLkJlci5DaGFyYWN0ZXJTdHJpbmc6XG5cdFx0Y2FzZSBhc24xLkJlci5CTVBTdHJpbmc6XG5cdFx0XHR2YWx1ZSA9IGRlci5yZWFkU3RyaW5nKHR5cGUsIHRydWUpO1xuXHRcdFx0dmFsdWUgPSB2YWx1ZS50b1N0cmluZygndXRmMTZsZScpO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ1Vua25vd24gYXNuMSB0eXBlICcgKyB0eXBlKSk7XG5cdFx0fVxuXHRcdGNvbXBvbmVudHMucHVzaCh7IG9pZDogb2lkLCBhc24xdHlwZTogdHlwZSwgdmFsdWU6IHZhbHVlIH0pO1xuXHRcdGRlci5fb2Zmc2V0ID0gYWZ0ZXI7XG5cdH1cblx0ZGVyLl9vZmZzZXQgPSBlbmQ7XG5cdHJldHVybiAobmV3IElkZW50aXR5KHtcblx0XHRjb21wb25lbnRzOiBjb21wb25lbnRzXG5cdH0pKTtcbn07XG5cbklkZW50aXR5LmlzSWRlbnRpdHkgPSBmdW5jdGlvbiAob2JqLCB2ZXIpIHtcblx0cmV0dXJuICh1dGlscy5pc0NvbXBhdGlibGUob2JqLCBJZGVudGl0eSwgdmVyKSk7XG59O1xuXG4vKlxuICogQVBJIHZlcnNpb25zIGZvciBJZGVudGl0eTpcbiAqIFsxLDBdIC0tIGluaXRpYWwgdmVyXG4gKi9cbklkZW50aXR5LnByb3RvdHlwZS5fc3NocGtBcGlWZXJzaW9uID0gWzEsIDBdO1xuXG5JZGVudGl0eS5fb2xkVmVyc2lvbkRldGVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0cmV0dXJuIChbMSwgMF0pO1xufTtcbiIsICIvLyBDb3B5cmlnaHQgMjAxNyBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHZlcmlmeTogdmVyaWZ5LFxuXHRzaWduOiBzaWduLFxuXHRzaWduQXN5bmM6IHNpZ25Bc3luYyxcblx0d3JpdGU6IHdyaXRlLFxuXG5cdC8qIEludGVybmFsIHByaXZhdGUgQVBJICovXG5cdGZyb21CdWZmZXI6IGZyb21CdWZmZXIsXG5cdHRvQnVmZmVyOiB0b0J1ZmZlclxufTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgU1NIQnVmZmVyID0gcmVxdWlyZSgnLi4vc3NoLWJ1ZmZlcicpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi4vYWxncycpO1xudmFyIEtleSA9IHJlcXVpcmUoJy4uL2tleScpO1xudmFyIFByaXZhdGVLZXkgPSByZXF1aXJlKCcuLi9wcml2YXRlLWtleScpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi4vaWRlbnRpdHknKTtcbnZhciByZmM0MjUzID0gcmVxdWlyZSgnLi9yZmM0MjUzJyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi4vc2lnbmF0dXJlJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi4vY2VydGlmaWNhdGUnKTtcblxuZnVuY3Rpb24gdmVyaWZ5KGNlcnQsIGtleSkge1xuXHQvKlxuXHQgKiBXZSBhbHdheXMgZ2l2ZSBhbiBpc3N1ZXJLZXksIHNvIGlmIG91ciB2ZXJpZnkoKSBpcyBiZWluZyBjYWxsZWQgdGhlblxuXHQgKiB0aGVyZSB3YXMgbm8gc2lnbmF0dXJlLiBSZXR1cm4gZmFsc2UuXG5cdCAqL1xuXHRyZXR1cm4gKGZhbHNlKTtcbn1cblxudmFyIFRZUEVTID0ge1xuXHQndXNlcic6IDEsXG5cdCdob3N0JzogMlxufTtcbk9iamVjdC5rZXlzKFRZUEVTKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IFRZUEVTW1RZUEVTW2tdXSA9IGs7IH0pO1xuXG52YXIgRUNEU0FfQUxHTyA9IC9eZWNkc2Etc2hhMi0oW15ALV0rKS1jZXJ0LXYwMUBvcGVuc3NoLmNvbSQvO1xuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucykge1xuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKGJ1ZikpXG5cdFx0YnVmID0gYnVmLnRvU3RyaW5nKCdhc2NpaScpO1xuXHR2YXIgcGFydHMgPSBidWYudHJpbSgpLnNwbGl0KC9bIFxcdFxcbl0rL2cpO1xuXHRpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIFNTSCBjZXJ0aWZpY2F0ZSBsaW5lJykpO1xuXG5cdHZhciBhbGdvID0gcGFydHNbMF07XG5cdHZhciBkYXRhID0gcGFydHNbMV07XG5cblx0ZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKTtcblx0cmV0dXJuIChmcm9tQnVmZmVyKGRhdGEsIGFsZ28pKTtcbn1cblxuZnVuY3Rpb24gZnJvbUJ1ZmZlcihkYXRhLCBhbGdvLCBwYXJ0aWFsKSB7XG5cdHZhciBzc2hidWYgPSBuZXcgU1NIQnVmZmVyKHsgYnVmZmVyOiBkYXRhIH0pO1xuXHR2YXIgaW5uZXJBbGdvID0gc3NoYnVmLnJlYWRTdHJpbmcoKTtcblx0aWYgKGFsZ28gIT09IHVuZGVmaW5lZCAmJiBpbm5lckFsZ28gIT09IGFsZ28pXG5cdFx0dGhyb3cgKG5ldyBFcnJvcignU1NIIGNlcnRpZmljYXRlIGFsZ29yaXRobSBtaXNtYXRjaCcpKTtcblx0aWYgKGFsZ28gPT09IHVuZGVmaW5lZClcblx0XHRhbGdvID0gaW5uZXJBbGdvO1xuXG5cdHZhciBjZXJ0ID0ge307XG5cdGNlcnQuc2lnbmF0dXJlcyA9IHt9O1xuXHRjZXJ0LnNpZ25hdHVyZXMub3BlbnNzaCA9IHt9O1xuXG5cdGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoLm5vbmNlID0gc3NoYnVmLnJlYWRCdWZmZXIoKTtcblxuXHR2YXIga2V5ID0ge307XG5cdHZhciBwYXJ0cyA9IChrZXkucGFydHMgPSBbXSk7XG5cdGtleS50eXBlID0gZ2V0QWxnKGFsZ28pO1xuXG5cdHZhciBwYXJ0Q291bnQgPSBhbGdzLmluZm9ba2V5LnR5cGVdLnBhcnRzLmxlbmd0aDtcblx0d2hpbGUgKHBhcnRzLmxlbmd0aCA8IHBhcnRDb3VudClcblx0XHRwYXJ0cy5wdXNoKHNzaGJ1Zi5yZWFkUGFydCgpKTtcblx0YXNzZXJ0Lm9rKHBhcnRzLmxlbmd0aCA+PSAxLCAna2V5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcGFydCcpO1xuXG5cdHZhciBhbGdJbmZvID0gYWxncy5pbmZvW2tleS50eXBlXTtcblx0aWYgKGtleS50eXBlID09PSAnZWNkc2EnKSB7XG5cdFx0dmFyIHJlcyA9IEVDRFNBX0FMR08uZXhlYyhhbGdvKTtcblx0XHRhc3NlcnQub2socmVzICE9PSBudWxsKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocmVzWzFdLCBwYXJ0c1swXS5kYXRhLnRvU3RyaW5nKCkpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhbGdJbmZvLnBhcnRzLmxlbmd0aDsgKytpKSB7XG5cdFx0cGFydHNbaV0ubmFtZSA9IGFsZ0luZm8ucGFydHNbaV07XG5cdFx0aWYgKHBhcnRzW2ldLm5hbWUgIT09ICdjdXJ2ZScgJiZcblx0XHQgICAgYWxnSW5mby5ub3JtYWxpemUgIT09IGZhbHNlKSB7XG5cdFx0XHR2YXIgcCA9IHBhcnRzW2ldO1xuXHRcdFx0cC5kYXRhID0gdXRpbHMubXBOb3JtYWxpemUocC5kYXRhKTtcblx0XHR9XG5cdH1cblxuXHRjZXJ0LnN1YmplY3RLZXkgPSBuZXcgS2V5KGtleSk7XG5cblx0Y2VydC5zZXJpYWwgPSBzc2hidWYucmVhZEludDY0KCk7XG5cblx0dmFyIHR5cGUgPSBUWVBFU1tzc2hidWYucmVhZEludCgpXTtcblx0YXNzZXJ0LnN0cmluZyh0eXBlLCAndmFsaWQgY2VydCB0eXBlJyk7XG5cblx0Y2VydC5zaWduYXR1cmVzLm9wZW5zc2gua2V5SWQgPSBzc2hidWYucmVhZFN0cmluZygpO1xuXG5cdHZhciBwcmluY2lwYWxzID0gW107XG5cdHZhciBwYnVmID0gc3NoYnVmLnJlYWRCdWZmZXIoKTtcblx0dmFyIHBzc2hidWYgPSBuZXcgU1NIQnVmZmVyKHsgYnVmZmVyOiBwYnVmIH0pO1xuXHR3aGlsZSAoIXBzc2hidWYuYXRFbmQoKSlcblx0XHRwcmluY2lwYWxzLnB1c2gocHNzaGJ1Zi5yZWFkU3RyaW5nKCkpO1xuXHRpZiAocHJpbmNpcGFscy5sZW5ndGggPT09IDApXG5cdFx0cHJpbmNpcGFscyA9IFsnKiddO1xuXG5cdGNlcnQuc3ViamVjdHMgPSBwcmluY2lwYWxzLm1hcChmdW5jdGlvbiAocHIpIHtcblx0XHRpZiAodHlwZSA9PT0gJ3VzZXInKVxuXHRcdFx0cmV0dXJuIChJZGVudGl0eS5mb3JVc2VyKHByKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gJ2hvc3QnKVxuXHRcdFx0cmV0dXJuIChJZGVudGl0eS5mb3JIb3N0KHByKSk7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5rbm93biBpZGVudGl0eSB0eXBlICcgKyB0eXBlKSk7XG5cdH0pO1xuXG5cdGNlcnQudmFsaWRGcm9tID0gaW50NjRUb0RhdGUoc3NoYnVmLnJlYWRJbnQ2NCgpKTtcblx0Y2VydC52YWxpZFVudGlsID0gaW50NjRUb0RhdGUoc3NoYnVmLnJlYWRJbnQ2NCgpKTtcblxuXHR2YXIgZXh0cyA9IFtdO1xuXHR2YXIgZXh0YnVmID0gbmV3IFNTSEJ1ZmZlcih7IGJ1ZmZlcjogc3NoYnVmLnJlYWRCdWZmZXIoKSB9KTtcblx0dmFyIGV4dDtcblx0d2hpbGUgKCFleHRidWYuYXRFbmQoKSkge1xuXHRcdGV4dCA9IHsgY3JpdGljYWw6IHRydWUgfTtcblx0XHRleHQubmFtZSA9IGV4dGJ1Zi5yZWFkU3RyaW5nKCk7XG5cdFx0ZXh0LmRhdGEgPSBleHRidWYucmVhZEJ1ZmZlcigpO1xuXHRcdGV4dHMucHVzaChleHQpO1xuXHR9XG5cdGV4dGJ1ZiA9IG5ldyBTU0hCdWZmZXIoeyBidWZmZXI6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfSk7XG5cdHdoaWxlICghZXh0YnVmLmF0RW5kKCkpIHtcblx0XHRleHQgPSB7IGNyaXRpY2FsOiBmYWxzZSB9O1xuXHRcdGV4dC5uYW1lID0gZXh0YnVmLnJlYWRTdHJpbmcoKTtcblx0XHRleHQuZGF0YSA9IGV4dGJ1Zi5yZWFkQnVmZmVyKCk7XG5cdFx0ZXh0cy5wdXNoKGV4dCk7XG5cdH1cblx0Y2VydC5zaWduYXR1cmVzLm9wZW5zc2guZXh0cyA9IGV4dHM7XG5cblx0LyogcmVzZXJ2ZWQgKi9cblx0c3NoYnVmLnJlYWRCdWZmZXIoKTtcblxuXHR2YXIgc2lnbmluZ0tleUJ1ZiA9IHNzaGJ1Zi5yZWFkQnVmZmVyKCk7XG5cdGNlcnQuaXNzdWVyS2V5ID0gcmZjNDI1My5yZWFkKHNpZ25pbmdLZXlCdWYpO1xuXG5cdC8qXG5cdCAqIE9wZW5TU0ggY2VydHMgZG9uJ3QgZ2l2ZSB0aGUgaWRlbnRpdHkgb2YgdGhlIGlzc3VlciwganVzdCB0aGVpclxuXHQgKiBwdWJsaWMga2V5LiBTbywgd2UgdXNlIGFuIElkZW50aXR5IHRoYXQgbWF0Y2hlcyBhbnl0aGluZy4gVGhlXG5cdCAqIGlzU2lnbmVkQnkoKSBmdW5jdGlvbiB3aWxsIGxhdGVyIHRlbGwgeW91IGlmIHRoZSBrZXkgbWF0Y2hlcy5cblx0ICovXG5cdGNlcnQuaXNzdWVyID0gSWRlbnRpdHkuZm9ySG9zdCgnKionKTtcblxuXHR2YXIgc2lnQnVmID0gc3NoYnVmLnJlYWRCdWZmZXIoKTtcblx0Y2VydC5zaWduYXR1cmVzLm9wZW5zc2guc2lnbmF0dXJlID1cblx0ICAgIFNpZ25hdHVyZS5wYXJzZShzaWdCdWYsIGNlcnQuaXNzdWVyS2V5LnR5cGUsICdzc2gnKTtcblxuXHRpZiAocGFydGlhbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFydGlhbC5yZW1haW5kZXIgPSBzc2hidWYucmVtYWluZGVyKCk7XG5cdFx0cGFydGlhbC5jb25zdW1lZCA9IHNzaGJ1Zi5fb2Zmc2V0O1xuXHR9XG5cblx0cmV0dXJuIChuZXcgQ2VydGlmaWNhdGUoY2VydCkpO1xufVxuXG5mdW5jdGlvbiBpbnQ2NFRvRGF0ZShidWYpIHtcblx0dmFyIGkgPSBidWYucmVhZFVJbnQzMkJFKDApICogNDI5NDk2NzI5Njtcblx0aSArPSBidWYucmVhZFVJbnQzMkJFKDQpO1xuXHR2YXIgZCA9IG5ldyBEYXRlKCk7XG5cdGQuc2V0VGltZShpICogMTAwMCk7XG5cdGQuc291cmNlSW50NjQgPSBidWY7XG5cdHJldHVybiAoZCk7XG59XG5cbmZ1bmN0aW9uIGRhdGVUb0ludDY0KGRhdGUpIHtcblx0aWYgKGRhdGUuc291cmNlSW50NjQgIT09IHVuZGVmaW5lZClcblx0XHRyZXR1cm4gKGRhdGUuc291cmNlSW50NjQpO1xuXHR2YXIgaSA9IE1hdGgucm91bmQoZGF0ZS5nZXRUaW1lKCkgLyAxMDAwKTtcblx0dmFyIHVwcGVyID0gTWF0aC5mbG9vcihpIC8gNDI5NDk2NzI5Nik7XG5cdHZhciBsb3dlciA9IE1hdGguZmxvb3IoaSAlIDQyOTQ5NjcyOTYpO1xuXHR2YXIgYnVmID0gQnVmZmVyLmFsbG9jKDgpO1xuXHRidWYud3JpdGVVSW50MzJCRSh1cHBlciwgMCk7XG5cdGJ1Zi53cml0ZVVJbnQzMkJFKGxvd2VyLCA0KTtcblx0cmV0dXJuIChidWYpO1xufVxuXG5mdW5jdGlvbiBzaWduKGNlcnQsIGtleSkge1xuXHRpZiAoY2VydC5zaWduYXR1cmVzLm9wZW5zc2ggPT09IHVuZGVmaW5lZClcblx0XHRjZXJ0LnNpZ25hdHVyZXMub3BlbnNzaCA9IHt9O1xuXHR0cnkge1xuXHRcdHZhciBibG9iID0gdG9CdWZmZXIoY2VydCwgdHJ1ZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRkZWxldGUgKGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoKTtcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXHR2YXIgc2lnID0gY2VydC5zaWduYXR1cmVzLm9wZW5zc2g7XG5cdHZhciBoYXNoQWxnbyA9IHVuZGVmaW5lZDtcblx0aWYgKGtleS50eXBlID09PSAncnNhJyB8fCBrZXkudHlwZSA9PT0gJ2RzYScpXG5cdFx0aGFzaEFsZ28gPSAnc2hhMSc7XG5cdHZhciBzaWduZXIgPSBrZXkuY3JlYXRlU2lnbihoYXNoQWxnbyk7XG5cdHNpZ25lci53cml0ZShibG9iKTtcblx0c2lnLnNpZ25hdHVyZSA9IHNpZ25lci5zaWduKCk7XG5cdHJldHVybiAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25Bc3luYyhjZXJ0LCBzaWduZXIsIGRvbmUpIHtcblx0aWYgKGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoID09PSB1bmRlZmluZWQpXG5cdFx0Y2VydC5zaWduYXR1cmVzLm9wZW5zc2ggPSB7fTtcblx0dHJ5IHtcblx0XHR2YXIgYmxvYiA9IHRvQnVmZmVyKGNlcnQsIHRydWUpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0ZGVsZXRlIChjZXJ0LnNpZ25hdHVyZXMub3BlbnNzaCk7XG5cdFx0ZG9uZShlKTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIHNpZyA9IGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoO1xuXG5cdHNpZ25lcihibG9iLCBmdW5jdGlvbiAoZXJyLCBzaWduYXR1cmUpIHtcblx0XHRpZiAoZXJyKSB7XG5cdFx0XHRkb25lKGVycik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHQvKlxuXHRcdFx0ICogVGhpcyB3aWxsIHRocm93IGlmIHRoZSBzaWduYXR1cmUgaXNuJ3Qgb2YgYVxuXHRcdFx0ICogdHlwZS9hbGdvIHRoYXQgY2FuIGJlIHVzZWQgZm9yIFNTSC5cblx0XHRcdCAqL1xuXHRcdFx0c2lnbmF0dXJlLnRvQnVmZmVyKCdzc2gnKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRkb25lKGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRzaWcuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuXHRcdGRvbmUoKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlKGNlcnQsIG9wdGlvbnMpIHtcblx0aWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZClcblx0XHRvcHRpb25zID0ge307XG5cblx0dmFyIGJsb2IgPSB0b0J1ZmZlcihjZXJ0KTtcblx0dmFyIG91dCA9IGdldENlcnRUeXBlKGNlcnQuc3ViamVjdEtleSkgKyAnICcgKyBibG9iLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0aWYgKG9wdGlvbnMuY29tbWVudClcblx0XHRvdXQgPSBvdXQgKyAnICcgKyBvcHRpb25zLmNvbW1lbnQ7XG5cdHJldHVybiAob3V0KTtcbn1cblxuXG5mdW5jdGlvbiB0b0J1ZmZlcihjZXJ0LCBub1NpZykge1xuXHRhc3NlcnQub2JqZWN0KGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoLCAnc2lnbmF0dXJlIGZvciBvcGVuc3NoIGZvcm1hdCcpO1xuXHR2YXIgc2lnID0gY2VydC5zaWduYXR1cmVzLm9wZW5zc2g7XG5cblx0aWYgKHNpZy5ub25jZSA9PT0gdW5kZWZpbmVkKVxuXHRcdHNpZy5ub25jZSA9IGNyeXB0by5yYW5kb21CeXRlcygxNik7XG5cdHZhciBidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0YnVmLndyaXRlU3RyaW5nKGdldENlcnRUeXBlKGNlcnQuc3ViamVjdEtleSkpO1xuXHRidWYud3JpdGVCdWZmZXIoc2lnLm5vbmNlKTtcblxuXHR2YXIga2V5ID0gY2VydC5zdWJqZWN0S2V5O1xuXHR2YXIgYWxnSW5mbyA9IGFsZ3MuaW5mb1trZXkudHlwZV07XG5cdGFsZ0luZm8ucGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCkge1xuXHRcdGJ1Zi53cml0ZVBhcnQoa2V5LnBhcnRbcGFydF0pO1xuXHR9KTtcblxuXHRidWYud3JpdGVJbnQ2NChjZXJ0LnNlcmlhbCk7XG5cblx0dmFyIHR5cGUgPSBjZXJ0LnN1YmplY3RzWzBdLnR5cGU7XG5cdGFzc2VydC5ub3RTdHJpY3RFcXVhbCh0eXBlLCAndW5rbm93bicpO1xuXHRjZXJ0LnN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG5cdFx0YXNzZXJ0LnN0cmljdEVxdWFsKGlkLnR5cGUsIHR5cGUpO1xuXHR9KTtcblx0dHlwZSA9IFRZUEVTW3R5cGVdO1xuXHRidWYud3JpdGVJbnQodHlwZSk7XG5cblx0aWYgKHNpZy5rZXlJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0c2lnLmtleUlkID0gY2VydC5zdWJqZWN0c1swXS50eXBlICsgJ18nICtcblx0XHQgICAgKGNlcnQuc3ViamVjdHNbMF0udWlkIHx8IGNlcnQuc3ViamVjdHNbMF0uaG9zdG5hbWUpO1xuXHR9XG5cdGJ1Zi53cml0ZVN0cmluZyhzaWcua2V5SWQpO1xuXG5cdHZhciBzdWIgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0Y2VydC5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuXHRcdGlmICh0eXBlID09PSBUWVBFUy5ob3N0KVxuXHRcdFx0c3ViLndyaXRlU3RyaW5nKGlkLmhvc3RuYW1lKTtcblx0XHRlbHNlIGlmICh0eXBlID09PSBUWVBFUy51c2VyKVxuXHRcdFx0c3ViLndyaXRlU3RyaW5nKGlkLnVpZCk7XG5cdH0pO1xuXHRidWYud3JpdGVCdWZmZXIoc3ViLnRvQnVmZmVyKCkpO1xuXG5cdGJ1Zi53cml0ZUludDY0KGRhdGVUb0ludDY0KGNlcnQudmFsaWRGcm9tKSk7XG5cdGJ1Zi53cml0ZUludDY0KGRhdGVUb0ludDY0KGNlcnQudmFsaWRVbnRpbCkpO1xuXG5cdHZhciBleHRzID0gc2lnLmV4dHM7XG5cdGlmIChleHRzID09PSB1bmRlZmluZWQpXG5cdFx0ZXh0cyA9IFtdO1xuXG5cdHZhciBleHRidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChleHQpIHtcblx0XHRpZiAoZXh0LmNyaXRpY2FsICE9PSB0cnVlKVxuXHRcdFx0cmV0dXJuO1xuXHRcdGV4dGJ1Zi53cml0ZVN0cmluZyhleHQubmFtZSk7XG5cdFx0ZXh0YnVmLndyaXRlQnVmZmVyKGV4dC5kYXRhKTtcblx0fSk7XG5cdGJ1Zi53cml0ZUJ1ZmZlcihleHRidWYudG9CdWZmZXIoKSk7XG5cblx0ZXh0YnVmID0gbmV3IFNTSEJ1ZmZlcih7fSk7XG5cdGV4dHMuZm9yRWFjaChmdW5jdGlvbiAoZXh0KSB7XG5cdFx0aWYgKGV4dC5jcml0aWNhbCA9PT0gdHJ1ZSlcblx0XHRcdHJldHVybjtcblx0XHRleHRidWYud3JpdGVTdHJpbmcoZXh0Lm5hbWUpO1xuXHRcdGV4dGJ1Zi53cml0ZUJ1ZmZlcihleHQuZGF0YSk7XG5cdH0pO1xuXHRidWYud3JpdGVCdWZmZXIoZXh0YnVmLnRvQnVmZmVyKCkpO1xuXG5cdC8qIHJlc2VydmVkICovXG5cdGJ1Zi53cml0ZUJ1ZmZlcihCdWZmZXIuYWxsb2MoMCkpO1xuXG5cdHN1YiA9IHJmYzQyNTMud3JpdGUoY2VydC5pc3N1ZXJLZXkpO1xuXHRidWYud3JpdGVCdWZmZXIoc3ViKTtcblxuXHRpZiAoIW5vU2lnKVxuXHRcdGJ1Zi53cml0ZUJ1ZmZlcihzaWcuc2lnbmF0dXJlLnRvQnVmZmVyKCdzc2gnKSk7XG5cblx0cmV0dXJuIChidWYudG9CdWZmZXIoKSk7XG59XG5cbmZ1bmN0aW9uIGdldEFsZyhjZXJ0VHlwZSkge1xuXHRpZiAoY2VydFR5cGUgPT09ICdzc2gtcnNhLWNlcnQtdjAxQG9wZW5zc2guY29tJylcblx0XHRyZXR1cm4gKCdyc2EnKTtcblx0aWYgKGNlcnRUeXBlID09PSAnc3NoLWRzcy1jZXJ0LXYwMUBvcGVuc3NoLmNvbScpXG5cdFx0cmV0dXJuICgnZHNhJyk7XG5cdGlmIChjZXJ0VHlwZS5tYXRjaChFQ0RTQV9BTEdPKSlcblx0XHRyZXR1cm4gKCdlY2RzYScpO1xuXHRpZiAoY2VydFR5cGUgPT09ICdzc2gtZWQyNTUxOS1jZXJ0LXYwMUBvcGVuc3NoLmNvbScpXG5cdFx0cmV0dXJuICgnZWQyNTUxOScpO1xuXHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjZXJ0IHR5cGUgJyArIGNlcnRUeXBlKSk7XG59XG5cbmZ1bmN0aW9uIGdldENlcnRUeXBlKGtleSkge1xuXHRpZiAoa2V5LnR5cGUgPT09ICdyc2EnKVxuXHRcdHJldHVybiAoJ3NzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20nKTtcblx0aWYgKGtleS50eXBlID09PSAnZHNhJylcblx0XHRyZXR1cm4gKCdzc2gtZHNzLWNlcnQtdjAxQG9wZW5zc2guY29tJyk7XG5cdGlmIChrZXkudHlwZSA9PT0gJ2VjZHNhJylcblx0XHRyZXR1cm4gKCdlY2RzYS1zaGEyLScgKyBrZXkuY3VydmUgKyAnLWNlcnQtdjAxQG9wZW5zc2guY29tJyk7XG5cdGlmIChrZXkudHlwZSA9PT0gJ2VkMjU1MTknKVxuXHRcdHJldHVybiAoJ3NzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tJyk7XG5cdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGtleSB0eXBlICcgKyBrZXkudHlwZSkpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE3IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0dmVyaWZ5OiB2ZXJpZnksXG5cdHNpZ246IHNpZ24sXG5cdHNpZ25Bc3luYzogc2lnbkFzeW5jLFxuXHR3cml0ZTogd3JpdGVcbn07XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuLi9hbGdzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEtleSA9IHJlcXVpcmUoJy4uL2tleScpO1xudmFyIFByaXZhdGVLZXkgPSByZXF1aXJlKCcuLi9wcml2YXRlLWtleScpO1xudmFyIHBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG52YXIgSWRlbnRpdHkgPSByZXF1aXJlKCcuLi9pZGVudGl0eScpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4uL3NpZ25hdHVyZScpO1xudmFyIENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi4vY2VydGlmaWNhdGUnKTtcbnZhciBwa2NzOCA9IHJlcXVpcmUoJy4vcGtjczgnKTtcblxuLypcbiAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBSRkM1MjgwIChYLjUwOSkuXG4gKi9cblxuLyogSGVscGVyIHRvIHJlYWQgaW4gYSBzaW5nbGUgbXBpbnQgKi9cbmZ1bmN0aW9uIHJlYWRNUEludChkZXIsIG5tKSB7XG5cdGFzc2VydC5zdHJpY3RFcXVhbChkZXIucGVlaygpLCBhc24xLkJlci5JbnRlZ2VyLFxuXHQgICAgbm0gKyAnIGlzIG5vdCBhbiBJbnRlZ2VyJyk7XG5cdHJldHVybiAodXRpbHMubXBOb3JtYWxpemUoZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSkpKTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5KGNlcnQsIGtleSkge1xuXHR2YXIgc2lnID0gY2VydC5zaWduYXR1cmVzLng1MDk7XG5cdGFzc2VydC5vYmplY3Qoc2lnLCAneDUwOSBzaWduYXR1cmUnKTtcblxuXHR2YXIgYWxnUGFydHMgPSBzaWcuYWxnby5zcGxpdCgnLScpO1xuXHRpZiAoYWxnUGFydHNbMF0gIT09IGtleS50eXBlKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdHZhciBibG9iID0gc2lnLmNhY2hlO1xuXHRpZiAoYmxvYiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFyIGRlciA9IG5ldyBhc24xLkJlcldyaXRlcigpO1xuXHRcdHdyaXRlVEJTQ2VydChjZXJ0LCBkZXIpO1xuXHRcdGJsb2IgPSBkZXIuYnVmZmVyO1xuXHR9XG5cblx0dmFyIHZlcmlmaWVyID0ga2V5LmNyZWF0ZVZlcmlmeShhbGdQYXJ0c1sxXSk7XG5cdHZlcmlmaWVyLndyaXRlKGJsb2IpO1xuXHRyZXR1cm4gKHZlcmlmaWVyLnZlcmlmeShzaWcuc2lnbmF0dXJlKSk7XG59XG5cbmZ1bmN0aW9uIExvY2FsKGkpIHtcblx0cmV0dXJuIChhc24xLkJlci5Db250ZXh0IHwgYXNuMS5CZXIuQ29uc3RydWN0b3IgfCBpKTtcbn1cblxuZnVuY3Rpb24gQ29udGV4dChpKSB7XG5cdHJldHVybiAoYXNuMS5CZXIuQ29udGV4dCB8IGkpO1xufVxuXG52YXIgU0lHTl9BTEdTID0ge1xuXHQncnNhLW1kNSc6ICcxLjIuODQwLjExMzU0OS4xLjEuNCcsXG5cdCdyc2Etc2hhMSc6ICcxLjIuODQwLjExMzU0OS4xLjEuNScsXG5cdCdyc2Etc2hhMjU2JzogJzEuMi44NDAuMTEzNTQ5LjEuMS4xMScsXG5cdCdyc2Etc2hhMzg0JzogJzEuMi44NDAuMTEzNTQ5LjEuMS4xMicsXG5cdCdyc2Etc2hhNTEyJzogJzEuMi44NDAuMTEzNTQ5LjEuMS4xMycsXG5cdCdkc2Etc2hhMSc6ICcxLjIuODQwLjEwMDQwLjQuMycsXG5cdCdkc2Etc2hhMjU2JzogJzIuMTYuODQwLjEuMTAxLjMuNC4zLjInLFxuXHQnZWNkc2Etc2hhMSc6ICcxLjIuODQwLjEwMDQ1LjQuMScsXG5cdCdlY2RzYS1zaGEyNTYnOiAnMS4yLjg0MC4xMDA0NS40LjMuMicsXG5cdCdlY2RzYS1zaGEzODQnOiAnMS4yLjg0MC4xMDA0NS40LjMuMycsXG5cdCdlY2RzYS1zaGE1MTInOiAnMS4yLjg0MC4xMDA0NS40LjMuNCcsXG5cdCdlZDI1NTE5LXNoYTUxMic6ICcxLjMuMTAxLjExMidcbn07XG5PYmplY3Qua2V5cyhTSUdOX0FMR1MpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0U0lHTl9BTEdTW1NJR05fQUxHU1trXV0gPSBrO1xufSk7XG5TSUdOX0FMR1NbJzEuMy4xNC4zLjIuMyddID0gJ3JzYS1tZDUnO1xuU0lHTl9BTEdTWycxLjMuMTQuMy4yLjI5J10gPSAncnNhLXNoYTEnO1xuXG52YXIgRVhUUyA9IHtcblx0J2lzc3VlcktleUlkJzogJzIuNS4yOS4zNScsXG5cdCdhbHROYW1lJzogJzIuNS4yOS4xNycsXG5cdCdiYXNpY0NvbnN0cmFpbnRzJzogJzIuNS4yOS4xOScsXG5cdCdrZXlVc2FnZSc6ICcyLjUuMjkuMTUnLFxuXHQnZXh0S2V5VXNhZ2UnOiAnMi41LjI5LjM3J1xufTtcblxuZnVuY3Rpb24gcmVhZChidWYsIG9wdGlvbnMpIHtcblx0aWYgKHR5cGVvZiAoYnVmKSA9PT0gJ3N0cmluZycpIHtcblx0XHRidWYgPSBCdWZmZXIuZnJvbShidWYsICdiaW5hcnknKTtcblx0fVxuXHRhc3NlcnQuYnVmZmVyKGJ1ZiwgJ2J1ZicpO1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJSZWFkZXIoYnVmKTtcblxuXHRkZXIucmVhZFNlcXVlbmNlKCk7XG5cdGlmIChNYXRoLmFicyhkZXIubGVuZ3RoIC0gZGVyLnJlbWFpbikgPiAxKSB7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignREVSIHNlcXVlbmNlIGRvZXMgbm90IGNvbnRhaW4gd2hvbGUgYnl0ZSAnICtcblx0XHQgICAgJ3N0cmVhbScpKTtcblx0fVxuXG5cdHZhciB0YnNTdGFydCA9IGRlci5vZmZzZXQ7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0dmFyIHNpZ09mZnNldCA9IGRlci5vZmZzZXQgKyBkZXIubGVuZ3RoO1xuXHR2YXIgdGJzRW5kID0gc2lnT2Zmc2V0O1xuXG5cdGlmIChkZXIucGVlaygpID09PSBMb2NhbCgwKSkge1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoTG9jYWwoMCkpO1xuXHRcdHZhciB2ZXJzaW9uID0gZGVyLnJlYWRJbnQoKTtcblx0XHRhc3NlcnQub2sodmVyc2lvbiA8PSAzLFxuXHRcdCAgICAnb25seSB4LjUwOSB2ZXJzaW9ucyB1cCB0byB2MyBzdXBwb3J0ZWQnKTtcblx0fVxuXG5cdHZhciBjZXJ0ID0ge307XG5cdGNlcnQuc2lnbmF0dXJlcyA9IHt9O1xuXHR2YXIgc2lnID0gKGNlcnQuc2lnbmF0dXJlcy54NTA5ID0ge30pO1xuXHRzaWcuZXh0cmFzID0ge307XG5cblx0Y2VydC5zZXJpYWwgPSByZWFkTVBJbnQoZGVyLCAnc2VyaWFsJyk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHR2YXIgYWZ0ZXIgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0dmFyIGNlcnRBbGdPaWQgPSBkZXIucmVhZE9JRCgpO1xuXHR2YXIgY2VydEFsZyA9IFNJR05fQUxHU1tjZXJ0QWxnT2lkXTtcblx0aWYgKGNlcnRBbGcgPT09IHVuZGVmaW5lZClcblx0XHR0aHJvdyAobmV3IEVycm9yKCd1bmtub3duIHNpZ25hdHVyZSBhbGdvcml0aG0gJyArIGNlcnRBbGdPaWQpKTtcblxuXHRkZXIuX29mZnNldCA9IGFmdGVyO1xuXHRjZXJ0Lmlzc3VlciA9IElkZW50aXR5LnBhcnNlQXNuMShkZXIpO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0Y2VydC52YWxpZEZyb20gPSByZWFkRGF0ZShkZXIpO1xuXHRjZXJ0LnZhbGlkVW50aWwgPSByZWFkRGF0ZShkZXIpO1xuXG5cdGNlcnQuc3ViamVjdHMgPSBbSWRlbnRpdHkucGFyc2VBc24xKGRlcildO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0YWZ0ZXIgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0Y2VydC5zdWJqZWN0S2V5ID0gcGtjczgucmVhZFBrY3M4KHVuZGVmaW5lZCwgJ3B1YmxpYycsIGRlcik7XG5cdGRlci5fb2Zmc2V0ID0gYWZ0ZXI7XG5cblx0LyogaXNzdWVyVW5pcXVlSUQgKi9cblx0aWYgKGRlci5wZWVrKCkgPT09IExvY2FsKDEpKSB7XG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZShMb2NhbCgxKSk7XG5cdFx0c2lnLmV4dHJhcy5pc3N1ZXJVbmlxdWVJRCA9XG5cdFx0ICAgIGJ1Zi5zbGljZShkZXIub2Zmc2V0LCBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aCk7XG5cdFx0ZGVyLl9vZmZzZXQgKz0gZGVyLmxlbmd0aDtcblx0fVxuXG5cdC8qIHN1YmplY3RVbmlxdWVJRCAqL1xuXHRpZiAoZGVyLnBlZWsoKSA9PT0gTG9jYWwoMikpIHtcblx0XHRkZXIucmVhZFNlcXVlbmNlKExvY2FsKDIpKTtcblx0XHRzaWcuZXh0cmFzLnN1YmplY3RVbmlxdWVJRCA9XG5cdFx0ICAgIGJ1Zi5zbGljZShkZXIub2Zmc2V0LCBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aCk7XG5cdFx0ZGVyLl9vZmZzZXQgKz0gZGVyLmxlbmd0aDtcblx0fVxuXG5cdC8qIGV4dGVuc2lvbnMgKi9cblx0aWYgKGRlci5wZWVrKCkgPT09IExvY2FsKDMpKSB7XG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZShMb2NhbCgzKSk7XG5cdFx0dmFyIGV4dEVuZCA9IGRlci5vZmZzZXQgKyBkZXIubGVuZ3RoO1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoKTtcblxuXHRcdHdoaWxlIChkZXIub2Zmc2V0IDwgZXh0RW5kKVxuXHRcdFx0cmVhZEV4dGVuc2lvbihjZXJ0LCBidWYsIGRlcik7XG5cblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwoZGVyLm9mZnNldCwgZXh0RW5kKTtcblx0fVxuXG5cdGFzc2VydC5zdHJpY3RFcXVhbChkZXIub2Zmc2V0LCBzaWdPZmZzZXQpO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0YWZ0ZXIgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0dmFyIHNpZ0FsZ09pZCA9IGRlci5yZWFkT0lEKCk7XG5cdHZhciBzaWdBbGcgPSBTSUdOX0FMR1Nbc2lnQWxnT2lkXTtcblx0aWYgKHNpZ0FsZyA9PT0gdW5kZWZpbmVkKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ3Vua25vd24gc2lnbmF0dXJlIGFsZ29yaXRobSAnICsgc2lnQWxnT2lkKSk7XG5cdGRlci5fb2Zmc2V0ID0gYWZ0ZXI7XG5cblx0dmFyIHNpZ0RhdGEgPSBkZXIucmVhZFN0cmluZyhhc24xLkJlci5CaXRTdHJpbmcsIHRydWUpO1xuXHRpZiAoc2lnRGF0YVswXSA9PT0gMClcblx0XHRzaWdEYXRhID0gc2lnRGF0YS5zbGljZSgxKTtcblx0dmFyIGFsZ1BhcnRzID0gc2lnQWxnLnNwbGl0KCctJyk7XG5cblx0c2lnLnNpZ25hdHVyZSA9IFNpZ25hdHVyZS5wYXJzZShzaWdEYXRhLCBhbGdQYXJ0c1swXSwgJ2FzbjEnKTtcblx0c2lnLnNpZ25hdHVyZS5oYXNoQWxnb3JpdGhtID0gYWxnUGFydHNbMV07XG5cdHNpZy5hbGdvID0gc2lnQWxnO1xuXHRzaWcuY2FjaGUgPSBidWYuc2xpY2UodGJzU3RhcnQsIHRic0VuZCk7XG5cblx0cmV0dXJuIChuZXcgQ2VydGlmaWNhdGUoY2VydCkpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZShkZXIpIHtcblx0aWYgKGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLlVUQ1RpbWUpIHtcblx0XHRyZXR1cm4gKHV0Y1RpbWVUb0RhdGUoZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuVVRDVGltZSkpKTtcblx0fSBlbHNlIGlmIChkZXIucGVlaygpID09PSBhc24xLkJlci5HZW5lcmFsaXplZFRpbWUpIHtcblx0XHRyZXR1cm4gKGdUaW1lVG9EYXRlKGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkdlbmVyYWxpemVkVGltZSkpKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRlIGZvcm1hdCcpKTtcblx0fVxufVxuXG5mdW5jdGlvbiB3cml0ZURhdGUoZGVyLCBkYXRlKSB7XG5cdGlmIChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgPj0gMjA1MCB8fCBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgPCAxOTUwKSB7XG5cdFx0ZGVyLndyaXRlU3RyaW5nKGRhdGVUb0dUaW1lKGRhdGUpLCBhc24xLkJlci5HZW5lcmFsaXplZFRpbWUpO1xuXHR9IGVsc2Uge1xuXHRcdGRlci53cml0ZVN0cmluZyhkYXRlVG9VVENUaW1lKGRhdGUpLCBhc24xLkJlci5VVENUaW1lKTtcblx0fVxufVxuXG4vKiBSRkM1MjgwLCBzZWN0aW9uIDQuMi4xLjYgKEdlbmVyYWxOYW1lIHR5cGUpICovXG52YXIgQUxUTkFNRSA9IHtcblx0T3RoZXJOYW1lOiBMb2NhbCgwKSxcblx0UkZDODIyTmFtZTogQ29udGV4dCgxKSxcblx0RE5TTmFtZTogQ29udGV4dCgyKSxcblx0WDQwMEFkZHJlc3M6IExvY2FsKDMpLFxuXHREaXJlY3RvcnlOYW1lOiBMb2NhbCg0KSxcblx0RURJUGFydHlOYW1lOiBMb2NhbCg1KSxcblx0VVJJOiBDb250ZXh0KDYpLFxuXHRJUEFkZHJlc3M6IENvbnRleHQoNyksXG5cdE9JRDogQ29udGV4dCg4KVxufTtcblxuLyogUkZDNTI4MCwgc2VjdGlvbiA0LjIuMS4xMiAoS2V5UHVycG9zZUlkKSAqL1xudmFyIEVYVFBVUlBPU0UgPSB7XG5cdCdzZXJ2ZXJBdXRoJzogJzEuMy42LjEuNS41LjcuMy4xJyxcblx0J2NsaWVudEF1dGgnOiAnMS4zLjYuMS41LjUuNy4zLjInLFxuXHQnY29kZVNpZ25pbmcnOiAnMS4zLjYuMS41LjUuNy4zLjMnLFxuXG5cdC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L29pZC1kb2NzL2Jsb2IvbWFzdGVyL3Jvb3QubWQgKi9cblx0J2pveWVudERvY2tlcic6ICcxLjMuNi4xLjQuMS4zODY3OC4xLjQuMScsXG5cdCdqb3llbnRDbW9uJzogJzEuMy42LjEuNC4xLjM4Njc4LjEuNC4yJ1xufTtcbnZhciBFWFRQVVJQT1NFX1JFViA9IHt9O1xuT2JqZWN0LmtleXMoRVhUUFVSUE9TRSkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHRFWFRQVVJQT1NFX1JFVltFWFRQVVJQT1NFW2tdXSA9IGs7XG59KTtcblxudmFyIEtFWVVTRUJJVFMgPSBbXG5cdCdzaWduYXR1cmUnLCAnaWRlbnRpdHknLCAna2V5RW5jcnlwdGlvbicsXG5cdCdlbmNyeXB0aW9uJywgJ2tleUFncmVlbWVudCcsICdjYScsICdjcmwnXG5dO1xuXG5mdW5jdGlvbiByZWFkRXh0ZW5zaW9uKGNlcnQsIGJ1ZiwgZGVyKSB7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0dmFyIGFmdGVyID0gZGVyLm9mZnNldCArIGRlci5sZW5ndGg7XG5cdHZhciBleHRJZCA9IGRlci5yZWFkT0lEKCk7XG5cdHZhciBpZDtcblx0dmFyIHNpZyA9IGNlcnQuc2lnbmF0dXJlcy54NTA5O1xuXHRpZiAoIXNpZy5leHRyYXMuZXh0cylcblx0XHRzaWcuZXh0cmFzLmV4dHMgPSBbXTtcblxuXHR2YXIgY3JpdGljYWw7XG5cdGlmIChkZXIucGVlaygpID09PSBhc24xLkJlci5Cb29sZWFuKVxuXHRcdGNyaXRpY2FsID0gZGVyLnJlYWRCb29sZWFuKCk7XG5cblx0c3dpdGNoIChleHRJZCkge1xuXHRjYXNlIChFWFRTLmJhc2ljQ29uc3RyYWludHMpOlxuXHRcdGRlci5yZWFkU2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0XHR2YXIgYmNFbmQgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0XHR2YXIgY2EgPSBmYWxzZTtcblx0XHRpZiAoZGVyLnBlZWsoKSA9PT0gYXNuMS5CZXIuQm9vbGVhbilcblx0XHRcdGNhID0gZGVyLnJlYWRCb29sZWFuKCk7XG5cdFx0aWYgKGNlcnQucHVycG9zZXMgPT09IHVuZGVmaW5lZClcblx0XHRcdGNlcnQucHVycG9zZXMgPSBbXTtcblx0XHRpZiAoY2EgPT09IHRydWUpXG5cdFx0XHRjZXJ0LnB1cnBvc2VzLnB1c2goJ2NhJyk7XG5cdFx0dmFyIGJjID0geyBvaWQ6IGV4dElkLCBjcml0aWNhbDogY3JpdGljYWwgfTtcblx0XHRpZiAoZGVyLm9mZnNldCA8IGJjRW5kICYmIGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLkludGVnZXIpXG5cdFx0XHRiYy5wYXRoTGVuID0gZGVyLnJlYWRJbnQoKTtcblx0XHRzaWcuZXh0cmFzLmV4dHMucHVzaChiYyk7XG5cdFx0YnJlYWs7XG5cdGNhc2UgKEVYVFMuZXh0S2V5VXNhZ2UpOlxuXHRcdGRlci5yZWFkU2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0XHRpZiAoY2VydC5wdXJwb3NlcyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0Y2VydC5wdXJwb3NlcyA9IFtdO1xuXHRcdHZhciBla0VuZCA9IGRlci5vZmZzZXQgKyBkZXIubGVuZ3RoO1xuXHRcdHdoaWxlIChkZXIub2Zmc2V0IDwgZWtFbmQpIHtcblx0XHRcdHZhciBvaWQgPSBkZXIucmVhZE9JRCgpO1xuXHRcdFx0Y2VydC5wdXJwb3Nlcy5wdXNoKEVYVFBVUlBPU0VfUkVWW29pZF0gfHwgb2lkKTtcblx0XHR9XG5cdFx0Lypcblx0XHQgKiBUaGlzIGlzIGEgYml0IG9mIGEgaGFjazogaW4gdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIGNlcnRcblx0XHQgKiB0aGF0J3Mgb25seSBhbGxvd2VkIHRvIGRvIHNlcnZlckF1dGggb3IgY2xpZW50QXV0aCAoYW5kIG5vdFxuXHRcdCAqIHRoZSBvdGhlciksIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGFsbCBvdXIgU3ViamVjdHMgYXJlIG9mXG5cdFx0ICogdGhlIHJpZ2h0IHR5cGUuIEJ1dCB3ZSBhbHJlYWR5IHBhcnNlZCBvdXIgU3ViamVjdHMgYW5kXG5cdFx0ICogZGVjaWRlZCBpZiB0aGV5IHdlcmUgaG9zdHMgb3IgdXNlcnMgZWFybGllciAoc2luY2UgaXQgYXBwZWFyc1xuXHRcdCAqIGZpcnN0IGluIHRoZSBjZXJ0KS5cblx0XHQgKlxuXHRcdCAqIFNvIHdlIGdvIHRocm91Z2ggYW5kIG11dGF0ZSB0aGVtIGludG8gdGhlIHJpZ2h0IGtpbmQgaGVyZSBpZlxuXHRcdCAqIGl0IGRvZXNuJ3QgbWF0Y2guIFRoaXMgbWlnaHQgbm90IGJlIGh1Z2VseSBiZW5lZmljaWFsLCBhcyBpdFxuXHRcdCAqIHNlZW1zIHRoYXQgc2luZ2xlLXB1cnBvc2UgY2VydHMgYXJlIG5vdCBvZnRlbiBzZWVuIGluIHRoZVxuXHRcdCAqIHdpbGQuXG5cdFx0ICovXG5cdFx0aWYgKGNlcnQucHVycG9zZXMuaW5kZXhPZignc2VydmVyQXV0aCcpICE9PSAtMSAmJlxuXHRcdCAgICBjZXJ0LnB1cnBvc2VzLmluZGV4T2YoJ2NsaWVudEF1dGgnKSA9PT0gLTEpIHtcblx0XHRcdGNlcnQuc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoaWRlKSB7XG5cdFx0XHRcdGlmIChpZGUudHlwZSAhPT0gJ2hvc3QnKSB7XG5cdFx0XHRcdFx0aWRlLnR5cGUgPSAnaG9zdCc7XG5cdFx0XHRcdFx0aWRlLmhvc3RuYW1lID0gaWRlLnVpZCB8fFxuXHRcdFx0XHRcdCAgICBpZGUuZW1haWwgfHxcblx0XHRcdFx0XHQgICAgaWRlLmNvbXBvbmVudHNbMF0udmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAoY2VydC5wdXJwb3Nlcy5pbmRleE9mKCdjbGllbnRBdXRoJykgIT09IC0xICYmXG5cdFx0ICAgIGNlcnQucHVycG9zZXMuaW5kZXhPZignc2VydmVyQXV0aCcpID09PSAtMSkge1xuXHRcdFx0Y2VydC5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChpZGUpIHtcblx0XHRcdFx0aWYgKGlkZS50eXBlICE9PSAndXNlcicpIHtcblx0XHRcdFx0XHRpZGUudHlwZSA9ICd1c2VyJztcblx0XHRcdFx0XHRpZGUudWlkID0gaWRlLmhvc3RuYW1lIHx8XG5cdFx0XHRcdFx0ICAgIGlkZS5lbWFpbCB8fFxuXHRcdFx0XHRcdCAgICBpZGUuY29tcG9uZW50c1swXS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHNpZy5leHRyYXMuZXh0cy5wdXNoKHsgb2lkOiBleHRJZCwgY3JpdGljYWw6IGNyaXRpY2FsIH0pO1xuXHRcdGJyZWFrO1xuXHRjYXNlIChFWFRTLmtleVVzYWdlKTpcblx0XHRkZXIucmVhZFNlcXVlbmNlKGFzbjEuQmVyLk9jdGV0U3RyaW5nKTtcblx0XHR2YXIgYml0cyA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkJpdFN0cmluZywgdHJ1ZSk7XG5cdFx0dmFyIHNldEJpdHMgPSByZWFkQml0RmllbGQoYml0cywgS0VZVVNFQklUUyk7XG5cdFx0c2V0Qml0cy5mb3JFYWNoKGZ1bmN0aW9uIChiaXQpIHtcblx0XHRcdGlmIChjZXJ0LnB1cnBvc2VzID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdGNlcnQucHVycG9zZXMgPSBbXTtcblx0XHRcdGlmIChjZXJ0LnB1cnBvc2VzLmluZGV4T2YoYml0KSA9PT0gLTEpXG5cdFx0XHRcdGNlcnQucHVycG9zZXMucHVzaChiaXQpO1xuXHRcdH0pO1xuXHRcdHNpZy5leHRyYXMuZXh0cy5wdXNoKHsgb2lkOiBleHRJZCwgY3JpdGljYWw6IGNyaXRpY2FsLFxuXHRcdCAgICBiaXRzOiBiaXRzIH0pO1xuXHRcdGJyZWFrO1xuXHRjYXNlIChFWFRTLmFsdE5hbWUpOlxuXHRcdGRlci5yZWFkU2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0XHR2YXIgYWVFbmQgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0XHR3aGlsZSAoZGVyLm9mZnNldCA8IGFlRW5kKSB7XG5cdFx0XHRzd2l0Y2ggKGRlci5wZWVrKCkpIHtcblx0XHRcdGNhc2UgQUxUTkFNRS5PdGhlck5hbWU6XG5cdFx0XHRjYXNlIEFMVE5BTUUuRURJUGFydHlOYW1lOlxuXHRcdFx0XHRkZXIucmVhZFNlcXVlbmNlKCk7XG5cdFx0XHRcdGRlci5fb2Zmc2V0ICs9IGRlci5sZW5ndGg7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBBTFROQU1FLk9JRDpcblx0XHRcdFx0ZGVyLnJlYWRPSUQoQUxUTkFNRS5PSUQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgQUxUTkFNRS5SRkM4MjJOYW1lOlxuXHRcdFx0XHQvKiBSRkM4MjIgc3BlY2lmaWVzIGVtYWlsIGFkZHJlc3NlcyAqL1xuXHRcdFx0XHR2YXIgZW1haWwgPSBkZXIucmVhZFN0cmluZyhBTFROQU1FLlJGQzgyMk5hbWUpO1xuXHRcdFx0XHRpZCA9IElkZW50aXR5LmZvckVtYWlsKGVtYWlsKTtcblx0XHRcdFx0aWYgKCFjZXJ0LnN1YmplY3RzWzBdLmVxdWFscyhpZCkpXG5cdFx0XHRcdFx0Y2VydC5zdWJqZWN0cy5wdXNoKGlkKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIEFMVE5BTUUuRGlyZWN0b3J5TmFtZTpcblx0XHRcdFx0ZGVyLnJlYWRTZXF1ZW5jZShBTFROQU1FLkRpcmVjdG9yeU5hbWUpO1xuXHRcdFx0XHRpZCA9IElkZW50aXR5LnBhcnNlQXNuMShkZXIpO1xuXHRcdFx0XHRpZiAoIWNlcnQuc3ViamVjdHNbMF0uZXF1YWxzKGlkKSlcblx0XHRcdFx0XHRjZXJ0LnN1YmplY3RzLnB1c2goaWQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgQUxUTkFNRS5ETlNOYW1lOlxuXHRcdFx0XHR2YXIgaG9zdCA9IGRlci5yZWFkU3RyaW5nKFxuXHRcdFx0XHQgICAgQUxUTkFNRS5ETlNOYW1lKTtcblx0XHRcdFx0aWQgPSBJZGVudGl0eS5mb3JIb3N0KGhvc3QpO1xuXHRcdFx0XHRpZiAoIWNlcnQuc3ViamVjdHNbMF0uZXF1YWxzKGlkKSlcblx0XHRcdFx0XHRjZXJ0LnN1YmplY3RzLnB1c2goaWQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGRlci5yZWFkU3RyaW5nKGRlci5wZWVrKCkpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0c2lnLmV4dHJhcy5leHRzLnB1c2goeyBvaWQ6IGV4dElkLCBjcml0aWNhbDogY3JpdGljYWwgfSk7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0c2lnLmV4dHJhcy5leHRzLnB1c2goe1xuXHRcdFx0b2lkOiBleHRJZCxcblx0XHRcdGNyaXRpY2FsOiBjcml0aWNhbCxcblx0XHRcdGRhdGE6IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKVxuXHRcdH0pO1xuXHRcdGJyZWFrO1xuXHR9XG5cblx0ZGVyLl9vZmZzZXQgPSBhZnRlcjtcbn1cblxudmFyIFVUQ1RJTUVfUkUgPVxuICAgIC9eKFswLTldezJ9KShbMC05XXsyfSkoWzAtOV17Mn0pKFswLTldezJ9KShbMC05XXsyfSkoWzAtOV17Mn0pP1okLztcbmZ1bmN0aW9uIHV0Y1RpbWVUb0RhdGUodCkge1xuXHR2YXIgbSA9IHQubWF0Y2goVVRDVElNRV9SRSk7XG5cdGFzc2VydC5vayhtLCAndGltZXN0YW1wcyBtdXN0IGJlIGluIFVUQycpO1xuXHR2YXIgZCA9IG5ldyBEYXRlKCk7XG5cblx0dmFyIHRoaXNZZWFyID0gZC5nZXRVVENGdWxsWWVhcigpO1xuXHR2YXIgY2VudHVyeSA9IE1hdGguZmxvb3IodGhpc1llYXIgLyAxMDApICogMTAwO1xuXG5cdHZhciB5ZWFyID0gcGFyc2VJbnQobVsxXSwgMTApO1xuXHRpZiAodGhpc1llYXIgJSAxMDAgPCA1MCAmJiB5ZWFyID49IDYwKVxuXHRcdHllYXIgKz0gKGNlbnR1cnkgLSAxKTtcblx0ZWxzZVxuXHRcdHllYXIgKz0gY2VudHVyeTtcblx0ZC5zZXRVVENGdWxsWWVhcih5ZWFyLCBwYXJzZUludChtWzJdLCAxMCkgLSAxLCBwYXJzZUludChtWzNdLCAxMCkpO1xuXHRkLnNldFVUQ0hvdXJzKHBhcnNlSW50KG1bNF0sIDEwKSwgcGFyc2VJbnQobVs1XSwgMTApKTtcblx0aWYgKG1bNl0gJiYgbVs2XS5sZW5ndGggPiAwKVxuXHRcdGQuc2V0VVRDU2Vjb25kcyhwYXJzZUludChtWzZdLCAxMCkpO1xuXHRyZXR1cm4gKGQpO1xufVxuXG52YXIgR1RJTUVfUkUgPVxuICAgIC9eKFswLTldezR9KShbMC05XXsyfSkoWzAtOV17Mn0pKFswLTldezJ9KShbMC05XXsyfSkoWzAtOV17Mn0pP1okLztcbmZ1bmN0aW9uIGdUaW1lVG9EYXRlKHQpIHtcblx0dmFyIG0gPSB0Lm1hdGNoKEdUSU1FX1JFKTtcblx0YXNzZXJ0Lm9rKG0pO1xuXHR2YXIgZCA9IG5ldyBEYXRlKCk7XG5cblx0ZC5zZXRVVENGdWxsWWVhcihwYXJzZUludChtWzFdLCAxMCksIHBhcnNlSW50KG1bMl0sIDEwKSAtIDEsXG5cdCAgICBwYXJzZUludChtWzNdLCAxMCkpO1xuXHRkLnNldFVUQ0hvdXJzKHBhcnNlSW50KG1bNF0sIDEwKSwgcGFyc2VJbnQobVs1XSwgMTApKTtcblx0aWYgKG1bNl0gJiYgbVs2XS5sZW5ndGggPiAwKVxuXHRcdGQuc2V0VVRDU2Vjb25kcyhwYXJzZUludChtWzZdLCAxMCkpO1xuXHRyZXR1cm4gKGQpO1xufVxuXG5mdW5jdGlvbiB6ZXJvUGFkKG4sIG0pIHtcblx0aWYgKG0gPT09IHVuZGVmaW5lZClcblx0XHRtID0gMjtcblx0dmFyIHMgPSAnJyArIG47XG5cdHdoaWxlIChzLmxlbmd0aCA8IG0pXG5cdFx0cyA9ICcwJyArIHM7XG5cdHJldHVybiAocyk7XG59XG5cbmZ1bmN0aW9uIGRhdGVUb1VUQ1RpbWUoZCkge1xuXHR2YXIgcyA9ICcnO1xuXHRzICs9IHplcm9QYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpO1xuXHRzICs9IHplcm9QYWQoZC5nZXRVVENEYXRlKCkpO1xuXHRzICs9IHplcm9QYWQoZC5nZXRVVENIb3VycygpKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDTWludXRlcygpKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDU2Vjb25kcygpKTtcblx0cyArPSAnWic7XG5cdHJldHVybiAocyk7XG59XG5cbmZ1bmN0aW9uIGRhdGVUb0dUaW1lKGQpIHtcblx0dmFyIHMgPSAnJztcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDRnVsbFllYXIoKSwgNCk7XG5cdHMgKz0gemVyb1BhZChkLmdldFVUQ01vbnRoKCkgKyAxKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDRGF0ZSgpKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDSG91cnMoKSk7XG5cdHMgKz0gemVyb1BhZChkLmdldFVUQ01pbnV0ZXMoKSk7XG5cdHMgKz0gemVyb1BhZChkLmdldFVUQ1NlY29uZHMoKSk7XG5cdHMgKz0gJ1onO1xuXHRyZXR1cm4gKHMpO1xufVxuXG5mdW5jdGlvbiBzaWduKGNlcnQsIGtleSkge1xuXHRpZiAoY2VydC5zaWduYXR1cmVzLng1MDkgPT09IHVuZGVmaW5lZClcblx0XHRjZXJ0LnNpZ25hdHVyZXMueDUwOSA9IHt9O1xuXHR2YXIgc2lnID0gY2VydC5zaWduYXR1cmVzLng1MDk7XG5cblx0c2lnLmFsZ28gPSBrZXkudHlwZSArICctJyArIGtleS5kZWZhdWx0SGFzaEFsZ29yaXRobSgpO1xuXHRpZiAoU0lHTl9BTEdTW3NpZy5hbGdvXSA9PT0gdW5kZWZpbmVkKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblx0d3JpdGVUQlNDZXJ0KGNlcnQsIGRlcik7XG5cdHZhciBibG9iID0gZGVyLmJ1ZmZlcjtcblx0c2lnLmNhY2hlID0gYmxvYjtcblxuXHR2YXIgc2lnbmVyID0ga2V5LmNyZWF0ZVNpZ24oKTtcblx0c2lnbmVyLndyaXRlKGJsb2IpO1xuXHRjZXJ0LnNpZ25hdHVyZXMueDUwOS5zaWduYXR1cmUgPSBzaWduZXIuc2lnbigpO1xuXG5cdHJldHVybiAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25Bc3luYyhjZXJ0LCBzaWduZXIsIGRvbmUpIHtcblx0aWYgKGNlcnQuc2lnbmF0dXJlcy54NTA5ID09PSB1bmRlZmluZWQpXG5cdFx0Y2VydC5zaWduYXR1cmVzLng1MDkgPSB7fTtcblx0dmFyIHNpZyA9IGNlcnQuc2lnbmF0dXJlcy54NTA5O1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblx0d3JpdGVUQlNDZXJ0KGNlcnQsIGRlcik7XG5cdHZhciBibG9iID0gZGVyLmJ1ZmZlcjtcblx0c2lnLmNhY2hlID0gYmxvYjtcblxuXHRzaWduZXIoYmxvYiwgZnVuY3Rpb24gKGVyciwgc2lnbmF0dXJlKSB7XG5cdFx0aWYgKGVycikge1xuXHRcdFx0ZG9uZShlcnIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRzaWcuYWxnbyA9IHNpZ25hdHVyZS50eXBlICsgJy0nICsgc2lnbmF0dXJlLmhhc2hBbGdvcml0aG07XG5cdFx0aWYgKFNJR05fQUxHU1tzaWcuYWxnb10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZG9uZShuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmluZyBhbGdvcml0aG0gXCInICtcblx0XHRcdCAgICBzaWcuYWxnbyArICdcIicpKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0c2lnLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcblx0XHRkb25lKCk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZShjZXJ0LCBvcHRpb25zKSB7XG5cdHZhciBzaWcgPSBjZXJ0LnNpZ25hdHVyZXMueDUwOTtcblx0YXNzZXJ0Lm9iamVjdChzaWcsICd4NTA5IHNpZ25hdHVyZScpO1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblx0ZGVyLnN0YXJ0U2VxdWVuY2UoKTtcblx0aWYgKHNpZy5jYWNoZSkge1xuXHRcdGRlci5fZW5zdXJlKHNpZy5jYWNoZS5sZW5ndGgpO1xuXHRcdHNpZy5jYWNoZS5jb3B5KGRlci5fYnVmLCBkZXIuX29mZnNldCk7XG5cdFx0ZGVyLl9vZmZzZXQgKz0gc2lnLmNhY2hlLmxlbmd0aDtcblx0fSBlbHNlIHtcblx0XHR3cml0ZVRCU0NlcnQoY2VydCwgZGVyKTtcblx0fVxuXG5cdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdGRlci53cml0ZU9JRChTSUdOX0FMR1Nbc2lnLmFsZ29dKTtcblx0aWYgKHNpZy5hbGdvLm1hdGNoKC9ecnNhLS8pKVxuXHRcdGRlci53cml0ZU51bGwoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0dmFyIHNpZ0RhdGEgPSBzaWcuc2lnbmF0dXJlLnRvQnVmZmVyKCdhc24xJyk7XG5cdHZhciBkYXRhID0gQnVmZmVyLmFsbG9jKHNpZ0RhdGEubGVuZ3RoICsgMSk7XG5cdGRhdGFbMF0gPSAwO1xuXHRzaWdEYXRhLmNvcHkoZGF0YSwgMSk7XG5cdGRlci53cml0ZUJ1ZmZlcihkYXRhLCBhc24xLkJlci5CaXRTdHJpbmcpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblxuXHRyZXR1cm4gKGRlci5idWZmZXIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVRCU0NlcnQoY2VydCwgZGVyKSB7XG5cdHZhciBzaWcgPSBjZXJ0LnNpZ25hdHVyZXMueDUwOTtcblx0YXNzZXJ0Lm9iamVjdChzaWcsICd4NTA5IHNpZ25hdHVyZScpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoTG9jYWwoMCkpO1xuXHRkZXIud3JpdGVJbnQoMik7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdGRlci53cml0ZUJ1ZmZlcih1dGlscy5tcE5vcm1hbGl6ZShjZXJ0LnNlcmlhbCksIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdGRlci53cml0ZU9JRChTSUdOX0FMR1Nbc2lnLmFsZ29dKTtcblx0aWYgKHNpZy5hbGdvLm1hdGNoKC9ecnNhLS8pKVxuXHRcdGRlci53cml0ZU51bGwoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0Y2VydC5pc3N1ZXIudG9Bc24xKGRlcik7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoKTtcblx0d3JpdGVEYXRlKGRlciwgY2VydC52YWxpZEZyb20pO1xuXHR3cml0ZURhdGUoZGVyLCBjZXJ0LnZhbGlkVW50aWwpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblxuXHR2YXIgc3ViamVjdCA9IGNlcnQuc3ViamVjdHNbMF07XG5cdHZhciBhbHROYW1lcyA9IGNlcnQuc3ViamVjdHMuc2xpY2UoMSk7XG5cdHN1YmplY3QudG9Bc24xKGRlcik7XG5cblx0cGtjczgud3JpdGVQa2NzOChkZXIsIGNlcnQuc3ViamVjdEtleSk7XG5cblx0aWYgKHNpZy5leHRyYXMgJiYgc2lnLmV4dHJhcy5pc3N1ZXJVbmlxdWVJRCkge1xuXHRcdGRlci53cml0ZUJ1ZmZlcihzaWcuZXh0cmFzLmlzc3VlclVuaXF1ZUlELCBMb2NhbCgxKSk7XG5cdH1cblxuXHRpZiAoc2lnLmV4dHJhcyAmJiBzaWcuZXh0cmFzLnN1YmplY3RVbmlxdWVJRCkge1xuXHRcdGRlci53cml0ZUJ1ZmZlcihzaWcuZXh0cmFzLnN1YmplY3RVbmlxdWVJRCwgTG9jYWwoMikpO1xuXHR9XG5cblx0aWYgKGFsdE5hbWVzLmxlbmd0aCA+IDAgfHwgc3ViamVjdC50eXBlID09PSAnaG9zdCcgfHxcblx0ICAgIChjZXJ0LnB1cnBvc2VzICE9PSB1bmRlZmluZWQgJiYgY2VydC5wdXJwb3Nlcy5sZW5ndGggPiAwKSB8fFxuXHQgICAgKHNpZy5leHRyYXMgJiYgc2lnLmV4dHJhcy5leHRzKSkge1xuXHRcdGRlci5zdGFydFNlcXVlbmNlKExvY2FsKDMpKTtcblx0XHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdFx0dmFyIGV4dHMgPSBbXTtcblx0XHRpZiAoY2VydC5wdXJwb3NlcyAhPT0gdW5kZWZpbmVkICYmIGNlcnQucHVycG9zZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0ZXh0cy5wdXNoKHtcblx0XHRcdFx0b2lkOiBFWFRTLmJhc2ljQ29uc3RyYWludHMsXG5cdFx0XHRcdGNyaXRpY2FsOiB0cnVlXG5cdFx0XHR9KTtcblx0XHRcdGV4dHMucHVzaCh7XG5cdFx0XHRcdG9pZDogRVhUUy5rZXlVc2FnZSxcblx0XHRcdFx0Y3JpdGljYWw6IHRydWVcblx0XHRcdH0pO1xuXHRcdFx0ZXh0cy5wdXNoKHtcblx0XHRcdFx0b2lkOiBFWFRTLmV4dEtleVVzYWdlLFxuXHRcdFx0XHRjcml0aWNhbDogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGV4dHMucHVzaCh7IG9pZDogRVhUUy5hbHROYW1lIH0pO1xuXHRcdGlmIChzaWcuZXh0cmFzICYmIHNpZy5leHRyYXMuZXh0cylcblx0XHRcdGV4dHMgPSBzaWcuZXh0cmFzLmV4dHM7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyArK2kpIHtcblx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRkZXIud3JpdGVPSUQoZXh0c1tpXS5vaWQpO1xuXG5cdFx0XHRpZiAoZXh0c1tpXS5jcml0aWNhbCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRkZXIud3JpdGVCb29sZWFuKGV4dHNbaV0uY3JpdGljYWwpO1xuXG5cdFx0XHRpZiAoZXh0c1tpXS5vaWQgPT09IEVYVFMuYWx0TmFtZSkge1xuXHRcdFx0XHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRcdGlmIChzdWJqZWN0LnR5cGUgPT09ICdob3N0Jykge1xuXHRcdFx0XHRcdGRlci53cml0ZVN0cmluZyhzdWJqZWN0Lmhvc3RuYW1lLFxuXHRcdFx0XHRcdCAgICBDb250ZXh0KDIpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGFsdE5hbWVzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdFx0aWYgKGFsdE5hbWVzW2pdLnR5cGUgPT09ICdob3N0Jykge1xuXHRcdFx0XHRcdFx0ZGVyLndyaXRlU3RyaW5nKFxuXHRcdFx0XHRcdFx0ICAgIGFsdE5hbWVzW2pdLmhvc3RuYW1lLFxuXHRcdFx0XHRcdFx0ICAgIEFMVE5BTUUuRE5TTmFtZSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbHROYW1lc1tqXS50eXBlID09PVxuXHRcdFx0XHRcdCAgICAnZW1haWwnKSB7XG5cdFx0XHRcdFx0XHRkZXIud3JpdGVTdHJpbmcoXG5cdFx0XHRcdFx0XHQgICAgYWx0TmFtZXNbal0uZW1haWwsXG5cdFx0XHRcdFx0XHQgICAgQUxUTkFNRS5SRkM4MjJOYW1lKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdCAqIEVuY29kZSBhbnl0aGluZyBlbHNlIGFzIGFcblx0XHRcdFx0XHRcdCAqIEROIHN0eWxlIG5hbWUgZm9yIG5vdy5cblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0ZGVyLnN0YXJ0U2VxdWVuY2UoXG5cdFx0XHRcdFx0XHQgICAgQUxUTkFNRS5EaXJlY3RvcnlOYW1lKTtcblx0XHRcdFx0XHRcdGFsdE5hbWVzW2pdLnRvQXNuMShkZXIpO1xuXHRcdFx0XHRcdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGRlci5lbmRTZXF1ZW5jZSgpO1xuXHRcdFx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHRcdH0gZWxzZSBpZiAoZXh0c1tpXS5vaWQgPT09IEVYVFMuYmFzaWNDb25zdHJhaW50cykge1xuXHRcdFx0XHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRcdHZhciBjYSA9IChjZXJ0LnB1cnBvc2VzLmluZGV4T2YoJ2NhJykgIT09IC0xKTtcblx0XHRcdFx0dmFyIHBhdGhMZW4gPSBleHRzW2ldLnBhdGhMZW47XG5cdFx0XHRcdGRlci53cml0ZUJvb2xlYW4oY2EpO1xuXHRcdFx0XHRpZiAocGF0aExlbiAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdGRlci53cml0ZUludChwYXRoTGVuKTtcblx0XHRcdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdFx0XHRcdGRlci5lbmRTZXF1ZW5jZSgpO1xuXHRcdFx0fSBlbHNlIGlmIChleHRzW2ldLm9pZCA9PT0gRVhUUy5leHRLZXlVc2FnZSkge1xuXHRcdFx0XHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRcdGNlcnQucHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbiAocHVycG9zZSkge1xuXHRcdFx0XHRcdGlmIChwdXJwb3NlID09PSAnY2EnKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdGlmIChLRVlVU0VCSVRTLmluZGV4T2YocHVycG9zZSkgIT09IC0xKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdHZhciBvaWQgPSBwdXJwb3NlO1xuXHRcdFx0XHRcdGlmIChFWFRQVVJQT1NFW3B1cnBvc2VdICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRvaWQgPSBFWFRQVVJQT1NFW3B1cnBvc2VdO1xuXHRcdFx0XHRcdGRlci53cml0ZU9JRChvaWQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdFx0XHRcdGRlci5lbmRTZXF1ZW5jZSgpO1xuXHRcdFx0fSBlbHNlIGlmIChleHRzW2ldLm9pZCA9PT0gRVhUUy5rZXlVc2FnZSkge1xuXHRcdFx0XHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0XHRcdC8qXG5cdFx0XHRcdCAqIElmIHdlIHBhcnNlZCB0aGlzIGNlcnRpZmljYXRlIGZyb20gYSBieXRlXG5cdFx0XHRcdCAqIHN0cmVhbSAoaS5lLiB3ZSBkaWRuJ3QgZ2VuZXJhdGUgaXQgaW4gc3NocGspXG5cdFx0XHRcdCAqIHRoZW4gd2UnbGwgaGF2ZSBhIFwiLmJpdHNcIiBwcm9wZXJ0eSBvbiB0aGVcblx0XHRcdFx0ICogZXh0IHdpdGggdGhlIG9yaWdpbmFsIHJhdyBieXRlIGNvbnRlbnRzLlxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKiBJZiB3ZSBoYXZlIHRoaXMsIHVzZSBpdCBoZXJlIGluc3RlYWQgb2Zcblx0XHRcdFx0ICogcmVnZW5lcmF0aW5nIGl0LiBUaGlzIGd1YXJhbnRlZXMgd2Ugb3V0cHV0XG5cdFx0XHRcdCAqIHRoZSBzYW1lIGRhdGEgd2UgcGFyc2VkLCBzbyBzaWduYXR1cmVzIHN0aWxsXG5cdFx0XHRcdCAqIHZhbGlkYXRlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKGV4dHNbaV0uYml0cyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVyLndyaXRlQnVmZmVyKGV4dHNbaV0uYml0cyxcblx0XHRcdFx0XHQgICAgYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgYml0cyA9IHdyaXRlQml0RmllbGQoY2VydC5wdXJwb3Nlcyxcblx0XHRcdFx0XHQgICAgS0VZVVNFQklUUyk7XG5cdFx0XHRcdFx0ZGVyLndyaXRlQnVmZmVyKGJpdHMsXG5cdFx0XHRcdFx0ICAgIGFzbjEuQmVyLkJpdFN0cmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZXIud3JpdGVCdWZmZXIoZXh0c1tpXS5kYXRhLFxuXHRcdFx0XHQgICAgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHR9XG5cblx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0fVxuXG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG4vKlxuICogUmVhZHMgYW4gQVNOLjEgQkVSIGJpdGZpZWxkIG91dCBvZiB0aGUgQnVmZmVyIHByb2R1Y2VkIGJ5IGRvaW5nXG4gKiBgQmVyUmVhZGVyI3JlYWRTdHJpbmcoYXNuMS5CZXIuQml0U3RyaW5nKWAuIFRoYXQgZnVuY3Rpb24gZ2l2ZXMgdXMgdGhlIHJhd1xuICogY29udGVudHMgb2YgdGhlIEJpdFN0cmluZyB0YWcsIHdoaWNoIGlzIGEgY291bnQgb2YgdW51c2VkIGJpdHMgZm9sbG93ZWQgYnlcbiAqIHRoZSBiaXRzIGFzIGEgcmlnaHQtcGFkZGVkIGJ5dGUgc3RyaW5nLlxuICpcbiAqIGBiaXRzYCBpcyB0aGUgQnVmZmVyLCBgYml0SW5kZXhgIHNob3VsZCBjb250YWluIGFuIGFycmF5IG9mIHN0cmluZyBuYW1lc1xuICogZm9yIHRoZSBiaXRzIGluIHRoZSBzdHJpbmcsIG9yZGVyZWQgc3RhcnRpbmcgd2l0aCBiaXQgIzAgaW4gdGhlIEFTTi4xIHNwZWMuXG4gKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBTdHJpbmdzLCB0aGUgbmFtZXMgb2YgdGhlIGJpdHMgdGhhdCB3ZXJlIHNldCB0byAxLlxuICovXG5mdW5jdGlvbiByZWFkQml0RmllbGQoYml0cywgYml0SW5kZXgpIHtcblx0dmFyIGJpdExlbiA9IDggKiAoYml0cy5sZW5ndGggLSAxKSAtIGJpdHNbMF07XG5cdHZhciBzZXRCaXRzID0ge307XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYml0TGVuOyArK2kpIHtcblx0XHR2YXIgYnl0ZU4gPSAxICsgTWF0aC5mbG9vcihpIC8gOCk7XG5cdFx0dmFyIGJpdCA9IDcgLSAoaSAlIDgpO1xuXHRcdHZhciBtYXNrID0gMSA8PCBiaXQ7XG5cdFx0dmFyIGJpdFZhbCA9ICgoYml0c1tieXRlTl0gJiBtYXNrKSAhPT0gMCk7XG5cdFx0dmFyIG5hbWUgPSBiaXRJbmRleFtpXTtcblx0XHRpZiAoYml0VmFsICYmIHR5cGVvZiAobmFtZSkgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRzZXRCaXRzW25hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIChPYmplY3Qua2V5cyhzZXRCaXRzKSk7XG59XG5cbi8qXG4gKiBgc2V0Qml0c2AgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncywgY29udGFpbmluZyB0aGUgbmFtZXMgZm9yIGVhY2ggYml0IHRoYXRcbiAqIHNvdWxkIGJlIHNldCB0byAxLiBgYml0SW5kZXhgIGlzIHNhbWUgYXMgaW4gYHJlYWRCaXRGaWVsZCgpYC5cbiAqXG4gKiBSZXR1cm5zIGEgQnVmZmVyLCByZWFkeSB0byBiZSB3cml0dGVuIG91dCB3aXRoIGBCZXJXcml0ZXIjd3JpdGVTdHJpbmcoKWAuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQml0RmllbGQoc2V0Qml0cywgYml0SW5kZXgpIHtcblx0dmFyIGJpdExlbiA9IGJpdEluZGV4Lmxlbmd0aDtcblx0dmFyIGJsZW4gPSBNYXRoLmNlaWwoYml0TGVuIC8gOCk7XG5cdHZhciB1bnVzZWQgPSBibGVuICogOCAtIGJpdExlbjtcblx0dmFyIGJpdHMgPSBCdWZmZXIuYWxsb2MoMSArIGJsZW4pOyAvLyB6ZXJvLWZpbGxlZFxuXHRiaXRzWzBdID0gdW51c2VkO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGJpdExlbjsgKytpKSB7XG5cdFx0dmFyIGJ5dGVOID0gMSArIE1hdGguZmxvb3IoaSAvIDgpO1xuXHRcdHZhciBiaXQgPSA3IC0gKGkgJSA4KTtcblx0XHR2YXIgbWFzayA9IDEgPDwgYml0O1xuXHRcdHZhciBuYW1lID0gYml0SW5kZXhbaV07XG5cdFx0aWYgKG5hbWUgPT09IHVuZGVmaW5lZClcblx0XHRcdGNvbnRpbnVlO1xuXHRcdHZhciBiaXRWYWwgPSAoc2V0Qml0cy5pbmRleE9mKG5hbWUpICE9PSAtMSk7XG5cdFx0aWYgKGJpdFZhbCkge1xuXHRcdFx0Yml0c1tieXRlTl0gfD0gbWFzaztcblx0XHR9XG5cdH1cblx0cmV0dXJuIChiaXRzKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNiBKb3llbnQsIEluYy5cblxudmFyIHg1MDkgPSByZXF1aXJlKCcuL3g1MDknKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHZlcmlmeTogeDUwOS52ZXJpZnksXG5cdHNpZ246IHg1MDkuc2lnbixcblx0d3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMScpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi4vYWxncycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi4vcHJpdmF0ZS1rZXknKTtcbnZhciBwZW0gPSByZXF1aXJlKCcuL3BlbScpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi4vaWRlbnRpdHknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuLi9zaWduYXR1cmUnKTtcbnZhciBDZXJ0aWZpY2F0ZSA9IHJlcXVpcmUoJy4uL2NlcnRpZmljYXRlJyk7XG5cbmZ1bmN0aW9uIHJlYWQoYnVmLCBvcHRpb25zKSB7XG5cdGlmICh0eXBlb2YgKGJ1ZikgIT09ICdzdHJpbmcnKSB7XG5cdFx0YXNzZXJ0LmJ1ZmZlcihidWYsICdidWYnKTtcblx0XHRidWYgPSBidWYudG9TdHJpbmcoJ2FzY2lpJyk7XG5cdH1cblxuXHR2YXIgbGluZXMgPSBidWYudHJpbSgpLnNwbGl0KC9bXFxyXFxuXSsvZyk7XG5cblx0dmFyIG07XG5cdHZhciBzaSA9IC0xO1xuXHR3aGlsZSAoIW0gJiYgc2kgPCBsaW5lcy5sZW5ndGgpIHtcblx0XHRtID0gbGluZXNbKytzaV0ubWF0Y2goLypKU1NUWUxFRCovXG5cdFx0ICAgIC9bLV0rWyBdKkJFR0lOIENFUlRJRklDQVRFWyBdKlstXSsvKTtcblx0fVxuXHRhc3NlcnQub2sobSwgJ2ludmFsaWQgUEVNIGhlYWRlcicpO1xuXG5cdHZhciBtMjtcblx0dmFyIGVpID0gbGluZXMubGVuZ3RoO1xuXHR3aGlsZSAoIW0yICYmIGVpID4gMCkge1xuXHRcdG0yID0gbGluZXNbLS1laV0ubWF0Y2goLypKU1NUWUxFRCovXG5cdFx0ICAgIC9bLV0rWyBdKkVORCBDRVJUSUZJQ0FURVsgXSpbLV0rLyk7XG5cdH1cblx0YXNzZXJ0Lm9rKG0yLCAnaW52YWxpZCBQRU0gZm9vdGVyJyk7XG5cblx0bGluZXMgPSBsaW5lcy5zbGljZShzaSwgZWkgKyAxKTtcblxuXHR2YXIgaGVhZGVycyA9IHt9O1xuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdGxpbmVzID0gbGluZXMuc2xpY2UoMSk7XG5cdFx0bSA9IGxpbmVzWzBdLm1hdGNoKC8qSlNTVFlMRUQqL1xuXHRcdCAgICAvXihbQS1aYS16MC05LV0rKTogKC4rKSQvKTtcblx0XHRpZiAoIW0pXG5cdFx0XHRicmVhaztcblx0XHRoZWFkZXJzW21bMV0udG9Mb3dlckNhc2UoKV0gPSBtWzJdO1xuXHR9XG5cblx0LyogQ2hvcCBvZmYgdGhlIGZpcnN0IGFuZCBsYXN0IGxpbmVzICovXG5cdGxpbmVzID0gbGluZXMuc2xpY2UoMCwgLTEpLmpvaW4oJycpO1xuXHRidWYgPSBCdWZmZXIuZnJvbShsaW5lcywgJ2Jhc2U2NCcpO1xuXG5cdHJldHVybiAoeDUwOS5yZWFkKGJ1Ziwgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiB3cml0ZShjZXJ0LCBvcHRpb25zKSB7XG5cdHZhciBkYnVmID0geDUwOS53cml0ZShjZXJ0LCBvcHRpb25zKTtcblxuXHR2YXIgaGVhZGVyID0gJ0NFUlRJRklDQVRFJztcblx0dmFyIHRtcCA9IGRidWYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHR2YXIgbGVuID0gdG1wLmxlbmd0aCArICh0bXAubGVuZ3RoIC8gNjQpICtcblx0ICAgIDE4ICsgMTYgKyBoZWFkZXIubGVuZ3RoKjIgKyAxMDtcblx0dmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyhsZW4pO1xuXHR2YXIgbyA9IDA7XG5cdG8gKz0gYnVmLndyaXRlKCctLS0tLUJFR0lOICcgKyBoZWFkZXIgKyAnLS0tLS1cXG4nLCBvKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyApIHtcblx0XHR2YXIgbGltaXQgPSBpICsgNjQ7XG5cdFx0aWYgKGxpbWl0ID4gdG1wLmxlbmd0aClcblx0XHRcdGxpbWl0ID0gdG1wLmxlbmd0aDtcblx0XHRvICs9IGJ1Zi53cml0ZSh0bXAuc2xpY2UoaSwgbGltaXQpLCBvKTtcblx0XHRidWZbbysrXSA9IDEwO1xuXHRcdGkgPSBsaW1pdDtcblx0fVxuXHRvICs9IGJ1Zi53cml0ZSgnLS0tLS1FTkQgJyArIGhlYWRlciArICctLS0tLVxcbicsIG8pO1xuXG5cdHJldHVybiAoYnVmLnNsaWNlKDAsIG8pKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNiBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSBDZXJ0aWZpY2F0ZTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuL2FsZ3MnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBGaW5nZXJwcmludCA9IHJlcXVpcmUoJy4vZmluZ2VycHJpbnQnKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xudmFyIGVycnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgS2V5ID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi9wcml2YXRlLWtleScpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG52YXIgZm9ybWF0cyA9IHt9O1xuZm9ybWF0c1snb3BlbnNzaCddID0gcmVxdWlyZSgnLi9mb3JtYXRzL29wZW5zc2gtY2VydCcpO1xuZm9ybWF0c1sneDUwOSddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3g1MDknKTtcbmZvcm1hdHNbJ3BlbSddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3g1MDktcGVtJyk7XG5cbnZhciBDZXJ0aWZpY2F0ZVBhcnNlRXJyb3IgPSBlcnJzLkNlcnRpZmljYXRlUGFyc2VFcnJvcjtcbnZhciBJbnZhbGlkQWxnb3JpdGhtRXJyb3IgPSBlcnJzLkludmFsaWRBbGdvcml0aG1FcnJvcjtcblxuZnVuY3Rpb24gQ2VydGlmaWNhdGUob3B0cykge1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KG9wdHMuc3ViamVjdHMsICdvcHRpb25zLnN1YmplY3RzJyk7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUob3B0cy5zdWJqZWN0c1swXSwgSWRlbnRpdHksIFsxLCAwXSxcblx0ICAgICdvcHRpb25zLnN1YmplY3RzJyk7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUob3B0cy5zdWJqZWN0S2V5LCBLZXksIFsxLCAwXSxcblx0ICAgICdvcHRpb25zLnN1YmplY3RLZXknKTtcblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShvcHRzLmlzc3VlciwgSWRlbnRpdHksIFsxLCAwXSwgJ29wdGlvbnMuaXNzdWVyJyk7XG5cdGlmIChvcHRzLmlzc3VlcktleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShvcHRzLmlzc3VlcktleSwgS2V5LCBbMSwgMF0sXG5cdFx0ICAgICdvcHRpb25zLmlzc3VlcktleScpO1xuXHR9XG5cdGFzc2VydC5vYmplY3Qob3B0cy5zaWduYXR1cmVzLCAnb3B0aW9ucy5zaWduYXR1cmVzJyk7XG5cdGFzc2VydC5idWZmZXIob3B0cy5zZXJpYWwsICdvcHRpb25zLnNlcmlhbCcpO1xuXHRhc3NlcnQuZGF0ZShvcHRzLnZhbGlkRnJvbSwgJ29wdGlvbnMudmFsaWRGcm9tJyk7XG5cdGFzc2VydC5kYXRlKG9wdHMudmFsaWRVbnRpbCwgJ29wdG9ucy52YWxpZFVudGlsJyk7XG5cblx0YXNzZXJ0Lm9wdGlvbmFsQXJyYXlPZlN0cmluZyhvcHRzLnB1cnBvc2VzLCAnb3B0aW9ucy5wdXJwb3NlcycpO1xuXG5cdHRoaXMuX2hhc2hDYWNoZSA9IHt9O1xuXG5cdHRoaXMuc3ViamVjdHMgPSBvcHRzLnN1YmplY3RzO1xuXHR0aGlzLmlzc3VlciA9IG9wdHMuaXNzdWVyO1xuXHR0aGlzLnN1YmplY3RLZXkgPSBvcHRzLnN1YmplY3RLZXk7XG5cdHRoaXMuaXNzdWVyS2V5ID0gb3B0cy5pc3N1ZXJLZXk7XG5cdHRoaXMuc2lnbmF0dXJlcyA9IG9wdHMuc2lnbmF0dXJlcztcblx0dGhpcy5zZXJpYWwgPSBvcHRzLnNlcmlhbDtcblx0dGhpcy52YWxpZEZyb20gPSBvcHRzLnZhbGlkRnJvbTtcblx0dGhpcy52YWxpZFVudGlsID0gb3B0cy52YWxpZFVudGlsO1xuXHR0aGlzLnB1cnBvc2VzID0gb3B0cy5wdXJwb3Nlcztcbn1cblxuQ2VydGlmaWNhdGUuZm9ybWF0cyA9IGZvcm1hdHM7XG5cbkNlcnRpZmljYXRlLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uIChmb3JtYXQsIG9wdGlvbnMpIHtcblx0aWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKVxuXHRcdGZvcm1hdCA9ICd4NTA5Jztcblx0YXNzZXJ0LnN0cmluZyhmb3JtYXQsICdmb3JtYXQnKTtcblx0YXNzZXJ0Lm9iamVjdChmb3JtYXRzW2Zvcm1hdF0sICdmb3JtYXRzW2Zvcm1hdF0nKTtcblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cblx0cmV0dXJuIChmb3JtYXRzW2Zvcm1hdF0ud3JpdGUodGhpcywgb3B0aW9ucykpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGZvcm1hdCwgb3B0aW9ucykge1xuXHRpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpXG5cdFx0Zm9ybWF0ID0gJ3BlbSc7XG5cdHJldHVybiAodGhpcy50b0J1ZmZlcihmb3JtYXQsIG9wdGlvbnMpLnRvU3RyaW5nKCkpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmZpbmdlcnByaW50ID0gZnVuY3Rpb24gKGFsZ28pIHtcblx0aWYgKGFsZ28gPT09IHVuZGVmaW5lZClcblx0XHRhbGdvID0gJ3NoYTI1Nic7XG5cdGFzc2VydC5zdHJpbmcoYWxnbywgJ2FsZ29yaXRobScpO1xuXHR2YXIgb3B0cyA9IHtcblx0XHR0eXBlOiAnY2VydGlmaWNhdGUnLFxuXHRcdGhhc2g6IHRoaXMuaGFzaChhbGdvKSxcblx0XHRhbGdvcml0aG06IGFsZ29cblx0fTtcblx0cmV0dXJuIChuZXcgRmluZ2VycHJpbnQob3B0cykpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmhhc2ggPSBmdW5jdGlvbiAoYWxnbykge1xuXHRhc3NlcnQuc3RyaW5nKGFsZ28sICdhbGdvcml0aG0nKTtcblx0YWxnbyA9IGFsZ28udG9Mb3dlckNhc2UoKTtcblx0aWYgKGFsZ3MuaGFzaEFsZ3NbYWxnb10gPT09IHVuZGVmaW5lZClcblx0XHR0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcihhbGdvKSk7XG5cblx0aWYgKHRoaXMuX2hhc2hDYWNoZVthbGdvXSlcblx0XHRyZXR1cm4gKHRoaXMuX2hhc2hDYWNoZVthbGdvXSk7XG5cblx0dmFyIGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChhbGdvKS5cblx0ICAgIHVwZGF0ZSh0aGlzLnRvQnVmZmVyKCd4NTA5JykpLmRpZ2VzdCgpO1xuXHR0aGlzLl9oYXNoQ2FjaGVbYWxnb10gPSBoYXNoO1xuXHRyZXR1cm4gKGhhc2gpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmlzRXhwaXJlZCA9IGZ1bmN0aW9uICh3aGVuKSB7XG5cdGlmICh3aGVuID09PSB1bmRlZmluZWQpXG5cdFx0d2hlbiA9IG5ldyBEYXRlKCk7XG5cdHJldHVybiAoISgod2hlbi5nZXRUaW1lKCkgPj0gdGhpcy52YWxpZEZyb20uZ2V0VGltZSgpKSAmJlxuXHRcdCh3aGVuLmdldFRpbWUoKSA8IHRoaXMudmFsaWRVbnRpbC5nZXRUaW1lKCkpKSk7XG59O1xuXG5DZXJ0aWZpY2F0ZS5wcm90b3R5cGUuaXNTaWduZWRCeSA9IGZ1bmN0aW9uIChpc3N1ZXJDZXJ0KSB7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUoaXNzdWVyQ2VydCwgQ2VydGlmaWNhdGUsIFsxLCAwXSwgJ2lzc3VlcicpO1xuXG5cdGlmICghdGhpcy5pc3N1ZXIuZXF1YWxzKGlzc3VlckNlcnQuc3ViamVjdHNbMF0pKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHRpZiAodGhpcy5pc3N1ZXIucHVycG9zZXMgJiYgdGhpcy5pc3N1ZXIucHVycG9zZXMubGVuZ3RoID4gMCAmJlxuXHQgICAgdGhpcy5pc3N1ZXIucHVycG9zZXMuaW5kZXhPZignY2EnKSA9PT0gLTEpIHtcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdHJldHVybiAodGhpcy5pc1NpZ25lZEJ5S2V5KGlzc3VlckNlcnQuc3ViamVjdEtleSkpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmdldEV4dGVuc2lvbiA9IGZ1bmN0aW9uIChrZXlPck9pZCkge1xuXHRhc3NlcnQuc3RyaW5nKGtleU9yT2lkLCAna2V5T3JPaWQnKTtcblx0dmFyIGV4dCA9IHRoaXMuZ2V0RXh0ZW5zaW9ucygpLmZpbHRlcihmdW5jdGlvbiAobWF5YmVFeHQpIHtcblx0XHRpZiAobWF5YmVFeHQuZm9ybWF0ID09PSAneDUwOScpXG5cdFx0XHRyZXR1cm4gKG1heWJlRXh0Lm9pZCA9PT0ga2V5T3JPaWQpO1xuXHRcdGlmIChtYXliZUV4dC5mb3JtYXQgPT09ICdvcGVuc3NoJylcblx0XHRcdHJldHVybiAobWF5YmVFeHQubmFtZSA9PT0ga2V5T3JPaWQpO1xuXHRcdHJldHVybiAoZmFsc2UpO1xuXHR9KVswXTtcblx0cmV0dXJuIChleHQpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmdldEV4dGVuc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBleHRzID0gW107XG5cdHZhciB4NTA5ID0gdGhpcy5zaWduYXR1cmVzLng1MDk7XG5cdGlmICh4NTA5ICYmIHg1MDkuZXh0cmFzICYmIHg1MDkuZXh0cmFzLmV4dHMpIHtcblx0XHR4NTA5LmV4dHJhcy5leHRzLmZvckVhY2goZnVuY3Rpb24gKGV4dCkge1xuXHRcdFx0ZXh0LmZvcm1hdCA9ICd4NTA5Jztcblx0XHRcdGV4dHMucHVzaChleHQpO1xuXHRcdH0pO1xuXHR9XG5cdHZhciBvcGVuc3NoID0gdGhpcy5zaWduYXR1cmVzLm9wZW5zc2g7XG5cdGlmIChvcGVuc3NoICYmIG9wZW5zc2guZXh0cykge1xuXHRcdG9wZW5zc2guZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChleHQpIHtcblx0XHRcdGV4dC5mb3JtYXQgPSAnb3BlbnNzaCc7XG5cdFx0XHRleHRzLnB1c2goZXh0KTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gKGV4dHMpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmlzU2lnbmVkQnlLZXkgPSBmdW5jdGlvbiAoaXNzdWVyS2V5KSB7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUoaXNzdWVyS2V5LCBLZXksIFsxLCAyXSwgJ2lzc3VlcktleScpO1xuXG5cdGlmICh0aGlzLmlzc3VlcktleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuICh0aGlzLmlzc3VlcktleS5cblx0XHQgICAgZmluZ2VycHJpbnQoJ3NoYTUxMicpLm1hdGNoZXMoaXNzdWVyS2V5KSk7XG5cdH1cblxuXHR2YXIgZm10ID0gT2JqZWN0LmtleXModGhpcy5zaWduYXR1cmVzKVswXTtcblx0dmFyIHZhbGlkID0gZm9ybWF0c1tmbXRdLnZlcmlmeSh0aGlzLCBpc3N1ZXJLZXkpO1xuXHRpZiAodmFsaWQpXG5cdFx0dGhpcy5pc3N1ZXJLZXkgPSBpc3N1ZXJLZXk7XG5cdHJldHVybiAodmFsaWQpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLnNpZ25XaXRoID0gZnVuY3Rpb24gKGtleSkge1xuXHR1dGlscy5hc3NlcnRDb21wYXRpYmxlKGtleSwgUHJpdmF0ZUtleSwgWzEsIDJdLCAna2V5Jyk7XG5cdHZhciBmbXRzID0gT2JqZWN0LmtleXMoZm9ybWF0cyk7XG5cdHZhciBkaWRPbmUgPSBmYWxzZTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBmbXRzLmxlbmd0aDsgKytpKSB7XG5cdFx0aWYgKGZtdHNbaV0gIT09ICdwZW0nKSB7XG5cdFx0XHR2YXIgcmV0ID0gZm9ybWF0c1tmbXRzW2ldXS5zaWduKHRoaXMsIGtleSk7XG5cdFx0XHRpZiAocmV0ID09PSB0cnVlKVxuXHRcdFx0XHRkaWRPbmUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRpZiAoIWRpZE9uZSkge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzaWduIHRoZSBjZXJ0aWZpY2F0ZSBmb3IgYW55ICcgK1xuXHRcdCAgICAnYXZhaWxhYmxlIGNlcnRpZmljYXRlIGZvcm1hdHMnKSk7XG5cdH1cbn07XG5cbkNlcnRpZmljYXRlLmNyZWF0ZVNlbGZTaWduZWQgPSBmdW5jdGlvbiAoc3ViamVjdE9yU3ViamVjdHMsIGtleSwgb3B0aW9ucykge1xuXHR2YXIgc3ViamVjdHM7XG5cdGlmIChBcnJheS5pc0FycmF5KHN1YmplY3RPclN1YmplY3RzKSlcblx0XHRzdWJqZWN0cyA9IHN1YmplY3RPclN1YmplY3RzO1xuXHRlbHNlXG5cdFx0c3ViamVjdHMgPSBbc3ViamVjdE9yU3ViamVjdHNdO1xuXG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KHN1YmplY3RzKTtcblx0c3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuXHRcdHV0aWxzLmFzc2VydENvbXBhdGlibGUoc3ViamVjdCwgSWRlbnRpdHksIFsxLCAwXSwgJ3N1YmplY3QnKTtcblx0fSk7XG5cblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShrZXksIFByaXZhdGVLZXksIFsxLCAyXSwgJ3ByaXZhdGUga2V5Jyk7XG5cblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRhc3NlcnQub3B0aW9uYWxPYmplY3Qob3B0aW9ucy52YWxpZEZyb20sICdvcHRpb25zLnZhbGlkRnJvbScpO1xuXHRhc3NlcnQub3B0aW9uYWxPYmplY3Qob3B0aW9ucy52YWxpZFVudGlsLCAnb3B0aW9ucy52YWxpZFVudGlsJyk7XG5cdHZhciB2YWxpZEZyb20gPSBvcHRpb25zLnZhbGlkRnJvbTtcblx0dmFyIHZhbGlkVW50aWwgPSBvcHRpb25zLnZhbGlkVW50aWw7XG5cdGlmICh2YWxpZEZyb20gPT09IHVuZGVmaW5lZClcblx0XHR2YWxpZEZyb20gPSBuZXcgRGF0ZSgpO1xuXHRpZiAodmFsaWRVbnRpbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0YXNzZXJ0Lm9wdGlvbmFsTnVtYmVyKG9wdGlvbnMubGlmZXRpbWUsICdvcHRpb25zLmxpZmV0aW1lJyk7XG5cdFx0dmFyIGxpZmV0aW1lID0gb3B0aW9ucy5saWZldGltZTtcblx0XHRpZiAobGlmZXRpbWUgPT09IHVuZGVmaW5lZClcblx0XHRcdGxpZmV0aW1lID0gMTAqMzY1KjI0KjM2MDA7XG5cdFx0dmFsaWRVbnRpbCA9IG5ldyBEYXRlKCk7XG5cdFx0dmFsaWRVbnRpbC5zZXRUaW1lKHZhbGlkVW50aWwuZ2V0VGltZSgpICsgbGlmZXRpbWUqMTAwMCk7XG5cdH1cblx0YXNzZXJ0Lm9wdGlvbmFsQnVmZmVyKG9wdGlvbnMuc2VyaWFsLCAnb3B0aW9ucy5zZXJpYWwnKTtcblx0dmFyIHNlcmlhbCA9IG9wdGlvbnMuc2VyaWFsO1xuXHRpZiAoc2VyaWFsID09PSB1bmRlZmluZWQpXG5cdFx0c2VyaWFsID0gQnVmZmVyLmZyb20oJzAwMDAwMDAwMDAwMDAwMDEnLCAnaGV4Jyk7XG5cblx0dmFyIHB1cnBvc2VzID0gb3B0aW9ucy5wdXJwb3Nlcztcblx0aWYgKHB1cnBvc2VzID09PSB1bmRlZmluZWQpXG5cdFx0cHVycG9zZXMgPSBbXTtcblxuXHRpZiAocHVycG9zZXMuaW5kZXhPZignc2lnbmF0dXJlJykgPT09IC0xKVxuXHRcdHB1cnBvc2VzLnB1c2goJ3NpZ25hdHVyZScpO1xuXG5cdC8qIFNlbGYtc2lnbmVkIGNlcnRzIGFyZSBhbHdheXMgQ0FzLiAqL1xuXHRpZiAocHVycG9zZXMuaW5kZXhPZignY2EnKSA9PT0gLTEpXG5cdFx0cHVycG9zZXMucHVzaCgnY2EnKTtcblx0aWYgKHB1cnBvc2VzLmluZGV4T2YoJ2NybCcpID09PSAtMSlcblx0XHRwdXJwb3Nlcy5wdXNoKCdjcmwnKTtcblxuXHQvKlxuXHQgKiBJZiB3ZSB3ZXJlbid0IGV4cGxpY2l0bHkgZ2l2ZW4gYW55IG90aGVyIHB1cnBvc2VzLCBkbyB0aGUgc2Vuc2libGVcblx0ICogdGhpbmcgYW5kIGFkZCBzb21lIGJhc2ljIG9uZXMgZGVwZW5kaW5nIG9uIHRoZSBzdWJqZWN0IHR5cGUuXG5cdCAqL1xuXHRpZiAocHVycG9zZXMubGVuZ3RoIDw9IDMpIHtcblx0XHR2YXIgaG9zdFN1YmplY3RzID0gc3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG5cdFx0XHRyZXR1cm4gKHN1YmplY3QudHlwZSA9PT0gJ2hvc3QnKTtcblx0XHR9KTtcblx0XHR2YXIgdXNlclN1YmplY3RzID0gc3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG5cdFx0XHRyZXR1cm4gKHN1YmplY3QudHlwZSA9PT0gJ3VzZXInKTtcblx0XHR9KTtcblx0XHRpZiAoaG9zdFN1YmplY3RzLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdzZXJ2ZXJBdXRoJykgPT09IC0xKVxuXHRcdFx0XHRwdXJwb3Nlcy5wdXNoKCdzZXJ2ZXJBdXRoJyk7XG5cdFx0fVxuXHRcdGlmICh1c2VyU3ViamVjdHMubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKHB1cnBvc2VzLmluZGV4T2YoJ2NsaWVudEF1dGgnKSA9PT0gLTEpXG5cdFx0XHRcdHB1cnBvc2VzLnB1c2goJ2NsaWVudEF1dGgnKTtcblx0XHR9XG5cdFx0aWYgKHVzZXJTdWJqZWN0cy5sZW5ndGggPiAwIHx8IGhvc3RTdWJqZWN0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAocHVycG9zZXMuaW5kZXhPZigna2V5QWdyZWVtZW50JykgPT09IC0xKVxuXHRcdFx0XHRwdXJwb3Nlcy5wdXNoKCdrZXlBZ3JlZW1lbnQnKTtcblx0XHRcdGlmIChrZXkudHlwZSA9PT0gJ3JzYScgJiZcblx0XHRcdCAgICBwdXJwb3Nlcy5pbmRleE9mKCdlbmNyeXB0aW9uJykgPT09IC0xKVxuXHRcdFx0XHRwdXJwb3Nlcy5wdXNoKCdlbmNyeXB0aW9uJyk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIGNlcnQgPSBuZXcgQ2VydGlmaWNhdGUoe1xuXHRcdHN1YmplY3RzOiBzdWJqZWN0cyxcblx0XHRpc3N1ZXI6IHN1YmplY3RzWzBdLFxuXHRcdHN1YmplY3RLZXk6IGtleS50b1B1YmxpYygpLFxuXHRcdGlzc3VlcktleToga2V5LnRvUHVibGljKCksXG5cdFx0c2lnbmF0dXJlczoge30sXG5cdFx0c2VyaWFsOiBzZXJpYWwsXG5cdFx0dmFsaWRGcm9tOiB2YWxpZEZyb20sXG5cdFx0dmFsaWRVbnRpbDogdmFsaWRVbnRpbCxcblx0XHRwdXJwb3NlczogcHVycG9zZXNcblx0fSk7XG5cdGNlcnQuc2lnbldpdGgoa2V5KTtcblxuXHRyZXR1cm4gKGNlcnQpO1xufTtcblxuQ2VydGlmaWNhdGUuY3JlYXRlID1cbiAgICBmdW5jdGlvbiAoc3ViamVjdE9yU3ViamVjdHMsIGtleSwgaXNzdWVyLCBpc3N1ZXJLZXksIG9wdGlvbnMpIHtcblx0dmFyIHN1YmplY3RzO1xuXHRpZiAoQXJyYXkuaXNBcnJheShzdWJqZWN0T3JTdWJqZWN0cykpXG5cdFx0c3ViamVjdHMgPSBzdWJqZWN0T3JTdWJqZWN0cztcblx0ZWxzZVxuXHRcdHN1YmplY3RzID0gW3N1YmplY3RPclN1YmplY3RzXTtcblxuXHRhc3NlcnQuYXJyYXlPZk9iamVjdChzdWJqZWN0cyk7XG5cdHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcblx0XHR1dGlscy5hc3NlcnRDb21wYXRpYmxlKHN1YmplY3QsIElkZW50aXR5LCBbMSwgMF0sICdzdWJqZWN0Jyk7XG5cdH0pO1xuXG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUoa2V5LCBLZXksIFsxLCAwXSwgJ2tleScpO1xuXHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSlcblx0XHRrZXkgPSBrZXkudG9QdWJsaWMoKTtcblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShpc3N1ZXIsIElkZW50aXR5LCBbMSwgMF0sICdpc3N1ZXInKTtcblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShpc3N1ZXJLZXksIFByaXZhdGVLZXksIFsxLCAyXSwgJ2lzc3VlciBrZXknKTtcblxuXHRhc3NlcnQub3B0aW9uYWxPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKTtcblx0aWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZClcblx0XHRvcHRpb25zID0ge307XG5cdGFzc2VydC5vcHRpb25hbE9iamVjdChvcHRpb25zLnZhbGlkRnJvbSwgJ29wdGlvbnMudmFsaWRGcm9tJyk7XG5cdGFzc2VydC5vcHRpb25hbE9iamVjdChvcHRpb25zLnZhbGlkVW50aWwsICdvcHRpb25zLnZhbGlkVW50aWwnKTtcblx0dmFyIHZhbGlkRnJvbSA9IG9wdGlvbnMudmFsaWRGcm9tO1xuXHR2YXIgdmFsaWRVbnRpbCA9IG9wdGlvbnMudmFsaWRVbnRpbDtcblx0aWYgKHZhbGlkRnJvbSA9PT0gdW5kZWZpbmVkKVxuXHRcdHZhbGlkRnJvbSA9IG5ldyBEYXRlKCk7XG5cdGlmICh2YWxpZFVudGlsID09PSB1bmRlZmluZWQpIHtcblx0XHRhc3NlcnQub3B0aW9uYWxOdW1iZXIob3B0aW9ucy5saWZldGltZSwgJ29wdGlvbnMubGlmZXRpbWUnKTtcblx0XHR2YXIgbGlmZXRpbWUgPSBvcHRpb25zLmxpZmV0aW1lO1xuXHRcdGlmIChsaWZldGltZSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0bGlmZXRpbWUgPSAxMCozNjUqMjQqMzYwMDtcblx0XHR2YWxpZFVudGlsID0gbmV3IERhdGUoKTtcblx0XHR2YWxpZFVudGlsLnNldFRpbWUodmFsaWRVbnRpbC5nZXRUaW1lKCkgKyBsaWZldGltZSoxMDAwKTtcblx0fVxuXHRhc3NlcnQub3B0aW9uYWxCdWZmZXIob3B0aW9ucy5zZXJpYWwsICdvcHRpb25zLnNlcmlhbCcpO1xuXHR2YXIgc2VyaWFsID0gb3B0aW9ucy5zZXJpYWw7XG5cdGlmIChzZXJpYWwgPT09IHVuZGVmaW5lZClcblx0XHRzZXJpYWwgPSBCdWZmZXIuZnJvbSgnMDAwMDAwMDAwMDAwMDAwMScsICdoZXgnKTtcblxuXHR2YXIgcHVycG9zZXMgPSBvcHRpb25zLnB1cnBvc2VzO1xuXHRpZiAocHVycG9zZXMgPT09IHVuZGVmaW5lZClcblx0XHRwdXJwb3NlcyA9IFtdO1xuXG5cdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdzaWduYXR1cmUnKSA9PT0gLTEpXG5cdFx0cHVycG9zZXMucHVzaCgnc2lnbmF0dXJlJyk7XG5cblx0aWYgKG9wdGlvbnMuY2EgPT09IHRydWUpIHtcblx0XHRpZiAocHVycG9zZXMuaW5kZXhPZignY2EnKSA9PT0gLTEpXG5cdFx0XHRwdXJwb3Nlcy5wdXNoKCdjYScpO1xuXHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdjcmwnKSA9PT0gLTEpXG5cdFx0XHRwdXJwb3Nlcy5wdXNoKCdjcmwnKTtcblx0fVxuXG5cdHZhciBob3N0U3ViamVjdHMgPSBzdWJqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKHN1YmplY3QpIHtcblx0XHRyZXR1cm4gKHN1YmplY3QudHlwZSA9PT0gJ2hvc3QnKTtcblx0fSk7XG5cdHZhciB1c2VyU3ViamVjdHMgPSBzdWJqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKHN1YmplY3QpIHtcblx0XHRyZXR1cm4gKHN1YmplY3QudHlwZSA9PT0gJ3VzZXInKTtcblx0fSk7XG5cdGlmIChob3N0U3ViamVjdHMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdzZXJ2ZXJBdXRoJykgPT09IC0xKVxuXHRcdFx0cHVycG9zZXMucHVzaCgnc2VydmVyQXV0aCcpO1xuXHR9XG5cdGlmICh1c2VyU3ViamVjdHMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdjbGllbnRBdXRoJykgPT09IC0xKVxuXHRcdFx0cHVycG9zZXMucHVzaCgnY2xpZW50QXV0aCcpO1xuXHR9XG5cdGlmICh1c2VyU3ViamVjdHMubGVuZ3RoID4gMCB8fCBob3N0U3ViamVjdHMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdrZXlBZ3JlZW1lbnQnKSA9PT0gLTEpXG5cdFx0XHRwdXJwb3Nlcy5wdXNoKCdrZXlBZ3JlZW1lbnQnKTtcblx0XHRpZiAoa2V5LnR5cGUgPT09ICdyc2EnICYmXG5cdFx0ICAgIHB1cnBvc2VzLmluZGV4T2YoJ2VuY3J5cHRpb24nKSA9PT0gLTEpXG5cdFx0XHRwdXJwb3Nlcy5wdXNoKCdlbmNyeXB0aW9uJyk7XG5cdH1cblxuXHR2YXIgY2VydCA9IG5ldyBDZXJ0aWZpY2F0ZSh7XG5cdFx0c3ViamVjdHM6IHN1YmplY3RzLFxuXHRcdGlzc3VlcjogaXNzdWVyLFxuXHRcdHN1YmplY3RLZXk6IGtleSxcblx0XHRpc3N1ZXJLZXk6IGlzc3VlcktleS50b1B1YmxpYygpLFxuXHRcdHNpZ25hdHVyZXM6IHt9LFxuXHRcdHNlcmlhbDogc2VyaWFsLFxuXHRcdHZhbGlkRnJvbTogdmFsaWRGcm9tLFxuXHRcdHZhbGlkVW50aWw6IHZhbGlkVW50aWwsXG5cdFx0cHVycG9zZXM6IHB1cnBvc2VzXG5cdH0pO1xuXHRjZXJ0LnNpZ25XaXRoKGlzc3VlcktleSk7XG5cblx0cmV0dXJuIChjZXJ0KTtcbn07XG5cbkNlcnRpZmljYXRlLnBhcnNlID0gZnVuY3Rpb24gKGRhdGEsIGZvcm1hdCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIChkYXRhKSAhPT0gJ3N0cmluZycpXG5cdFx0YXNzZXJ0LmJ1ZmZlcihkYXRhLCAnZGF0YScpO1xuXHRpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpXG5cdFx0Zm9ybWF0ID0gJ2F1dG8nO1xuXHRhc3NlcnQuc3RyaW5nKGZvcm1hdCwgJ2Zvcm1hdCcpO1xuXHRpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpXG5cdFx0b3B0aW9ucyA9IHsgZmlsZW5hbWU6IG9wdGlvbnMgfTtcblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcob3B0aW9ucy5maWxlbmFtZSwgJ29wdGlvbnMuZmlsZW5hbWUnKTtcblx0aWYgKG9wdGlvbnMuZmlsZW5hbWUgPT09IHVuZGVmaW5lZClcblx0XHRvcHRpb25zLmZpbGVuYW1lID0gJyh1bm5hbWVkKSc7XG5cblx0YXNzZXJ0Lm9iamVjdChmb3JtYXRzW2Zvcm1hdF0sICdmb3JtYXRzW2Zvcm1hdF0nKTtcblxuXHR0cnkge1xuXHRcdHZhciBrID0gZm9ybWF0c1tmb3JtYXRdLnJlYWQoZGF0YSwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIChrKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHRocm93IChuZXcgQ2VydGlmaWNhdGVQYXJzZUVycm9yKG9wdGlvbnMuZmlsZW5hbWUsIGZvcm1hdCwgZSkpO1xuXHR9XG59O1xuXG5DZXJ0aWZpY2F0ZS5pc0NlcnRpZmljYXRlID0gZnVuY3Rpb24gKG9iaiwgdmVyKSB7XG5cdHJldHVybiAodXRpbHMuaXNDb21wYXRpYmxlKG9iaiwgQ2VydGlmaWNhdGUsIHZlcikpO1xufTtcblxuLypcbiAqIEFQSSB2ZXJzaW9ucyBmb3IgQ2VydGlmaWNhdGU6XG4gKiBbMSwwXSAtLSBpbml0aWFsIHZlclxuICogWzEsMV0gLS0gb3BlbnNzaCBmb3JtYXQgbm93IHVucGFja3MgZXh0ZW5zaW9uc1xuICovXG5DZXJ0aWZpY2F0ZS5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbiA9IFsxLCAxXTtcblxuQ2VydGlmaWNhdGUuX29sZFZlcnNpb25EZXRlY3QgPSBmdW5jdGlvbiAob2JqKSB7XG5cdHJldHVybiAoWzEsIDBdKTtcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTggSm95ZW50LCBJbmMuXG5cbm1vZHVsZS5leHBvcnRzID0gRmluZ2VycHJpbnQ7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi9hbGdzJyk7XG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG52YXIgZXJycyA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG52YXIgS2V5ID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi9wcml2YXRlLWtleScpO1xudmFyIENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi9jZXJ0aWZpY2F0ZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgRmluZ2VycHJpbnRGb3JtYXRFcnJvciA9IGVycnMuRmluZ2VycHJpbnRGb3JtYXRFcnJvcjtcbnZhciBJbnZhbGlkQWxnb3JpdGhtRXJyb3IgPSBlcnJzLkludmFsaWRBbGdvcml0aG1FcnJvcjtcblxuZnVuY3Rpb24gRmluZ2VycHJpbnQob3B0cykge1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGFzc2VydC5zdHJpbmcob3B0cy50eXBlLCAnb3B0aW9ucy50eXBlJyk7XG5cdGFzc2VydC5idWZmZXIob3B0cy5oYXNoLCAnb3B0aW9ucy5oYXNoJyk7XG5cdGFzc2VydC5zdHJpbmcob3B0cy5hbGdvcml0aG0sICdvcHRpb25zLmFsZ29yaXRobScpO1xuXG5cdHRoaXMuYWxnb3JpdGhtID0gb3B0cy5hbGdvcml0aG0udG9Mb3dlckNhc2UoKTtcblx0aWYgKGFsZ3MuaGFzaEFsZ3NbdGhpcy5hbGdvcml0aG1dICE9PSB0cnVlKVxuXHRcdHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKHRoaXMuYWxnb3JpdGhtKSk7XG5cblx0dGhpcy5oYXNoID0gb3B0cy5oYXNoO1xuXHR0aGlzLnR5cGUgPSBvcHRzLnR5cGU7XG5cdHRoaXMuaGFzaFR5cGUgPSBvcHRzLmhhc2hUeXBlO1xufVxuXG5GaW5nZXJwcmludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG5cdGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0aGlzLmFsZ29yaXRobSA9PT0gJ21kNScgfHwgdGhpcy5oYXNoVHlwZSA9PT0gJ3Nwa2knKVxuXHRcdFx0Zm9ybWF0ID0gJ2hleCc7XG5cdFx0ZWxzZVxuXHRcdFx0Zm9ybWF0ID0gJ2Jhc2U2NCc7XG5cdH1cblx0YXNzZXJ0LnN0cmluZyhmb3JtYXQpO1xuXG5cdHN3aXRjaCAoZm9ybWF0KSB7XG5cdGNhc2UgJ2hleCc6XG5cdFx0aWYgKHRoaXMuaGFzaFR5cGUgPT09ICdzcGtpJylcblx0XHRcdHJldHVybiAodGhpcy5oYXNoLnRvU3RyaW5nKCdoZXgnKSk7XG5cdFx0cmV0dXJuIChhZGRDb2xvbnModGhpcy5oYXNoLnRvU3RyaW5nKCdoZXgnKSkpO1xuXHRjYXNlICdiYXNlNjQnOlxuXHRcdGlmICh0aGlzLmhhc2hUeXBlID09PSAnc3BraScpXG5cdFx0XHRyZXR1cm4gKHRoaXMuaGFzaC50b1N0cmluZygnYmFzZTY0JykpO1xuXHRcdHJldHVybiAoc3NoQmFzZTY0Rm9ybWF0KHRoaXMuYWxnb3JpdGhtLFxuXHRcdCAgICB0aGlzLmhhc2gudG9TdHJpbmcoJ2Jhc2U2NCcpKSk7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBGaW5nZXJwcmludEZvcm1hdEVycm9yKHVuZGVmaW5lZCwgZm9ybWF0KSk7XG5cdH1cbn07XG5cbkZpbmdlcnByaW50LnByb3RvdHlwZS5tYXRjaGVzID0gZnVuY3Rpb24gKG90aGVyKSB7XG5cdGFzc2VydC5vYmplY3Qob3RoZXIsICdrZXkgb3IgY2VydGlmaWNhdGUnKTtcblx0aWYgKHRoaXMudHlwZSA9PT0gJ2tleScgJiYgdGhpcy5oYXNoVHlwZSAhPT0gJ3NzaCcpIHtcblx0XHR1dGlscy5hc3NlcnRDb21wYXRpYmxlKG90aGVyLCBLZXksIFsxLCA3XSwgJ2tleSB3aXRoIHNwa2knKTtcblx0XHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkob3RoZXIpKSB7XG5cdFx0XHR1dGlscy5hc3NlcnRDb21wYXRpYmxlKG90aGVyLCBQcml2YXRlS2V5LCBbMSwgNl0sXG5cdFx0XHQgICAgJ3ByaXZhdGVrZXkgd2l0aCBzcGtpIHN1cHBvcnQnKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAna2V5Jykge1xuXHRcdHV0aWxzLmFzc2VydENvbXBhdGlibGUob3RoZXIsIEtleSwgWzEsIDBdLCAna2V5Jyk7XG5cdH0gZWxzZSB7XG5cdFx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShvdGhlciwgQ2VydGlmaWNhdGUsIFsxLCAwXSxcblx0XHQgICAgJ2NlcnRpZmljYXRlJyk7XG5cdH1cblxuXHR2YXIgdGhlaXJIYXNoID0gb3RoZXIuaGFzaCh0aGlzLmFsZ29yaXRobSwgdGhpcy5oYXNoVHlwZSk7XG5cdHZhciB0aGVpckhhc2gyID0gY3J5cHRvLmNyZWF0ZUhhc2godGhpcy5hbGdvcml0aG0pLlxuXHQgICAgdXBkYXRlKHRoZWlySGFzaCkuZGlnZXN0KCdiYXNlNjQnKTtcblxuXHRpZiAodGhpcy5oYXNoMiA9PT0gdW5kZWZpbmVkKVxuXHRcdHRoaXMuaGFzaDIgPSBjcnlwdG8uY3JlYXRlSGFzaCh0aGlzLmFsZ29yaXRobSkuXG5cdFx0ICAgIHVwZGF0ZSh0aGlzLmhhc2gpLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cblx0cmV0dXJuICh0aGlzLmhhc2gyID09PSB0aGVpckhhc2gyKTtcbn07XG5cbi8qSlNTVFlMRUQqL1xudmFyIGJhc2U2NFJFID0gL15bQS1aYS16MC05K1xcLz1dKyQvO1xuLypKU1NUWUxFRCovXG52YXIgaGV4UkUgPSAvXlthLWZBLUYwLTldKyQvO1xuXG5GaW5nZXJwcmludC5wYXJzZSA9IGZ1bmN0aW9uIChmcCwgb3B0aW9ucykge1xuXHRhc3NlcnQuc3RyaW5nKGZwLCAnZmluZ2VycHJpbnQnKTtcblxuXHR2YXIgYWxnLCBoYXNoLCBlbkFsZ3M7XG5cdGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7XG5cdFx0ZW5BbGdzID0gb3B0aW9ucztcblx0XHRvcHRpb25zID0ge307XG5cdH1cblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRpZiAob3B0aW9ucy5lbkFsZ3MgIT09IHVuZGVmaW5lZClcblx0XHRlbkFsZ3MgPSBvcHRpb25zLmVuQWxncztcblx0aWYgKG9wdGlvbnMuYWxnb3JpdGhtcyAhPT0gdW5kZWZpbmVkKVxuXHRcdGVuQWxncyA9IG9wdGlvbnMuYWxnb3JpdGhtcztcblx0YXNzZXJ0Lm9wdGlvbmFsQXJyYXlPZlN0cmluZyhlbkFsZ3MsICdhbGdvcml0aG1zJyk7XG5cblx0dmFyIGhhc2hUeXBlID0gJ3NzaCc7XG5cdGlmIChvcHRpb25zLmhhc2hUeXBlICE9PSB1bmRlZmluZWQpXG5cdFx0aGFzaFR5cGUgPSBvcHRpb25zLmhhc2hUeXBlO1xuXHRhc3NlcnQuc3RyaW5nKGhhc2hUeXBlLCAnb3B0aW9ucy5oYXNoVHlwZScpO1xuXG5cdHZhciBwYXJ0cyA9IGZwLnNwbGl0KCc6Jyk7XG5cdGlmIChwYXJ0cy5sZW5ndGggPT0gMikge1xuXHRcdGFsZyA9IHBhcnRzWzBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKCFiYXNlNjRSRS50ZXN0KHBhcnRzWzFdKSlcblx0XHRcdHRocm93IChuZXcgRmluZ2VycHJpbnRGb3JtYXRFcnJvcihmcCkpO1xuXHRcdHRyeSB7XG5cdFx0XHRoYXNoID0gQnVmZmVyLmZyb20ocGFydHNbMV0sICdiYXNlNjQnKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHR0aHJvdyAobmV3IEZpbmdlcnByaW50Rm9ybWF0RXJyb3IoZnApKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID4gMikge1xuXHRcdGFsZyA9ICdtZDUnO1xuXHRcdGlmIChwYXJ0c1swXS50b0xvd2VyQ2FzZSgpID09PSAnbWQ1Jylcblx0XHRcdHBhcnRzID0gcGFydHMuc2xpY2UoMSk7XG5cdFx0cGFydHMgPSBwYXJ0cy5tYXAoZnVuY3Rpb24gKHApIHtcblx0XHRcdHdoaWxlIChwLmxlbmd0aCA8IDIpXG5cdFx0XHRcdHAgPSAnMCcgKyBwO1xuXHRcdFx0aWYgKHAubGVuZ3RoID4gMilcblx0XHRcdFx0dGhyb3cgKG5ldyBGaW5nZXJwcmludEZvcm1hdEVycm9yKGZwKSk7XG5cdFx0XHRyZXR1cm4gKHApO1xuXHRcdH0pO1xuXHRcdHBhcnRzID0gcGFydHMuam9pbignJyk7XG5cdFx0aWYgKCFoZXhSRS50ZXN0KHBhcnRzKSB8fCBwYXJ0cy5sZW5ndGggJSAyICE9PSAwKVxuXHRcdFx0dGhyb3cgKG5ldyBGaW5nZXJwcmludEZvcm1hdEVycm9yKGZwKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGhhc2ggPSBCdWZmZXIuZnJvbShwYXJ0cywgJ2hleCcpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHRocm93IChuZXcgRmluZ2VycHJpbnRGb3JtYXRFcnJvcihmcCkpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoaGV4UkUudGVzdChmcCkpIHtcblx0XHRcdGhhc2ggPSBCdWZmZXIuZnJvbShmcCwgJ2hleCcpO1xuXHRcdH0gZWxzZSBpZiAoYmFzZTY0UkUudGVzdChmcCkpIHtcblx0XHRcdGhhc2ggPSBCdWZmZXIuZnJvbShmcCwgJ2Jhc2U2NCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyAobmV3IEZpbmdlcnByaW50Rm9ybWF0RXJyb3IoZnApKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKGhhc2gubGVuZ3RoKSB7XG5cdFx0Y2FzZSAzMjpcblx0XHRcdGFsZyA9ICdzaGEyNTYnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAxNjpcblx0XHRcdGFsZyA9ICdtZDUnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyMDpcblx0XHRcdGFsZyA9ICdzaGExJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgNjQ6XG5cdFx0XHRhbGcgPSAnc2hhNTEyJztcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyAobmV3IEZpbmdlcnByaW50Rm9ybWF0RXJyb3IoZnApKTtcblx0XHR9XG5cblx0XHQvKiBQbGFpbiBoZXgvYmFzZTY0OiBndWVzcyBpdCdzIHByb2JhYmx5IFNQS0kgdW5sZXNzIHRvbGQuICovXG5cdFx0aWYgKG9wdGlvbnMuaGFzaFR5cGUgPT09IHVuZGVmaW5lZClcblx0XHRcdGhhc2hUeXBlID0gJ3Nwa2knO1xuXHR9XG5cblx0aWYgKGFsZyA9PT0gdW5kZWZpbmVkKVxuXHRcdHRocm93IChuZXcgRmluZ2VycHJpbnRGb3JtYXRFcnJvcihmcCkpO1xuXG5cdGlmIChhbGdzLmhhc2hBbGdzW2FsZ10gPT09IHVuZGVmaW5lZClcblx0XHR0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcihhbGcpKTtcblxuXHRpZiAoZW5BbGdzICE9PSB1bmRlZmluZWQpIHtcblx0XHRlbkFsZ3MgPSBlbkFsZ3MubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLnRvTG93ZXJDYXNlKCk7IH0pO1xuXHRcdGlmIChlbkFsZ3MuaW5kZXhPZihhbGcpID09PSAtMSlcblx0XHRcdHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKGFsZykpO1xuXHR9XG5cblx0cmV0dXJuIChuZXcgRmluZ2VycHJpbnQoe1xuXHRcdGFsZ29yaXRobTogYWxnLFxuXHRcdGhhc2g6IGhhc2gsXG5cdFx0dHlwZTogb3B0aW9ucy50eXBlIHx8ICdrZXknLFxuXHRcdGhhc2hUeXBlOiBoYXNoVHlwZVxuXHR9KSk7XG59O1xuXG5mdW5jdGlvbiBhZGRDb2xvbnMocykge1xuXHQvKkpTU1RZTEVEKi9cblx0cmV0dXJuIChzLnJlcGxhY2UoLyguezJ9KSg/PS4pL2csICckMTonKSk7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFN0cmlwKHMpIHtcblx0LypKU1NUWUxFRCovXG5cdHJldHVybiAocy5yZXBsYWNlKC89KiQvLCAnJykpO1xufVxuXG5mdW5jdGlvbiBzc2hCYXNlNjRGb3JtYXQoYWxnLCBoKSB7XG5cdHJldHVybiAoYWxnLnRvVXBwZXJDYXNlKCkgKyAnOicgKyBiYXNlNjRTdHJpcChoKSk7XG59XG5cbkZpbmdlcnByaW50LmlzRmluZ2VycHJpbnQgPSBmdW5jdGlvbiAob2JqLCB2ZXIpIHtcblx0cmV0dXJuICh1dGlscy5pc0NvbXBhdGlibGUob2JqLCBGaW5nZXJwcmludCwgdmVyKSk7XG59O1xuXG4vKlxuICogQVBJIHZlcnNpb25zIGZvciBGaW5nZXJwcmludDpcbiAqIFsxLDBdIC0tIGluaXRpYWwgdmVyXG4gKiBbMSwxXSAtLSBmaXJzdCB0YWdnZWQgdmVyXG4gKiBbMSwyXSAtLSBoYXNoVHlwZSBhbmQgc3BraSBzdXBwb3J0XG4gKi9cbkZpbmdlcnByaW50LnByb3RvdHlwZS5fc3NocGtBcGlWZXJzaW9uID0gWzEsIDJdO1xuXG5GaW5nZXJwcmludC5fb2xkVmVyc2lvbkRldGVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0YXNzZXJ0LmZ1bmMob2JqLnRvU3RyaW5nKTtcblx0YXNzZXJ0LmZ1bmMob2JqLm1hdGNoZXMpO1xuXHRyZXR1cm4gKFsxLCAwXSk7XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDE4IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IEtleTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgYWxncyA9IHJlcXVpcmUoJy4vYWxncycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIEZpbmdlcnByaW50ID0gcmVxdWlyZSgnLi9maW5nZXJwcmludCcpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgRGlmZmllSGVsbG1hbiA9IHJlcXVpcmUoJy4vZGhlJykuRGlmZmllSGVsbG1hbjtcbnZhciBlcnJzID0gcmVxdWlyZSgnLi9lcnJvcnMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi9wcml2YXRlLWtleScpO1xudmFyIGVkQ29tcGF0O1xuXG50cnkge1xuXHRlZENvbXBhdCA9IHJlcXVpcmUoJy4vZWQtY29tcGF0Jyk7XG59IGNhdGNoIChlKSB7XG5cdC8qIEp1c3QgY29udGludWUgdGhyb3VnaCwgYW5kIGJhaWwgb3V0IGlmIHdlIHRyeSB0byB1c2UgaXQuICovXG59XG5cbnZhciBJbnZhbGlkQWxnb3JpdGhtRXJyb3IgPSBlcnJzLkludmFsaWRBbGdvcml0aG1FcnJvcjtcbnZhciBLZXlQYXJzZUVycm9yID0gZXJycy5LZXlQYXJzZUVycm9yO1xuXG52YXIgZm9ybWF0cyA9IHt9O1xuZm9ybWF0c1snYXV0byddID0gcmVxdWlyZSgnLi9mb3JtYXRzL2F1dG8nKTtcbmZvcm1hdHNbJ3BlbSddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3BlbScpO1xuZm9ybWF0c1sncGtjczEnXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9wa2NzMScpO1xuZm9ybWF0c1sncGtjczgnXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9wa2NzOCcpO1xuZm9ybWF0c1sncmZjNDI1MyddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3JmYzQyNTMnKTtcbmZvcm1hdHNbJ3NzaCddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3NzaCcpO1xuZm9ybWF0c1snc3NoLXByaXZhdGUnXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9zc2gtcHJpdmF0ZScpO1xuZm9ybWF0c1snb3BlbnNzaCddID0gZm9ybWF0c1snc3NoLXByaXZhdGUnXTtcbmZvcm1hdHNbJ2Ruc3NlYyddID0gcmVxdWlyZSgnLi9mb3JtYXRzL2Ruc3NlYycpO1xuZm9ybWF0c1sncHV0dHknXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9wdXR0eScpO1xuZm9ybWF0c1sncHBrJ10gPSBmb3JtYXRzWydwdXR0eSddO1xuXG5mdW5jdGlvbiBLZXkob3B0cykge1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KG9wdHMucGFydHMsICdvcHRpb25zLnBhcnRzJyk7XG5cdGFzc2VydC5zdHJpbmcob3B0cy50eXBlLCAnb3B0aW9ucy50eXBlJyk7XG5cdGFzc2VydC5vcHRpb25hbFN0cmluZyhvcHRzLmNvbW1lbnQsICdvcHRpb25zLmNvbW1lbnQnKTtcblxuXHR2YXIgYWxnSW5mbyA9IGFsZ3MuaW5mb1tvcHRzLnR5cGVdO1xuXHRpZiAodHlwZW9mIChhbGdJbmZvKSAhPT0gJ29iamVjdCcpXG5cdFx0dGhyb3cgKG5ldyBJbnZhbGlkQWxnb3JpdGhtRXJyb3Iob3B0cy50eXBlKSk7XG5cblx0dmFyIHBhcnRMb29rdXAgPSB7fTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBvcHRzLnBhcnRzLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHBhcnQgPSBvcHRzLnBhcnRzW2ldO1xuXHRcdHBhcnRMb29rdXBbcGFydC5uYW1lXSA9IHBhcnQ7XG5cdH1cblxuXHR0aGlzLnR5cGUgPSBvcHRzLnR5cGU7XG5cdHRoaXMucGFydHMgPSBvcHRzLnBhcnRzO1xuXHR0aGlzLnBhcnQgPSBwYXJ0TG9va3VwO1xuXHR0aGlzLmNvbW1lbnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMuc291cmNlID0gb3B0cy5zb3VyY2U7XG5cblx0LyogZm9yIHNwZWVkaW5nIHVwIGhhc2hpbmcvZmluZ2VycHJpbnQgb3BlcmF0aW9ucyAqL1xuXHR0aGlzLl9yZmM0MjUzQ2FjaGUgPSBvcHRzLl9yZmM0MjUzQ2FjaGU7XG5cdHRoaXMuX2hhc2hDYWNoZSA9IHt9O1xuXG5cdHZhciBzejtcblx0dGhpcy5jdXJ2ZSA9IHVuZGVmaW5lZDtcblx0aWYgKHRoaXMudHlwZSA9PT0gJ2VjZHNhJykge1xuXHRcdHZhciBjdXJ2ZSA9IHRoaXMucGFydC5jdXJ2ZS5kYXRhLnRvU3RyaW5nKCk7XG5cdFx0dGhpcy5jdXJ2ZSA9IGN1cnZlO1xuXHRcdHN6ID0gYWxncy5jdXJ2ZXNbY3VydmVdLnNpemU7XG5cdH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnZWQyNTUxOScgfHwgdGhpcy50eXBlID09PSAnY3VydmUyNTUxOScpIHtcblx0XHRzeiA9IDI1Njtcblx0XHR0aGlzLmN1cnZlID0gJ2N1cnZlMjU1MTknO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBzelBhcnQgPSB0aGlzLnBhcnRbYWxnSW5mby5zaXplUGFydF07XG5cdFx0c3ogPSBzelBhcnQuZGF0YS5sZW5ndGg7XG5cdFx0c3ogPSBzeiAqIDggLSB1dGlscy5jb3VudFplcm9zKHN6UGFydC5kYXRhKTtcblx0fVxuXHR0aGlzLnNpemUgPSBzejtcbn1cblxuS2V5LmZvcm1hdHMgPSBmb3JtYXRzO1xuXG5LZXkucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24gKGZvcm1hdCwgb3B0aW9ucykge1xuXHRpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpXG5cdFx0Zm9ybWF0ID0gJ3NzaCc7XG5cdGFzc2VydC5zdHJpbmcoZm9ybWF0LCAnZm9ybWF0Jyk7XG5cdGFzc2VydC5vYmplY3QoZm9ybWF0c1tmb3JtYXRdLCAnZm9ybWF0c1tmb3JtYXRdJyk7XG5cdGFzc2VydC5vcHRpb25hbE9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpO1xuXG5cdGlmIChmb3JtYXQgPT09ICdyZmM0MjUzJykge1xuXHRcdGlmICh0aGlzLl9yZmM0MjUzQ2FjaGUgPT09IHVuZGVmaW5lZClcblx0XHRcdHRoaXMuX3JmYzQyNTNDYWNoZSA9IGZvcm1hdHNbJ3JmYzQyNTMnXS53cml0ZSh0aGlzKTtcblx0XHRyZXR1cm4gKHRoaXMuX3JmYzQyNTNDYWNoZSk7XG5cdH1cblxuXHRyZXR1cm4gKGZvcm1hdHNbZm9ybWF0XS53cml0ZSh0aGlzLCBvcHRpb25zKSk7XG59O1xuXG5LZXkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGZvcm1hdCwgb3B0aW9ucykge1xuXHRyZXR1cm4gKHRoaXMudG9CdWZmZXIoZm9ybWF0LCBvcHRpb25zKS50b1N0cmluZygpKTtcbn07XG5cbktleS5wcm90b3R5cGUuaGFzaCA9IGZ1bmN0aW9uIChhbGdvLCB0eXBlKSB7XG5cdGFzc2VydC5zdHJpbmcoYWxnbywgJ2FsZ29yaXRobScpO1xuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcodHlwZSwgJ3R5cGUnKTtcblx0aWYgKHR5cGUgPT09IHVuZGVmaW5lZClcblx0XHR0eXBlID0gJ3NzaCc7XG5cdGFsZ28gPSBhbGdvLnRvTG93ZXJDYXNlKCk7XG5cdGlmIChhbGdzLmhhc2hBbGdzW2FsZ29dID09PSB1bmRlZmluZWQpXG5cdFx0dGhyb3cgKG5ldyBJbnZhbGlkQWxnb3JpdGhtRXJyb3IoYWxnbykpO1xuXG5cdHZhciBjYWNoZUtleSA9IGFsZ28gKyAnfHwnICsgdHlwZTtcblx0aWYgKHRoaXMuX2hhc2hDYWNoZVtjYWNoZUtleV0pXG5cdFx0cmV0dXJuICh0aGlzLl9oYXNoQ2FjaGVbY2FjaGVLZXldKTtcblxuXHR2YXIgYnVmO1xuXHRpZiAodHlwZSA9PT0gJ3NzaCcpIHtcblx0XHRidWYgPSB0aGlzLnRvQnVmZmVyKCdyZmM0MjUzJyk7XG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gJ3Nwa2knKSB7XG5cdFx0YnVmID0gZm9ybWF0cy5wa2NzOC5wa2NzOFRvQnVmZmVyKHRoaXMpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0hhc2ggdHlwZSAnICsgdHlwZSArICcgbm90IHN1cHBvcnRlZCcpKTtcblx0fVxuXHR2YXIgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ28pLnVwZGF0ZShidWYpLmRpZ2VzdCgpO1xuXHR0aGlzLl9oYXNoQ2FjaGVbY2FjaGVLZXldID0gaGFzaDtcblx0cmV0dXJuIChoYXNoKTtcbn07XG5cbktleS5wcm90b3R5cGUuZmluZ2VycHJpbnQgPSBmdW5jdGlvbiAoYWxnbywgdHlwZSkge1xuXHRpZiAoYWxnbyA9PT0gdW5kZWZpbmVkKVxuXHRcdGFsZ28gPSAnc2hhMjU2Jztcblx0aWYgKHR5cGUgPT09IHVuZGVmaW5lZClcblx0XHR0eXBlID0gJ3NzaCc7XG5cdGFzc2VydC5zdHJpbmcoYWxnbywgJ2FsZ29yaXRobScpO1xuXHRhc3NlcnQuc3RyaW5nKHR5cGUsICd0eXBlJyk7XG5cdHZhciBvcHRzID0ge1xuXHRcdHR5cGU6ICdrZXknLFxuXHRcdGhhc2g6IHRoaXMuaGFzaChhbGdvLCB0eXBlKSxcblx0XHRhbGdvcml0aG06IGFsZ28sXG5cdFx0aGFzaFR5cGU6IHR5cGVcblx0fTtcblx0cmV0dXJuIChuZXcgRmluZ2VycHJpbnQob3B0cykpO1xufTtcblxuS2V5LnByb3RvdHlwZS5kZWZhdWx0SGFzaEFsZ29yaXRobSA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGhhc2hBbGdvID0gJ3NoYTEnO1xuXHRpZiAodGhpcy50eXBlID09PSAncnNhJylcblx0XHRoYXNoQWxnbyA9ICdzaGEyNTYnO1xuXHRpZiAodGhpcy50eXBlID09PSAnZHNhJyAmJiB0aGlzLnNpemUgPiAxMDI0KVxuXHRcdGhhc2hBbGdvID0gJ3NoYTI1Nic7XG5cdGlmICh0aGlzLnR5cGUgPT09ICdlZDI1NTE5Jylcblx0XHRoYXNoQWxnbyA9ICdzaGE1MTInO1xuXHRpZiAodGhpcy50eXBlID09PSAnZWNkc2EnKSB7XG5cdFx0aWYgKHRoaXMuc2l6ZSA8PSAyNTYpXG5cdFx0XHRoYXNoQWxnbyA9ICdzaGEyNTYnO1xuXHRcdGVsc2UgaWYgKHRoaXMuc2l6ZSA8PSAzODQpXG5cdFx0XHRoYXNoQWxnbyA9ICdzaGEzODQnO1xuXHRcdGVsc2Vcblx0XHRcdGhhc2hBbGdvID0gJ3NoYTUxMic7XG5cdH1cblx0cmV0dXJuIChoYXNoQWxnbyk7XG59O1xuXG5LZXkucHJvdG90eXBlLmNyZWF0ZVZlcmlmeSA9IGZ1bmN0aW9uIChoYXNoQWxnbykge1xuXHRpZiAoaGFzaEFsZ28gPT09IHVuZGVmaW5lZClcblx0XHRoYXNoQWxnbyA9IHRoaXMuZGVmYXVsdEhhc2hBbGdvcml0aG0oKTtcblx0YXNzZXJ0LnN0cmluZyhoYXNoQWxnbywgJ2hhc2ggYWxnb3JpdGhtJyk7XG5cblx0LyogRUQyNTUxOSBpcyBub3Qgc3VwcG9ydGVkIGJ5IE9wZW5TU0wsIHVzZSBhIGphdmFzY3JpcHQgaW1wbC4gKi9cblx0aWYgKHRoaXMudHlwZSA9PT0gJ2VkMjU1MTknICYmIGVkQ29tcGF0ICE9PSB1bmRlZmluZWQpXG5cdFx0cmV0dXJuIChuZXcgZWRDb21wYXQuVmVyaWZpZXIodGhpcywgaGFzaEFsZ28pKTtcblx0aWYgKHRoaXMudHlwZSA9PT0gJ2N1cnZlMjU1MTknKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ0N1cnZlMjU1MTkga2V5cyBhcmUgbm90IHN1aXRhYmxlIGZvciAnICtcblx0XHQgICAgJ3NpZ25pbmcgb3IgdmVyaWZpY2F0aW9uJykpO1xuXG5cdHZhciB2LCBubSwgZXJyO1xuXHR0cnkge1xuXHRcdG5tID0gaGFzaEFsZ28udG9VcHBlckNhc2UoKTtcblx0XHR2ID0gY3J5cHRvLmNyZWF0ZVZlcmlmeShubSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRlcnIgPSBlO1xuXHR9XG5cdGlmICh2ID09PSB1bmRlZmluZWQgfHwgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmXG5cdCAgICBlcnIubWVzc2FnZS5tYXRjaCgvVW5rbm93biBtZXNzYWdlIGRpZ2VzdC8pKSkge1xuXHRcdG5tID0gJ1JTQS0nO1xuXHRcdG5tICs9IGhhc2hBbGdvLnRvVXBwZXJDYXNlKCk7XG5cdFx0diA9IGNyeXB0by5jcmVhdGVWZXJpZnkobm0pO1xuXHR9XG5cdGFzc2VydC5vayh2LCAnZmFpbGVkIHRvIGNyZWF0ZSB2ZXJpZmllcicpO1xuXHR2YXIgb2xkVmVyaWZ5ID0gdi52ZXJpZnkuYmluZCh2KTtcblx0dmFyIGtleSA9IHRoaXMudG9CdWZmZXIoJ3BrY3M4Jyk7XG5cdHZhciBjdXJ2ZSA9IHRoaXMuY3VydmU7XG5cdHZhciBzZWxmID0gdGhpcztcblx0di52ZXJpZnkgPSBmdW5jdGlvbiAoc2lnbmF0dXJlLCBmbXQpIHtcblx0XHRpZiAoU2lnbmF0dXJlLmlzU2lnbmF0dXJlKHNpZ25hdHVyZSwgWzIsIDBdKSkge1xuXHRcdFx0aWYgKHNpZ25hdHVyZS50eXBlICE9PSBzZWxmLnR5cGUpXG5cdFx0XHRcdHJldHVybiAoZmFsc2UpO1xuXHRcdFx0aWYgKHNpZ25hdHVyZS5oYXNoQWxnb3JpdGhtICYmXG5cdFx0XHQgICAgc2lnbmF0dXJlLmhhc2hBbGdvcml0aG0gIT09IGhhc2hBbGdvKVxuXHRcdFx0XHRyZXR1cm4gKGZhbHNlKTtcblx0XHRcdGlmIChzaWduYXR1cmUuY3VydmUgJiYgc2VsZi50eXBlID09PSAnZWNkc2EnICYmXG5cdFx0XHQgICAgc2lnbmF0dXJlLmN1cnZlICE9PSBjdXJ2ZSlcblx0XHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cdFx0XHRyZXR1cm4gKG9sZFZlcmlmeShrZXksIHNpZ25hdHVyZS50b0J1ZmZlcignYXNuMScpKSk7XG5cblx0XHR9IGVsc2UgaWYgKHR5cGVvZiAoc2lnbmF0dXJlKSA9PT0gJ3N0cmluZycgfHxcblx0XHQgICAgQnVmZmVyLmlzQnVmZmVyKHNpZ25hdHVyZSkpIHtcblx0XHRcdHJldHVybiAob2xkVmVyaWZ5KGtleSwgc2lnbmF0dXJlLCBmbXQpKTtcblxuXHRcdC8qXG5cdFx0ICogQXZvaWQgZG9pbmcgdGhpcyBvbiB2YWxpZCBhcmd1bWVudHMsIHdhbGtpbmcgdGhlIHByb3RvdHlwZVxuXHRcdCAqIGNoYWluIGNhbiBiZSBxdWl0ZSBzbG93LlxuXHRcdCAqL1xuXHRcdH0gZWxzZSBpZiAoU2lnbmF0dXJlLmlzU2lnbmF0dXJlKHNpZ25hdHVyZSwgWzEsIDBdKSkge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignc2lnbmF0dXJlIHdhcyBjcmVhdGVkIGJ5IHRvbyBvbGQgJyArXG5cdFx0XHQgICAgJ2EgdmVyc2lvbiBvZiBzc2hwayBhbmQgY2Fubm90IGJlIHZlcmlmaWVkJykpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IChuZXcgVHlwZUVycm9yKCdzaWduYXR1cmUgbXVzdCBiZSBhIHN0cmluZywgJyArXG5cdFx0XHQgICAgJ0J1ZmZlciwgb3IgU2lnbmF0dXJlIG9iamVjdCcpKTtcblx0XHR9XG5cdH07XG5cdHJldHVybiAodik7XG59O1xuXG5LZXkucHJvdG90eXBlLmNyZWF0ZURpZmZpZUhlbGxtYW4gPSBmdW5jdGlvbiAoKSB7XG5cdGlmICh0aGlzLnR5cGUgPT09ICdyc2EnKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ1JTQSBrZXlzIGRvIG5vdCBzdXBwb3J0IERpZmZpZS1IZWxsbWFuJykpO1xuXG5cdHJldHVybiAobmV3IERpZmZpZUhlbGxtYW4odGhpcykpO1xufTtcbktleS5wcm90b3R5cGUuY3JlYXRlREggPSBLZXkucHJvdG90eXBlLmNyZWF0ZURpZmZpZUhlbGxtYW47XG5cbktleS5wYXJzZSA9IGZ1bmN0aW9uIChkYXRhLCBmb3JtYXQsIG9wdGlvbnMpIHtcblx0aWYgKHR5cGVvZiAoZGF0YSkgIT09ICdzdHJpbmcnKVxuXHRcdGFzc2VydC5idWZmZXIoZGF0YSwgJ2RhdGEnKTtcblx0aWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKVxuXHRcdGZvcm1hdCA9ICdhdXRvJztcblx0YXNzZXJ0LnN0cmluZyhmb3JtYXQsICdmb3JtYXQnKTtcblx0aWYgKHR5cGVvZiAob3B0aW9ucykgPT09ICdzdHJpbmcnKVxuXHRcdG9wdGlvbnMgPSB7IGZpbGVuYW1lOiBvcHRpb25zIH07XG5cdGFzc2VydC5vcHRpb25hbE9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpO1xuXHRpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKVxuXHRcdG9wdGlvbnMgPSB7fTtcblx0YXNzZXJ0Lm9wdGlvbmFsU3RyaW5nKG9wdGlvbnMuZmlsZW5hbWUsICdvcHRpb25zLmZpbGVuYW1lJyk7XG5cdGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucy5maWxlbmFtZSA9ICcodW5uYW1lZCknO1xuXG5cdGFzc2VydC5vYmplY3QoZm9ybWF0c1tmb3JtYXRdLCAnZm9ybWF0c1tmb3JtYXRdJyk7XG5cblx0dHJ5IHtcblx0XHR2YXIgayA9IGZvcm1hdHNbZm9ybWF0XS5yZWFkKGRhdGEsIG9wdGlvbnMpO1xuXHRcdGlmIChrIGluc3RhbmNlb2YgUHJpdmF0ZUtleSlcblx0XHRcdGsgPSBrLnRvUHVibGljKCk7XG5cdFx0aWYgKCFrLmNvbW1lbnQpXG5cdFx0XHRrLmNvbW1lbnQgPSBvcHRpb25zLmZpbGVuYW1lO1xuXHRcdHJldHVybiAoayk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAoZS5uYW1lID09PSAnS2V5RW5jcnlwdGVkRXJyb3InKVxuXHRcdFx0dGhyb3cgKGUpO1xuXHRcdHRocm93IChuZXcgS2V5UGFyc2VFcnJvcihvcHRpb25zLmZpbGVuYW1lLCBmb3JtYXQsIGUpKTtcblx0fVxufTtcblxuS2V5LmlzS2V5ID0gZnVuY3Rpb24gKG9iaiwgdmVyKSB7XG5cdHJldHVybiAodXRpbHMuaXNDb21wYXRpYmxlKG9iaiwgS2V5LCB2ZXIpKTtcbn07XG5cbi8qXG4gKiBBUEkgdmVyc2lvbnMgZm9yIEtleTpcbiAqIFsxLDBdIC0tIGluaXRpYWwgdmVyLCBtYXkgdGFrZSBTaWduYXR1cmUgZm9yIGNyZWF0ZVZlcmlmeSBvciBtYXkgbm90XG4gKiBbMSwxXSAtLSBhZGRlZCBwa2NzMSwgcGtjczggZm9ybWF0c1xuICogWzEsMl0gLS0gYWRkZWQgYXV0bywgc3NoLXByaXZhdGUsIG9wZW5zc2ggZm9ybWF0c1xuICogWzEsM10gLS0gYWRkZWQgZGVmYXVsdEhhc2hBbGdvcml0aG1cbiAqIFsxLDRdIC0tIGFkZGVkIGVkIHN1cHBvcnQsIGNyZWF0ZURIXG4gKiBbMSw1XSAtLSBmaXJzdCBleHBsaWNpdGx5IHRhZ2dlZCB2ZXJzaW9uXG4gKiBbMSw2XSAtLSBjaGFuZ2VkIGVkMjU1MTkgcGFydCBuYW1lc1xuICogWzEsN10gLS0gc3BraSBoYXNoIHR5cGVzXG4gKi9cbktleS5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbiA9IFsxLCA3XTtcblxuS2V5Ll9vbGRWZXJzaW9uRGV0ZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuXHRhc3NlcnQuZnVuYyhvYmoudG9CdWZmZXIpO1xuXHRhc3NlcnQuZnVuYyhvYmouZmluZ2VycHJpbnQpO1xuXHRpZiAob2JqLmNyZWF0ZURIKVxuXHRcdHJldHVybiAoWzEsIDRdKTtcblx0aWYgKG9iai5kZWZhdWx0SGFzaEFsZ29yaXRobSlcblx0XHRyZXR1cm4gKFsxLCAzXSk7XG5cdGlmIChvYmouZm9ybWF0c1snYXV0byddKVxuXHRcdHJldHVybiAoWzEsIDJdKTtcblx0aWYgKG9iai5mb3JtYXRzWydwa2NzMSddKVxuXHRcdHJldHVybiAoWzEsIDFdKTtcblx0cmV0dXJuIChbMSwgMF0pO1xufTtcbiIsICIvLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxudmFyIEtleSA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgRmluZ2VycHJpbnQgPSByZXF1aXJlKCcuL2ZpbmdlcnByaW50Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi9wcml2YXRlLWtleScpO1xudmFyIENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi9jZXJ0aWZpY2F0ZScpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xudmFyIGVycnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0LyogdG9wLWxldmVsIGNsYXNzZXMgKi9cblx0S2V5OiBLZXksXG5cdHBhcnNlS2V5OiBLZXkucGFyc2UsXG5cdEZpbmdlcnByaW50OiBGaW5nZXJwcmludCxcblx0cGFyc2VGaW5nZXJwcmludDogRmluZ2VycHJpbnQucGFyc2UsXG5cdFNpZ25hdHVyZTogU2lnbmF0dXJlLFxuXHRwYXJzZVNpZ25hdHVyZTogU2lnbmF0dXJlLnBhcnNlLFxuXHRQcml2YXRlS2V5OiBQcml2YXRlS2V5LFxuXHRwYXJzZVByaXZhdGVLZXk6IFByaXZhdGVLZXkucGFyc2UsXG5cdGdlbmVyYXRlUHJpdmF0ZUtleTogUHJpdmF0ZUtleS5nZW5lcmF0ZSxcblx0Q2VydGlmaWNhdGU6IENlcnRpZmljYXRlLFxuXHRwYXJzZUNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5wYXJzZSxcblx0Y3JlYXRlU2VsZlNpZ25lZENlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5jcmVhdGVTZWxmU2lnbmVkLFxuXHRjcmVhdGVDZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuY3JlYXRlLFxuXHRJZGVudGl0eTogSWRlbnRpdHksXG5cdGlkZW50aXR5RnJvbUROOiBJZGVudGl0eS5wYXJzZUROLFxuXHRpZGVudGl0eUZvckhvc3Q6IElkZW50aXR5LmZvckhvc3QsXG5cdGlkZW50aXR5Rm9yVXNlcjogSWRlbnRpdHkuZm9yVXNlcixcblx0aWRlbnRpdHlGb3JFbWFpbDogSWRlbnRpdHkuZm9yRW1haWwsXG5cdGlkZW50aXR5RnJvbUFycmF5OiBJZGVudGl0eS5mcm9tQXJyYXksXG5cblx0LyogZXJyb3JzICovXG5cdEZpbmdlcnByaW50Rm9ybWF0RXJyb3I6IGVycnMuRmluZ2VycHJpbnRGb3JtYXRFcnJvcixcblx0SW52YWxpZEFsZ29yaXRobUVycm9yOiBlcnJzLkludmFsaWRBbGdvcml0aG1FcnJvcixcblx0S2V5UGFyc2VFcnJvcjogZXJycy5LZXlQYXJzZUVycm9yLFxuXHRTaWduYXR1cmVQYXJzZUVycm9yOiBlcnJzLlNpZ25hdHVyZVBhcnNlRXJyb3IsXG5cdEtleUVuY3J5cHRlZEVycm9yOiBlcnJzLktleUVuY3J5cHRlZEVycm9yLFxuXHRDZXJ0aWZpY2F0ZVBhcnNlRXJyb3I6IGVycnMuQ2VydGlmaWNhdGVQYXJzZUVycm9yXG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDEyIEpveWVudCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgc3NocGsgPSByZXF1aXJlKCdzc2hwaycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbnZhciBIQVNIX0FMR09TID0ge1xuICAnc2hhMSc6IHRydWUsXG4gICdzaGEyNTYnOiB0cnVlLFxuICAnc2hhNTEyJzogdHJ1ZVxufTtcblxudmFyIFBLX0FMR09TID0ge1xuICAncnNhJzogdHJ1ZSxcbiAgJ2RzYSc6IHRydWUsXG4gICdlY2RzYSc6IHRydWVcbn07XG5cbmZ1bmN0aW9uIEh0dHBTaWduYXR1cmVFcnJvcihtZXNzYWdlLCBjYWxsZXIpIHtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIGNhbGxlciB8fCBIdHRwU2lnbmF0dXJlRXJyb3IpO1xuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9IGNhbGxlci5uYW1lO1xufVxudXRpbC5pbmhlcml0cyhIdHRwU2lnbmF0dXJlRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gSW52YWxpZEFsZ29yaXRobUVycm9yKG1lc3NhZ2UpIHtcbiAgSHR0cFNpZ25hdHVyZUVycm9yLmNhbGwodGhpcywgbWVzc2FnZSwgSW52YWxpZEFsZ29yaXRobUVycm9yKTtcbn1cbnV0aWwuaW5oZXJpdHMoSW52YWxpZEFsZ29yaXRobUVycm9yLCBIdHRwU2lnbmF0dXJlRXJyb3IpO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZUFsZ29yaXRobShhbGdvcml0aG0pIHtcbiAgdmFyIGFsZyA9IGFsZ29yaXRobS50b0xvd2VyQ2FzZSgpLnNwbGl0KCctJyk7XG5cbiAgaWYgKGFsZy5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcihhbGdbMF0udG9VcHBlckNhc2UoKSArICcgaXMgbm90IGEgJyArXG4gICAgICAndmFsaWQgYWxnb3JpdGhtJykpO1xuICB9XG5cbiAgaWYgKGFsZ1swXSAhPT0gJ2htYWMnICYmICFQS19BTEdPU1thbGdbMF1dKSB7XG4gICAgdGhyb3cgKG5ldyBJbnZhbGlkQWxnb3JpdGhtRXJyb3IoYWxnWzBdLnRvVXBwZXJDYXNlKCkgKyAnIHR5cGUga2V5cyAnICtcbiAgICAgICdhcmUgbm90IHN1cHBvcnRlZCcpKTtcbiAgfVxuXG4gIGlmICghSEFTSF9BTEdPU1thbGdbMV1dKSB7XG4gICAgdGhyb3cgKG5ldyBJbnZhbGlkQWxnb3JpdGhtRXJyb3IoYWxnWzFdLnRvVXBwZXJDYXNlKCkgKyAnIGlzIG5vdCBhICcgK1xuICAgICAgJ3N1cHBvcnRlZCBoYXNoIGFsZ29yaXRobScpKTtcbiAgfVxuXG4gIHJldHVybiAoYWxnKTtcbn1cblxuLy8vLS0tIEFQSVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICBIQVNIX0FMR09TOiBIQVNIX0FMR09TLFxuICBQS19BTEdPUzogUEtfQUxHT1MsXG5cbiAgSHR0cFNpZ25hdHVyZUVycm9yOiBIdHRwU2lnbmF0dXJlRXJyb3IsXG4gIEludmFsaWRBbGdvcml0aG1FcnJvcjogSW52YWxpZEFsZ29yaXRobUVycm9yLFxuXG4gIHZhbGlkYXRlQWxnb3JpdGhtOiB2YWxpZGF0ZUFsZ29yaXRobSxcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gT3BlblNTSCBwdWJsaWMga2V5IChyc2Egb25seSkgdG8gYSBQS0NTIzggUEVNIGZpbGUuXG4gICAqXG4gICAqIFRoZSBpbnRlbnQgb2YgdGhpcyBtb2R1bGUgaXMgdG8gaW50ZXJvcGVyYXRlIHdpdGggT3BlblNTTCBvbmx5LFxuICAgKiBzcGVjaWZpY2FsbHkgdGhlIG5vZGUgY3J5cHRvIG1vZHVsZSdzIGB2ZXJpZnlgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBhbiBPcGVuU1NIIHB1YmxpYyBrZXkuXG4gICAqIEByZXR1cm4ge1N0cmluZ30gUEVNIGVuY29kZWQgZm9ybSBvZiB0aGUgUlNBIHB1YmxpYyBrZXkuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gb24gYmFkIGlucHV0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gb24gaW52YWxpZCBzc2gga2V5IGZvcm1hdHRlZCBkYXRhLlxuICAgKi9cbiAgc3NoS2V5VG9QRU06IGZ1bmN0aW9uIHNzaEtleVRvUEVNKGtleSkge1xuICAgIGFzc2VydC5zdHJpbmcoa2V5LCAnc3NoX2tleScpO1xuXG4gICAgdmFyIGsgPSBzc2hway5wYXJzZUtleShrZXksICdzc2gnKTtcbiAgICByZXR1cm4gKGsudG9TdHJpbmcoJ3BlbScpKTtcbiAgfSxcblxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gT3BlblNTSCBmaW5nZXJwcmludCBmcm9tIGFuIHNzaCBwdWJsaWMga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IGFuIE9wZW5TU0ggcHVibGljIGtleS5cbiAgICogQHJldHVybiB7U3RyaW5nfSBrZXkgZmluZ2VycHJpbnQuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gb24gYmFkIGlucHV0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgd2hhdCB5b3UgcGFzc2VkIGRvZXNuJ3QgbG9vayBsaWtlIGFuIHNzaCBwdWJsaWMga2V5LlxuICAgKi9cbiAgZmluZ2VycHJpbnQ6IGZ1bmN0aW9uIGZpbmdlcnByaW50KGtleSkge1xuICAgIGFzc2VydC5zdHJpbmcoa2V5LCAnc3NoX2tleScpO1xuXG4gICAgdmFyIGsgPSBzc2hway5wYXJzZUtleShrZXksICdzc2gnKTtcbiAgICByZXR1cm4gKGsuZmluZ2VycHJpbnQoJ21kNScpLnRvU3RyaW5nKCdoZXgnKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgUEtHQ1MjOCBQRU0gZmlsZSB0byBhbiBPcGVuU1NIIHB1YmxpYyBrZXkgKHJzYSlcbiAgICpcbiAgICogVGhlIHJldmVyc2Ugb2YgdGhlIGFib3ZlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcGVtVG9Sc2FTU0hLZXk6IGZ1bmN0aW9uIHBlbVRvUnNhU1NIS2V5KHBlbSwgY29tbWVudCkge1xuICAgIGFzc2VydC5lcXVhbCgnc3RyaW5nJywgdHlwZW9mIChwZW0pLCAndHlwZW9mIHBlbScpO1xuXG4gICAgdmFyIGsgPSBzc2hway5wYXJzZUtleShwZW0sICdwZW0nKTtcbiAgICBrLmNvbW1lbnQgPSBjb21tZW50O1xuICAgIHJldHVybiAoay50b1N0cmluZygnc3NoJykpO1xuICB9XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDEyIEpveWVudCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuXG5cbi8vLy0tLSBHbG9iYWxzXG5cbnZhciBIQVNIX0FMR09TID0gdXRpbHMuSEFTSF9BTEdPUztcbnZhciBQS19BTEdPUyA9IHV0aWxzLlBLX0FMR09TO1xudmFyIEh0dHBTaWduYXR1cmVFcnJvciA9IHV0aWxzLkh0dHBTaWduYXR1cmVFcnJvcjtcbnZhciBJbnZhbGlkQWxnb3JpdGhtRXJyb3IgPSB1dGlscy5JbnZhbGlkQWxnb3JpdGhtRXJyb3I7XG52YXIgdmFsaWRhdGVBbGdvcml0aG0gPSB1dGlscy52YWxpZGF0ZUFsZ29yaXRobTtcblxudmFyIFN0YXRlID0ge1xuICBOZXc6IDAsXG4gIFBhcmFtczogMVxufTtcblxudmFyIFBhcmFtc1N0YXRlID0ge1xuICBOYW1lOiAwLFxuICBRdW90ZTogMSxcbiAgVmFsdWU6IDIsXG4gIENvbW1hOiAzXG59O1xuXG5cbi8vLy0tLSBTcGVjaWZpYyBFcnJvcnNcblxuXG5mdW5jdGlvbiBFeHBpcmVkUmVxdWVzdEVycm9yKG1lc3NhZ2UpIHtcbiAgSHR0cFNpZ25hdHVyZUVycm9yLmNhbGwodGhpcywgbWVzc2FnZSwgRXhwaXJlZFJlcXVlc3RFcnJvcik7XG59XG51dGlsLmluaGVyaXRzKEV4cGlyZWRSZXF1ZXN0RXJyb3IsIEh0dHBTaWduYXR1cmVFcnJvcik7XG5cblxuZnVuY3Rpb24gSW52YWxpZEhlYWRlckVycm9yKG1lc3NhZ2UpIHtcbiAgSHR0cFNpZ25hdHVyZUVycm9yLmNhbGwodGhpcywgbWVzc2FnZSwgSW52YWxpZEhlYWRlckVycm9yKTtcbn1cbnV0aWwuaW5oZXJpdHMoSW52YWxpZEhlYWRlckVycm9yLCBIdHRwU2lnbmF0dXJlRXJyb3IpO1xuXG5cbmZ1bmN0aW9uIEludmFsaWRQYXJhbXNFcnJvcihtZXNzYWdlKSB7XG4gIEh0dHBTaWduYXR1cmVFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UsIEludmFsaWRQYXJhbXNFcnJvcik7XG59XG51dGlsLmluaGVyaXRzKEludmFsaWRQYXJhbXNFcnJvciwgSHR0cFNpZ25hdHVyZUVycm9yKTtcblxuXG5mdW5jdGlvbiBNaXNzaW5nSGVhZGVyRXJyb3IobWVzc2FnZSkge1xuICBIdHRwU2lnbmF0dXJlRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlLCBNaXNzaW5nSGVhZGVyRXJyb3IpO1xufVxudXRpbC5pbmhlcml0cyhNaXNzaW5nSGVhZGVyRXJyb3IsIEh0dHBTaWduYXR1cmVFcnJvcik7XG5cbmZ1bmN0aW9uIFN0cmljdFBhcnNpbmdFcnJvcihtZXNzYWdlKSB7XG4gIEh0dHBTaWduYXR1cmVFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UsIFN0cmljdFBhcnNpbmdFcnJvcik7XG59XG51dGlsLmluaGVyaXRzKFN0cmljdFBhcnNpbmdFcnJvciwgSHR0cFNpZ25hdHVyZUVycm9yKTtcblxuLy8vLS0tIEV4cG9ydGVkIEFQSVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvKipcbiAgICogUGFyc2VzIHRoZSAnQXV0aG9yaXphdGlvbicgaGVhZGVyIG91dCBvZiBhbiBodHRwLlNlcnZlclJlcXVlc3Qgb2JqZWN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBBUEkgd2lsbCBmdWxseSB2YWxpZGF0ZSB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIsIGFuZCB0aHJvd1xuICAgKiBvbiBhbnkgZXJyb3IuICBJdCB3aWxsIG5vdCBob3dldmVyIGNoZWNrIHRoZSBzaWduYXR1cmUsIG9yIHRoZSBrZXlJZCBmb3JtYXRcbiAgICogYXMgdGhvc2UgYXJlIHNwZWNpZmljIHRvIHlvdXIgZW52aXJvbm1lbnQuICBZb3UgY2FuIHVzZSB0aGUgb3B0aW9ucyBvYmplY3RcbiAgICogdG8gcGFzcyBpbiBleHRyYSBjb25zdHJhaW50cy5cbiAgICpcbiAgICogQXMgYSByZXNwb25zZSBvYmplY3QgeW91IGNhbiBleHBlY3QgdGhpczpcbiAgICpcbiAgICogICAgIHtcbiAgICogICAgICAgXCJzY2hlbWVcIjogXCJTaWduYXR1cmVcIixcbiAgICogICAgICAgXCJwYXJhbXNcIjoge1xuICAgKiAgICAgICAgIFwia2V5SWRcIjogXCJmb29cIixcbiAgICogICAgICAgICBcImFsZ29yaXRobVwiOiBcInJzYS1zaGEyNTZcIixcbiAgICogICAgICAgICBcImhlYWRlcnNcIjogW1xuICAgKiAgICAgICAgICAgXCJkYXRlXCIgb3IgXCJ4LWRhdGVcIixcbiAgICogICAgICAgICAgIFwiZGlnZXN0XCJcbiAgICogICAgICAgICBdLFxuICAgKiAgICAgICAgIFwic2lnbmF0dXJlXCI6IFwiYmFzZTY0XCJcbiAgICogICAgICAgfSxcbiAgICogICAgICAgXCJzaWduaW5nU3RyaW5nXCI6IFwicmVhZHkgdG8gYmUgcGFzc2VkIHRvIGNyeXB0by52ZXJpZnkoKVwiXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0IGFuIGh0dHAuU2VydmVyUmVxdWVzdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYW4gb3B0aW9uYWwgb3B0aW9ucyBvYmplY3Qgd2l0aDpcbiAgICogICAgICAgICAgICAgICAgICAgLSBjbG9ja1NrZXc6IGFsbG93ZWQgY2xvY2sgc2tldyBpbiBzZWNvbmRzIChkZWZhdWx0IDMwMCkuXG4gICAqICAgICAgICAgICAgICAgICAgIC0gaGVhZGVyczogcmVxdWlyZWQgaGVhZGVyIG5hbWVzIChkZWY6IGRhdGUgb3IgeC1kYXRlKVxuICAgKiAgICAgICAgICAgICAgICAgICAtIGFsZ29yaXRobXM6IGFsZ29yaXRobXMgdG8gc3VwcG9ydCAoZGVmYXVsdDogYWxsKS5cbiAgICogICAgICAgICAgICAgICAgICAgLSBzdHJpY3Q6IHNob3VsZCBlbmZvcmNlIGxhdGVzdCBzcGVjIHBhcnNpbmdcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBmYWxzZSkuXG4gICAqIEByZXR1cm4ge09iamVjdH0gcGFyc2VkIG91dCBvYmplY3QgKHNlZSBhYm92ZSkuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gb24gaW52YWxpZCBpbnB1dC5cbiAgICogQHRocm93cyB7SW52YWxpZEhlYWRlckVycm9yfSBvbiBhbiBpbnZhbGlkIEF1dGhvcml6YXRpb24gaGVhZGVyIGVycm9yLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkUGFyYW1zRXJyb3J9IGlmIHRoZSBwYXJhbXMgaW4gdGhlIHNjaGVtZSBhcmUgaW52YWxpZC5cbiAgICogQHRocm93cyB7TWlzc2luZ0hlYWRlckVycm9yfSBpZiB0aGUgcGFyYW1zIGluZGljYXRlIGEgaGVhZGVyIG5vdCBwcmVzZW50LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciBpbiB0aGUgcmVxdWVzdCBoZWFkZXJzIGZyb20gdGhlIHBhcmFtcyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBub3QgaW4gdGhlIHBhcmFtcyBmcm9tIGEgcmVxdWlyZWQgaGVhZGVyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gb3B0aW9ucy5cbiAgICogQHRocm93cyB7U3RyaWN0UGFyc2luZ0Vycm9yfSBpZiBvbGQgYXR0cmlidXRlcyBhcmUgdXNlZCBpbiBzdHJpY3QgcGFyc2luZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuXG4gICAqIEB0aHJvd3Mge0V4cGlyZWRSZXF1ZXN0RXJyb3J9IGlmIHRoZSB2YWx1ZSBvZiBkYXRlIG9yIHgtZGF0ZSBleGNlZWRzIHNrZXcuXG4gICAqL1xuICBwYXJzZVJlcXVlc3Q6IGZ1bmN0aW9uIHBhcnNlUmVxdWVzdChyZXF1ZXN0LCBvcHRpb25zKSB7XG4gICAgYXNzZXJ0Lm9iamVjdChyZXF1ZXN0LCAncmVxdWVzdCcpO1xuICAgIGFzc2VydC5vYmplY3QocmVxdWVzdC5oZWFkZXJzLCAncmVxdWVzdC5oZWFkZXJzJyk7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oZWFkZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IFtyZXF1ZXN0LmhlYWRlcnNbJ3gtZGF0ZSddID8gJ3gtZGF0ZScgOiAnZGF0ZSddO1xuICAgIH1cbiAgICBhc3NlcnQub2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgYXNzZXJ0LmFycmF5T2ZTdHJpbmcob3B0aW9ucy5oZWFkZXJzLCAnb3B0aW9ucy5oZWFkZXJzJyk7XG4gICAgYXNzZXJ0Lm9wdGlvbmFsRmluaXRlKG9wdGlvbnMuY2xvY2tTa2V3LCAnb3B0aW9ucy5jbG9ja1NrZXcnKTtcblxuICAgIHZhciBhdXRoekhlYWRlck5hbWUgPSBvcHRpb25zLmF1dGhvcml6YXRpb25IZWFkZXJOYW1lIHx8ICdhdXRob3JpemF0aW9uJztcblxuICAgIGlmICghcmVxdWVzdC5oZWFkZXJzW2F1dGh6SGVhZGVyTmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBNaXNzaW5nSGVhZGVyRXJyb3IoJ25vICcgKyBhdXRoekhlYWRlck5hbWUgKyAnIGhlYWRlciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXNlbnQgaW4gdGhlIHJlcXVlc3QnKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmNsb2NrU2tldyA9IG9wdGlvbnMuY2xvY2tTa2V3IHx8IDMwMDtcblxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBzdGF0ZSA9IFN0YXRlLk5ldztcbiAgICB2YXIgc3Vic3RhdGUgPSBQYXJhbXNTdGF0ZS5OYW1lO1xuICAgIHZhciB0bXBOYW1lID0gJyc7XG4gICAgdmFyIHRtcFZhbHVlID0gJyc7XG5cbiAgICB2YXIgcGFyc2VkID0ge1xuICAgICAgc2NoZW1lOiAnJyxcbiAgICAgIHBhcmFtczoge30sXG4gICAgICBzaWduaW5nU3RyaW5nOiAnJ1xuICAgIH07XG5cbiAgICB2YXIgYXV0aHogPSByZXF1ZXN0LmhlYWRlcnNbYXV0aHpIZWFkZXJOYW1lXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYXV0aHoubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gYXV0aHouY2hhckF0KGkpO1xuXG4gICAgICBzd2l0Y2ggKE51bWJlcihzdGF0ZSkpIHtcblxuICAgICAgY2FzZSBTdGF0ZS5OZXc6XG4gICAgICAgIGlmIChjICE9PSAnICcpIHBhcnNlZC5zY2hlbWUgKz0gYztcbiAgICAgICAgZWxzZSBzdGF0ZSA9IFN0YXRlLlBhcmFtcztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU3RhdGUuUGFyYW1zOlxuICAgICAgICBzd2l0Y2ggKE51bWJlcihzdWJzdGF0ZSkpIHtcblxuICAgICAgICBjYXNlIFBhcmFtc1N0YXRlLk5hbWU6XG4gICAgICAgICAgdmFyIGNvZGUgPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgLy8gcmVzdHJpY3RlZCBuYW1lIG9mIEEtWiAvIGEtelxuICAgICAgICAgIGlmICgoY29kZSA+PSAweDQxICYmIGNvZGUgPD0gMHg1YSkgfHwgLy8gQS1aXG4gICAgICAgICAgICAgIChjb2RlID49IDB4NjEgJiYgY29kZSA8PSAweDdhKSkgeyAvLyBhLXpcbiAgICAgICAgICAgIHRtcE5hbWUgKz0gYztcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc9Jykge1xuICAgICAgICAgICAgaWYgKHRtcE5hbWUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdiYWQgcGFyYW0gZm9ybWF0Jyk7XG4gICAgICAgICAgICBzdWJzdGF0ZSA9IFBhcmFtc1N0YXRlLlF1b3RlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdiYWQgcGFyYW0gZm9ybWF0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGFyYW1zU3RhdGUuUXVvdGU6XG4gICAgICAgICAgaWYgKGMgPT09ICdcIicpIHtcbiAgICAgICAgICAgIHRtcFZhbHVlID0gJyc7XG4gICAgICAgICAgICBzdWJzdGF0ZSA9IFBhcmFtc1N0YXRlLlZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdiYWQgcGFyYW0gZm9ybWF0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGFyYW1zU3RhdGUuVmFsdWU6XG4gICAgICAgICAgaWYgKGMgPT09ICdcIicpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wYXJhbXNbdG1wTmFtZV0gPSB0bXBWYWx1ZTtcbiAgICAgICAgICAgIHN1YnN0YXRlID0gUGFyYW1zU3RhdGUuQ29tbWE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRtcFZhbHVlICs9IGM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGFyYW1zU3RhdGUuQ29tbWE6XG4gICAgICAgICAgaWYgKGMgPT09ICcsJykge1xuICAgICAgICAgICAgdG1wTmFtZSA9ICcnO1xuICAgICAgICAgICAgc3Vic3RhdGUgPSBQYXJhbXNTdGF0ZS5OYW1lO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdiYWQgcGFyYW0gZm9ybWF0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN1YnN0YXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdWJzdGF0ZScpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKCFwYXJzZWQucGFyYW1zLmhlYWRlcnMgfHwgcGFyc2VkLnBhcmFtcy5oZWFkZXJzID09PSAnJykge1xuICAgICAgaWYgKHJlcXVlc3QuaGVhZGVyc1sneC1kYXRlJ10pIHtcbiAgICAgICAgcGFyc2VkLnBhcmFtcy5oZWFkZXJzID0gWyd4LWRhdGUnXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZC5wYXJhbXMuaGVhZGVycyA9IFsnZGF0ZSddO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWQucGFyYW1zLmhlYWRlcnMgPSBwYXJzZWQucGFyYW1zLmhlYWRlcnMuc3BsaXQoJyAnKTtcbiAgICB9XG5cbiAgICAvLyBNaW5pbWFsbHkgdmFsaWRhdGUgdGhlIHBhcnNlZCBvYmplY3RcbiAgICBpZiAoIXBhcnNlZC5zY2hlbWUgfHwgcGFyc2VkLnNjaGVtZSAhPT0gJ1NpZ25hdHVyZScpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdzY2hlbWUgd2FzIG5vdCBcIlNpZ25hdHVyZVwiJyk7XG5cbiAgICBpZiAoIXBhcnNlZC5wYXJhbXMua2V5SWQpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdrZXlJZCB3YXMgbm90IHNwZWNpZmllZCcpO1xuXG4gICAgaWYgKCFwYXJzZWQucGFyYW1zLmFsZ29yaXRobSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkSGVhZGVyRXJyb3IoJ2FsZ29yaXRobSB3YXMgbm90IHNwZWNpZmllZCcpO1xuXG4gICAgaWYgKCFwYXJzZWQucGFyYW1zLnNpZ25hdHVyZSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkSGVhZGVyRXJyb3IoJ3NpZ25hdHVyZSB3YXMgbm90IHNwZWNpZmllZCcpO1xuXG4gICAgLy8gQ2hlY2sgdGhlIGFsZ29yaXRobSBhZ2FpbnN0IHRoZSBvZmZpY2lhbCBsaXN0XG4gICAgcGFyc2VkLnBhcmFtcy5hbGdvcml0aG0gPSBwYXJzZWQucGFyYW1zLmFsZ29yaXRobS50b0xvd2VyQ2FzZSgpO1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUFsZ29yaXRobShwYXJzZWQucGFyYW1zLmFsZ29yaXRobSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnZhbGlkQWxnb3JpdGhtRXJyb3IpXG4gICAgICAgIHRocm93IChuZXcgSW52YWxpZFBhcmFtc0Vycm9yKHBhcnNlZC5wYXJhbXMuYWxnb3JpdGhtICsgJyBpcyBub3QgJyArXG4gICAgICAgICAgJ3N1cHBvcnRlZCcpKTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgKGUpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHRoZSBzaWduaW5nU3RyaW5nXG4gICAgZm9yIChpID0gMDsgaSA8IHBhcnNlZC5wYXJhbXMuaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGggPSBwYXJzZWQucGFyYW1zLmhlYWRlcnNbaV0udG9Mb3dlckNhc2UoKTtcbiAgICAgIHBhcnNlZC5wYXJhbXMuaGVhZGVyc1tpXSA9IGg7XG5cbiAgICAgIGlmIChoID09PSAncmVxdWVzdC1saW5lJykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBXZSBhbGxvdyBoZWFkZXJzIGZyb20gdGhlIG9sZGVyIHNwZWMgZHJhZnRzIGlmIHN0cmljdCBwYXJzaW5nIGlzbid0XG4gICAgICAgICAgICogc3BlY2lmaWVkIGluIG9wdGlvbnMuXG4gICAgICAgICAgICovXG4gICAgICAgICAgcGFyc2VkLnNpZ25pbmdTdHJpbmcgKz1cbiAgICAgICAgICAgIHJlcXVlc3QubWV0aG9kICsgJyAnICsgcmVxdWVzdC51cmwgKyAnIEhUVFAvJyArIHJlcXVlc3QuaHR0cFZlcnNpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogU3RyaWN0IHBhcnNpbmcgZG9lc24ndCBhbGxvdyBvbGRlciBkcmFmdCBoZWFkZXJzLiAqL1xuICAgICAgICAgIHRocm93IChuZXcgU3RyaWN0UGFyc2luZ0Vycm9yKCdyZXF1ZXN0LWxpbmUgaXMgbm90IGEgdmFsaWQgaGVhZGVyICcgK1xuICAgICAgICAgICAgJ3dpdGggc3RyaWN0IHBhcnNpbmcgZW5hYmxlZC4nKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaCA9PT0gJyhyZXF1ZXN0LXRhcmdldCknKSB7XG4gICAgICAgIHBhcnNlZC5zaWduaW5nU3RyaW5nICs9XG4gICAgICAgICAgJyhyZXF1ZXN0LXRhcmdldCk6ICcgKyByZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpICsgJyAnICtcbiAgICAgICAgICByZXF1ZXN0LnVybDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlcXVlc3QuaGVhZGVyc1toXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdIZWFkZXJFcnJvcihoICsgJyB3YXMgbm90IGluIHRoZSByZXF1ZXN0Jyk7XG4gICAgICAgIHBhcnNlZC5zaWduaW5nU3RyaW5nICs9IGggKyAnOiAnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaSArIDEpIDwgcGFyc2VkLnBhcmFtcy5oZWFkZXJzLmxlbmd0aClcbiAgICAgICAgcGFyc2VkLnNpZ25pbmdTdHJpbmcgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgY29uc3RyYWludHNcbiAgICB2YXIgZGF0ZTtcbiAgICBpZiAocmVxdWVzdC5oZWFkZXJzLmRhdGUgfHwgcmVxdWVzdC5oZWFkZXJzWyd4LWRhdGUnXSkge1xuICAgICAgICBpZiAocmVxdWVzdC5oZWFkZXJzWyd4LWRhdGUnXSkge1xuICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShyZXF1ZXN0LmhlYWRlcnNbJ3gtZGF0ZSddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRlID0gbmV3IERhdGUocmVxdWVzdC5oZWFkZXJzLmRhdGUpO1xuICAgICAgICB9XG4gICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIHZhciBza2V3ID0gTWF0aC5hYnMobm93LmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZSgpKTtcblxuICAgICAgaWYgKHNrZXcgPiBvcHRpb25zLmNsb2NrU2tldyAqIDEwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4cGlyZWRSZXF1ZXN0RXJyb3IoJ2Nsb2NrIHNrZXcgb2YgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2V3IC8gMTAwMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncyB3YXMgZ3JlYXRlciB0aGFuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNsb2NrU2tldyArICdzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3B0aW9ucy5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhkcikge1xuICAgICAgLy8gUmVtZW1iZXIgdGhhdCB3ZSBhbHJlYWR5IGNoZWNrZWQgYW55IGhlYWRlcnMgaW4gdGhlIHBhcmFtc1xuICAgICAgLy8gd2VyZSBpbiB0aGUgcmVxdWVzdCwgc28gaWYgdGhpcyBwYXNzZXMgd2UncmUgZ29vZC5cbiAgICAgIGlmIChwYXJzZWQucGFyYW1zLmhlYWRlcnMuaW5kZXhPZihoZHIudG9Mb3dlckNhc2UoKSkgPCAwKVxuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0hlYWRlckVycm9yKGhkciArICcgd2FzIG5vdCBhIHNpZ25lZCBoZWFkZXInKTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmFsZ29yaXRobXMpIHtcbiAgICAgIGlmIChvcHRpb25zLmFsZ29yaXRobXMuaW5kZXhPZihwYXJzZWQucGFyYW1zLmFsZ29yaXRobSkgPT09IC0xKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtc0Vycm9yKHBhcnNlZC5wYXJhbXMuYWxnb3JpdGhtICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGlzIG5vdCBhIHN1cHBvcnRlZCBhbGdvcml0aG0nKTtcbiAgICB9XG5cbiAgICBwYXJzZWQuYWxnb3JpdGhtID0gcGFyc2VkLnBhcmFtcy5hbGdvcml0aG0udG9VcHBlckNhc2UoKTtcbiAgICBwYXJzZWQua2V5SWQgPSBwYXJzZWQucGFyYW1zLmtleUlkO1xuICAgIHJldHVybiBwYXJzZWQ7XG4gIH1cblxufTtcbiIsICIvKlxuICogZXh0c3ByaW50Zi5qczogZXh0ZW5kZWQgUE9TSVgtc3R5bGUgc3ByaW50ZlxuICovXG5cbnZhciBtb2RfYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgbW9kX3V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qXG4gKiBQdWJsaWMgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydHMuc3ByaW50ZiA9IGpzU3ByaW50ZjtcbmV4cG9ydHMucHJpbnRmID0ganNQcmludGY7XG5leHBvcnRzLmZwcmludGYgPSBqc0ZwcmludGY7XG5cbi8qXG4gKiBTdHJpcHBlZCBkb3duIHZlcnNpb24gb2Ygc1tuXXByaW50ZigzYykuICBXZSBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdGhyb3cgYW5cbiAqIGV4Y2VwdGlvbiB3aGVuIGdpdmVuIGEgZm9ybWF0IHN0cmluZyB3ZSBkb24ndCB1bmRlcnN0YW5kLCByYXRoZXIgdGhhblxuICogaWdub3JpbmcgaXQsIHNvIHRoYXQgd2Ugd29uJ3QgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgaWYvd2hlbiB3ZSBnbyBpbXBsZW1lbnRcbiAqIHRoZSByZXN0IG9mIHRoaXMuXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgc3VwcG9ydHMgc3BlY2lmeWluZ1xuICpcdC0gZmllbGQgYWxpZ25tZW50ICgnLScgZmxhZyksXG4gKiBcdC0gemVyby1wYWQgKCcwJyBmbGFnKVxuICpcdC0gYWx3YXlzIHNob3cgbnVtZXJpYyBzaWduICgnKycgZmxhZyksXG4gKlx0LSBmaWVsZCB3aWR0aFxuICpcdC0gY29udmVyc2lvbnMgZm9yIHN0cmluZ3MsIGRlY2ltYWwgaW50ZWdlcnMsIGFuZCBmbG9hdHMgKG51bWJlcnMpLlxuICpcdC0gYXJndW1lbnQgc2l6ZSBzcGVjaWZpZXJzLiAgVGhlc2UgYXJlIGFsbCBhY2NlcHRlZCBidXQgaWdub3JlZCwgc2luY2VcbiAqXHQgIEphdmFzY3JpcHQgaGFzIG5vIG5vdGlvbiBvZiB0aGUgcGh5c2ljYWwgc2l6ZSBvZiBhbiBhcmd1bWVudC5cbiAqXG4gKiBFdmVyeXRoaW5nIGVsc2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLCBtb3N0IG5vdGFibHkgcHJlY2lzaW9uLCB1bnNpZ25lZFxuICogbnVtYmVycywgbm9uLWRlY2ltYWwgbnVtYmVycywgYW5kIGNoYXJhY3RlcnMuXG4gKi9cbmZ1bmN0aW9uIGpzU3ByaW50ZihmbXQpXG57XG5cdHZhciByZWdleCA9IFtcblx0ICAgICcoW14lXSopJyxcdFx0XHRcdC8qIG5vcm1hbCB0ZXh0ICovXG5cdCAgICAnJScsXHRcdFx0XHQvKiBzdGFydCBvZiBmb3JtYXQgKi9cblx0ICAgICcoW1xcJ1xcXFwtKyAjMF0qPyknLFx0XHRcdC8qIGZsYWdzIChvcHRpb25hbCkgKi9cblx0ICAgICcoWzEtOV1cXFxcZCopPycsXHRcdFx0Lyogd2lkdGggKG9wdGlvbmFsKSAqL1xuXHQgICAgJyhcXFxcLihbMS05XVxcXFxkKikpPycsXHRcdC8qIHByZWNpc2lvbiAob3B0aW9uYWwpICovXG5cdCAgICAnW2xoanp0TF0qPycsXHRcdFx0LyogbGVuZ3RoIG1vZHMgKGlnbm9yZWQpICovXG5cdCAgICAnKFtkaW91eFhmRmVFZ0dhQWNDc1NwJWpyXSknXHQvKiBjb252ZXJzaW9uICovXG5cdF0uam9pbignJyk7XG5cblx0dmFyIHJlID0gbmV3IFJlZ0V4cChyZWdleCk7XG5cdHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblx0dmFyIGZsYWdzLCB3aWR0aCwgcHJlY2lzaW9uLCBjb252ZXJzaW9uO1xuXHR2YXIgbGVmdCwgcGFkLCBzaWduLCBhcmcsIG1hdGNoO1xuXHR2YXIgcmV0ID0gJyc7XG5cdHZhciBhcmduID0gMTtcblxuXHRtb2RfYXNzZXJ0LmVxdWFsKCdzdHJpbmcnLCB0eXBlb2YgKGZtdCkpO1xuXG5cdHdoaWxlICgobWF0Y2ggPSByZS5leGVjKGZtdCkpICE9PSBudWxsKSB7XG5cdFx0cmV0ICs9IG1hdGNoWzFdO1xuXHRcdGZtdCA9IGZtdC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcblxuXHRcdGZsYWdzID0gbWF0Y2hbMl0gfHwgJyc7XG5cdFx0d2lkdGggPSBtYXRjaFszXSB8fCAwO1xuXHRcdHByZWNpc2lvbiA9IG1hdGNoWzRdIHx8ICcnO1xuXHRcdGNvbnZlcnNpb24gPSBtYXRjaFs2XTtcblx0XHRsZWZ0ID0gZmFsc2U7XG5cdFx0c2lnbiA9IGZhbHNlO1xuXHRcdHBhZCA9ICcgJztcblxuXHRcdGlmIChjb252ZXJzaW9uID09ICclJykge1xuXHRcdFx0cmV0ICs9ICclJztcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmIChhcmdzLmxlbmd0aCA9PT0gMClcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ3RvbyBmZXcgYXJncyB0byBzcHJpbnRmJykpO1xuXG5cdFx0YXJnID0gYXJncy5zaGlmdCgpO1xuXHRcdGFyZ24rKztcblxuXHRcdGlmIChmbGFncy5tYXRjaCgvW1xcJyAjXS8pKVxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcihcblx0XHRcdCAgICAndW5zdXBwb3J0ZWQgZmxhZ3M6ICcgKyBmbGFncykpO1xuXG5cdFx0aWYgKHByZWNpc2lvbi5sZW5ndGggPiAwKVxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcihcblx0XHRcdCAgICAnbm9uLXplcm8gcHJlY2lzaW9uIG5vdCBzdXBwb3J0ZWQnKSk7XG5cblx0XHRpZiAoZmxhZ3MubWF0Y2goLy0vKSlcblx0XHRcdGxlZnQgPSB0cnVlO1xuXG5cdFx0aWYgKGZsYWdzLm1hdGNoKC8wLykpXG5cdFx0XHRwYWQgPSAnMCc7XG5cblx0XHRpZiAoZmxhZ3MubWF0Y2goL1xcKy8pKVxuXHRcdFx0c2lnbiA9IHRydWU7XG5cblx0XHRzd2l0Y2ggKGNvbnZlcnNpb24pIHtcblx0XHRjYXNlICdzJzpcblx0XHRcdGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpXG5cdFx0XHRcdHRocm93IChuZXcgRXJyb3IoJ2FyZ3VtZW50ICcgKyBhcmduICtcblx0XHRcdFx0ICAgICc6IGF0dGVtcHRlZCB0byBwcmludCB1bmRlZmluZWQgb3IgbnVsbCAnICtcblx0XHRcdFx0ICAgICdhcyBhIHN0cmluZycpKTtcblx0XHRcdHJldCArPSBkb1BhZChwYWQsIHdpZHRoLCBsZWZ0LCBhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ2QnOlxuXHRcdFx0YXJnID0gTWF0aC5mbG9vcihhcmcpO1xuXHRcdFx0Lypqc2w6ZmFsbHRocnUqL1xuXHRcdGNhc2UgJ2YnOlxuXHRcdFx0c2lnbiA9IHNpZ24gJiYgYXJnID4gMCA/ICcrJyA6ICcnO1xuXHRcdFx0cmV0ICs9IHNpZ24gKyBkb1BhZChwYWQsIHdpZHRoLCBsZWZ0LFxuXHRcdFx0ICAgIGFyZy50b1N0cmluZygpKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAneCc6XG5cdFx0XHRyZXQgKz0gZG9QYWQocGFkLCB3aWR0aCwgbGVmdCwgYXJnLnRvU3RyaW5nKDE2KSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ2onOiAvKiBub24tc3RhbmRhcmQgKi9cblx0XHRcdGlmICh3aWR0aCA9PT0gMClcblx0XHRcdFx0d2lkdGggPSAxMDtcblx0XHRcdHJldCArPSBtb2RfdXRpbC5pbnNwZWN0KGFyZywgZmFsc2UsIHdpZHRoKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAncic6IC8qIG5vbi1zdGFuZGFyZCAqL1xuXHRcdFx0cmV0ICs9IGR1bXBFeGNlcHRpb24oYXJnKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGNvbnZlcnNpb246ICcgK1xuXHRcdFx0ICAgIGNvbnZlcnNpb24pKTtcblx0XHR9XG5cdH1cblxuXHRyZXQgKz0gZm10O1xuXHRyZXR1cm4gKHJldCk7XG59XG5cbmZ1bmN0aW9uIGpzUHJpbnRmKCkge1xuXHR2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdGFyZ3MudW5zaGlmdChwcm9jZXNzLnN0ZG91dCk7XG5cdGpzRnByaW50Zi5hcHBseShudWxsLCBhcmdzKTtcbn1cblxuZnVuY3Rpb24ganNGcHJpbnRmKHN0cmVhbSkge1xuXHR2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cdHJldHVybiAoc3RyZWFtLndyaXRlKGpzU3ByaW50Zi5hcHBseSh0aGlzLCBhcmdzKSkpO1xufVxuXG5mdW5jdGlvbiBkb1BhZChjaHIsIHdpZHRoLCBsZWZ0LCBzdHIpXG57XG5cdHZhciByZXQgPSBzdHI7XG5cblx0d2hpbGUgKHJldC5sZW5ndGggPCB3aWR0aCkge1xuXHRcdGlmIChsZWZ0KVxuXHRcdFx0cmV0ICs9IGNocjtcblx0XHRlbHNlXG5cdFx0XHRyZXQgPSBjaHIgKyByZXQ7XG5cdH1cblxuXHRyZXR1cm4gKHJldCk7XG59XG5cbi8qXG4gKiBUaGlzIGZ1bmN0aW9uIGR1bXBzIGxvbmcgc3RhY2sgdHJhY2VzIGZvciBleGNlcHRpb25zIGhhdmluZyBhIGNhdXNlKCkgbWV0aG9kLlxuICogU2VlIG5vZGUtdmVycm9yIGZvciBhbiBleGFtcGxlLlxuICovXG5mdW5jdGlvbiBkdW1wRXhjZXB0aW9uKGV4KVxue1xuXHR2YXIgcmV0O1xuXG5cdGlmICghKGV4IGluc3RhbmNlb2YgRXJyb3IpKVxuXHRcdHRocm93IChuZXcgRXJyb3IoanNTcHJpbnRmKCdpbnZhbGlkIHR5cGUgZm9yICUlcjogJWonLCBleCkpKTtcblxuXHQvKiBOb3RlIHRoYXQgVjggcHJlcGVuZHMgXCJleC5zdGFja1wiIHdpdGggZXgudG9TdHJpbmcoKS4gKi9cblx0cmV0ID0gJ0VYQ0VQVElPTjogJyArIGV4LmNvbnN0cnVjdG9yLm5hbWUgKyAnOiAnICsgZXguc3RhY2s7XG5cblx0aWYgKGV4LmNhdXNlICYmIHR5cGVvZiAoZXguY2F1c2UpID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGNleCA9IGV4LmNhdXNlKCk7XG5cdFx0aWYgKGNleCkge1xuXHRcdFx0cmV0ICs9ICdcXG5DYXVzZWQgYnk6ICcgKyBkdW1wRXhjZXB0aW9uKGNleCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIChyZXQpO1xufVxuIiwgIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsICIvKlxuICogdmVycm9yLmpzOiByaWNoZXIgSmF2YVNjcmlwdCBlcnJvcnNcbiAqL1xuXG52YXIgbW9kX2Fzc2VydHBsdXMgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIG1vZF91dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG52YXIgbW9kX2V4dHNwcmludGYgPSByZXF1aXJlKCdleHRzcHJpbnRmJyk7XG52YXIgbW9kX2lzRXJyb3IgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKS5pc0Vycm9yO1xudmFyIHNwcmludGYgPSBtb2RfZXh0c3ByaW50Zi5zcHJpbnRmO1xuXG4vKlxuICogUHVibGljIGludGVyZmFjZVxuICovXG5cbi8qIFNvIHlvdSBjYW4gJ3ZhciBWRXJyb3IgPSByZXF1aXJlKCd2ZXJyb3InKScgKi9cbm1vZHVsZS5leHBvcnRzID0gVkVycm9yO1xuLyogRm9yIGNvbXBhdGliaWxpdHkgKi9cblZFcnJvci5WRXJyb3IgPSBWRXJyb3I7XG4vKiBPdGhlciBleHBvcnRlZCBjbGFzc2VzICovXG5WRXJyb3IuU0Vycm9yID0gU0Vycm9yO1xuVkVycm9yLldFcnJvciA9IFdFcnJvcjtcblZFcnJvci5NdWx0aUVycm9yID0gTXVsdGlFcnJvcjtcblxuLypcbiAqIENvbW1vbiBmdW5jdGlvbiB1c2VkIHRvIHBhcnNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgVkVycm9yLCBXRXJyb3IsIGFuZFxuICogU0Vycm9yLiAgTmFtZWQgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb246XG4gKlxuICogICAgIHN0cmljdFx0XHRmb3JjZSBzdHJpY3QgaW50ZXJwcmV0YXRpb24gb2Ygc3ByaW50ZiBhcmd1bWVudHMsIGV2ZW5cbiAqICAgICBcdFx0XHRpZiB0aGUgb3B0aW9ucyBpbiBcImFyZ3ZcIiBkb24ndCBzYXkgc29cbiAqXG4gKiAgICAgYXJndlx0XHRlcnJvcidzIGNvbnN0cnVjdG9yIGFyZ3VtZW50cywgd2hpY2ggYXJlIHRvIGJlXG4gKiAgICAgXHRcdFx0aW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIFJFQURNRS5tZC4gIEZvciBxdWlja1xuICogICAgIFx0XHRcdHJlZmVyZW5jZSwgXCJhcmd2XCIgaGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOlxuICpcbiAqICAgICAgICAgIFsgc3ByaW50Zl9hcmdzLi4uIF0gICAgICAgICAgIChhcmd2WzBdIGlzIGEgc3RyaW5nKVxuICogICAgICAgICAgWyBjYXVzZSwgc3ByaW50Zl9hcmdzLi4uIF0gICAgKGFyZ3ZbMF0gaXMgYW4gRXJyb3IpXG4gKiAgICAgICAgICBbIG9wdGlvbnMsIHNwcmludGZfYXJncy4uLiBdICAoYXJndlswXSBpcyBhbiBvYmplY3QpXG4gKlxuICogVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIHRoZXNlIGZvcm1zLCBwcm9kdWNpbmcgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAgICBvcHRpb25zICAgICAgICAgICBlcXVpdmFsZW50IHRvIFwib3B0aW9uc1wiIGluIHRoaXJkIGZvcm0uICBUaGlzIHdpbGwgbmV2ZXJcbiAqICAgIFx0XHRcdGJlIGEgZGlyZWN0IHJlZmVyZW5jZSB0byB3aGF0IHRoZSBjYWxsZXIgcGFzc2VkIGluXG4gKiAgICBcdFx0XHQoaS5lLiwgaXQgbWF5IGJlIGEgc2hhbGxvdyBjb3B5KSwgc28gaXQgY2FuIGJlIGZyZWVseVxuICogICAgXHRcdFx0bW9kaWZpZWQuXG4gKlxuICogICAgc2hvcnRtZXNzYWdlICAgICAgcmVzdWx0IG9mIHNwcmludGYoc3ByaW50Zl9hcmdzKSwgdGFraW5nIG9wdGlvbnMuc3RyaWN0XG4gKiAgICBcdFx0XHRpbnRvIGFjY291bnQgYXMgZGVzY3JpYmVkIGluIFJFQURNRS5tZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb25zdHJ1Y3RvckFyZ3VtZW50cyhhcmdzKVxue1xuXHR2YXIgYXJndiwgb3B0aW9ucywgc3ByaW50Zl9hcmdzLCBzaG9ydG1lc3NhZ2UsIGs7XG5cblx0bW9kX2Fzc2VydHBsdXMub2JqZWN0KGFyZ3MsICdhcmdzJyk7XG5cdG1vZF9hc3NlcnRwbHVzLmJvb2woYXJncy5zdHJpY3QsICdhcmdzLnN0cmljdCcpO1xuXHRtb2RfYXNzZXJ0cGx1cy5hcnJheShhcmdzLmFyZ3YsICdhcmdzLmFyZ3YnKTtcblx0YXJndiA9IGFyZ3MuYXJndjtcblxuXHQvKlxuXHQgKiBGaXJzdCwgZmlndXJlIG91dCB3aGljaCBmb3JtIG9mIGludm9jYXRpb24gd2UndmUgYmVlbiBnaXZlbi5cblx0ICovXG5cdGlmIChhcmd2Lmxlbmd0aCA9PT0gMCkge1xuXHRcdG9wdGlvbnMgPSB7fTtcblx0XHRzcHJpbnRmX2FyZ3MgPSBbXTtcblx0fSBlbHNlIGlmIChtb2RfaXNFcnJvcihhcmd2WzBdKSkge1xuXHRcdG9wdGlvbnMgPSB7ICdjYXVzZSc6IGFyZ3ZbMF0gfTtcblx0XHRzcHJpbnRmX2FyZ3MgPSBhcmd2LnNsaWNlKDEpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiAoYXJndlswXSkgPT09ICdvYmplY3QnKSB7XG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRcdGZvciAoayBpbiBhcmd2WzBdKSB7XG5cdFx0XHRvcHRpb25zW2tdID0gYXJndlswXVtrXTtcblx0XHR9XG5cdFx0c3ByaW50Zl9hcmdzID0gYXJndi5zbGljZSgxKTtcblx0fSBlbHNlIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5zdHJpbmcoYXJndlswXSxcblx0XHQgICAgJ2ZpcnN0IGFyZ3VtZW50IHRvIFZFcnJvciwgU0Vycm9yLCBvciBXRXJyb3IgJyArXG5cdFx0ICAgICdjb25zdHJ1Y3RvciBtdXN0IGJlIGEgc3RyaW5nLCBvYmplY3QsIG9yIEVycm9yJyk7XG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRcdHNwcmludGZfYXJncyA9IGFyZ3Y7XG5cdH1cblxuXHQvKlxuXHQgKiBOb3cgY29uc3RydWN0IHRoZSBlcnJvcidzIG1lc3NhZ2UuXG5cdCAqXG5cdCAqIGV4dHNwcmludGYgKHdoaWNoIHdlIGludm9rZSBoZXJlIHdpdGggb3VyIGNhbGxlcidzIGFyZ3VtZW50cyBpbiBvcmRlclxuXHQgKiB0byBjb25zdHJ1Y3QgdGhpcyBFcnJvcidzIG1lc3NhZ2UpIGlzIHN0cmljdCBpbiBpdHMgaW50ZXJwcmV0YXRpb24gb2Zcblx0ICogdmFsdWVzIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgXCIlc1wiIHNwZWNpZmllci4gIFRoZSB2YWx1ZSBwYXNzZWQgdG9cblx0ICogZXh0c3ByaW50ZiBtdXN0IGFjdHVhbGx5IGJlIGEgc3RyaW5nIG9yIHNvbWV0aGluZyBjb252ZXJ0aWJsZSB0byBhXG5cdCAqIFN0cmluZyB1c2luZyAudG9TdHJpbmcoKS4gIFBhc3Npbmcgb3RoZXIgdmFsdWVzIChub3RhYmx5IFwibnVsbFwiIGFuZFxuXHQgKiBcInVuZGVmaW5lZFwiKSBpcyBjb25zaWRlcmVkIGEgcHJvZ3JhbW1lciBlcnJvci4gIFRoZSBhc3N1bXB0aW9uIGlzXG5cdCAqIHRoYXQgaWYgeW91IGFjdHVhbGx5IHdhbnQgdG8gcHJpbnQgdGhlIHN0cmluZyBcIm51bGxcIiBvciBcInVuZGVmaW5lZFwiLFxuXHQgKiB0aGVuIHRoYXQncyBlYXN5IHRvIGRvIHRoYXQgd2hlbiB5b3UncmUgY2FsbGluZyBleHRzcHJpbnRmOyBvbiB0aGVcblx0ICogb3RoZXIgaGFuZCwgaWYgeW91IGRpZCBOT1Qgd2FudCB0aGF0IChpLmUuLCB0aGVyZSdzIGFjdHVhbGx5IGEgYnVnXG5cdCAqIHdoZXJlIHRoZSBwcm9ncmFtIGFzc3VtZXMgc29tZSB2YXJpYWJsZSBpcyBub24tbnVsbCBhbmQgdHJpZXMgdG9cblx0ICogcHJpbnQgaXQsIHdoaWNoIG1pZ2h0IGhhcHBlbiB3aGVuIGNvbnN0cnVjdGluZyBhIHBhY2tldCBvciBmaWxlIGluXG5cdCAqIHNvbWUgc3BlY2lmaWMgZm9ybWF0KSwgdGhlbiBpdCdzIGJldHRlciB0byBzdG9wIGltbWVkaWF0ZWx5IHRoYW5cblx0ICogcHJvZHVjZSBib2d1cyBvdXRwdXQuXG5cdCAqXG5cdCAqIEhvd2V2ZXIsIHNvbWV0aW1lcyB0aGUgYnVnIGlzIG9ubHkgaW4gdGhlIGNvZGUgY2FsbGluZyBWRXJyb3IsIGFuZCBhXG5cdCAqIHByb2dyYW1tZXIgbWlnaHQgcHJlZmVyIHRvIGhhdmUgdGhlIGVycm9yIG1lc3NhZ2UgY29udGFpbiBcIm51bGxcIiBvclxuXHQgKiBcInVuZGVmaW5lZFwiIHJhdGhlciB0aGFuIGhhdmUgdGhlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBjcmFzaCB0aGVcblx0ICogcHJvZ3JhbSAobWFraW5nIHRoZSBmaXJzdCBidWcgaGFyZGVyIHRvIGlkZW50aWZ5KS4gIEZvciB0aGF0IHJlYXNvbixcblx0ICogYnkgZGVmYXVsdCBWRXJyb3IgY29udmVydHMgXCJudWxsXCIgb3IgXCJ1bmRlZmluZWRcIiBhcmd1bWVudHMgdG8gdGhlaXJcblx0ICogc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBhbmQgcGFzc2VzIHRob3NlIHRvIGV4dHNwcmludGYuICBQcm9ncmFtbWVyc1xuXHQgKiBkZXNpcmluZyB0aGUgc3RyaWN0IGJlaGF2aW9yIGNhbiB1c2UgdGhlIFNFcnJvciBjbGFzcyBvciBwYXNzIHRoZVxuXHQgKiBcInN0cmljdFwiIG9wdGlvbiB0byB0aGUgVkVycm9yIGNvbnN0cnVjdG9yLlxuXHQgKi9cblx0bW9kX2Fzc2VydHBsdXMub2JqZWN0KG9wdGlvbnMpO1xuXHRpZiAoIW9wdGlvbnMuc3RyaWN0ICYmICFhcmdzLnN0cmljdCkge1xuXHRcdHNwcmludGZfYXJncyA9IHNwcmludGZfYXJncy5tYXAoZnVuY3Rpb24gKGEpIHtcblx0XHRcdHJldHVybiAoYSA9PT0gbnVsbCA/ICdudWxsJyA6XG5cdFx0XHQgICAgYSA9PT0gdW5kZWZpbmVkID8gJ3VuZGVmaW5lZCcgOiBhKTtcblx0XHR9KTtcblx0fVxuXG5cdGlmIChzcHJpbnRmX2FyZ3MubGVuZ3RoID09PSAwKSB7XG5cdFx0c2hvcnRtZXNzYWdlID0gJyc7XG5cdH0gZWxzZSB7XG5cdFx0c2hvcnRtZXNzYWdlID0gc3ByaW50Zi5hcHBseShudWxsLCBzcHJpbnRmX2FyZ3MpO1xuXHR9XG5cblx0cmV0dXJuICh7XG5cdCAgICAnb3B0aW9ucyc6IG9wdGlvbnMsXG5cdCAgICAnc2hvcnRtZXNzYWdlJzogc2hvcnRtZXNzYWdlXG5cdH0pO1xufVxuXG4vKlxuICogU2VlIFJFQURNRS5tZCBmb3IgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIFZFcnJvcigpXG57XG5cdHZhciBhcmdzLCBvYmosIHBhcnNlZCwgY2F1c2UsIGN0b3IsIG1lc3NhZ2UsIGs7XG5cblx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cblx0Lypcblx0ICogVGhpcyBpcyBhIHJlZ3JldHRhYmxlIHBhdHRlcm4sIGJ1dCBKYXZhU2NyaXB0J3MgYnVpbHQtaW4gRXJyb3IgY2xhc3Ncblx0ICogaXMgZGVmaW5lZCB0byB3b3JrIHRoaXMgd2F5LCBzbyB3ZSBhbGxvdyB0aGUgY29uc3RydWN0b3IgdG8gYmUgY2FsbGVkXG5cdCAqIHdpdGhvdXQgXCJuZXdcIi5cblx0ICovXG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBWRXJyb3IpKSB7XG5cdFx0b2JqID0gT2JqZWN0LmNyZWF0ZShWRXJyb3IucHJvdG90eXBlKTtcblx0XHRWRXJyb3IuYXBwbHkob2JqLCBhcmd1bWVudHMpO1xuXHRcdHJldHVybiAob2JqKTtcblx0fVxuXG5cdC8qXG5cdCAqIEZvciBjb252ZW5pZW5jZSBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIHN1cHBvcnQgc2V2ZXJhbFxuXHQgKiBkaWZmZXJlbnQgY2FsbGluZyBmb3Jtcy4gIE5vcm1hbGl6ZSB0aGVtIGhlcmUuXG5cdCAqL1xuXHRwYXJzZWQgPSBwYXJzZUNvbnN0cnVjdG9yQXJndW1lbnRzKHtcblx0ICAgICdhcmd2JzogYXJncyxcblx0ICAgICdzdHJpY3QnOiBmYWxzZVxuXHR9KTtcblxuXHQvKlxuXHQgKiBJZiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbmFtZSwgYXBwbHkgaXQgbm93LlxuXHQgKi9cblx0aWYgKHBhcnNlZC5vcHRpb25zLm5hbWUpIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5zdHJpbmcocGFyc2VkLm9wdGlvbnMubmFtZSxcblx0XHQgICAgJ2Vycm9yXFwncyBcIm5hbWVcIiBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cdFx0dGhpcy5uYW1lID0gcGFyc2VkLm9wdGlvbnMubmFtZTtcblx0fVxuXG5cdC8qXG5cdCAqIEZvciBkZWJ1Z2dpbmcsIHdlIGtlZXAgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIHNob3J0IG1lc3NhZ2UgKGF0dGFjaGVkXG5cdCAqIHRoaXMgRXJyb3IgcGFydGljdWxhcmx5KSBzZXBhcmF0ZWx5IGZyb20gdGhlIGNvbXBsZXRlIG1lc3NhZ2UgKHdoaWNoXG5cdCAqIGluY2x1ZGVzIHRoZSBtZXNzYWdlcyBvZiBvdXIgY2F1c2UgY2hhaW4pLlxuXHQgKi9cblx0dGhpcy5qc2Vfc2hvcnRtc2cgPSBwYXJzZWQuc2hvcnRtZXNzYWdlO1xuXHRtZXNzYWdlID0gcGFyc2VkLnNob3J0bWVzc2FnZTtcblxuXHQvKlxuXHQgKiBJZiB3ZSd2ZSBiZWVuIGdpdmVuIGEgY2F1c2UsIHJlY29yZCBhIHJlZmVyZW5jZSB0byBpdCBhbmQgdXBkYXRlIG91clxuXHQgKiBtZXNzYWdlIGFwcHJvcHJpYXRlbHkuXG5cdCAqL1xuXHRjYXVzZSA9IHBhcnNlZC5vcHRpb25zLmNhdXNlO1xuXHRpZiAoY2F1c2UpIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5vayhtb2RfaXNFcnJvcihjYXVzZSksICdjYXVzZSBpcyBub3QgYW4gRXJyb3InKTtcblx0XHR0aGlzLmpzZV9jYXVzZSA9IGNhdXNlO1xuXG5cdFx0aWYgKCFwYXJzZWQub3B0aW9ucy5za2lwQ2F1c2VNZXNzYWdlKSB7XG5cdFx0XHRtZXNzYWdlICs9ICc6ICcgKyBjYXVzZS5tZXNzYWdlO1xuXHRcdH1cblx0fVxuXG5cdC8qXG5cdCAqIElmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcywgc2hhbGxvdy1jb3B5IHRoYXRcblx0ICogaGVyZS4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGEgZGVlcCBjb3B5IGluIGNhc2UgdGhlcmUgYXJlIG5vbi1wbGFpblxuXHQgKiBvYmplY3RzIGhlcmUsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgb3JpZ2luYWwgb2JqZWN0IGluIGNhc2Vcblx0ICogdGhlIGNhbGxlciBtb2RpZmllcyBpdCBsYXRlci5cblx0ICovXG5cdHRoaXMuanNlX2luZm8gPSB7fTtcblx0aWYgKHBhcnNlZC5vcHRpb25zLmluZm8pIHtcblx0XHRmb3IgKGsgaW4gcGFyc2VkLm9wdGlvbnMuaW5mbykge1xuXHRcdFx0dGhpcy5qc2VfaW5mb1trXSA9IHBhcnNlZC5vcHRpb25zLmluZm9ba107XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0RXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcblx0XHRjdG9yID0gcGFyc2VkLm9wdGlvbnMuY29uc3RydWN0b3JPcHQgfHwgdGhpcy5jb25zdHJ1Y3Rvcjtcblx0XHRFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBjdG9yKTtcblx0fVxuXG5cdHJldHVybiAodGhpcyk7XG59XG5cbm1vZF91dGlsLmluaGVyaXRzKFZFcnJvciwgRXJyb3IpO1xuVkVycm9yLnByb3RvdHlwZS5uYW1lID0gJ1ZFcnJvcic7XG5cblZFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB2ZV90b1N0cmluZygpXG57XG5cdHZhciBzdHIgPSAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpICYmIHRoaXMubmFtZSB8fFxuXHRcdHRoaXMuY29uc3RydWN0b3IubmFtZSB8fCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lKTtcblx0aWYgKHRoaXMubWVzc2FnZSlcblx0XHRzdHIgKz0gJzogJyArIHRoaXMubWVzc2FnZTtcblxuXHRyZXR1cm4gKHN0cik7XG59O1xuXG4vKlxuICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkuICBOZXcgY2FsbGVycyBzaG91bGQgdXNlXG4gKiBWRXJyb3IuY2F1c2UoKSBpbnN0ZWFkLiAgVGhhdCBtZXRob2QgYWxzbyB1c2VzIHRoZSBzYW5lciBgbnVsbGAgcmV0dXJuIHZhbHVlXG4gKiB3aGVuIHRoZXJlIGlzIG5vIGNhdXNlLlxuICovXG5WRXJyb3IucHJvdG90eXBlLmNhdXNlID0gZnVuY3Rpb24gdmVfY2F1c2UoKVxue1xuXHR2YXIgY2F1c2UgPSBWRXJyb3IuY2F1c2UodGhpcyk7XG5cdHJldHVybiAoY2F1c2UgPT09IG51bGwgPyB1bmRlZmluZWQgOiBjYXVzZSk7XG59O1xuXG4vKlxuICogU3RhdGljIG1ldGhvZHNcbiAqXG4gKiBUaGVzZSBjbGFzcy1sZXZlbCBtZXRob2RzIGFyZSBwcm92aWRlZCBzbyB0aGF0IGNhbGxlcnMgY2FuIHVzZSB0aGVtIG9uXG4gKiBpbnN0YW5jZXMgb2YgRXJyb3JzIHRoYXQgYXJlIG5vdCBWRXJyb3JzLiAgTmV3IGludGVyZmFjZXMgc2hvdWxkIGJlIHByb3ZpZGVkXG4gKiBvbmx5IHVzaW5nIHN0YXRpYyBtZXRob2RzIHRvIGVsaW1pbmF0ZSB0aGUgY2xhc3Mgb2YgcHJvZ3JhbW1pbmcgbWlzdGFrZSB3aGVyZVxuICogcGVvcGxlIGZhaWwgdG8gY2hlY2sgd2hldGhlciB0aGUgRXJyb3Igb2JqZWN0IGhhcyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzLlxuICovXG5cblZFcnJvci5jYXVzZSA9IGZ1bmN0aW9uIChlcnIpXG57XG5cdG1vZF9hc3NlcnRwbHVzLm9rKG1vZF9pc0Vycm9yKGVyciksICdlcnIgbXVzdCBiZSBhbiBFcnJvcicpO1xuXHRyZXR1cm4gKG1vZF9pc0Vycm9yKGVyci5qc2VfY2F1c2UpID8gZXJyLmpzZV9jYXVzZSA6IG51bGwpO1xufTtcblxuVkVycm9yLmluZm8gPSBmdW5jdGlvbiAoZXJyKVxue1xuXHR2YXIgcnYsIGNhdXNlLCBrO1xuXG5cdG1vZF9hc3NlcnRwbHVzLm9rKG1vZF9pc0Vycm9yKGVyciksICdlcnIgbXVzdCBiZSBhbiBFcnJvcicpO1xuXHRjYXVzZSA9IFZFcnJvci5jYXVzZShlcnIpO1xuXHRpZiAoY2F1c2UgIT09IG51bGwpIHtcblx0XHRydiA9IFZFcnJvci5pbmZvKGNhdXNlKTtcblx0fSBlbHNlIHtcblx0XHRydiA9IHt9O1xuXHR9XG5cblx0aWYgKHR5cGVvZiAoZXJyLmpzZV9pbmZvKSA9PSAnb2JqZWN0JyAmJiBlcnIuanNlX2luZm8gIT09IG51bGwpIHtcblx0XHRmb3IgKGsgaW4gZXJyLmpzZV9pbmZvKSB7XG5cdFx0XHRydltrXSA9IGVyci5qc2VfaW5mb1trXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gKHJ2KTtcbn07XG5cblZFcnJvci5maW5kQ2F1c2VCeU5hbWUgPSBmdW5jdGlvbiAoZXJyLCBuYW1lKVxue1xuXHR2YXIgY2F1c2U7XG5cblx0bW9kX2Fzc2VydHBsdXMub2sobW9kX2lzRXJyb3IoZXJyKSwgJ2VyciBtdXN0IGJlIGFuIEVycm9yJyk7XG5cdG1vZF9hc3NlcnRwbHVzLnN0cmluZyhuYW1lLCAnbmFtZScpO1xuXHRtb2RfYXNzZXJ0cGx1cy5vayhuYW1lLmxlbmd0aCA+IDAsICduYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuXG5cdGZvciAoY2F1c2UgPSBlcnI7IGNhdXNlICE9PSBudWxsOyBjYXVzZSA9IFZFcnJvci5jYXVzZShjYXVzZSkpIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5vayhtb2RfaXNFcnJvcihjYXVzZSkpO1xuXHRcdGlmIChjYXVzZS5uYW1lID09IG5hbWUpIHtcblx0XHRcdHJldHVybiAoY2F1c2UpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiAobnVsbCk7XG59O1xuXG5WRXJyb3IuaGFzQ2F1c2VXaXRoTmFtZSA9IGZ1bmN0aW9uIChlcnIsIG5hbWUpXG57XG5cdHJldHVybiAoVkVycm9yLmZpbmRDYXVzZUJ5TmFtZShlcnIsIG5hbWUpICE9PSBudWxsKTtcbn07XG5cblZFcnJvci5mdWxsU3RhY2sgPSBmdW5jdGlvbiAoZXJyKVxue1xuXHRtb2RfYXNzZXJ0cGx1cy5vayhtb2RfaXNFcnJvcihlcnIpLCAnZXJyIG11c3QgYmUgYW4gRXJyb3InKTtcblxuXHR2YXIgY2F1c2UgPSBWRXJyb3IuY2F1c2UoZXJyKTtcblxuXHRpZiAoY2F1c2UpIHtcblx0XHRyZXR1cm4gKGVyci5zdGFjayArICdcXG5jYXVzZWQgYnk6ICcgKyBWRXJyb3IuZnVsbFN0YWNrKGNhdXNlKSk7XG5cdH1cblxuXHRyZXR1cm4gKGVyci5zdGFjayk7XG59O1xuXG5WRXJyb3IuZXJyb3JGcm9tTGlzdCA9IGZ1bmN0aW9uIChlcnJvcnMpXG57XG5cdG1vZF9hc3NlcnRwbHVzLmFycmF5T2ZPYmplY3QoZXJyb3JzLCAnZXJyb3JzJyk7XG5cblx0aWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gKG51bGwpO1xuXHR9XG5cblx0ZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5vayhtb2RfaXNFcnJvcihlKSk7XG5cdH0pO1xuXG5cdGlmIChlcnJvcnMubGVuZ3RoID09IDEpIHtcblx0XHRyZXR1cm4gKGVycm9yc1swXSk7XG5cdH1cblxuXHRyZXR1cm4gKG5ldyBNdWx0aUVycm9yKGVycm9ycykpO1xufTtcblxuVkVycm9yLmVycm9yRm9yRWFjaCA9IGZ1bmN0aW9uIChlcnIsIGZ1bmMpXG57XG5cdG1vZF9hc3NlcnRwbHVzLm9rKG1vZF9pc0Vycm9yKGVyciksICdlcnIgbXVzdCBiZSBhbiBFcnJvcicpO1xuXHRtb2RfYXNzZXJ0cGx1cy5mdW5jKGZ1bmMsICdmdW5jJyk7XG5cblx0aWYgKGVyciBpbnN0YW5jZW9mIE11bHRpRXJyb3IpIHtcblx0XHRlcnIuZXJyb3JzKCkuZm9yRWFjaChmdW5jdGlvbiBpdGVyRXJyb3IoZSkgeyBmdW5jKGUpOyB9KTtcblx0fSBlbHNlIHtcblx0XHRmdW5jKGVycik7XG5cdH1cbn07XG5cblxuLypcbiAqIFNFcnJvciBpcyBsaWtlIFZFcnJvciwgYnV0IHN0cmljdGVyIGFib3V0IHR5cGVzLiAgWW91IGNhbm5vdCBwYXNzIFwibnVsbFwiIG9yXG4gKiBcInVuZGVmaW5lZFwiIGFzIHN0cmluZyBhcmd1bWVudHMgdG8gdGhlIGZvcm1hdHRlci5cbiAqL1xuZnVuY3Rpb24gU0Vycm9yKClcbntcblx0dmFyIGFyZ3MsIG9iaiwgcGFyc2VkLCBvcHRpb25zO1xuXG5cdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgU0Vycm9yKSkge1xuXHRcdG9iaiA9IE9iamVjdC5jcmVhdGUoU0Vycm9yLnByb3RvdHlwZSk7XG5cdFx0U0Vycm9yLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcblx0XHRyZXR1cm4gKG9iaik7XG5cdH1cblxuXHRwYXJzZWQgPSBwYXJzZUNvbnN0cnVjdG9yQXJndW1lbnRzKHtcblx0ICAgICdhcmd2JzogYXJncyxcblx0ICAgICdzdHJpY3QnOiB0cnVlXG5cdH0pO1xuXG5cdG9wdGlvbnMgPSBwYXJzZWQub3B0aW9ucztcblx0VkVycm9yLmNhbGwodGhpcywgb3B0aW9ucywgJyVzJywgcGFyc2VkLnNob3J0bWVzc2FnZSk7XG5cblx0cmV0dXJuICh0aGlzKTtcbn1cblxuLypcbiAqIFdlIGRvbid0IGJvdGhlciBzZXR0aW5nIFNFcnJvci5wcm90b3R5cGUubmFtZSBiZWNhdXNlIG9uY2UgY29uc3RydWN0ZWQsXG4gKiBTRXJyb3JzIGFyZSBqdXN0IGxpa2UgVkVycm9ycy5cbiAqL1xubW9kX3V0aWwuaW5oZXJpdHMoU0Vycm9yLCBWRXJyb3IpO1xuXG5cbi8qXG4gKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBlcnJvcnMgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbnN1bWVycyB0aGF0IGdlbmVyYWxseVxuICogb25seSBkZWFsIHdpdGggb25lIGVycm9yLiAgQ2FsbGVycyBjYW4gZXh0cmFjdCB0aGUgaW5kaXZpZHVhbCBlcnJvcnNcbiAqIGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCwgYnV0IG1heSBhbHNvIGp1c3QgdHJlYXQgaXQgYXMgYSBub3JtYWwgc2luZ2xlXG4gKiBlcnJvciwgaW4gd2hpY2ggY2FzZSBhIHN1bW1hcnkgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQuXG4gKi9cbmZ1bmN0aW9uIE11bHRpRXJyb3IoZXJyb3JzKVxue1xuXHRtb2RfYXNzZXJ0cGx1cy5hcnJheShlcnJvcnMsICdsaXN0IG9mIGVycm9ycycpO1xuXHRtb2RfYXNzZXJ0cGx1cy5vayhlcnJvcnMubGVuZ3RoID4gMCwgJ211c3QgYmUgYXQgbGVhc3Qgb25lIGVycm9yJyk7XG5cdHRoaXMuYXNlX2Vycm9ycyA9IGVycm9ycztcblxuXHRWRXJyb3IuY2FsbCh0aGlzLCB7XG5cdCAgICAnY2F1c2UnOiBlcnJvcnNbMF1cblx0fSwgJ2ZpcnN0IG9mICVkIGVycm9yJXMnLCBlcnJvcnMubGVuZ3RoLCBlcnJvcnMubGVuZ3RoID09IDEgPyAnJyA6ICdzJyk7XG59XG5cbm1vZF91dGlsLmluaGVyaXRzKE11bHRpRXJyb3IsIFZFcnJvcik7XG5NdWx0aUVycm9yLnByb3RvdHlwZS5uYW1lID0gJ011bHRpRXJyb3InO1xuXG5NdWx0aUVycm9yLnByb3RvdHlwZS5lcnJvcnMgPSBmdW5jdGlvbiBtZV9lcnJvcnMoKVxue1xuXHRyZXR1cm4gKHRoaXMuYXNlX2Vycm9ycy5zbGljZSgwKSk7XG59O1xuXG5cbi8qXG4gKiBTZWUgUkVBRE1FLm1kIGZvciByZWZlcmVuY2UgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gV0Vycm9yKClcbntcblx0dmFyIGFyZ3MsIG9iaiwgcGFyc2VkLCBvcHRpb25zO1xuXG5cdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgV0Vycm9yKSkge1xuXHRcdG9iaiA9IE9iamVjdC5jcmVhdGUoV0Vycm9yLnByb3RvdHlwZSk7XG5cdFx0V0Vycm9yLmFwcGx5KG9iaiwgYXJncyk7XG5cdFx0cmV0dXJuIChvYmopO1xuXHR9XG5cblx0cGFyc2VkID0gcGFyc2VDb25zdHJ1Y3RvckFyZ3VtZW50cyh7XG5cdCAgICAnYXJndic6IGFyZ3MsXG5cdCAgICAnc3RyaWN0JzogZmFsc2Vcblx0fSk7XG5cblx0b3B0aW9ucyA9IHBhcnNlZC5vcHRpb25zO1xuXHRvcHRpb25zWydza2lwQ2F1c2VNZXNzYWdlJ10gPSB0cnVlO1xuXHRWRXJyb3IuY2FsbCh0aGlzLCBvcHRpb25zLCAnJXMnLCBwYXJzZWQuc2hvcnRtZXNzYWdlKTtcblxuXHRyZXR1cm4gKHRoaXMpO1xufVxuXG5tb2RfdXRpbC5pbmhlcml0cyhXRXJyb3IsIFZFcnJvcik7XG5XRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnV0Vycm9yJztcblxuV0Vycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHdlX3RvU3RyaW5nKClcbntcblx0dmFyIHN0ciA9ICh0aGlzLmhhc093blByb3BlcnR5KCduYW1lJykgJiYgdGhpcy5uYW1lIHx8XG5cdFx0dGhpcy5jb25zdHJ1Y3Rvci5uYW1lIHx8IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLm5hbWUpO1xuXHRpZiAodGhpcy5tZXNzYWdlKVxuXHRcdHN0ciArPSAnOiAnICsgdGhpcy5tZXNzYWdlO1xuXHRpZiAodGhpcy5qc2VfY2F1c2UgJiYgdGhpcy5qc2VfY2F1c2UubWVzc2FnZSlcblx0XHRzdHIgKz0gJzsgY2F1c2VkIGJ5ICcgKyB0aGlzLmpzZV9jYXVzZS50b1N0cmluZygpO1xuXG5cdHJldHVybiAoc3RyKTtcbn07XG5cbi8qXG4gKiBGb3IgcHVyZWx5IGhpc3RvcmljYWwgcmVhc29ucywgV0Vycm9yJ3MgY2F1c2UoKSBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldFxuICogdGhlIGNhdXNlLlxuICovXG5XRXJyb3IucHJvdG90eXBlLmNhdXNlID0gZnVuY3Rpb24gd2VfY2F1c2UoYylcbntcblx0aWYgKG1vZF9pc0Vycm9yKGMpKVxuXHRcdHRoaXMuanNlX2NhdXNlID0gYztcblxuXHRyZXR1cm4gKHRoaXMuanNlX2NhdXNlKTtcbn07XG4iLCAiLyoqXHJcbiAqIEpTT05TY2hlbWEgVmFsaWRhdG9yIC0gVmFsaWRhdGVzIEphdmFTY3JpcHQgb2JqZWN0cyB1c2luZyBKU09OIFNjaGVtYXNcclxuICpcdChodHRwOi8vd3d3Lmpzb24uY29tL2pzb24tc2NoZW1hLXByb3Bvc2FsLylcclxuICogTGljZW5zZWQgdW5kZXIgQUZMLTIuMSBPUiBCU0QtMy1DbGF1c2VcclxuVG8gdXNlIHRoZSB2YWxpZGF0b3IgY2FsbCB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gd2l0aCBhbiBpbnN0YW5jZSBvYmplY3QgYW5kIGFuIG9wdGlvbmFsIHNjaGVtYSBvYmplY3QuXHJcbklmIGEgc2NoZW1hIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUuIElmIHRoZSBpbnN0YW5jZSBvYmplY3QgcmVmZXJzIHRvIGEgc2NoZW1hIChzZWxmLXZhbGlkYXRpbmcpLFxyXG50aGF0IHNjaGVtYSB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW5kIHRoZSBzY2hlbWEgcGFyYW1ldGVyIGlzIG5vdCBuZWNlc3NhcnkgKGlmIGJvdGggZXhpc3QsXHJcbmJvdGggdmFsaWRhdGlvbnMgd2lsbCBvY2N1cikuXHJcblRoZSB2YWxpZGF0ZSBtZXRob2Qgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvcnMuIElmIHRoZXJlIGFyZSBubyBlcnJvcnMsIHRoZW4gYW5cclxuZW1wdHkgbGlzdCB3aWxsIGJlIHJldHVybmVkLiBBIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBoYXZlIHR3byBwcm9wZXJ0aWVzOlxyXG5cInByb3BlcnR5XCIgd2hpY2ggaW5kaWNhdGVzIHdoaWNoIHByb3BlcnR5IGhhZCB0aGUgZXJyb3JcclxuXCJtZXNzYWdlXCIgd2hpY2ggaW5kaWNhdGVzIHdoYXQgdGhlIGVycm9yIHdhc1xyXG4gKi9cclxuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxyXG4gICAgICAgIGRlZmluZShbXSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xyXG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxyXG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxyXG4gICAgICAgIC8vIGxpa2UgTm9kZS5cclxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzXHJcbiAgICAgICAgcm9vdC5qc29uU2NoZW1hID0gZmFjdG9yeSgpO1xyXG4gICAgfVxyXG59KHRoaXMsIGZ1bmN0aW9uICgpIHsvLyBzZXR1cCBwcmltaXRpdmUgY2xhc3NlcyB0byBiZSBKU09OIFNjaGVtYSB0eXBlc1xyXG52YXIgZXhwb3J0cyA9IHZhbGlkYXRlXHJcbmV4cG9ydHMuSW50ZWdlciA9IHt0eXBlOlwiaW50ZWdlclwifTtcclxudmFyIHByaW1pdGl2ZUNvbnN0cnVjdG9ycyA9IHtcclxuXHRTdHJpbmc6IFN0cmluZyxcclxuXHRCb29sZWFuOiBCb29sZWFuLFxyXG5cdE51bWJlcjogTnVtYmVyLFxyXG5cdE9iamVjdDogT2JqZWN0LFxyXG5cdEFycmF5OiBBcnJheSxcclxuXHREYXRlOiBEYXRlXHJcbn1cclxuZXhwb3J0cy52YWxpZGF0ZSA9IHZhbGlkYXRlO1xyXG5mdW5jdGlvbiB2YWxpZGF0ZSgvKkFueSovaW5zdGFuY2UsLypPYmplY3QqL3NjaGVtYSkge1xyXG5cdFx0Ly8gU3VtbWFyeTpcclxuXHRcdC8vICBcdFRvIHVzZSB0aGUgdmFsaWRhdG9yIGNhbGwgSlNPTlNjaGVtYS52YWxpZGF0ZSB3aXRoIGFuIGluc3RhbmNlIG9iamVjdCBhbmQgYW4gb3B0aW9uYWwgc2NoZW1hIG9iamVjdC5cclxuXHRcdC8vIFx0XHRJZiBhIHNjaGVtYSBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlLiBJZiB0aGUgaW5zdGFuY2Ugb2JqZWN0IHJlZmVycyB0byBhIHNjaGVtYSAoc2VsZi12YWxpZGF0aW5nKSxcclxuXHRcdC8vIFx0XHR0aGF0IHNjaGVtYSB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW5kIHRoZSBzY2hlbWEgcGFyYW1ldGVyIGlzIG5vdCBuZWNlc3NhcnkgKGlmIGJvdGggZXhpc3QsXHJcblx0XHQvLyBcdFx0Ym90aCB2YWxpZGF0aW9ucyB3aWxsIG9jY3VyKS5cclxuXHRcdC8vIFx0XHRUaGUgdmFsaWRhdGUgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHR3byBwcm9wZXJ0aWVzOlxyXG5cdFx0Ly8gXHRcdFx0dmFsaWQ6IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBpbnN0YW5jZSBpcyB2YWxpZCBieSB0aGUgc2NoZW1hXHJcblx0XHQvLyBcdFx0XHRlcnJvcnM6IEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3JzLiBJZiB0aGVyZSBhcmUgbm8gZXJyb3JzLCB0aGVuIGFuXHJcblx0XHQvLyBcdFx0XHRcdFx0ZW1wdHkgbGlzdCB3aWxsIGJlIHJldHVybmVkLiBBIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBoYXZlIHR3byBwcm9wZXJ0aWVzOlxyXG5cdFx0Ly8gXHRcdFx0XHRcdFx0cHJvcGVydHk6IHdoaWNoIGluZGljYXRlcyB3aGljaCBwcm9wZXJ0eSBoYWQgdGhlIGVycm9yXHJcblx0XHQvLyBcdFx0XHRcdFx0XHRtZXNzYWdlOiB3aGljaCBpbmRpY2F0ZXMgd2hhdCB0aGUgZXJyb3Igd2FzXHJcblx0XHQvL1xyXG5cdFx0cmV0dXJuIHZhbGlkYXRlKGluc3RhbmNlLCBzY2hlbWEsIHtjaGFuZ2luZzogZmFsc2V9KTsvLywgY29lcmNlOiBmYWxzZSwgZXhpc3RpbmdPbmx5OiBmYWxzZX0pO1xyXG5cdH07XHJcbmV4cG9ydHMuY2hlY2tQcm9wZXJ0eUNoYW5nZSA9IGZ1bmN0aW9uKC8qQW55Ki92YWx1ZSwvKk9iamVjdCovc2NoZW1hLCAvKlN0cmluZyovcHJvcGVydHkpIHtcclxuXHRcdC8vIFN1bW1hcnk6XHJcblx0XHQvLyBcdFx0VGhlIGNoZWNrUHJvcGVydHlDaGFuZ2UgbWV0aG9kIHdpbGwgY2hlY2sgdG8gc2VlIGlmIGFuIHZhbHVlIGNhbiBsZWdhbGx5IGJlIGluIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIHNjaGVtYVxyXG5cdFx0Ly8gXHRcdFRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdGhlIHZhbGlkYXRlIG1ldGhvZCBpbiB0aGF0IGl0IHdpbGwgZmFpbCBpZiB0aGUgc2NoZW1hIGlzIHJlYWRvbmx5IGFuZCBpdCB3aWxsXHJcblx0XHQvLyBcdFx0bm90IGNoZWNrIGZvciBzZWxmLXZhbGlkYXRpb24sIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgcGFzc2VkIGluIHZhbHVlIGlzIGFscmVhZHkgaW50ZXJuYWxseSB2YWxpZC5cclxuXHRcdC8vIFx0XHRUaGUgY2hlY2tQcm9wZXJ0eUNoYW5nZSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHR5cGUgYXMgdmFsaWRhdGUsIHNlZSBKU09OU2NoZW1hLnZhbGlkYXRlIGZvclxyXG5cdFx0Ly8gXHRcdGluZm9ybWF0aW9uLlxyXG5cdFx0Ly9cclxuXHRcdHJldHVybiB2YWxpZGF0ZSh2YWx1ZSwgc2NoZW1hLCB7Y2hhbmdpbmc6IHByb3BlcnR5IHx8IFwicHJvcGVydHlcIn0pO1xyXG5cdH07XHJcbnZhciB2YWxpZGF0ZSA9IGV4cG9ydHMuX3ZhbGlkYXRlID0gZnVuY3Rpb24oLypBbnkqL2luc3RhbmNlLC8qT2JqZWN0Ki9zY2hlbWEsLypPYmplY3QqL29wdGlvbnMpIHtcclxuXHJcblx0aWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XHJcblx0dmFyIF9jaGFuZ2luZyA9IG9wdGlvbnMuY2hhbmdpbmc7XHJcblxyXG5cdGZ1bmN0aW9uIGdldFR5cGUoc2NoZW1hKXtcclxuXHRcdHJldHVybiBzY2hlbWEudHlwZSB8fCAocHJpbWl0aXZlQ29uc3RydWN0b3JzW3NjaGVtYS5uYW1lXSA9PSBzY2hlbWEgJiYgc2NoZW1hLm5hbWUudG9Mb3dlckNhc2UoKSk7XHJcblx0fVxyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHQvLyB2YWxpZGF0ZSBhIHZhbHVlIGFnYWluc3QgYSBwcm9wZXJ0eSBkZWZpbml0aW9uXHJcblx0ZnVuY3Rpb24gY2hlY2tQcm9wKHZhbHVlLCBzY2hlbWEsIHBhdGgsaSl7XHJcblxyXG5cdFx0dmFyIGw7XHJcblx0XHRwYXRoICs9IHBhdGggPyB0eXBlb2YgaSA9PSAnbnVtYmVyJyA/ICdbJyArIGkgKyAnXScgOiB0eXBlb2YgaSA9PSAndW5kZWZpbmVkJyA/ICcnIDogJy4nICsgaSA6IGk7XHJcblx0XHRmdW5jdGlvbiBhZGRFcnJvcihtZXNzYWdlKXtcclxuXHRcdFx0ZXJyb3JzLnB1c2goe3Byb3BlcnR5OnBhdGgsbWVzc2FnZTptZXNzYWdlfSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYoKHR5cGVvZiBzY2hlbWEgIT0gJ29iamVjdCcgfHwgc2NoZW1hIGluc3RhbmNlb2YgQXJyYXkpICYmIChwYXRoIHx8IHR5cGVvZiBzY2hlbWEgIT0gJ2Z1bmN0aW9uJykgJiYgIShzY2hlbWEgJiYgZ2V0VHlwZShzY2hlbWEpKSl7XHJcblx0XHRcdGlmKHR5cGVvZiBzY2hlbWEgPT0gJ2Z1bmN0aW9uJyl7XHJcblx0XHRcdFx0aWYoISh2YWx1ZSBpbnN0YW5jZW9mIHNjaGVtYSkpe1xyXG5cdFx0XHRcdFx0YWRkRXJyb3IoXCJpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzL2NvbnN0cnVjdG9yIFwiICsgc2NoZW1hLm5hbWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fWVsc2UgaWYoc2NoZW1hKXtcclxuXHRcdFx0XHRhZGRFcnJvcihcIkludmFsaWQgc2NoZW1hL3Byb3BlcnR5IGRlZmluaXRpb24gXCIgKyBzY2hlbWEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdFx0aWYoX2NoYW5naW5nICYmIHNjaGVtYS5yZWFkb25seSl7XHJcblx0XHRcdGFkZEVycm9yKFwiaXMgYSByZWFkb25seSBmaWVsZCwgaXQgY2FuIG5vdCBiZSBjaGFuZ2VkXCIpO1xyXG5cdFx0fVxyXG5cdFx0aWYoc2NoZW1hWydleHRlbmRzJ10peyAvLyBpZiBpdCBleHRlbmRzIGFub3RoZXIgc2NoZW1hLCBpdCBtdXN0IHBhc3MgdGhhdCBzY2hlbWEgYXMgd2VsbFxyXG5cdFx0XHRjaGVja1Byb3AodmFsdWUsc2NoZW1hWydleHRlbmRzJ10scGF0aCxpKTtcclxuXHRcdH1cclxuXHRcdC8vIHZhbGlkYXRlIGEgdmFsdWUgYWdhaW5zdCBhIHR5cGUgZGVmaW5pdGlvblxyXG5cdFx0ZnVuY3Rpb24gY2hlY2tUeXBlKHR5cGUsdmFsdWUpe1xyXG5cdFx0XHRpZih0eXBlKXtcclxuXHRcdFx0XHRpZih0eXBlb2YgdHlwZSA9PSAnc3RyaW5nJyAmJiB0eXBlICE9ICdhbnknICYmXHJcblx0XHRcdFx0XHRcdCh0eXBlID09ICdudWxsJyA/IHZhbHVlICE9PSBudWxsIDogdHlwZW9mIHZhbHVlICE9IHR5cGUpICYmXHJcblx0XHRcdFx0XHRcdCEodmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiB0eXBlID09ICdhcnJheScpICYmXHJcblx0XHRcdFx0XHRcdCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmIHR5cGUgPT0gJ2RhdGUnKSAmJlxyXG5cdFx0XHRcdFx0XHQhKHR5cGUgPT0gJ2ludGVnZXInICYmIHZhbHVlJTE9PT0wKSl7XHJcblx0XHRcdFx0XHRyZXR1cm4gW3twcm9wZXJ0eTpwYXRoLG1lc3NhZ2U6dmFsdWUgKyBcIiAtIFwiICsgKHR5cGVvZiB2YWx1ZSkgKyBcIiB2YWx1ZSBmb3VuZCwgYnV0IGEgXCIgKyB0eXBlICsgXCIgaXMgcmVxdWlyZWRcIn1dO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZih0eXBlIGluc3RhbmNlb2YgQXJyYXkpe1xyXG5cdFx0XHRcdFx0dmFyIHVuaW9uRXJyb3JzPVtdO1xyXG5cdFx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IHR5cGUubGVuZ3RoOyBqKyspeyAvLyBhIHVuaW9uIHR5cGVcclxuXHRcdFx0XHRcdFx0aWYoISh1bmlvbkVycm9ycz1jaGVja1R5cGUodHlwZVtqXSx2YWx1ZSkpLmxlbmd0aCl7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKHVuaW9uRXJyb3JzLmxlbmd0aCl7XHJcblx0XHRcdFx0XHRcdHJldHVybiB1bmlvbkVycm9ycztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ZWxzZSBpZih0eXBlb2YgdHlwZSA9PSAnb2JqZWN0Jyl7XHJcblx0XHRcdFx0XHR2YXIgcHJpb3JFcnJvcnMgPSBlcnJvcnM7XHJcblx0XHRcdFx0XHRlcnJvcnMgPSBbXTtcclxuXHRcdFx0XHRcdGNoZWNrUHJvcCh2YWx1ZSx0eXBlLHBhdGgpO1xyXG5cdFx0XHRcdFx0dmFyIHRoZXNlRXJyb3JzID0gZXJyb3JzO1xyXG5cdFx0XHRcdFx0ZXJyb3JzID0gcHJpb3JFcnJvcnM7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhlc2VFcnJvcnM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHRcdGlmKHZhbHVlID09PSB1bmRlZmluZWQpe1xyXG5cdFx0XHRpZihzY2hlbWEucmVxdWlyZWQpe1xyXG5cdFx0XHRcdGFkZEVycm9yKFwiaXMgbWlzc2luZyBhbmQgaXQgaXMgcmVxdWlyZWRcIik7XHJcblx0XHRcdH1cclxuXHRcdH1lbHNle1xyXG5cdFx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KGNoZWNrVHlwZShnZXRUeXBlKHNjaGVtYSksdmFsdWUpKTtcclxuXHRcdFx0aWYoc2NoZW1hLmRpc2FsbG93ICYmICFjaGVja1R5cGUoc2NoZW1hLmRpc2FsbG93LHZhbHVlKS5sZW5ndGgpe1xyXG5cdFx0XHRcdGFkZEVycm9yKFwiIGRpc2FsbG93ZWQgdmFsdWUgd2FzIG1hdGNoZWRcIik7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYodmFsdWUgIT09IG51bGwpe1xyXG5cdFx0XHRcdGlmKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpe1xyXG5cdFx0XHRcdFx0aWYoc2NoZW1hLml0ZW1zKXtcclxuXHRcdFx0XHRcdFx0dmFyIGl0ZW1zSXNBcnJheSA9IHNjaGVtYS5pdGVtcyBpbnN0YW5jZW9mIEFycmF5O1xyXG5cdFx0XHRcdFx0XHR2YXIgcHJvcERlZiA9IHNjaGVtYS5pdGVtcztcclxuXHRcdFx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkgKz0gMSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChpdGVtc0lzQXJyYXkpXHJcblx0XHRcdFx0XHRcdFx0XHRwcm9wRGVmID0gc2NoZW1hLml0ZW1zW2ldO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLmNvZXJjZSlcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlW2ldID0gb3B0aW9ucy5jb2VyY2UodmFsdWVbaV0sIHByb3BEZWYpO1xyXG5cdFx0XHRcdFx0XHRcdGVycm9ycy5jb25jYXQoY2hlY2tQcm9wKHZhbHVlW2ldLHByb3BEZWYscGF0aCxpKSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKHNjaGVtYS5taW5JdGVtcyAmJiB2YWx1ZS5sZW5ndGggPCBzY2hlbWEubWluSXRlbXMpe1xyXG5cdFx0XHRcdFx0XHRhZGRFcnJvcihcIlRoZXJlIG11c3QgYmUgYSBtaW5pbXVtIG9mIFwiICsgc2NoZW1hLm1pbkl0ZW1zICsgXCIgaW4gdGhlIGFycmF5XCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYoc2NoZW1hLm1heEl0ZW1zICYmIHZhbHVlLmxlbmd0aCA+IHNjaGVtYS5tYXhJdGVtcyl7XHJcblx0XHRcdFx0XHRcdGFkZEVycm9yKFwiVGhlcmUgbXVzdCBiZSBhIG1heGltdW0gb2YgXCIgKyBzY2hlbWEubWF4SXRlbXMgKyBcIiBpbiB0aGUgYXJyYXlcIik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fWVsc2UgaWYoc2NoZW1hLnByb3BlcnRpZXMgfHwgc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKXtcclxuXHRcdFx0XHRcdGVycm9ycy5jb25jYXQoY2hlY2tPYmoodmFsdWUsIHNjaGVtYS5wcm9wZXJ0aWVzLCBwYXRoLCBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoc2NoZW1hLnBhdHRlcm4gJiYgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmICF2YWx1ZS5tYXRjaChzY2hlbWEucGF0dGVybikpe1xyXG5cdFx0XHRcdFx0YWRkRXJyb3IoXCJkb2VzIG5vdCBtYXRjaCB0aGUgcmVnZXggcGF0dGVybiBcIiArIHNjaGVtYS5wYXR0ZXJuKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoc2NoZW1hLm1heExlbmd0aCAmJiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gc2NoZW1hLm1heExlbmd0aCl7XHJcblx0XHRcdFx0XHRhZGRFcnJvcihcIm1heSBvbmx5IGJlIFwiICsgc2NoZW1hLm1heExlbmd0aCArIFwiIGNoYXJhY3RlcnMgbG9uZ1wiKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoc2NoZW1hLm1pbkxlbmd0aCAmJiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoIDwgc2NoZW1hLm1pbkxlbmd0aCl7XHJcblx0XHRcdFx0XHRhZGRFcnJvcihcIm11c3QgYmUgYXQgbGVhc3QgXCIgKyBzY2hlbWEubWluTGVuZ3RoICsgXCIgY2hhcmFjdGVycyBsb25nXCIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZih0eXBlb2Ygc2NoZW1hLm1pbmltdW0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB2YWx1ZSA9PSB0eXBlb2Ygc2NoZW1hLm1pbmltdW0gJiZcclxuXHRcdFx0XHRcdFx0c2NoZW1hLm1pbmltdW0gPiB2YWx1ZSl7XHJcblx0XHRcdFx0XHRhZGRFcnJvcihcIm11c3QgaGF2ZSBhIG1pbmltdW0gdmFsdWUgb2YgXCIgKyBzY2hlbWEubWluaW11bSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKHR5cGVvZiBzY2hlbWEubWF4aW11bSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHZhbHVlID09IHR5cGVvZiBzY2hlbWEubWF4aW11bSAmJlxyXG5cdFx0XHRcdFx0XHRzY2hlbWEubWF4aW11bSA8IHZhbHVlKXtcclxuXHRcdFx0XHRcdGFkZEVycm9yKFwibXVzdCBoYXZlIGEgbWF4aW11bSB2YWx1ZSBvZiBcIiArIHNjaGVtYS5tYXhpbXVtKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoc2NoZW1hWydlbnVtJ10pe1xyXG5cdFx0XHRcdFx0dmFyIGVudW1lciA9IHNjaGVtYVsnZW51bSddO1xyXG5cdFx0XHRcdFx0bCA9IGVudW1lci5sZW5ndGg7XHJcblx0XHRcdFx0XHR2YXIgZm91bmQ7XHJcblx0XHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgbDsgaisrKXtcclxuXHRcdFx0XHRcdFx0aWYoZW51bWVyW2pdPT09dmFsdWUpe1xyXG5cdFx0XHRcdFx0XHRcdGZvdW5kPTE7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKCFmb3VuZCl7XHJcblx0XHRcdFx0XHRcdGFkZEVycm9yKFwiZG9lcyBub3QgaGF2ZSBhIHZhbHVlIGluIHRoZSBlbnVtZXJhdGlvbiBcIiArIGVudW1lci5qb2luKFwiLCBcIikpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZih0eXBlb2Ygc2NoZW1hLm1heERlY2ltYWwgPT0gJ251bWJlcicgJiZcclxuXHRcdFx0XHRcdCh2YWx1ZS50b1N0cmluZygpLm1hdGNoKG5ldyBSZWdFeHAoXCJcXFxcLlswLTlde1wiICsgKHNjaGVtYS5tYXhEZWNpbWFsICsgMSkgKyBcIix9XCIpKSkpe1xyXG5cdFx0XHRcdFx0YWRkRXJyb3IoXCJtYXkgb25seSBoYXZlIFwiICsgc2NoZW1hLm1heERlY2ltYWwgKyBcIiBkaWdpdHMgb2YgZGVjaW1hbCBwbGFjZXNcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0Ly8gdmFsaWRhdGUgYW4gb2JqZWN0IGFnYWluc3QgYSBzY2hlbWFcclxuXHRmdW5jdGlvbiBjaGVja09iaihpbnN0YW5jZSxvYmpUeXBlRGVmLHBhdGgsYWRkaXRpb25hbFByb3Ape1xyXG5cclxuXHRcdGlmKHR5cGVvZiBvYmpUeXBlRGVmID09J29iamVjdCcpe1xyXG5cdFx0XHRpZih0eXBlb2YgaW5zdGFuY2UgIT0gJ29iamVjdCcgfHwgaW5zdGFuY2UgaW5zdGFuY2VvZiBBcnJheSl7XHJcblx0XHRcdFx0ZXJyb3JzLnB1c2goe3Byb3BlcnR5OnBhdGgsbWVzc2FnZTpcImFuIG9iamVjdCBpcyByZXF1aXJlZFwifSk7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdGZvcih2YXIgaSBpbiBvYmpUeXBlRGVmKXsgXHJcblx0XHRcdFx0aWYob2JqVHlwZURlZi5oYXNPd25Qcm9wZXJ0eShpKSAmJiBpICE9ICdfX3Byb3RvX18nICYmIGkgIT0gJ2NvbnN0cnVjdG9yJyl7XHJcblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBpbnN0YW5jZS5oYXNPd25Qcm9wZXJ0eShpKSA/IGluc3RhbmNlW2ldIDogdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0Ly8gc2tpcCBfbm90XyBzcGVjaWZpZWQgcHJvcGVydGllc1xyXG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5leGlzdGluZ09ubHkpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0dmFyIHByb3BEZWYgPSBvYmpUeXBlRGVmW2ldO1xyXG5cdFx0XHRcdFx0Ly8gc2V0IGRlZmF1bHRcclxuXHRcdFx0XHRcdGlmKHZhbHVlID09PSB1bmRlZmluZWQgJiYgcHJvcERlZltcImRlZmF1bHRcIl0pe1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGluc3RhbmNlW2ldID0gcHJvcERlZltcImRlZmF1bHRcIl07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihvcHRpb25zLmNvZXJjZSAmJiBpIGluIGluc3RhbmNlKXtcclxuXHRcdFx0XHRcdFx0dmFsdWUgPSBpbnN0YW5jZVtpXSA9IG9wdGlvbnMuY29lcmNlKHZhbHVlLCBwcm9wRGVmKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGNoZWNrUHJvcCh2YWx1ZSxwcm9wRGVmLHBhdGgsaSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRmb3IoaSBpbiBpbnN0YW5jZSl7XHJcblx0XHRcdGlmKGluc3RhbmNlLmhhc093blByb3BlcnR5KGkpICYmICEoaS5jaGFyQXQoMCkgPT0gJ18nICYmIGkuY2hhckF0KDEpID09ICdfJykgJiYgb2JqVHlwZURlZiAmJiAhb2JqVHlwZURlZltpXSAmJiBhZGRpdGlvbmFsUHJvcD09PWZhbHNlKXtcclxuXHRcdFx0XHRpZiAob3B0aW9ucy5maWx0ZXIpIHtcclxuXHRcdFx0XHRcdGRlbGV0ZSBpbnN0YW5jZVtpXTtcclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRlcnJvcnMucHVzaCh7cHJvcGVydHk6cGF0aCxtZXNzYWdlOlwiVGhlIHByb3BlcnR5IFwiICsgaSArXHJcblx0XHRcdFx0XHRcdFwiIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzY2hlbWEgYW5kIHRoZSBzY2hlbWEgZG9lcyBub3QgYWxsb3cgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXCJ9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dmFyIHJlcXVpcmVzID0gb2JqVHlwZURlZiAmJiBvYmpUeXBlRGVmW2ldICYmIG9ialR5cGVEZWZbaV0ucmVxdWlyZXM7XHJcblx0XHRcdGlmKHJlcXVpcmVzICYmICEocmVxdWlyZXMgaW4gaW5zdGFuY2UpKXtcclxuXHRcdFx0XHRlcnJvcnMucHVzaCh7cHJvcGVydHk6cGF0aCxtZXNzYWdlOlwidGhlIHByZXNlbmNlIG9mIHRoZSBwcm9wZXJ0eSBcIiArIGkgKyBcIiByZXF1aXJlcyB0aGF0IFwiICsgcmVxdWlyZXMgKyBcIiBhbHNvIGJlIHByZXNlbnRcIn0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlID0gaW5zdGFuY2VbaV07XHJcblx0XHRcdGlmKGFkZGl0aW9uYWxQcm9wICYmICghKG9ialR5cGVEZWYgJiYgdHlwZW9mIG9ialR5cGVEZWYgPT0gJ29iamVjdCcpIHx8ICEoaSBpbiBvYmpUeXBlRGVmKSkpe1xyXG5cdFx0XHRcdGlmKG9wdGlvbnMuY29lcmNlKXtcclxuXHRcdFx0XHRcdHZhbHVlID0gaW5zdGFuY2VbaV0gPSBvcHRpb25zLmNvZXJjZSh2YWx1ZSwgYWRkaXRpb25hbFByb3ApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjaGVja1Byb3AodmFsdWUsYWRkaXRpb25hbFByb3AscGF0aCxpKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZighX2NoYW5naW5nICYmIHZhbHVlICYmIHZhbHVlLiRzY2hlbWEpe1xyXG5cdFx0XHRcdGVycm9ycyA9IGVycm9ycy5jb25jYXQoY2hlY2tQcm9wKHZhbHVlLHZhbHVlLiRzY2hlbWEscGF0aCxpKSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBlcnJvcnM7XHJcblx0fVxyXG5cdGlmKHNjaGVtYSl7XHJcblx0XHRjaGVja1Byb3AoaW5zdGFuY2Usc2NoZW1hLCcnLF9jaGFuZ2luZyB8fCAnJyk7XHJcblx0fVxyXG5cdGlmKCFfY2hhbmdpbmcgJiYgaW5zdGFuY2UgJiYgaW5zdGFuY2UuJHNjaGVtYSl7XHJcblx0XHRjaGVja1Byb3AoaW5zdGFuY2UsaW5zdGFuY2UuJHNjaGVtYSwnJywnJyk7XHJcblx0fVxyXG5cdHJldHVybiB7dmFsaWQ6IWVycm9ycy5sZW5ndGgsZXJyb3JzOmVycm9yc307XHJcbn07XHJcbmV4cG9ydHMubXVzdEJlVmFsaWQgPSBmdW5jdGlvbihyZXN1bHQpe1xyXG5cdC8vXHRzdW1tYXJ5OlxyXG5cdC8vXHRcdFRoaXMgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgaXMgdmFsaWQgYW5kIHdpbGwgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBpZiBpdCBpcyBub3RcclxuXHQvLyByZXN1bHQ6IHRoZSByZXN1bHQgcmV0dXJuZWQgZnJvbSBjaGVja1Byb3BlcnR5Q2hhbmdlIG9yIHZhbGlkYXRlXHJcblx0aWYoIXJlc3VsdC52YWxpZCl7XHJcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKHJlc3VsdC5lcnJvcnMubWFwKGZ1bmN0aW9uKGVycm9yKXtyZXR1cm4gXCJmb3IgcHJvcGVydHkgXCIgKyBlcnJvci5wcm9wZXJ0eSArICc6ICcgKyBlcnJvci5tZXNzYWdlO30pLmpvaW4oXCIsIFxcblwiKSk7XHJcblx0fVxyXG59XHJcblxyXG5yZXR1cm4gZXhwb3J0cztcclxufSkpO1xyXG4iLCAiLypcbiAqIGxpYi9qc3ByaW0uanM6IHV0aWxpdGllcyBmb3IgcHJpbWl0aXZlIEphdmFTY3JpcHQgdHlwZXNcbiAqL1xuXG52YXIgbW9kX2Fzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgbW9kX3V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbnZhciBtb2RfZXh0c3ByaW50ZiA9IHJlcXVpcmUoJ2V4dHNwcmludGYnKTtcbnZhciBtb2RfdmVycm9yID0gcmVxdWlyZSgndmVycm9yJyk7XG52YXIgbW9kX2pzb25zY2hlbWEgPSByZXF1aXJlKCdqc29uLXNjaGVtYScpO1xuXG4vKlxuICogUHVibGljIGludGVyZmFjZVxuICovXG5leHBvcnRzLmRlZXBDb3B5ID0gZGVlcENvcHk7XG5leHBvcnRzLmRlZXBFcXVhbCA9IGRlZXBFcXVhbDtcbmV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7XG5leHBvcnRzLmhhc0tleSA9IGhhc0tleTtcbmV4cG9ydHMuZm9yRWFjaEtleSA9IGZvckVhY2hLZXk7XG5leHBvcnRzLnBsdWNrID0gcGx1Y2s7XG5leHBvcnRzLmZsYXR0ZW5PYmplY3QgPSBmbGF0dGVuT2JqZWN0O1xuZXhwb3J0cy5mbGF0dGVuSXRlciA9IGZsYXR0ZW5JdGVyO1xuZXhwb3J0cy52YWxpZGF0ZUpzb25PYmplY3QgPSB2YWxpZGF0ZUpzb25PYmplY3RKUztcbmV4cG9ydHMudmFsaWRhdGVKc29uT2JqZWN0SlMgPSB2YWxpZGF0ZUpzb25PYmplY3RKUztcbmV4cG9ydHMucmFuZEVsdCA9IHJhbmRFbHQ7XG5leHBvcnRzLmV4dHJhUHJvcGVydGllcyA9IGV4dHJhUHJvcGVydGllcztcbmV4cG9ydHMubWVyZ2VPYmplY3RzID0gbWVyZ2VPYmplY3RzO1xuXG5leHBvcnRzLnN0YXJ0c1dpdGggPSBzdGFydHNXaXRoO1xuZXhwb3J0cy5lbmRzV2l0aCA9IGVuZHNXaXRoO1xuXG5leHBvcnRzLnBhcnNlSW50ZWdlciA9IHBhcnNlSW50ZWdlcjtcblxuZXhwb3J0cy5pc284NjAxID0gaXNvODYwMTtcbmV4cG9ydHMucmZjMTEyMyA9IHJmYzExMjM7XG5leHBvcnRzLnBhcnNlRGF0ZVRpbWUgPSBwYXJzZURhdGVUaW1lO1xuXG5leHBvcnRzLmhydGltZWRpZmYgPSBocnRpbWVEaWZmO1xuZXhwb3J0cy5ocnRpbWVEaWZmID0gaHJ0aW1lRGlmZjtcbmV4cG9ydHMuaHJ0aW1lQWNjdW0gPSBocnRpbWVBY2N1bTtcbmV4cG9ydHMuaHJ0aW1lQWRkID0gaHJ0aW1lQWRkO1xuZXhwb3J0cy5ocnRpbWVOYW5vc2VjID0gaHJ0aW1lTmFub3NlYztcbmV4cG9ydHMuaHJ0aW1lTWljcm9zZWMgPSBocnRpbWVNaWNyb3NlYztcbmV4cG9ydHMuaHJ0aW1lTWlsbGlzZWMgPSBocnRpbWVNaWxsaXNlYztcblxuXG4vKlxuICogRGVlcCBjb3B5IGFuIGFjeWNsaWMgKmJhc2ljKiBKYXZhc2NyaXB0IG9iamVjdC4gIFRoaXMgb25seSBoYW5kbGVzIGJhc2ljXG4gKiBzY2FsYXJzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucykgYW5kIGFyYml0cmFyaWx5IGRlZXAgYXJyYXlzIGFuZCBvYmplY3RzXG4gKiBjb250YWluaW5nIHRoZXNlLiAgVGhpcyBkb2VzICpub3QqIGhhbmRsZSBpbnN0YW5jZXMgb2Ygb3RoZXIgY2xhc3Nlcy5cbiAqL1xuZnVuY3Rpb24gZGVlcENvcHkob2JqKVxue1xuXHR2YXIgcmV0LCBrZXk7XG5cdHZhciBtYXJrZXIgPSAnX19kZWVwQ29weSc7XG5cblx0aWYgKG9iaiAmJiBvYmpbbWFya2VyXSlcblx0XHR0aHJvdyAobmV3IEVycm9yKCdhdHRlbXB0ZWQgZGVlcCBjb3B5IG9mIGN5Y2xpYyBvYmplY3QnKSk7XG5cblx0aWYgKG9iaiAmJiBvYmouY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7XG5cdFx0cmV0ID0ge307XG5cdFx0b2JqW21hcmtlcl0gPSB0cnVlO1xuXG5cdFx0Zm9yIChrZXkgaW4gb2JqKSB7XG5cdFx0XHRpZiAoa2V5ID09IG1hcmtlcilcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdHJldFtrZXldID0gZGVlcENvcHkob2JqW2tleV0pO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSAob2JqW21hcmtlcl0pO1xuXHRcdHJldHVybiAocmV0KTtcblx0fVxuXG5cdGlmIChvYmogJiYgb2JqLmNvbnN0cnVjdG9yID09IEFycmF5KSB7XG5cdFx0cmV0ID0gW107XG5cdFx0b2JqW21hcmtlcl0gPSB0cnVlO1xuXG5cdFx0Zm9yIChrZXkgPSAwOyBrZXkgPCBvYmoubGVuZ3RoOyBrZXkrKylcblx0XHRcdHJldC5wdXNoKGRlZXBDb3B5KG9ialtrZXldKSk7XG5cblx0XHRkZWxldGUgKG9ialttYXJrZXJdKTtcblx0XHRyZXR1cm4gKHJldCk7XG5cdH1cblxuXHQvKlxuXHQgKiBJdCBtdXN0IGJlIGEgcHJpbWl0aXZlIHR5cGUgLS0ganVzdCByZXR1cm4gaXQuXG5cdCAqL1xuXHRyZXR1cm4gKG9iaik7XG59XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbChvYmoxLCBvYmoyKVxue1xuXHRpZiAodHlwZW9mIChvYmoxKSAhPSB0eXBlb2YgKG9iajIpKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdGlmIChvYmoxID09PSBudWxsIHx8IG9iajIgPT09IG51bGwgfHwgdHlwZW9mIChvYmoxKSAhPSAnb2JqZWN0Jylcblx0XHRyZXR1cm4gKG9iajEgPT09IG9iajIpO1xuXG5cdGlmIChvYmoxLmNvbnN0cnVjdG9yICE9IG9iajIuY29uc3RydWN0b3IpXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0dmFyIGs7XG5cdGZvciAoayBpbiBvYmoxKSB7XG5cdFx0aWYgKCFvYmoyLmhhc093blByb3BlcnR5KGspKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRpZiAoIWRlZXBFcXVhbChvYmoxW2tdLCBvYmoyW2tdKSlcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXHR9XG5cblx0Zm9yIChrIGluIG9iajIpIHtcblx0XHRpZiAoIW9iajEuaGFzT3duUHJvcGVydHkoaykpXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdHJldHVybiAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkob2JqKVxue1xuXHR2YXIga2V5O1xuXHRmb3IgKGtleSBpbiBvYmopXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cdHJldHVybiAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGhhc0tleShvYmosIGtleSlcbntcblx0bW9kX2Fzc2VydC5lcXVhbCh0eXBlb2YgKGtleSksICdzdHJpbmcnKTtcblx0cmV0dXJuIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaEtleShvYmosIGNhbGxiYWNrKVxue1xuXHRmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdFx0aWYgKGhhc0tleShvYmosIGtleSkpIHtcblx0XHRcdGNhbGxiYWNrKGtleSwgb2JqW2tleV0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwbHVjayhvYmosIGtleSlcbntcblx0bW9kX2Fzc2VydC5lcXVhbCh0eXBlb2YgKGtleSksICdzdHJpbmcnKTtcblx0cmV0dXJuIChwbHVja3Yob2JqLCBrZXkpKTtcbn1cblxuZnVuY3Rpb24gcGx1Y2t2KG9iaiwga2V5KVxue1xuXHRpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiAob2JqKSAhPT0gJ29iamVjdCcpXG5cdFx0cmV0dXJuICh1bmRlZmluZWQpO1xuXG5cdGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSlcblx0XHRyZXR1cm4gKG9ialtrZXldKTtcblxuXHR2YXIgaSA9IGtleS5pbmRleE9mKCcuJyk7XG5cdGlmIChpID09IC0xKVxuXHRcdHJldHVybiAodW5kZWZpbmVkKTtcblxuXHR2YXIga2V5MSA9IGtleS5zdWJzdHIoMCwgaSk7XG5cdGlmICghb2JqLmhhc093blByb3BlcnR5KGtleTEpKVxuXHRcdHJldHVybiAodW5kZWZpbmVkKTtcblxuXHRyZXR1cm4gKHBsdWNrdihvYmpba2V5MV0sIGtleS5zdWJzdHIoaSArIDEpKSk7XG59XG5cbi8qXG4gKiBJbnZva2UgY2FsbGJhY2socm93KSBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieVxuICogZmxhdHRlbk9iamVjdChkYXRhLCBkZXB0aCkuICBUaGlzIGlzIGp1c3QgbGlrZSBmbGF0dGVuT2JqZWN0KGRhdGEsXG4gKiBkZXB0aCkuZm9yRWFjaChjYWxsYmFjayksIGV4Y2VwdCB0aGF0IHRoZSBpbnRlcm1lZGlhdGUgYXJyYXkgaXMgbmV2ZXJcbiAqIGNyZWF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5JdGVyKGRhdGEsIGRlcHRoLCBjYWxsYmFjaylcbntcblx0ZG9GbGF0dGVuSXRlcihkYXRhLCBkZXB0aCwgW10sIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZG9GbGF0dGVuSXRlcihkYXRhLCBkZXB0aCwgYWNjdW0sIGNhbGxiYWNrKVxue1xuXHR2YXIgZWFjaDtcblx0dmFyIGtleTtcblxuXHRpZiAoZGVwdGggPT09IDApIHtcblx0XHRlYWNoID0gYWNjdW0uc2xpY2UoMCk7XG5cdFx0ZWFjaC5wdXNoKGRhdGEpO1xuXHRcdGNhbGxiYWNrKGVhY2gpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdG1vZF9hc3NlcnQub2soZGF0YSAhPT0gbnVsbCk7XG5cdG1vZF9hc3NlcnQuZXF1YWwodHlwZW9mIChkYXRhKSwgJ29iamVjdCcpO1xuXHRtb2RfYXNzZXJ0LmVxdWFsKHR5cGVvZiAoZGVwdGgpLCAnbnVtYmVyJyk7XG5cdG1vZF9hc3NlcnQub2soZGVwdGggPj0gMCk7XG5cblx0Zm9yIChrZXkgaW4gZGF0YSkge1xuXHRcdGVhY2ggPSBhY2N1bS5zbGljZSgwKTtcblx0XHRlYWNoLnB1c2goa2V5KTtcblx0XHRkb0ZsYXR0ZW5JdGVyKGRhdGFba2V5XSwgZGVwdGggLSAxLCBlYWNoLCBjYWxsYmFjayk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZmxhdHRlbk9iamVjdChkYXRhLCBkZXB0aClcbntcblx0aWYgKGRlcHRoID09PSAwKVxuXHRcdHJldHVybiAoWyBkYXRhIF0pO1xuXG5cdG1vZF9hc3NlcnQub2soZGF0YSAhPT0gbnVsbCk7XG5cdG1vZF9hc3NlcnQuZXF1YWwodHlwZW9mIChkYXRhKSwgJ29iamVjdCcpO1xuXHRtb2RfYXNzZXJ0LmVxdWFsKHR5cGVvZiAoZGVwdGgpLCAnbnVtYmVyJyk7XG5cdG1vZF9hc3NlcnQub2soZGVwdGggPj0gMCk7XG5cblx0dmFyIHJ2ID0gW107XG5cdHZhciBrZXk7XG5cblx0Zm9yIChrZXkgaW4gZGF0YSkge1xuXHRcdGZsYXR0ZW5PYmplY3QoZGF0YVtrZXldLCBkZXB0aCAtIDEpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcblx0XHRcdHJ2LnB1c2goWyBrZXkgXS5jb25jYXQocCkpO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIChydik7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpXG57XG5cdHJldHVybiAoc3RyLnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PSBwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeClcbntcblx0cmV0dXJuIChzdHIuc3Vic3RyKFxuXHQgICAgc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgsIHN1ZmZpeC5sZW5ndGgpID09IHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGlzbzg2MDEoZClcbntcblx0aWYgKHR5cGVvZiAoZCkgPT0gJ251bWJlcicpXG5cdFx0ZCA9IG5ldyBEYXRlKGQpO1xuXHRtb2RfYXNzZXJ0Lm9rKGQuY29uc3RydWN0b3IgPT09IERhdGUpO1xuXHRyZXR1cm4gKG1vZF9leHRzcHJpbnRmLnNwcmludGYoJyU0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmQuJTAzZFonLFxuXHQgICAgZC5nZXRVVENGdWxsWWVhcigpLCBkLmdldFVUQ01vbnRoKCkgKyAxLCBkLmdldFVUQ0RhdGUoKSxcblx0ICAgIGQuZ2V0VVRDSG91cnMoKSwgZC5nZXRVVENNaW51dGVzKCksIGQuZ2V0VVRDU2Vjb25kcygpLFxuXHQgICAgZC5nZXRVVENNaWxsaXNlY29uZHMoKSkpO1xufVxuXG52YXIgUkZDMTEyM19NT05USFMgPSBbXG4gICAgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJyxcbiAgICAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbnZhciBSRkMxMTIzX0RBWVMgPSBbXG4gICAgJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddO1xuXG5mdW5jdGlvbiByZmMxMTIzKGRhdGUpIHtcblx0cmV0dXJuIChtb2RfZXh0c3ByaW50Zi5zcHJpbnRmKCclcywgJTAyZCAlcyAlMDRkICUwMmQ6JTAyZDolMDJkIEdNVCcsXG5cdCAgICBSRkMxMTIzX0RBWVNbZGF0ZS5nZXRVVENEYXkoKV0sIGRhdGUuZ2V0VVRDRGF0ZSgpLFxuXHQgICAgUkZDMTEyM19NT05USFNbZGF0ZS5nZXRVVENNb250aCgpXSwgZGF0ZS5nZXRVVENGdWxsWWVhcigpLFxuXHQgICAgZGF0ZS5nZXRVVENIb3VycygpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKSxcblx0ICAgIGRhdGUuZ2V0VVRDU2Vjb25kcygpKSk7XG59XG5cbi8qXG4gKiBQYXJzZXMgYSBkYXRlIGV4cHJlc3NlZCBhcyBhIHN0cmluZywgYXMgZWl0aGVyIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZVxuICogdGhlIGVwb2NoIG9yIGFueSBzdHJpbmcgZm9ybWF0IHRoYXQgRGF0ZSBhY2NlcHRzLCBnaXZpbmcgcHJlZmVyZW5jZSB0byB0aGVcbiAqIGZvcm1lciB3aGVyZSB0aGVzZSB0d28gc2V0cyBvdmVybGFwIChlLmcuLCBzbWFsbCBudW1iZXJzKS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VEYXRlVGltZShzdHIpXG57XG5cdC8qXG5cdCAqIFRoaXMgaXMgaXJyaXRhdGluZ2x5IGltcGxpY2l0LCBidXQgc2lnbmlmaWNhbnRseSBtb3JlIGNvbmNpc2UgdGhhblxuXHQgKiBhbHRlcm5hdGl2ZXMuICBUaGUgXCIrc3RyXCIgd2lsbCBjb252ZXJ0IGEgc3RyaW5nIGNvbnRhaW5pbmcgb25seSBhXG5cdCAqIG51bWJlciBkaXJlY3RseSB0byBhIE51bWJlciwgb3IgTmFOIGZvciBvdGhlciBzdHJpbmdzLiAgVGh1cywgaWYgdGhlXG5cdCAqIGNvbnZlcnNpb24gc3VjY2VlZHMsIHdlIHVzZSBpdCAodGhpcyBpcyB0aGUgbWlsbGlzZWNvbmRzLXNpbmNlLWVwb2NoXG5cdCAqIGNhc2UpLiAgT3RoZXJ3aXNlLCB3ZSBwYXNzIHRoZSBzdHJpbmcgZGlyZWN0bHkgdG8gdGhlIERhdGVcblx0ICogY29uc3RydWN0b3IgdG8gcGFyc2UuXG5cdCAqL1xuXHR2YXIgbnVtZXJpYyA9ICtzdHI7XG5cdGlmICghaXNOYU4obnVtZXJpYykpIHtcblx0XHRyZXR1cm4gKG5ldyBEYXRlKG51bWVyaWMpKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gKG5ldyBEYXRlKHN0cikpO1xuXHR9XG59XG5cblxuLypcbiAqIE51bWJlci4qX1NBRkVfSU5URUdFUiBpc24ndCBwcmVzZW50IGJlZm9yZSBub2RlIHYwLjEyLCBzbyB3ZSBoYXJkY29kZVxuICogdGhlIEVTNiBkZWZpbml0aW9ucyBoZXJlLCB3aGlsZSBhbGxvd2luZyBmb3IgdGhlbSB0byBzb21lZGF5IGJlIGhpZ2hlci5cbiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xudmFyIE1JTl9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCAtOTAwNzE5OTI1NDc0MDk5MTtcblxuXG4vKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciBwYXJzZUludGVnZXIoKS5cbiAqL1xudmFyIFBJX0RFRkFVTFRTID0ge1xuXHRiYXNlOiAxMCxcblx0YWxsb3dTaWduOiB0cnVlLFxuXHRhbGxvd1ByZWZpeDogZmFsc2UsXG5cdGFsbG93VHJhaWxpbmc6IGZhbHNlLFxuXHRhbGxvd0ltcHJlY2lzZTogZmFsc2UsXG5cdHRyaW1XaGl0ZXNwYWNlOiBmYWxzZSxcblx0bGVhZGluZ1plcm9Jc09jdGFsOiBmYWxzZVxufTtcblxudmFyIENQXzAgPSAweDMwO1xudmFyIENQXzkgPSAweDM5O1xuXG52YXIgQ1BfQSA9IDB4NDE7XG52YXIgQ1BfQiA9IDB4NDI7XG52YXIgQ1BfTyA9IDB4NGY7XG52YXIgQ1BfVCA9IDB4NTQ7XG52YXIgQ1BfWCA9IDB4NTg7XG52YXIgQ1BfWiA9IDB4NWE7XG5cbnZhciBDUF9hID0gMHg2MTtcbnZhciBDUF9iID0gMHg2MjtcbnZhciBDUF9vID0gMHg2ZjtcbnZhciBDUF90ID0gMHg3NDtcbnZhciBDUF94ID0gMHg3ODtcbnZhciBDUF96ID0gMHg3YTtcblxudmFyIFBJX0NPTlZfREVDID0gMHgzMDtcbnZhciBQSV9DT05WX1VDID0gMHgzNztcbnZhciBQSV9DT05WX0xDID0gMHg1NztcblxuXG4vKlxuICogQSBzdHJpY3RlciB2ZXJzaW9uIG9mIHBhcnNlSW50KCkgdGhhdCBwcm92aWRlcyBvcHRpb25zIGZvciBjaGFuZ2luZyB3aGF0XG4gKiBpcyBhbiBhY2NlcHRhYmxlIHN0cmluZyAoZm9yIGV4YW1wbGUsIGRpc2FsbG93aW5nIHRyYWlsaW5nIGNoYXJhY3RlcnMpLlxuICovXG5mdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyLCB1b3B0cylcbntcblx0bW9kX2Fzc2VydC5zdHJpbmcoc3RyLCAnc3RyJyk7XG5cdG1vZF9hc3NlcnQub3B0aW9uYWxPYmplY3QodW9wdHMsICdvcHRpb25zJyk7XG5cblx0dmFyIGJhc2VPdmVycmlkZSA9IGZhbHNlO1xuXHR2YXIgb3B0aW9ucyA9IFBJX0RFRkFVTFRTO1xuXG5cdGlmICh1b3B0cykge1xuXHRcdGJhc2VPdmVycmlkZSA9IGhhc0tleSh1b3B0cywgJ2Jhc2UnKTtcblx0XHRvcHRpb25zID0gbWVyZ2VPYmplY3RzKG9wdGlvbnMsIHVvcHRzKTtcblx0XHRtb2RfYXNzZXJ0Lm51bWJlcihvcHRpb25zLmJhc2UsICdvcHRpb25zLmJhc2UnKTtcblx0XHRtb2RfYXNzZXJ0Lm9rKG9wdGlvbnMuYmFzZSA+PSAyLCAnb3B0aW9ucy5iYXNlID49IDInKTtcblx0XHRtb2RfYXNzZXJ0Lm9rKG9wdGlvbnMuYmFzZSA8PSAzNiwgJ29wdGlvbnMuYmFzZSA8PSAzNicpO1xuXHRcdG1vZF9hc3NlcnQuYm9vbChvcHRpb25zLmFsbG93U2lnbiwgJ29wdGlvbnMuYWxsb3dTaWduJyk7XG5cdFx0bW9kX2Fzc2VydC5ib29sKG9wdGlvbnMuYWxsb3dQcmVmaXgsICdvcHRpb25zLmFsbG93UHJlZml4Jyk7XG5cdFx0bW9kX2Fzc2VydC5ib29sKG9wdGlvbnMuYWxsb3dUcmFpbGluZyxcblx0XHQgICAgJ29wdGlvbnMuYWxsb3dUcmFpbGluZycpO1xuXHRcdG1vZF9hc3NlcnQuYm9vbChvcHRpb25zLmFsbG93SW1wcmVjaXNlLFxuXHRcdCAgICAnb3B0aW9ucy5hbGxvd0ltcHJlY2lzZScpO1xuXHRcdG1vZF9hc3NlcnQuYm9vbChvcHRpb25zLnRyaW1XaGl0ZXNwYWNlLFxuXHRcdCAgICAnb3B0aW9ucy50cmltV2hpdGVzcGFjZScpO1xuXHRcdG1vZF9hc3NlcnQuYm9vbChvcHRpb25zLmxlYWRpbmdaZXJvSXNPY3RhbCxcblx0XHQgICAgJ29wdGlvbnMubGVhZGluZ1plcm9Jc09jdGFsJyk7XG5cblx0XHRpZiAob3B0aW9ucy5sZWFkaW5nWmVyb0lzT2N0YWwpIHtcblx0XHRcdG1vZF9hc3NlcnQub2soIWJhc2VPdmVycmlkZSxcblx0XHRcdCAgICAnXCJiYXNlXCIgYW5kIFwibGVhZGluZ1plcm9Jc09jdGFsXCIgYXJlICcgK1xuXHRcdFx0ICAgICdtdXR1YWxseSBleGNsdXNpdmUnKTtcblx0XHR9XG5cdH1cblxuXHR2YXIgYztcblx0dmFyIHBiYXNlID0gLTE7XG5cdHZhciBiYXNlID0gb3B0aW9ucy5iYXNlO1xuXHR2YXIgc3RhcnQ7XG5cdHZhciBtdWx0ID0gMTtcblx0dmFyIHZhbHVlID0gMDtcblx0dmFyIGlkeCA9IDA7XG5cdHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuXG5cdC8qIFRyaW0gYW55IHdoaXRlc3BhY2Ugb24gdGhlIGxlZnQgc2lkZS4gKi9cblx0aWYgKG9wdGlvbnMudHJpbVdoaXRlc3BhY2UpIHtcblx0XHR3aGlsZSAoaWR4IDwgbGVuICYmIGlzU3BhY2Uoc3RyLmNoYXJDb2RlQXQoaWR4KSkpIHtcblx0XHRcdCsraWR4O1xuXHRcdH1cblx0fVxuXG5cdC8qIENoZWNrIHRoZSBudW1iZXIgZm9yIGEgbGVhZGluZyBzaWduLiAqL1xuXHRpZiAob3B0aW9ucy5hbGxvd1NpZ24pIHtcblx0XHRpZiAoc3RyW2lkeF0gPT09ICctJykge1xuXHRcdFx0aWR4ICs9IDE7XG5cdFx0XHRtdWx0ID0gLTE7XG5cdFx0fSBlbHNlIGlmIChzdHJbaWR4XSA9PT0gJysnKSB7XG5cdFx0XHRpZHggKz0gMTtcblx0XHR9XG5cdH1cblxuXHQvKiBQYXJzZSB0aGUgYmFzZS1pbmRpY2F0aW5nIHByZWZpeCBpZiB0aGVyZSBpcyBvbmUuICovXG5cdGlmIChzdHJbaWR4XSA9PT0gJzAnKSB7XG5cdFx0aWYgKG9wdGlvbnMuYWxsb3dQcmVmaXgpIHtcblx0XHRcdHBiYXNlID0gcHJlZml4VG9CYXNlKHN0ci5jaGFyQ29kZUF0KGlkeCArIDEpKTtcblx0XHRcdGlmIChwYmFzZSAhPT0gLTEgJiYgKCFiYXNlT3ZlcnJpZGUgfHwgcGJhc2UgPT09IGJhc2UpKSB7XG5cdFx0XHRcdGJhc2UgPSBwYmFzZTtcblx0XHRcdFx0aWR4ICs9IDI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHBiYXNlID09PSAtMSAmJiBvcHRpb25zLmxlYWRpbmdaZXJvSXNPY3RhbCkge1xuXHRcdFx0YmFzZSA9IDg7XG5cdFx0fVxuXHR9XG5cblx0LyogUGFyc2UgdGhlIGFjdHVhbCBkaWdpdHMuICovXG5cdGZvciAoc3RhcnQgPSBpZHg7IGlkeCA8IGxlbjsgKytpZHgpIHtcblx0XHRjID0gdHJhbnNsYXRlRGlnaXQoc3RyLmNoYXJDb2RlQXQoaWR4KSk7XG5cdFx0aWYgKGMgIT09IC0xICYmIGMgPCBiYXNlKSB7XG5cdFx0XHR2YWx1ZSAqPSBiYXNlO1xuXHRcdFx0dmFsdWUgKz0gYztcblx0XHR9IGVsc2Uge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0LyogSWYgd2UgZGlkbid0IHBhcnNlIGFueSBkaWdpdHMsIHdlIGhhdmUgYW4gaW52YWxpZCBudW1iZXIuICovXG5cdGlmIChzdGFydCA9PT0gaWR4KSB7XG5cdFx0cmV0dXJuIChuZXcgRXJyb3IoJ2ludmFsaWQgbnVtYmVyOiAnICsgSlNPTi5zdHJpbmdpZnkoc3RyKSkpO1xuXHR9XG5cblx0LyogVHJpbSBhbnkgd2hpdGVzcGFjZSBvbiB0aGUgcmlnaHQgc2lkZS4gKi9cblx0aWYgKG9wdGlvbnMudHJpbVdoaXRlc3BhY2UpIHtcblx0XHR3aGlsZSAoaWR4IDwgbGVuICYmIGlzU3BhY2Uoc3RyLmNoYXJDb2RlQXQoaWR4KSkpIHtcblx0XHRcdCsraWR4O1xuXHRcdH1cblx0fVxuXG5cdC8qIENoZWNrIGZvciB0cmFpbGluZyBjaGFyYWN0ZXJzLiAqL1xuXHRpZiAoaWR4IDwgbGVuICYmICFvcHRpb25zLmFsbG93VHJhaWxpbmcpIHtcblx0XHRyZXR1cm4gKG5ldyBFcnJvcigndHJhaWxpbmcgY2hhcmFjdGVycyBhZnRlciBudW1iZXI6ICcgK1xuXHRcdCAgICBKU09OLnN0cmluZ2lmeShzdHIuc2xpY2UoaWR4KSkpKTtcblx0fVxuXG5cdC8qIElmIG91ciB2YWx1ZSBpcyAwLCB3ZSByZXR1cm4gbm93LCB0byBhdm9pZCByZXR1cm5pbmcgLTAuICovXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAoMCk7XG5cdH1cblxuXHQvKiBDYWxjdWxhdGUgb3VyIGZpbmFsIHZhbHVlLiAqL1xuXHR2YXIgcmVzdWx0ID0gdmFsdWUgKiBtdWx0O1xuXG5cdC8qXG5cdCAqIElmIHRoZSBzdHJpbmcgcmVwcmVzZW50cyBhIHZhbHVlIHRoYXQgY2Fubm90IGJlIHByZWNpc2VseSByZXByZXNlbnRlZFxuXHQgKiBieSBKYXZhU2NyaXB0LCB0aGVuIHdlIHdhbnQgdG8gY2hlY2sgdGhhdDpcblx0ICpcblx0ICogLSBXZSBuZXZlciBpbmNyZWFzZWQgdGhlIHZhbHVlIHBhc3QgTUFYX1NBRkVfSU5URUdFUlxuXHQgKiAtIFdlIGRvbid0IG1ha2UgdGhlIHJlc3VsdCBuZWdhdGl2ZSBhbmQgYmVsb3cgTUlOX1NBRkVfSU5URUdFUlxuXHQgKlxuXHQgKiBCZWNhdXNlIHdlIG9ubHkgZXZlciBpbmNyZW1lbnQgdGhlIHZhbHVlIGR1cmluZyBwYXJzaW5nLCB0aGVyZSdzIG5vXG5cdCAqIGNoYW5jZSBvZiBtb3ZpbmcgcGFzdCBNQVhfU0FGRV9JTlRFR0VSIGFuZCB0aGVuIGRyb3BwaW5nIGJlbG93IGl0XG5cdCAqIGFnYWluLCBsb3NpbmcgcHJlY2lzaW9uIGluIHRoZSBwcm9jZXNzLiBUaGlzIG1lYW5zIHRoYXQgd2Ugb25seSBuZWVkXG5cdCAqIHRvIGRvIG91ciBjaGVja3MgaGVyZSwgYXQgdGhlIGVuZC5cblx0ICovXG5cdGlmICghb3B0aW9ucy5hbGxvd0ltcHJlY2lzZSAmJlxuXHQgICAgKHZhbHVlID4gTUFYX1NBRkVfSU5URUdFUiB8fCByZXN1bHQgPCBNSU5fU0FGRV9JTlRFR0VSKSkge1xuXHRcdHJldHVybiAobmV3IEVycm9yKCdudW1iZXIgaXMgb3V0c2lkZSBvZiB0aGUgc3VwcG9ydGVkIHJhbmdlOiAnICtcblx0XHQgICAgSlNPTi5zdHJpbmdpZnkoc3RyLnNsaWNlKHN0YXJ0LCBpZHgpKSkpO1xuXHR9XG5cblx0cmV0dXJuIChyZXN1bHQpO1xufVxuXG5cbi8qXG4gKiBJbnRlcnByZXQgYSBjaGFyYWN0ZXIgY29kZSBhcyBhIGJhc2UtMzYgZGlnaXQuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZURpZ2l0KGQpXG57XG5cdGlmIChkID49IENQXzAgJiYgZCA8PSBDUF85KSB7XG5cdFx0LyogJzAnIHRvICc5JyAtPiAwIHRvIDkgKi9cblx0XHRyZXR1cm4gKGQgLSBQSV9DT05WX0RFQyk7XG5cdH0gZWxzZSBpZiAoZCA+PSBDUF9BICYmIGQgPD0gQ1BfWikge1xuXHRcdC8qICdBJyAtICdaJyAtPiAxMCB0byAzNSAqL1xuXHRcdHJldHVybiAoZCAtIFBJX0NPTlZfVUMpO1xuXHR9IGVsc2UgaWYgKGQgPj0gQ1BfYSAmJiBkIDw9IENQX3opIHtcblx0XHQvKiAnYScgLSAneicgLT4gMTAgdG8gMzUgKi9cblx0XHRyZXR1cm4gKGQgLSBQSV9DT05WX0xDKTtcblx0fSBlbHNlIHtcblx0XHQvKiBJbnZhbGlkIGNoYXJhY3RlciBjb2RlICovXG5cdFx0cmV0dXJuICgtMSk7XG5cdH1cbn1cblxuXG4vKlxuICogVGVzdCBpZiBhIHZhbHVlIG1hdGNoZXMgdGhlIEVDTUFTY3JpcHQgZGVmaW5pdGlvbiBvZiB0cmltbWFibGUgd2hpdGVzcGFjZS5cbiAqL1xuZnVuY3Rpb24gaXNTcGFjZShjKVxue1xuXHRyZXR1cm4gKGMgPT09IDB4MjApIHx8XG5cdCAgICAoYyA+PSAweDAwMDkgJiYgYyA8PSAweDAwMGQpIHx8XG5cdCAgICAoYyA9PT0gMHgwMGEwKSB8fFxuXHQgICAgKGMgPT09IDB4MTY4MCkgfHxcblx0ICAgIChjID09PSAweDE4MGUpIHx8XG5cdCAgICAoYyA+PSAweDIwMDAgJiYgYyA8PSAweDIwMGEpIHx8XG5cdCAgICAoYyA9PT0gMHgyMDI4KSB8fFxuXHQgICAgKGMgPT09IDB4MjAyOSkgfHxcblx0ICAgIChjID09PSAweDIwMmYpIHx8XG5cdCAgICAoYyA9PT0gMHgyMDVmKSB8fFxuXHQgICAgKGMgPT09IDB4MzAwMCkgfHxcblx0ICAgIChjID09PSAweGZlZmYpO1xufVxuXG5cbi8qXG4gKiBEZXRlcm1pbmUgd2hpY2ggYmFzZSBhIGNoYXJhY3RlciBpbmRpY2F0ZXMgKGUuZy4sICd4JyBpbmRpY2F0ZXMgaGV4KS5cbiAqL1xuZnVuY3Rpb24gcHJlZml4VG9CYXNlKGMpXG57XG5cdGlmIChjID09PSBDUF9iIHx8IGMgPT09IENQX0IpIHtcblx0XHQvKiAwYi8wQiAoYmluYXJ5KSAqL1xuXHRcdHJldHVybiAoMik7XG5cdH0gZWxzZSBpZiAoYyA9PT0gQ1BfbyB8fCBjID09PSBDUF9PKSB7XG5cdFx0LyogMG8vME8gKG9jdGFsKSAqL1xuXHRcdHJldHVybiAoOCk7XG5cdH0gZWxzZSBpZiAoYyA9PT0gQ1BfdCB8fCBjID09PSBDUF9UKSB7XG5cdFx0LyogMHQvMFQgKGRlY2ltYWwpICovXG5cdFx0cmV0dXJuICgxMCk7XG5cdH0gZWxzZSBpZiAoYyA9PT0gQ1BfeCB8fCBjID09PSBDUF9YKSB7XG5cdFx0LyogMHgvMFggKGhleGFkZWNpbWFsKSAqL1xuXHRcdHJldHVybiAoMTYpO1xuXHR9IGVsc2Uge1xuXHRcdC8qIE5vdCBhIG1lYW5pbmdmdWwgY2hhcmFjdGVyICovXG5cdFx0cmV0dXJuICgtMSk7XG5cdH1cbn1cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpzb25PYmplY3RKUyhzY2hlbWEsIGlucHV0KVxue1xuXHR2YXIgcmVwb3J0ID0gbW9kX2pzb25zY2hlbWEudmFsaWRhdGUoaW5wdXQsIHNjaGVtYSk7XG5cblx0aWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKVxuXHRcdHJldHVybiAobnVsbCk7XG5cblx0LyogQ3VycmVudGx5LCB3ZSBvbmx5IGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoIHRoZSBmaXJzdCBlcnJvci4gKi9cblx0dmFyIGVycm9yID0gcmVwb3J0LmVycm9yc1swXTtcblxuXHQvKiBUaGUgZmFpbGVkIHByb3BlcnR5IGlzIGdpdmVuIGJ5IGEgVVJJIHdpdGggYW4gaXJyZWxldmFudCBwcmVmaXguICovXG5cdHZhciBwcm9wbmFtZSA9IGVycm9yWydwcm9wZXJ0eSddO1xuXHR2YXIgcmVhc29uID0gZXJyb3JbJ21lc3NhZ2UnXS50b0xvd2VyQ2FzZSgpO1xuXHR2YXIgaSwgajtcblxuXHQvKlxuXHQgKiBUaGVyZSdzIGF0IGxlYXN0IG9uZSBjYXNlIHdoZXJlIHRoZSBwcm9wZXJ0eSBlcnJvciBtZXNzYWdlIGlzXG5cdCAqIGNvbmZ1c2luZyBhdCBiZXN0LiAgV2Ugd29yayBhcm91bmQgdGhpcyBoZXJlLlxuXHQgKi9cblx0aWYgKChpID0gcmVhc29uLmluZGV4T2YoJ3RoZSBwcm9wZXJ0eSAnKSkgIT0gLTEgJiZcblx0ICAgIChqID0gcmVhc29uLmluZGV4T2YoJyBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc2NoZW1hIGFuZCB0aGUgJyArXG5cdCAgICAnc2NoZW1hIGRvZXMgbm90IGFsbG93IGFkZGl0aW9uYWwgcHJvcGVydGllcycpKSAhPSAtMSkge1xuXHRcdGkgKz0gJ3RoZSBwcm9wZXJ0eSAnLmxlbmd0aDtcblx0XHRpZiAocHJvcG5hbWUgPT09ICcnKVxuXHRcdFx0cHJvcG5hbWUgPSByZWFzb24uc3Vic3RyKGksIGogLSBpKTtcblx0XHRlbHNlXG5cdFx0XHRwcm9wbmFtZSA9IHByb3BuYW1lICsgJy4nICsgcmVhc29uLnN1YnN0cihpLCBqIC0gaSk7XG5cblx0XHRyZWFzb24gPSAndW5zdXBwb3J0ZWQgcHJvcGVydHknO1xuXHR9XG5cblx0dmFyIHJ2ID0gbmV3IG1vZF92ZXJyb3IuVkVycm9yKCdwcm9wZXJ0eSBcIiVzXCI6ICVzJywgcHJvcG5hbWUsIHJlYXNvbik7XG5cdHJ2Lmpzdl9kZXRhaWxzID0gZXJyb3I7XG5cdHJldHVybiAocnYpO1xufVxuXG5mdW5jdGlvbiByYW5kRWx0KGFycilcbntcblx0bW9kX2Fzc2VydC5vayhBcnJheS5pc0FycmF5KGFycikgJiYgYXJyLmxlbmd0aCA+IDAsXG5cdCAgICAncmFuZEVsdCBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5Jyk7XG5cblx0cmV0dXJuIChhcnJbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCldKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SHJ0aW1lKGEpXG57XG5cdG1vZF9hc3NlcnQub2soYVswXSA+PSAwICYmIGFbMV0gPj0gMCxcblx0ICAgICduZWdhdGl2ZSBudW1iZXJzIG5vdCBhbGxvd2VkIGluIGhydGltZXMnKTtcblx0bW9kX2Fzc2VydC5vayhhWzFdIDwgMWU5LCAnbmFub3NlY29uZHMgY29sdW1uIG92ZXJmbG93Jyk7XG59XG5cbi8qXG4gKiBDb21wdXRlIHRoZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBocnRpbWUgcmVhZGluZ3MgQSBhbmQgQiwgd2hlcmUgQSBpcyBsYXRlclxuICogdGhhbiBCLiAgaHJ0aW1lIHJlYWRpbmdzIGNvbWUgZnJvbSBOb2RlJ3MgcHJvY2Vzcy5ocnRpbWUoKS4gIFRoZXJlIGlzIG5vXG4gKiBkZWZpbmVkIHdheSB0byByZXByZXNlbnQgbmVnYXRpdmUgZGVsdGFzLCBzbyBpdCdzIGlsbGVnYWwgdG8gZGlmZiBCIGZyb20gQVxuICogd2hlcmUgdGhlIHRpbWUgZGVub3RlZCBieSBCIGlzIGxhdGVyIHRoYW4gdGhlIHRpbWUgZGVub3RlZCBieSBBLiAgSWYgdGhpc1xuICogYmVjb21lcyB2YWx1YWJsZSwgd2UgY2FuIGRlZmluZSBhIHJlcHJlc2VudGF0aW9uIGFuZCBleHRlbmQgdGhlXG4gKiBpbXBsZW1lbnRhdGlvbiB0byBzdXBwb3J0IGl0LlxuICovXG5mdW5jdGlvbiBocnRpbWVEaWZmKGEsIGIpXG57XG5cdGFzc2VydEhydGltZShhKTtcblx0YXNzZXJ0SHJ0aW1lKGIpO1xuXHRtb2RfYXNzZXJ0Lm9rKGFbMF0gPiBiWzBdIHx8IChhWzBdID09IGJbMF0gJiYgYVsxXSA+PSBiWzFdKSxcblx0ICAgICduZWdhdGl2ZSBkaWZmZXJlbmNlcyBub3QgYWxsb3dlZCcpO1xuXG5cdHZhciBydiA9IFsgYVswXSAtIGJbMF0sIDAgXTtcblxuXHRpZiAoYVsxXSA+PSBiWzFdKSB7XG5cdFx0cnZbMV0gPSBhWzFdIC0gYlsxXTtcblx0fSBlbHNlIHtcblx0XHRydlswXS0tO1xuXHRcdHJ2WzFdID0gMWU5IC0gKGJbMV0gLSBhWzFdKTtcblx0fVxuXG5cdHJldHVybiAocnYpO1xufVxuXG4vKlxuICogQ29udmVydCBhIGhydGltZSByZWFkaW5nIGZyb20gdGhlIGFycmF5IGZvcm1hdCByZXR1cm5lZCBieSBOb2RlJ3NcbiAqIHByb2Nlc3MuaHJ0aW1lKCkgaW50byBhIHNjYWxhciBudW1iZXIgb2YgbmFub3NlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIGhydGltZU5hbm9zZWMoYSlcbntcblx0YXNzZXJ0SHJ0aW1lKGEpO1xuXG5cdHJldHVybiAoTWF0aC5mbG9vcihhWzBdICogMWU5ICsgYVsxXSkpO1xufVxuXG4vKlxuICogQ29udmVydCBhIGhydGltZSByZWFkaW5nIGZyb20gdGhlIGFycmF5IGZvcm1hdCByZXR1cm5lZCBieSBOb2RlJ3NcbiAqIHByb2Nlc3MuaHJ0aW1lKCkgaW50byBhIHNjYWxhciBudW1iZXIgb2YgbWljcm9zZWNvbmRzLlxuICovXG5mdW5jdGlvbiBocnRpbWVNaWNyb3NlYyhhKVxue1xuXHRhc3NlcnRIcnRpbWUoYSk7XG5cblx0cmV0dXJuIChNYXRoLmZsb29yKGFbMF0gKiAxZTYgKyBhWzFdIC8gMWUzKSk7XG59XG5cbi8qXG4gKiBDb252ZXJ0IGEgaHJ0aW1lIHJlYWRpbmcgZnJvbSB0aGUgYXJyYXkgZm9ybWF0IHJldHVybmVkIGJ5IE5vZGUnc1xuICogcHJvY2Vzcy5ocnRpbWUoKSBpbnRvIGEgc2NhbGFyIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIGhydGltZU1pbGxpc2VjKGEpXG57XG5cdGFzc2VydEhydGltZShhKTtcblxuXHRyZXR1cm4gKE1hdGguZmxvb3IoYVswXSAqIDFlMyArIGFbMV0gLyAxZTYpKTtcbn1cblxuLypcbiAqIEFkZCB0d28gaHJ0aW1lIHJlYWRpbmdzIEEgYW5kIEIsIG92ZXJ3cml0aW5nIEEgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZVxuICogYWRkaXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgYWNjdW11bGF0aW5nIHNldmVyYWwgaHJ0aW1lIGludGVydmFsc1xuICogaW50byBhIGNvdW50ZXIuICBSZXR1cm5zIEEuXG4gKi9cbmZ1bmN0aW9uIGhydGltZUFjY3VtKGEsIGIpXG57XG5cdGFzc2VydEhydGltZShhKTtcblx0YXNzZXJ0SHJ0aW1lKGIpO1xuXG5cdC8qXG5cdCAqIEFjY3VtdWxhdGUgdGhlIG5hbm9zZWNvbmQgY29tcG9uZW50LlxuXHQgKi9cblx0YVsxXSArPSBiWzFdO1xuXHRpZiAoYVsxXSA+PSAxZTkpIHtcblx0XHQvKlxuXHRcdCAqIFRoZSBuYW5vc2Vjb25kIGNvbXBvbmVudCBvdmVyZmxvd2VkLCBzbyBjYXJyeSB0byB0aGUgc2Vjb25kc1xuXHRcdCAqIGZpZWxkLlxuXHRcdCAqL1xuXHRcdGFbMF0rKztcblx0XHRhWzFdIC09IDFlOTtcblx0fVxuXG5cdC8qXG5cdCAqIEFjY3VtdWxhdGUgdGhlIHNlY29uZHMgY29tcG9uZW50LlxuXHQgKi9cblx0YVswXSArPSBiWzBdO1xuXG5cdHJldHVybiAoYSk7XG59XG5cbi8qXG4gKiBBZGQgdHdvIGhydGltZSByZWFkaW5ncyBBIGFuZCBCLCByZXR1cm5pbmcgdGhlIHJlc3VsdCBhcyBhIG5ldyBocnRpbWUgYXJyYXkuXG4gKiBEb2VzIG5vdCBtb2RpZnkgZWl0aGVyIGlucHV0IGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiBocnRpbWVBZGQoYSwgYilcbntcblx0YXNzZXJ0SHJ0aW1lKGEpO1xuXG5cdHZhciBydiA9IFsgYVswXSwgYVsxXSBdO1xuXG5cdHJldHVybiAoaHJ0aW1lQWNjdW0ocnYsIGIpKTtcbn1cblxuXG4vKlxuICogQ2hlY2sgYW4gb2JqZWN0IGZvciB1bmV4cGVjdGVkIHByb3BlcnRpZXMuICBBY2NlcHRzIHRoZSBvYmplY3QgdG8gY2hlY2ssIGFuZFxuICogYW4gYXJyYXkgb2YgYWxsb3dlZCBwcm9wZXJ0eSBuYW1lcyAoc3RyaW5ncykuICBSZXR1cm5zIGFuIGFycmF5IG9mIGtleSBuYW1lc1xuICogdGhhdCB3ZXJlIGZvdW5kIG9uIHRoZSBvYmplY3QsIGJ1dCBkaWQgbm90IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkXG4gKiBwcm9wZXJ0aWVzLiAgSWYgbm8gcHJvcGVydGllcyB3ZXJlIGZvdW5kLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBiZSBvZlxuICogemVybyBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGV4dHJhUHJvcGVydGllcyhvYmosIGFsbG93ZWQpXG57XG5cdG1vZF9hc3NlcnQub2sodHlwZW9mIChvYmopID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwsXG5cdCAgICAnb2JqIGFyZ3VtZW50IG11c3QgYmUgYSBub24tbnVsbCBvYmplY3QnKTtcblx0bW9kX2Fzc2VydC5vayhBcnJheS5pc0FycmF5KGFsbG93ZWQpLFxuXHQgICAgJ2FsbG93ZWQgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYWxsb3dlZC5sZW5ndGg7IGkrKykge1xuXHRcdG1vZF9hc3NlcnQub2sodHlwZW9mIChhbGxvd2VkW2ldKSA9PT0gJ3N0cmluZycsXG5cdFx0ICAgICdhbGxvd2VkIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuXHR9XG5cblx0cmV0dXJuIChPYmplY3Qua2V5cyhvYmopLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG5cdFx0cmV0dXJuIChhbGxvd2VkLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuXHR9KSk7XG59XG5cbi8qXG4gKiBHaXZlbiB0aHJlZSBzZXRzIG9mIHByb3BlcnRpZXMgXCJwcm92aWRlZFwiIChtYXkgYmUgdW5kZWZpbmVkKSwgXCJvdmVycmlkZXNcIlxuICogKHJlcXVpcmVkKSwgYW5kIFwiZGVmYXVsdHNcIiAobWF5IGJlIHVuZGVmaW5lZCksIGNvbnN0cnVjdCBhbiBvYmplY3QgY29udGFpbmluZ1xuICogdGhlIHVuaW9uIG9mIHRoZXNlIHNldHMgd2l0aCBcIm92ZXJyaWRlc1wiIG92ZXJyaWRpbmcgXCJwcm92aWRlZFwiLCBhbmRcbiAqIFwicHJvdmlkZWRcIiBvdmVycmlkaW5nIFwiZGVmYXVsdHNcIi4gIE5vbmUgb2YgdGhlIGlucHV0IG9iamVjdHMgYXJlIG1vZGlmaWVkLlxuICovXG5mdW5jdGlvbiBtZXJnZU9iamVjdHMocHJvdmlkZWQsIG92ZXJyaWRlcywgZGVmYXVsdHMpXG57XG5cdHZhciBydiwgaztcblxuXHRydiA9IHt9O1xuXHRpZiAoZGVmYXVsdHMpIHtcblx0XHRmb3IgKGsgaW4gZGVmYXVsdHMpXG5cdFx0XHRydltrXSA9IGRlZmF1bHRzW2tdO1xuXHR9XG5cblx0aWYgKHByb3ZpZGVkKSB7XG5cdFx0Zm9yIChrIGluIHByb3ZpZGVkKVxuXHRcdFx0cnZba10gPSBwcm92aWRlZFtrXTtcblx0fVxuXG5cdGlmIChvdmVycmlkZXMpIHtcblx0XHRmb3IgKGsgaW4gb3ZlcnJpZGVzKVxuXHRcdFx0cnZba10gPSBvdmVycmlkZXNba107XG5cdH1cblxuXHRyZXR1cm4gKHJ2KTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxMiBKb3llbnQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBzc2hwayA9IHJlcXVpcmUoJ3NzaHBrJyk7XG52YXIganNwcmltID0gcmVxdWlyZSgnanNwcmltJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBzcHJpbnRmID0gcmVxdWlyZSgndXRpbCcpLmZvcm1hdDtcblxudmFyIEhBU0hfQUxHT1MgPSB1dGlscy5IQVNIX0FMR09TO1xudmFyIFBLX0FMR09TID0gdXRpbHMuUEtfQUxHT1M7XG52YXIgSW52YWxpZEFsZ29yaXRobUVycm9yID0gdXRpbHMuSW52YWxpZEFsZ29yaXRobUVycm9yO1xudmFyIEh0dHBTaWduYXR1cmVFcnJvciA9IHV0aWxzLkh0dHBTaWduYXR1cmVFcnJvcjtcbnZhciB2YWxpZGF0ZUFsZ29yaXRobSA9IHV0aWxzLnZhbGlkYXRlQWxnb3JpdGhtO1xuXG4vLy8tLS0gR2xvYmFsc1xuXG52YXIgQVVUSFpfRk1UID1cbiAgJ1NpZ25hdHVyZSBrZXlJZD1cIiVzXCIsYWxnb3JpdGhtPVwiJXNcIixoZWFkZXJzPVwiJXNcIixzaWduYXR1cmU9XCIlc1wiJztcblxuLy8vLS0tIFNwZWNpZmljIEVycm9yc1xuXG5mdW5jdGlvbiBNaXNzaW5nSGVhZGVyRXJyb3IobWVzc2FnZSkge1xuICBIdHRwU2lnbmF0dXJlRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlLCBNaXNzaW5nSGVhZGVyRXJyb3IpO1xufVxudXRpbC5pbmhlcml0cyhNaXNzaW5nSGVhZGVyRXJyb3IsIEh0dHBTaWduYXR1cmVFcnJvcik7XG5cbmZ1bmN0aW9uIFN0cmljdFBhcnNpbmdFcnJvcihtZXNzYWdlKSB7XG4gIEh0dHBTaWduYXR1cmVFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UsIFN0cmljdFBhcnNpbmdFcnJvcik7XG59XG51dGlsLmluaGVyaXRzKFN0cmljdFBhcnNpbmdFcnJvciwgSHR0cFNpZ25hdHVyZUVycm9yKTtcblxuLyogU2VlIGNyZWF0ZVNpZ25lcigpICovXG5mdW5jdGlvbiBSZXF1ZXN0U2lnbmVyKG9wdGlvbnMpIHtcbiAgYXNzZXJ0Lm9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpO1xuXG4gIHZhciBhbGcgPSBbXTtcbiAgaWYgKG9wdGlvbnMuYWxnb3JpdGhtICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuc3RyaW5nKG9wdGlvbnMuYWxnb3JpdGhtLCAnb3B0aW9ucy5hbGdvcml0aG0nKTtcbiAgICBhbGcgPSB2YWxpZGF0ZUFsZ29yaXRobShvcHRpb25zLmFsZ29yaXRobSk7XG4gIH1cbiAgdGhpcy5yc19hbGcgPSBhbGc7XG5cbiAgLypcbiAgICogUmVxdWVzdFNpZ25lcnMgY29tZSBpbiB0d28gdmFyaWV0aWVzOiBvbmVzIHdpdGggYW4gcnNfc2lnbkZ1bmMsIGFuZCBvbmVzXG4gICAqIHdpdGggYW4gcnNfc2lnbmVyLlxuICAgKlxuICAgKiByc19zaWduRnVuYy1iYXNlZCBSZXF1ZXN0U2lnbmVycyBoYXZlIHRvIGJ1aWxkIHVwIHRoZWlyIGVudGlyZSBzaWduaW5nXG4gICAqIHN0cmluZyB3aXRoaW4gdGhlIHJzX2xpbmVzIGFycmF5IGFuZCBnaXZlIGl0IHRvIHJzX3NpZ25GdW5jIGFzIGEgc2luZ2xlXG4gICAqIGNvbmNhdCdkIGJsb2IuIHJzX3NpZ25lci1iYXNlZCBSZXF1ZXN0U2lnbmVycyBjYW4gYWRkIGEgbGluZSBhdCBhIHRpbWUgdG9cbiAgICogdGhlaXIgc2lnbmluZyBzdGF0ZSBieSB1c2luZyByc19zaWduZXIudXBkYXRlKCksIHRodXMgb25seSBuZWVkaW5nIHRvXG4gICAqIGJ1ZmZlciB0aGUgaGFzaCBmdW5jdGlvbiBzdGF0ZSBhbmQgb25lIGxpbmUgYXQgYSB0aW1lLlxuICAgKi9cbiAgaWYgKG9wdGlvbnMuc2lnbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZ1bmMob3B0aW9ucy5zaWduLCAnb3B0aW9ucy5zaWduJyk7XG4gICAgdGhpcy5yc19zaWduRnVuYyA9IG9wdGlvbnMuc2lnbjtcblxuICB9IGVsc2UgaWYgKGFsZ1swXSA9PT0gJ2htYWMnICYmIG9wdGlvbnMua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuc3RyaW5nKG9wdGlvbnMua2V5SWQsICdvcHRpb25zLmtleUlkJyk7XG4gICAgdGhpcy5yc19rZXlJZCA9IG9wdGlvbnMua2V5SWQ7XG5cbiAgICBpZiAodHlwZW9mIChvcHRpb25zLmtleSkgIT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNCdWZmZXIob3B0aW9ucy5rZXkpKVxuICAgICAgdGhyb3cgKG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMua2V5IGZvciBITUFDIG11c3QgYmUgYSBzdHJpbmcgb3IgQnVmZmVyJykpO1xuXG4gICAgLypcbiAgICAgKiBNYWtlIGFuIHJzX3NpZ25lciBmb3IgSE1BQ3MsIG5vdCBhIHJzX3NpZ25GdW5jIC0tIEhNQUNzIGRpZ2VzdCB0aGVpclxuICAgICAqIGRhdGEgaW4gY2h1bmtzIHJhdGhlciB0aGFuIHJlcXVpcmluZyBpdCBhbGwgdG8gYmUgZ2l2ZW4gaW4gb25lIGdvXG4gICAgICogYXQgdGhlIGVuZCwgc28gdGhleSBhcmUgbW9yZSBzaW1pbGFyIHRvIHNpZ25lcnMgdGhhbiBzaWduRnVuY3MuXG4gICAgICovXG4gICAgdGhpcy5yc19zaWduZXIgPSBjcnlwdG8uY3JlYXRlSG1hYyhhbGdbMV0udG9VcHBlckNhc2UoKSwgb3B0aW9ucy5rZXkpO1xuICAgIHRoaXMucnNfc2lnbmVyLnNpZ24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZGlnZXN0ID0gdGhpcy5kaWdlc3QoJ2Jhc2U2NCcpO1xuICAgICAgcmV0dXJuICh7XG4gICAgICAgIGhhc2hBbGdvcml0aG06IGFsZ1sxXSxcbiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChkaWdlc3QpOyB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gIH0gZWxzZSBpZiAob3B0aW9ucy5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBpZiAodHlwZW9mIChrZXkpID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIoa2V5KSlcbiAgICAgIGtleSA9IHNzaHBrLnBhcnNlUHJpdmF0ZUtleShrZXkpO1xuXG4gICAgYXNzZXJ0Lm9rKHNzaHBrLlByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSwgWzEsIDJdKSxcbiAgICAgICdvcHRpb25zLmtleSBtdXN0IGJlIGEgc3NocGsuUHJpdmF0ZUtleScpO1xuICAgIHRoaXMucnNfa2V5ID0ga2V5O1xuXG4gICAgYXNzZXJ0LnN0cmluZyhvcHRpb25zLmtleUlkLCAnb3B0aW9ucy5rZXlJZCcpO1xuICAgIHRoaXMucnNfa2V5SWQgPSBvcHRpb25zLmtleUlkO1xuXG4gICAgaWYgKCFQS19BTEdPU1trZXkudHlwZV0pIHtcbiAgICAgIHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKGtleS50eXBlLnRvVXBwZXJDYXNlKCkgKyAnIHR5cGUgJyArXG4gICAgICAgICdrZXlzIGFyZSBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChhbGdbMF0gIT09IHVuZGVmaW5lZCAmJiBrZXkudHlwZSAhPT0gYWxnWzBdKSB7XG4gICAgICB0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcignb3B0aW9ucy5rZXkgbXVzdCBiZSBhICcgK1xuICAgICAgICBhbGdbMF0udG9VcHBlckNhc2UoKSArICcga2V5LCB3YXMgZ2l2ZW4gYSAnICtcbiAgICAgICAga2V5LnR5cGUudG9VcHBlckNhc2UoKSArICcga2V5IGluc3RlYWQnKSk7XG4gICAgfVxuXG4gICAgdGhpcy5yc19zaWduZXIgPSBrZXkuY3JlYXRlU2lnbihhbGdbMV0pO1xuXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgKG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMuc2lnbiAoZnVuYykgb3Igb3B0aW9ucy5rZXkgaXMgcmVxdWlyZWQnKSk7XG4gIH1cblxuICB0aGlzLnJzX2hlYWRlcnMgPSBbXTtcbiAgdGhpcy5yc19saW5lcyA9IFtdO1xufVxuXG4vKipcbiAqIEFkZHMgYSBoZWFkZXIgdG8gYmUgc2lnbmVkLCB3aXRoIGl0cyB2YWx1ZSwgaW50byB0aGlzIHNpZ25lci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge1N0cmluZ30gdmFsdWUgd3JpdHRlblxuICovXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS53cml0ZUhlYWRlciA9IGZ1bmN0aW9uIChoZWFkZXIsIHZhbHVlKSB7XG4gIGFzc2VydC5zdHJpbmcoaGVhZGVyLCAnaGVhZGVyJyk7XG4gIGhlYWRlciA9IGhlYWRlci50b0xvd2VyQ2FzZSgpO1xuICBhc3NlcnQuc3RyaW5nKHZhbHVlLCAndmFsdWUnKTtcblxuICB0aGlzLnJzX2hlYWRlcnMucHVzaChoZWFkZXIpO1xuXG4gIGlmICh0aGlzLnJzX3NpZ25GdW5jKSB7XG4gICAgdGhpcy5yc19saW5lcy5wdXNoKGhlYWRlciArICc6ICcgKyB2YWx1ZSk7XG5cbiAgfSBlbHNlIHtcbiAgICB2YXIgbGluZSA9IGhlYWRlciArICc6ICcgKyB2YWx1ZTtcbiAgICBpZiAodGhpcy5yc19oZWFkZXJzLmxlbmd0aCA+IDApXG4gICAgICBsaW5lID0gJ1xcbicgKyBsaW5lO1xuICAgIHRoaXMucnNfc2lnbmVyLnVwZGF0ZShsaW5lKTtcbiAgfVxuXG4gIHJldHVybiAodmFsdWUpO1xufTtcblxuLyoqXG4gKiBBZGRzIGEgZGVmYXVsdCBEYXRlIGhlYWRlciwgcmV0dXJuaW5nIGl0cyB2YWx1ZS5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblJlcXVlc3RTaWduZXIucHJvdG90eXBlLndyaXRlRGF0ZUhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLndyaXRlSGVhZGVyKCdkYXRlJywganNwcmltLnJmYzExMjMobmV3IERhdGUoKSkpKTtcbn07XG5cbi8qKlxuICogQWRkcyB0aGUgcmVxdWVzdCB0YXJnZXQgbGluZSB0byBiZSBzaWduZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCwgSFRUUCBtZXRob2QgKGUuZy4gJ2dldCcsICdwb3N0JywgJ3B1dCcpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICovXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS53cml0ZVRhcmdldCA9IGZ1bmN0aW9uIChtZXRob2QsIHBhdGgpIHtcbiAgYXNzZXJ0LnN0cmluZyhtZXRob2QsICdtZXRob2QnKTtcbiAgYXNzZXJ0LnN0cmluZyhwYXRoLCAncGF0aCcpO1xuICBtZXRob2QgPSBtZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgdGhpcy53cml0ZUhlYWRlcignKHJlcXVlc3QtdGFyZ2V0KScsIG1ldGhvZCArICcgJyArIHBhdGgpO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHZhbHVlIGZvciB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgb24gdGhpcyByZXF1ZXN0XG4gKiBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN9IGNhbGxiYWNrIChlcnIsIGF1dGh6KVxuICovXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gKGNiKSB7XG4gIGFzc2VydC5mdW5jKGNiLCAnY2FsbGJhY2snKTtcblxuICBpZiAodGhpcy5yc19oZWFkZXJzLmxlbmd0aCA8IDEpXG4gICAgdGhyb3cgKG5ldyBFcnJvcignQXQgbGVhc3Qgb25lIGhlYWRlciBtdXN0IGJlIHNpZ25lZCcpKTtcblxuICB2YXIgYWxnLCBhdXRoejtcbiAgaWYgKHRoaXMucnNfc2lnbkZ1bmMpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucnNfbGluZXMuam9pbignXFxuJyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucnNfc2lnbkZ1bmMoZGF0YSwgZnVuY3Rpb24gKGVyciwgc2lnKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNiKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGFzc2VydC5vYmplY3Qoc2lnLCAnc2lnbmF0dXJlJyk7XG4gICAgICAgIGFzc2VydC5zdHJpbmcoc2lnLmtleUlkLCAnc2lnbmF0dXJlLmtleUlkJyk7XG4gICAgICAgIGFzc2VydC5zdHJpbmcoc2lnLmFsZ29yaXRobSwgJ3NpZ25hdHVyZS5hbGdvcml0aG0nKTtcbiAgICAgICAgYXNzZXJ0LnN0cmluZyhzaWcuc2lnbmF0dXJlLCAnc2lnbmF0dXJlLnNpZ25hdHVyZScpO1xuICAgICAgICBhbGcgPSB2YWxpZGF0ZUFsZ29yaXRobShzaWcuYWxnb3JpdGhtKTtcblxuICAgICAgICBhdXRoeiA9IHNwcmludGYoQVVUSFpfRk1ULFxuICAgICAgICAgIHNpZy5rZXlJZCxcbiAgICAgICAgICBzaWcuYWxnb3JpdGhtLFxuICAgICAgICAgIHNlbGYucnNfaGVhZGVycy5qb2luKCcgJyksXG4gICAgICAgICAgc2lnLnNpZ25hdHVyZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNiKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYihudWxsLCBhdXRoeik7XG4gICAgfSk7XG5cbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHNpZ09iaiA9IHRoaXMucnNfc2lnbmVyLnNpZ24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWxnID0gKHRoaXMucnNfYWxnWzBdIHx8IHRoaXMucnNfa2V5LnR5cGUpICsgJy0nICsgc2lnT2JqLmhhc2hBbGdvcml0aG07XG4gICAgdmFyIHNpZ25hdHVyZSA9IHNpZ09iai50b1N0cmluZygpO1xuICAgIGF1dGh6ID0gc3ByaW50ZihBVVRIWl9GTVQsXG4gICAgICB0aGlzLnJzX2tleUlkLFxuICAgICAgYWxnLFxuICAgICAgdGhpcy5yc19oZWFkZXJzLmpvaW4oJyAnKSxcbiAgICAgIHNpZ25hdHVyZSk7XG4gICAgY2IobnVsbCwgYXV0aHopO1xuICB9XG59O1xuXG4vLy8tLS0gRXhwb3J0ZWQgQVBJXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvKipcbiAgICogSWRlbnRpZmllcyB3aGV0aGVyIGEgZ2l2ZW4gb2JqZWN0IGlzIGEgcmVxdWVzdCBzaWduZXIgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0LCB0aGUgb2JqZWN0IHRvIGlkZW50aWZ5XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgaXNTaWduZXI6IGZ1bmN0aW9uIChvYmopIHtcbiAgICBpZiAodHlwZW9mIChvYmopID09PSAnb2JqZWN0JyAmJiBvYmogaW5zdGFuY2VvZiBSZXF1ZXN0U2lnbmVyKVxuICAgICAgcmV0dXJuICh0cnVlKTtcbiAgICByZXR1cm4gKGZhbHNlKTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlcXVlc3Qgc2lnbmVyLCB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IGJ1aWxkIGEgc2lnbmF0dXJlXG4gICAqIGZvciBhIHJlcXVlc3QgKGRvZXMgbm90IGhhdmUgdG8gYmUgYW4gaHR0cC5DbGllbnRSZXF1ZXN0KS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMsIGVpdGhlcjpcbiAgICogICAgICAgICAgICAgICAgICAgLSB7U3RyaW5nfSBrZXlJZFxuICAgKiAgICAgICAgICAgICAgICAgICAtIHtTdHJpbmd8QnVmZmVyfSBrZXlcbiAgICogICAgICAgICAgICAgICAgICAgLSB7U3RyaW5nfSBhbGdvcml0aG0gKG9wdGlvbmFsLCByZXF1aXJlZCBmb3IgSE1BQylcbiAgICogICAgICAgICAgICAgICAgIG9yOlxuICAgKiAgICAgICAgICAgICAgICAgICAtIHtGdW5jfSBzaWduIChkYXRhLCBjYilcbiAgICogQHJldHVybiB7UmVxdWVzdFNpZ25lcn1cbiAgICovXG4gIGNyZWF0ZVNpZ25lcjogZnVuY3Rpb24gY3JlYXRlU2lnbmVyKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKG5ldyBSZXF1ZXN0U2lnbmVyKG9wdGlvbnMpKTtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhbiAnQXV0aG9yaXphdGlvbicgaGVhZGVyIHRvIGFuIGh0dHAuQ2xpZW50UmVxdWVzdCBvYmplY3QuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIEFQSSB3aWxsIGFkZCBhIERhdGUgaGVhZGVyIGlmIGl0J3Mgbm90IGFscmVhZHkgc2V0LiBBbnlcbiAgICogb3RoZXIgaGVhZGVycyBpbiB0aGUgb3B0aW9ucy5oZWFkZXJzIGFycmF5IE1VU1QgYmUgcHJlc2VudCwgb3IgdGhpc1xuICAgKiB3aWxsIHRocm93LlxuICAgKlxuICAgKiBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiB0eXBlOyBpdCdzIGp1c3QgdGhlcmUgaWYgeW91IHdhbnRcbiAgICogdG8gYmUgcGVkYW50aWMuXG4gICAqXG4gICAqIFRoZSBvcHRpb25hbCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHBhcnNpbmcgc2hvdWxkIHVzZSBzdHJpY3QgZW5mb3JjZW1lbnRcbiAgICogb2YgdGhlIHZlcnNpb24gZHJhZnQtY2F2YWdlLWh0dHAtc2lnbmF0dXJlcy0wNCBvZiB0aGUgc3BlYyBvciBiZXlvbmQuXG4gICAqIFRoZSBkZWZhdWx0IGlzIHRvIGJlIGxvb3NlIGFuZCBzdXBwb3J0XG4gICAqIG9sZGVyIHZlcnNpb25zIGZvciBjb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBhbiBpbnN0YW5jZSBvZiBodHRwLkNsaWVudFJlcXVlc3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHNpZ25pbmcgcGFyYW1ldGVycyBvYmplY3Q6XG4gICAqICAgICAgICAgICAgICAgICAgIC0ge1N0cmluZ30ga2V5SWQgcmVxdWlyZWQuXG4gICAqICAgICAgICAgICAgICAgICAgIC0ge1N0cmluZ30ga2V5IHJlcXVpcmVkIChlaXRoZXIgYSBQRU0gb3IgSE1BQyBrZXkpLlxuICAgKiAgICAgICAgICAgICAgICAgICAtIHtBcnJheX0gaGVhZGVycyBvcHRpb25hbDsgZGVmYXVsdHMgdG8gWydkYXRlJ10uXG4gICAqICAgICAgICAgICAgICAgICAgIC0ge1N0cmluZ30gYWxnb3JpdGhtIG9wdGlvbmFsICh1bmxlc3Mga2V5IGlzIEhNQUMpO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgdGhlIHNhbWUgYXMgdGhlIHNzaHBrIGRlZmF1bHRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduaW5nIGFsZ29yaXRobSBmb3IgdGhlIHR5cGUgb2Yga2V5IGdpdmVuXG4gICAqICAgICAgICAgICAgICAgICAgIC0ge1N0cmluZ30gaHR0cFZlcnNpb24gb3B0aW9uYWw7IGRlZmF1bHRzIHRvICcxLjEnLlxuICAgKiAgICAgICAgICAgICAgICAgICAtIHtCb29sZWFufSBzdHJpY3Qgb3B0aW9uYWw7IGRlZmF1bHRzIHRvICdmYWxzZScuXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgQXV0aG9yaXphdGlvbiAoYW5kIG9wdGlvbmFsbHkgRGF0ZSkgd2VyZSBhZGRlZC5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBvbiBiYWQgcGFyYW1ldGVyIHR5cGVzIChpbnB1dCkuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRBbGdvcml0aG1FcnJvcn0gaWYgYWxnb3JpdGhtIHdhcyBiYWQgb3IgaW5jb21wYXRpYmxlIHdpdGhcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4ga2V5LlxuICAgKiBAdGhyb3dzIHtzc2hway5LZXlQYXJzZUVycm9yfSBpZiBrZXkgd2FzIGJhZC5cbiAgICogQHRocm93cyB7TWlzc2luZ0hlYWRlckVycm9yfSBpZiBhIGhlYWRlciB0byBiZSBzaWduZWQgd2FzIHNwZWNpZmllZCBidXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgbm90IHByZXNlbnQuXG4gICAqL1xuICBzaWduUmVxdWVzdDogZnVuY3Rpb24gc2lnblJlcXVlc3QocmVxdWVzdCwgb3B0aW9ucykge1xuICAgIGFzc2VydC5vYmplY3QocmVxdWVzdCwgJ3JlcXVlc3QnKTtcbiAgICBhc3NlcnQub2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgYXNzZXJ0Lm9wdGlvbmFsU3RyaW5nKG9wdGlvbnMuYWxnb3JpdGhtLCAnb3B0aW9ucy5hbGdvcml0aG0nKTtcbiAgICBhc3NlcnQuc3RyaW5nKG9wdGlvbnMua2V5SWQsICdvcHRpb25zLmtleUlkJyk7XG4gICAgYXNzZXJ0Lm9wdGlvbmFsQXJyYXlPZlN0cmluZyhvcHRpb25zLmhlYWRlcnMsICdvcHRpb25zLmhlYWRlcnMnKTtcbiAgICBhc3NlcnQub3B0aW9uYWxTdHJpbmcob3B0aW9ucy5odHRwVmVyc2lvbiwgJ29wdGlvbnMuaHR0cFZlcnNpb24nKTtcblxuICAgIGlmICghcmVxdWVzdC5nZXRIZWFkZXIoJ0RhdGUnKSlcbiAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCdEYXRlJywganNwcmltLnJmYzExMjMobmV3IERhdGUoKSkpO1xuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKVxuICAgICAgb3B0aW9ucy5oZWFkZXJzID0gWydkYXRlJ107XG4gICAgaWYgKCFvcHRpb25zLmh0dHBWZXJzaW9uKVxuICAgICAgb3B0aW9ucy5odHRwVmVyc2lvbiA9ICcxLjEnO1xuXG4gICAgdmFyIGFsZyA9IFtdO1xuICAgIGlmIChvcHRpb25zLmFsZ29yaXRobSkge1xuICAgICAgb3B0aW9ucy5hbGdvcml0aG0gPSBvcHRpb25zLmFsZ29yaXRobS50b0xvd2VyQ2FzZSgpO1xuICAgICAgYWxnID0gdmFsaWRhdGVBbGdvcml0aG0ob3B0aW9ucy5hbGdvcml0aG0pO1xuICAgIH1cblxuICAgIHZhciBpO1xuICAgIHZhciBzdHJpbmdUb1NpZ24gPSAnJztcbiAgICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5oZWFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIChvcHRpb25zLmhlYWRlcnNbaV0pICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5oZWFkZXJzIG11c3QgYmUgYW4gYXJyYXkgb2YgU3RyaW5ncycpO1xuXG4gICAgICB2YXIgaCA9IG9wdGlvbnMuaGVhZGVyc1tpXS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoaCA9PT0gJ3JlcXVlc3QtbGluZScpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFdlIGFsbG93IGhlYWRlcnMgZnJvbSB0aGUgb2xkZXIgc3BlYyBkcmFmdHMgaWYgc3RyaWN0IHBhcnNpbmcgaXNuJ3RcbiAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gb3B0aW9ucy5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBzdHJpbmdUb1NpZ24gKz1cbiAgICAgICAgICAgIHJlcXVlc3QubWV0aG9kICsgJyAnICsgcmVxdWVzdC5wYXRoICsgJyBIVFRQLycgK1xuICAgICAgICAgICAgb3B0aW9ucy5odHRwVmVyc2lvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBTdHJpY3QgcGFyc2luZyBkb2Vzbid0IGFsbG93IG9sZGVyIGRyYWZ0IGhlYWRlcnMuICovXG4gICAgICAgICAgdGhyb3cgKG5ldyBTdHJpY3RQYXJzaW5nRXJyb3IoJ3JlcXVlc3QtbGluZSBpcyBub3QgYSB2YWxpZCBoZWFkZXIgJyArXG4gICAgICAgICAgICAnd2l0aCBzdHJpY3QgcGFyc2luZyBlbmFibGVkLicpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoID09PSAnKHJlcXVlc3QtdGFyZ2V0KScpIHtcbiAgICAgICAgc3RyaW5nVG9TaWduICs9XG4gICAgICAgICAgJyhyZXF1ZXN0LXRhcmdldCk6ICcgKyByZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpICsgJyAnICtcbiAgICAgICAgICByZXF1ZXN0LnBhdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcihoKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdIZWFkZXJFcnJvcihoICsgJyB3YXMgbm90IGluIHRoZSByZXF1ZXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyaW5nVG9TaWduICs9IGggKyAnOiAnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaSArIDEpIDwgb3B0aW9ucy5oZWFkZXJzLmxlbmd0aClcbiAgICAgICAgc3RyaW5nVG9TaWduICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8qIFRoaXMgaXMganVzdCBmb3IgdW5pdCB0ZXN0cy4gKi9cbiAgICBpZiAocmVxdWVzdC5oYXNPd25Qcm9wZXJ0eSgnX3N0cmluZ1RvU2lnbicpKSB7XG4gICAgICByZXF1ZXN0Ll9zdHJpbmdUb1NpZ24gPSBzdHJpbmdUb1NpZ247XG4gICAgfVxuXG4gICAgdmFyIHNpZ25hdHVyZTtcbiAgICBpZiAoYWxnWzBdID09PSAnaG1hYycpIHtcbiAgICAgIGlmICh0eXBlb2YgKG9wdGlvbnMua2V5KSAhPT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0J1ZmZlcihvcHRpb25zLmtleSkpXG4gICAgICAgIHRocm93IChuZXcgVHlwZUVycm9yKCdvcHRpb25zLmtleSBtdXN0IGJlIGEgc3RyaW5nIG9yIEJ1ZmZlcicpKTtcblxuICAgICAgdmFyIGhtYWMgPSBjcnlwdG8uY3JlYXRlSG1hYyhhbGdbMV0udG9VcHBlckNhc2UoKSwgb3B0aW9ucy5rZXkpO1xuICAgICAgaG1hYy51cGRhdGUoc3RyaW5nVG9TaWduKTtcbiAgICAgIHNpZ25hdHVyZSA9IGhtYWMuZGlnZXN0KCdiYXNlNjQnKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgICBpZiAodHlwZW9mIChrZXkpID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIoa2V5KSlcbiAgICAgICAga2V5ID0gc3NocGsucGFyc2VQcml2YXRlS2V5KG9wdGlvbnMua2V5KTtcblxuICAgICAgYXNzZXJ0Lm9rKHNzaHBrLlByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSwgWzEsIDJdKSxcbiAgICAgICAgJ29wdGlvbnMua2V5IG11c3QgYmUgYSBzc2hway5Qcml2YXRlS2V5Jyk7XG5cbiAgICAgIGlmICghUEtfQUxHT1Nba2V5LnR5cGVdKSB7XG4gICAgICAgIHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKGtleS50eXBlLnRvVXBwZXJDYXNlKCkgKyAnIHR5cGUgJyArXG4gICAgICAgICAgJ2tleXMgYXJlIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhbGdbMF0gIT09IHVuZGVmaW5lZCAmJiBrZXkudHlwZSAhPT0gYWxnWzBdKSB7XG4gICAgICAgIHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKCdvcHRpb25zLmtleSBtdXN0IGJlIGEgJyArXG4gICAgICAgICAgYWxnWzBdLnRvVXBwZXJDYXNlKCkgKyAnIGtleSwgd2FzIGdpdmVuIGEgJyArXG4gICAgICAgICAga2V5LnR5cGUudG9VcHBlckNhc2UoKSArICcga2V5IGluc3RlYWQnKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaWduZXIgPSBrZXkuY3JlYXRlU2lnbihhbGdbMV0pO1xuICAgICAgc2lnbmVyLnVwZGF0ZShzdHJpbmdUb1NpZ24pO1xuICAgICAgdmFyIHNpZ09iaiA9IHNpZ25lci5zaWduKCk7XG4gICAgICBpZiAoIUhBU0hfQUxHT1Nbc2lnT2JqLmhhc2hBbGdvcml0aG1dKSB7XG4gICAgICAgIHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKHNpZ09iai5oYXNoQWxnb3JpdGhtLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICAgICcgaXMgbm90IGEgc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtJykpO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5hbGdvcml0aG0gPSBrZXkudHlwZSArICctJyArIHNpZ09iai5oYXNoQWxnb3JpdGhtO1xuICAgICAgc2lnbmF0dXJlID0gc2lnT2JqLnRvU3RyaW5nKCk7XG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoc2lnbmF0dXJlLCAnJywgJ2VtcHR5IHNpZ25hdHVyZSBwcm9kdWNlZCcpO1xuICAgIH1cblxuICAgIHZhciBhdXRoekhlYWRlck5hbWUgPSBvcHRpb25zLmF1dGhvcml6YXRpb25IZWFkZXJOYW1lIHx8ICdBdXRob3JpemF0aW9uJztcblxuICAgIHJlcXVlc3Quc2V0SGVhZGVyKGF1dGh6SGVhZGVyTmFtZSwgc3ByaW50ZihBVVRIWl9GTVQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMua2V5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMuam9pbignICcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUpKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTUgSm95ZW50LCBJbmMuXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIHNzaHBrID0gcmVxdWlyZSgnc3NocGsnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIEhBU0hfQUxHT1MgPSB1dGlscy5IQVNIX0FMR09TO1xudmFyIFBLX0FMR09TID0gdXRpbHMuUEtfQUxHT1M7XG52YXIgSW52YWxpZEFsZ29yaXRobUVycm9yID0gdXRpbHMuSW52YWxpZEFsZ29yaXRobUVycm9yO1xudmFyIEh0dHBTaWduYXR1cmVFcnJvciA9IHV0aWxzLkh0dHBTaWduYXR1cmVFcnJvcjtcbnZhciB2YWxpZGF0ZUFsZ29yaXRobSA9IHV0aWxzLnZhbGlkYXRlQWxnb3JpdGhtO1xuXG4vLy8tLS0gRXhwb3J0ZWQgQVBJXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvKipcbiAgICogVmVyaWZ5IFJTQS9EU0Egc2lnbmF0dXJlIGFnYWluc3QgcHVibGljIGtleS4gIFlvdSBhcmUgZXhwZWN0ZWQgdG8gcGFzcyBpblxuICAgKiBhbiBvYmplY3QgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSBgcGFyc2UoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWRTaWduYXR1cmUgdGhlIG9iamVjdCB5b3UgZ290IGZyb20gYHBhcnNlYC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YmtleSBSU0EvRFNBIHByaXZhdGUga2V5IFBFTS5cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IGlmIHlvdSBwYXNzIGluIGJhZCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRBbGdvcml0aG1FcnJvcn1cbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZTogZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHBhcnNlZFNpZ25hdHVyZSwgcHVia2V5KSB7XG4gICAgYXNzZXJ0Lm9iamVjdChwYXJzZWRTaWduYXR1cmUsICdwYXJzZWRTaWduYXR1cmUnKTtcbiAgICBpZiAodHlwZW9mIChwdWJrZXkpID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIocHVia2V5KSlcbiAgICAgIHB1YmtleSA9IHNzaHBrLnBhcnNlS2V5KHB1YmtleSk7XG4gICAgYXNzZXJ0Lm9rKHNzaHBrLktleS5pc0tleShwdWJrZXksIFsxLCAxXSksICdwdWJrZXkgbXVzdCBiZSBhIHNzaHBrLktleScpO1xuXG4gICAgdmFyIGFsZyA9IHZhbGlkYXRlQWxnb3JpdGhtKHBhcnNlZFNpZ25hdHVyZS5hbGdvcml0aG0pO1xuICAgIGlmIChhbGdbMF0gPT09ICdobWFjJyB8fCBhbGdbMF0gIT09IHB1YmtleS50eXBlKVxuICAgICAgcmV0dXJuIChmYWxzZSk7XG5cbiAgICB2YXIgdiA9IHB1YmtleS5jcmVhdGVWZXJpZnkoYWxnWzFdKTtcbiAgICB2LnVwZGF0ZShwYXJzZWRTaWduYXR1cmUuc2lnbmluZ1N0cmluZyk7XG4gICAgcmV0dXJuICh2LnZlcmlmeShwYXJzZWRTaWduYXR1cmUucGFyYW1zLnNpZ25hdHVyZSwgJ2Jhc2U2NCcpKTtcbiAgfSxcblxuICAvKipcbiAgICogVmVyaWZ5IEhNQUMgYWdhaW5zdCBzaGFyZWQgc2VjcmV0LiAgWW91IGFyZSBleHBlY3RlZCB0byBwYXNzIGluIGFuIG9iamVjdFxuICAgKiB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIGBwYXJzZSgpYC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcnNlZFNpZ25hdHVyZSB0aGUgb2JqZWN0IHlvdSBnb3QgZnJvbSBgcGFyc2VgLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VjcmV0IEhNQUMgc2hhcmVkIHNlY3JldC5cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IGlmIHlvdSBwYXNzIGluIGJhZCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRBbGdvcml0aG1FcnJvcn1cbiAgICovXG4gIHZlcmlmeUhNQUM6IGZ1bmN0aW9uIHZlcmlmeUhNQUMocGFyc2VkU2lnbmF0dXJlLCBzZWNyZXQpIHtcbiAgICBhc3NlcnQub2JqZWN0KHBhcnNlZFNpZ25hdHVyZSwgJ3BhcnNlZEhNQUMnKTtcbiAgICBhc3NlcnQuc3RyaW5nKHNlY3JldCwgJ3NlY3JldCcpO1xuXG4gICAgdmFyIGFsZyA9IHZhbGlkYXRlQWxnb3JpdGhtKHBhcnNlZFNpZ25hdHVyZS5hbGdvcml0aG0pO1xuICAgIGlmIChhbGdbMF0gIT09ICdobWFjJylcbiAgICAgIHJldHVybiAoZmFsc2UpO1xuXG4gICAgdmFyIGhhc2hBbGcgPSBhbGdbMV0udG9VcHBlckNhc2UoKTtcblxuICAgIHZhciBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoaGFzaEFsZywgc2VjcmV0KTtcbiAgICBobWFjLnVwZGF0ZShwYXJzZWRTaWduYXR1cmUuc2lnbmluZ1N0cmluZyk7XG5cbiAgICAvKlxuICAgICAqIE5vdyBkb3VibGUtaGFzaCB0byBhdm9pZCBsZWFraW5nIHRpbWluZyBpbmZvcm1hdGlvbiAtIHRoZXJlJ3NcbiAgICAgKiBubyBlYXN5IGNvbnN0YW50LXRpbWUgY29tcGFyZSBpbiBKUywgc28gd2UgdXNlIHRoaXMgYXBwcm9hY2hcbiAgICAgKiBpbnN0ZWFkLiBTZWUgZm9yIG1vcmUgaW5mbzpcbiAgICAgKiBodHRwczovL3d3dy5pc2VjcGFydG5lcnMuY29tL2Jsb2cvMjAxMS9mZWJydWFyeS9kb3VibGUtaG1hYy1cbiAgICAgKiB2ZXJpZmljYXRpb24uYXNweFxuICAgICAqL1xuICAgIHZhciBoMSA9IGNyeXB0by5jcmVhdGVIbWFjKGhhc2hBbGcsIHNlY3JldCk7XG4gICAgaDEudXBkYXRlKGhtYWMuZGlnZXN0KCkpO1xuICAgIGgxID0gaDEuZGlnZXN0KCk7XG4gICAgdmFyIGgyID0gY3J5cHRvLmNyZWF0ZUhtYWMoaGFzaEFsZywgc2VjcmV0KTtcbiAgICBoMi51cGRhdGUobmV3IEJ1ZmZlcihwYXJzZWRTaWduYXR1cmUucGFyYW1zLnNpZ25hdHVyZSwgJ2Jhc2U2NCcpKTtcbiAgICBoMiA9IGgyLmRpZ2VzdCgpO1xuXG4gICAgLyogTm9kZSAwLjggcmV0dXJucyBzdHJpbmdzIGZyb20gLmRpZ2VzdCgpLiAqL1xuICAgIGlmICh0eXBlb2YgKGgxKSA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gKGgxID09PSBoMik7XG4gICAgLyogQW5kIG5vZGUgMC4xMCBsYWNrcyB0aGUgLmVxdWFscygpIG1ldGhvZCBvbiBCdWZmZXJzLiAqL1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoaDEpICYmICFoMS5lcXVhbHMpXG4gICAgICByZXR1cm4gKGgxLnRvU3RyaW5nKCdiaW5hcnknKSA9PT0gaDIudG9TdHJpbmcoJ2JpbmFyeScpKTtcblxuICAgIHJldHVybiAoaDEuZXF1YWxzKGgyKSk7XG4gIH1cbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTUgSm95ZW50LCBJbmMuXG5cbnZhciBwYXJzZXIgPSByZXF1aXJlKCcuL3BhcnNlcicpO1xudmFyIHNpZ25lciA9IHJlcXVpcmUoJy4vc2lnbmVyJyk7XG52YXIgdmVyaWZ5ID0gcmVxdWlyZSgnLi92ZXJpZnknKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuXG5cbi8vLy0tLSBBUElcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgcGFyc2U6IHBhcnNlci5wYXJzZVJlcXVlc3QsXG4gIHBhcnNlUmVxdWVzdDogcGFyc2VyLnBhcnNlUmVxdWVzdCxcblxuICBzaWduOiBzaWduZXIuc2lnblJlcXVlc3QsXG4gIHNpZ25SZXF1ZXN0OiBzaWduZXIuc2lnblJlcXVlc3QsXG4gIGNyZWF0ZVNpZ25lcjogc2lnbmVyLmNyZWF0ZVNpZ25lcixcbiAgaXNTaWduZXI6IHNpZ25lci5pc1NpZ25lcixcblxuICBzc2hLZXlUb1BFTTogdXRpbHMuc3NoS2V5VG9QRU0sXG4gIHNzaEtleUZpbmdlcnByaW50OiB1dGlscy5maW5nZXJwcmludCxcbiAgcGVtVG9Sc2FTU0hLZXk6IHV0aWxzLnBlbVRvUnNhU1NIS2V5LFxuXG4gIHZlcmlmeTogdmVyaWZ5LnZlcmlmeVNpZ25hdHVyZSxcbiAgdmVyaWZ5U2lnbmF0dXJlOiB2ZXJpZnkudmVyaWZ5U2lnbmF0dXJlLFxuICB2ZXJpZnlITUFDOiB2ZXJpZnkudmVyaWZ5SE1BQ1xufTtcbiIsICIvKiFcbiAqIG1pbWUtZGJcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUtMjAyMiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGIuanNvbicpXG4iLCAiLyohXG4gKiBtaW1lLXR5cGVzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGIgPSByZXF1aXJlKCdtaW1lLWRiJylcbnZhciBleHRuYW1lID0gcmVxdWlyZSgncGF0aCcpLmV4dG5hbWVcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRVhUUkFDVF9UWVBFX1JFR0VYUCA9IC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS9cbnZhciBURVhUX1RZUEVfUkVHRVhQID0gL150ZXh0XFwvL2lcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNoYXJzZXQgPSBjaGFyc2V0XG5leHBvcnRzLmNoYXJzZXRzID0geyBsb29rdXA6IGNoYXJzZXQgfVxuZXhwb3J0cy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG5leHBvcnRzLmV4dGVuc2lvbiA9IGV4dGVuc2lvblxuZXhwb3J0cy5leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuZXhwb3J0cy5sb29rdXAgPSBsb29rdXBcbmV4cG9ydHMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIFBvcHVsYXRlIHRoZSBleHRlbnNpb25zL3R5cGVzIG1hcHNcbnBvcHVsYXRlTWFwcyhleHBvcnRzLmV4dGVuc2lvbnMsIGV4cG9ydHMudHlwZXMpXG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGEgTUlNRSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjaGFyc2V0ICh0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBFWFRSQUNUX1RZUEVfUkVHRVhQLmV4ZWModHlwZSlcbiAgdmFyIG1pbWUgPSBtYXRjaCAmJiBkYlttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmIChtaW1lICYmIG1pbWUuY2hhcnNldCkge1xuICAgIHJldHVybiBtaW1lLmNoYXJzZXRcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdGV4dC8qIHRvIHV0Zi04XG4gIGlmIChtYXRjaCAmJiBURVhUX1RZUEVfUkVHRVhQLnRlc3QobWF0Y2hbMV0pKSB7XG4gICAgcmV0dXJuICdVVEYtOCdcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bGwgQ29udGVudC1UeXBlIGhlYWRlciBnaXZlbiBhIE1JTUUgdHlwZSBvciBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY29udGVudFR5cGUgKHN0cikge1xuICAvLyBUT0RPOiBzaG91bGQgdGhpcyBldmVuIGJlIGluIHRoaXMgbW9kdWxlP1xuICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIG1pbWUgPSBzdHIuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gZXhwb3J0cy5sb29rdXAoc3RyKVxuICAgIDogc3RyXG5cbiAgaWYgKCFtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgY29udGVudC10eXBlIG9yIG90aGVyIG1vZHVsZVxuICBpZiAobWltZS5pbmRleE9mKCdjaGFyc2V0JykgPT09IC0xKSB7XG4gICAgdmFyIGNoYXJzZXQgPSBleHBvcnRzLmNoYXJzZXQobWltZSlcbiAgICBpZiAoY2hhcnNldCkgbWltZSArPSAnOyBjaGFyc2V0PScgKyBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIHJldHVybiBtaW1lXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuc2lvbiAodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgbWVkaWEtdHlwZXJcbiAgdmFyIG1hdGNoID0gRVhUUkFDVF9UWVBFX1JFR0VYUC5leGVjKHR5cGUpXG5cbiAgLy8gZ2V0IGV4dGVuc2lvbnNcbiAgdmFyIGV4dHMgPSBtYXRjaCAmJiBleHBvcnRzLmV4dGVuc2lvbnNbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKV1cblxuICBpZiAoIWV4dHMgfHwgIWV4dHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXh0c1swXVxufVxuXG4vKipcbiAqIExvb2t1cCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgcGF0aC9leHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGxvb2t1cCAocGF0aCkge1xuICBpZiAoIXBhdGggfHwgdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBnZXQgdGhlIGV4dGVuc2lvbiAoXCJleHRcIiBvciBcIi5leHRcIiBvciBmdWxsIHBhdGgpXG4gIHZhciBleHRlbnNpb24gPSBleHRuYW1lKCd4LicgKyBwYXRoKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnN1YnN0cigxKVxuXG4gIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy50eXBlc1tleHRlbnNpb25dIHx8IGZhbHNlXG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGV4dGVuc2lvbnMgYW5kIHR5cGVzIG1hcHMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBvcHVsYXRlTWFwcyAoZXh0ZW5zaW9ucywgdHlwZXMpIHtcbiAgLy8gc291cmNlIHByZWZlcmVuY2UgKGxlYXN0IC0+IG1vc3QpXG4gIHZhciBwcmVmZXJlbmNlID0gWyduZ2lueCcsICdhcGFjaGUnLCB1bmRlZmluZWQsICdpYW5hJ11cblxuICBPYmplY3Qua2V5cyhkYikuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoTWltZVR5cGUgKHR5cGUpIHtcbiAgICB2YXIgbWltZSA9IGRiW3R5cGVdXG4gICAgdmFyIGV4dHMgPSBtaW1lLmV4dGVuc2lvbnNcblxuICAgIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIG1pbWUgLT4gZXh0ZW5zaW9uc1xuICAgIGV4dGVuc2lvbnNbdHlwZV0gPSBleHRzXG5cbiAgICAvLyBleHRlbnNpb24gLT4gbWltZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dHNbaV1cblxuICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0pIHtcbiAgICAgICAgdmFyIGZyb20gPSBwcmVmZXJlbmNlLmluZGV4T2YoZGJbdHlwZXNbZXh0ZW5zaW9uXV0uc291cmNlKVxuICAgICAgICB2YXIgdG8gPSBwcmVmZXJlbmNlLmluZGV4T2YobWltZS5zb3VyY2UpXG5cbiAgICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0gIT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nICYmXG4gICAgICAgICAgKGZyb20gPiB0byB8fCAoZnJvbSA9PT0gdG8gJiYgdHlwZXNbZXh0ZW5zaW9uXS5zdWJzdHIoMCwgMTIpID09PSAnYXBwbGljYXRpb24vJykpKSB7XG4gICAgICAgICAgLy8gc2tpcCB0aGUgcmVtYXBwaW5nXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGV4dGVuc2lvbiAtPiBtaW1lXG4gICAgICB0eXBlc1tleHRlbnNpb25dID0gdHlwZVxuICAgIH1cbiAgfSlcbn1cbiIsICJmdW5jdGlvbiBDYXNlbGVzcyAoZGljdCkge1xuICB0aGlzLmRpY3QgPSBkaWN0IHx8IHt9XG59XG5DYXNlbGVzcy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBjbG9iYmVyKSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciBpIGluIG5hbWUpIHtcbiAgICAgIHRoaXMuc2V0KGksIG5hbWVbaV0sIHZhbHVlKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGNsb2JiZXIgPT09ICd1bmRlZmluZWQnKSBjbG9iYmVyID0gdHJ1ZVxuICAgIHZhciBoYXMgPSB0aGlzLmhhcyhuYW1lKVxuXG4gICAgaWYgKCFjbG9iYmVyICYmIGhhcykgdGhpcy5kaWN0W2hhc10gPSB0aGlzLmRpY3RbaGFzXSArICcsJyArIHZhbHVlXG4gICAgZWxzZSB0aGlzLmRpY3RbaGFzIHx8IG5hbWVdID0gdmFsdWVcbiAgICByZXR1cm4gaGFzXG4gIH1cbn1cbkNhc2VsZXNzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZGljdClcbiAgICAsIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICA7XG4gIGZvciAodmFyIGk9MDtpPGtleXMubGVuZ3RoO2krKykge1xuICAgIGlmIChrZXlzW2ldLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUpIHJldHVybiBrZXlzW2ldXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5DYXNlbGVzcy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuICB2YXIgcmVzdWx0LCBfa2V5XG4gIHZhciBoZWFkZXJzID0gdGhpcy5kaWN0XG4gIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIF9rZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuICAgIGlmIChuYW1lID09PSBfa2V5KSByZXN1bHQgPSBoZWFkZXJzW2tleV1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufVxuQ2FzZWxlc3MucHJvdG90eXBlLnN3YXAgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgaGFzID0gdGhpcy5oYXMobmFtZSlcbiAgaWYgKGhhcyA9PT0gbmFtZSkgcmV0dXJuXG4gIGlmICghaGFzKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIGhlYWRlciB0aGFuIG1hdGNoZXMgXCInK25hbWUrJ1wiJylcbiAgdGhpcy5kaWN0W25hbWVdID0gdGhpcy5kaWN0W2hhc11cbiAgZGVsZXRlIHRoaXMuZGljdFtoYXNdXG59XG5DYXNlbGVzcy5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIGhhcyA9IHRoaXMuaGFzKG5hbWUpXG4gIHJldHVybiBkZWxldGUgdGhpcy5kaWN0W2hhcyB8fCBuYW1lXVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkaWN0KSB7cmV0dXJuIG5ldyBDYXNlbGVzcyhkaWN0KX1cbm1vZHVsZS5leHBvcnRzLmh0dHBpZnkgPSBmdW5jdGlvbiAocmVzcCwgaGVhZGVycykge1xuICB2YXIgYyA9IG5ldyBDYXNlbGVzcyhoZWFkZXJzKVxuICByZXNwLnNldEhlYWRlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBjbG9iYmVyKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVyblxuICAgIHJldHVybiBjLnNldChrZXksIHZhbHVlLCBjbG9iYmVyKVxuICB9XG4gIHJlc3AuaGFzSGVhZGVyID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBjLmhhcyhrZXkpXG4gIH1cbiAgcmVzcC5nZXRIZWFkZXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGMuZ2V0KGtleSlcbiAgfVxuICByZXNwLnJlbW92ZUhlYWRlciA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gYy5kZWwoa2V5KVxuICB9XG4gIHJlc3AuaGVhZGVycyA9IGMuZGljdFxuICByZXR1cm4gY1xufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gRm9yZXZlckFnZW50XG5Gb3JldmVyQWdlbnQuU1NMID0gRm9yZXZlckFnZW50U1NMXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG4gICwgQWdlbnQgPSByZXF1aXJlKCdodHRwJykuQWdlbnRcbiAgLCBuZXQgPSByZXF1aXJlKCduZXQnKVxuICAsIHRscyA9IHJlcXVpcmUoJ3RscycpXG4gICwgQWdlbnRTU0wgPSByZXF1aXJlKCdodHRwcycpLkFnZW50XG4gIFxuZnVuY3Rpb24gZ2V0Q29ubmVjdGlvbk5hbWUoaG9zdCwgcG9ydCkgeyAgXG4gIHZhciBuYW1lID0gJydcbiAgaWYgKHR5cGVvZiBob3N0ID09PSAnc3RyaW5nJykge1xuICAgIG5hbWUgPSBob3N0ICsgJzonICsgcG9ydFxuICB9IGVsc2Uge1xuICAgIC8vIEZvciBub2RlLmpzIHYwMTIuMCBhbmQgaW9qcy12MS41LjEsIGhvc3QgaXMgYW4gb2JqZWN0LiBBbmQgYW55IGV4aXN0aW5nIGxvY2FsQWRkcmVzcyBpcyBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIG5hbWUuXG4gICAgbmFtZSA9IGhvc3QuaG9zdCArICc6JyArIGhvc3QucG9ydCArICc6JyArIChob3N0LmxvY2FsQWRkcmVzcyA/IChob3N0LmxvY2FsQWRkcmVzcyArICc6JykgOiAnOicpXG4gIH1cbiAgcmV0dXJuIG5hbWVcbn0gICAgXG5cbmZ1bmN0aW9uIEZvcmV2ZXJBZ2VudChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHNlbGYucmVxdWVzdHMgPSB7fVxuICBzZWxmLnNvY2tldHMgPSB7fVxuICBzZWxmLmZyZWVTb2NrZXRzID0ge31cbiAgc2VsZi5tYXhTb2NrZXRzID0gc2VsZi5vcHRpb25zLm1heFNvY2tldHMgfHwgQWdlbnQuZGVmYXVsdE1heFNvY2tldHNcbiAgc2VsZi5taW5Tb2NrZXRzID0gc2VsZi5vcHRpb25zLm1pblNvY2tldHMgfHwgRm9yZXZlckFnZW50LmRlZmF1bHRNaW5Tb2NrZXRzXG4gIHNlbGYub24oJ2ZyZWUnLCBmdW5jdGlvbihzb2NrZXQsIGhvc3QsIHBvcnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbm5lY3Rpb25OYW1lKGhvc3QsIHBvcnQpXG5cbiAgICBpZiAoc2VsZi5yZXF1ZXN0c1tuYW1lXSAmJiBzZWxmLnJlcXVlc3RzW25hbWVdLmxlbmd0aCkge1xuICAgICAgc2VsZi5yZXF1ZXN0c1tuYW1lXS5zaGlmdCgpLm9uU29ja2V0KHNvY2tldClcbiAgICB9IGVsc2UgaWYgKHNlbGYuc29ja2V0c1tuYW1lXS5sZW5ndGggPCBzZWxmLm1pblNvY2tldHMpIHtcbiAgICAgIGlmICghc2VsZi5mcmVlU29ja2V0c1tuYW1lXSkgc2VsZi5mcmVlU29ja2V0c1tuYW1lXSA9IFtdXG4gICAgICBzZWxmLmZyZWVTb2NrZXRzW25hbWVdLnB1c2goc29ja2V0KVxuICAgICAgXG4gICAgICAvLyBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHdlIGRvbid0IHVzZSB0aGUgc29ja2V0IGFueXdheSwgbWVoLCB0aHJvdyB0aGUgc29ja2V0IGF3YXlcbiAgICAgIHZhciBvbklkbGVFcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzb2NrZXQuZGVzdHJveSgpXG4gICAgICB9XG4gICAgICBzb2NrZXQuX29uSWRsZUVycm9yID0gb25JZGxlRXJyb3JcbiAgICAgIHNvY2tldC5vbignZXJyb3InLCBvbklkbGVFcnJvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgcmVxdWVzdHMganVzdCBkZXN0cm95IHRoZVxuICAgICAgLy8gc29ja2V0IGFuZCBpdCB3aWxsIGdldCByZW1vdmVkIGZyb20gdGhlIHBvb2wuIFRoaXNcbiAgICAgIC8vIGdldHMgdXMgb3V0IG9mIHRpbWVvdXQgaXNzdWVzIGFuZCBhbGxvd3MgdXMgdG9cbiAgICAgIC8vIGRlZmF1bHQgdG8gQ29ubmVjdGlvbjprZWVwLWFsaXZlLlxuICAgICAgc29ja2V0LmRlc3Ryb3koKVxuICAgIH1cbiAgfSlcblxufVxudXRpbC5pbmhlcml0cyhGb3JldmVyQWdlbnQsIEFnZW50KVxuXG5Gb3JldmVyQWdlbnQuZGVmYXVsdE1pblNvY2tldHMgPSA1XG5cblxuRm9yZXZlckFnZW50LnByb3RvdHlwZS5jcmVhdGVDb25uZWN0aW9uID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb25cbkZvcmV2ZXJBZ2VudC5wcm90b3R5cGUuYWRkUmVxdWVzdE5vcmV1c2UgPSBBZ2VudC5wcm90b3R5cGUuYWRkUmVxdWVzdFxuRm9yZXZlckFnZW50LnByb3RvdHlwZS5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24ocmVxLCBob3N0LCBwb3J0KSB7XG4gIHZhciBuYW1lID0gZ2V0Q29ubmVjdGlvbk5hbWUoaG9zdCwgcG9ydClcbiAgXG4gIGlmICh0eXBlb2YgaG9zdCAhPT0gJ3N0cmluZycpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGhvc3RcbiAgICBwb3J0ID0gb3B0aW9ucy5wb3J0XG4gICAgaG9zdCA9IG9wdGlvbnMuaG9zdFxuICB9XG5cbiAgaWYgKHRoaXMuZnJlZVNvY2tldHNbbmFtZV0gJiYgdGhpcy5mcmVlU29ja2V0c1tuYW1lXS5sZW5ndGggPiAwICYmICFyZXEudXNlQ2h1bmtlZEVuY29kaW5nQnlEZWZhdWx0KSB7XG4gICAgdmFyIGlkbGVTb2NrZXQgPSB0aGlzLmZyZWVTb2NrZXRzW25hbWVdLnBvcCgpXG4gICAgaWRsZVNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBpZGxlU29ja2V0Ll9vbklkbGVFcnJvcilcbiAgICBkZWxldGUgaWRsZVNvY2tldC5fb25JZGxlRXJyb3JcbiAgICByZXEuX3JldXNlZFNvY2tldCA9IHRydWVcbiAgICByZXEub25Tb2NrZXQoaWRsZVNvY2tldClcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFkZFJlcXVlc3ROb3JldXNlKHJlcSwgaG9zdCwgcG9ydClcbiAgfVxufVxuXG5Gb3JldmVyQWdlbnQucHJvdG90eXBlLnJlbW92ZVNvY2tldCA9IGZ1bmN0aW9uKHMsIG5hbWUsIGhvc3QsIHBvcnQpIHtcbiAgaWYgKHRoaXMuc29ja2V0c1tuYW1lXSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuc29ja2V0c1tuYW1lXS5pbmRleE9mKHMpXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5zb2NrZXRzW25hbWVdLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodGhpcy5zb2NrZXRzW25hbWVdICYmIHRoaXMuc29ja2V0c1tuYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBkb24ndCBsZWFrXG4gICAgZGVsZXRlIHRoaXMuc29ja2V0c1tuYW1lXVxuICAgIGRlbGV0ZSB0aGlzLnJlcXVlc3RzW25hbWVdXG4gIH1cbiAgXG4gIGlmICh0aGlzLmZyZWVTb2NrZXRzW25hbWVdKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5mcmVlU29ja2V0c1tuYW1lXS5pbmRleE9mKHMpXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5mcmVlU29ja2V0c1tuYW1lXS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICBpZiAodGhpcy5mcmVlU29ja2V0c1tuYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZnJlZVNvY2tldHNbbmFtZV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5yZXF1ZXN0c1tuYW1lXSAmJiB0aGlzLnJlcXVlc3RzW25hbWVdLmxlbmd0aCkge1xuICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyByZXF1ZXN0cyBhbmQgYSBzb2NrZXQgZ2V0cyBjbG9zZWQgYSBuZXcgb25lXG4gICAgLy8gbmVlZHMgdG8gYmUgY3JlYXRlZCB0byB0YWtlIG92ZXIgaW4gdGhlIHBvb2wgZm9yIHRoZSBvbmUgdGhhdCBjbG9zZWQuXG4gICAgdGhpcy5jcmVhdGVTb2NrZXQobmFtZSwgaG9zdCwgcG9ydCkuZW1pdCgnZnJlZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gRm9yZXZlckFnZW50U1NMIChvcHRpb25zKSB7XG4gIEZvcmV2ZXJBZ2VudC5jYWxsKHRoaXMsIG9wdGlvbnMpXG59XG51dGlsLmluaGVyaXRzKEZvcmV2ZXJBZ2VudFNTTCwgRm9yZXZlckFnZW50KVxuXG5Gb3JldmVyQWdlbnRTU0wucHJvdG90eXBlLmNyZWF0ZUNvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uU1NMXG5Gb3JldmVyQWdlbnRTU0wucHJvdG90eXBlLmFkZFJlcXVlc3ROb3JldXNlID0gQWdlbnRTU0wucHJvdG90eXBlLmFkZFJlcXVlc3RcblxuZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvblNTTCAocG9ydCwgaG9zdCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHBvcnQgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IHBvcnQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IGhvc3Q7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwb3J0ID09PSAnbnVtYmVyJykge1xuICAgIG9wdGlvbnMucG9ydCA9IHBvcnQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5ob3N0ID0gaG9zdDtcbiAgfVxuXG4gIHJldHVybiB0bHMuY29ubmVjdChvcHRpb25zKTtcbn1cbiIsICIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwgInZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG5cbmZ1bmN0aW9uIGlzU3RyZWFtIChvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHN0cmVhbS5TdHJlYW1cbn1cblxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlIChvYmopIHtcbiAgcmV0dXJuIGlzU3RyZWFtKG9iaikgJiYgdHlwZW9mIG9iai5fcmVhZCA9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouX3JlYWRhYmxlU3RhdGUgPT0gJ29iamVjdCdcbn1cblxuXG5mdW5jdGlvbiBpc1dyaXRhYmxlIChvYmopIHtcbiAgcmV0dXJuIGlzU3RyZWFtKG9iaikgJiYgdHlwZW9mIG9iai5fd3JpdGUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLl93cml0YWJsZVN0YXRlID09ICdvYmplY3QnXG59XG5cblxuZnVuY3Rpb24gaXNEdXBsZXggKG9iaikge1xuICByZXR1cm4gaXNSZWFkYWJsZShvYmopICYmIGlzV3JpdGFibGUob2JqKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzICAgICAgICAgICAgPSBpc1N0cmVhbVxubW9kdWxlLmV4cG9ydHMuaXNSZWFkYWJsZSA9IGlzUmVhZGFibGVcbm1vZHVsZS5leHBvcnRzLmlzV3JpdGFibGUgPSBpc1dyaXRhYmxlXG5tb2R1bGUuZXhwb3J0cy5pc0R1cGxleCAgID0gaXNEdXBsZXhcbiIsICJtb2R1bGUuZXhwb3J0cyAgICAgID0gaXNUeXBlZEFycmF5XG5pc1R5cGVkQXJyYXkuc3RyaWN0ID0gaXNTdHJpY3RUeXBlZEFycmF5XG5pc1R5cGVkQXJyYXkubG9vc2UgID0gaXNMb29zZVR5cGVkQXJyYXlcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xudmFyIG5hbWVzID0ge1xuICAgICdbb2JqZWN0IEludDhBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgSW50MTZBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgSW50MzJBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgVWludDhBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJzogdHJ1ZVxuICAsICdbb2JqZWN0IFVpbnQxNkFycmF5XSc6IHRydWVcbiAgLCAnW29iamVjdCBVaW50MzJBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgRmxvYXQzMkFycmF5XSc6IHRydWVcbiAgLCAnW29iamVjdCBGbG9hdDY0QXJyYXldJzogdHJ1ZVxufVxuXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkoYXJyKSB7XG4gIHJldHVybiAoXG4gICAgICAgaXNTdHJpY3RUeXBlZEFycmF5KGFycilcbiAgICB8fCBpc0xvb3NlVHlwZWRBcnJheShhcnIpXG4gIClcbn1cblxuZnVuY3Rpb24gaXNTdHJpY3RUeXBlZEFycmF5KGFycikge1xuICByZXR1cm4gKFxuICAgICAgIGFyciBpbnN0YW5jZW9mIEludDhBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIEludDE2QXJyYXlcbiAgICB8fCBhcnIgaW5zdGFuY2VvZiBJbnQzMkFycmF5XG4gICAgfHwgYXJyIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5XG4gICAgfHwgYXJyIGluc3RhbmNlb2YgVWludDE2QXJyYXlcbiAgICB8fCBhcnIgaW5zdGFuY2VvZiBVaW50MzJBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheVxuICApXG59XG5cbmZ1bmN0aW9uIGlzTG9vc2VUeXBlZEFycmF5KGFycikge1xuICByZXR1cm4gbmFtZXNbdG9TdHJpbmcuY2FsbChhcnIpXVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBmb3JtYXRIb3N0bmFtZSAoaG9zdG5hbWUpIHtcbiAgLy8gY2Fub25pY2FsaXplIHRoZSBob3N0bmFtZSwgc28gdGhhdCAnb29nbGUuY29tJyB3b24ndCBtYXRjaCAnZ29vZ2xlLmNvbSdcbiAgcmV0dXJuIGhvc3RuYW1lLnJlcGxhY2UoL15cXC4qLywgJy4nKS50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9Qcm94eVpvbmUgKHpvbmUpIHtcbiAgem9uZSA9IHpvbmUudHJpbSgpLnRvTG93ZXJDYXNlKClcblxuICB2YXIgem9uZVBhcnRzID0gem9uZS5zcGxpdCgnOicsIDIpXG4gIHZhciB6b25lSG9zdCA9IGZvcm1hdEhvc3RuYW1lKHpvbmVQYXJ0c1swXSlcbiAgdmFyIHpvbmVQb3J0ID0gem9uZVBhcnRzWzFdXG4gIHZhciBoYXNQb3J0ID0gem9uZS5pbmRleE9mKCc6JykgPiAtMVxuXG4gIHJldHVybiB7aG9zdG5hbWU6IHpvbmVIb3N0LCBwb3J0OiB6b25lUG9ydCwgaGFzUG9ydDogaGFzUG9ydH1cbn1cblxuZnVuY3Rpb24gdXJpSW5Ob1Byb3h5ICh1cmksIG5vUHJveHkpIHtcbiAgdmFyIHBvcnQgPSB1cmkucG9ydCB8fCAodXJpLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICc0NDMnIDogJzgwJylcbiAgdmFyIGhvc3RuYW1lID0gZm9ybWF0SG9zdG5hbWUodXJpLmhvc3RuYW1lKVxuICB2YXIgbm9Qcm94eUxpc3QgPSBub1Byb3h5LnNwbGl0KCcsJylcblxuICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIG5vUHJveHlMaXN0IHVudGlsIGl0IGZpbmRzIGEgbWF0Y2guXG4gIHJldHVybiBub1Byb3h5TGlzdC5tYXAocGFyc2VOb1Byb3h5Wm9uZSkuc29tZShmdW5jdGlvbiAobm9Qcm94eVpvbmUpIHtcbiAgICB2YXIgaXNNYXRjaGVkQXQgPSBob3N0bmFtZS5pbmRleE9mKG5vUHJveHlab25lLmhvc3RuYW1lKVxuICAgIHZhciBob3N0bmFtZU1hdGNoZWQgPSAoXG4gICAgICBpc01hdGNoZWRBdCA+IC0xICYmXG4gICAgICAgIChpc01hdGNoZWRBdCA9PT0gaG9zdG5hbWUubGVuZ3RoIC0gbm9Qcm94eVpvbmUuaG9zdG5hbWUubGVuZ3RoKVxuICAgIClcblxuICAgIGlmIChub1Byb3h5Wm9uZS5oYXNQb3J0KSB7XG4gICAgICByZXR1cm4gKHBvcnQgPT09IG5vUHJveHlab25lLnBvcnQpICYmIGhvc3RuYW1lTWF0Y2hlZFxuICAgIH1cblxuICAgIHJldHVybiBob3N0bmFtZU1hdGNoZWRcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0UHJveHlGcm9tVVJJICh1cmkpIHtcbiAgLy8gRGVjaWRlIHRoZSBwcm9wZXIgcmVxdWVzdCBwcm94eSB0byB1c2UgYmFzZWQgb24gdGhlIHJlcXVlc3QgVVJJIG9iamVjdCBhbmQgdGhlXG4gIC8vIGVudmlyb25tZW50YWwgdmFyaWFibGVzIChOT19QUk9YWSwgSFRUUF9QUk9YWSwgZXRjLilcbiAgLy8gcmVzcGVjdCBOT19QUk9YWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKHNlZTogaHR0cHM6Ly9seW54LmludmlzaWJsZS1pc2xhbmQubmV0L2x5bngyLjguNy9icmVha291dC9seW54X2hlbHAva2V5c3Ryb2tlcy9lbnZpcm9ubWVudHMuaHRtbClcblxuICB2YXIgbm9Qcm94eSA9IHByb2Nlc3MuZW52Lk5PX1BST1hZIHx8IHByb2Nlc3MuZW52Lm5vX3Byb3h5IHx8ICcnXG5cbiAgLy8gaWYgdGhlIG5vUHJveHkgaXMgYSB3aWxkY2FyZCB0aGVuIHJldHVybiBudWxsXG5cbiAgaWYgKG5vUHJveHkgPT09ICcqJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBpZiB0aGUgbm9Qcm94eSBpcyBub3QgZW1wdHkgYW5kIHRoZSB1cmkgaXMgZm91bmQgcmV0dXJuIG51bGxcblxuICBpZiAobm9Qcm94eSAhPT0gJycgJiYgdXJpSW5Ob1Byb3h5KHVyaSwgbm9Qcm94eSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIEhUVFAgb3IgSFRUUFMgUHJveHkgaW4gZW52aXJvbm1lbnQgRWxzZSBkZWZhdWx0IHRvIG51bGxcblxuICBpZiAodXJpLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkhUVFBfUFJPWFkgfHxcbiAgICAgIHByb2Nlc3MuZW52Lmh0dHBfcHJveHkgfHwgbnVsbFxuICB9XG5cbiAgaWYgKHVyaS5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuSFRUUFNfUFJPWFkgfHxcbiAgICAgIHByb2Nlc3MuZW52Lmh0dHBzX3Byb3h5IHx8XG4gICAgICBwcm9jZXNzLmVudi5IVFRQX1BST1hZIHx8XG4gICAgICBwcm9jZXNzLmVudi5odHRwX3Byb3h5IHx8IG51bGxcbiAgfVxuXG4gIC8vIGlmIG5vbmUgb2YgdGhhdCB3b3JrcywgcmV0dXJuIG51bGxcbiAgLy8gKFdoYXQgdXJpIHByb3RvY29sIGFyZSB5b3UgdXNpbmcgdGhlbj8pXG5cbiAgcmV0dXJuIG51bGxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm94eUZyb21VUklcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgdmFyIG9iajtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBhcnJheVRvT2JqZWN0ID0gZnVuY3Rpb24gYXJyYXlUb09iamVjdChzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0gb3B0aW9ucyAmJiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtpXSA9IHNvdXJjZVtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgbWVyZ2UgPSBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSkgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFt0YXJnZXRdLmNvbmNhdChzb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZVRhcmdldCA9IHRhcmdldDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmICFBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgbWVyZ2VUYXJnZXQgPSBhcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgIGlmIChoYXMuY2FsbCh0YXJnZXQsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEl0ZW0gPSB0YXJnZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0gJiYgdHlwZW9mIHRhcmdldEl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldEl0ZW0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxudmFyIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxudmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0ci5yZXBsYWNlKC9cXCsvZywgJyAnKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbn07XG5cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyKSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHN0ciA6IFN0cmluZyhzdHIpO1xuXG4gICAgdmFyIG91dCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYyA9PT0gMHgyRCAvLyAtXG4gICAgICAgICAgICB8fCBjID09PSAweDJFIC8vIC5cbiAgICAgICAgICAgIHx8IGMgPT09IDB4NUYgLy8gX1xuICAgICAgICAgICAgfHwgYyA9PT0gMHg3RSAvLyB+XG4gICAgICAgICAgICB8fCAoYyA+PSAweDMwICYmIGMgPD0gMHgzOSkgLy8gMC05XG4gICAgICAgICAgICB8fCAoYyA+PSAweDQxICYmIGMgPD0gMHg1QSkgLy8gYS16XG4gICAgICAgICAgICB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg3QSkgLy8gQS1aXG4gICAgICAgICkge1xuICAgICAgICAgICAgb3V0ICs9IHN0cmluZy5jaGFyQXQoaSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgaGV4VGFibGVbY107XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIChoZXhUYWJsZVsweEMwIHwgKGMgPj4gNildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweEQ4MDAgfHwgYyA+PSAweEUwMDApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIChoZXhUYWJsZVsweEUwIHwgKGMgPj4gMTIpXSArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpICs9IDE7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKCgoYyAmIDB4M0ZGKSA8PCAxMCkgfCAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweDNGRikpO1xuICAgICAgICAvKiBlc2xpbnQgb3BlcmF0b3ItbGluZWJyZWFrOiBbMiwgXCJiZWZvcmVcIl0gKi9cbiAgICAgICAgb3V0ICs9IGhleFRhYmxlWzB4RjAgfCAoYyA+PiAxOCldXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG52YXIgY29tcGFjdCA9IGZ1bmN0aW9uIGNvbXBhY3QodmFsdWUpIHtcbiAgICB2YXIgcXVldWUgPSBbeyBvYmo6IHsgbzogdmFsdWUgfSwgcHJvcDogJ28nIH1dO1xuICAgIHZhciByZWZzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWVbaV07XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgcmVmcy5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaCh7IG9iajogb2JqLCBwcm9wOiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGFjdFF1ZXVlKHF1ZXVlKTtcbn07XG5cbnZhciBpc1JlZ0V4cCA9IGZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG52YXIgaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbXBhY3Q6IGNvbXBhY3QsXG4gICAgZGVjb2RlOiBkZWNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICAgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICBtZXJnZTogbWVyZ2Vcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdkZWZhdWx0JzogJ1JGQzM5ODYnLFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFJGQzE3Mzg6ICdSRkMxNzM4JyxcbiAgICBSRkMzOTg2OiAnUkZDMzk4Nidcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG52YXIgYXJyYXlQcmVmaXhHZW5lcmF0b3JzID0ge1xuICAgIGJyYWNrZXRzOiBmdW5jdGlvbiBicmFja2V0cyhwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbXSc7XG4gICAgfSxcbiAgICBpbmRpY2VzOiBmdW5jdGlvbiBpbmRpY2VzKHByZWZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnWycgKyBrZXkgKyAnXSc7XG4gICAgfSxcbiAgICByZXBlYXQ6IGZ1bmN0aW9uIHJlcGVhdChwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBzZXJpYWxpemVEYXRlOiBmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSk7XG4gICAgfSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seVxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmogPSBmaWx0ZXIocHJlZml4LCBvYmopO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBvYmogPSBzZXJpYWxpemVEYXRlKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyKSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlcikpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgocHJlZml4LCBrZXkpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIHByZWZpeCArIChhbGxvd0RvdHMgPyAnLicgKyBrZXkgOiAnWycgKyBrZXkgKyAnXScpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdHMpIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIHZhciBvcHRpb25zID0gb3B0cyA/IHV0aWxzLmFzc2lnbih7fSwgb3B0cykgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmVuY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMuZW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBkZWxpbWl0ZXIgPSB0eXBlb2Ygb3B0aW9ucy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0aW9ucy5kZWxpbWl0ZXI7XG4gICAgdmFyIHN0cmljdE51bGxIYW5kbGluZyA9IHR5cGVvZiBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmc7XG4gICAgdmFyIHNraXBOdWxscyA9IHR5cGVvZiBvcHRpb25zLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHM7XG4gICAgdmFyIGVuY29kZSA9IHR5cGVvZiBvcHRpb25zLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGU7XG4gICAgdmFyIGVuY29kZXIgPSB0eXBlb2Ygb3B0aW9ucy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcjtcbiAgICB2YXIgc29ydCA9IHR5cGVvZiBvcHRpb25zLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnNvcnQgOiBudWxsO1xuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiBvcHRpb25zLmFsbG93RG90cztcbiAgICB2YXIgc2VyaWFsaXplRGF0ZSA9IHR5cGVvZiBvcHRpb25zLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlO1xuICAgIHZhciBlbmNvZGVWYWx1ZXNPbmx5ID0gdHlwZW9mIG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zLmZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbiAgICB9IGVsc2UgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRpb25zLmZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW29wdGlvbnMuZm9ybWF0XTtcbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0aW9ucy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9ICdpbmRpY2VzJztcbiAgICB9XG5cbiAgICB2YXIgZ2VuZXJhdGVBcnJheVByZWZpeCA9IGFycmF5UHJlZml4R2VuZXJhdG9yc1thcnJheUZvcm1hdF07XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KHNvcnQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwdXNoVG9BcnJheShrZXlzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICBlbmNvZGUgPyBlbmNvZGVyIDogbnVsbCxcbiAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKGRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93UHJvdG90eXBlczogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHBsYWluT2JqZWN0czogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIHBhcnNlVmFsdWVzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyhzdHIsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0ge307XG4gICAgdmFyIGNsZWFuU3RyID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA/IHN0ci5yZXBsYWNlKC9eXFw/LywgJycpIDogc3RyO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyKTtcbiAgICAgICAgICAgIHZhbCA9IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID8gbnVsbCA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UoMCwgcG9zKSwgZGVmYXVsdHMuZGVjb2Rlcik7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZShwb3MgKyAxKSwgZGVmYXVsdHMuZGVjb2Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhcy5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBbXS5jb25jYXQob2JqW2tleV0pLmNvbmNhdCh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIHBhcnNlT2JqZWN0ID0gZnVuY3Rpb24gKGNoYWluLCB2YWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgbGVhZiA9IHZhbDtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoY2xlYW5Sb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgY2xlYW5Sb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbGVhblJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2NsZWFuUm9vdF0gPSBsZWFmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGVhZiA9IG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVhZjtcbn07XG5cbnZhciBwYXJzZUtleXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nS2V5cyhnaXZlbktleSwgdmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKCFnaXZlbktleSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGRvdCBub3RhdGlvbiB0byBicmFja2V0IG5vdGF0aW9uXG4gICAgdmFyIGtleSA9IG9wdGlvbnMuYWxsb3dEb3RzID8gZ2l2ZW5LZXkucmVwbGFjZSgvXFwuKFteLltdKykvZywgJ1skMV0nKSA6IGdpdmVuS2V5O1xuXG4gICAgLy8gVGhlIHJlZ2V4IGNodW5rc1xuXG4gICAgdmFyIGJyYWNrZXRzID0gLyhcXFtbXltcXF1dKl0pLztcbiAgICB2YXIgY2hpbGQgPSAvKFxcW1teW1xcXV0qXSkvZztcblxuICAgIC8vIEdldCB0aGUgcGFyZW50XG5cbiAgICB2YXIgc2VnbWVudCA9IGJyYWNrZXRzLmV4ZWMoa2V5KTtcbiAgICB2YXIgcGFyZW50ID0gc2VnbWVudCA/IGtleS5zbGljZSgwLCBzZWdtZW50LmluZGV4KSA6IGtleTtcblxuICAgIC8vIFN0YXNoIHRoZSBwYXJlbnQgaWYgaXQgZXhpc3RzXG5cbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIHBsYWluIG9iamVjdHMsIG9wdGlvbmFsbHkgcHJlZml4IGtleXNcbiAgICAgICAgLy8gdGhhdCB3b3VsZCBvdmVyd3JpdGUgb2JqZWN0IHByb3RvdHlwZSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgcGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMucHVzaChwYXJlbnQpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZHJlbiBhcHBlbmRpbmcgdG8gdGhlIGFycmF5IHVudGlsIHdlIGhpdCBkZXB0aFxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlICgoc2VnbWVudCA9IGNoaWxkLmV4ZWMoa2V5KSkgIT09IG51bGwgJiYgaSA8IG9wdGlvbnMuZGVwdGgpIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNlZ21lbnRbMV0uc2xpY2UoMSwgLTEpKSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goc2VnbWVudFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBhIHJlbWFpbmRlciwganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG9wdHMgPyB1dGlscy5hc3NpZ24oe30sIG9wdHMpIDoge307XG5cbiAgICBpZiAob3B0aW9ucy5kZWNvZGVyICE9PSBudWxsICYmIG9wdGlvbnMuZGVjb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZTtcbiAgICBvcHRpb25zLmRlbGltaXRlciA9IHR5cGVvZiBvcHRpb25zLmRlbGltaXRlciA9PT0gJ3N0cmluZycgfHwgdXRpbHMuaXNSZWdFeHAob3B0aW9ucy5kZWxpbWl0ZXIpID8gb3B0aW9ucy5kZWxpbWl0ZXIgOiBkZWZhdWx0cy5kZWxpbWl0ZXI7XG4gICAgb3B0aW9ucy5kZXB0aCA9IHR5cGVvZiBvcHRpb25zLmRlcHRoID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuZGVwdGggOiBkZWZhdWx0cy5kZXB0aDtcbiAgICBvcHRpb25zLmFycmF5TGltaXQgPSB0eXBlb2Ygb3B0aW9ucy5hcnJheUxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuYXJyYXlMaW1pdCA6IGRlZmF1bHRzLmFycmF5TGltaXQ7XG4gICAgb3B0aW9ucy5wYXJzZUFycmF5cyA9IG9wdGlvbnMucGFyc2VBcnJheXMgIT09IGZhbHNlO1xuICAgIG9wdGlvbnMuZGVjb2RlciA9IHR5cGVvZiBvcHRpb25zLmRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmRlY29kZXIgOiBkZWZhdWx0cy5kZWNvZGVyO1xuICAgIG9wdGlvbnMuYWxsb3dEb3RzID0gdHlwZW9mIG9wdGlvbnMuYWxsb3dEb3RzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmFsbG93RG90cyA6IGRlZmF1bHRzLmFsbG93RG90cztcbiAgICBvcHRpb25zLnBsYWluT2JqZWN0cyA9IHR5cGVvZiBvcHRpb25zLnBsYWluT2JqZWN0cyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5wbGFpbk9iamVjdHMgOiBkZWZhdWx0cy5wbGFpbk9iamVjdHM7XG4gICAgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzO1xuICAgIG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPSB0eXBlb2Ygb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRpb25zLnBhcmFtZXRlckxpbWl0IDogZGVmYXVsdHMucGFyYW1ldGVyTGltaXQ7XG4gICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPSB0eXBlb2Ygb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucyk7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1lcmdlKG9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBxcyA9IHJlcXVpcmUoJ3FzJylcbnZhciBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJylcblxuZnVuY3Rpb24gUXVlcnlzdHJpbmcgKHJlcXVlc3QpIHtcbiAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICB0aGlzLmxpYiA9IG51bGxcbiAgdGhpcy51c2VRdWVyeXN0cmluZyA9IG51bGxcbiAgdGhpcy5wYXJzZU9wdGlvbnMgPSBudWxsXG4gIHRoaXMuc3RyaW5naWZ5T3B0aW9ucyA9IG51bGxcbn1cblxuUXVlcnlzdHJpbmcucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAodGhpcy5saWIpIHsgcmV0dXJuIH1cblxuICB0aGlzLnVzZVF1ZXJ5c3RyaW5nID0gb3B0aW9ucy51c2VRdWVyeXN0cmluZ1xuICB0aGlzLmxpYiA9ICh0aGlzLnVzZVF1ZXJ5c3RyaW5nID8gcXVlcnlzdHJpbmcgOiBxcylcblxuICB0aGlzLnBhcnNlT3B0aW9ucyA9IG9wdGlvbnMucXNQYXJzZU9wdGlvbnMgfHwge31cbiAgdGhpcy5zdHJpbmdpZnlPcHRpb25zID0gb3B0aW9ucy5xc1N0cmluZ2lmeU9wdGlvbnMgfHwge31cbn1cblxuUXVlcnlzdHJpbmcucHJvdG90eXBlLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuICh0aGlzLnVzZVF1ZXJ5c3RyaW5nKVxuICAgID8gdGhpcy5yZmMzOTg2KHRoaXMubGliLnN0cmluZ2lmeShvYmosXG4gICAgICB0aGlzLnN0cmluZ2lmeU9wdGlvbnMuc2VwIHx8IG51bGwsXG4gICAgICB0aGlzLnN0cmluZ2lmeU9wdGlvbnMuZXEgfHwgbnVsbCxcbiAgICAgIHRoaXMuc3RyaW5naWZ5T3B0aW9ucykpXG4gICAgOiB0aGlzLmxpYi5zdHJpbmdpZnkob2JqLCB0aGlzLnN0cmluZ2lmeU9wdGlvbnMpXG59XG5cblF1ZXJ5c3RyaW5nLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuICh0aGlzLnVzZVF1ZXJ5c3RyaW5nKVxuICAgID8gdGhpcy5saWIucGFyc2Uoc3RyLFxuICAgICAgdGhpcy5wYXJzZU9wdGlvbnMuc2VwIHx8IG51bGwsXG4gICAgICB0aGlzLnBhcnNlT3B0aW9ucy5lcSB8fCBudWxsLFxuICAgICAgdGhpcy5wYXJzZU9wdGlvbnMpXG4gICAgOiB0aGlzLmxpYi5wYXJzZShzdHIsIHRoaXMucGFyc2VPcHRpb25zKVxufVxuXG5RdWVyeXN0cmluZy5wcm90b3R5cGUucmZjMzk4NiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG5RdWVyeXN0cmluZy5wcm90b3R5cGUudW5lc2NhcGUgPSBxdWVyeXN0cmluZy51bmVzY2FwZVxuXG5leHBvcnRzLlF1ZXJ5c3RyaW5nID0gUXVlcnlzdHJpbmdcbiIsICJpbXBvcnQgeyBTQ0hFTUVTIH0gZnJvbSBcIi4vdXJpXCI7XG5cbmltcG9ydCBodHRwIGZyb20gXCIuL3NjaGVtZXMvaHR0cFwiO1xuU0NIRU1FU1todHRwLnNjaGVtZV0gPSBodHRwO1xuXG5pbXBvcnQgaHR0cHMgZnJvbSBcIi4vc2NoZW1lcy9odHRwc1wiO1xuU0NIRU1FU1todHRwcy5zY2hlbWVdID0gaHR0cHM7XG5cbmltcG9ydCB3cyBmcm9tIFwiLi9zY2hlbWVzL3dzXCI7XG5TQ0hFTUVTW3dzLnNjaGVtZV0gPSB3cztcblxuaW1wb3J0IHdzcyBmcm9tIFwiLi9zY2hlbWVzL3dzc1wiO1xuU0NIRU1FU1t3c3Muc2NoZW1lXSA9IHdzcztcblxuaW1wb3J0IG1haWx0byBmcm9tIFwiLi9zY2hlbWVzL21haWx0b1wiO1xuU0NIRU1FU1ttYWlsdG8uc2NoZW1lXSA9IG1haWx0bztcblxuaW1wb3J0IHVybiBmcm9tIFwiLi9zY2hlbWVzL3VyblwiO1xuU0NIRU1FU1t1cm4uc2NoZW1lXSA9IHVybjtcblxuaW1wb3J0IHV1aWQgZnJvbSBcIi4vc2NoZW1lcy91cm4tdXVpZFwiO1xuU0NIRU1FU1t1dWlkLnNjaGVtZV0gPSB1dWlkO1xuXG5leHBvcnQgKiBmcm9tIFwiLi91cmlcIjtcbiIsICJpbXBvcnQgeyBVUklTY2hlbWVIYW5kbGVyLCBVUklDb21wb25lbnRzLCBVUklPcHRpb25zIH0gZnJvbSBcIi4uL3VyaVwiO1xuaW1wb3J0IHsgVVJOQ29tcG9uZW50cyB9IGZyb20gXCIuL3VyblwiO1xuaW1wb3J0IHsgU0NIRU1FUyB9IGZyb20gXCIuLi91cmlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVVUlEQ29tcG9uZW50cyBleHRlbmRzIFVSTkNvbXBvbmVudHMge1xuXHR1dWlkPzogc3RyaW5nO1xufVxuXG5jb25zdCBVVUlEID0gL15bMC05QS1GYS1mXXs4fSg/OlxcLVswLTlBLUZhLWZdezR9KXszfVxcLVswLTlBLUZhLWZdezEyfSQvO1xuY29uc3QgVVVJRF9QQVJTRSA9IC9eWzAtOUEtRmEtZlxcLV17MzZ9LztcblxuLy9SRkMgNDEyMlxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyPFVVSURDb21wb25lbnRzLCBVUklPcHRpb25zLCBVUk5Db21wb25lbnRzPiA9IHtcblx0c2NoZW1lIDogXCJ1cm46dXVpZFwiLFxuXG5cdHBhcnNlIDogZnVuY3Rpb24gKHVybkNvbXBvbmVudHM6VVJOQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zKTpVVUlEQ29tcG9uZW50cyB7XG5cdFx0Y29uc3QgdXVpZENvbXBvbmVudHMgPSB1cm5Db21wb25lbnRzIGFzIFVVSURDb21wb25lbnRzO1xuXHRcdHV1aWRDb21wb25lbnRzLnV1aWQgPSB1dWlkQ29tcG9uZW50cy5uc3M7XG5cdFx0dXVpZENvbXBvbmVudHMubnNzID0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCFvcHRpb25zLnRvbGVyYW50ICYmICghdXVpZENvbXBvbmVudHMudXVpZCB8fCAhdXVpZENvbXBvbmVudHMudXVpZC5tYXRjaChVVUlEKSkpIHtcblx0XHRcdHV1aWRDb21wb25lbnRzLmVycm9yID0gdXVpZENvbXBvbmVudHMuZXJyb3IgfHwgXCJVVUlEIGlzIG5vdCB2YWxpZC5cIjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdXVpZENvbXBvbmVudHM7XG5cdH0sXG5cblx0c2VyaWFsaXplIDogZnVuY3Rpb24gKHV1aWRDb21wb25lbnRzOlVVSURDb21wb25lbnRzLCBvcHRpb25zOlVSSU9wdGlvbnMpOlVSTkNvbXBvbmVudHMge1xuXHRcdGNvbnN0IHVybkNvbXBvbmVudHMgPSB1dWlkQ29tcG9uZW50cyBhcyBVUk5Db21wb25lbnRzO1xuXHRcdC8vbm9ybWFsaXplIFVVSURcblx0XHR1cm5Db21wb25lbnRzLm5zcyA9ICh1dWlkQ29tcG9uZW50cy51dWlkIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIHVybkNvbXBvbmVudHM7XG5cdH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBoYW5kbGVyOyIsICJpbXBvcnQgeyBVUklTY2hlbWVIYW5kbGVyLCBVUklDb21wb25lbnRzLCBVUklPcHRpb25zIH0gZnJvbSBcIi4uL3VyaVwiO1xuaW1wb3J0IHsgcGN0RW5jQ2hhciwgU0NIRU1FUyB9IGZyb20gXCIuLi91cmlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVUk5Db21wb25lbnRzIGV4dGVuZHMgVVJJQ29tcG9uZW50cyB7XG5cdG5pZD86c3RyaW5nO1xuXHRuc3M/OnN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVUk5PcHRpb25zIGV4dGVuZHMgVVJJT3B0aW9ucyB7XG5cdG5pZD86c3RyaW5nO1xufVxuXG5jb25zdCBOSUQkID0gXCIoPzpbMC05QS1aYS16XVswLTlBLVphLXpcXFxcLV17MSwzMX0pXCI7XG5jb25zdCBQQ1RfRU5DT0RFRCQgPSBcIig/OlxcXFwlWzAtOUEtRmEtZl17Mn0pXCI7XG5jb25zdCBUUkFOUyQkID0gXCJbMC05QS1aYS16XFxcXChcXFxcKVxcXFwrXFxcXCxcXFxcLVxcXFwuXFxcXDpcXFxcPVxcXFxAXFxcXDtcXFxcJFxcXFxfXFxcXCFcXFxcKlxcXFwnXFxcXC9cXFxcP1xcXFwjXVwiO1xuY29uc3QgTlNTJCA9IFwiKD86KD86XCIgKyBQQ1RfRU5DT0RFRCQgKyBcInxcIiArIFRSQU5TJCQgKyBcIikrKVwiO1xuY29uc3QgVVJOX1NDSEVNRSA9IG5ldyBSZWdFeHAoXCJedXJuXFxcXDooXCIgKyBOSUQkICsgXCIpJFwiKTtcbmNvbnN0IFVSTl9QQVRIID0gbmV3IFJlZ0V4cChcIl4oXCIgKyBOSUQkICsgXCIpXFxcXDooXCIgKyBOU1MkICsgXCIpJFwiKTtcbmNvbnN0IFVSTl9QQVJTRSA9IC9eKFteXFw6XSspXFw6KC4qKS87XG5jb25zdCBVUk5fRVhDTFVERUQgPSAvW1xceDAwLVxceDIwXFxcXFxcXCJcXCZcXDxcXD5cXFtcXF1cXF5cXGBcXHtcXHxcXH1cXH5cXHg3Ri1cXHhGRl0vZztcblxuLy9SRkMgMjE0MVxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyPFVSTkNvbXBvbmVudHMsVVJOT3B0aW9ucz4gPSB7XG5cdHNjaGVtZSA6IFwidXJuXCIsXG5cblx0cGFyc2UgOiBmdW5jdGlvbiAoY29tcG9uZW50czpVUklDb21wb25lbnRzLCBvcHRpb25zOlVSTk9wdGlvbnMpOlVSTkNvbXBvbmVudHMge1xuXHRcdGNvbnN0IG1hdGNoZXMgPSBjb21wb25lbnRzLnBhdGggJiYgY29tcG9uZW50cy5wYXRoLm1hdGNoKFVSTl9QQVJTRSk7XG5cdFx0bGV0IHVybkNvbXBvbmVudHMgPSBjb21wb25lbnRzIGFzIFVSTkNvbXBvbmVudHM7XG5cblx0XHRpZiAobWF0Y2hlcykge1xuXHRcdFx0Y29uc3Qgc2NoZW1lID0gb3B0aW9ucy5zY2hlbWUgfHwgdXJuQ29tcG9uZW50cy5zY2hlbWUgfHwgXCJ1cm5cIjtcblx0XHRcdGNvbnN0IG5pZCA9IG1hdGNoZXNbMV0udG9Mb3dlckNhc2UoKTtcblx0XHRcdGNvbnN0IG5zcyA9IG1hdGNoZXNbMl07XG5cdFx0XHRjb25zdCB1cm5TY2hlbWUgPSBgJHtzY2hlbWV9OiR7b3B0aW9ucy5uaWQgfHwgbmlkfWA7XG5cdFx0XHRjb25zdCBzY2hlbWVIYW5kbGVyID0gU0NIRU1FU1t1cm5TY2hlbWVdO1xuXG5cdFx0XHR1cm5Db21wb25lbnRzLm5pZCA9IG5pZDtcblx0XHRcdHVybkNvbXBvbmVudHMubnNzID0gbnNzO1xuXHRcdFx0dXJuQ29tcG9uZW50cy5wYXRoID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoc2NoZW1lSGFuZGxlcikge1xuXHRcdFx0XHR1cm5Db21wb25lbnRzID0gc2NoZW1lSGFuZGxlci5wYXJzZSh1cm5Db21wb25lbnRzLCBvcHRpb25zKSBhcyBVUk5Db21wb25lbnRzO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR1cm5Db21wb25lbnRzLmVycm9yID0gdXJuQ29tcG9uZW50cy5lcnJvciB8fCBcIlVSTiBjYW4gbm90IGJlIHBhcnNlZC5cIjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdXJuQ29tcG9uZW50cztcblx0fSxcblxuXHRzZXJpYWxpemUgOiBmdW5jdGlvbiAodXJuQ29tcG9uZW50czpVUk5Db21wb25lbnRzLCBvcHRpb25zOlVSTk9wdGlvbnMpOlVSSUNvbXBvbmVudHMge1xuXHRcdGNvbnN0IHNjaGVtZSA9IG9wdGlvbnMuc2NoZW1lIHx8IHVybkNvbXBvbmVudHMuc2NoZW1lIHx8IFwidXJuXCI7XG5cdFx0Y29uc3QgbmlkID0gdXJuQ29tcG9uZW50cy5uaWQ7XG5cdFx0Y29uc3QgdXJuU2NoZW1lID0gYCR7c2NoZW1lfToke29wdGlvbnMubmlkIHx8IG5pZH1gO1xuXHRcdGNvbnN0IHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTW3VyblNjaGVtZV07XG5cblx0XHRpZiAoc2NoZW1lSGFuZGxlcikge1xuXHRcdFx0dXJuQ29tcG9uZW50cyA9IHNjaGVtZUhhbmRsZXIuc2VyaWFsaXplKHVybkNvbXBvbmVudHMsIG9wdGlvbnMpIGFzIFVSTkNvbXBvbmVudHM7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdXJpQ29tcG9uZW50cyA9IHVybkNvbXBvbmVudHMgYXMgVVJJQ29tcG9uZW50cztcblx0XHRjb25zdCBuc3MgPSB1cm5Db21wb25lbnRzLm5zcztcblx0XHR1cmlDb21wb25lbnRzLnBhdGggPSBgJHtuaWQgfHwgb3B0aW9ucy5uaWR9OiR7bnNzfWA7XG5cblx0XHRyZXR1cm4gdXJpQ29tcG9uZW50cztcblx0fSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZXI7IiwgImltcG9ydCB7IFVSSVNjaGVtZUhhbmRsZXIsIFVSSUNvbXBvbmVudHMsIFVSSU9wdGlvbnMgfSBmcm9tIFwiLi4vdXJpXCI7XG5pbXBvcnQgeyBwY3RFbmNDaGFyLCBwY3REZWNDaGFycywgdW5lc2NhcGVDb21wb25lbnQgfSBmcm9tIFwiLi4vdXJpXCI7XG5pbXBvcnQgcHVueWNvZGUgZnJvbSBcInB1bnljb2RlXCI7XG5pbXBvcnQgeyBtZXJnZSwgc3ViZXhwLCB0b1VwcGVyQ2FzZSwgdG9BcnJheSB9IGZyb20gXCIuLi91dGlsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFpbHRvSGVhZGVycyB7XG5cdFtoZm5hbWU6c3RyaW5nXTpzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYWlsdG9Db21wb25lbnRzIGV4dGVuZHMgVVJJQ29tcG9uZW50cyB7XG5cdHRvOkFycmF5PHN0cmluZz4sXG5cdGhlYWRlcnM/Ok1haWx0b0hlYWRlcnMsXG5cdHN1YmplY3Q/OnN0cmluZyxcblx0Ym9keT86c3RyaW5nXG59XG5cbmNvbnN0IE86TWFpbHRvSGVhZGVycyA9IHt9O1xuY29uc3QgaXNJUkkgPSB0cnVlO1xuXG4vL1JGQyAzOTg2XG5jb25zdCBVTlJFU0VSVkVEJCQgPSBcIltBLVphLXowLTlcXFxcLVxcXFwuXFxcXF9cXFxcflwiICsgKGlzSVJJID8gXCJcXFxceEEwLVxcXFx1MjAwRFxcXFx1MjAxMC1cXFxcdTIwMjlcXFxcdTIwMkYtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRUZcIiA6IFwiXCIpICsgXCJdXCI7XG5jb25zdCBIRVhESUckJCA9IFwiWzAtOUEtRmEtZl1cIjsgIC8vY2FzZS1pbnNlbnNpdGl2ZVxuY29uc3QgUENUX0VOQ09ERUQkID0gc3ViZXhwKHN1YmV4cChcIiVbRUZlZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVs4OUEtRmEtZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVwiICsgSEVYRElHJCQgKyBIRVhESUckJCkpOyAgLy9leHBhbmRlZFxuXG4vL1JGQyA1MzIyLCBleGNlcHQgdGhlc2Ugc3ltYm9scyBhcyBwZXIgUkZDIDYwNjg6IEAgOiAvID8gIyBbIF0gJiA7ID1cbi8vY29uc3QgQVRFWFQkJCA9IFwiW0EtWmEtejAtOVxcXFwhXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcJ1xcXFwqXFxcXCtcXFxcLVxcXFwvXFxcXD1cXFxcP1xcXFxeXFxcXF9cXFxcYFxcXFx7XFxcXHxcXFxcfVxcXFx+XVwiO1xuLy9jb25zdCBXU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiO1xuLy9jb25zdCBPQlNfUVRFWFQkJCA9IFwiW1xcXFx4MDEtXFxcXHgwOFxcXFx4MEJcXFxceDBDXFxcXHgwRS1cXFxceDFGXFxcXHg3Rl1cIjsgIC8vKCVkMS04IC8gJWQxMS0xMiAvICVkMTQtMzEgLyAlZDEyNylcbi8vY29uc3QgUVRFWFQkJCA9IG1lcmdlKFwiW1xcXFx4MjFcXFxceDIzLVxcXFx4NUJcXFxceDVELVxcXFx4N0VdXCIsIE9CU19RVEVYVCQkKTsgIC8vJWQzMyAvICVkMzUtOTEgLyAlZDkzLTEyNiAvIG9icy1xdGV4dFxuLy9jb25zdCBWQ0hBUiQkID0gXCJbXFxcXHgyMS1cXFxceDdFXVwiO1xuLy9jb25zdCBXU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiO1xuLy9jb25zdCBPQlNfUVAkID0gc3ViZXhwKFwiXFxcXFxcXFxcIiArIG1lcmdlKFwiW1xcXFx4MDBcXFxceDBEXFxcXHgwQV1cIiwgT0JTX1FURVhUJCQpKTsgIC8vJWQwIC8gQ1IgLyBMRiAvIG9icy1xdGV4dFxuLy9jb25zdCBGV1MkID0gc3ViZXhwKHN1YmV4cChXU1AkJCArIFwiKlwiICsgXCJcXFxceDBEXFxcXHgwQVwiKSArIFwiP1wiICsgV1NQJCQgKyBcIitcIik7XG4vL2NvbnN0IFFVT1RFRF9QQUlSJCA9IHN1YmV4cChzdWJleHAoXCJcXFxcXFxcXFwiICsgc3ViZXhwKFZDSEFSJCQgKyBcInxcIiArIFdTUCQkKSkgKyBcInxcIiArIE9CU19RUCQpO1xuLy9jb25zdCBRVU9URURfU1RSSU5HJCA9IHN1YmV4cCgnXFxcXFwiJyArIHN1YmV4cChGV1MkICsgXCI/XCIgKyBRQ09OVEVOVCQpICsgXCIqXCIgKyBGV1MkICsgXCI/XCIgKyAnXFxcXFwiJyk7XG5jb25zdCBBVEVYVCQkID0gXCJbQS1aYS16MC05XFxcXCFcXFxcJFxcXFwlXFxcXCdcXFxcKlxcXFwrXFxcXC1cXFxcXlxcXFxfXFxcXGBcXFxce1xcXFx8XFxcXH1cXFxcfl1cIjtcbmNvbnN0IFFURVhUJCQgPSBcIltcXFxcIVxcXFwkXFxcXCVcXFxcJ1xcXFwoXFxcXClcXFxcKlxcXFwrXFxcXCxcXFxcLVxcXFwuMC05XFxcXDxcXFxcPkEtWlxcXFx4NUUtXFxcXHg3RV1cIjtcbmNvbnN0IFZDSEFSJCQgPSBtZXJnZShRVEVYVCQkLCBcIltcXFxcXFxcIlxcXFxcXFxcXVwiKTtcbmNvbnN0IERPVF9BVE9NX1RFWFQkID0gc3ViZXhwKEFURVhUJCQgKyBcIitcIiArIHN1YmV4cChcIlxcXFwuXCIgKyBBVEVYVCQkICsgXCIrXCIpICsgXCIqXCIpO1xuY29uc3QgUVVPVEVEX1BBSVIkID0gc3ViZXhwKFwiXFxcXFxcXFxcIiArIFZDSEFSJCQpO1xuY29uc3QgUUNPTlRFTlQkID0gc3ViZXhwKFFURVhUJCQgKyBcInxcIiArIFFVT1RFRF9QQUlSJCk7XG5jb25zdCBRVU9URURfU1RSSU5HJCA9IHN1YmV4cCgnXFxcXFwiJyArIFFDT05URU5UJCArIFwiKlwiICsgJ1xcXFxcIicpO1xuXG4vL1JGQyA2MDY4XG5jb25zdCBEVEVYVF9OT19PQlMkJCA9IFwiW1xcXFx4MjEtXFxcXHg1QVxcXFx4NUUtXFxcXHg3RV1cIjsgIC8vJWQzMy05MCAvICVkOTQtMTI2XG5jb25zdCBTT01FX0RFTElNUyQkID0gXCJbXFxcXCFcXFxcJFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFw7XFxcXDpcXFxcQF1cIjtcbmNvbnN0IFFDSEFSJCA9IHN1YmV4cChVTlJFU0VSVkVEJCQgKyBcInxcIiArIFBDVF9FTkNPREVEJCArIFwifFwiICsgU09NRV9ERUxJTVMkJCk7XG5jb25zdCBET01BSU4kID0gc3ViZXhwKERPVF9BVE9NX1RFWFQkICsgXCJ8XCIgKyBcIlxcXFxbXCIgKyBEVEVYVF9OT19PQlMkJCArIFwiKlwiICsgXCJcXFxcXVwiKTtcbmNvbnN0IExPQ0FMX1BBUlQkID0gc3ViZXhwKERPVF9BVE9NX1RFWFQkICsgXCJ8XCIgKyBRVU9URURfU1RSSU5HJCk7XG5jb25zdCBBRERSX1NQRUMkID0gc3ViZXhwKExPQ0FMX1BBUlQkICsgXCJcXFxcQFwiICsgRE9NQUlOJCk7XG5jb25zdCBUTyQgPSBzdWJleHAoQUREUl9TUEVDJCArIHN1YmV4cChcIlxcXFwsXCIgKyBBRERSX1NQRUMkKSArIFwiKlwiKTtcbmNvbnN0IEhGTkFNRSQgPSBzdWJleHAoUUNIQVIkICsgXCIqXCIpO1xuY29uc3QgSEZWQUxVRSQgPSBIRk5BTUUkO1xuY29uc3QgSEZJRUxEJCA9IHN1YmV4cChIRk5BTUUkICsgXCJcXFxcPVwiICsgSEZWQUxVRSQpO1xuY29uc3QgSEZJRUxEUzIkID0gc3ViZXhwKEhGSUVMRCQgKyBzdWJleHAoXCJcXFxcJlwiICsgSEZJRUxEJCkgKyBcIipcIik7XG5jb25zdCBIRklFTERTJCA9IHN1YmV4cChcIlxcXFw/XCIgKyBIRklFTERTMiQpO1xuY29uc3QgTUFJTFRPX1VSSSA9IG5ldyBSZWdFeHAoXCJebWFpbHRvXFxcXDpcIiArIFRPJCArIFwiP1wiICsgSEZJRUxEUyQgKyBcIj8kXCIpO1xuXG5jb25zdCBVTlJFU0VSVkVEID0gbmV3IFJlZ0V4cChVTlJFU0VSVkVEJCQsIFwiZ1wiKTtcbmNvbnN0IFBDVF9FTkNPREVEID0gbmV3IFJlZ0V4cChQQ1RfRU5DT0RFRCQsIFwiZ1wiKTtcbmNvbnN0IE5PVF9MT0NBTF9QQVJUID0gbmV3IFJlZ0V4cChtZXJnZShcIlteXVwiLCBBVEVYVCQkLCBcIltcXFxcLl1cIiwgJ1tcXFxcXCJdJywgVkNIQVIkJCksIFwiZ1wiKTtcbmNvbnN0IE5PVF9ET01BSU4gPSBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIEFURVhUJCQsIFwiW1xcXFwuXVwiLCBcIltcXFxcW11cIiwgRFRFWFRfTk9fT0JTJCQsIFwiW1xcXFxdXVwiKSwgXCJnXCIpO1xuY29uc3QgTk9UX0hGTkFNRSA9IG5ldyBSZWdFeHAobWVyZ2UoXCJbXl1cIiwgVU5SRVNFUlZFRCQkLCBTT01FX0RFTElNUyQkKSwgXCJnXCIpO1xuY29uc3QgTk9UX0hGVkFMVUUgPSBOT1RfSEZOQU1FO1xuY29uc3QgVE8gPSBuZXcgUmVnRXhwKFwiXlwiICsgVE8kICsgXCIkXCIpO1xuY29uc3QgSEZJRUxEUyA9IG5ldyBSZWdFeHAoXCJeXCIgKyBIRklFTERTMiQgKyBcIiRcIik7XG5cbmZ1bmN0aW9uIGRlY29kZVVucmVzZXJ2ZWQoc3RyOnN0cmluZyk6c3RyaW5nIHtcblx0Y29uc3QgZGVjU3RyID0gcGN0RGVjQ2hhcnMoc3RyKTtcblx0cmV0dXJuICghZGVjU3RyLm1hdGNoKFVOUkVTRVJWRUQpID8gc3RyIDogZGVjU3RyKTtcbn1cblxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyPE1haWx0b0NvbXBvbmVudHM+ID0gIHtcblx0c2NoZW1lIDogXCJtYWlsdG9cIixcblxuXHRwYXJzZSA6IGZ1bmN0aW9uIChjb21wb25lbnRzOlVSSUNvbXBvbmVudHMsIG9wdGlvbnM6VVJJT3B0aW9ucyk6TWFpbHRvQ29tcG9uZW50cyB7XG5cdFx0Y29uc3QgbWFpbHRvQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgYXMgTWFpbHRvQ29tcG9uZW50cztcblx0XHRjb25zdCB0byA9IG1haWx0b0NvbXBvbmVudHMudG8gPSAobWFpbHRvQ29tcG9uZW50cy5wYXRoID8gbWFpbHRvQ29tcG9uZW50cy5wYXRoLnNwbGl0KFwiLFwiKSA6IFtdKTtcblx0XHRtYWlsdG9Db21wb25lbnRzLnBhdGggPSB1bmRlZmluZWQ7XG5cblx0XHRpZiAobWFpbHRvQ29tcG9uZW50cy5xdWVyeSkge1xuXHRcdFx0bGV0IHVua25vd25IZWFkZXJzID0gZmFsc2Vcblx0XHRcdGNvbnN0IGhlYWRlcnM6TWFpbHRvSGVhZGVycyA9IHt9O1xuXHRcdFx0Y29uc3QgaGZpZWxkcyA9IG1haWx0b0NvbXBvbmVudHMucXVlcnkuc3BsaXQoXCImXCIpO1xuXG5cdFx0XHRmb3IgKGxldCB4ID0gMCwgeGwgPSBoZmllbGRzLmxlbmd0aDsgeCA8IHhsOyArK3gpIHtcblx0XHRcdFx0Y29uc3QgaGZpZWxkID0gaGZpZWxkc1t4XS5zcGxpdChcIj1cIik7XG5cblx0XHRcdFx0c3dpdGNoIChoZmllbGRbMF0pIHtcblx0XHRcdFx0XHRjYXNlIFwidG9cIjpcblx0XHRcdFx0XHRcdGNvbnN0IHRvQWRkcnMgPSBoZmllbGRbMV0uc3BsaXQoXCIsXCIpO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgeCA9IDAsIHhsID0gdG9BZGRycy5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XG5cdFx0XHRcdFx0XHRcdHRvLnB1c2godG9BZGRyc1t4XSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwic3ViamVjdFwiOlxuXHRcdFx0XHRcdFx0bWFpbHRvQ29tcG9uZW50cy5zdWJqZWN0ID0gdW5lc2NhcGVDb21wb25lbnQoaGZpZWxkWzFdLCBvcHRpb25zKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJib2R5XCI6XG5cdFx0XHRcdFx0XHRtYWlsdG9Db21wb25lbnRzLmJvZHkgPSB1bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMV0sIG9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHVua25vd25IZWFkZXJzID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGhlYWRlcnNbdW5lc2NhcGVDb21wb25lbnQoaGZpZWxkWzBdLCBvcHRpb25zKV0gPSB1bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMV0sIG9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHVua25vd25IZWFkZXJzKSBtYWlsdG9Db21wb25lbnRzLmhlYWRlcnMgPSBoZWFkZXJzO1xuXHRcdH1cblxuXHRcdG1haWx0b0NvbXBvbmVudHMucXVlcnkgPSB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKGxldCB4ID0gMCwgeGwgPSB0by5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XG5cdFx0XHRjb25zdCBhZGRyID0gdG9beF0uc3BsaXQoXCJAXCIpO1xuXG5cdFx0XHRhZGRyWzBdID0gdW5lc2NhcGVDb21wb25lbnQoYWRkclswXSk7XG5cblx0XHRcdGlmICghb3B0aW9ucy51bmljb2RlU3VwcG9ydCkge1xuXHRcdFx0XHQvL2NvbnZlcnQgVW5pY29kZSBJRE4gLT4gQVNDSUkgSUROXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YWRkclsxXSA9IHB1bnljb2RlLnRvQVNDSUkodW5lc2NhcGVDb21wb25lbnQoYWRkclsxXSwgb3B0aW9ucykudG9Mb3dlckNhc2UoKSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRtYWlsdG9Db21wb25lbnRzLmVycm9yID0gbWFpbHRvQ29tcG9uZW50cy5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6IFwiICsgZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWRkclsxXSA9IHVuZXNjYXBlQ29tcG9uZW50KGFkZHJbMV0sIG9wdGlvbnMpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRvW3hdID0gYWRkci5qb2luKFwiQFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFpbHRvQ29tcG9uZW50cztcblx0fSxcblxuXHRzZXJpYWxpemUgOiBmdW5jdGlvbiAobWFpbHRvQ29tcG9uZW50czpNYWlsdG9Db21wb25lbnRzLCBvcHRpb25zOlVSSU9wdGlvbnMpOlVSSUNvbXBvbmVudHMge1xuXHRcdGNvbnN0IGNvbXBvbmVudHMgPSBtYWlsdG9Db21wb25lbnRzIGFzIFVSSUNvbXBvbmVudHM7XG5cdFx0Y29uc3QgdG8gPSB0b0FycmF5KG1haWx0b0NvbXBvbmVudHMudG8pO1xuXHRcdGlmICh0bykge1xuXHRcdFx0Zm9yIChsZXQgeCA9IDAsIHhsID0gdG8ubGVuZ3RoOyB4IDwgeGw7ICsreCkge1xuXHRcdFx0XHRjb25zdCB0b0FkZHIgPSBTdHJpbmcodG9beF0pO1xuXHRcdFx0XHRjb25zdCBhdElkeCA9IHRvQWRkci5sYXN0SW5kZXhPZihcIkBcIik7XG5cdFx0XHRcdGNvbnN0IGxvY2FsUGFydCA9ICh0b0FkZHIuc2xpY2UoMCwgYXRJZHgpKS5yZXBsYWNlKFBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfTE9DQUxfUEFSVCwgcGN0RW5jQ2hhcik7XG5cdFx0XHRcdGxldCBkb21haW4gPSB0b0FkZHIuc2xpY2UoYXRJZHggKyAxKTtcblxuXHRcdFx0XHQvL2NvbnZlcnQgSUROIHZpYSBwdW55Y29kZVxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGRvbWFpbiA9ICghb3B0aW9ucy5pcmkgPyBwdW55Y29kZS50b0FTQ0lJKHVuZXNjYXBlQ29tcG9uZW50KGRvbWFpbiwgb3B0aW9ucykudG9Mb3dlckNhc2UoKSkgOiBwdW55Y29kZS50b1VuaWNvZGUoZG9tYWluKSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBcIiArICghb3B0aW9ucy5pcmkgPyBcIkFTQ0lJXCIgOiBcIlVuaWNvZGVcIikgKyBcIiB2aWEgcHVueWNvZGU6IFwiICsgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRvW3hdID0gbG9jYWxQYXJ0ICsgXCJAXCIgKyBkb21haW47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBvbmVudHMucGF0aCA9IHRvLmpvaW4oXCIsXCIpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhlYWRlcnMgPSBtYWlsdG9Db21wb25lbnRzLmhlYWRlcnMgPSBtYWlsdG9Db21wb25lbnRzLmhlYWRlcnMgfHwge307XG5cblx0XHRpZiAobWFpbHRvQ29tcG9uZW50cy5zdWJqZWN0KSBoZWFkZXJzW1wic3ViamVjdFwiXSA9IG1haWx0b0NvbXBvbmVudHMuc3ViamVjdDtcblx0XHRpZiAobWFpbHRvQ29tcG9uZW50cy5ib2R5KSBoZWFkZXJzW1wiYm9keVwiXSA9IG1haWx0b0NvbXBvbmVudHMuYm9keTtcblxuXHRcdGNvbnN0IGZpZWxkcyA9IFtdO1xuXHRcdGZvciAoY29uc3QgbmFtZSBpbiBoZWFkZXJzKSB7XG5cdFx0XHRpZiAoaGVhZGVyc1tuYW1lXSAhPT0gT1tuYW1lXSkge1xuXHRcdFx0XHRmaWVsZHMucHVzaChcblx0XHRcdFx0XHRuYW1lLnJlcGxhY2UoUENUX0VOQ09ERUQsIGRlY29kZVVucmVzZXJ2ZWQpLnJlcGxhY2UoUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKS5yZXBsYWNlKE5PVF9IRk5BTUUsIHBjdEVuY0NoYXIpICtcblx0XHRcdFx0XHRcIj1cIiArXG5cdFx0XHRcdFx0aGVhZGVyc1tuYW1lXS5yZXBsYWNlKFBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfSEZWQUxVRSwgcGN0RW5jQ2hhcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdGNvbXBvbmVudHMucXVlcnkgPSBmaWVsZHMuam9pbihcIiZcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcjsiLCAiaW1wb3J0IHsgVVJJU2NoZW1lSGFuZGxlciwgVVJJQ29tcG9uZW50cywgVVJJT3B0aW9ucyB9IGZyb20gXCIuLi91cmlcIjtcbmltcG9ydCB3cyBmcm9tIFwiLi93c1wiO1xuXG5jb25zdCBoYW5kbGVyOlVSSVNjaGVtZUhhbmRsZXIgPSB7XG5cdHNjaGVtZSA6IFwid3NzXCIsXG5cdGRvbWFpbkhvc3QgOiB3cy5kb21haW5Ib3N0LFxuXHRwYXJzZSA6IHdzLnBhcnNlLFxuXHRzZXJpYWxpemUgOiB3cy5zZXJpYWxpemVcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcjsiLCAiaW1wb3J0IHsgVVJJU2NoZW1lSGFuZGxlciwgVVJJQ29tcG9uZW50cywgVVJJT3B0aW9ucyB9IGZyb20gXCIuLi91cmlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBXU0NvbXBvbmVudHMgZXh0ZW5kcyBVUklDb21wb25lbnRzIHtcblx0cmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuXHRzZWN1cmU/OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc1NlY3VyZSh3c0NvbXBvbmVudHM6V1NDb21wb25lbnRzKTpib29sZWFuIHtcblx0cmV0dXJuIHR5cGVvZiB3c0NvbXBvbmVudHMuc2VjdXJlID09PSAnYm9vbGVhbicgPyB3c0NvbXBvbmVudHMuc2VjdXJlIDogU3RyaW5nKHdzQ29tcG9uZW50cy5zY2hlbWUpLnRvTG93ZXJDYXNlKCkgPT09IFwid3NzXCI7XG59XG5cbi8vUkZDIDY0NTVcbmNvbnN0IGhhbmRsZXI6VVJJU2NoZW1lSGFuZGxlciA9IHtcblx0c2NoZW1lIDogXCJ3c1wiLFxuXG5cdGRvbWFpbkhvc3QgOiB0cnVlLFxuXG5cdHBhcnNlIDogZnVuY3Rpb24gKGNvbXBvbmVudHM6VVJJQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zKTpXU0NvbXBvbmVudHMge1xuXHRcdGNvbnN0IHdzQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgYXMgV1NDb21wb25lbnRzO1xuXG5cdFx0Ly9pbmRpY2F0ZSBpZiB0aGUgc2VjdXJlIGZsYWcgaXMgc2V0XG5cdFx0d3NDb21wb25lbnRzLnNlY3VyZSA9IGlzU2VjdXJlKHdzQ29tcG9uZW50cyk7XG5cblx0XHQvL2NvbnN0cnVjdCByZXNvdWNlIG5hbWVcblx0XHR3c0NvbXBvbmVudHMucmVzb3VyY2VOYW1lID0gKHdzQ29tcG9uZW50cy5wYXRoIHx8ICcvJykgKyAod3NDb21wb25lbnRzLnF1ZXJ5ID8gJz8nICsgd3NDb21wb25lbnRzLnF1ZXJ5IDogJycpO1xuXHRcdHdzQ29tcG9uZW50cy5wYXRoID0gdW5kZWZpbmVkO1xuXHRcdHdzQ29tcG9uZW50cy5xdWVyeSA9IHVuZGVmaW5lZDtcblxuXHRcdHJldHVybiB3c0NvbXBvbmVudHM7XG5cdH0sXG5cblx0c2VyaWFsaXplIDogZnVuY3Rpb24gKHdzQ29tcG9uZW50czpXU0NvbXBvbmVudHMsIG9wdGlvbnM6VVJJT3B0aW9ucyk6VVJJQ29tcG9uZW50cyB7XG5cdFx0Ly9ub3JtYWxpemUgdGhlIGRlZmF1bHQgcG9ydFxuXHRcdGlmICh3c0NvbXBvbmVudHMucG9ydCA9PT0gKGlzU2VjdXJlKHdzQ29tcG9uZW50cykgPyA0NDMgOiA4MCkgfHwgd3NDb21wb25lbnRzLnBvcnQgPT09IFwiXCIpIHtcblx0XHRcdHdzQ29tcG9uZW50cy5wb3J0ID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vZW5zdXJlIHNjaGVtZSBtYXRjaGVzIHNlY3VyZSBmbGFnXG5cdFx0aWYgKHR5cGVvZiB3c0NvbXBvbmVudHMuc2VjdXJlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHdzQ29tcG9uZW50cy5zY2hlbWUgPSAod3NDb21wb25lbnRzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJyk7XG5cdFx0XHR3c0NvbXBvbmVudHMuc2VjdXJlID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vcmVjb25zdHJ1Y3QgcGF0aCBmcm9tIHJlc291cmNlIG5hbWVcblx0XHRpZiAod3NDb21wb25lbnRzLnJlc291cmNlTmFtZSkge1xuXHRcdFx0Y29uc3QgW3BhdGgsIHF1ZXJ5XSA9IHdzQ29tcG9uZW50cy5yZXNvdXJjZU5hbWUuc3BsaXQoJz8nKTtcblx0XHRcdHdzQ29tcG9uZW50cy5wYXRoID0gKHBhdGggJiYgcGF0aCAhPT0gJy8nID8gcGF0aCA6IHVuZGVmaW5lZCk7XG5cdFx0XHR3c0NvbXBvbmVudHMucXVlcnkgPSBxdWVyeTtcblx0XHRcdHdzQ29tcG9uZW50cy5yZXNvdXJjZU5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly9mb3JiaWQgZnJhZ21lbnQgY29tcG9uZW50XG5cdFx0d3NDb21wb25lbnRzLmZyYWdtZW50ID0gdW5kZWZpbmVkO1xuXG5cdFx0cmV0dXJuIHdzQ29tcG9uZW50cztcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcjsiLCAiaW1wb3J0IHsgVVJJU2NoZW1lSGFuZGxlciwgVVJJQ29tcG9uZW50cywgVVJJT3B0aW9ucyB9IGZyb20gXCIuLi91cmlcIjtcbmltcG9ydCBodHRwIGZyb20gXCIuL2h0dHBcIjtcblxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyID0ge1xuXHRzY2hlbWUgOiBcImh0dHBzXCIsXG5cdGRvbWFpbkhvc3QgOiBodHRwLmRvbWFpbkhvc3QsXG5cdHBhcnNlIDogaHR0cC5wYXJzZSxcblx0c2VyaWFsaXplIDogaHR0cC5zZXJpYWxpemVcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcjsiLCAiaW1wb3J0IHsgVVJJU2NoZW1lSGFuZGxlciwgVVJJQ29tcG9uZW50cywgVVJJT3B0aW9ucyB9IGZyb20gXCIuLi91cmlcIjtcblxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyID0ge1xuXHRzY2hlbWUgOiBcImh0dHBcIixcblxuXHRkb21haW5Ib3N0IDogdHJ1ZSxcblxuXHRwYXJzZSA6IGZ1bmN0aW9uIChjb21wb25lbnRzOlVSSUNvbXBvbmVudHMsIG9wdGlvbnM6VVJJT3B0aW9ucyk6VVJJQ29tcG9uZW50cyB7XG5cdFx0Ly9yZXBvcnQgbWlzc2luZyBob3N0XG5cdFx0aWYgKCFjb21wb25lbnRzLmhvc3QpIHtcblx0XHRcdGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiSFRUUCBVUklzIG11c3QgaGF2ZSBhIGhvc3QuXCI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XG5cdH0sXG5cblx0c2VyaWFsaXplIDogZnVuY3Rpb24gKGNvbXBvbmVudHM6VVJJQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zKTpVUklDb21wb25lbnRzIHtcblx0XHRjb25zdCBzZWN1cmUgPSBTdHJpbmcoY29tcG9uZW50cy5zY2hlbWUpLnRvTG93ZXJDYXNlKCkgPT09IFwiaHR0cHNcIjtcblxuXHRcdC8vbm9ybWFsaXplIHRoZSBkZWZhdWx0IHBvcnRcblx0XHRpZiAoY29tcG9uZW50cy5wb3J0ID09PSAoc2VjdXJlID8gNDQzIDogODApIHx8IGNvbXBvbmVudHMucG9ydCA9PT0gXCJcIikge1xuXHRcdFx0Y29tcG9uZW50cy5wb3J0ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRcblx0XHQvL25vcm1hbGl6ZSB0aGUgZW1wdHkgcGF0aFxuXHRcdGlmICghY29tcG9uZW50cy5wYXRoKSB7XG5cdFx0XHRjb21wb25lbnRzLnBhdGggPSBcIi9cIjtcblx0XHR9XG5cblx0XHQvL05PVEU6IFdlIGRvIG5vdCBwYXJzZSBxdWVyeSBzdHJpbmdzIGZvciBIVFRQIFVSSXNcblx0XHQvL2FzIFdXVyBGb3JtIFVybCBFbmNvZGVkIHF1ZXJ5IHN0cmluZ3MgYXJlIHBhcnQgb2YgdGhlIEhUTUw0KyBzcGVjLFxuXHRcdC8vYW5kIG5vdCB0aGUgSFRUUCBzcGVjLlxuXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZXI7IiwgIi8qKlxuICogVVJJLmpzXG4gKlxuICogQGZpbGVvdmVydmlldyBBbiBSRkMgMzk4NiBjb21wbGlhbnQsIHNjaGVtZSBleHRlbmRhYmxlIFVSSSBwYXJzaW5nL3ZhbGlkYXRpbmcvcmVzb2x2aW5nIGxpYnJhcnkgZm9yIEphdmFTY3JpcHQuXG4gKiBAYXV0aG9yIDxhIGhyZWY9XCJtYWlsdG86Z2FyeS5jb3VydEBnbWFpbC5jb21cIj5HYXJ5IENvdXJ0PC9hPlxuICogQHNlZSBodHRwOi8vZ2l0aHViLmNvbS9nYXJ5Y291cnQvdXJpLWpzXG4gKi9cblxuLyoqXG4gKiBDb3B5cmlnaHQgMjAxMSBHYXJ5IENvdXJ0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZVxuICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2ZcbiAqICAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdFxuICogICAgICAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHNcbiAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEdBUlkgQ09VUlQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEXG4gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR0FSWSBDT1VSVCBPUlxuICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbiAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRlxuICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKlxuICogVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZSB0aG9zZSBvZiB0aGVcbiAqIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkXG4gKiBvciBpbXBsaWVkLCBvZiBHYXJ5IENvdXJ0LlxuICovXG5cbmltcG9ydCBVUklfUFJPVE9DT0wgZnJvbSBcIi4vcmVnZXhwcy11cmlcIjtcbmltcG9ydCBJUklfUFJPVE9DT0wgZnJvbSBcIi4vcmVnZXhwcy1pcmlcIjtcbmltcG9ydCBwdW55Y29kZSBmcm9tIFwicHVueWNvZGVcIjtcbmltcG9ydCB7IHRvVXBwZXJDYXNlLCB0eXBlT2YsIGFzc2lnbiB9IGZyb20gXCIuL3V0aWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVUklDb21wb25lbnRzIHtcblx0c2NoZW1lPzpzdHJpbmc7XG5cdHVzZXJpbmZvPzpzdHJpbmc7XG5cdGhvc3Q/OnN0cmluZztcblx0cG9ydD86bnVtYmVyfHN0cmluZztcblx0cGF0aD86c3RyaW5nO1xuXHRxdWVyeT86c3RyaW5nO1xuXHRmcmFnbWVudD86c3RyaW5nO1xuXHRyZWZlcmVuY2U/OnN0cmluZztcblx0ZXJyb3I/OnN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVUklPcHRpb25zIHtcblx0c2NoZW1lPzpzdHJpbmc7XG5cdHJlZmVyZW5jZT86c3RyaW5nO1xuXHR0b2xlcmFudD86Ym9vbGVhbjtcblx0YWJzb2x1dGVQYXRoPzpib29sZWFuO1xuXHRpcmk/OmJvb2xlYW47XG5cdHVuaWNvZGVTdXBwb3J0Pzpib29sZWFuO1xuXHRkb21haW5Ib3N0Pzpib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVSSVNjaGVtZUhhbmRsZXI8Q29tcG9uZW50cyBleHRlbmRzIFVSSUNvbXBvbmVudHMgPSBVUklDb21wb25lbnRzLCBPcHRpb25zIGV4dGVuZHMgVVJJT3B0aW9ucyA9IFVSSU9wdGlvbnMsIFBhcmVudENvbXBvbmVudHMgZXh0ZW5kcyBVUklDb21wb25lbnRzID0gVVJJQ29tcG9uZW50cz4ge1xuXHRzY2hlbWU6c3RyaW5nO1xuXHRwYXJzZShjb21wb25lbnRzOlBhcmVudENvbXBvbmVudHMsIG9wdGlvbnM6T3B0aW9ucyk6Q29tcG9uZW50cztcblx0c2VyaWFsaXplKGNvbXBvbmVudHM6Q29tcG9uZW50cywgb3B0aW9uczpPcHRpb25zKTpQYXJlbnRDb21wb25lbnRzO1xuXHR1bmljb2RlU3VwcG9ydD86Ym9vbGVhbjtcblx0ZG9tYWluSG9zdD86Ym9vbGVhbjtcblx0YWJzb2x1dGVQYXRoPzpib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVSSVJlZ0V4cHMge1xuXHROT1RfU0NIRU1FIDogUmVnRXhwLFxuXHROT1RfVVNFUklORk8gOiBSZWdFeHAsXG5cdE5PVF9IT1NUIDogUmVnRXhwLFxuXHROT1RfUEFUSCA6IFJlZ0V4cCxcblx0Tk9UX1BBVEhfTk9TQ0hFTUUgOiBSZWdFeHAsXG5cdE5PVF9RVUVSWSA6IFJlZ0V4cCxcblx0Tk9UX0ZSQUdNRU5UIDogUmVnRXhwLFxuXHRFU0NBUEUgOiBSZWdFeHAsXG5cdFVOUkVTRVJWRUQgOiBSZWdFeHAsXG5cdE9USEVSX0NIQVJTIDogUmVnRXhwLFxuXHRQQ1RfRU5DT0RFRCA6IFJlZ0V4cCxcblx0SVBWNEFERFJFU1MgOiBSZWdFeHAsXG5cdElQVjZBRERSRVNTIDogUmVnRXhwLFxufVxuXG5leHBvcnQgY29uc3QgU0NIRU1FUzp7W3NjaGVtZTpzdHJpbmddOlVSSVNjaGVtZUhhbmRsZXJ9ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBwY3RFbmNDaGFyKGNocjpzdHJpbmcpOnN0cmluZyB7XG5cdGNvbnN0IGMgPSBjaHIuY2hhckNvZGVBdCgwKTtcblx0bGV0IGU6c3RyaW5nO1xuXG5cdGlmIChjIDwgMTYpIGUgPSBcIiUwXCIgKyBjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRlbHNlIGlmIChjIDwgMTI4KSBlID0gXCIlXCIgKyBjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRlbHNlIGlmIChjIDwgMjA0OCkgZSA9IFwiJVwiICsgKChjID4+IDYpIHwgMTkyKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiJVwiICsgKChjICYgNjMpIHwgMTI4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0ZWxzZSBlID0gXCIlXCIgKyAoKGMgPj4gMTIpIHwgMjI0KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiJVwiICsgKCgoYyA+PiA2KSAmIDYzKSB8IDEyOCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyBcIiVcIiArICgoYyAmIDYzKSB8IDEyOCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cblx0cmV0dXJuIGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwY3REZWNDaGFycyhzdHI6c3RyaW5nKTpzdHJpbmcge1xuXHRsZXQgbmV3U3RyID0gXCJcIjtcblx0bGV0IGkgPSAwO1xuXHRjb25zdCBpbCA9IHN0ci5sZW5ndGg7XG5cblx0d2hpbGUgKGkgPCBpbCkge1xuXHRcdGNvbnN0IGMgPSBwYXJzZUludChzdHIuc3Vic3RyKGkgKyAxLCAyKSwgMTYpO1xuXG5cdFx0aWYgKGMgPCAxMjgpIHtcblx0XHRcdG5ld1N0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuXHRcdFx0aSArPSAzO1xuXHRcdH1cblx0XHRlbHNlIGlmIChjID49IDE5NCAmJiBjIDwgMjI0KSB7XG5cdFx0XHRpZiAoKGlsIC0gaSkgPj0gNikge1xuXHRcdFx0XHRjb25zdCBjMiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSArIDQsIDIpLCAxNik7XG5cdFx0XHRcdG5ld1N0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDMxKSA8PCA2KSB8IChjMiAmIDYzKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCA2KTtcblx0XHRcdH1cblx0XHRcdGkgKz0gNjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoYyA+PSAyMjQpIHtcblx0XHRcdGlmICgoaWwgLSBpKSA+PSA5KSB7XG5cdFx0XHRcdGNvbnN0IGMyID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpICsgNCwgMiksIDE2KTtcblx0XHRcdFx0Y29uc3QgYzMgPSBwYXJzZUludChzdHIuc3Vic3RyKGkgKyA3LCAyKSwgMTYpO1xuXHRcdFx0XHRuZXdTdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAxNSkgPDwgMTIpIHwgKChjMiAmIDYzKSA8PCA2KSB8IChjMyAmIDYzKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCA5KTtcblx0XHRcdH1cblx0XHRcdGkgKz0gOTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCAzKTtcblx0XHRcdGkgKz0gMztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3U3RyO1xufVxuXG5mdW5jdGlvbiBfbm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcoY29tcG9uZW50czpVUklDb21wb25lbnRzLCBwcm90b2NvbDpVUklSZWdFeHBzKSB7XG5cdGZ1bmN0aW9uIGRlY29kZVVucmVzZXJ2ZWQoc3RyOnN0cmluZyk6c3RyaW5nIHtcblx0XHRjb25zdCBkZWNTdHIgPSBwY3REZWNDaGFycyhzdHIpO1xuXHRcdHJldHVybiAoIWRlY1N0ci5tYXRjaChwcm90b2NvbC5VTlJFU0VSVkVEKSA/IHN0ciA6IGRlY1N0cik7XG5cdH1cblxuXHRpZiAoY29tcG9uZW50cy5zY2hlbWUpIGNvbXBvbmVudHMuc2NoZW1lID0gU3RyaW5nKGNvbXBvbmVudHMuc2NoZW1lKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocHJvdG9jb2wuTk9UX1NDSEVNRSwgXCJcIik7XG5cdGlmIChjb21wb25lbnRzLnVzZXJpbmZvICE9PSB1bmRlZmluZWQpIGNvbXBvbmVudHMudXNlcmluZm8gPSBTdHJpbmcoY29tcG9uZW50cy51c2VyaW5mbykucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShwcm90b2NvbC5OT1RfVVNFUklORk8sIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcblx0aWYgKGNvbXBvbmVudHMuaG9zdCAhPT0gdW5kZWZpbmVkKSBjb21wb25lbnRzLmhvc3QgPSBTdHJpbmcoY29tcG9uZW50cy5ob3N0KS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocHJvdG9jb2wuTk9UX0hPU1QsIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcblx0aWYgKGNvbXBvbmVudHMucGF0aCAhPT0gdW5kZWZpbmVkKSBjb21wb25lbnRzLnBhdGggPSBTdHJpbmcoY29tcG9uZW50cy5wYXRoKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKChjb21wb25lbnRzLnNjaGVtZSA/IHByb3RvY29sLk5PVF9QQVRIIDogcHJvdG9jb2wuTk9UX1BBVEhfTk9TQ0hFTUUpLCBwY3RFbmNDaGFyKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSk7XG5cdGlmIChjb21wb25lbnRzLnF1ZXJ5ICE9PSB1bmRlZmluZWQpIGNvbXBvbmVudHMucXVlcnkgPSBTdHJpbmcoY29tcG9uZW50cy5xdWVyeSkucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShwcm90b2NvbC5OT1RfUVVFUlksIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcblx0aWYgKGNvbXBvbmVudHMuZnJhZ21lbnQgIT09IHVuZGVmaW5lZCkgY29tcG9uZW50cy5mcmFnbWVudCA9IFN0cmluZyhjb21wb25lbnRzLmZyYWdtZW50KS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKHByb3RvY29sLk5PVF9GUkFHTUVOVCwgcGN0RW5jQ2hhcikucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpO1xuXG5cdHJldHVybiBjb21wb25lbnRzO1xufTtcblxuZnVuY3Rpb24gX3N0cmlwTGVhZGluZ1plcm9zKHN0cjpzdHJpbmcpOnN0cmluZyB7XG5cdHJldHVybiBzdHIucmVwbGFjZSgvXjAqKC4qKS8sIFwiJDFcIikgfHwgXCIwXCI7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVJUHY0KGhvc3Q6c3RyaW5nLCBwcm90b2NvbDpVUklSZWdFeHBzKTpzdHJpbmcge1xuXHRjb25zdCBtYXRjaGVzID0gaG9zdC5tYXRjaChwcm90b2NvbC5JUFY0QUREUkVTUykgfHwgW107XG5cdGNvbnN0IFssIGFkZHJlc3NdID0gbWF0Y2hlcztcblx0XG5cdGlmIChhZGRyZXNzKSB7XG5cdFx0cmV0dXJuIGFkZHJlc3Muc3BsaXQoXCIuXCIpLm1hcChfc3RyaXBMZWFkaW5nWmVyb3MpLmpvaW4oXCIuXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBob3N0O1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVJUHY2KGhvc3Q6c3RyaW5nLCBwcm90b2NvbDpVUklSZWdFeHBzKTpzdHJpbmcge1xuXHRjb25zdCBtYXRjaGVzID0gaG9zdC5tYXRjaChwcm90b2NvbC5JUFY2QUREUkVTUykgfHwgW107XG5cdGNvbnN0IFssIGFkZHJlc3MsIHpvbmVdID0gbWF0Y2hlcztcblxuXHRpZiAoYWRkcmVzcykge1xuXHRcdGNvbnN0IFtsYXN0LCBmaXJzdF0gPSBhZGRyZXNzLnRvTG93ZXJDYXNlKCkuc3BsaXQoJzo6JykucmV2ZXJzZSgpO1xuXHRcdGNvbnN0IGZpcnN0RmllbGRzID0gZmlyc3QgPyBmaXJzdC5zcGxpdChcIjpcIikubWFwKF9zdHJpcExlYWRpbmdaZXJvcykgOiBbXTtcblx0XHRjb25zdCBsYXN0RmllbGRzID0gbGFzdC5zcGxpdChcIjpcIikubWFwKF9zdHJpcExlYWRpbmdaZXJvcyk7XG5cdFx0Y29uc3QgaXNMYXN0RmllbGRJUHY0QWRkcmVzcyA9IHByb3RvY29sLklQVjRBRERSRVNTLnRlc3QobGFzdEZpZWxkc1tsYXN0RmllbGRzLmxlbmd0aCAtIDFdKTtcblx0XHRjb25zdCBmaWVsZENvdW50ID0gaXNMYXN0RmllbGRJUHY0QWRkcmVzcyA/IDcgOiA4O1xuXHRcdGNvbnN0IGxhc3RGaWVsZHNTdGFydCA9IGxhc3RGaWVsZHMubGVuZ3RoIC0gZmllbGRDb3VudDtcblx0XHRjb25zdCBmaWVsZHMgPSBBcnJheTxzdHJpbmc+KGZpZWxkQ291bnQpO1xuXG5cdFx0Zm9yIChsZXQgeCA9IDA7IHggPCBmaWVsZENvdW50OyArK3gpIHtcblx0XHRcdGZpZWxkc1t4XSA9IGZpcnN0RmllbGRzW3hdIHx8IGxhc3RGaWVsZHNbbGFzdEZpZWxkc1N0YXJ0ICsgeF0gfHwgJyc7XG5cdFx0fVxuXG5cdFx0aWYgKGlzTGFzdEZpZWxkSVB2NEFkZHJlc3MpIHtcblx0XHRcdGZpZWxkc1tmaWVsZENvdW50IC0gMV0gPSBfbm9ybWFsaXplSVB2NChmaWVsZHNbZmllbGRDb3VudCAtIDFdLCBwcm90b2NvbCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWxsWmVyb0ZpZWxkcyA9IGZpZWxkcy5yZWR1Y2U8QXJyYXk8e2luZGV4Om51bWJlcixsZW5ndGg6bnVtYmVyfT4+KChhY2MsIGZpZWxkLCBpbmRleCkgPT4ge1xuXHRcdFx0aWYgKCFmaWVsZCB8fCBmaWVsZCA9PT0gXCIwXCIpIHtcblx0XHRcdFx0Y29uc3QgbGFzdExvbmdlc3QgPSBhY2NbYWNjLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRpZiAobGFzdExvbmdlc3QgJiYgbGFzdExvbmdlc3QuaW5kZXggKyBsYXN0TG9uZ2VzdC5sZW5ndGggPT09IGluZGV4KSB7XG5cdFx0XHRcdFx0bGFzdExvbmdlc3QubGVuZ3RoKys7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWNjLnB1c2goeyBpbmRleCwgbGVuZ3RoIDogMSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFjYztcblx0XHR9LCBbXSk7XG5cblx0XHRjb25zdCBsb25nZXN0WmVyb0ZpZWxkcyA9IGFsbFplcm9GaWVsZHMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aClbMF07XG5cblx0XHRsZXQgbmV3SG9zdDpzdHJpbmc7XG5cdFx0aWYgKGxvbmdlc3RaZXJvRmllbGRzICYmIGxvbmdlc3RaZXJvRmllbGRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGNvbnN0IG5ld0ZpcnN0ID0gZmllbGRzLnNsaWNlKDAsIGxvbmdlc3RaZXJvRmllbGRzLmluZGV4KSA7XG5cdFx0XHRjb25zdCBuZXdMYXN0ID0gZmllbGRzLnNsaWNlKGxvbmdlc3RaZXJvRmllbGRzLmluZGV4ICsgbG9uZ2VzdFplcm9GaWVsZHMubGVuZ3RoKTtcblx0XHRcdG5ld0hvc3QgPSBuZXdGaXJzdC5qb2luKFwiOlwiKSArIFwiOjpcIiArIG5ld0xhc3Quam9pbihcIjpcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5ld0hvc3QgPSBmaWVsZHMuam9pbihcIjpcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHpvbmUpIHtcblx0XHRcdG5ld0hvc3QgKz0gXCIlXCIgKyB6b25lO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXdIb3N0O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBob3N0O1xuXHR9XG59XG5cbmNvbnN0IFVSSV9QQVJTRSA9IC9eKD86KFteOlxcLz8jXSspOik/KD86XFwvXFwvKCg/OihbXlxcLz8jQF0qKUApPyhcXFtbXlxcLz8jXFxdXStcXF18W15cXC8/IzpdKikoPzpcXDooXFxkKikpPykpPyhbXj8jXSopKD86XFw/KFteI10qKSk/KD86IygoPzoufFxcbnxcXHIpKikpPy9pO1xuY29uc3QgTk9fTUFUQ0hfSVNfVU5ERUZJTkVEID0gKDxSZWdFeHBNYXRjaEFycmF5PihcIlwiKS5tYXRjaCgvKCl7MH0vKSlbMV0gPT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHVyaVN0cmluZzpzdHJpbmcsIG9wdGlvbnM6VVJJT3B0aW9ucyA9IHt9KTpVUklDb21wb25lbnRzIHtcblx0Y29uc3QgY29tcG9uZW50czpVUklDb21wb25lbnRzID0ge307XG5cdGNvbnN0IHByb3RvY29sID0gKG9wdGlvbnMuaXJpICE9PSBmYWxzZSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTCk7XG5cblx0aWYgKG9wdGlvbnMucmVmZXJlbmNlID09PSBcInN1ZmZpeFwiKSB1cmlTdHJpbmcgPSAob3B0aW9ucy5zY2hlbWUgPyBvcHRpb25zLnNjaGVtZSArIFwiOlwiIDogXCJcIikgKyBcIi8vXCIgKyB1cmlTdHJpbmc7XG5cblx0Y29uc3QgbWF0Y2hlcyA9IHVyaVN0cmluZy5tYXRjaChVUklfUEFSU0UpO1xuXG5cdGlmIChtYXRjaGVzKSB7XG5cdFx0aWYgKE5PX01BVENIX0lTX1VOREVGSU5FRCkge1xuXHRcdFx0Ly9zdG9yZSBlYWNoIGNvbXBvbmVudFxuXHRcdFx0Y29tcG9uZW50cy5zY2hlbWUgPSBtYXRjaGVzWzFdO1xuXHRcdFx0Y29tcG9uZW50cy51c2VyaW5mbyA9IG1hdGNoZXNbM107XG5cdFx0XHRjb21wb25lbnRzLmhvc3QgPSBtYXRjaGVzWzRdO1xuXHRcdFx0Y29tcG9uZW50cy5wb3J0ID0gcGFyc2VJbnQobWF0Y2hlc1s1XSwgMTApO1xuXHRcdFx0Y29tcG9uZW50cy5wYXRoID0gbWF0Y2hlc1s2XSB8fCBcIlwiO1xuXHRcdFx0Y29tcG9uZW50cy5xdWVyeSA9IG1hdGNoZXNbN107XG5cdFx0XHRjb21wb25lbnRzLmZyYWdtZW50ID0gbWF0Y2hlc1s4XTtcblxuXHRcdFx0Ly9maXggcG9ydCBudW1iZXJcblx0XHRcdGlmIChpc05hTihjb21wb25lbnRzLnBvcnQpKSB7XG5cdFx0XHRcdGNvbXBvbmVudHMucG9ydCA9IG1hdGNoZXNbNV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHsgIC8vSUUgRklYIGZvciBpbXByb3BlciBSZWdFeHAgbWF0Y2hpbmdcblx0XHRcdC8vc3RvcmUgZWFjaCBjb21wb25lbnRcblx0XHRcdGNvbXBvbmVudHMuc2NoZW1lID0gbWF0Y2hlc1sxXSB8fCB1bmRlZmluZWQ7XG5cdFx0XHRjb21wb25lbnRzLnVzZXJpbmZvID0gKHVyaVN0cmluZy5pbmRleE9mKFwiQFwiKSAhPT0gLTEgPyBtYXRjaGVzWzNdIDogdW5kZWZpbmVkKTtcblx0XHRcdGNvbXBvbmVudHMuaG9zdCA9ICh1cmlTdHJpbmcuaW5kZXhPZihcIi8vXCIpICE9PSAtMSA/IG1hdGNoZXNbNF0gOiB1bmRlZmluZWQpO1xuXHRcdFx0Y29tcG9uZW50cy5wb3J0ID0gcGFyc2VJbnQobWF0Y2hlc1s1XSwgMTApO1xuXHRcdFx0Y29tcG9uZW50cy5wYXRoID0gbWF0Y2hlc1s2XSB8fCBcIlwiO1xuXHRcdFx0Y29tcG9uZW50cy5xdWVyeSA9ICh1cmlTdHJpbmcuaW5kZXhPZihcIj9cIikgIT09IC0xID8gbWF0Y2hlc1s3XSA6IHVuZGVmaW5lZCk7XG5cdFx0XHRjb21wb25lbnRzLmZyYWdtZW50ID0gKHVyaVN0cmluZy5pbmRleE9mKFwiI1wiKSAhPT0gLTEgPyBtYXRjaGVzWzhdIDogdW5kZWZpbmVkKTtcblxuXHRcdFx0Ly9maXggcG9ydCBudW1iZXJcblx0XHRcdGlmIChpc05hTihjb21wb25lbnRzLnBvcnQpKSB7XG5cdFx0XHRcdGNvbXBvbmVudHMucG9ydCA9ICh1cmlTdHJpbmcubWF0Y2goL1xcL1xcLyg/Oi58XFxuKSpcXDooPzpcXC98XFw/fFxcI3wkKS8pID8gbWF0Y2hlc1s0XSA6IHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNvbXBvbmVudHMuaG9zdCkge1xuXHRcdFx0Ly9ub3JtYWxpemUgSVAgaG9zdHNcblx0XHRcdGNvbXBvbmVudHMuaG9zdCA9IF9ub3JtYWxpemVJUHY2KF9ub3JtYWxpemVJUHY0KGNvbXBvbmVudHMuaG9zdCwgcHJvdG9jb2wpLCBwcm90b2NvbCk7XG5cdFx0fVxuXG5cdFx0Ly9kZXRlcm1pbmUgcmVmZXJlbmNlIHR5cGVcblx0XHRpZiAoY29tcG9uZW50cy5zY2hlbWUgPT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnRzLnVzZXJpbmZvID09PSB1bmRlZmluZWQgJiYgY29tcG9uZW50cy5ob3N0ID09PSB1bmRlZmluZWQgJiYgY29tcG9uZW50cy5wb3J0ID09PSB1bmRlZmluZWQgJiYgIWNvbXBvbmVudHMucGF0aCAmJiBjb21wb25lbnRzLnF1ZXJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbXBvbmVudHMucmVmZXJlbmNlID0gXCJzYW1lLWRvY3VtZW50XCI7XG5cdFx0fSBlbHNlIGlmIChjb21wb25lbnRzLnNjaGVtZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb21wb25lbnRzLnJlZmVyZW5jZSA9IFwicmVsYXRpdmVcIjtcblx0XHR9IGVsc2UgaWYgKGNvbXBvbmVudHMuZnJhZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29tcG9uZW50cy5yZWZlcmVuY2UgPSBcImFic29sdXRlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbXBvbmVudHMucmVmZXJlbmNlID0gXCJ1cmlcIjtcblx0XHR9XG5cblx0XHQvL2NoZWNrIGZvciByZWZlcmVuY2UgZXJyb3JzXG5cdFx0aWYgKG9wdGlvbnMucmVmZXJlbmNlICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBjb21wb25lbnRzLnJlZmVyZW5jZSkge1xuXHRcdFx0Y29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJVUkkgaXMgbm90IGEgXCIgKyBvcHRpb25zLnJlZmVyZW5jZSArIFwiIHJlZmVyZW5jZS5cIjtcblx0XHR9XG5cblx0XHQvL2ZpbmQgc2NoZW1lIGhhbmRsZXJcblx0XHRjb25zdCBzY2hlbWVIYW5kbGVyID0gU0NIRU1FU1sob3B0aW9ucy5zY2hlbWUgfHwgY29tcG9uZW50cy5zY2hlbWUgfHwgXCJcIikudG9Mb3dlckNhc2UoKV07XG5cblx0XHQvL2NoZWNrIGlmIHNjaGVtZSBjYW4ndCBoYW5kbGUgSVJJc1xuXHRcdGlmICghb3B0aW9ucy51bmljb2RlU3VwcG9ydCAmJiAoIXNjaGVtZUhhbmRsZXIgfHwgIXNjaGVtZUhhbmRsZXIudW5pY29kZVN1cHBvcnQpKSB7XG5cdFx0XHQvL2lmIGhvc3QgY29tcG9uZW50IGlzIGEgZG9tYWluIG5hbWVcblx0XHRcdGlmIChjb21wb25lbnRzLmhvc3QgJiYgKG9wdGlvbnMuZG9tYWluSG9zdCB8fCAoc2NoZW1lSGFuZGxlciAmJiBzY2hlbWVIYW5kbGVyLmRvbWFpbkhvc3QpKSkge1xuXHRcdFx0XHQvL2NvbnZlcnQgVW5pY29kZSBJRE4gLT4gQVNDSUkgSUROXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50cy5ob3N0ID0gcHVueWNvZGUudG9BU0NJSShjb21wb25lbnRzLmhvc3QucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgcGN0RGVjQ2hhcnMpLnRvTG93ZXJDYXNlKCkpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJIb3N0J3MgZG9tYWluIG5hbWUgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gQVNDSUkgdmlhIHB1bnljb2RlOiBcIiArIGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vY29udmVydCBJUkkgLT4gVVJJXG5cdFx0XHRfbm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcoY29tcG9uZW50cywgVVJJX1BST1RPQ09MKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9ub3JtYWxpemUgZW5jb2RpbmdzXG5cdFx0XHRfbm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcoY29tcG9uZW50cywgcHJvdG9jb2wpO1xuXHRcdH1cblxuXHRcdC8vcGVyZm9ybSBzY2hlbWUgc3BlY2lmaWMgcGFyc2luZ1xuXHRcdGlmIChzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIucGFyc2UpIHtcblx0XHRcdHNjaGVtZUhhbmRsZXIucGFyc2UoY29tcG9uZW50cywgb3B0aW9ucyk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiVVJJIGNhbiBub3QgYmUgcGFyc2VkLlwiO1xuXHR9XG5cblx0cmV0dXJuIGNvbXBvbmVudHM7XG59O1xuXG5mdW5jdGlvbiBfcmVjb21wb3NlQXV0aG9yaXR5KGNvbXBvbmVudHM6VVJJQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zKTpzdHJpbmd8dW5kZWZpbmVkIHtcblx0Y29uc3QgcHJvdG9jb2wgPSAob3B0aW9ucy5pcmkgIT09IGZhbHNlID8gSVJJX1BST1RPQ09MIDogVVJJX1BST1RPQ09MKTtcblx0Y29uc3QgdXJpVG9rZW5zOkFycmF5PHN0cmluZz4gPSBbXTtcblxuXHRpZiAoY29tcG9uZW50cy51c2VyaW5mbyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy51c2VyaW5mbyk7XG5cdFx0dXJpVG9rZW5zLnB1c2goXCJAXCIpO1xuXHR9XG5cblx0aWYgKGNvbXBvbmVudHMuaG9zdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly9ub3JtYWxpemUgSVAgaG9zdHMsIGFkZCBicmFja2V0cyBhbmQgZXNjYXBlIHpvbmUgc2VwYXJhdG9yIGZvciBJUHY2XG5cdFx0dXJpVG9rZW5zLnB1c2goX25vcm1hbGl6ZUlQdjYoX25vcm1hbGl6ZUlQdjQoU3RyaW5nKGNvbXBvbmVudHMuaG9zdCksIHByb3RvY29sKSwgcHJvdG9jb2wpLnJlcGxhY2UocHJvdG9jb2wuSVBWNkFERFJFU1MsIChfLCAkMSwgJDIpID0+IFwiW1wiICsgJDEgKyAoJDIgPyBcIiUyNVwiICsgJDIgOiBcIlwiKSArIFwiXVwiKSk7XG5cdH1cblxuXHRpZiAodHlwZW9mIGNvbXBvbmVudHMucG9ydCA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgY29tcG9uZW50cy5wb3J0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0dXJpVG9rZW5zLnB1c2goXCI6XCIpO1xuXHRcdHVyaVRva2Vucy5wdXNoKFN0cmluZyhjb21wb25lbnRzLnBvcnQpKTtcblx0fVxuXG5cdHJldHVybiB1cmlUb2tlbnMubGVuZ3RoID8gdXJpVG9rZW5zLmpvaW4oXCJcIikgOiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBSRFMxID0gL15cXC5cXC4/XFwvLztcbmNvbnN0IFJEUzIgPSAvXlxcL1xcLihcXC98JCkvO1xuY29uc3QgUkRTMyA9IC9eXFwvXFwuXFwuKFxcL3wkKS87XG5jb25zdCBSRFM0ID0gL15cXC5cXC4/JC87XG5jb25zdCBSRFM1ID0gL15cXC8/KD86LnxcXG4pKj8oPz1cXC98JCkvO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRG90U2VnbWVudHMoaW5wdXQ6c3RyaW5nKTpzdHJpbmcge1xuXHRjb25zdCBvdXRwdXQ6QXJyYXk8c3RyaW5nPiA9IFtdO1xuXG5cdHdoaWxlIChpbnB1dC5sZW5ndGgpIHtcblx0XHRpZiAoaW5wdXQubWF0Y2goUkRTMSkpIHtcblx0XHRcdGlucHV0ID0gaW5wdXQucmVwbGFjZShSRFMxLCBcIlwiKTtcblx0XHR9IGVsc2UgaWYgKGlucHV0Lm1hdGNoKFJEUzIpKSB7XG5cdFx0XHRpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMiwgXCIvXCIpO1xuXHRcdH0gZWxzZSBpZiAoaW5wdXQubWF0Y2goUkRTMykpIHtcblx0XHRcdGlucHV0ID0gaW5wdXQucmVwbGFjZShSRFMzLCBcIi9cIik7XG5cdFx0XHRvdXRwdXQucG9wKCk7XG5cdFx0fSBlbHNlIGlmIChpbnB1dCA9PT0gXCIuXCIgfHwgaW5wdXQgPT09IFwiLi5cIikge1xuXHRcdFx0aW5wdXQgPSBcIlwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBpbSA9IGlucHV0Lm1hdGNoKFJEUzUpO1xuXHRcdFx0aWYgKGltKSB7XG5cdFx0XHRcdGNvbnN0IHMgPSBpbVswXTtcblx0XHRcdFx0aW5wdXQgPSBpbnB1dC5zbGljZShzLmxlbmd0aCk7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBkb3Qgc2VnbWVudCBjb25kaXRpb25cIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG91dHB1dC5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShjb21wb25lbnRzOlVSSUNvbXBvbmVudHMsIG9wdGlvbnM6VVJJT3B0aW9ucyA9IHt9KTpzdHJpbmcge1xuXHRjb25zdCBwcm90b2NvbCA9IChvcHRpb25zLmlyaSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTCk7XG5cdGNvbnN0IHVyaVRva2VuczpBcnJheTxzdHJpbmc+ID0gW107XG5cblx0Ly9maW5kIHNjaGVtZSBoYW5kbGVyXG5cdGNvbnN0IHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTWyhvcHRpb25zLnNjaGVtZSB8fCBjb21wb25lbnRzLnNjaGVtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpXTtcblxuXHQvL3BlcmZvcm0gc2NoZW1lIHNwZWNpZmljIHNlcmlhbGl6YXRpb25cblx0aWYgKHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5zZXJpYWxpemUpIHNjaGVtZUhhbmRsZXIuc2VyaWFsaXplKGNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG5cdGlmIChjb21wb25lbnRzLmhvc3QpIHtcblx0XHQvL2lmIGhvc3QgY29tcG9uZW50IGlzIGFuIElQdjYgYWRkcmVzc1xuXHRcdGlmIChwcm90b2NvbC5JUFY2QUREUkVTUy50ZXN0KGNvbXBvbmVudHMuaG9zdCkpIHtcblx0XHRcdC8vVE9ETzogbm9ybWFsaXplIElQdjYgYWRkcmVzcyBhcyBwZXIgUkZDIDU5NTJcblx0XHR9XG5cblx0XHQvL2lmIGhvc3QgY29tcG9uZW50IGlzIGEgZG9tYWluIG5hbWVcblx0XHRlbHNlIGlmIChvcHRpb25zLmRvbWFpbkhvc3QgfHwgKHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5kb21haW5Ib3N0KSkge1xuXHRcdFx0Ly9jb252ZXJ0IElETiB2aWEgcHVueWNvZGVcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBvbmVudHMuaG9zdCA9ICghb3B0aW9ucy5pcmkgPyBwdW55Y29kZS50b0FTQ0lJKGNvbXBvbmVudHMuaG9zdC5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBwY3REZWNDaGFycykudG9Mb3dlckNhc2UoKSkgOiBwdW55Y29kZS50b1VuaWNvZGUoY29tcG9uZW50cy5ob3N0KSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiSG9zdCdzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvIFwiICsgKCFvcHRpb25zLmlyaSA/IFwiQVNDSUlcIiA6IFwiVW5pY29kZVwiKSArIFwiIHZpYSBwdW55Y29kZTogXCIgKyBlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vbm9ybWFsaXplIGVuY29kaW5nXG5cdF9ub3JtYWxpemVDb21wb25lbnRFbmNvZGluZyhjb21wb25lbnRzLCBwcm90b2NvbCk7XG5cblx0aWYgKG9wdGlvbnMucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIGNvbXBvbmVudHMuc2NoZW1lKSB7XG5cdFx0dXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5zY2hlbWUpO1xuXHRcdHVyaVRva2Vucy5wdXNoKFwiOlwiKTtcblx0fVxuXG5cdGNvbnN0IGF1dGhvcml0eSA9IF9yZWNvbXBvc2VBdXRob3JpdHkoY29tcG9uZW50cywgb3B0aW9ucyk7XG5cdGlmIChhdXRob3JpdHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdGlmIChvcHRpb25zLnJlZmVyZW5jZSAhPT0gXCJzdWZmaXhcIikge1xuXHRcdFx0dXJpVG9rZW5zLnB1c2goXCIvL1wiKTtcblx0XHR9XG5cblx0XHR1cmlUb2tlbnMucHVzaChhdXRob3JpdHkpO1xuXG5cdFx0aWYgKGNvbXBvbmVudHMucGF0aCAmJiBjb21wb25lbnRzLnBhdGguY2hhckF0KDApICE9PSBcIi9cIikge1xuXHRcdFx0dXJpVG9rZW5zLnB1c2goXCIvXCIpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChjb21wb25lbnRzLnBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdGxldCBzID0gY29tcG9uZW50cy5wYXRoO1xuXG5cdFx0aWYgKCFvcHRpb25zLmFic29sdXRlUGF0aCAmJiAoIXNjaGVtZUhhbmRsZXIgfHwgIXNjaGVtZUhhbmRsZXIuYWJzb2x1dGVQYXRoKSkge1xuXHRcdFx0cyA9IHJlbW92ZURvdFNlZ21lbnRzKHMpO1xuXHRcdH1cblxuXHRcdGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cyA9IHMucmVwbGFjZSgvXlxcL1xcLy8sIFwiLyUyRlwiKTsgIC8vZG9uJ3QgYWxsb3cgdGhlIHBhdGggdG8gc3RhcnQgd2l0aCBcIi8vXCJcblx0XHR9XG5cblx0XHR1cmlUb2tlbnMucHVzaChzKTtcblx0fVxuXG5cdGlmIChjb21wb25lbnRzLnF1ZXJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR1cmlUb2tlbnMucHVzaChcIj9cIik7XG5cdFx0dXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5xdWVyeSk7XG5cdH1cblxuXHRpZiAoY29tcG9uZW50cy5mcmFnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dXJpVG9rZW5zLnB1c2goXCIjXCIpO1xuXHRcdHVyaVRva2Vucy5wdXNoKGNvbXBvbmVudHMuZnJhZ21lbnQpO1xuXHR9XG5cblx0cmV0dXJuIHVyaVRva2Vucy5qb2luKFwiXCIpOyAgLy9tZXJnZSB0b2tlbnMgaW50byBhIHN0cmluZ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnRzKGJhc2U6VVJJQ29tcG9uZW50cywgcmVsYXRpdmU6VVJJQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zID0ge30sIHNraXBOb3JtYWxpemF0aW9uPzpib29sZWFuKTpVUklDb21wb25lbnRzIHtcblx0Y29uc3QgdGFyZ2V0OlVSSUNvbXBvbmVudHMgPSB7fTtcblxuXHRpZiAoIXNraXBOb3JtYWxpemF0aW9uKSB7XG5cdFx0YmFzZSA9IHBhcnNlKHNlcmlhbGl6ZShiYXNlLCBvcHRpb25zKSwgb3B0aW9ucyk7ICAvL25vcm1hbGl6ZSBiYXNlIGNvbXBvbmVudHNcblx0XHRyZWxhdGl2ZSA9IHBhcnNlKHNlcmlhbGl6ZShyZWxhdGl2ZSwgb3B0aW9ucyksIG9wdGlvbnMpOyAgLy9ub3JtYWxpemUgcmVsYXRpdmUgY29tcG9uZW50c1xuXHR9XG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdGlmICghb3B0aW9ucy50b2xlcmFudCAmJiByZWxhdGl2ZS5zY2hlbWUpIHtcblx0XHR0YXJnZXQuc2NoZW1lID0gcmVsYXRpdmUuc2NoZW1lO1xuXHRcdC8vdGFyZ2V0LmF1dGhvcml0eSA9IHJlbGF0aXZlLmF1dGhvcml0eTtcblx0XHR0YXJnZXQudXNlcmluZm8gPSByZWxhdGl2ZS51c2VyaW5mbztcblx0XHR0YXJnZXQuaG9zdCA9IHJlbGF0aXZlLmhvc3Q7XG5cdFx0dGFyZ2V0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuXHRcdHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCB8fCBcIlwiKTtcblx0XHR0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcblx0fSBlbHNlIHtcblx0XHRpZiAocmVsYXRpdmUudXNlcmluZm8gIT09IHVuZGVmaW5lZCB8fCByZWxhdGl2ZS5ob3N0ICE9PSB1bmRlZmluZWQgfHwgcmVsYXRpdmUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvL3RhcmdldC5hdXRob3JpdHkgPSByZWxhdGl2ZS5hdXRob3JpdHk7XG5cdFx0XHR0YXJnZXQudXNlcmluZm8gPSByZWxhdGl2ZS51c2VyaW5mbztcblx0XHRcdHRhcmdldC5ob3N0ID0gcmVsYXRpdmUuaG9zdDtcblx0XHRcdHRhcmdldC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcblx0XHRcdHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCB8fCBcIlwiKTtcblx0XHRcdHRhcmdldC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIXJlbGF0aXZlLnBhdGgpIHtcblx0XHRcdFx0dGFyZ2V0LnBhdGggPSBiYXNlLnBhdGg7XG5cdFx0XHRcdGlmIChyZWxhdGl2ZS5xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGFyZ2V0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFyZ2V0LnF1ZXJ5ID0gYmFzZS5xdWVyeTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHJlbGF0aXZlLnBhdGguY2hhckF0KDApID09PSBcIi9cIikge1xuXHRcdFx0XHRcdHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKChiYXNlLnVzZXJpbmZvICE9PSB1bmRlZmluZWQgfHwgYmFzZS5ob3N0ICE9PSB1bmRlZmluZWQgfHwgYmFzZS5wb3J0ICE9PSB1bmRlZmluZWQpICYmICFiYXNlLnBhdGgpIHtcblx0XHRcdFx0XHRcdHRhcmdldC5wYXRoID0gXCIvXCIgKyByZWxhdGl2ZS5wYXRoO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIWJhc2UucGF0aCkge1xuXHRcdFx0XHRcdFx0dGFyZ2V0LnBhdGggPSByZWxhdGl2ZS5wYXRoO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0YXJnZXQucGF0aCA9IGJhc2UucGF0aC5zbGljZSgwLCBiYXNlLnBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgKyByZWxhdGl2ZS5wYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0YXJnZXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHRhcmdldC5wYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcblx0XHRcdH1cblx0XHRcdC8vdGFyZ2V0LmF1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5O1xuXHRcdFx0dGFyZ2V0LnVzZXJpbmZvID0gYmFzZS51c2VyaW5mbztcblx0XHRcdHRhcmdldC5ob3N0ID0gYmFzZS5ob3N0O1xuXHRcdFx0dGFyZ2V0LnBvcnQgPSBiYXNlLnBvcnQ7XG5cdFx0fVxuXHRcdHRhcmdldC5zY2hlbWUgPSBiYXNlLnNjaGVtZTtcblx0fVxuXG5cdHRhcmdldC5mcmFnbWVudCA9IHJlbGF0aXZlLmZyYWdtZW50O1xuXG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShiYXNlVVJJOnN0cmluZywgcmVsYXRpdmVVUkk6c3RyaW5nLCBvcHRpb25zPzpVUklPcHRpb25zKTpzdHJpbmcge1xuXHRjb25zdCBzY2hlbWVsZXNzT3B0aW9ucyA9IGFzc2lnbih7IHNjaGVtZSA6ICdudWxsJyB9LCBvcHRpb25zKTtcblx0cmV0dXJuIHNlcmlhbGl6ZShyZXNvbHZlQ29tcG9uZW50cyhwYXJzZShiYXNlVVJJLCBzY2hlbWVsZXNzT3B0aW9ucyksIHBhcnNlKHJlbGF0aXZlVVJJLCBzY2hlbWVsZXNzT3B0aW9ucyksIHNjaGVtZWxlc3NPcHRpb25zLCB0cnVlKSwgc2NoZW1lbGVzc09wdGlvbnMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZSh1cmk6c3RyaW5nLCBvcHRpb25zPzpVUklPcHRpb25zKTpzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKHVyaTpVUklDb21wb25lbnRzLCBvcHRpb25zPzpVUklPcHRpb25zKTpVUklDb21wb25lbnRzO1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZSh1cmk6YW55LCBvcHRpb25zPzpVUklPcHRpb25zKTphbnkge1xuXHRpZiAodHlwZW9mIHVyaSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHVyaSA9IHNlcmlhbGl6ZShwYXJzZSh1cmksIG9wdGlvbnMpLCBvcHRpb25zKTtcblx0fSBlbHNlIGlmICh0eXBlT2YodXJpKSA9PT0gXCJvYmplY3RcIikge1xuXHRcdHVyaSA9IHBhcnNlKHNlcmlhbGl6ZSg8VVJJQ29tcG9uZW50cz51cmksIG9wdGlvbnMpLCBvcHRpb25zKTtcblx0fVxuXG5cdHJldHVybiB1cmk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWwodXJpQTpzdHJpbmcsIHVyaUI6c3RyaW5nLCBvcHRpb25zPzogVVJJT3B0aW9ucyk6Ym9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBlcXVhbCh1cmlBOlVSSUNvbXBvbmVudHMsIHVyaUI6VVJJQ29tcG9uZW50cywgb3B0aW9ucz86VVJJT3B0aW9ucyk6Ym9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBlcXVhbCh1cmlBOmFueSwgdXJpQjphbnksIG9wdGlvbnM/OlVSSU9wdGlvbnMpOmJvb2xlYW4ge1xuXHRpZiAodHlwZW9mIHVyaUEgPT09IFwic3RyaW5nXCIpIHtcblx0XHR1cmlBID0gc2VyaWFsaXplKHBhcnNlKHVyaUEsIG9wdGlvbnMpLCBvcHRpb25zKTtcblx0fSBlbHNlIGlmICh0eXBlT2YodXJpQSkgPT09IFwib2JqZWN0XCIpIHtcblx0XHR1cmlBID0gc2VyaWFsaXplKDxVUklDb21wb25lbnRzPnVyaUEsIG9wdGlvbnMpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB1cmlCID09PSBcInN0cmluZ1wiKSB7XG5cdFx0dXJpQiA9IHNlcmlhbGl6ZShwYXJzZSh1cmlCLCBvcHRpb25zKSwgb3B0aW9ucyk7XG5cdH0gZWxzZSBpZiAodHlwZU9mKHVyaUIpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0dXJpQiA9IHNlcmlhbGl6ZSg8VVJJQ29tcG9uZW50cz51cmlCLCBvcHRpb25zKTtcblx0fVxuXG5cdHJldHVybiB1cmlBID09PSB1cmlCO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUNvbXBvbmVudChzdHI6c3RyaW5nLCBvcHRpb25zPzpVUklPcHRpb25zKTpzdHJpbmcge1xuXHRyZXR1cm4gc3RyICYmIHN0ci50b1N0cmluZygpLnJlcGxhY2UoKCFvcHRpb25zIHx8ICFvcHRpb25zLmlyaSA/IFVSSV9QUk9UT0NPTC5FU0NBUEUgOiBJUklfUFJPVE9DT0wuRVNDQVBFKSwgcGN0RW5jQ2hhcik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGVDb21wb25lbnQoc3RyOnN0cmluZywgb3B0aW9ucz86VVJJT3B0aW9ucyk6c3RyaW5nIHtcblx0cmV0dXJuIHN0ciAmJiBzdHIudG9TdHJpbmcoKS5yZXBsYWNlKCghb3B0aW9ucyB8fCAhb3B0aW9ucy5pcmkgPyBVUklfUFJPVE9DT0wuUENUX0VOQ09ERUQgOiBJUklfUFJPVE9DT0wuUENUX0VOQ09ERUQpLCBwY3REZWNDaGFycyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuY29uc3QgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG4vKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG5jb25zdCBiYXNlID0gMzY7XG5jb25zdCB0TWluID0gMTtcbmNvbnN0IHRNYXggPSAyNjtcbmNvbnN0IHNrZXcgPSAzODtcbmNvbnN0IGRhbXAgPSA3MDA7XG5jb25zdCBpbml0aWFsQmlhcyA9IDcyO1xuY29uc3QgaW5pdGlhbE4gPSAxMjg7IC8vIDB4ODBcbmNvbnN0IGRlbGltaXRlciA9ICctJzsgLy8gJ1xceDJEJ1xuXG4vKiogUmVndWxhciBleHByZXNzaW9ucyAqL1xuY29uc3QgcmVnZXhQdW55Y29kZSA9IC9eeG4tLS87XG5jb25zdCByZWdleE5vbkFTQ0lJID0gL1teXFwwLVxceDdFXS87IC8vIG5vbi1BU0NJSSBjaGFyc1xuY29uc3QgcmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZzsgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG4vKiogRXJyb3IgbWVzc2FnZXMgKi9cbmNvbnN0IGVycm9ycyA9IHtcblx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0J25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcblx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcbn07XG5cbi8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cbmNvbnN0IGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbjtcbmNvbnN0IGZsb29yID0gTWF0aC5mbG9vcjtcbmNvbnN0IHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdHRocm93IG5ldyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG59XG5cbi8qKlxuICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuICogaXRlbS5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwKGFycmF5LCBmbikge1xuXHRjb25zdCByZXN1bHQgPSBbXTtcblx0bGV0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0cmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuICogYWRkcmVzc2VzLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcbiAqIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0Y29uc3QgcGFydHMgPSBzdHJpbmcuc3BsaXQoJ0AnKTtcblx0bGV0IHJlc3VsdCA9ICcnO1xuXHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHQvLyB0aGUgbG9jYWwgcGFydCAoaS5lLiBldmVyeXRoaW5nIHVwIHRvIGBAYCkgaW50YWN0LlxuXHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdHN0cmluZyA9IHBhcnRzWzFdO1xuXHR9XG5cdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0Y29uc3QgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XG5cdGNvbnN0IGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcbiAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGRlY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cbiAqL1xuZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0Y29uc3Qgb3V0cHV0ID0gW107XG5cdGxldCBjb3VudGVyID0gMDtcblx0Y29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0Ly8gSXQncyBhIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3Rlci5cblx0XHRcdGNvbnN0IGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLlxuXHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGVcblx0XHRcdFx0Ly8gbmV4dCBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuXG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG4gKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuICogQG5hbWUgZW5jb2RlXG4gKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuICovXG5jb25zdCB1Y3MyZW5jb2RlID0gYXJyYXkgPT4gU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uYXJyYXkpO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cbiAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG4gKi9cbmNvbnN0IGJhc2ljVG9EaWdpdCA9IGZ1bmN0aW9uKGNvZGVQb2ludCkge1xuXHRpZiAoY29kZVBvaW50IC0gMHgzMCA8IDB4MEEpIHtcblx0XHRyZXR1cm4gY29kZVBvaW50IC0gMHgxNjtcblx0fVxuXHRpZiAoY29kZVBvaW50IC0gMHg0MSA8IDB4MUEpIHtcblx0XHRyZXR1cm4gY29kZVBvaW50IC0gMHg0MTtcblx0fVxuXHRpZiAoY29kZVBvaW50IC0gMHg2MSA8IDB4MUEpIHtcblx0XHRyZXR1cm4gY29kZVBvaW50IC0gMHg2MTtcblx0fVxuXHRyZXR1cm4gYmFzZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IGRpZ2l0IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG4gKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuICogYDBgIHRvIGBiYXNlIC0gMWAuIElmIGBmbGFnYCBpcyBub24temVybywgdGhlIHVwcGVyY2FzZSBmb3JtIGlzXG4gKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cbiAqL1xuY29uc3QgZGlnaXRUb0Jhc2ljID0gZnVuY3Rpb24oZGlnaXQsIGZsYWcpIHtcblx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0Ly8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG5cdHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNikgLSAoKGZsYWcgIT0gMCkgPDwgNSk7XG59O1xuXG4vKipcbiAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgYWRhcHQgPSBmdW5jdGlvbihkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0bGV0IGsgPSAwO1xuXHRkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuXHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdGZvciAoLyogbm8gaW5pdGlhbGl6YXRpb24gKi87IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7XG5cdFx0ZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuXHR9XG5cdHJldHVybiBmbG9vcihrICsgKGJhc2VNaW51c1RNaW4gKyAxKSAqIGRlbHRhIC8gKGRlbHRhICsgc2tldykpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMgdG8gYSBzdHJpbmcgb2YgVW5pY29kZVxuICogc3ltYm9scy5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuICovXG5jb25zdCBkZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHQvLyBEb24ndCB1c2UgVUNTLTIuXG5cdGNvbnN0IG91dHB1dCA9IFtdO1xuXHRjb25zdCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0bGV0IGkgPSAwO1xuXHRsZXQgbiA9IGluaXRpYWxOO1xuXHRsZXQgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6IGxldCBgYmFzaWNgIGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgY29kZVxuXHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRsZXQgYmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0YmFzaWMgPSAwO1xuXHR9XG5cblx0Zm9yIChsZXQgaiA9IDA7IGogPCBiYXNpYzsgKytqKSB7XG5cdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0ZXJyb3IoJ25vdC1iYXNpYycpO1xuXHRcdH1cblx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0fVxuXG5cdC8vIE1haW4gZGVjb2RpbmcgbG9vcDogc3RhcnQganVzdCBhZnRlciB0aGUgbGFzdCBkZWxpbWl0ZXIgaWYgYW55IGJhc2ljIGNvZGVcblx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRmb3IgKGxldCBpbmRleCA9IGJhc2ljID4gMCA/IGJhc2ljICsgMSA6IDA7IGluZGV4IDwgaW5wdXRMZW5ndGg7IC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi8pIHtcblxuXHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHQvLyBEZWNvZGUgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBpbnRvIGBkZWx0YWAsXG5cdFx0Ly8gd2hpY2ggZ2V0cyBhZGRlZCB0byBgaWAuIFRoZSBvdmVyZmxvdyBjaGVja2luZyBpcyBlYXNpZXJcblx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdC8vIHZhbHVlIGF0IHRoZSBlbmQgdG8gb2J0YWluIGBkZWx0YWAuXG5cdFx0bGV0IG9sZGkgPSBpO1xuXHRcdGZvciAobGV0IHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdGNvbnN0IHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPCB0KSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHR9XG5cblx0XHRjb25zdCBvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHR9XG5cblx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdGkgJT0gb3V0O1xuXG5cdFx0Ly8gSW5zZXJ0IGBuYCBhdCBwb3NpdGlvbiBgaWAgb2YgdGhlIG91dHB1dC5cblx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0fVxuXG5cdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5vdXRwdXQpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgKGUuZy4gYSBkb21haW4gbmFtZSBsYWJlbCkgdG8gYVxuICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICovXG5jb25zdCBlbmNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRjb25zdCBvdXRwdXQgPSBbXTtcblxuXHQvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBhbiBhcnJheSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLlxuXHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdC8vIENhY2hlIHRoZSBsZW5ndGguXG5cdGxldCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuXHQvLyBJbml0aWFsaXplIHRoZSBzdGF0ZS5cblx0bGV0IG4gPSBpbml0aWFsTjtcblx0bGV0IGRlbHRhID0gMDtcblx0bGV0IGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzLlxuXHRmb3IgKGNvbnN0IGN1cnJlbnRWYWx1ZSBvZiBpbnB1dCkge1xuXHRcdGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG5cdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0fVxuXHR9XG5cblx0bGV0IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblx0bGV0IGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGg7XG5cblx0Ly8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyB3aXRoIGEgZGVsaW1pdGVyIHVubGVzcyBpdCdzIGVtcHR5LlxuXHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xuXHR9XG5cblx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHR3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuXG5cdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0bGV0IG0gPSBtYXhJbnQ7XG5cdFx0Zm9yIChjb25zdCBjdXJyZW50VmFsdWUgb2YgaW5wdXQpIHtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG5cdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuXHRcdGNvbnN0IGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0fVxuXG5cdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRuID0gbTtcblxuXHRcdGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIGlucHV0KSB7XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG5cdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxuXHRcdFx0XHRsZXQgcSA9IGRlbHRhO1xuXHRcdFx0XHRmb3IgKGxldCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRjb25zdCB0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcblx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBxTWludXNUID0gcSAtIHQ7XG5cdFx0XHRcdFx0Y29uc3QgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdG91dHB1dC5wdXNoKFxuXHRcdFx0XHRcdFx0c3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QsIDApKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0YmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCsrZGVsdGE7XG5cdFx0KytuO1xuXG5cdH1cblx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzc1xuICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG4gKiBjb252ZXJ0ZWQgdG8gVW5pY29kZS5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuICogY29udmVydCB0byBVbmljb2RlLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG4gKiBzdHJpbmcuXG4gKi9cbmNvbnN0IHRvVW5pY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0PyBkZWNvZGUoc3RyaW5nLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHQ6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xuICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG4gKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cbiAqIEFTQ0lJLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuICogVW5pY29kZSBzdHJpbmcuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG4gKiBlbWFpbCBhZGRyZXNzLlxuICovXG5jb25zdCB0b0FTQ0lJID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHQ/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpXG5cdFx0XHQ6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqIERlZmluZSB0aGUgcHVibGljIEFQSSAqL1xuY29uc3QgcHVueWNvZGUgPSB7XG5cdC8qKlxuXHQgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgUHVueWNvZGUuanMgdmVyc2lvbiBudW1iZXIuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAdHlwZSBTdHJpbmdcblx0ICovXG5cdCd2ZXJzaW9uJzogJzIuMS4wJyxcblx0LyoqXG5cdCAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyXG5cdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHQndWNzMic6IHtcblx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHR9LFxuXHQnZGVjb2RlJzogZGVjb2RlLFxuXHQnZW5jb2RlJzogZW5jb2RlLFxuXHQndG9BU0NJSSc6IHRvQVNDSUksXG5cdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHB1bnljb2RlO1xuIiwgImltcG9ydCB7IFVSSVJlZ0V4cHMgfSBmcm9tIFwiLi91cmlcIjtcbmltcG9ydCB7IGJ1aWxkRXhwcyB9IGZyb20gXCIuL3JlZ2V4cHMtdXJpXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkRXhwcyh0cnVlKTtcbiIsICJpbXBvcnQgeyBVUklSZWdFeHBzIH0gZnJvbSBcIi4vdXJpXCI7XG5pbXBvcnQgeyBtZXJnZSwgc3ViZXhwIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBzKGlzSVJJOmJvb2xlYW4pOlVSSVJlZ0V4cHMge1xuXHRjb25zdFxuXHRcdEFMUEhBJCQgPSBcIltBLVphLXpdXCIsXG5cdFx0Q1IkID0gXCJbXFxcXHgwRF1cIixcblx0XHRESUdJVCQkID0gXCJbMC05XVwiLFxuXHRcdERRVU9URSQkID0gXCJbXFxcXHgyMl1cIixcblx0XHRIRVhESUckJCA9IG1lcmdlKERJR0lUJCQsIFwiW0EtRmEtZl1cIiksICAvL2Nhc2UtaW5zZW5zaXRpdmVcblx0XHRMRiQkID0gXCJbXFxcXHgwQV1cIixcblx0XHRTUCQkID0gXCJbXFxcXHgyMF1cIixcblx0XHRQQ1RfRU5DT0RFRCQgPSBzdWJleHAoc3ViZXhwKFwiJVtFRmVmXVwiICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIlWzg5QS1GYS1mXVwiICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSksICAvL2V4cGFuZGVkXG5cdFx0R0VOX0RFTElNUyQkID0gXCJbXFxcXDpcXFxcL1xcXFw/XFxcXCNcXFxcW1xcXFxdXFxcXEBdXCIsXG5cdFx0U1VCX0RFTElNUyQkID0gXCJbXFxcXCFcXFxcJFxcXFwmXFxcXCdcXFxcKFxcXFwpXFxcXCpcXFxcK1xcXFwsXFxcXDtcXFxcPV1cIixcblx0XHRSRVNFUlZFRCQkID0gbWVyZ2UoR0VOX0RFTElNUyQkLCBTVUJfREVMSU1TJCQpLFxuXHRcdFVDU0NIQVIkJCA9IGlzSVJJID8gXCJbXFxcXHhBMC1cXFxcdTIwMERcXFxcdTIwMTAtXFxcXHUyMDI5XFxcXHUyMDJGLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkVGXVwiIDogXCJbXVwiLCAgLy9zdWJzZXQsIGV4Y2x1ZGVzIGJpZGkgY29udHJvbCBjaGFyYWN0ZXJzXG5cdFx0SVBSSVZBVEUkJCA9IGlzSVJJID8gXCJbXFxcXHVFMDAwLVxcXFx1RjhGRl1cIiA6IFwiW11cIiwgIC8vc3Vic2V0XG5cdFx0VU5SRVNFUlZFRCQkID0gbWVyZ2UoQUxQSEEkJCwgRElHSVQkJCwgXCJbXFxcXC1cXFxcLlxcXFxfXFxcXH5dXCIsIFVDU0NIQVIkJCksXG5cdFx0U0NIRU1FJCA9IHN1YmV4cChBTFBIQSQkICsgbWVyZ2UoQUxQSEEkJCwgRElHSVQkJCwgXCJbXFxcXCtcXFxcLVxcXFwuXVwiKSArIFwiKlwiKSxcblx0XHRVU0VSSU5GTyQgPSBzdWJleHAoc3ViZXhwKFBDVF9FTkNPREVEJCArIFwifFwiICsgbWVyZ2UoVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XVwiKSkgKyBcIipcIiksXG5cdFx0REVDX09DVEVUJCA9IHN1YmV4cChzdWJleHAoXCIyNVswLTVdXCIpICsgXCJ8XCIgKyBzdWJleHAoXCIyWzAtNF1cIiArIERJR0lUJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIxXCIgKyBESUdJVCQkICsgRElHSVQkJCkgKyBcInxcIiArIHN1YmV4cChcIlsxLTldXCIgKyBESUdJVCQkKSArIFwifFwiICsgRElHSVQkJCksXG5cdFx0REVDX09DVEVUX1JFTEFYRUQkID0gc3ViZXhwKHN1YmV4cChcIjI1WzAtNV1cIikgKyBcInxcIiArIHN1YmV4cChcIjJbMC00XVwiICsgRElHSVQkJCkgKyBcInxcIiArIHN1YmV4cChcIjFcIiArIERJR0lUJCQgKyBESUdJVCQkKSArIFwifFwiICsgc3ViZXhwKFwiMD9bMS05XVwiICsgRElHSVQkJCkgKyBcInwwPzA/XCIgKyBESUdJVCQkKSwgIC8vcmVsYXhlZCBwYXJzaW5nIHJ1bGVzXG5cdFx0SVBWNEFERFJFU1MkID0gc3ViZXhwKERFQ19PQ1RFVF9SRUxBWEVEJCArIFwiXFxcXC5cIiArIERFQ19PQ1RFVF9SRUxBWEVEJCArIFwiXFxcXC5cIiArIERFQ19PQ1RFVF9SRUxBWEVEJCArIFwiXFxcXC5cIiArIERFQ19PQ1RFVF9SRUxBWEVEJCksXG5cdFx0SDE2JCA9IHN1YmV4cChIRVhESUckJCArIFwiezEsNH1cIiksXG5cdFx0TFMzMiQgPSBzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIgKyBIMTYkKSArIFwifFwiICsgSVBWNEFERFJFU1MkKSxcblx0XHRJUFY2QUREUkVTUzEkID0gc3ViZXhwKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezZ9XCIgKyBMUzMyJCksIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgNiggaDE2IFwiOlwiICkgbHMzMlxuXHRcdElQVjZBRERSRVNTMiQgPSBzdWJleHAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxcXDpcXFxcOlwiICsgc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7NX1cIiArIExTMzIkKSwgLy8gICAgICAgICAgICAgICAgICAgICAgXCI6OlwiIDUoIGgxNiBcIjpcIiApIGxzMzJcblx0XHRJUFY2QUREUkVTUzMkID0gc3ViZXhwKHN1YmV4cCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMTYkKSArIFwiP1xcXFw6XFxcXDpcIiArIHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezR9XCIgKyBMUzMyJCksIC8vWyAgICAgICAgICAgICAgIGgxNiBdIFwiOjpcIiA0KCBoMTYgXCI6XCIgKSBsczMyXG5cdFx0SVBWNkFERFJFU1M0JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwxfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInszfVwiICsgTFMzMiQpLCAvL1sgKjEoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAzKCBoMTYgXCI6XCIgKSBsczMyXG5cdFx0SVBWNkFERFJFU1M1JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwyfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInsyfVwiICsgTFMzMiQpLCAvL1sgKjIoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAyKCBoMTYgXCI6XCIgKSBsczMyXG5cdFx0SVBWNkFERFJFU1M2JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwzfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyAgICAgICAgSDE2JCArIFwiXFxcXDpcIiAgICAgICAgICArIExTMzIkKSwgLy9bICozKCBoMTYgXCI6XCIgKSBoMTYgXSBcIjo6XCIgICAgaDE2IFwiOlwiICAgbHMzMlxuXHRcdElQVjZBRERSRVNTNyQgPSBzdWJleHAoc3ViZXhwKHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezAsNH1cIiArIEgxNiQpICsgXCI/XFxcXDpcXFxcOlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExTMzIkKSwgLy9bICo0KCBoMTYgXCI6XCIgKSBoMTYgXSBcIjo6XCIgICAgICAgICAgICAgIGxzMzJcblx0XHRJUFY2QUREUkVTUzgkID0gc3ViZXhwKHN1YmV4cChzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInswLDV9XCIgKyBIMTYkKSArIFwiP1xcXFw6XFxcXDpcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBIMTYkICksIC8vWyAqNSggaDE2IFwiOlwiICkgaDE2IF0gXCI6OlwiICAgICAgICAgICAgICBoMTZcblx0XHRJUFY2QUREUkVTUzkkID0gc3ViZXhwKHN1YmV4cChzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInswLDZ9XCIgKyBIMTYkKSArIFwiP1xcXFw6XFxcXDpcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIC8vWyAqNiggaDE2IFwiOlwiICkgaDE2IF0gXCI6OlwiXG5cdFx0SVBWNkFERFJFU1MkID0gc3ViZXhwKFtJUFY2QUREUkVTUzEkLCBJUFY2QUREUkVTUzIkLCBJUFY2QUREUkVTUzMkLCBJUFY2QUREUkVTUzQkLCBJUFY2QUREUkVTUzUkLCBJUFY2QUREUkVTUzYkLCBJUFY2QUREUkVTUzckLCBJUFY2QUREUkVTUzgkLCBJUFY2QUREUkVTUzkkXS5qb2luKFwifFwiKSksXG5cdFx0Wk9ORUlEJCA9IHN1YmV4cChzdWJleHAoVU5SRVNFUlZFRCQkICsgXCJ8XCIgKyBQQ1RfRU5DT0RFRCQpICsgXCIrXCIpLCAgLy9SRkMgNjg3NFxuXHRcdElQVjZBRERSWiQgPSBzdWJleHAoSVBWNkFERFJFU1MkICsgXCJcXFxcJTI1XCIgKyBaT05FSUQkKSwgIC8vUkZDIDY4NzRcblx0XHRJUFY2QUREUlpfUkVMQVhFRCQgPSBzdWJleHAoSVBWNkFERFJFU1MkICsgc3ViZXhwKFwiXFxcXCUyNXxcXFxcJSg/IVwiICsgSEVYRElHJCQgKyBcInsyfSlcIikgKyBaT05FSUQkKSwgIC8vUkZDIDY4NzQsIHdpdGggcmVsYXhlZCBwYXJzaW5nIHJ1bGVzXG5cdFx0SVBWRlVUVVJFJCA9IHN1YmV4cChcIlt2Vl1cIiArIEhFWERJRyQkICsgXCIrXFxcXC5cIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOl1cIikgKyBcIitcIiksXG5cdFx0SVBfTElURVJBTCQgPSBzdWJleHAoXCJcXFxcW1wiICsgc3ViZXhwKElQVjZBRERSWl9SRUxBWEVEJCArIFwifFwiICsgSVBWNkFERFJFU1MkICsgXCJ8XCIgKyBJUFZGVVRVUkUkKSArIFwiXFxcXF1cIiksICAvL1JGQyA2ODc0XG5cdFx0UkVHX05BTUUkID0gc3ViZXhwKHN1YmV4cChQQ1RfRU5DT0RFRCQgKyBcInxcIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSkgKyBcIipcIiksXG5cdFx0SE9TVCQgPSBzdWJleHAoSVBfTElURVJBTCQgKyBcInxcIiArIElQVjRBRERSRVNTJCArIFwiKD8hXCIgKyBSRUdfTkFNRSQgKyBcIilcIiArIFwifFwiICsgUkVHX05BTUUkKSxcblx0XHRQT1JUJCA9IHN1YmV4cChESUdJVCQkICsgXCIqXCIpLFxuXHRcdEFVVEhPUklUWSQgPSBzdWJleHAoc3ViZXhwKFVTRVJJTkZPJCArIFwiQFwiKSArIFwiP1wiICsgSE9TVCQgKyBzdWJleHAoXCJcXFxcOlwiICsgUE9SVCQpICsgXCI/XCIpLFxuXHRcdFBDSEFSJCA9IHN1YmV4cChQQ1RfRU5DT0RFRCQgKyBcInxcIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOlxcXFxAXVwiKSksXG5cdFx0U0VHTUVOVCQgPSBzdWJleHAoUENIQVIkICsgXCIqXCIpLFxuXHRcdFNFR01FTlRfTlokID0gc3ViZXhwKFBDSEFSJCArIFwiK1wiKSxcblx0XHRTRUdNRU5UX05aX05DJCA9IHN1YmV4cChzdWJleHAoUENUX0VOQ09ERUQkICsgXCJ8XCIgKyBtZXJnZShVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXEBdXCIpKSArIFwiK1wiKSxcblx0XHRQQVRIX0FCRU1QVFkkID0gc3ViZXhwKHN1YmV4cChcIlxcXFwvXCIgKyBTRUdNRU5UJCkgKyBcIipcIiksXG5cdFx0UEFUSF9BQlNPTFVURSQgPSBzdWJleHAoXCJcXFxcL1wiICsgc3ViZXhwKFNFR01FTlRfTlokICsgUEFUSF9BQkVNUFRZJCkgKyBcIj9cIiksICAvL3NpbXBsaWZpZWRcblx0XHRQQVRIX05PU0NIRU1FJCA9IHN1YmV4cChTRUdNRU5UX05aX05DJCArIFBBVEhfQUJFTVBUWSQpLCAgLy9zaW1wbGlmaWVkXG5cdFx0UEFUSF9ST09UTEVTUyQgPSBzdWJleHAoU0VHTUVOVF9OWiQgKyBQQVRIX0FCRU1QVFkkKSwgIC8vc2ltcGxpZmllZFxuXHRcdFBBVEhfRU1QVFkkID0gXCIoPyFcIiArIFBDSEFSJCArIFwiKVwiLFxuXHRcdFBBVEgkID0gc3ViZXhwKFBBVEhfQUJFTVBUWSQgKyBcInxcIiArIFBBVEhfQUJTT0xVVEUkICsgXCJ8XCIgKyBQQVRIX05PU0NIRU1FJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkKSxcblx0XHRRVUVSWSQgPSBzdWJleHAoc3ViZXhwKFBDSEFSJCArIFwifFwiICsgbWVyZ2UoXCJbXFxcXC9cXFxcP11cIiwgSVBSSVZBVEUkJCkpICsgXCIqXCIpLFxuXHRcdEZSQUdNRU5UJCA9IHN1YmV4cChzdWJleHAoUENIQVIkICsgXCJ8W1xcXFwvXFxcXD9dXCIpICsgXCIqXCIpLFxuXHRcdEhJRVJfUEFSVCQgPSBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcL1wiICsgQVVUSE9SSVRZJCArIFBBVEhfQUJFTVBUWSQpICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkKSxcblx0XHRVUkkkID0gc3ViZXhwKFNDSEVNRSQgKyBcIlxcXFw6XCIgKyBISUVSX1BBUlQkICsgc3ViZXhwKFwiXFxcXD9cIiArIFFVRVJZJCkgKyBcIj9cIiArIHN1YmV4cChcIlxcXFwjXCIgKyBGUkFHTUVOVCQpICsgXCI/XCIpLFxuXHRcdFJFTEFUSVZFX1BBUlQkID0gc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC9cIiArIEFVVEhPUklUWSQgKyBQQVRIX0FCRU1QVFkkKSArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfTk9TQ0hFTUUkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCksXG5cdFx0UkVMQVRJVkUkID0gc3ViZXhwKFJFTEFUSVZFX1BBUlQkICsgc3ViZXhwKFwiXFxcXD9cIiArIFFVRVJZJCkgKyBcIj9cIiArIHN1YmV4cChcIlxcXFwjXCIgKyBGUkFHTUVOVCQpICsgXCI/XCIpLFxuXHRcdFVSSV9SRUZFUkVOQ0UkID0gc3ViZXhwKFVSSSQgKyBcInxcIiArIFJFTEFUSVZFJCksXG5cdFx0QUJTT0xVVEVfVVJJJCA9IHN1YmV4cChTQ0hFTUUkICsgXCJcXFxcOlwiICsgSElFUl9QQVJUJCArIHN1YmV4cChcIlxcXFw/XCIgKyBRVUVSWSQpICsgXCI/XCIpLFxuXG5cdFx0R0VORVJJQ19SRUYkID0gXCJeKFwiICsgU0NIRU1FJCArIFwiKVxcXFw6XCIgKyBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcLyhcIiArIHN1YmV4cChcIihcIiArIFVTRVJJTkZPJCArIFwiKUBcIikgKyBcIj8oXCIgKyBIT1NUJCArIFwiKVwiICsgc3ViZXhwKFwiXFxcXDooXCIgKyBQT1JUJCArIFwiKVwiKSArIFwiPylcIikgKyBcIj8oXCIgKyBQQVRIX0FCRU1QVFkkICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkICsgXCIpXCIpICsgc3ViZXhwKFwiXFxcXD8oXCIgKyBRVUVSWSQgKyBcIilcIikgKyBcIj9cIiArIHN1YmV4cChcIlxcXFwjKFwiICsgRlJBR01FTlQkICsgXCIpXCIpICsgXCI/JFwiLFxuXHRcdFJFTEFUSVZFX1JFRiQgPSBcIl4oKXswfVwiICsgc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC8oXCIgKyBzdWJleHAoXCIoXCIgKyBVU0VSSU5GTyQgKyBcIilAXCIpICsgXCI/KFwiICsgSE9TVCQgKyBcIilcIiArIHN1YmV4cChcIlxcXFw6KFwiICsgUE9SVCQgKyBcIilcIikgKyBcIj8pXCIpICsgXCI/KFwiICsgUEFUSF9BQkVNUFRZJCArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfTk9TQ0hFTUUkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCArIFwiKVwiKSArIHN1YmV4cChcIlxcXFw/KFwiICsgUVVFUlkkICsgXCIpXCIpICsgXCI/XCIgKyBzdWJleHAoXCJcXFxcIyhcIiArIEZSQUdNRU5UJCArIFwiKVwiKSArIFwiPyRcIixcblx0XHRBQlNPTFVURV9SRUYkID0gXCJeKFwiICsgU0NIRU1FJCArIFwiKVxcXFw6XCIgKyBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcLyhcIiArIHN1YmV4cChcIihcIiArIFVTRVJJTkZPJCArIFwiKUBcIikgKyBcIj8oXCIgKyBIT1NUJCArIFwiKVwiICsgc3ViZXhwKFwiXFxcXDooXCIgKyBQT1JUJCArIFwiKVwiKSArIFwiPylcIikgKyBcIj8oXCIgKyBQQVRIX0FCRU1QVFkkICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkICsgXCIpXCIpICsgc3ViZXhwKFwiXFxcXD8oXCIgKyBRVUVSWSQgKyBcIilcIikgKyBcIj8kXCIsXG5cdFx0U0FNRURPQ19SRUYkID0gXCJeXCIgKyBzdWJleHAoXCJcXFxcIyhcIiArIEZSQUdNRU5UJCArIFwiKVwiKSArIFwiPyRcIixcblx0XHRBVVRIT1JJVFlfUkVGJCA9IFwiXlwiICsgc3ViZXhwKFwiKFwiICsgVVNFUklORk8kICsgXCIpQFwiKSArIFwiPyhcIiArIEhPU1QkICsgXCIpXCIgKyBzdWJleHAoXCJcXFxcOihcIiArIFBPUlQkICsgXCIpXCIpICsgXCI/JFwiXG5cdDtcblxuXHRyZXR1cm4ge1xuXHRcdE5PVF9TQ0hFTUUgOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIEFMUEhBJCQsIERJR0lUJCQsIFwiW1xcXFwrXFxcXC1cXFxcLl1cIiksIFwiZ1wiKSxcblx0XHROT1RfVVNFUklORk8gOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJVxcXFw6XVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcblx0XHROT1RfSE9TVCA6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXFxcXFtcXFxcXVxcXFw6XVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcblx0XHROT1RfUEFUSCA6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXFxcXC9cXFxcOlxcXFxAXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcblx0XHROT1RfUEFUSF9OT1NDSEVNRSA6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXFxcXC9cXFxcQF1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQpLCBcImdcIiksXG5cdFx0Tk9UX1FVRVJZIDogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOlxcXFxAXFxcXC9cXFxcP11cIiwgSVBSSVZBVEUkJCksIFwiZ1wiKSxcblx0XHROT1RfRlJBR01FTlQgOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJV1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XFxcXEBcXFxcL1xcXFw/XVwiKSwgXCJnXCIpLFxuXHRcdEVTQ0FQRSA6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXl1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQpLCBcImdcIiksXG5cdFx0VU5SRVNFUlZFRCA6IG5ldyBSZWdFeHAoVU5SRVNFUlZFRCQkLCBcImdcIiksXG5cdFx0T1RIRVJfQ0hBUlMgOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJV1cIiwgVU5SRVNFUlZFRCQkLCBSRVNFUlZFRCQkKSwgXCJnXCIpLFxuXHRcdFBDVF9FTkNPREVEIDogbmV3IFJlZ0V4cChQQ1RfRU5DT0RFRCQsIFwiZ1wiKSxcblx0XHRJUFY0QUREUkVTUyA6IG5ldyBSZWdFeHAoXCJeKFwiICsgSVBWNEFERFJFU1MkICsgXCIpJFwiKSxcblx0XHRJUFY2QUREUkVTUyA6IG5ldyBSZWdFeHAoXCJeXFxcXFs/KFwiICsgSVBWNkFERFJFU1MkICsgXCIpXCIgKyBzdWJleHAoc3ViZXhwKFwiXFxcXCUyNXxcXFxcJSg/IVwiICsgSEVYRElHJCQgKyBcInsyfSlcIikgKyBcIihcIiArIFpPTkVJRCQgKyBcIilcIikgKyBcIj9cXFxcXT8kXCIpICAvL1JGQyA2ODc0LCB3aXRoIHJlbGF4ZWQgcGFyc2luZyBydWxlc1xuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBidWlsZEV4cHMoZmFsc2UpO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBtZXJnZSguLi5zZXRzOkFycmF5PHN0cmluZz4pOnN0cmluZyB7XG5cdGlmIChzZXRzLmxlbmd0aCA+IDEpIHtcblx0XHRzZXRzWzBdID0gc2V0c1swXS5zbGljZSgwLCAtMSk7XG5cdFx0Y29uc3QgeGwgPSBzZXRzLmxlbmd0aCAtIDE7XG5cdFx0Zm9yIChsZXQgeCA9IDE7IHggPCB4bDsgKyt4KSB7XG5cdFx0XHRzZXRzW3hdID0gc2V0c1t4XS5zbGljZSgxLCAtMSk7XG5cdFx0fVxuXHRcdHNldHNbeGxdID0gc2V0c1t4bF0uc2xpY2UoMSk7XG5cdFx0cmV0dXJuIHNldHMuam9pbignJyk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHNldHNbMF07XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YmV4cChzdHI6c3RyaW5nKTpzdHJpbmcge1xuXHRyZXR1cm4gXCIoPzpcIiArIHN0ciArIFwiKVwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZU9mKG86YW55KTpzdHJpbmcge1xuXHRyZXR1cm4gbyA9PT0gdW5kZWZpbmVkID8gXCJ1bmRlZmluZWRcIiA6IChvID09PSBudWxsID8gXCJudWxsXCIgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc3BsaXQoXCIgXCIpLnBvcCgpLnNwbGl0KFwiXVwiKS5zaGlmdCgpLnRvTG93ZXJDYXNlKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9VcHBlckNhc2Uoc3RyOnN0cmluZyk6c3RyaW5nIHtcblx0cmV0dXJuIHN0ci50b1VwcGVyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheShvYmo6YW55KTpBcnJheTxhbnk+IHtcblx0cmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCA/IChvYmogaW5zdGFuY2VvZiBBcnJheSA/IG9iaiA6ICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gXCJudW1iZXJcIiB8fCBvYmouc3BsaXQgfHwgb2JqLnNldEludGVydmFsIHx8IG9iai5jYWxsID8gW29ial0gOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmopKSkgOiBbXTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKHRhcmdldDogb2JqZWN0LCBzb3VyY2U6IGFueSk6IGFueSB7XG5cdGNvbnN0IG9iaiA9IHRhcmdldCBhcyBhbnk7XG5cdGlmIChzb3VyY2UpIHtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcblx0XHRcdG9ialtrZXldID0gc291cmNlW2tleV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvYmo7XG59IiwgIid1c2Ugc3RyaWN0JztcblxuLy8gZG8gbm90IGVkaXQgLmpzIGZpbGVzIGRpcmVjdGx5IC0gZWRpdCBzcmMvaW5kZXguanN0XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFlcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRydWUgaWYgYm90aCBOYU4sIGZhbHNlIG90aGVyd2lzZVxuICByZXR1cm4gYSE9PWEgJiYgYiE9PWI7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmdcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9wdW55Y29kZS5qcyAtIHB1bnljb2RlLnVjczIuZGVjb2RlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHVjczJsZW5ndGgoc3RyKSB7XG4gIHZhciBsZW5ndGggPSAwXG4gICAgLCBsZW4gPSBzdHIubGVuZ3RoXG4gICAgLCBwb3MgPSAwXG4gICAgLCB2YWx1ZTtcbiAgd2hpbGUgKHBvcyA8IGxlbikge1xuICAgIGxlbmd0aCsrO1xuICAgIHZhbHVlID0gc3RyLmNoYXJDb2RlQXQocG9zKyspO1xuICAgIGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIHBvcyA8IGxlbikge1xuICAgICAgLy8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG4gICAgICB2YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICBpZiAoKHZhbHVlICYgMHhGQzAwKSA9PSAweERDMDApIHBvcysrOyAvLyBsb3cgc3Vycm9nYXRlXG4gICAgfVxuICB9XG4gIHJldHVybiBsZW5ndGg7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29weTogY29weSxcbiAgY2hlY2tEYXRhVHlwZTogY2hlY2tEYXRhVHlwZSxcbiAgY2hlY2tEYXRhVHlwZXM6IGNoZWNrRGF0YVR5cGVzLFxuICBjb2VyY2VUb1R5cGVzOiBjb2VyY2VUb1R5cGVzLFxuICB0b0hhc2g6IHRvSGFzaCxcbiAgZ2V0UHJvcGVydHk6IGdldFByb3BlcnR5LFxuICBlc2NhcGVRdW90ZXM6IGVzY2FwZVF1b3RlcyxcbiAgZXF1YWw6IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpLFxuICB1Y3MybGVuZ3RoOiByZXF1aXJlKCcuL3VjczJsZW5ndGgnKSxcbiAgdmFyT2NjdXJlbmNlczogdmFyT2NjdXJlbmNlcyxcbiAgdmFyUmVwbGFjZTogdmFyUmVwbGFjZSxcbiAgc2NoZW1hSGFzUnVsZXM6IHNjaGVtYUhhc1J1bGVzLFxuICBzY2hlbWFIYXNSdWxlc0V4Y2VwdDogc2NoZW1hSGFzUnVsZXNFeGNlcHQsXG4gIHNjaGVtYVVua25vd25SdWxlczogc2NoZW1hVW5rbm93blJ1bGVzLFxuICB0b1F1b3RlZFN0cmluZzogdG9RdW90ZWRTdHJpbmcsXG4gIGdldFBhdGhFeHByOiBnZXRQYXRoRXhwcixcbiAgZ2V0UGF0aDogZ2V0UGF0aCxcbiAgZ2V0RGF0YTogZ2V0RGF0YSxcbiAgdW5lc2NhcGVGcmFnbWVudDogdW5lc2NhcGVGcmFnbWVudCxcbiAgdW5lc2NhcGVKc29uUG9pbnRlcjogdW5lc2NhcGVKc29uUG9pbnRlcixcbiAgZXNjYXBlRnJhZ21lbnQ6IGVzY2FwZUZyYWdtZW50LFxuICBlc2NhcGVKc29uUG9pbnRlcjogZXNjYXBlSnNvblBvaW50ZXJcbn07XG5cblxuZnVuY3Rpb24gY29weShvLCB0bykge1xuICB0byA9IHRvIHx8IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gbykgdG9ba2V5XSA9IG9ba2V5XTtcbiAgcmV0dXJuIHRvO1xufVxuXG5cbmZ1bmN0aW9uIGNoZWNrRGF0YVR5cGUoZGF0YVR5cGUsIGRhdGEsIHN0cmljdE51bWJlcnMsIG5lZ2F0ZSkge1xuICB2YXIgRVFVQUwgPSBuZWdhdGUgPyAnICE9PSAnIDogJyA9PT0gJ1xuICAgICwgQU5EID0gbmVnYXRlID8gJyB8fCAnIDogJyAmJiAnXG4gICAgLCBPSyA9IG5lZ2F0ZSA/ICchJyA6ICcnXG4gICAgLCBOT1QgPSBuZWdhdGUgPyAnJyA6ICchJztcbiAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgIGNhc2UgJ251bGwnOiByZXR1cm4gZGF0YSArIEVRVUFMICsgJ251bGwnO1xuICAgIGNhc2UgJ2FycmF5JzogcmV0dXJuIE9LICsgJ0FycmF5LmlzQXJyYXkoJyArIGRhdGEgKyAnKSc7XG4gICAgY2FzZSAnb2JqZWN0JzogcmV0dXJuICcoJyArIE9LICsgZGF0YSArIEFORCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlb2YgJyArIGRhdGEgKyBFUVVBTCArICdcIm9iamVjdFwiJyArIEFORCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIE5PVCArICdBcnJheS5pc0FycmF5KCcgKyBkYXRhICsgJykpJztcbiAgICBjYXNlICdpbnRlZ2VyJzogcmV0dXJuICcodHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCJudW1iZXJcIicgKyBBTkQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UICsgJygnICsgZGF0YSArICcgJSAxKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EICsgZGF0YSArIEVRVUFMICsgZGF0YSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaWN0TnVtYmVycyA/IChBTkQgKyBPSyArICdpc0Zpbml0ZSgnICsgZGF0YSArICcpJykgOiAnJykgKyAnKSc7XG4gICAgY2FzZSAnbnVtYmVyJzogcmV0dXJuICcodHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCInICsgZGF0YVR5cGUgKyAnXCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmljdE51bWJlcnMgPyAoQU5EICsgT0sgKyAnaXNGaW5pdGUoJyArIGRhdGEgKyAnKScpIDogJycpICsgJyknO1xuICAgIGRlZmF1bHQ6IHJldHVybiAndHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCInICsgZGF0YVR5cGUgKyAnXCInO1xuICB9XG59XG5cblxuZnVuY3Rpb24gY2hlY2tEYXRhVHlwZXMoZGF0YVR5cGVzLCBkYXRhLCBzdHJpY3ROdW1iZXJzKSB7XG4gIHN3aXRjaCAoZGF0YVR5cGVzLmxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGNoZWNrRGF0YVR5cGUoZGF0YVR5cGVzWzBdLCBkYXRhLCBzdHJpY3ROdW1iZXJzLCB0cnVlKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGNvZGUgPSAnJztcbiAgICAgIHZhciB0eXBlcyA9IHRvSGFzaChkYXRhVHlwZXMpO1xuICAgICAgaWYgKHR5cGVzLmFycmF5ICYmIHR5cGVzLm9iamVjdCkge1xuICAgICAgICBjb2RlID0gdHlwZXMubnVsbCA/ICcoJzogJyghJyArIGRhdGEgKyAnIHx8ICc7XG4gICAgICAgIGNvZGUgKz0gJ3R5cGVvZiAnICsgZGF0YSArICcgIT09IFwib2JqZWN0XCIpJztcbiAgICAgICAgZGVsZXRlIHR5cGVzLm51bGw7XG4gICAgICAgIGRlbGV0ZSB0eXBlcy5hcnJheTtcbiAgICAgICAgZGVsZXRlIHR5cGVzLm9iamVjdDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlcy5udW1iZXIpIGRlbGV0ZSB0eXBlcy5pbnRlZ2VyO1xuICAgICAgZm9yICh2YXIgdCBpbiB0eXBlcylcbiAgICAgICAgY29kZSArPSAoY29kZSA/ICcgJiYgJyA6ICcnICkgKyBjaGVja0RhdGFUeXBlKHQsIGRhdGEsIHN0cmljdE51bWJlcnMsIHRydWUpO1xuXG4gICAgICByZXR1cm4gY29kZTtcbiAgfVxufVxuXG5cbnZhciBDT0VSQ0VfVE9fVFlQRVMgPSB0b0hhc2goWyAnc3RyaW5nJywgJ251bWJlcicsICdpbnRlZ2VyJywgJ2Jvb2xlYW4nLCAnbnVsbCcgXSk7XG5mdW5jdGlvbiBjb2VyY2VUb1R5cGVzKG9wdGlvbkNvZXJjZVR5cGVzLCBkYXRhVHlwZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVR5cGVzKSkge1xuICAgIHZhciB0eXBlcyA9IFtdO1xuICAgIGZvciAodmFyIGk9MDsgaTxkYXRhVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0ID0gZGF0YVR5cGVzW2ldO1xuICAgICAgaWYgKENPRVJDRV9UT19UWVBFU1t0XSkgdHlwZXNbdHlwZXMubGVuZ3RoXSA9IHQ7XG4gICAgICBlbHNlIGlmIChvcHRpb25Db2VyY2VUeXBlcyA9PT0gJ2FycmF5JyAmJiB0ID09PSAnYXJyYXknKSB0eXBlc1t0eXBlcy5sZW5ndGhdID0gdDtcbiAgICB9XG4gICAgaWYgKHR5cGVzLmxlbmd0aCkgcmV0dXJuIHR5cGVzO1xuICB9IGVsc2UgaWYgKENPRVJDRV9UT19UWVBFU1tkYXRhVHlwZXNdKSB7XG4gICAgcmV0dXJuIFtkYXRhVHlwZXNdO1xuICB9IGVsc2UgaWYgKG9wdGlvbkNvZXJjZVR5cGVzID09PSAnYXJyYXknICYmIGRhdGFUeXBlcyA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBbJ2FycmF5J107XG4gIH1cbn1cblxuXG5mdW5jdGlvbiB0b0hhc2goYXJyKSB7XG4gIHZhciBoYXNoID0ge307XG4gIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIGhhc2hbYXJyW2ldXSA9IHRydWU7XG4gIHJldHVybiBoYXNoO1xufVxuXG5cbnZhciBJREVOVElGSUVSID0gL15bYS16JF9dW2EteiRfMC05XSokL2k7XG52YXIgU0lOR0xFX1FVT1RFID0gLyd8XFxcXC9nO1xuZnVuY3Rpb24gZ2V0UHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiB0eXBlb2Yga2V5ID09ICdudW1iZXInXG4gICAgICAgICAgPyAnWycgKyBrZXkgKyAnXSdcbiAgICAgICAgICA6IElERU5USUZJRVIudGVzdChrZXkpXG4gICAgICAgICAgICA/ICcuJyArIGtleVxuICAgICAgICAgICAgOiBcIlsnXCIgKyBlc2NhcGVRdW90ZXMoa2V5KSArIFwiJ11cIjtcbn1cblxuXG5mdW5jdGlvbiBlc2NhcGVRdW90ZXMoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShTSU5HTEVfUVVPVEUsICdcXFxcJCYnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nLCAnXFxcXHInKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcZi9nLCAnXFxcXGYnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcdC9nLCAnXFxcXHQnKTtcbn1cblxuXG5mdW5jdGlvbiB2YXJPY2N1cmVuY2VzKHN0ciwgZGF0YVZhcikge1xuICBkYXRhVmFyICs9ICdbXjAtOV0nO1xuICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChuZXcgUmVnRXhwKGRhdGFWYXIsICdnJykpO1xuICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMDtcbn1cblxuXG5mdW5jdGlvbiB2YXJSZXBsYWNlKHN0ciwgZGF0YVZhciwgZXhwcikge1xuICBkYXRhVmFyICs9ICcoW14wLTldKSc7XG4gIGV4cHIgPSBleHByLnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpO1xuICByZXR1cm4gc3RyLnJlcGxhY2UobmV3IFJlZ0V4cChkYXRhVmFyLCAnZycpLCBleHByICsgJyQxJyk7XG59XG5cblxuZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXMoc2NoZW1hLCBydWxlcykge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybiAhc2NoZW1hO1xuICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSBpZiAocnVsZXNba2V5XSkgcmV0dXJuIHRydWU7XG59XG5cblxuZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXNFeGNlcHQoc2NoZW1hLCBydWxlcywgZXhjZXB0S2V5d29yZCkge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybiAhc2NoZW1hICYmIGV4Y2VwdEtleXdvcmQgIT0gJ25vdCc7XG4gIGZvciAodmFyIGtleSBpbiBzY2hlbWEpIGlmIChrZXkgIT0gZXhjZXB0S2V5d29yZCAmJiBydWxlc1trZXldKSByZXR1cm4gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiBzY2hlbWFVbmtub3duUnVsZXMoc2NoZW1hLCBydWxlcykge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybjtcbiAgZm9yICh2YXIga2V5IGluIHNjaGVtYSkgaWYgKCFydWxlc1trZXldKSByZXR1cm4ga2V5O1xufVxuXG5cbmZ1bmN0aW9uIHRvUXVvdGVkU3RyaW5nKHN0cikge1xuICByZXR1cm4gJ1xcJycgKyBlc2NhcGVRdW90ZXMoc3RyKSArICdcXCcnO1xufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGhFeHByKGN1cnJlbnRQYXRoLCBleHByLCBqc29uUG9pbnRlcnMsIGlzTnVtYmVyKSB7XG4gIHZhciBwYXRoID0ganNvblBvaW50ZXJzIC8vIGZhbHNlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgPyAnXFwnL1xcJyArICcgKyBleHByICsgKGlzTnVtYmVyID8gJycgOiAnLnJlcGxhY2UoL34vZywgXFwnfjBcXCcpLnJlcGxhY2UoL1xcXFwvL2csIFxcJ34xXFwnKScpXG4gICAgICAgICAgICAgIDogKGlzTnVtYmVyID8gJ1xcJ1tcXCcgKyAnICsgZXhwciArICcgKyBcXCddXFwnJyA6ICdcXCdbXFxcXFxcJ1xcJyArICcgKyBleHByICsgJyArIFxcJ1xcXFxcXCddXFwnJyk7XG4gIHJldHVybiBqb2luUGF0aHMoY3VycmVudFBhdGgsIHBhdGgpO1xufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGgoY3VycmVudFBhdGgsIHByb3AsIGpzb25Qb2ludGVycykge1xuICB2YXIgcGF0aCA9IGpzb25Qb2ludGVycyAvLyBmYWxzZSBieSBkZWZhdWx0XG4gICAgICAgICAgICAgID8gdG9RdW90ZWRTdHJpbmcoJy8nICsgZXNjYXBlSnNvblBvaW50ZXIocHJvcCkpXG4gICAgICAgICAgICAgIDogdG9RdW90ZWRTdHJpbmcoZ2V0UHJvcGVydHkocHJvcCkpO1xuICByZXR1cm4gam9pblBhdGhzKGN1cnJlbnRQYXRoLCBwYXRoKTtcbn1cblxuXG52YXIgSlNPTl9QT0lOVEVSID0gL15cXC8oPzpbXn5dfH4wfH4xKSokLztcbnZhciBSRUxBVElWRV9KU09OX1BPSU5URVIgPSAvXihbMC05XSspKCN8XFwvKD86W15+XXx+MHx+MSkqKT8kLztcbmZ1bmN0aW9uIGdldERhdGEoJGRhdGEsIGx2bCwgcGF0aHMpIHtcbiAgdmFyIHVwLCBqc29uUG9pbnRlciwgZGF0YSwgbWF0Y2hlcztcbiAgaWYgKCRkYXRhID09PSAnJykgcmV0dXJuICdyb290RGF0YSc7XG4gIGlmICgkZGF0YVswXSA9PSAnLycpIHtcbiAgICBpZiAoIUpTT05fUE9JTlRFUi50ZXN0KCRkYXRhKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04tcG9pbnRlcjogJyArICRkYXRhKTtcbiAgICBqc29uUG9pbnRlciA9ICRkYXRhO1xuICAgIGRhdGEgPSAncm9vdERhdGEnO1xuICB9IGVsc2Uge1xuICAgIG1hdGNoZXMgPSAkZGF0YS5tYXRjaChSRUxBVElWRV9KU09OX1BPSU5URVIpO1xuICAgIGlmICghbWF0Y2hlcykgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04tcG9pbnRlcjogJyArICRkYXRhKTtcbiAgICB1cCA9ICttYXRjaGVzWzFdO1xuICAgIGpzb25Qb2ludGVyID0gbWF0Y2hlc1syXTtcbiAgICBpZiAoanNvblBvaW50ZXIgPT0gJyMnKSB7XG4gICAgICBpZiAodXAgPj0gbHZsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3MgcHJvcGVydHkvaW5kZXggJyArIHVwICsgJyBsZXZlbHMgdXAsIGN1cnJlbnQgbGV2ZWwgaXMgJyArIGx2bCk7XG4gICAgICByZXR1cm4gcGF0aHNbbHZsIC0gdXBdO1xuICAgIH1cblxuICAgIGlmICh1cCA+IGx2bCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWNjZXNzIGRhdGEgJyArIHVwICsgJyBsZXZlbHMgdXAsIGN1cnJlbnQgbGV2ZWwgaXMgJyArIGx2bCk7XG4gICAgZGF0YSA9ICdkYXRhJyArICgobHZsIC0gdXApIHx8ICcnKTtcbiAgICBpZiAoIWpzb25Qb2ludGVyKSByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBleHByID0gZGF0YTtcbiAgdmFyIHNlZ21lbnRzID0ganNvblBvaW50ZXIuc3BsaXQoJy8nKTtcbiAgZm9yICh2YXIgaT0wOyBpPHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgZGF0YSArPSBnZXRQcm9wZXJ0eSh1bmVzY2FwZUpzb25Qb2ludGVyKHNlZ21lbnQpKTtcbiAgICAgIGV4cHIgKz0gJyAmJiAnICsgZGF0YTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4cHI7XG59XG5cblxuZnVuY3Rpb24gam9pblBhdGhzIChhLCBiKSB7XG4gIGlmIChhID09ICdcIlwiJykgcmV0dXJuIGI7XG4gIHJldHVybiAoYSArICcgKyAnICsgYikucmVwbGFjZSgvKFteXFxcXF0pJyBcXCsgJy9nLCAnJDEnKTtcbn1cblxuXG5mdW5jdGlvbiB1bmVzY2FwZUZyYWdtZW50KHN0cikge1xuICByZXR1cm4gdW5lc2NhcGVKc29uUG9pbnRlcihkZWNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59XG5cblxuZnVuY3Rpb24gZXNjYXBlRnJhZ21lbnQoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZXNjYXBlSnNvblBvaW50ZXIoc3RyKSk7XG59XG5cblxuZnVuY3Rpb24gZXNjYXBlSnNvblBvaW50ZXIoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XG59XG5cblxuZnVuY3Rpb24gdW5lc2NhcGVKc29uUG9pbnRlcihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9+MS9nLCAnLycpLnJlcGxhY2UoL34wL2csICd+Jyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYU9iamVjdDtcblxuZnVuY3Rpb24gU2NoZW1hT2JqZWN0KG9iaikge1xuICB1dGlsLmNvcHkob2JqLCB0aGlzKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB0cmF2ZXJzZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNjaGVtYSwgb3B0cywgY2IpIHtcbiAgLy8gTGVnYWN5IHN1cHBvcnQgZm9yIHYwLjMuMSBhbmQgZWFybGllci5cbiAgaWYgKHR5cGVvZiBvcHRzID09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgY2IgPSBvcHRzLmNiIHx8IGNiO1xuICB2YXIgcHJlID0gKHR5cGVvZiBjYiA9PSAnZnVuY3Rpb24nKSA/IGNiIDogY2IucHJlIHx8IGZ1bmN0aW9uKCkge307XG4gIHZhciBwb3N0ID0gY2IucG9zdCB8fCBmdW5jdGlvbigpIHt9O1xuXG4gIF90cmF2ZXJzZShvcHRzLCBwcmUsIHBvc3QsIHNjaGVtYSwgJycsIHNjaGVtYSk7XG59O1xuXG5cbnRyYXZlcnNlLmtleXdvcmRzID0ge1xuICBhZGRpdGlvbmFsSXRlbXM6IHRydWUsXG4gIGl0ZW1zOiB0cnVlLFxuICBjb250YWluczogdHJ1ZSxcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gIHByb3BlcnR5TmFtZXM6IHRydWUsXG4gIG5vdDogdHJ1ZVxufTtcblxudHJhdmVyc2UuYXJyYXlLZXl3b3JkcyA9IHtcbiAgaXRlbXM6IHRydWUsXG4gIGFsbE9mOiB0cnVlLFxuICBhbnlPZjogdHJ1ZSxcbiAgb25lT2Y6IHRydWVcbn07XG5cbnRyYXZlcnNlLnByb3BzS2V5d29yZHMgPSB7XG4gIGRlZmluaXRpb25zOiB0cnVlLFxuICBwcm9wZXJ0aWVzOiB0cnVlLFxuICBwYXR0ZXJuUHJvcGVydGllczogdHJ1ZSxcbiAgZGVwZW5kZW5jaWVzOiB0cnVlXG59O1xuXG50cmF2ZXJzZS5za2lwS2V5d29yZHMgPSB7XG4gIGRlZmF1bHQ6IHRydWUsXG4gIGVudW06IHRydWUsXG4gIGNvbnN0OiB0cnVlLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgbWF4aW11bTogdHJ1ZSxcbiAgbWluaW11bTogdHJ1ZSxcbiAgZXhjbHVzaXZlTWF4aW11bTogdHJ1ZSxcbiAgZXhjbHVzaXZlTWluaW11bTogdHJ1ZSxcbiAgbXVsdGlwbGVPZjogdHJ1ZSxcbiAgbWF4TGVuZ3RoOiB0cnVlLFxuICBtaW5MZW5ndGg6IHRydWUsXG4gIHBhdHRlcm46IHRydWUsXG4gIGZvcm1hdDogdHJ1ZSxcbiAgbWF4SXRlbXM6IHRydWUsXG4gIG1pbkl0ZW1zOiB0cnVlLFxuICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgbWF4UHJvcGVydGllczogdHJ1ZSxcbiAgbWluUHJvcGVydGllczogdHJ1ZVxufTtcblxuXG5mdW5jdGlvbiBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hlbWEsIGpzb25QdHIsIHJvb3RTY2hlbWEsIHBhcmVudEpzb25QdHIsIHBhcmVudEtleXdvcmQsIHBhcmVudFNjaGVtYSwga2V5SW5kZXgpIHtcbiAgaWYgKHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICBwcmUoc2NoZW1hLCBqc29uUHRyLCByb290U2NoZW1hLCBwYXJlbnRKc29uUHRyLCBwYXJlbnRLZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICB2YXIgc2NoID0gc2NoZW1hW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2gpKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdHJhdmVyc2UuYXJyYXlLZXl3b3Jkcykge1xuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzY2gubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hbaV0sIGpzb25QdHIgKyAnLycgKyBrZXkgKyAnLycgKyBpLCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHRyYXZlcnNlLnByb3BzS2V5d29yZHMpIHtcbiAgICAgICAgaWYgKHNjaCAmJiB0eXBlb2Ygc2NoID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzY2gpXG4gICAgICAgICAgICBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hbcHJvcF0sIGpzb25QdHIgKyAnLycgKyBrZXkgKyAnLycgKyBlc2NhcGVKc29uUHRyKHByb3ApLCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSwgcHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHRyYXZlcnNlLmtleXdvcmRzIHx8IChvcHRzLmFsbEtleXMgJiYgIShrZXkgaW4gdHJhdmVyc2Uuc2tpcEtleXdvcmRzKSkpIHtcbiAgICAgICAgX3RyYXZlcnNlKG9wdHMsIHByZSwgcG9zdCwgc2NoLCBqc29uUHRyICsgJy8nICsga2V5LCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIHBvc3Qoc2NoZW1hLCBqc29uUHRyLCByb290U2NoZW1hLCBwYXJlbnRKc29uUHRyLCBwYXJlbnRLZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGVzY2FwZUpzb25QdHIoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVVJJID0gcmVxdWlyZSgndXJpLWpzJylcbiAgLCBlcXVhbCA9IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpXG4gICwgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG4gICwgU2NoZW1hT2JqZWN0ID0gcmVxdWlyZSgnLi9zY2hlbWFfb2JqJylcbiAgLCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ2pzb24tc2NoZW1hLXRyYXZlcnNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZTtcblxucmVzb2x2ZS5ub3JtYWxpemVJZCA9IG5vcm1hbGl6ZUlkO1xucmVzb2x2ZS5mdWxsUGF0aCA9IGdldEZ1bGxQYXRoO1xucmVzb2x2ZS51cmwgPSByZXNvbHZlVXJsO1xucmVzb2x2ZS5pZHMgPSByZXNvbHZlSWRzO1xucmVzb2x2ZS5pbmxpbmVSZWYgPSBpbmxpbmVSZWY7XG5yZXNvbHZlLnNjaGVtYSA9IHJlc29sdmVTY2hlbWE7XG5cbi8qKlxuICogW3Jlc29sdmUgYW5kIGNvbXBpbGUgdGhlIHJlZmVyZW5jZXMgKCRyZWYpXVxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjb21waWxlIHJlZmVyZW5jZSB0byBzY2hlbWEgY29tcGlsYXRpb24gZnVuY2l0b24gKGxvY2FsQ29tcGlsZSlcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9vdCBzY2hlbWEgZm9yIHRoZSBjdXJyZW50IHNjaGVtYVxuICogQHBhcmFtICB7U3RyaW5nfSByZWYgcmVmZXJlbmNlIHRvIHJlc29sdmVcbiAqIEByZXR1cm4ge09iamVjdHxGdW5jdGlvbn0gc2NoZW1hIG9iamVjdCAoaWYgdGhlIHNjaGVtYSBjYW4gYmUgaW5saW5lZCkgb3IgdmFsaWRhdGlvbiBmdW5jdGlvblxuICovXG5mdW5jdGlvbiByZXNvbHZlKGNvbXBpbGUsIHJvb3QsIHJlZikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciByZWZWYWwgPSB0aGlzLl9yZWZzW3JlZl07XG4gIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHRoaXMuX3JlZnNbcmVmVmFsXSkgcmVmVmFsID0gdGhpcy5fcmVmc1tyZWZWYWxdO1xuICAgIGVsc2UgcmV0dXJuIHJlc29sdmUuY2FsbCh0aGlzLCBjb21waWxlLCByb290LCByZWZWYWwpO1xuICB9XG5cbiAgcmVmVmFsID0gcmVmVmFsIHx8IHRoaXMuX3NjaGVtYXNbcmVmXTtcbiAgaWYgKHJlZlZhbCBpbnN0YW5jZW9mIFNjaGVtYU9iamVjdCkge1xuICAgIHJldHVybiBpbmxpbmVSZWYocmVmVmFsLnNjaGVtYSwgdGhpcy5fb3B0cy5pbmxpbmVSZWZzKVxuICAgICAgICAgICAgPyByZWZWYWwuc2NoZW1hXG4gICAgICAgICAgICA6IHJlZlZhbC52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlKHJlZlZhbCk7XG4gIH1cblxuICB2YXIgcmVzID0gcmVzb2x2ZVNjaGVtYS5jYWxsKHRoaXMsIHJvb3QsIHJlZik7XG4gIHZhciBzY2hlbWEsIHYsIGJhc2VJZDtcbiAgaWYgKHJlcykge1xuICAgIHNjaGVtYSA9IHJlcy5zY2hlbWE7XG4gICAgcm9vdCA9IHJlcy5yb290O1xuICAgIGJhc2VJZCA9IHJlcy5iYXNlSWQ7XG4gIH1cblxuICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hT2JqZWN0KSB7XG4gICAgdiA9IHNjaGVtYS52YWxpZGF0ZSB8fCBjb21waWxlLmNhbGwodGhpcywgc2NoZW1hLnNjaGVtYSwgcm9vdCwgdW5kZWZpbmVkLCBiYXNlSWQpO1xuICB9IGVsc2UgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdiA9IGlubGluZVJlZihzY2hlbWEsIHRoaXMuX29wdHMuaW5saW5lUmVmcylcbiAgICAgICAgPyBzY2hlbWFcbiAgICAgICAgOiBjb21waWxlLmNhbGwodGhpcywgc2NoZW1hLCByb290LCB1bmRlZmluZWQsIGJhc2VJZCk7XG4gIH1cblxuICByZXR1cm4gdjtcbn1cblxuXG4vKipcbiAqIFJlc29sdmUgc2NoZW1hLCBpdHMgcm9vdCBhbmQgYmFzZUlkXG4gKiBAdGhpcyBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCByb290IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgc2NoZW1hLCByZWZWYWwsIHJlZnNcbiAqIEBwYXJhbSAge1N0cmluZ30gcmVmICByZWZlcmVuY2UgdG8gcmVzb2x2ZVxuICogQHJldHVybiB7T2JqZWN0fSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHNjaGVtYSwgcm9vdCwgYmFzZUlkXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTY2hlbWEocm9vdCwgcmVmKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIHAgPSBVUkkucGFyc2UocmVmKVxuICAgICwgcmVmUGF0aCA9IF9nZXRGdWxsUGF0aChwKVxuICAgICwgYmFzZUlkID0gZ2V0RnVsbFBhdGgodGhpcy5fZ2V0SWQocm9vdC5zY2hlbWEpKTtcbiAgaWYgKE9iamVjdC5rZXlzKHJvb3Quc2NoZW1hKS5sZW5ndGggPT09IDAgfHwgcmVmUGF0aCAhPT0gYmFzZUlkKSB7XG4gICAgdmFyIGlkID0gbm9ybWFsaXplSWQocmVmUGF0aCk7XG4gICAgdmFyIHJlZlZhbCA9IHRoaXMuX3JlZnNbaWRdO1xuICAgIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZVJlY3Vyc2l2ZS5jYWxsKHRoaXMsIHJvb3QsIHJlZlZhbCwgcCk7XG4gICAgfSBlbHNlIGlmIChyZWZWYWwgaW5zdGFuY2VvZiBTY2hlbWFPYmplY3QpIHtcbiAgICAgIGlmICghcmVmVmFsLnZhbGlkYXRlKSB0aGlzLl9jb21waWxlKHJlZlZhbCk7XG4gICAgICByb290ID0gcmVmVmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZWYWwgPSB0aGlzLl9zY2hlbWFzW2lkXTtcbiAgICAgIGlmIChyZWZWYWwgaW5zdGFuY2VvZiBTY2hlbWFPYmplY3QpIHtcbiAgICAgICAgaWYgKCFyZWZWYWwudmFsaWRhdGUpIHRoaXMuX2NvbXBpbGUocmVmVmFsKTtcbiAgICAgICAgaWYgKGlkID09IG5vcm1hbGl6ZUlkKHJlZikpXG4gICAgICAgICAgcmV0dXJuIHsgc2NoZW1hOiByZWZWYWwsIHJvb3Q6IHJvb3QsIGJhc2VJZDogYmFzZUlkIH07XG4gICAgICAgIHJvb3QgPSByZWZWYWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcm9vdC5zY2hlbWEpIHJldHVybjtcbiAgICBiYXNlSWQgPSBnZXRGdWxsUGF0aCh0aGlzLl9nZXRJZChyb290LnNjaGVtYSkpO1xuICB9XG4gIHJldHVybiBnZXRKc29uUG9pbnRlci5jYWxsKHRoaXMsIHAsIGJhc2VJZCwgcm9vdC5zY2hlbWEsIHJvb3QpO1xufVxuXG5cbi8qIEB0aGlzIEFqdiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlY3Vyc2l2ZShyb290LCByZWYsIHBhcnNlZFJlZikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciByZXMgPSByZXNvbHZlU2NoZW1hLmNhbGwodGhpcywgcm9vdCwgcmVmKTtcbiAgaWYgKHJlcykge1xuICAgIHZhciBzY2hlbWEgPSByZXMuc2NoZW1hO1xuICAgIHZhciBiYXNlSWQgPSByZXMuYmFzZUlkO1xuICAgIHJvb3QgPSByZXMucm9vdDtcbiAgICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWEpO1xuICAgIGlmIChpZCkgYmFzZUlkID0gcmVzb2x2ZVVybChiYXNlSWQsIGlkKTtcbiAgICByZXR1cm4gZ2V0SnNvblBvaW50ZXIuY2FsbCh0aGlzLCBwYXJzZWRSZWYsIGJhc2VJZCwgc2NoZW1hLCByb290KTtcbiAgfVxufVxuXG5cbnZhciBQUkVWRU5UX1NDT1BFX0NIQU5HRSA9IHV0aWwudG9IYXNoKFsncHJvcGVydGllcycsICdwYXR0ZXJuUHJvcGVydGllcycsICdlbnVtJywgJ2RlcGVuZGVuY2llcycsICdkZWZpbml0aW9ucyddKTtcbi8qIEB0aGlzIEFqdiAqL1xuZnVuY3Rpb24gZ2V0SnNvblBvaW50ZXIocGFyc2VkUmVmLCBiYXNlSWQsIHNjaGVtYSwgcm9vdCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHBhcnNlZFJlZi5mcmFnbWVudCA9IHBhcnNlZFJlZi5mcmFnbWVudCB8fCAnJztcbiAgaWYgKHBhcnNlZFJlZi5mcmFnbWVudC5zbGljZSgwLDEpICE9ICcvJykgcmV0dXJuO1xuICB2YXIgcGFydHMgPSBwYXJzZWRSZWYuZnJhZ21lbnQuc3BsaXQoJy8nKTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAocGFydCkge1xuICAgICAgcGFydCA9IHV0aWwudW5lc2NhcGVGcmFnbWVudChwYXJ0KTtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYVtwYXJ0XTtcbiAgICAgIGlmIChzY2hlbWEgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICB2YXIgaWQ7XG4gICAgICBpZiAoIVBSRVZFTlRfU0NPUEVfQ0hBTkdFW3BhcnRdKSB7XG4gICAgICAgIGlkID0gdGhpcy5fZ2V0SWQoc2NoZW1hKTtcbiAgICAgICAgaWYgKGlkKSBiYXNlSWQgPSByZXNvbHZlVXJsKGJhc2VJZCwgaWQpO1xuICAgICAgICBpZiAoc2NoZW1hLiRyZWYpIHtcbiAgICAgICAgICB2YXIgJHJlZiA9IHJlc29sdmVVcmwoYmFzZUlkLCBzY2hlbWEuJHJlZik7XG4gICAgICAgICAgdmFyIHJlcyA9IHJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLCByb290LCAkcmVmKTtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBzY2hlbWEgPSByZXMuc2NoZW1hO1xuICAgICAgICAgICAgcm9vdCA9IHJlcy5yb290O1xuICAgICAgICAgICAgYmFzZUlkID0gcmVzLmJhc2VJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYSAhPT0gcm9vdC5zY2hlbWEpXG4gICAgcmV0dXJuIHsgc2NoZW1hOiBzY2hlbWEsIHJvb3Q6IHJvb3QsIGJhc2VJZDogYmFzZUlkIH07XG59XG5cblxudmFyIFNJTVBMRV9JTkxJTkVEID0gdXRpbC50b0hhc2goW1xuICAndHlwZScsICdmb3JtYXQnLCAncGF0dGVybicsXG4gICdtYXhMZW5ndGgnLCAnbWluTGVuZ3RoJyxcbiAgJ21heFByb3BlcnRpZXMnLCAnbWluUHJvcGVydGllcycsXG4gICdtYXhJdGVtcycsICdtaW5JdGVtcycsXG4gICdtYXhpbXVtJywgJ21pbmltdW0nLFxuICAndW5pcXVlSXRlbXMnLCAnbXVsdGlwbGVPZicsXG4gICdyZXF1aXJlZCcsICdlbnVtJ1xuXSk7XG5mdW5jdGlvbiBpbmxpbmVSZWYoc2NoZW1hLCBsaW1pdCkge1xuICBpZiAobGltaXQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkIHx8IGxpbWl0ID09PSB0cnVlKSByZXR1cm4gY2hlY2tOb1JlZihzY2hlbWEpO1xuICBlbHNlIGlmIChsaW1pdCkgcmV0dXJuIGNvdW50S2V5cyhzY2hlbWEpIDw9IGxpbWl0O1xufVxuXG5cbmZ1bmN0aW9uIGNoZWNrTm9SZWYoc2NoZW1hKSB7XG4gIHZhciBpdGVtO1xuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgZm9yICh2YXIgaT0wOyBpPHNjaGVtYS5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PSAnb2JqZWN0JyAmJiAhY2hlY2tOb1JlZihpdGVtKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICBpZiAoa2V5ID09ICckcmVmJykgcmV0dXJuIGZhbHNlO1xuICAgICAgaXRlbSA9IHNjaGVtYVtrZXldO1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09ICdvYmplY3QnICYmICFjaGVja05vUmVmKGl0ZW0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5cbmZ1bmN0aW9uIGNvdW50S2V5cyhzY2hlbWEpIHtcbiAgdmFyIGNvdW50ID0gMCwgaXRlbTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIGZvciAodmFyIGk9MDsgaTxzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBzY2hlbWFbaV07XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT0gJ29iamVjdCcpIGNvdW50ICs9IGNvdW50S2V5cyhpdGVtKTtcbiAgICAgIGlmIChjb3VudCA9PSBJbmZpbml0eSkgcmV0dXJuIEluZmluaXR5O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICBpZiAoa2V5ID09ICckcmVmJykgcmV0dXJuIEluZmluaXR5O1xuICAgICAgaWYgKFNJTVBMRV9JTkxJTkVEW2tleV0pIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0gPSBzY2hlbWFba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09ICdvYmplY3QnKSBjb3VudCArPSBjb3VudEtleXMoaXRlbSkgKyAxO1xuICAgICAgICBpZiAoY291bnQgPT0gSW5maW5pdHkpIHJldHVybiBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvdW50O1xufVxuXG5cbmZ1bmN0aW9uIGdldEZ1bGxQYXRoKGlkLCBub3JtYWxpemUpIHtcbiAgaWYgKG5vcm1hbGl6ZSAhPT0gZmFsc2UpIGlkID0gbm9ybWFsaXplSWQoaWQpO1xuICB2YXIgcCA9IFVSSS5wYXJzZShpZCk7XG4gIHJldHVybiBfZ2V0RnVsbFBhdGgocCk7XG59XG5cblxuZnVuY3Rpb24gX2dldEZ1bGxQYXRoKHApIHtcbiAgcmV0dXJuIFVSSS5zZXJpYWxpemUocCkuc3BsaXQoJyMnKVswXSArICcjJztcbn1cblxuXG52YXIgVFJBSUxJTkdfU0xBU0hfSEFTSCA9IC8jXFwvPyQvO1xuZnVuY3Rpb24gbm9ybWFsaXplSWQoaWQpIHtcbiAgcmV0dXJuIGlkID8gaWQucmVwbGFjZShUUkFJTElOR19TTEFTSF9IQVNILCAnJykgOiAnJztcbn1cblxuXG5mdW5jdGlvbiByZXNvbHZlVXJsKGJhc2VJZCwgaWQpIHtcbiAgaWQgPSBub3JtYWxpemVJZChpZCk7XG4gIHJldHVybiBVUkkucmVzb2x2ZShiYXNlSWQsIGlkKTtcbn1cblxuXG4vKiBAdGhpcyBBanYgKi9cbmZ1bmN0aW9uIHJlc29sdmVJZHMoc2NoZW1hKSB7XG4gIHZhciBzY2hlbWFJZCA9IG5vcm1hbGl6ZUlkKHRoaXMuX2dldElkKHNjaGVtYSkpO1xuICB2YXIgYmFzZUlkcyA9IHsnJzogc2NoZW1hSWR9O1xuICB2YXIgZnVsbFBhdGhzID0geycnOiBnZXRGdWxsUGF0aChzY2hlbWFJZCwgZmFsc2UpfTtcbiAgdmFyIGxvY2FsUmVmcyA9IHt9O1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgdHJhdmVyc2Uoc2NoZW1hLCB7YWxsS2V5czogdHJ1ZX0sIGZ1bmN0aW9uKHNjaCwganNvblB0ciwgcm9vdFNjaGVtYSwgcGFyZW50SnNvblB0ciwgcGFyZW50S2V5d29yZCwgcGFyZW50U2NoZW1hLCBrZXlJbmRleCkge1xuICAgIGlmIChqc29uUHRyID09PSAnJykgcmV0dXJuO1xuICAgIHZhciBpZCA9IHNlbGYuX2dldElkKHNjaCk7XG4gICAgdmFyIGJhc2VJZCA9IGJhc2VJZHNbcGFyZW50SnNvblB0cl07XG4gICAgdmFyIGZ1bGxQYXRoID0gZnVsbFBhdGhzW3BhcmVudEpzb25QdHJdICsgJy8nICsgcGFyZW50S2V5d29yZDtcbiAgICBpZiAoa2V5SW5kZXggIT09IHVuZGVmaW5lZClcbiAgICAgIGZ1bGxQYXRoICs9ICcvJyArICh0eXBlb2Yga2V5SW5kZXggPT0gJ251bWJlcicgPyBrZXlJbmRleCA6IHV0aWwuZXNjYXBlRnJhZ21lbnQoa2V5SW5kZXgpKTtcblxuICAgIGlmICh0eXBlb2YgaWQgPT0gJ3N0cmluZycpIHtcbiAgICAgIGlkID0gYmFzZUlkID0gbm9ybWFsaXplSWQoYmFzZUlkID8gVVJJLnJlc29sdmUoYmFzZUlkLCBpZCkgOiBpZCk7XG5cbiAgICAgIHZhciByZWZWYWwgPSBzZWxmLl9yZWZzW2lkXTtcbiAgICAgIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSByZWZWYWwgPSBzZWxmLl9yZWZzW3JlZlZhbF07XG4gICAgICBpZiAocmVmVmFsICYmIHJlZlZhbC5zY2hlbWEpIHtcbiAgICAgICAgaWYgKCFlcXVhbChzY2gsIHJlZlZhbC5zY2hlbWEpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaWQgXCInICsgaWQgKyAnXCIgcmVzb2x2ZXMgdG8gbW9yZSB0aGFuIG9uZSBzY2hlbWEnKTtcbiAgICAgIH0gZWxzZSBpZiAoaWQgIT0gbm9ybWFsaXplSWQoZnVsbFBhdGgpKSB7XG4gICAgICAgIGlmIChpZFswXSA9PSAnIycpIHtcbiAgICAgICAgICBpZiAobG9jYWxSZWZzW2lkXSAmJiAhZXF1YWwoc2NoLCBsb2NhbFJlZnNbaWRdKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaWQgXCInICsgaWQgKyAnXCIgcmVzb2x2ZXMgdG8gbW9yZSB0aGFuIG9uZSBzY2hlbWEnKTtcbiAgICAgICAgICBsb2NhbFJlZnNbaWRdID0gc2NoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuX3JlZnNbaWRdID0gZnVsbFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYmFzZUlkc1tqc29uUHRyXSA9IGJhc2VJZDtcbiAgICBmdWxsUGF0aHNbanNvblB0cl0gPSBmdWxsUGF0aDtcbiAgfSk7XG5cbiAgcmV0dXJuIGxvY2FsUmVmcztcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciByZXNvbHZlID0gcmVxdWlyZSgnLi9yZXNvbHZlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBWYWxpZGF0aW9uOiBlcnJvclN1YmNsYXNzKFZhbGlkYXRpb25FcnJvciksXG4gIE1pc3NpbmdSZWY6IGVycm9yU3ViY2xhc3MoTWlzc2luZ1JlZkVycm9yKVxufTtcblxuXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKSB7XG4gIHRoaXMubWVzc2FnZSA9ICd2YWxpZGF0aW9uIGZhaWxlZCc7XG4gIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICB0aGlzLmFqdiA9IHRoaXMudmFsaWRhdGlvbiA9IHRydWU7XG59XG5cblxuTWlzc2luZ1JlZkVycm9yLm1lc3NhZ2UgPSBmdW5jdGlvbiAoYmFzZUlkLCByZWYpIHtcbiAgcmV0dXJuICdjYW5cXCd0IHJlc29sdmUgcmVmZXJlbmNlICcgKyByZWYgKyAnIGZyb20gaWQgJyArIGJhc2VJZDtcbn07XG5cblxuZnVuY3Rpb24gTWlzc2luZ1JlZkVycm9yKGJhc2VJZCwgcmVmLCBtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgTWlzc2luZ1JlZkVycm9yLm1lc3NhZ2UoYmFzZUlkLCByZWYpO1xuICB0aGlzLm1pc3NpbmdSZWYgPSByZXNvbHZlLnVybChiYXNlSWQsIHJlZik7XG4gIHRoaXMubWlzc2luZ1NjaGVtYSA9IHJlc29sdmUubm9ybWFsaXplSWQocmVzb2x2ZS5mdWxsUGF0aCh0aGlzLm1pc3NpbmdSZWYpKTtcbn1cblxuXG5mdW5jdGlvbiBlcnJvclN1YmNsYXNzKFN1YmNsYXNzKSB7XG4gIFN1YmNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgU3ViY2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViY2xhc3M7XG4gIHJldHVybiBTdWJjbGFzcztcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIG9wdHMgPSB7IGNtcDogb3B0cyB9O1xuICAgIHZhciBjeWNsZXMgPSAodHlwZW9mIG9wdHMuY3ljbGVzID09PSAnYm9vbGVhbicpID8gb3B0cy5jeWNsZXMgOiBmYWxzZTtcblxuICAgIHZhciBjbXAgPSBvcHRzLmNtcCAmJiAoZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYW9iaiA9IHsga2V5OiBhLCB2YWx1ZTogbm9kZVthXSB9O1xuICAgICAgICAgICAgICAgIHZhciBib2JqID0geyBrZXk6IGIsIHZhbHVlOiBub2RlW2JdIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGYoYW9iaiwgYm9iaik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH0pKG9wdHMuY21wKTtcblxuICAgIHZhciBzZWVuID0gW107XG4gICAgcmV0dXJuIChmdW5jdGlvbiBzdHJpbmdpZnkgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS50b0pTT04gJiYgdHlwZW9mIG5vZGUudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS50b0pTT04oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGVvZiBub2RlID09ICdudW1iZXInKSByZXR1cm4gaXNGaW5pdGUobm9kZSkgPyAnJyArIG5vZGUgOiAnbnVsbCc7XG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHJldHVybiBKU09OLnN0cmluZ2lmeShub2RlKTtcblxuICAgICAgICB2YXIgaSwgb3V0O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgb3V0ID0gJ1snO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSkgb3V0ICs9ICcsJztcbiAgICAgICAgICAgICAgICBvdXQgKz0gc3RyaW5naWZ5KG5vZGVbaV0pIHx8ICdudWxsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXQgKyAnXSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcblxuICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5vZGUpICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKGN5Y2xlcykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KCdfX2N5Y2xlX18nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLnB1c2gobm9kZSkgLSAxO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUpLnNvcnQoY21wICYmIGNtcChub2RlKSk7XG4gICAgICAgIG91dCA9ICcnO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBzdHJpbmdpZnkobm9kZVtrZXldKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAob3V0KSBvdXQgKz0gJywnO1xuICAgICAgICAgICAgb3V0ICs9IEpTT04uc3RyaW5naWZ5KGtleSkgKyAnOicgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuLnNwbGljZShzZWVuSW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gJ3snICsgb3V0ICsgJ30nO1xuICAgIH0pKGRhdGEpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3ZhbGlkYXRlKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnJztcbiAgdmFyICRhc3luYyA9IGl0LnNjaGVtYS4kYXN5bmMgPT09IHRydWUsXG4gICAgJHJlZktleXdvcmRzID0gaXQudXRpbC5zY2hlbWFIYXNSdWxlc0V4Y2VwdChpdC5zY2hlbWEsIGl0LlJVTEVTLmFsbCwgJyRyZWYnKSxcbiAgICAkaWQgPSBpdC5zZWxmLl9nZXRJZChpdC5zY2hlbWEpO1xuICBpZiAoaXQub3B0cy5zdHJpY3RLZXl3b3Jkcykge1xuICAgIHZhciAkdW5rbm93bkt3ZCA9IGl0LnV0aWwuc2NoZW1hVW5rbm93blJ1bGVzKGl0LnNjaGVtYSwgaXQuUlVMRVMua2V5d29yZHMpO1xuICAgIGlmICgkdW5rbm93bkt3ZCkge1xuICAgICAgdmFyICRrZXl3b3Jkc01zZyA9ICd1bmtub3duIGtleXdvcmQ6ICcgKyAkdW5rbm93bkt3ZDtcbiAgICAgIGlmIChpdC5vcHRzLnN0cmljdEtleXdvcmRzID09PSAnbG9nJykgaXQubG9nZ2VyLndhcm4oJGtleXdvcmRzTXNnKTtcbiAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCRrZXl3b3Jkc01zZyk7XG4gICAgfVxuICB9XG4gIGlmIChpdC5pc1RvcCkge1xuICAgIG91dCArPSAnIHZhciB2YWxpZGF0ZSA9ICc7XG4gICAgaWYgKCRhc3luYykge1xuICAgICAgaXQuYXN5bmMgPSB0cnVlO1xuICAgICAgb3V0ICs9ICdhc3luYyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJ2Z1bmN0aW9uKGRhdGEsIGRhdGFQYXRoLCBwYXJlbnREYXRhLCBwYXJlbnREYXRhUHJvcGVydHksIHJvb3REYXRhKSB7IFxcJ3VzZSBzdHJpY3RcXCc7ICc7XG4gICAgaWYgKCRpZCAmJiAoaXQub3B0cy5zb3VyY2VDb2RlIHx8IGl0Lm9wdHMucHJvY2Vzc0NvZGUpKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCcvXFwqIyBzb3VyY2VVUkw9JyArICRpZCArICcgKi8nKSArICcgJztcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBpdC5zY2hlbWEgPT0gJ2Jvb2xlYW4nIHx8ICEoJHJlZktleXdvcmRzIHx8IGl0LnNjaGVtYS4kcmVmKSkge1xuICAgIHZhciAka2V5d29yZCA9ICdmYWxzZSBzY2hlbWEnO1xuICAgIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gICAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICAgIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gICAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICAgIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICAgIHZhciAkZXJyb3JLZXl3b3JkO1xuICAgIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gICAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICAgIGlmIChpdC5zY2hlbWEgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoaXQuaXNUb3ApIHtcbiAgICAgICAgJGJyZWFrT25FcnJvciA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyAnO1xuICAgICAgfVxuICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICdmYWxzZSBzY2hlbWEnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7fSAnO1xuICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ2Jvb2xlYW4gc2NoZW1hIGlzIGZhbHNlXFwnICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiBmYWxzZSAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgfVxuICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpdC5pc1RvcCkge1xuICAgICAgICBpZiAoJGFzeW5jKSB7XG4gICAgICAgICAgb3V0ICs9ICcgcmV0dXJuIGRhdGE7ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gbnVsbDsgcmV0dXJuIHRydWU7ICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0LmlzVG9wKSB7XG4gICAgICBvdXQgKz0gJyB9OyByZXR1cm4gdmFsaWRhdGU7ICc7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgaWYgKGl0LmlzVG9wKSB7XG4gICAgdmFyICR0b3AgPSBpdC5pc1RvcCxcbiAgICAgICRsdmwgPSBpdC5sZXZlbCA9IDAsXG4gICAgICAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbCA9IDAsXG4gICAgICAkZGF0YSA9ICdkYXRhJztcbiAgICBpdC5yb290SWQgPSBpdC5yZXNvbHZlLmZ1bGxQYXRoKGl0LnNlbGYuX2dldElkKGl0LnJvb3Quc2NoZW1hKSk7XG4gICAgaXQuYmFzZUlkID0gaXQuYmFzZUlkIHx8IGl0LnJvb3RJZDtcbiAgICBkZWxldGUgaXQuaXNUb3A7XG4gICAgaXQuZGF0YVBhdGhBcnIgPSBbXCJcIl07XG4gICAgaWYgKGl0LnNjaGVtYS5kZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgaXQub3B0cy51c2VEZWZhdWx0cyAmJiBpdC5vcHRzLnN0cmljdERlZmF1bHRzKSB7XG4gICAgICB2YXIgJGRlZmF1bHRNc2cgPSAnZGVmYXVsdCBpcyBpZ25vcmVkIGluIHRoZSBzY2hlbWEgcm9vdCc7XG4gICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cyA9PT0gJ2xvZycpIGl0LmxvZ2dlci53YXJuKCRkZWZhdWx0TXNnKTtcbiAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCRkZWZhdWx0TXNnKTtcbiAgICB9XG4gICAgb3V0ICs9ICcgdmFyIHZFcnJvcnMgPSBudWxsOyAnO1xuICAgIG91dCArPSAnIHZhciBlcnJvcnMgPSAwOyAgICAgJztcbiAgICBvdXQgKz0gJyBpZiAocm9vdERhdGEgPT09IHVuZGVmaW5lZCkgcm9vdERhdGEgPSBkYXRhOyAnO1xuICB9IGVsc2Uge1xuICAgIHZhciAkbHZsID0gaXQubGV2ZWwsXG4gICAgICAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbCxcbiAgICAgICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgICBpZiAoJGlkKSBpdC5iYXNlSWQgPSBpdC5yZXNvbHZlLnVybChpdC5iYXNlSWQsICRpZCk7XG4gICAgaWYgKCRhc3luYyAmJiAhaXQuYXN5bmMpIHRocm93IG5ldyBFcnJvcignYXN5bmMgc2NoZW1hIGluIHN5bmMgc2NoZW1hJyk7XG4gICAgb3V0ICs9ICcgdmFyIGVycnNfJyArICgkbHZsKSArICcgPSBlcnJvcnM7JztcbiAgfVxuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmwsXG4gICAgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycyxcbiAgICAkY2xvc2luZ0JyYWNlczEgPSAnJyxcbiAgICAkY2xvc2luZ0JyYWNlczIgPSAnJztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkdHlwZVNjaGVtYSA9IGl0LnNjaGVtYS50eXBlLFxuICAgICR0eXBlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoJHR5cGVTY2hlbWEpO1xuICBpZiAoJHR5cGVTY2hlbWEgJiYgaXQub3B0cy5udWxsYWJsZSAmJiBpdC5zY2hlbWEubnVsbGFibGUgPT09IHRydWUpIHtcbiAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICBpZiAoJHR5cGVTY2hlbWEuaW5kZXhPZignbnVsbCcpID09IC0xKSAkdHlwZVNjaGVtYSA9ICR0eXBlU2NoZW1hLmNvbmNhdCgnbnVsbCcpO1xuICAgIH0gZWxzZSBpZiAoJHR5cGVTY2hlbWEgIT0gJ251bGwnKSB7XG4gICAgICAkdHlwZVNjaGVtYSA9IFskdHlwZVNjaGVtYSwgJ251bGwnXTtcbiAgICAgICR0eXBlSXNBcnJheSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmICgkdHlwZUlzQXJyYXkgJiYgJHR5cGVTY2hlbWEubGVuZ3RoID09IDEpIHtcbiAgICAkdHlwZVNjaGVtYSA9ICR0eXBlU2NoZW1hWzBdO1xuICAgICR0eXBlSXNBcnJheSA9IGZhbHNlO1xuICB9XG4gIGlmIChpdC5zY2hlbWEuJHJlZiAmJiAkcmVmS2V5d29yZHMpIHtcbiAgICBpZiAoaXQub3B0cy5leHRlbmRSZWZzID09ICdmYWlsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCckcmVmOiB2YWxpZGF0aW9uIGtleXdvcmRzIHVzZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIiAoc2VlIG9wdGlvbiBleHRlbmRSZWZzKScpO1xuICAgIH0gZWxzZSBpZiAoaXQub3B0cy5leHRlbmRSZWZzICE9PSB0cnVlKSB7XG4gICAgICAkcmVmS2V5d29yZHMgPSBmYWxzZTtcbiAgICAgIGl0LmxvZ2dlci53YXJuKCckcmVmOiBrZXl3b3JkcyBpZ25vcmVkIGluIHNjaGVtYSBhdCBwYXRoIFwiJyArIGl0LmVyclNjaGVtYVBhdGggKyAnXCInKTtcbiAgICB9XG4gIH1cbiAgaWYgKGl0LnNjaGVtYS4kY29tbWVudCAmJiBpdC5vcHRzLiRjb21tZW50KSB7XG4gICAgb3V0ICs9ICcgJyArIChpdC5SVUxFUy5hbGwuJGNvbW1lbnQuY29kZShpdCwgJyRjb21tZW50JykpO1xuICB9XG4gIGlmICgkdHlwZVNjaGVtYSkge1xuICAgIGlmIChpdC5vcHRzLmNvZXJjZVR5cGVzKSB7XG4gICAgICB2YXIgJGNvZXJjZVRvVHlwZXMgPSBpdC51dGlsLmNvZXJjZVRvVHlwZXMoaXQub3B0cy5jb2VyY2VUeXBlcywgJHR5cGVTY2hlbWEpO1xuICAgIH1cbiAgICB2YXIgJHJ1bGVzR3JvdXAgPSBpdC5SVUxFUy50eXBlc1skdHlwZVNjaGVtYV07XG4gICAgaWYgKCRjb2VyY2VUb1R5cGVzIHx8ICR0eXBlSXNBcnJheSB8fCAkcnVsZXNHcm91cCA9PT0gdHJ1ZSB8fCAoJHJ1bGVzR3JvdXAgJiYgISRzaG91bGRVc2VHcm91cCgkcnVsZXNHcm91cCkpKSB7XG4gICAgICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy50eXBlJyxcbiAgICAgICAgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy90eXBlJztcbiAgICAgIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLnR5cGUnLFxuICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL3R5cGUnLFxuICAgICAgICAkbWV0aG9kID0gJHR5cGVJc0FycmF5ID8gJ2NoZWNrRGF0YVR5cGVzJyA6ICdjaGVja0RhdGFUeXBlJztcbiAgICAgIG91dCArPSAnIGlmICgnICsgKGl0LnV0aWxbJG1ldGhvZF0oJHR5cGVTY2hlbWEsICRkYXRhLCBpdC5vcHRzLnN0cmljdE51bWJlcnMsIHRydWUpKSArICcpIHsgJztcbiAgICAgIGlmICgkY29lcmNlVG9UeXBlcykge1xuICAgICAgICB2YXIgJGRhdGFUeXBlID0gJ2RhdGFUeXBlJyArICRsdmwsXG4gICAgICAgICAgJGNvZXJjZWQgPSAnY29lcmNlZCcgKyAkbHZsO1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkZGF0YVR5cGUpICsgJyA9IHR5cGVvZiAnICsgKCRkYXRhKSArICc7IHZhciAnICsgKCRjb2VyY2VkKSArICcgPSB1bmRlZmluZWQ7ICc7XG4gICAgICAgIGlmIChpdC5vcHRzLmNvZXJjZVR5cGVzID09ICdhcnJheScpIHtcbiAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdvYmplY3RcXCcgJiYgQXJyYXkuaXNBcnJheSgnICsgKCRkYXRhKSArICcpICYmICcgKyAoJGRhdGEpICsgJy5sZW5ndGggPT0gMSkgeyAnICsgKCRkYXRhKSArICcgPSAnICsgKCRkYXRhKSArICdbMF07ICcgKyAoJGRhdGFUeXBlKSArICcgPSB0eXBlb2YgJyArICgkZGF0YSkgKyAnOyBpZiAoJyArIChpdC51dGlsLmNoZWNrRGF0YVR5cGUoaXQuc2NoZW1hLnR5cGUsICRkYXRhLCBpdC5vcHRzLnN0cmljdE51bWJlcnMpKSArICcpICcgKyAoJGNvZXJjZWQpICsgJyA9ICcgKyAoJGRhdGEpICsgJzsgfSAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCRjb2VyY2VkKSArICcgIT09IHVuZGVmaW5lZCkgOyAnO1xuICAgICAgICB2YXIgYXJyMSA9ICRjb2VyY2VUb1R5cGVzO1xuICAgICAgICBpZiAoYXJyMSkge1xuICAgICAgICAgIHZhciAkdHlwZSwgJGkgPSAtMSxcbiAgICAgICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAgICAgICAkdHlwZSA9IGFycjFbJGkgKz0gMV07XG4gICAgICAgICAgICBpZiAoJHR5cGUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSBpZiAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdudW1iZXJcXCcgfHwgJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdib29sZWFuXFwnKSAnICsgKCRjb2VyY2VkKSArICcgPSBcXCdcXCcgKyAnICsgKCRkYXRhKSArICc7IGVsc2UgaWYgKCcgKyAoJGRhdGEpICsgJyA9PT0gbnVsbCkgJyArICgkY29lcmNlZCkgKyAnID0gXFwnXFwnOyAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgkdHlwZSA9PSAnbnVtYmVyJyB8fCAkdHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSBpZiAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdib29sZWFuXFwnIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gbnVsbCB8fCAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdzdHJpbmdcXCcgJiYgJyArICgkZGF0YSkgKyAnICYmICcgKyAoJGRhdGEpICsgJyA9PSArJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgICAgIGlmICgkdHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyAmJiAhKCcgKyAoJGRhdGEpICsgJyAlIDEpJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJykpICcgKyAoJGNvZXJjZWQpICsgJyA9ICsnICsgKCRkYXRhKSArICc7ICc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR0eXBlID09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyBlbHNlIGlmICgnICsgKCRkYXRhKSArICcgPT09IFxcJ2ZhbHNlXFwnIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gMCB8fCAnICsgKCRkYXRhKSArICcgPT09IG51bGwpICcgKyAoJGNvZXJjZWQpICsgJyA9IGZhbHNlOyBlbHNlIGlmICgnICsgKCRkYXRhKSArICcgPT09IFxcJ3RydWVcXCcgfHwgJyArICgkZGF0YSkgKyAnID09PSAxKSAnICsgKCRjb2VyY2VkKSArICcgPSB0cnVlOyAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgkdHlwZSA9PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSBpZiAoJyArICgkZGF0YSkgKyAnID09PSBcXCdcXCcgfHwgJyArICgkZGF0YSkgKyAnID09PSAwIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gZmFsc2UpICcgKyAoJGNvZXJjZWQpICsgJyA9IG51bGw7ICc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0Lm9wdHMuY29lcmNlVHlwZXMgPT0gJ2FycmF5JyAmJiAkdHlwZSA9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGVsc2UgaWYgKCcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnc3RyaW5nXFwnIHx8ICcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnbnVtYmVyXFwnIHx8ICcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnYm9vbGVhblxcJyB8fCAnICsgKCRkYXRhKSArICcgPT0gbnVsbCkgJyArICgkY29lcmNlZCkgKyAnID0gWycgKyAoJGRhdGEpICsgJ107ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAgICc7XG4gICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICd0eXBlJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyB0eXBlOiBcXCcnO1xuICAgICAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlICc7XG4gICAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9IGlmICgnICsgKCRjb2VyY2VkKSArICcgIT09IHVuZGVmaW5lZCkgeyAgJztcbiAgICAgICAgdmFyICRwYXJlbnREYXRhID0gJGRhdGFMdmwgPyAnZGF0YScgKyAoKCRkYXRhTHZsIC0gMSkgfHwgJycpIDogJ3BhcmVudERhdGEnLFxuICAgICAgICAgICRwYXJlbnREYXRhUHJvcGVydHkgPSAkZGF0YUx2bCA/IGl0LmRhdGFQYXRoQXJyWyRkYXRhTHZsXSA6ICdwYXJlbnREYXRhUHJvcGVydHknO1xuICAgICAgICBvdXQgKz0gJyAnICsgKCRkYXRhKSArICcgPSAnICsgKCRjb2VyY2VkKSArICc7ICc7XG4gICAgICAgIGlmICghJGRhdGFMdmwpIHtcbiAgICAgICAgICBvdXQgKz0gJ2lmICgnICsgKCRwYXJlbnREYXRhKSArICcgIT09IHVuZGVmaW5lZCknO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnICcgKyAoJHBhcmVudERhdGEpICsgJ1snICsgKCRwYXJlbnREYXRhUHJvcGVydHkpICsgJ10gPSAnICsgKCRjb2VyY2VkKSArICc7IH0gJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICd0eXBlJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyB0eXBlOiBcXCcnO1xuICAgICAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlICc7XG4gICAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH1cbiAgfVxuICBpZiAoaXQuc2NoZW1hLiRyZWYgJiYgISRyZWZLZXl3b3Jkcykge1xuICAgIG91dCArPSAnICcgKyAoaXQuUlVMRVMuYWxsLiRyZWYuY29kZShpdCwgJyRyZWYnKSkgKyAnICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIH0gaWYgKGVycm9ycyA9PT0gJztcbiAgICAgIGlmICgkdG9wKSB7XG4gICAgICAgIG91dCArPSAnMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ2VycnNfJyArICgkbHZsKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnKSB7ICc7XG4gICAgICAkY2xvc2luZ0JyYWNlczIgKz0gJ30nO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYXJyMiA9IGl0LlJVTEVTO1xuICAgIGlmIChhcnIyKSB7XG4gICAgICB2YXIgJHJ1bGVzR3JvdXAsIGkyID0gLTEsXG4gICAgICAgIGwyID0gYXJyMi5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkyIDwgbDIpIHtcbiAgICAgICAgJHJ1bGVzR3JvdXAgPSBhcnIyW2kyICs9IDFdO1xuICAgICAgICBpZiAoJHNob3VsZFVzZUdyb3VwKCRydWxlc0dyb3VwKSkge1xuICAgICAgICAgIGlmICgkcnVsZXNHcm91cC50eXBlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArIChpdC51dGlsLmNoZWNrRGF0YVR5cGUoJHJ1bGVzR3JvdXAudHlwZSwgJGRhdGEsIGl0Lm9wdHMuc3RyaWN0TnVtYmVycykpICsgJykgeyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy51c2VEZWZhdWx0cykge1xuICAgICAgICAgICAgaWYgKCRydWxlc0dyb3VwLnR5cGUgPT0gJ29iamVjdCcgJiYgaXQuc2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWEucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAkc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKCRzY2hlbWEpO1xuICAgICAgICAgICAgICB2YXIgYXJyMyA9ICRzY2hlbWFLZXlzO1xuICAgICAgICAgICAgICBpZiAoYXJyMykge1xuICAgICAgICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksIGkzID0gLTEsXG4gICAgICAgICAgICAgICAgICBsMyA9IGFycjMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaTMgPCBsMykge1xuICAgICAgICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyM1tpMyArPSAxXTtcbiAgICAgICAgICAgICAgICAgIHZhciAkc2NoID0gJHNjaGVtYVskcHJvcGVydHlLZXldO1xuICAgICAgICAgICAgICAgICAgaWYgKCRzY2guZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAkcGFzc0RhdGEgPSAkZGF0YSArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0LmNvbXBvc2l0ZVJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRkZWZhdWx0TXNnID0gJ2RlZmF1bHQgaXMgaWdub3JlZCBmb3I6ICcgKyAkcGFzc0RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cyA9PT0gJ2xvZycpIGl0LmxvZ2dlci53YXJuKCRkZWZhdWx0TXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCRkZWZhdWx0TXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJHBhc3NEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnVzZURlZmF1bHRzID09ICdlbXB0eScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnIHx8ICcgKyAoJHBhc3NEYXRhKSArICcgPT09IG51bGwgfHwgJyArICgkcGFzc0RhdGEpICsgJyA9PT0gXFwnXFwnICc7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICkgJyArICgkcGFzc0RhdGEpICsgJyA9ICc7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudXNlRGVmYXVsdHMgPT0gJ3NoYXJlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICcgKyAoaXQudXNlRGVmYXVsdCgkc2NoLmRlZmF1bHQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJyArIChKU09OLnN0cmluZ2lmeSgkc2NoLmRlZmF1bHQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc7ICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHJ1bGVzR3JvdXAudHlwZSA9PSAnYXJyYXknICYmIEFycmF5LmlzQXJyYXkoaXQuc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICAgICAgICB2YXIgYXJyNCA9IGl0LnNjaGVtYS5pdGVtcztcbiAgICAgICAgICAgICAgaWYgKGFycjQpIHtcbiAgICAgICAgICAgICAgICB2YXIgJHNjaCwgJGkgPSAtMSxcbiAgICAgICAgICAgICAgICAgIGw0ID0gYXJyNC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHdoaWxlICgkaSA8IGw0KSB7XG4gICAgICAgICAgICAgICAgICAkc2NoID0gYXJyNFskaSArPSAxXTtcbiAgICAgICAgICAgICAgICAgIGlmICgkc2NoLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAkaSArICddJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0LmNvbXBvc2l0ZVJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRkZWZhdWx0TXNnID0gJ2RlZmF1bHQgaXMgaWdub3JlZCBmb3I6ICcgKyAkcGFzc0RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cyA9PT0gJ2xvZycpIGl0LmxvZ2dlci53YXJuKCRkZWZhdWx0TXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCRkZWZhdWx0TXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJHBhc3NEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnVzZURlZmF1bHRzID09ICdlbXB0eScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnIHx8ICcgKyAoJHBhc3NEYXRhKSArICcgPT09IG51bGwgfHwgJyArICgkcGFzc0RhdGEpICsgJyA9PT0gXFwnXFwnICc7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICkgJyArICgkcGFzc0RhdGEpICsgJyA9ICc7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudXNlRGVmYXVsdHMgPT0gJ3NoYXJlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICcgKyAoaXQudXNlRGVmYXVsdCgkc2NoLmRlZmF1bHQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJyArIChKU09OLnN0cmluZ2lmeSgkc2NoLmRlZmF1bHQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc7ICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGFycjUgPSAkcnVsZXNHcm91cC5ydWxlcztcbiAgICAgICAgICBpZiAoYXJyNSkge1xuICAgICAgICAgICAgdmFyICRydWxlLCBpNSA9IC0xLFxuICAgICAgICAgICAgICBsNSA9IGFycjUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHdoaWxlIChpNSA8IGw1KSB7XG4gICAgICAgICAgICAgICRydWxlID0gYXJyNVtpNSArPSAxXTtcbiAgICAgICAgICAgICAgaWYgKCRzaG91bGRVc2VSdWxlKCRydWxlKSkge1xuICAgICAgICAgICAgICAgIHZhciAkY29kZSA9ICRydWxlLmNvZGUoaXQsICRydWxlLmtleXdvcmQsICRydWxlc0dyb3VwLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICgkY29kZSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAkY2xvc2luZ0JyYWNlczEgKz0gJ30nO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlczEpICsgJyAnO1xuICAgICAgICAgICAgJGNsb3NpbmdCcmFjZXMxID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkcnVsZXNHcm91cC50eXBlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICBpZiAoJHR5cGVTY2hlbWEgJiYgJHR5cGVTY2hlbWEgPT09ICRydWxlc0dyb3VwLnR5cGUgJiYgISRjb2VyY2VUb1R5cGVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgICAgICAgICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy50eXBlJyxcbiAgICAgICAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL3R5cGUnO1xuICAgICAgICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAndHlwZScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgdHlwZTogXFwnJztcbiAgICAgICAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEuam9pbihcIixcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJ1xcJyB9ICc7XG4gICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBiZSAnO1xuICAgICAgICAgICAgICAgICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEuam9pbihcIixcIikpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBfX2VyciA9IG91dDtcbiAgICAgICAgICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKGVycm9ycyA9PT0gJztcbiAgICAgICAgICAgIGlmICgkdG9wKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnMCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJ2VycnNfJyArICgkbHZsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnKSB7ICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlczIgKz0gJ30nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMyKSArICcgJztcbiAgfVxuICBpZiAoJHRvcCkge1xuICAgIGlmICgkYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIGlmIChlcnJvcnMgPT09IDApIHJldHVybiBkYXRhOyAgICAgICAgICAgJztcbiAgICAgIG91dCArPSAnIGVsc2UgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2RXJyb3JzKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gdkVycm9yczsgJztcbiAgICAgIG91dCArPSAnIHJldHVybiBlcnJvcnMgPT09IDA7ICAgICAgICc7XG4gICAgfVxuICAgIG91dCArPSAnIH07IHJldHVybiB2YWxpZGF0ZTsnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHZhciAnICsgKCR2YWxpZCkgKyAnID0gZXJyb3JzID09PSBlcnJzXycgKyAoJGx2bCkgKyAnOyc7XG4gIH1cblxuICBmdW5jdGlvbiAkc2hvdWxkVXNlR3JvdXAoJHJ1bGVzR3JvdXApIHtcbiAgICB2YXIgcnVsZXMgPSAkcnVsZXNHcm91cC5ydWxlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKVxuICAgICAgaWYgKCRzaG91bGRVc2VSdWxlKHJ1bGVzW2ldKSkgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiAkc2hvdWxkVXNlUnVsZSgkcnVsZSkge1xuICAgIHJldHVybiBpdC5zY2hlbWFbJHJ1bGUua2V5d29yZF0gIT09IHVuZGVmaW5lZCB8fCAoJHJ1bGUuaW1wbGVtZW50cyAmJiAkcnVsZUltcGxlbWVudHNTb21lS2V5d29yZCgkcnVsZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHJ1bGVJbXBsZW1lbnRzU29tZUtleXdvcmQoJHJ1bGUpIHtcbiAgICB2YXIgaW1wbCA9ICRydWxlLmltcGxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbXBsLmxlbmd0aDsgaSsrKVxuICAgICAgaWYgKGl0LnNjaGVtYVtpbXBsW2ldXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHJlc29sdmUgPSByZXF1aXJlKCcuL3Jlc29sdmUnKVxuICAsIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKVxuICAsIGVycm9yQ2xhc3NlcyA9IHJlcXVpcmUoJy4vZXJyb3JfY2xhc3NlcycpXG4gICwgc3RhYmxlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnknKTtcblxudmFyIHZhbGlkYXRlR2VuZXJhdG9yID0gcmVxdWlyZSgnLi4vZG90anMvdmFsaWRhdGUnKTtcblxuLyoqXG4gKiBGdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgaW5zaWRlIGNvbXBpbGVkIHZhbGlkYXRpb25zIGZ1bmN0aW9uXG4gKi9cblxudmFyIHVjczJsZW5ndGggPSB1dGlsLnVjczJsZW5ndGg7XG52YXIgZXF1YWwgPSByZXF1aXJlKCdmYXN0LWRlZXAtZXF1YWwnKTtcblxuLy8gdGhpcyBlcnJvciBpcyB0aHJvd24gYnkgYXN5bmMgc2NoZW1hcyB0byByZXR1cm4gdmFsaWRhdGlvbiBlcnJvcnMgdmlhIGV4Y2VwdGlvblxudmFyIFZhbGlkYXRpb25FcnJvciA9IGVycm9yQ2xhc3Nlcy5WYWxpZGF0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGU7XG5cblxuLyoqXG4gKiBDb21waWxlcyBzY2hlbWEgdG8gdmFsaWRhdGlvbiBmdW5jdGlvblxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9vdCBzY2hlbWEgZm9yIHRoaXMgc2NoZW1hXG4gKiBAcGFyYW0gIHtPYmplY3R9IGxvY2FsUmVmcyB0aGUgaGFzaCBvZiBsb2NhbCByZWZlcmVuY2VzIGluc2lkZSB0aGUgc2NoZW1hIChjcmVhdGVkIGJ5IHJlc29sdmUuaWQpLCB1c2VkIGZvciBpbmxpbmUgcmVzb2x1dGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBiYXNlSWQgYmFzZSBJRCBmb3IgSURzIGluIHRoZSBzY2hlbWFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGUoc2NoZW1hLCByb290LCBsb2NhbFJlZnMsIGJhc2VJZCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlLCBldmlsOiB0cnVlICovXG4gIC8qIGVzbGludCBuby1zaGFkb3c6IDAgKi9cbiAgdmFyIHNlbGYgPSB0aGlzXG4gICAgLCBvcHRzID0gdGhpcy5fb3B0c1xuICAgICwgcmVmVmFsID0gWyB1bmRlZmluZWQgXVxuICAgICwgcmVmcyA9IHt9XG4gICAgLCBwYXR0ZXJucyA9IFtdXG4gICAgLCBwYXR0ZXJuc0hhc2ggPSB7fVxuICAgICwgZGVmYXVsdHMgPSBbXVxuICAgICwgZGVmYXVsdHNIYXNoID0ge31cbiAgICAsIGN1c3RvbVJ1bGVzID0gW107XG5cbiAgcm9vdCA9IHJvb3QgfHwgeyBzY2hlbWE6IHNjaGVtYSwgcmVmVmFsOiByZWZWYWwsIHJlZnM6IHJlZnMgfTtcblxuICB2YXIgYyA9IGNoZWNrQ29tcGlsaW5nLmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICB2YXIgY29tcGlsYXRpb24gPSB0aGlzLl9jb21waWxhdGlvbnNbYy5pbmRleF07XG4gIGlmIChjLmNvbXBpbGluZykgcmV0dXJuIChjb21waWxhdGlvbi5jYWxsVmFsaWRhdGUgPSBjYWxsVmFsaWRhdGUpO1xuXG4gIHZhciBmb3JtYXRzID0gdGhpcy5fZm9ybWF0cztcbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcblxuICB0cnkge1xuICAgIHZhciB2ID0gbG9jYWxDb21waWxlKHNjaGVtYSwgcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpO1xuICAgIGNvbXBpbGF0aW9uLnZhbGlkYXRlID0gdjtcbiAgICB2YXIgY3YgPSBjb21waWxhdGlvbi5jYWxsVmFsaWRhdGU7XG4gICAgaWYgKGN2KSB7XG4gICAgICBjdi5zY2hlbWEgPSB2LnNjaGVtYTtcbiAgICAgIGN2LmVycm9ycyA9IG51bGw7XG4gICAgICBjdi5yZWZzID0gdi5yZWZzO1xuICAgICAgY3YucmVmVmFsID0gdi5yZWZWYWw7XG4gICAgICBjdi5yb290ID0gdi5yb290O1xuICAgICAgY3YuJGFzeW5jID0gdi4kYXN5bmM7XG4gICAgICBpZiAob3B0cy5zb3VyY2VDb2RlKSBjdi5zb3VyY2UgPSB2LnNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG4gIH0gZmluYWxseSB7XG4gICAgZW5kQ29tcGlsaW5nLmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICB9XG5cbiAgLyogQHRoaXMgICB7Kn0gLSBjdXN0b20gY29udGV4dCwgc2VlIHBhc3NDb250ZXh0IG9wdGlvbiAqL1xuICBmdW5jdGlvbiBjYWxsVmFsaWRhdGUoKSB7XG4gICAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICAgIHZhciB2YWxpZGF0ZSA9IGNvbXBpbGF0aW9uLnZhbGlkYXRlO1xuICAgIHZhciByZXN1bHQgPSB2YWxpZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGNhbGxWYWxpZGF0ZS5lcnJvcnMgPSB2YWxpZGF0ZS5lcnJvcnM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvY2FsQ29tcGlsZShfc2NoZW1hLCBfcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpIHtcbiAgICB2YXIgaXNSb290ID0gIV9yb290IHx8IChfcm9vdCAmJiBfcm9vdC5zY2hlbWEgPT0gX3NjaGVtYSk7XG4gICAgaWYgKF9yb290LnNjaGVtYSAhPSByb290LnNjaGVtYSlcbiAgICAgIHJldHVybiBjb21waWxlLmNhbGwoc2VsZiwgX3NjaGVtYSwgX3Jvb3QsIGxvY2FsUmVmcywgYmFzZUlkKTtcblxuICAgIHZhciAkYXN5bmMgPSBfc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZTtcblxuICAgIHZhciBzb3VyY2VDb2RlID0gdmFsaWRhdGVHZW5lcmF0b3Ioe1xuICAgICAgaXNUb3A6IHRydWUsXG4gICAgICBzY2hlbWE6IF9zY2hlbWEsXG4gICAgICBpc1Jvb3Q6IGlzUm9vdCxcbiAgICAgIGJhc2VJZDogYmFzZUlkLFxuICAgICAgcm9vdDogX3Jvb3QsXG4gICAgICBzY2hlbWFQYXRoOiAnJyxcbiAgICAgIGVyclNjaGVtYVBhdGg6ICcjJyxcbiAgICAgIGVycm9yUGF0aDogJ1wiXCInLFxuICAgICAgTWlzc2luZ1JlZkVycm9yOiBlcnJvckNsYXNzZXMuTWlzc2luZ1JlZixcbiAgICAgIFJVTEVTOiBSVUxFUyxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZUdlbmVyYXRvcixcbiAgICAgIHV0aWw6IHV0aWwsXG4gICAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgICAgcmVzb2x2ZVJlZjogcmVzb2x2ZVJlZixcbiAgICAgIHVzZVBhdHRlcm46IHVzZVBhdHRlcm4sXG4gICAgICB1c2VEZWZhdWx0OiB1c2VEZWZhdWx0LFxuICAgICAgdXNlQ3VzdG9tUnVsZTogdXNlQ3VzdG9tUnVsZSxcbiAgICAgIG9wdHM6IG9wdHMsXG4gICAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgICAgbG9nZ2VyOiBzZWxmLmxvZ2dlcixcbiAgICAgIHNlbGY6IHNlbGZcbiAgICB9KTtcblxuICAgIHNvdXJjZUNvZGUgPSB2YXJzKHJlZlZhbCwgcmVmVmFsQ29kZSkgKyB2YXJzKHBhdHRlcm5zLCBwYXR0ZXJuQ29kZSlcbiAgICAgICAgICAgICAgICAgICArIHZhcnMoZGVmYXVsdHMsIGRlZmF1bHRDb2RlKSArIHZhcnMoY3VzdG9tUnVsZXMsIGN1c3RvbVJ1bGVDb2RlKVxuICAgICAgICAgICAgICAgICAgICsgc291cmNlQ29kZTtcblxuICAgIGlmIChvcHRzLnByb2Nlc3NDb2RlKSBzb3VyY2VDb2RlID0gb3B0cy5wcm9jZXNzQ29kZShzb3VyY2VDb2RlLCBfc2NoZW1hKTtcbiAgICAvLyBjb25zb2xlLmxvZygnXFxuXFxuXFxuICoqKiBcXG4nLCBKU09OLnN0cmluZ2lmeShzb3VyY2VDb2RlKSk7XG4gICAgdmFyIHZhbGlkYXRlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgbWFrZVZhbGlkYXRlID0gbmV3IEZ1bmN0aW9uKFxuICAgICAgICAnc2VsZicsXG4gICAgICAgICdSVUxFUycsXG4gICAgICAgICdmb3JtYXRzJyxcbiAgICAgICAgJ3Jvb3QnLFxuICAgICAgICAncmVmVmFsJyxcbiAgICAgICAgJ2RlZmF1bHRzJyxcbiAgICAgICAgJ2N1c3RvbVJ1bGVzJyxcbiAgICAgICAgJ2VxdWFsJyxcbiAgICAgICAgJ3VjczJsZW5ndGgnLFxuICAgICAgICAnVmFsaWRhdGlvbkVycm9yJyxcbiAgICAgICAgc291cmNlQ29kZVxuICAgICAgKTtcblxuICAgICAgdmFsaWRhdGUgPSBtYWtlVmFsaWRhdGUoXG4gICAgICAgIHNlbGYsXG4gICAgICAgIFJVTEVTLFxuICAgICAgICBmb3JtYXRzLFxuICAgICAgICByb290LFxuICAgICAgICByZWZWYWwsXG4gICAgICAgIGRlZmF1bHRzLFxuICAgICAgICBjdXN0b21SdWxlcyxcbiAgICAgICAgZXF1YWwsXG4gICAgICAgIHVjczJsZW5ndGgsXG4gICAgICAgIFZhbGlkYXRpb25FcnJvclxuICAgICAgKTtcblxuICAgICAgcmVmVmFsWzBdID0gdmFsaWRhdGU7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBzZWxmLmxvZ2dlci5lcnJvcignRXJyb3IgY29tcGlsaW5nIHNjaGVtYSwgZnVuY3Rpb24gY29kZTonLCBzb3VyY2VDb2RlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUuc2NoZW1hID0gX3NjaGVtYTtcbiAgICB2YWxpZGF0ZS5lcnJvcnMgPSBudWxsO1xuICAgIHZhbGlkYXRlLnJlZnMgPSByZWZzO1xuICAgIHZhbGlkYXRlLnJlZlZhbCA9IHJlZlZhbDtcbiAgICB2YWxpZGF0ZS5yb290ID0gaXNSb290ID8gdmFsaWRhdGUgOiBfcm9vdDtcbiAgICBpZiAoJGFzeW5jKSB2YWxpZGF0ZS4kYXN5bmMgPSB0cnVlO1xuICAgIGlmIChvcHRzLnNvdXJjZUNvZGUgPT09IHRydWUpIHtcbiAgICAgIHZhbGlkYXRlLnNvdXJjZSA9IHtcbiAgICAgICAgY29kZTogc291cmNlQ29kZSxcbiAgICAgICAgcGF0dGVybnM6IHBhdHRlcm5zLFxuICAgICAgICBkZWZhdWx0czogZGVmYXVsdHNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlZihiYXNlSWQsIHJlZiwgaXNSb290KSB7XG4gICAgcmVmID0gcmVzb2x2ZS51cmwoYmFzZUlkLCByZWYpO1xuICAgIHZhciByZWZJbmRleCA9IHJlZnNbcmVmXTtcbiAgICB2YXIgX3JlZlZhbCwgcmVmQ29kZTtcbiAgICBpZiAocmVmSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgX3JlZlZhbCA9IHJlZlZhbFtyZWZJbmRleF07XG4gICAgICByZWZDb2RlID0gJ3JlZlZhbFsnICsgcmVmSW5kZXggKyAnXSc7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRSZWYoX3JlZlZhbCwgcmVmQ29kZSk7XG4gICAgfVxuICAgIGlmICghaXNSb290ICYmIHJvb3QucmVmcykge1xuICAgICAgdmFyIHJvb3RSZWZJZCA9IHJvb3QucmVmc1tyZWZdO1xuICAgICAgaWYgKHJvb3RSZWZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIF9yZWZWYWwgPSByb290LnJlZlZhbFtyb290UmVmSWRdO1xuICAgICAgICByZWZDb2RlID0gYWRkTG9jYWxSZWYocmVmLCBfcmVmVmFsKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkUmVmKF9yZWZWYWwsIHJlZkNvZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlZkNvZGUgPSBhZGRMb2NhbFJlZihyZWYpO1xuICAgIHZhciB2ID0gcmVzb2x2ZS5jYWxsKHNlbGYsIGxvY2FsQ29tcGlsZSwgcm9vdCwgcmVmKTtcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgbG9jYWxTY2hlbWEgPSBsb2NhbFJlZnMgJiYgbG9jYWxSZWZzW3JlZl07XG4gICAgICBpZiAobG9jYWxTY2hlbWEpIHtcbiAgICAgICAgdiA9IHJlc29sdmUuaW5saW5lUmVmKGxvY2FsU2NoZW1hLCBvcHRzLmlubGluZVJlZnMpXG4gICAgICAgICAgICA/IGxvY2FsU2NoZW1hXG4gICAgICAgICAgICA6IGNvbXBpbGUuY2FsbChzZWxmLCBsb2NhbFNjaGVtYSwgcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlbW92ZUxvY2FsUmVmKHJlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcGxhY2VMb2NhbFJlZihyZWYsIHYpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkUmVmKHYsIHJlZkNvZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZExvY2FsUmVmKHJlZiwgdikge1xuICAgIHZhciByZWZJZCA9IHJlZlZhbC5sZW5ndGg7XG4gICAgcmVmVmFsW3JlZklkXSA9IHY7XG4gICAgcmVmc1tyZWZdID0gcmVmSWQ7XG4gICAgcmV0dXJuICdyZWZWYWwnICsgcmVmSWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVMb2NhbFJlZihyZWYpIHtcbiAgICBkZWxldGUgcmVmc1tyZWZdO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVwbGFjZUxvY2FsUmVmKHJlZiwgdikge1xuICAgIHZhciByZWZJZCA9IHJlZnNbcmVmXTtcbiAgICByZWZWYWxbcmVmSWRdID0gdjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVkUmVmKHJlZlZhbCwgY29kZSkge1xuICAgIHJldHVybiB0eXBlb2YgcmVmVmFsID09ICdvYmplY3QnIHx8IHR5cGVvZiByZWZWYWwgPT0gJ2Jvb2xlYW4nXG4gICAgICAgICAgICA/IHsgY29kZTogY29kZSwgc2NoZW1hOiByZWZWYWwsIGlubGluZTogdHJ1ZSB9XG4gICAgICAgICAgICA6IHsgY29kZTogY29kZSwgJGFzeW5jOiByZWZWYWwgJiYgISFyZWZWYWwuJGFzeW5jIH07XG4gIH1cblxuICBmdW5jdGlvbiB1c2VQYXR0ZXJuKHJlZ2V4U3RyKSB7XG4gICAgdmFyIGluZGV4ID0gcGF0dGVybnNIYXNoW3JlZ2V4U3RyXTtcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kZXggPSBwYXR0ZXJuc0hhc2hbcmVnZXhTdHJdID0gcGF0dGVybnMubGVuZ3RoO1xuICAgICAgcGF0dGVybnNbaW5kZXhdID0gcmVnZXhTdHI7XG4gICAgfVxuICAgIHJldHVybiAncGF0dGVybicgKyBpbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZURlZmF1bHQodmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gJycgKyB2YWx1ZTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB1dGlsLnRvUXVvdGVkU3RyaW5nKHZhbHVlKTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgICAgICAgdmFyIHZhbHVlU3RyID0gc3RhYmxlU3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgdmFyIGluZGV4ID0gZGVmYXVsdHNIYXNoW3ZhbHVlU3RyXTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGRlZmF1bHRzSGFzaFt2YWx1ZVN0cl0gPSBkZWZhdWx0cy5sZW5ndGg7XG4gICAgICAgICAgZGVmYXVsdHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdkZWZhdWx0JyArIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUN1c3RvbVJ1bGUocnVsZSwgc2NoZW1hLCBwYXJlbnRTY2hlbWEsIGl0KSB7XG4gICAgaWYgKHNlbGYuX29wdHMudmFsaWRhdGVTY2hlbWEgIT09IGZhbHNlKSB7XG4gICAgICB2YXIgZGVwcyA9IHJ1bGUuZGVmaW5pdGlvbi5kZXBlbmRlbmNpZXM7XG4gICAgICBpZiAoZGVwcyAmJiAhZGVwcy5ldmVyeShmdW5jdGlvbihrZXl3b3JkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyZW50U2NoZW1hLCBrZXl3b3JkKTtcbiAgICAgIH0pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmVudCBzY2hlbWEgbXVzdCBoYXZlIGFsbCByZXF1aXJlZCBrZXl3b3JkczogJyArIGRlcHMuam9pbignLCcpKTtcblxuICAgICAgdmFyIHZhbGlkYXRlU2NoZW1hID0gcnVsZS5kZWZpbml0aW9uLnZhbGlkYXRlU2NoZW1hO1xuICAgICAgaWYgKHZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICAgIHZhciB2YWxpZCA9IHZhbGlkYXRlU2NoZW1hKHNjaGVtYSk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICB2YXIgbWVzc2FnZSA9ICdrZXl3b3JkIHNjaGVtYSBpcyBpbnZhbGlkOiAnICsgc2VsZi5lcnJvcnNUZXh0KHZhbGlkYXRlU2NoZW1hLmVycm9ycyk7XG4gICAgICAgICAgaWYgKHNlbGYuX29wdHMudmFsaWRhdGVTY2hlbWEgPT0gJ2xvZycpIHNlbGYubG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvbXBpbGUgPSBydWxlLmRlZmluaXRpb24uY29tcGlsZVxuICAgICAgLCBpbmxpbmUgPSBydWxlLmRlZmluaXRpb24uaW5saW5lXG4gICAgICAsIG1hY3JvID0gcnVsZS5kZWZpbml0aW9uLm1hY3JvO1xuXG4gICAgdmFyIHZhbGlkYXRlO1xuICAgIGlmIChjb21waWxlKSB7XG4gICAgICB2YWxpZGF0ZSA9IGNvbXBpbGUuY2FsbChzZWxmLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQpO1xuICAgIH0gZWxzZSBpZiAobWFjcm8pIHtcbiAgICAgIHZhbGlkYXRlID0gbWFjcm8uY2FsbChzZWxmLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQpO1xuICAgICAgaWYgKG9wdHMudmFsaWRhdGVTY2hlbWEgIT09IGZhbHNlKSBzZWxmLnZhbGlkYXRlU2NoZW1hKHZhbGlkYXRlLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGlubGluZSkge1xuICAgICAgdmFsaWRhdGUgPSBpbmxpbmUuY2FsbChzZWxmLCBpdCwgcnVsZS5rZXl3b3JkLCBzY2hlbWEsIHBhcmVudFNjaGVtYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlID0gcnVsZS5kZWZpbml0aW9uLnZhbGlkYXRlO1xuICAgICAgaWYgKCF2YWxpZGF0ZSkgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjdXN0b20ga2V5d29yZCBcIicgKyBydWxlLmtleXdvcmQgKyAnXCJmYWlsZWQgdG8gY29tcGlsZScpO1xuXG4gICAgdmFyIGluZGV4ID0gY3VzdG9tUnVsZXMubGVuZ3RoO1xuICAgIGN1c3RvbVJ1bGVzW2luZGV4XSA9IHZhbGlkYXRlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6ICdjdXN0b21SdWxlJyArIGluZGV4LFxuICAgICAgdmFsaWRhdGU6IHZhbGlkYXRlXG4gICAgfTtcbiAgfVxufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBzY2hlbWEgaXMgY3VycmVudGx5IGNvbXBpbGVkXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIHRvIGNvbXBpbGVcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCByb290IG9iamVjdFxuICogQHBhcmFtICB7U3RyaW5nfSBiYXNlSWQgYmFzZSBzY2hlbWEgSURcbiAqIEByZXR1cm4ge09iamVjdH0gb2JqZWN0IHdpdGggcHJvcGVydGllcyBcImluZGV4XCIgKGNvbXBpbGF0aW9uIGluZGV4KSBhbmQgXCJjb21waWxpbmdcIiAoYm9vbGVhbilcbiAqL1xuZnVuY3Rpb24gY2hlY2tDb21waWxpbmcoc2NoZW1hLCByb290LCBiYXNlSWQpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICB2YXIgaW5kZXggPSBjb21wSW5kZXguY2FsbCh0aGlzLCBzY2hlbWEsIHJvb3QsIGJhc2VJZCk7XG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4geyBpbmRleDogaW5kZXgsIGNvbXBpbGluZzogdHJ1ZSB9O1xuICBpbmRleCA9IHRoaXMuX2NvbXBpbGF0aW9ucy5sZW5ndGg7XG4gIHRoaXMuX2NvbXBpbGF0aW9uc1tpbmRleF0gPSB7XG4gICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgcm9vdDogcm9vdCxcbiAgICBiYXNlSWQ6IGJhc2VJZFxuICB9O1xuICByZXR1cm4geyBpbmRleDogaW5kZXgsIGNvbXBpbGluZzogZmFsc2UgfTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHNjaGVtYSBmcm9tIHRoZSBjdXJyZW50bHkgY29tcGlsZWQgbGlzdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSB0byBjb21waWxlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHJvb3Qgcm9vdCBvYmplY3RcbiAqIEBwYXJhbSAge1N0cmluZ30gYmFzZUlkIGJhc2Ugc2NoZW1hIElEXG4gKi9cbmZ1bmN0aW9uIGVuZENvbXBpbGluZyhzY2hlbWEsIHJvb3QsIGJhc2VJZCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciBpID0gY29tcEluZGV4LmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICBpZiAoaSA+PSAwKSB0aGlzLl9jb21waWxhdGlvbnMuc3BsaWNlKGksIDEpO1xufVxuXG5cbi8qKlxuICogSW5kZXggb2Ygc2NoZW1hIGNvbXBpbGF0aW9uIGluIHRoZSBjdXJyZW50bHkgY29tcGlsZWQgbGlzdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSB0byBjb21waWxlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHJvb3Qgcm9vdCBvYmplY3RcbiAqIEBwYXJhbSAge1N0cmluZ30gYmFzZUlkIGJhc2Ugc2NoZW1hIElEXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBjb21waWxhdGlvbiBpbmRleFxuICovXG5mdW5jdGlvbiBjb21wSW5kZXgoc2NoZW1hLCByb290LCBiYXNlSWQpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICBmb3IgKHZhciBpPTA7IGk8dGhpcy5fY29tcGlsYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSB0aGlzLl9jb21waWxhdGlvbnNbaV07XG4gICAgaWYgKGMuc2NoZW1hID09IHNjaGVtYSAmJiBjLnJvb3QgPT0gcm9vdCAmJiBjLmJhc2VJZCA9PSBiYXNlSWQpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5mdW5jdGlvbiBwYXR0ZXJuQ29kZShpLCBwYXR0ZXJucykge1xuICByZXR1cm4gJ3ZhciBwYXR0ZXJuJyArIGkgKyAnID0gbmV3IFJlZ0V4cCgnICsgdXRpbC50b1F1b3RlZFN0cmluZyhwYXR0ZXJuc1tpXSkgKyAnKTsnO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmF1bHRDb2RlKGkpIHtcbiAgcmV0dXJuICd2YXIgZGVmYXVsdCcgKyBpICsgJyA9IGRlZmF1bHRzWycgKyBpICsgJ107Jztcbn1cblxuXG5mdW5jdGlvbiByZWZWYWxDb2RlKGksIHJlZlZhbCkge1xuICByZXR1cm4gcmVmVmFsW2ldID09PSB1bmRlZmluZWQgPyAnJyA6ICd2YXIgcmVmVmFsJyArIGkgKyAnID0gcmVmVmFsWycgKyBpICsgJ107Jztcbn1cblxuXG5mdW5jdGlvbiBjdXN0b21SdWxlQ29kZShpKSB7XG4gIHJldHVybiAndmFyIGN1c3RvbVJ1bGUnICsgaSArICcgPSBjdXN0b21SdWxlc1snICsgaSArICddOyc7XG59XG5cblxuZnVuY3Rpb24gdmFycyhhcnIsIHN0YXRlbWVudCkge1xuICBpZiAoIWFyci5sZW5ndGgpIHJldHVybiAnJztcbiAgdmFyIGNvZGUgPSAnJztcbiAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKylcbiAgICBjb2RlICs9IHN0YXRlbWVudChpLCBhcnIpO1xuICByZXR1cm4gY29kZTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cblxudmFyIENhY2hlID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBDYWNoZSgpIHtcbiAgdGhpcy5fY2FjaGUgPSB7fTtcbn07XG5cblxuQ2FjaGUucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uIENhY2hlX3B1dChrZXksIHZhbHVlKSB7XG4gIHRoaXMuX2NhY2hlW2tleV0gPSB2YWx1ZTtcbn07XG5cblxuQ2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIENhY2hlX2dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX2NhY2hlW2tleV07XG59O1xuXG5cbkNhY2hlLnByb3RvdHlwZS5kZWwgPSBmdW5jdGlvbiBDYWNoZV9kZWwoa2V5KSB7XG4gIGRlbGV0ZSB0aGlzLl9jYWNoZVtrZXldO1xufTtcblxuXG5DYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBDYWNoZV9jbGVhcigpIHtcbiAgdGhpcy5fY2FjaGUgPSB7fTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgREFURSA9IC9eKFxcZFxcZFxcZFxcZCktKFxcZFxcZCktKFxcZFxcZCkkLztcbnZhciBEQVlTID0gWzAsMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO1xudmFyIFRJTUUgPSAvXihcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpKFxcLlxcZCspPyh6fFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/KT8kL2k7XG52YXIgSE9TVE5BTUUgPSAvXig/PS57MSwyNTN9XFwuPyQpW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XFwuW2EtejAtOV0oPzpbLTAtOWEtel17MCw2MX1bMC05YS16XSk/KSpcXC4/JC9pO1xudmFyIFVSSSA9IC9eKD86W2Etel1bYS16MC05K1xcLS5dKjopKD86XFwvP1xcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpdfCVbMC05YS1mXXsyfSkqQCk/KD86XFxbKD86KD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9fDo6KD86WzAtOWEtZl17MSw0fTopezV9fCg/OlswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDF9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M318KD86KD86WzAtOWEtZl17MSw0fTopezAsMn1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXsyfXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwzfVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fTp8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86OikoPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw1fVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw2fVswLTlhLWZdezEsNH0pPzo6KXxbVnZdWzAtOWEtZl0rXFwuW2EtejAtOVxcLS5ffiEkJicoKSorLDs9Ol0rKVxcXXwoPzooPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPyl8KD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9XXwlWzAtOWEtZl17Mn0pKikoPzo6XFxkKik/KD86XFwvKD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSp8XFwvKD86KD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSopP3woPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QF18JVswLTlhLWZdezJ9KSsoPzpcXC8oPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QF18JVswLTlhLWZdezJ9KSopKikoPzpcXD8oPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/KD86Iyg/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpALz9dfCVbMC05YS1mXXsyfSkqKT8kL2k7XG52YXIgVVJJUkVGID0gL14oPzpbYS16XVthLXowLTkrXFwtLl0qOik/KD86XFwvP1xcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpdfCVbMC05YS1mXXsyfSkqQCk/KD86XFxbKD86KD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9fDo6KD86WzAtOWEtZl17MSw0fTopezV9fCg/OlswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDF9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M318KD86KD86WzAtOWEtZl17MSw0fTopezAsMn1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXsyfXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwzfVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fTp8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86OikoPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw1fVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw2fVswLTlhLWZdezEsNH0pPzo6KXxbVnZdWzAtOWEtZl0rXFwuW2EtejAtOVxcLS5ffiEkJicoKSorLDs9Ol0rKVxcXXwoPzooPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPyl8KD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz1dfCVbMC05YS1mXXsyfSkqKSg/OjpcXGQqKT8oPzpcXC8oPzpbYS16MC05XFwtLl9+ISQmJ1wiKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKikqfFxcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QF18JVswLTlhLWZdezJ9KSopKik/fCg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QF18JVswLTlhLWZdezJ9KSopKik/KD86XFw/KD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/KD86Iyg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkAvP118JVswLTlhLWZdezJ9KSopPyQvaTtcbi8vIHVyaS10ZW1wbGF0ZTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY1NzBcbnZhciBVUklURU1QTEFURSA9IC9eKD86KD86W15cXHgwMC1cXHgyMFwiJzw+JVxcXFxeYHt8fV18JVswLTlhLWZdezJ9KXxcXHtbKyMuLzs/Jj0sIUB8XT8oPzpbYS16MC05X118JVswLTlhLWZdezJ9KSsoPzo6WzEtOV1bMC05XXswLDN9fFxcKik/KD86LCg/OlthLXowLTlfXXwlWzAtOWEtZl17Mn0pKyg/OjpbMS05XVswLTldezAsM318XFwqKT8pKlxcfSkqJC9pO1xuLy8gRm9yIHRoZSBzb3VyY2U6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RwZXJpbmkvNzI5Mjk0XG4vLyBGb3IgdGVzdCBjYXNlczogaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL2RlbW8vdXJsLXJlZ2V4XG4vLyBAdG9kbyBEZWxldGUgY3VycmVudCBVUkwgaW4gZmF2b3VyIG9mIHRoZSBjb21tZW50ZWQgb3V0IFVSTCBydWxlIHdoZW4gdGhpcyBpc3N1ZSBpcyBmaXhlZCBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvNzk4My5cbi8vIHZhciBVUkwgPSAvXig/Oig/Omh0dHBzP3xmdHApOlxcL1xcLykoPzpcXFMrKD86OlxcUyopP0ApPyg/Oig/ITEwKD86XFwuXFxkezEsM30pezN9KSg/ITEyNyg/OlxcLlxcZHsxLDN9KXszfSkoPyExNjlcXC4yNTQoPzpcXC5cXGR7MSwzfSl7Mn0pKD8hMTkyXFwuMTY4KD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXpcXHV7MDBhMX0tXFx1e2ZmZmZ9MC05XSstKSpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfTAtOV0rKSg/OlxcLig/OlthLXpcXHV7MDBhMX0tXFx1e2ZmZmZ9MC05XSstKSpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfTAtOV0rKSooPzpcXC4oPzpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfV17Mix9KSkpKD86OlxcZHsyLDV9KT8oPzpcXC9bXlxcc10qKT8kL2l1O1xudmFyIFVSTCA9IC9eKD86KD86aHR0cFtzXFx1MDE3Rl0/fGZ0cCk6XFwvXFwvKSg/Oig/OltcXDAtXFx4MDhcXHgwRS1cXHgxRiEtXFx4OUZcXHhBMS1cXHUxNjdGXFx1MTY4MS1cXHUxRkZGXFx1MjAwQi1cXHUyMDI3XFx1MjAyQS1cXHUyMDJFXFx1MjAzMC1cXHUyMDVFXFx1MjA2MC1cXHUyRkZGXFx1MzAwMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRUZFXFx1RkYwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSsoPzo6KD86W1xcMC1cXHgwOFxceDBFLVxceDFGIS1cXHg5RlxceEExLVxcdTE2N0ZcXHUxNjgxLVxcdTFGRkZcXHUyMDBCLVxcdTIwMjdcXHUyMDJBLVxcdTIwMkVcXHUyMDMwLVxcdTIwNUVcXHUyMDYwLVxcdTJGRkZcXHUzMDAxLVxcdUQ3RkZcXHVFMDAwLVxcdUZFRkVcXHVGRjAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKik/QCk/KD86KD8hMTAoPzpcXC5bMC05XXsxLDN9KXszfSkoPyExMjcoPzpcXC5bMC05XXsxLDN9KXszfSkoPyExNjlcXC4yNTQoPzpcXC5bMC05XXsxLDN9KXsyfSkoPyExOTJcXC4xNjgoPzpcXC5bMC05XXsxLDN9KXsyfSkoPyExNzJcXC4oPzoxWzYtOV18MlswLTldfDNbMDFdKSg/OlxcLlswLTldezEsM30pezJ9KSg/OlsxLTldWzAtOV0/fDFbMC05XVswLTldfDJbMDFdWzAtOV18MjJbMC0zXSkoPzpcXC4oPzoxP1swLTldezEsMn18MlswLTRdWzAtOV18MjVbMC01XSkpezJ9KD86XFwuKD86WzEtOV1bMC05XT98MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC00XSkpfCg/Oig/Oig/OlswLTlhLXpcXHhBMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXSkrLSkqKD86WzAtOWEtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSspKD86XFwuKD86KD86WzAtOWEtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSstKSooPzpbMC05YS16XFx4QTEtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKykqKD86XFwuKD86KD86W2EtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKXsyLH0pKSkoPzo6WzAtOV17Miw1fSk/KD86XFwvKD86W1xcMC1cXHgwOFxceDBFLVxceDFGIS1cXHg5RlxceEExLVxcdTE2N0ZcXHUxNjgxLVxcdTFGRkZcXHUyMDBCLVxcdTIwMjdcXHUyMDJBLVxcdTIwMkVcXHUyMDMwLVxcdTIwNUVcXHUyMDYwLVxcdTJGRkZcXHUzMDAxLVxcdUQ3RkZcXHVFMDAwLVxcdUZFRkVcXHVGRjAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKik/JC9pO1xudmFyIFVVSUQgPSAvXig/OnVybjp1dWlkOik/WzAtOWEtZl17OH0tKD86WzAtOWEtZl17NH0tKXszfVswLTlhLWZdezEyfSQvaTtcbnZhciBKU09OX1BPSU5URVIgPSAvXig/OlxcLyg/Oltefi9dfH4wfH4xKSopKiQvO1xudmFyIEpTT05fUE9JTlRFUl9VUklfRlJBR01FTlQgPSAvXiMoPzpcXC8oPzpbYS16MC05X1xcLS4hJCYnKCkqKyw7Oj1AXXwlWzAtOWEtZl17Mn18fjB8fjEpKikqJC9pO1xudmFyIFJFTEFUSVZFX0pTT05fUE9JTlRFUiA9IC9eKD86MHxbMS05XVswLTldKikoPzojfCg/OlxcLyg/Oltefi9dfH4wfH4xKSopKikkLztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvcm1hdHM7XG5cbmZ1bmN0aW9uIGZvcm1hdHMobW9kZSkge1xuICBtb2RlID0gbW9kZSA9PSAnZnVsbCcgPyAnZnVsbCcgOiAnZmFzdCc7XG4gIHJldHVybiB1dGlsLmNvcHkoZm9ybWF0c1ttb2RlXSk7XG59XG5cblxuZm9ybWF0cy5mYXN0ID0ge1xuICAvLyBkYXRlOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5I3NlY3Rpb24tNS42XG4gIGRhdGU6IC9eXFxkXFxkXFxkXFxkLVswLTFdXFxkLVswLTNdXFxkJC8sXG4gIC8vIGRhdGUtdGltZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNzZWN0aW9uLTUuNlxuICB0aW1lOiAvXig/OlswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkfDIzOjU5OjYwKSg/OlxcLlxcZCspPyg/Onp8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8pPyQvaSxcbiAgJ2RhdGUtdGltZSc6IC9eXFxkXFxkXFxkXFxkLVswLTFdXFxkLVswLTNdXFxkW3RcXHNdKD86WzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGR8MjM6NTk6NjApKD86XFwuXFxkKyk/KD86enxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPykkL2ksXG4gIC8vIHVyaTogaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC9pcy1teS1qc29uLXZhbGlkL2Jsb2IvbWFzdGVyL2Zvcm1hdHMuanNcbiAgdXJpOiAvXig/OlthLXpdW2EtejAtOStcXC0uXSo6KSg/OlxcLz9cXC8pP1teXFxzXSokL2ksXG4gICd1cmktcmVmZXJlbmNlJzogL14oPzooPzpbYS16XVthLXowLTkrXFwtLl0qOik/XFwvP1xcLyk/KD86W15cXFxcXFxzI11bXlxccyNdKik/KD86I1teXFxcXFxcc10qKT8kL2ksXG4gICd1cmktdGVtcGxhdGUnOiBVUklURU1QTEFURSxcbiAgdXJsOiBVUkwsXG4gIC8vIGVtYWlsIChzb3VyY2VzIGZyb20ganNlbiB2YWxpZGF0b3IpOlxuICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIwMTMyMy91c2luZy1hLXJlZ3VsYXItZXhwcmVzc2lvbi10by12YWxpZGF0ZS1hbi1lbWFpbC1hZGRyZXNzI2Fuc3dlci04ODI5MzYzXG4gIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2Zvcm1zLmh0bWwjdmFsaWQtZS1tYWlsLWFkZHJlc3MgKHNlYXJjaCBmb3IgJ3dpbGxmdWwgdmlvbGF0aW9uJylcbiAgZW1haWw6IC9eW2EtejAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XFwuW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KSokL2ksXG4gIGhvc3RuYW1lOiBIT1NUTkFNRSxcbiAgLy8gb3B0aW1pemVkIGh0dHBzOi8vd3d3LnNhZmFyaWJvb2tzb25saW5lLmNvbS9saWJyYXJ5L3ZpZXcvcmVndWxhci1leHByZXNzaW9ucy1jb29rYm9vay85NzgwNTk2ODAyODM3L2NoMDdzMTYuaHRtbFxuICBpcHY0OiAvXig/Oig/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSQvLFxuICAvLyBvcHRpbWl6ZWQgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81MzQ5Ny9yZWd1bGFyLWV4cHJlc3Npb24tdGhhdC1tYXRjaGVzLXZhbGlkLWlwdjYtYWRkcmVzc2VzXG4gIGlwdjY6IC9eXFxzKig/Oig/Oig/OlswLTlhLWZdezEsNH06KXs3fSg/OlswLTlhLWZdezEsNH18OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXs2fSg/OjpbMC05YS1mXXsxLDR9fCg/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwyfSl8Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NH0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwzfSl8KD86KD86OlswLTlhLWZdezEsNH0pPzooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXszfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDR9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwyfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsyfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDV9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwzfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsxfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDZ9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCw0fTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/OjooPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw3fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsNX06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKSkoPzolLispP1xccyokL2ksXG4gIHJlZ2V4OiByZWdleCxcbiAgLy8gdXVpZDogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDEyMlxuICB1dWlkOiBVVUlELFxuICAvLyBKU09OLXBvaW50ZXI6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxXG4gIC8vIHVyaSBmcmFnbWVudDogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQVxuICAnanNvbi1wb2ludGVyJzogSlNPTl9QT0lOVEVSLFxuICAnanNvbi1wb2ludGVyLXVyaS1mcmFnbWVudCc6IEpTT05fUE9JTlRFUl9VUklfRlJBR01FTlQsXG4gIC8vIHJlbGF0aXZlIEpTT04tcG9pbnRlcjogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtbHVmZi1yZWxhdGl2ZS1qc29uLXBvaW50ZXItMDBcbiAgJ3JlbGF0aXZlLWpzb24tcG9pbnRlcic6IFJFTEFUSVZFX0pTT05fUE9JTlRFUlxufTtcblxuXG5mb3JtYXRzLmZ1bGwgPSB7XG4gIGRhdGU6IGRhdGUsXG4gIHRpbWU6IHRpbWUsXG4gICdkYXRlLXRpbWUnOiBkYXRlX3RpbWUsXG4gIHVyaTogdXJpLFxuICAndXJpLXJlZmVyZW5jZSc6IFVSSVJFRixcbiAgJ3VyaS10ZW1wbGF0ZSc6IFVSSVRFTVBMQVRFLFxuICB1cmw6IFVSTCxcbiAgZW1haWw6IC9eW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/JC9pLFxuICBob3N0bmFtZTogSE9TVE5BTUUsXG4gIGlwdjQ6IC9eKD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pJC8sXG4gIGlwdjY6IC9eXFxzKig/Oig/Oig/OlswLTlhLWZdezEsNH06KXs3fSg/OlswLTlhLWZdezEsNH18OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXs2fSg/OjpbMC05YS1mXXsxLDR9fCg/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwyfSl8Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NH0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwzfSl8KD86KD86OlswLTlhLWZdezEsNH0pPzooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXszfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDR9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwyfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsyfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDV9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwzfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsxfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDZ9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCw0fTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/OjooPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw3fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsNX06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKSkoPzolLispP1xccyokL2ksXG4gIHJlZ2V4OiByZWdleCxcbiAgdXVpZDogVVVJRCxcbiAgJ2pzb24tcG9pbnRlcic6IEpTT05fUE9JTlRFUixcbiAgJ2pzb24tcG9pbnRlci11cmktZnJhZ21lbnQnOiBKU09OX1BPSU5URVJfVVJJX0ZSQUdNRU5ULFxuICAncmVsYXRpdmUtanNvbi1wb2ludGVyJzogUkVMQVRJVkVfSlNPTl9QT0lOVEVSXG59O1xuXG5cbmZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNhcHBlbmRpeC1DXG4gIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcbn1cblxuXG5mdW5jdGlvbiBkYXRlKHN0cikge1xuICAvLyBmdWxsLWRhdGUgZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5I3NlY3Rpb24tNS42XG4gIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKERBVEUpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybiBmYWxzZTtcblxuICB2YXIgeWVhciA9ICttYXRjaGVzWzFdO1xuICB2YXIgbW9udGggPSArbWF0Y2hlc1syXTtcbiAgdmFyIGRheSA9ICttYXRjaGVzWzNdO1xuXG4gIHJldHVybiBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyICYmIGRheSA+PSAxICYmXG4gICAgICAgICAgZGF5IDw9IChtb250aCA9PSAyICYmIGlzTGVhcFllYXIoeWVhcikgPyAyOSA6IERBWVNbbW9udGhdKTtcbn1cblxuXG5mdW5jdGlvbiB0aW1lKHN0ciwgZnVsbCkge1xuICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChUSU1FKTtcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGhvdXIgPSBtYXRjaGVzWzFdO1xuICB2YXIgbWludXRlID0gbWF0Y2hlc1syXTtcbiAgdmFyIHNlY29uZCA9IG1hdGNoZXNbM107XG4gIHZhciB0aW1lWm9uZSA9IG1hdGNoZXNbNV07XG4gIHJldHVybiAoKGhvdXIgPD0gMjMgJiYgbWludXRlIDw9IDU5ICYmIHNlY29uZCA8PSA1OSkgfHxcbiAgICAgICAgICAoaG91ciA9PSAyMyAmJiBtaW51dGUgPT0gNTkgJiYgc2Vjb25kID09IDYwKSkgJiZcbiAgICAgICAgICghZnVsbCB8fCB0aW1lWm9uZSk7XG59XG5cblxudmFyIERBVEVfVElNRV9TRVBBUkFUT1IgPSAvdHxcXHMvaTtcbmZ1bmN0aW9uIGRhdGVfdGltZShzdHIpIHtcbiAgLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNzZWN0aW9uLTUuNlxuICB2YXIgZGF0ZVRpbWUgPSBzdHIuc3BsaXQoREFURV9USU1FX1NFUEFSQVRPUik7XG4gIHJldHVybiBkYXRlVGltZS5sZW5ndGggPT0gMiAmJiBkYXRlKGRhdGVUaW1lWzBdKSAmJiB0aW1lKGRhdGVUaW1lWzFdLCB0cnVlKTtcbn1cblxuXG52YXIgTk9UX1VSSV9GUkFHTUVOVCA9IC9cXC98Oi87XG5mdW5jdGlvbiB1cmkoc3RyKSB7XG4gIC8vIGh0dHA6Ly9qbXJ3YXJlLmNvbS9hcnRpY2xlcy8yMDA5L3VyaV9yZWdleHAvVVJJX3JlZ2V4Lmh0bWwgKyBvcHRpb25hbCBwcm90b2NvbCArIHJlcXVpcmVkIFwiLlwiXG4gIHJldHVybiBOT1RfVVJJX0ZSQUdNRU5ULnRlc3Qoc3RyKSAmJiBVUkkudGVzdChzdHIpO1xufVxuXG5cbnZhciBaX0FOQ0hPUiA9IC9bXlxcXFxdXFxcXFovO1xuZnVuY3Rpb24gcmVnZXgoc3RyKSB7XG4gIGlmIChaX0FOQ0hPUi50ZXN0KHN0cikpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBuZXcgUmVnRXhwKHN0cik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfcmVmKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkYXN5bmMsICRyZWZDb2RlO1xuICBpZiAoJHNjaGVtYSA9PSAnIycgfHwgJHNjaGVtYSA9PSAnIy8nKSB7XG4gICAgaWYgKGl0LmlzUm9vdCkge1xuICAgICAgJGFzeW5jID0gaXQuYXN5bmM7XG4gICAgICAkcmVmQ29kZSA9ICd2YWxpZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgICRhc3luYyA9IGl0LnJvb3Quc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZTtcbiAgICAgICRyZWZDb2RlID0gJ3Jvb3QucmVmVmFsWzBdJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyICRyZWZWYWwgPSBpdC5yZXNvbHZlUmVmKGl0LmJhc2VJZCwgJHNjaGVtYSwgaXQuaXNSb290KTtcbiAgICBpZiAoJHJlZlZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgJG1lc3NhZ2UgPSBpdC5NaXNzaW5nUmVmRXJyb3IubWVzc2FnZShpdC5iYXNlSWQsICRzY2hlbWEpO1xuICAgICAgaWYgKGl0Lm9wdHMubWlzc2luZ1JlZnMgPT0gJ2ZhaWwnKSB7XG4gICAgICAgIGl0LmxvZ2dlci5lcnJvcigkbWVzc2FnZSk7XG4gICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnJHJlZicpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcmVmOiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKSArICdcXCcgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdjYW5cXFxcXFwndCByZXNvbHZlIHJlZmVyZW5jZSAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKSArICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKGZhbHNlKSB7ICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXQub3B0cy5taXNzaW5nUmVmcyA9PSAnaWdub3JlJykge1xuICAgICAgICBpdC5sb2dnZXIud2FybigkbWVzc2FnZSk7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IGl0Lk1pc3NpbmdSZWZFcnJvcihpdC5iYXNlSWQsICRzY2hlbWEsICRtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCRyZWZWYWwuaW5saW5lKSB7XG4gICAgICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgICAgICRpdC5sZXZlbCsrO1xuICAgICAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICAgICAgJGl0LnNjaGVtYSA9ICRyZWZWYWwuc2NoZW1hO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSAnJztcbiAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJHNjaGVtYTtcbiAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCkucmVwbGFjZSgvdmFsaWRhdGVcXC5zY2hlbWEvZywgJHJlZlZhbC5jb2RlKTtcbiAgICAgIG91dCArPSAnICcgKyAoJGNvZGUpICsgJyAnO1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICRhc3luYyA9ICRyZWZWYWwuJGFzeW5jID09PSB0cnVlIHx8IChpdC5hc3luYyAmJiAkcmVmVmFsLiRhc3luYyAhPT0gZmFsc2UpO1xuICAgICAgJHJlZkNvZGUgPSAkcmVmVmFsLmNvZGU7XG4gICAgfVxuICB9XG4gIGlmICgkcmVmQ29kZSkge1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJztcbiAgICBpZiAoaXQub3B0cy5wYXNzQ29udGV4dCkge1xuICAgICAgb3V0ICs9ICcgJyArICgkcmVmQ29kZSkgKyAnLmNhbGwodGhpcywgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgJyArICgkcmVmQ29kZSkgKyAnKCAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAnICsgKCRkYXRhKSArICcsIChkYXRhUGF0aCB8fCBcXCdcXCcpJztcbiAgICBpZiAoaXQuZXJyb3JQYXRoICE9ICdcIlwiJykge1xuICAgICAgb3V0ICs9ICcgKyAnICsgKGl0LmVycm9yUGF0aCk7XG4gICAgfVxuICAgIHZhciAkcGFyZW50RGF0YSA9ICRkYXRhTHZsID8gJ2RhdGEnICsgKCgkZGF0YUx2bCAtIDEpIHx8ICcnKSA6ICdwYXJlbnREYXRhJyxcbiAgICAgICRwYXJlbnREYXRhUHJvcGVydHkgPSAkZGF0YUx2bCA/IGl0LmRhdGFQYXRoQXJyWyRkYXRhTHZsXSA6ICdwYXJlbnREYXRhUHJvcGVydHknO1xuICAgIG91dCArPSAnICwgJyArICgkcGFyZW50RGF0YSkgKyAnICwgJyArICgkcGFyZW50RGF0YVByb3BlcnR5KSArICcsIHJvb3REYXRhKSAgJztcbiAgICB2YXIgX19jYWxsVmFsaWRhdGUgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoJGFzeW5jKSB7XG4gICAgICBpZiAoIWl0LmFzeW5jKSB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jIHNjaGVtYSByZWZlcmVuY2VkIGJ5IHN5bmMgc2NoZW1hJyk7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJzsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHRyeSB7IGF3YWl0ICcgKyAoX19jYWxsVmFsaWRhdGUpICsgJzsgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSBjYXRjaCAoZSkgeyBpZiAoIShlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkgdGhyb3cgZTsgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBlLmVycm9yczsgZWxzZSB2RXJyb3JzID0gdkVycm9ycy5jb25jYXQoZS5lcnJvcnMpOyBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCR2YWxpZCkgKyAnKSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIGlmICghJyArIChfX2NhbGxWYWxpZGF0ZSkgKyAnKSB7IGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gJyArICgkcmVmQ29kZSkgKyAnLmVycm9yczsgZWxzZSB2RXJyb3JzID0gdkVycm9ycy5jb25jYXQoJyArICgkcmVmQ29kZSkgKyAnLmVycm9ycyk7IGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOyB9ICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2FsbE9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkY3VycmVudEJhc2VJZCA9ICRpdC5iYXNlSWQsXG4gICAgJGFsbFNjaGVtYXNFbXB0eSA9IHRydWU7XG4gIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgaWYgKGFycjEpIHtcbiAgICB2YXIgJHNjaCwgJGkgPSAtMSxcbiAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAkc2NoID0gYXJyMVskaSArPSAxXTtcbiAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgJGFsbFNjaGVtYXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoICsgJy8nICsgJGk7XG4gICAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgaWYgKCRhbGxTY2hlbWFzRW1wdHkpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMuc2xpY2UoMCwgLTEpKSArICcgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2FueU9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkbm9FbXB0eVNjaGVtYSA9ICRzY2hlbWEuZXZlcnkoZnVuY3Rpb24oJHNjaCkge1xuICAgIHJldHVybiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSk7XG4gIH0pO1xuICBpZiAoJG5vRW1wdHlTY2hlbWEpIHtcbiAgICB2YXIgJGN1cnJlbnRCYXNlSWQgPSAkaXQuYmFzZUlkO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7IHZhciAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7ICAnO1xuICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgICBpZiAoYXJyMSkge1xuICAgICAgdmFyICRzY2gsICRpID0gLTEsXG4gICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICAgJHNjaCA9IGFycjFbJGkgKz0gMV07XG4gICAgICAgICRpdC5zY2hlbWEgPSAkc2NoO1xuICAgICAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoICsgJ1snICsgJGkgKyAnXSc7XG4gICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyAkaTtcbiAgICAgICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoJHZhbGlkKSArICcgfHwgJyArICgkbmV4dFZhbGlkKSArICc7IGlmICghJyArICgkdmFsaWQpICsgJykgeyAnO1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICB9XG4gICAgfVxuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICghJyArICgkdmFsaWQpICsgJykgeyAgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnYW55T2YnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7fSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIHNvbWUgc2NoZW1hIGluIGFueU9mXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodkVycm9ycyk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIG91dCArPSAnIH0gZWxzZSB7ICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyBpZiAodHJ1ZSkgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY29tbWVudChpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkY29tbWVudCA9IGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHNjaGVtYSk7XG4gIGlmIChpdC5vcHRzLiRjb21tZW50ID09PSB0cnVlKSB7XG4gICAgb3V0ICs9ICcgY29uc29sZS5sb2coJyArICgkY29tbWVudCkgKyAnKTsnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpdC5vcHRzLiRjb21tZW50ID09ICdmdW5jdGlvbicpIHtcbiAgICBvdXQgKz0gJyBzZWxmLl9vcHRzLiRjb21tZW50KCcgKyAoJGNvbW1lbnQpICsgJywgJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnLCB2YWxpZGF0ZS5yb290LnNjaGVtYSk7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY29uc3QoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgaWYgKCEkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnOyc7XG4gIH1cbiAgb3V0ICs9ICd2YXIgJyArICgkdmFsaWQpICsgJyA9IGVxdWFsKCcgKyAoJGRhdGEpICsgJywgc2NoZW1hJyArICgkbHZsKSArICcpOyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2NvbnN0JykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBhbGxvd2VkVmFsdWU6IHNjaGVtYScgKyAoJGx2bCkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlIGVxdWFsIHRvIGNvbnN0YW50XFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2NvbnRhaW5zKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkaWR4ID0gJ2knICsgJGx2bCxcbiAgICAkZGF0YU54dCA9ICRpdC5kYXRhTGV2ZWwgPSBpdC5kYXRhTGV2ZWwgKyAxLFxuICAgICRuZXh0RGF0YSA9ICdkYXRhJyArICRkYXRhTnh0LFxuICAgICRjdXJyZW50QmFzZUlkID0gaXQuYmFzZUlkLFxuICAgICRub25FbXB0eVNjaGVtYSA9IChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoZW1hID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2hlbWEpLmxlbmd0aCA+IDApIHx8ICRzY2hlbWEgPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoZW1hLCBpdC5SVUxFUy5hbGwpKTtcbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzO3ZhciAnICsgKCR2YWxpZCkgKyAnOyc7XG4gIGlmICgkbm9uRW1wdHlTY2hlbWEpIHtcbiAgICB2YXIgJHdhc0NvbXBvc2l0ZSA9IGl0LmNvbXBvc2l0ZVJ1bGU7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gdHJ1ZTtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHRWYWxpZCkgKyAnID0gZmFsc2U7IGZvciAodmFyICcgKyAoJGlkeCkgKyAnID0gMDsgJyArICgkaWR4KSArICcgPCAnICsgKCRkYXRhKSArICcubGVuZ3RoOyAnICsgKCRpZHgpICsgJysrKSB7ICc7XG4gICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAkaWR4LCBpdC5vcHRzLmpzb25Qb2ludGVycywgdHJ1ZSk7XG4gICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGlkeCArICddJztcbiAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGlkeDtcbiAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgYnJlYWs7IH0gICc7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBvdXQgKz0gJyAnICsgKCRjbG9zaW5nQnJhY2VzKSArICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgeyc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgaWYgKCcgKyAoJGRhdGEpICsgJy5sZW5ndGggPT0gMCkgeyc7XG4gIH1cbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdjb250YWlucycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBjb250YWluIGEgdmFsaWQgaXRlbVxcJyAnO1xuICAgIH1cbiAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnIH0gZWxzZSB7ICc7XG4gIGlmICgkbm9uRW1wdHlTY2hlbWEpIHtcbiAgICBvdXQgKz0gJyAgZXJyb3JzID0gJyArICgkZXJycykgKyAnOyBpZiAodkVycm9ycyAhPT0gbnVsbCkgeyBpZiAoJyArICgkZXJycykgKyAnKSB2RXJyb3JzLmxlbmd0aCA9ICcgKyAoJGVycnMpICsgJzsgZWxzZSB2RXJyb3JzID0gbnVsbDsgfSAnO1xuICB9XG4gIGlmIChpdC5vcHRzLmFsbEVycm9ycykge1xuICAgIG91dCArPSAnIH0gJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfZGVwZW5kZW5jaWVzKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJHNjaGVtYURlcHMgPSB7fSxcbiAgICAkcHJvcGVydHlEZXBzID0ge30sXG4gICAgJG93blByb3BlcnRpZXMgPSBpdC5vcHRzLm93blByb3BlcnRpZXM7XG4gIGZvciAoJHByb3BlcnR5IGluICRzY2hlbWEpIHtcbiAgICBpZiAoJHByb3BlcnR5ID09ICdfX3Byb3RvX18nKSBjb250aW51ZTtcbiAgICB2YXIgJHNjaCA9ICRzY2hlbWFbJHByb3BlcnR5XTtcbiAgICB2YXIgJGRlcHMgPSBBcnJheS5pc0FycmF5KCRzY2gpID8gJHByb3BlcnR5RGVwcyA6ICRzY2hlbWFEZXBzO1xuICAgICRkZXBzWyRwcm9wZXJ0eV0gPSAkc2NoO1xuICB9XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczsnO1xuICB2YXIgJGN1cnJlbnRFcnJvclBhdGggPSBpdC5lcnJvclBhdGg7XG4gIG91dCArPSAndmFyIG1pc3NpbmcnICsgKCRsdmwpICsgJzsnO1xuICBmb3IgKHZhciAkcHJvcGVydHkgaW4gJHByb3BlcnR5RGVwcykge1xuICAgICRkZXBzID0gJHByb3BlcnR5RGVwc1skcHJvcGVydHldO1xuICAgIGlmICgkZGVwcy5sZW5ndGgpIHtcbiAgICAgIG91dCArPSAnIGlmICggJyArICgkZGF0YSkgKyAoaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHkpKSArICcgIT09IHVuZGVmaW5lZCAnO1xuICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIG91dCArPSAnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnXFwnKSAnO1xuICAgICAgfVxuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgJiYgKCAnO1xuICAgICAgICB2YXIgYXJyMSA9ICRkZXBzO1xuICAgICAgICBpZiAoYXJyMSkge1xuICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksICRpID0gLTEsXG4gICAgICAgICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMSkge1xuICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyMVskaSArPSAxXTtcbiAgICAgICAgICAgIGlmICgkaSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkdXNlRGF0YSA9ICRkYXRhICsgJHByb3A7XG4gICAgICAgICAgICBvdXQgKz0gJyAoICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcpICYmIChtaXNzaW5nJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoaXQub3B0cy5qc29uUG9pbnRlcnMgPyAkcHJvcGVydHlLZXkgOiAkcHJvcCkpICsgJykgKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykpIHsgICc7XG4gICAgICAgIHZhciAkcHJvcGVydHlQYXRoID0gJ21pc3NpbmcnICsgJGx2bCxcbiAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gJ1xcJyArICcgKyAkcHJvcGVydHlQYXRoICsgJyArIFxcJyc7XG4gICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC5vcHRzLmpzb25Qb2ludGVycyA/IGl0LnV0aWwuZ2V0UGF0aEV4cHIoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eVBhdGgsIHRydWUpIDogJGN1cnJlbnRFcnJvclBhdGggKyAnICsgJyArICRwcm9wZXJ0eVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdkZXBlbmRlbmNpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHByb3BlcnR5OiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eSkpICsgJ1xcJywgbWlzc2luZ1Byb3BlcnR5OiBcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcJywgZGVwc0NvdW50OiAnICsgKCRkZXBzLmxlbmd0aCkgKyAnLCBkZXBzOiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzLmxlbmd0aCA9PSAxID8gJGRlcHNbMF0gOiAkZGVwcy5qb2luKFwiLCBcIikpKSArICdcXCcgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgaGF2ZSAnO1xuICAgICAgICAgICAgaWYgKCRkZXBzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgIG91dCArPSAncHJvcGVydHkgJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkZGVwc1swXSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdwcm9wZXJ0aWVzICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJGRlcHMuam9pbihcIiwgXCIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJyB3aGVuIHByb3BlcnR5ICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnIGlzIHByZXNlbnRcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgKSB7ICc7XG4gICAgICAgIHZhciBhcnIyID0gJGRlcHM7XG4gICAgICAgIGlmIChhcnIyKSB7XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTIgPSAtMSxcbiAgICAgICAgICAgIGwyID0gYXJyMi5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlIChpMiA8IGwyKSB7XG4gICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIyW2kyICs9IDFdO1xuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICAgJHVzZURhdGEgPSAkZGF0YSArICRwcm9wO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICEgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHlLZXkpKSArICdcXCcpICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnZGVwZW5kZW5jaWVzJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBwcm9wZXJ0eTogXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICdcXCcsIG1pc3NpbmdQcm9wZXJ0eTogXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXCcsIGRlcHNDb3VudDogJyArICgkZGVwcy5sZW5ndGgpICsgJywgZGVwczogXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkZGVwcy5sZW5ndGggPT0gMSA/ICRkZXBzWzBdIDogJGRlcHMuam9pbihcIiwgXCIpKSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgaGF2ZSAnO1xuICAgICAgICAgICAgICAgIGlmICgkZGVwcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdwcm9wZXJ0eSAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzWzBdKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAncHJvcGVydGllcyAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzLmpvaW4oXCIsIFwiKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB3aGVuIHByb3BlcnR5ICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnIGlzIHByZXNlbnRcXCcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAgICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgdmFyICRjdXJyZW50QmFzZUlkID0gJGl0LmJhc2VJZDtcbiAgZm9yICh2YXIgJHByb3BlcnR5IGluICRzY2hlbWFEZXBzKSB7XG4gICAgdmFyICRzY2ggPSAkc2NoZW1hRGVwc1skcHJvcGVydHldO1xuICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsgaWYgKCAnICsgKCRkYXRhKSArIChpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eSkpICsgJyAhPT0gdW5kZWZpbmVkICc7XG4gICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgb3V0ICs9ICcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICdcXCcpICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJykgeyAnO1xuICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHkpO1xuICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aCArICcvJyArIGl0LnV0aWwuZXNjYXBlRnJhZ21lbnQoJHByb3BlcnR5KTtcbiAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnO1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgICAnICsgKCRjbG9zaW5nQnJhY2VzKSArICcgaWYgKCcgKyAoJGVycnMpICsgJyA9PSBlcnJvcnMpIHsnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9lbnVtKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkaSA9ICdpJyArICRsdmwsXG4gICAgJHZTY2hlbWEgPSAnc2NoZW1hJyArICRsdmw7XG4gIGlmICghJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciAnICsgKCR2U2NoZW1hKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7JztcbiAgfVxuICBvdXQgKz0gJ3ZhciAnICsgKCR2YWxpZCkgKyAnOyc7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgaWYgKHNjaGVtYScgKyAoJGx2bCkgKyAnID09PSB1bmRlZmluZWQpICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyBlbHNlIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWEnICsgKCRsdmwpICsgJykpICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgZWxzZSB7JztcbiAgfVxuICBvdXQgKz0gJycgKyAoJHZhbGlkKSArICcgPSBmYWxzZTtmb3IgKHZhciAnICsgKCRpKSArICc9MDsgJyArICgkaSkgKyAnPCcgKyAoJHZTY2hlbWEpICsgJy5sZW5ndGg7ICcgKyAoJGkpICsgJysrKSBpZiAoZXF1YWwoJyArICgkZGF0YSkgKyAnLCAnICsgKCR2U2NoZW1hKSArICdbJyArICgkaSkgKyAnXSkpIHsgJyArICgkdmFsaWQpICsgJyA9IHRydWU7IGJyZWFrOyB9JztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAgfSAgJztcbiAgfVxuICBvdXQgKz0gJyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2VudW0nKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGFsbG93ZWRWYWx1ZXM6IHNjaGVtYScgKyAoJGx2bCkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXNcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHt9ICc7XG4gIH1cbiAgdmFyIF9fZXJyID0gb3V0O1xuICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgfVxuICBvdXQgKz0gJyB9JztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfZm9ybWF0KGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIGlmIChpdC5vcHRzLmZvcm1hdCA9PT0gZmFsc2UpIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICR1bmtub3duRm9ybWF0cyA9IGl0Lm9wdHMudW5rbm93bkZvcm1hdHMsXG4gICAgJGFsbG93VW5rbm93biA9IEFycmF5LmlzQXJyYXkoJHVua25vd25Gb3JtYXRzKTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICB2YXIgJGZvcm1hdCA9ICdmb3JtYXQnICsgJGx2bCxcbiAgICAgICRpc09iamVjdCA9ICdpc09iamVjdCcgKyAkbHZsLFxuICAgICAgJGZvcm1hdFR5cGUgPSAnZm9ybWF0VHlwZScgKyAkbHZsO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRmb3JtYXQpICsgJyA9IGZvcm1hdHNbJyArICgkc2NoZW1hVmFsdWUpICsgJ107IHZhciAnICsgKCRpc09iamVjdCkgKyAnID0gdHlwZW9mICcgKyAoJGZvcm1hdCkgKyAnID09IFxcJ29iamVjdFxcJyAmJiAhKCcgKyAoJGZvcm1hdCkgKyAnIGluc3RhbmNlb2YgUmVnRXhwKSAmJiAnICsgKCRmb3JtYXQpICsgJy52YWxpZGF0ZTsgdmFyICcgKyAoJGZvcm1hdFR5cGUpICsgJyA9ICcgKyAoJGlzT2JqZWN0KSArICcgJiYgJyArICgkZm9ybWF0KSArICcudHlwZSB8fCBcXCdzdHJpbmdcXCc7IGlmICgnICsgKCRpc09iamVjdCkgKyAnKSB7ICc7XG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB2YXIgYXN5bmMnICsgKCRsdmwpICsgJyA9ICcgKyAoJGZvcm1hdCkgKyAnLmFzeW5jOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAnICsgKCRmb3JtYXQpICsgJyA9ICcgKyAoJGZvcm1hdCkgKyAnLnZhbGlkYXRlOyB9IGlmICggICc7XG4gICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnc3RyaW5nXFwnKSB8fCAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAoJztcbiAgICBpZiAoJHVua25vd25Gb3JtYXRzICE9ICdpZ25vcmUnKSB7XG4gICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAmJiAhJyArICgkZm9ybWF0KSArICcgJztcbiAgICAgIGlmICgkYWxsb3dVbmtub3duKSB7XG4gICAgICAgIG91dCArPSAnICYmIHNlbGYuX29wdHMudW5rbm93bkZvcm1hdHMuaW5kZXhPZignICsgKCRzY2hlbWFWYWx1ZSkgKyAnKSA9PSAtMSAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcpIHx8ICc7XG4gICAgfVxuICAgIG91dCArPSAnICgnICsgKCRmb3JtYXQpICsgJyAmJiAnICsgKCRmb3JtYXRUeXBlKSArICcgPT0gXFwnJyArICgkcnVsZVR5cGUpICsgJ1xcJyAmJiAhKHR5cGVvZiAnICsgKCRmb3JtYXQpICsgJyA9PSBcXCdmdW5jdGlvblxcJyA/ICc7XG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyAoYXN5bmMnICsgKCRsdmwpICsgJyA/IGF3YWl0ICcgKyAoJGZvcm1hdCkgKyAnKCcgKyAoJGRhdGEpICsgJykgOiAnICsgKCRmb3JtYXQpICsgJygnICsgKCRkYXRhKSArICcpKSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRmb3JtYXQpICsgJygnICsgKCRkYXRhKSArICcpICc7XG4gICAgfVxuICAgIG91dCArPSAnIDogJyArICgkZm9ybWF0KSArICcudGVzdCgnICsgKCRkYXRhKSArICcpKSkpKSB7JztcbiAgfSBlbHNlIHtcbiAgICB2YXIgJGZvcm1hdCA9IGl0LmZvcm1hdHNbJHNjaGVtYV07XG4gICAgaWYgKCEkZm9ybWF0KSB7XG4gICAgICBpZiAoJHVua25vd25Gb3JtYXRzID09ICdpZ25vcmUnKSB7XG4gICAgICAgIGl0LmxvZ2dlci53YXJuKCd1bmtub3duIGZvcm1hdCBcIicgKyAkc2NoZW1hICsgJ1wiIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIicpO1xuICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH0gZWxzZSBpZiAoJGFsbG93VW5rbm93biAmJiAkdW5rbm93bkZvcm1hdHMuaW5kZXhPZigkc2NoZW1hKSA+PSAwKSB7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGZvcm1hdCBcIicgKyAkc2NoZW1hICsgJ1wiIGlzIHVzZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIicpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgJGlzT2JqZWN0ID0gdHlwZW9mICRmb3JtYXQgPT0gJ29iamVjdCcgJiYgISgkZm9ybWF0IGluc3RhbmNlb2YgUmVnRXhwKSAmJiAkZm9ybWF0LnZhbGlkYXRlO1xuICAgIHZhciAkZm9ybWF0VHlwZSA9ICRpc09iamVjdCAmJiAkZm9ybWF0LnR5cGUgfHwgJ3N0cmluZyc7XG4gICAgaWYgKCRpc09iamVjdCkge1xuICAgICAgdmFyICRhc3luYyA9ICRmb3JtYXQuYXN5bmMgPT09IHRydWU7XG4gICAgICAkZm9ybWF0ID0gJGZvcm1hdC52YWxpZGF0ZTtcbiAgICB9XG4gICAgaWYgKCRmb3JtYXRUeXBlICE9ICRydWxlVHlwZSkge1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGlmICgkYXN5bmMpIHtcbiAgICAgIGlmICghaXQuYXN5bmMpIHRocm93IG5ldyBFcnJvcignYXN5bmMgZm9ybWF0IGluIHN5bmMgc2NoZW1hJyk7XG4gICAgICB2YXIgJGZvcm1hdFJlZiA9ICdmb3JtYXRzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHNjaGVtYSkgKyAnLnZhbGlkYXRlJztcbiAgICAgIG91dCArPSAnIGlmICghKGF3YWl0ICcgKyAoJGZvcm1hdFJlZikgKyAnKCcgKyAoJGRhdGEpICsgJykpKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIGlmICghICc7XG4gICAgICB2YXIgJGZvcm1hdFJlZiA9ICdmb3JtYXRzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHNjaGVtYSk7XG4gICAgICBpZiAoJGlzT2JqZWN0KSAkZm9ybWF0UmVmICs9ICcudmFsaWRhdGUnO1xuICAgICAgaWYgKHR5cGVvZiAkZm9ybWF0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkZm9ybWF0UmVmKSArICcoJyArICgkZGF0YSkgKyAnKSAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkZm9ybWF0UmVmKSArICcudGVzdCgnICsgKCRkYXRhKSArICcpICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJykgeyAnO1xuICAgIH1cbiAgfVxuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2Zvcm1hdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgZm9ybWF0OiAgJztcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICB9XG4gICAgb3V0ICs9ICcgIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIGZvcm1hdCBcIic7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ1xcJyArICcgKyAoJHNjaGVtYVZhbHVlKSArICcgKyBcXCcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnXCJcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9pZihpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkdGhlblNjaCA9IGl0LnNjaGVtYVsndGhlbiddLFxuICAgICRlbHNlU2NoID0gaXQuc2NoZW1hWydlbHNlJ10sXG4gICAgJHRoZW5QcmVzZW50ID0gJHRoZW5TY2ggIT09IHVuZGVmaW5lZCAmJiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHRoZW5TY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHRoZW5TY2gpLmxlbmd0aCA+IDApIHx8ICR0aGVuU2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHRoZW5TY2gsIGl0LlJVTEVTLmFsbCkpLFxuICAgICRlbHNlUHJlc2VudCA9ICRlbHNlU2NoICE9PSB1bmRlZmluZWQgJiYgKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRlbHNlU2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRlbHNlU2NoKS5sZW5ndGggPiAwKSB8fCAkZWxzZVNjaCA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRlbHNlU2NoLCBpdC5SVUxFUy5hbGwpKSxcbiAgICAkY3VycmVudEJhc2VJZCA9ICRpdC5iYXNlSWQ7XG4gIGlmICgkdGhlblByZXNlbnQgfHwgJGVsc2VQcmVzZW50KSB7XG4gICAgdmFyICRpZkNsYXVzZTtcbiAgICAkaXQuY3JlYXRlRXJyb3JzID0gZmFsc2U7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7IHZhciAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgICc7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICRpdC5jcmVhdGVFcnJvcnMgPSB0cnVlO1xuICAgIG91dCArPSAnICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICAnO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgaWYgKCR0aGVuUHJlc2VudCkge1xuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICAnO1xuICAgICAgJGl0LnNjaGVtYSA9IGl0LnNjaGVtYVsndGhlbiddO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy50aGVuJztcbiAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvdGhlbic7XG4gICAgICBvdXQgKz0gJyAgJyArIChpdC52YWxpZGF0ZSgkaXQpKSArICcgJztcbiAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRuZXh0VmFsaWQpICsgJzsgJztcbiAgICAgIGlmICgkdGhlblByZXNlbnQgJiYgJGVsc2VQcmVzZW50KSB7XG4gICAgICAgICRpZkNsYXVzZSA9ICdpZkNsYXVzZScgKyAkbHZsO1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkaWZDbGF1c2UpICsgJyA9IFxcJ3RoZW5cXCc7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkaWZDbGF1c2UgPSAnXFwndGhlblxcJyc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICBpZiAoJGVsc2VQcmVzZW50KSB7XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkZWxzZVByZXNlbnQpIHtcbiAgICAgICRpdC5zY2hlbWEgPSBpdC5zY2hlbWFbJ2Vsc2UnXTtcbiAgICAgICRpdC5zY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArICcuZWxzZSc7XG4gICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL2Vsc2UnO1xuICAgICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gJyArICgkbmV4dFZhbGlkKSArICc7ICc7XG4gICAgICBpZiAoJHRoZW5QcmVzZW50ICYmICRlbHNlUHJlc2VudCkge1xuICAgICAgICAkaWZDbGF1c2UgPSAnaWZDbGF1c2UnICsgJGx2bDtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJGlmQ2xhdXNlKSArICcgPSBcXCdlbHNlXFwnOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGlmQ2xhdXNlID0gJ1xcJ2Vsc2VcXCcnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2lmJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBmYWlsaW5nS2V5d29yZDogJyArICgkaWZDbGF1c2UpICsgJyB9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgbWF0Y2ggXCJcXCcgKyAnICsgKCRpZkNsYXVzZSkgKyAnICsgXFwnXCIgc2NoZW1hXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodkVycm9ycyk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIG91dCArPSAnIH0gICAnO1xuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9pdGVtcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJGlkeCA9ICdpJyArICRsdmwsXG4gICAgJGRhdGFOeHQgPSAkaXQuZGF0YUxldmVsID0gaXQuZGF0YUxldmVsICsgMSxcbiAgICAkbmV4dERhdGEgPSAnZGF0YScgKyAkZGF0YU54dCxcbiAgICAkY3VycmVudEJhc2VJZCA9IGl0LmJhc2VJZDtcbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzO3ZhciAnICsgKCR2YWxpZCkgKyAnOyc7XG4gIGlmIChBcnJheS5pc0FycmF5KCRzY2hlbWEpKSB7XG4gICAgdmFyICRhZGRpdGlvbmFsSXRlbXMgPSBpdC5zY2hlbWEuYWRkaXRpb25hbEl0ZW1zO1xuICAgIGlmICgkYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoJGRhdGEpICsgJy5sZW5ndGggPD0gJyArICgkc2NoZW1hLmxlbmd0aCkgKyAnOyAnO1xuICAgICAgdmFyICRjdXJyRXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgICAgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgb3V0ICs9ICcgIGlmICghJyArICgkdmFsaWQpICsgJykgeyAgICc7XG4gICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdhZGRpdGlvbmFsSXRlbXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGxpbWl0OiAnICsgKCRzY2hlbWEubGVuZ3RoKSArICcgfSAnO1xuICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgaGF2ZSBtb3JlIHRoYW4gJyArICgkc2NoZW1hLmxlbmd0aCkgKyAnIGl0ZW1zXFwnICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiBmYWxzZSAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgfVxuICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAkZXJyU2NoZW1hUGF0aCA9ICRjdXJyRXJyU2NoZW1hUGF0aDtcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgICBpZiAoYXJyMSkge1xuICAgICAgdmFyICRzY2gsICRpID0gLTEsXG4gICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICAgJHNjaCA9IGFycjFbJGkgKz0gMV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IHRydWU7IGlmICgnICsgKCRkYXRhKSArICcubGVuZ3RoID4gJyArICgkaSkgKyAnKSB7ICc7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGkgKyAnXSc7XG4gICAgICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyAkaTtcbiAgICAgICAgICAkaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRpLCBpdC5vcHRzLmpzb25Qb2ludGVycywgdHJ1ZSk7XG4gICAgICAgICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpO1xuICAgICAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgJGFkZGl0aW9uYWxJdGVtcyA9PSAnb2JqZWN0JyAmJiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJGFkZGl0aW9uYWxJdGVtcyA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkYWRkaXRpb25hbEl0ZW1zKS5sZW5ndGggPiAwKSB8fCAkYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJGFkZGl0aW9uYWxJdGVtcywgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICRpdC5zY2hlbWEgPSAkYWRkaXRpb25hbEl0ZW1zO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgb3V0ICs9ICcgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyBpZiAoJyArICgkZGF0YSkgKyAnLmxlbmd0aCA+ICcgKyAoJHNjaGVtYS5sZW5ndGgpICsgJykgeyAgZm9yICh2YXIgJyArICgkaWR4KSArICcgPSAnICsgKCRzY2hlbWEubGVuZ3RoKSArICc7ICcgKyAoJGlkeCkgKyAnIDwgJyArICgkZGF0YSkgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyAnO1xuICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAkaWR4LCBpdC5vcHRzLmpzb25Qb2ludGVycywgdHJ1ZSk7XG4gICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAkaWR4ICsgJ10nO1xuICAgICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpZHg7XG4gICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dERhdGEpICsgJyA9ICcgKyAoJHBhc3NEYXRhKSArICc7ICcgKyAoJGNvZGUpICsgJyAnO1xuICAgICAgfVxuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgYnJlYWs7ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9IH0gICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgJztcbiAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaGVtYSA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoZW1hKS5sZW5ndGggPiAwKSB8fCAkc2NoZW1hID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaGVtYSwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgb3V0ICs9ICcgIGZvciAodmFyICcgKyAoJGlkeCkgKyAnID0gJyArICgwKSArICc7ICcgKyAoJGlkeCkgKyAnIDwgJyArICgkZGF0YSkgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyAnO1xuICAgICRpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGhFeHByKGl0LmVycm9yUGF0aCwgJGlkeCwgaXQub3B0cy5qc29uUG9pbnRlcnMsIHRydWUpO1xuICAgIHZhciAkcGFzc0RhdGEgPSAkZGF0YSArICdbJyArICRpZHggKyAnXSc7XG4gICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpZHg7XG4gICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgIG91dCArPSAnICcgKyAoaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSkpICsgJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dERhdGEpICsgJyA9ICcgKyAoJHBhc3NEYXRhKSArICc7ICcgKyAoJGNvZGUpICsgJyAnO1xuICAgIH1cbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgYnJlYWs7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0nO1xuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfX2xpbWl0KGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICRpc01heCA9ICRrZXl3b3JkID09ICdtYXhpbXVtJyxcbiAgICAkZXhjbHVzaXZlS2V5d29yZCA9ICRpc01heCA/ICdleGNsdXNpdmVNYXhpbXVtJyA6ICdleGNsdXNpdmVNaW5pbXVtJyxcbiAgICAkc2NoZW1hRXhjbCA9IGl0LnNjaGVtYVskZXhjbHVzaXZlS2V5d29yZF0sXG4gICAgJGlzRGF0YUV4Y2wgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWFFeGNsICYmICRzY2hlbWFFeGNsLiRkYXRhLFxuICAgICRvcCA9ICRpc01heCA/ICc8JyA6ICc+JyxcbiAgICAkbm90T3AgPSAkaXNNYXggPyAnPicgOiAnPCcsXG4gICAgJGVycm9yS2V5d29yZCA9IHVuZGVmaW5lZDtcbiAgaWYgKCEoJGlzRGF0YSB8fCB0eXBlb2YgJHNjaGVtYSA9PSAnbnVtYmVyJyB8fCAkc2NoZW1hID09PSB1bmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCRrZXl3b3JkICsgJyBtdXN0IGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghKCRpc0RhdGFFeGNsIHx8ICRzY2hlbWFFeGNsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mICRzY2hlbWFFeGNsID09ICdudW1iZXInIHx8IHR5cGVvZiAkc2NoZW1hRXhjbCA9PSAnYm9vbGVhbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCRleGNsdXNpdmVLZXl3b3JkICsgJyBtdXN0IGJlIG51bWJlciBvciBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCRpc0RhdGFFeGNsKSB7XG4gICAgdmFyICRzY2hlbWFWYWx1ZUV4Y2wgPSBpdC51dGlsLmdldERhdGEoJHNjaGVtYUV4Y2wuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFyciksXG4gICAgICAkZXhjbHVzaXZlID0gJ2V4Y2x1c2l2ZScgKyAkbHZsLFxuICAgICAgJGV4Y2xUeXBlID0gJ2V4Y2xUeXBlJyArICRsdmwsXG4gICAgICAkZXhjbElzTnVtYmVyID0gJ2V4Y2xJc051bWJlcicgKyAkbHZsLFxuICAgICAgJG9wRXhwciA9ICdvcCcgKyAkbHZsLFxuICAgICAgJG9wU3RyID0gJ1xcJyArICcgKyAkb3BFeHByICsgJyArIFxcJyc7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYUV4Y2wnICsgKCRsdmwpICsgJyA9ICcgKyAoJHNjaGVtYVZhbHVlRXhjbCkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZUV4Y2wgPSAnc2NoZW1hRXhjbCcgKyAkbHZsO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRleGNsdXNpdmUpICsgJzsgdmFyICcgKyAoJGV4Y2xUeXBlKSArICcgPSB0eXBlb2YgJyArICgkc2NoZW1hVmFsdWVFeGNsKSArICc7IGlmICgnICsgKCRleGNsVHlwZSkgKyAnICE9IFxcJ2Jvb2xlYW5cXCcgJiYgJyArICgkZXhjbFR5cGUpICsgJyAhPSBcXCd1bmRlZmluZWRcXCcgJiYgJyArICgkZXhjbFR5cGUpICsgJyAhPSBcXCdudW1iZXJcXCcpIHsgJztcbiAgICB2YXIgJGVycm9yS2V5d29yZCA9ICRleGNsdXNpdmVLZXl3b3JkO1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19leGNsdXNpdmVMaW1pdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCcnICsgKCRleGNsdXNpdmVLZXl3b3JkKSArICcgc2hvdWxkIGJlIGJvb2xlYW5cXCcgJztcbiAgICAgIH1cbiAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgdmFyIF9fZXJyID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9IGVsc2UgaWYgKCAnO1xuICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgJyArICgkZXhjbFR5cGUpICsgJyA9PSBcXCdudW1iZXJcXCcgPyAoICgnICsgKCRleGNsdXNpdmUpICsgJyA9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgPT09IHVuZGVmaW5lZCB8fCAnICsgKCRzY2hlbWFWYWx1ZUV4Y2wpICsgJyAnICsgKCRvcCkgKyAnPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnKSA/ICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnPSAnICsgKCRzY2hlbWFWYWx1ZUV4Y2wpICsgJyA6ICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgKSA6ICggKCcgKyAoJGV4Y2x1c2l2ZSkgKyAnID0gJyArICgkc2NoZW1hVmFsdWVFeGNsKSArICcgPT09IHRydWUpID8gJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICc9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgOiAnICsgKCRkYXRhKSArICcgJyArICgkbm90T3ApICsgJyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICkgfHwgJyArICgkZGF0YSkgKyAnICE9PSAnICsgKCRkYXRhKSArICcpIHsgdmFyIG9wJyArICgkbHZsKSArICcgPSAnICsgKCRleGNsdXNpdmUpICsgJyA/IFxcJycgKyAoJG9wKSArICdcXCcgOiBcXCcnICsgKCRvcCkgKyAnPVxcJzsgJztcbiAgICBpZiAoJHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAkZXJyb3JLZXl3b3JkID0gJGV4Y2x1c2l2ZUtleXdvcmQ7XG4gICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWFWYWx1ZUV4Y2w7XG4gICAgICAkaXNEYXRhID0gJGlzRGF0YUV4Y2w7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciAkZXhjbElzTnVtYmVyID0gdHlwZW9mICRzY2hlbWFFeGNsID09ICdudW1iZXInLFxuICAgICAgJG9wU3RyID0gJG9wO1xuICAgIGlmICgkZXhjbElzTnVtYmVyICYmICRpc0RhdGEpIHtcbiAgICAgIHZhciAkb3BFeHByID0gJ1xcJycgKyAkb3BTdHIgKyAnXFwnJztcbiAgICAgIG91dCArPSAnIGlmICggJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgKCAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSB1bmRlZmluZWQgfHwgJyArICgkc2NoZW1hRXhjbCkgKyAnICcgKyAoJG9wKSArICc9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgPyAnICsgKCRkYXRhKSArICcgJyArICgkbm90T3ApICsgJz0gJyArICgkc2NoZW1hRXhjbCkgKyAnIDogJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJyApIHx8ICcgKyAoJGRhdGEpICsgJyAhPT0gJyArICgkZGF0YSkgKyAnKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkZXhjbElzTnVtYmVyICYmICRzY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAkZXhjbHVzaXZlID0gdHJ1ZTtcbiAgICAgICAgJGVycm9yS2V5d29yZCA9ICRleGNsdXNpdmVLZXl3b3JkO1xuICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYUV4Y2w7XG4gICAgICAgICRub3RPcCArPSAnPSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoJGV4Y2xJc051bWJlcikgJHNjaGVtYVZhbHVlID0gTWF0aFskaXNNYXggPyAnbWluJyA6ICdtYXgnXSgkc2NoZW1hRXhjbCwgJHNjaGVtYSk7XG4gICAgICAgIGlmICgkc2NoZW1hRXhjbCA9PT0gKCRleGNsSXNOdW1iZXIgPyAkc2NoZW1hVmFsdWUgOiB0cnVlKSkge1xuICAgICAgICAgICRleGNsdXNpdmUgPSB0cnVlO1xuICAgICAgICAgICRlcnJvcktleXdvcmQgPSAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgICAkbm90T3AgKz0gJz0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRleGNsdXNpdmUgPSBmYWxzZTtcbiAgICAgICAgICAkb3BTdHIgKz0gJz0nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgJG9wRXhwciA9ICdcXCcnICsgJG9wU3RyICsgJ1xcJyc7XG4gICAgICBvdXQgKz0gJyBpZiAoICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfHwgJyArICgkZGF0YSkgKyAnICE9PSAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICB9XG4gIH1cbiAgJGVycm9yS2V5d29yZCA9ICRlcnJvcktleXdvcmQgfHwgJGtleXdvcmQ7XG4gIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICdfbGltaXQnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGNvbXBhcmlzb246ICcgKyAoJG9wRXhwcikgKyAnLCBsaW1pdDogJyArICgkc2NoZW1hVmFsdWUpICsgJywgZXhjbHVzaXZlOiAnICsgKCRleGNsdXNpdmUpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBiZSAnICsgKCRvcFN0cikgKyAnICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ1xcJyArICcgKyAoJHNjaGVtYVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hVmFsdWUpICsgJ1xcJyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnIH0gJztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfX2xpbWl0SXRlbXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICB2YXIgJG9wID0gJGtleXdvcmQgPT0gJ21heEl0ZW1zJyA/ICc+JyA6ICc8JztcbiAgb3V0ICs9ICdpZiAoICc7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgKCcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPSBcXCdudW1iZXJcXCcpIHx8ICc7XG4gIH1cbiAgb3V0ICs9ICcgJyArICgkZGF0YSkgKyAnLmxlbmd0aCAnICsgKCRvcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcpIHsgJztcbiAgdmFyICRlcnJvcktleXdvcmQgPSAka2V5d29yZDtcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19saW1pdEl0ZW1zJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBsaW1pdDogJyArICgkc2NoZW1hVmFsdWUpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgaGF2ZSAnO1xuICAgICAgaWYgKCRrZXl3b3JkID09ICdtYXhJdGVtcycpIHtcbiAgICAgICAgb3V0ICs9ICdtb3JlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnZmV3ZXInO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgdGhhbiAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGl0ZW1zXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9fbGltaXRMZW5ndGgoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICB2YXIgJG9wID0gJGtleXdvcmQgPT0gJ21heExlbmd0aCcgPyAnPicgOiAnPCc7XG4gIG91dCArPSAnaWYgKCAnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICB9XG4gIGlmIChpdC5vcHRzLnVuaWNvZGUgPT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgJyArICgkZGF0YSkgKyAnLmxlbmd0aCAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHVjczJsZW5ndGgoJyArICgkZGF0YSkgKyAnKSAnO1xuICB9XG4gIG91dCArPSAnICcgKyAoJG9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJykgeyAnO1xuICB2YXIgJGVycm9yS2V5d29yZCA9ICRrZXl3b3JkO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnX2xpbWl0TGVuZ3RoJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBsaW1pdDogJyArICgkc2NoZW1hVmFsdWUpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgYmUgJztcbiAgICAgIGlmICgka2V5d29yZCA9PSAnbWF4TGVuZ3RoJykge1xuICAgICAgICBvdXQgKz0gJ2xvbmdlcic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ3Nob3J0ZXInO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgdGhhbiAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGNoYXJhY3RlcnNcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICd9ICc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX19saW1pdFByb3BlcnRpZXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICB2YXIgJG9wID0gJGtleXdvcmQgPT0gJ21heFByb3BlcnRpZXMnID8gJz4nIDogJzwnO1xuICBvdXQgKz0gJ2lmICggJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgfVxuICBvdXQgKz0gJyBPYmplY3Qua2V5cygnICsgKCRkYXRhKSArICcpLmxlbmd0aCAnICsgKCRvcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcpIHsgJztcbiAgdmFyICRlcnJvcktleXdvcmQgPSAka2V5d29yZDtcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19saW1pdFByb3BlcnRpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGxpbWl0OiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBoYXZlICc7XG4gICAgICBpZiAoJGtleXdvcmQgPT0gJ21heFByb3BlcnRpZXMnKSB7XG4gICAgICAgIG91dCArPSAnbW9yZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ2Zld2VyJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHRoYW4gJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpICsgJyArIFxcJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyBwcm9wZXJ0aWVzXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9tdWx0aXBsZU9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICBvdXQgKz0gJ3ZhciBkaXZpc2lvbicgKyAoJGx2bCkgKyAnO2lmICgnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT09IHVuZGVmaW5lZCAmJiAoIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJyB8fCAnO1xuICB9XG4gIG91dCArPSAnIChkaXZpc2lvbicgKyAoJGx2bCkgKyAnID0gJyArICgkZGF0YSkgKyAnIC8gJyArICgkc2NoZW1hVmFsdWUpICsgJywgJztcbiAgaWYgKGl0Lm9wdHMubXVsdGlwbGVPZlByZWNpc2lvbikge1xuICAgIG91dCArPSAnIE1hdGguYWJzKE1hdGgucm91bmQoZGl2aXNpb24nICsgKCRsdmwpICsgJykgLSBkaXZpc2lvbicgKyAoJGx2bCkgKyAnKSA+IDFlLScgKyAoaXQub3B0cy5tdWx0aXBsZU9mUHJlY2lzaW9uKSArICcgJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyBkaXZpc2lvbicgKyAoJGx2bCkgKyAnICE9PSBwYXJzZUludChkaXZpc2lvbicgKyAoJGx2bCkgKyAnKSAnO1xuICB9XG4gIG91dCArPSAnICkgJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAgKSAgJztcbiAgfVxuICBvdXQgKz0gJyApIHsgICAnO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ211bHRpcGxlT2YnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IG11bHRpcGxlT2Y6ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgYmUgbXVsdGlwbGUgb2YgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSkgKyAnXFwnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICd9ICc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX25vdChpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICBpZiAoKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2hlbWEgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaGVtYSkubGVuZ3RoID4gMCkgfHwgJHNjaGVtYSA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2hlbWEsIGl0LlJVTEVTLmFsbCkpKSB7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7ICAnO1xuICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgICRpdC5jcmVhdGVFcnJvcnMgPSBmYWxzZTtcbiAgICB2YXIgJGFsbEVycm9yc09wdGlvbjtcbiAgICBpZiAoJGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgICAkYWxsRXJyb3JzT3B0aW9uID0gJGl0Lm9wdHMuYWxsRXJyb3JzO1xuICAgICAgJGl0Lm9wdHMuYWxsRXJyb3JzID0gZmFsc2U7XG4gICAgfVxuICAgIG91dCArPSAnICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgJGl0LmNyZWF0ZUVycm9ycyA9IHRydWU7XG4gICAgaWYgKCRhbGxFcnJvcnNPcHRpb24pICRpdC5vcHRzLmFsbEVycm9ycyA9ICRhbGxFcnJvcnNPcHRpb247XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgICAnO1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdub3QnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7fSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBiZSB2YWxpZFxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB7fSAnO1xuICAgIH1cbiAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gZWxzZSB7ICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ25vdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGJlIHZhbGlkXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmIChmYWxzZSkgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfb25lT2YoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICB2YXIgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgdmFyICRjdXJyZW50QmFzZUlkID0gJGl0LmJhc2VJZCxcbiAgICAkcHJldlZhbGlkID0gJ3ByZXZWYWxpZCcgKyAkbHZsLFxuICAgICRwYXNzaW5nU2NoZW1hcyA9ICdwYXNzaW5nU2NoZW1hcycgKyAkbHZsO1xuICBvdXQgKz0gJ3ZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnMgLCAnICsgKCRwcmV2VmFsaWQpICsgJyA9IGZhbHNlICwgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlICwgJyArICgkcGFzc2luZ1NjaGVtYXMpICsgJyA9IG51bGw7ICc7XG4gIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gdHJ1ZTtcbiAgdmFyIGFycjEgPSAkc2NoZW1hO1xuICBpZiAoYXJyMSkge1xuICAgIHZhciAkc2NoLCAkaSA9IC0xLFxuICAgICAgbDEgPSBhcnIxLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICRzY2ggPSBhcnIxWyRpICs9IDFdO1xuICAgICAgaWYgKChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2gpLmxlbmd0aCA+IDApIHx8ICRzY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoLCBpdC5SVUxFUy5hbGwpKSkge1xuICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoICsgJy8nICsgJGk7XG4gICAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyAnO1xuICAgICAgfVxuICAgICAgaWYgKCRpKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJyAmJiAnICsgKCRwcmV2VmFsaWQpICsgJykgeyAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7ICcgKyAoJHBhc3NpbmdTY2hlbWFzKSArICcgPSBbJyArICgkcGFzc2luZ1NjaGVtYXMpICsgJywgJyArICgkaSkgKyAnXTsgfSBlbHNlIHsgJztcbiAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRwcmV2VmFsaWQpICsgJyA9IHRydWU7ICcgKyAoJHBhc3NpbmdTY2hlbWFzKSArICcgPSAnICsgKCRpKSArICc7IH0nO1xuICAgIH1cbiAgfVxuICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICBvdXQgKz0gJycgKyAoJGNsb3NpbmdCcmFjZXMpICsgJ2lmICghJyArICgkdmFsaWQpICsgJykgeyAgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdvbmVPZicpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcGFzc2luZ1NjaGVtYXM6ICcgKyAoJHBhc3NpbmdTY2hlbWFzKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgbWF0Y2ggZXhhY3RseSBvbmUgc2NoZW1hIGluIG9uZU9mXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZFcnJvcnMpOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgfVxuICB9XG4gIG91dCArPSAnfSBlbHNlIHsgIGVycm9ycyA9ICcgKyAoJGVycnMpICsgJzsgaWYgKHZFcnJvcnMgIT09IG51bGwpIHsgaWYgKCcgKyAoJGVycnMpICsgJykgdkVycm9ycy5sZW5ndGggPSAnICsgKCRlcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IG51bGw7IH0nO1xuICBpZiAoaXQub3B0cy5hbGxFcnJvcnMpIHtcbiAgICBvdXQgKz0gJyB9ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3BhdHRlcm4oaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkcmVnZXhwID0gJGlzRGF0YSA/ICcobmV3IFJlZ0V4cCgnICsgJHNjaGVtYVZhbHVlICsgJykpJyA6IGl0LnVzZVBhdHRlcm4oJHNjaGVtYSk7XG4gIG91dCArPSAnaWYgKCAnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnc3RyaW5nXFwnKSB8fCAnO1xuICB9XG4gIG91dCArPSAnICEnICsgKCRyZWdleHApICsgJy50ZXN0KCcgKyAoJGRhdGEpICsgJykgKSB7ICAgJztcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdwYXR0ZXJuJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBwYXR0ZXJuOiAgJztcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICB9XG4gICAgb3V0ICs9ICcgIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIHBhdHRlcm4gXCInO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArIChpdC51dGlsLmVzY2FwZVF1b3Rlcygkc2NoZW1hKSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJ1wiXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9wcm9wZXJ0aWVzKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJGtleSA9ICdrZXknICsgJGx2bCxcbiAgICAkaWR4ID0gJ2lkeCcgKyAkbHZsLFxuICAgICRkYXRhTnh0ID0gJGl0LmRhdGFMZXZlbCA9IGl0LmRhdGFMZXZlbCArIDEsXG4gICAgJG5leHREYXRhID0gJ2RhdGEnICsgJGRhdGFOeHQsXG4gICAgJGRhdGFQcm9wZXJ0aWVzID0gJ2RhdGFQcm9wZXJ0aWVzJyArICRsdmw7XG4gIHZhciAkc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKCRzY2hlbWEgfHwge30pLmZpbHRlcihub3RQcm90byksXG4gICAgJHBQcm9wZXJ0aWVzID0gaXQuc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzIHx8IHt9LFxuICAgICRwUHJvcGVydHlLZXlzID0gT2JqZWN0LmtleXMoJHBQcm9wZXJ0aWVzKS5maWx0ZXIobm90UHJvdG8pLFxuICAgICRhUHJvcGVydGllcyA9IGl0LnNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICAkc29tZVByb3BlcnRpZXMgPSAkc2NoZW1hS2V5cy5sZW5ndGggfHwgJHBQcm9wZXJ0eUtleXMubGVuZ3RoLFxuICAgICRub0FkZGl0aW9uYWwgPSAkYVByb3BlcnRpZXMgPT09IGZhbHNlLFxuICAgICRhZGRpdGlvbmFsSXNTY2hlbWEgPSB0eXBlb2YgJGFQcm9wZXJ0aWVzID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRhUHJvcGVydGllcykubGVuZ3RoLFxuICAgICRyZW1vdmVBZGRpdGlvbmFsID0gaXQub3B0cy5yZW1vdmVBZGRpdGlvbmFsLFxuICAgICRjaGVja0FkZGl0aW9uYWwgPSAkbm9BZGRpdGlvbmFsIHx8ICRhZGRpdGlvbmFsSXNTY2hlbWEgfHwgJHJlbW92ZUFkZGl0aW9uYWwsXG4gICAgJG93blByb3BlcnRpZXMgPSBpdC5vcHRzLm93blByb3BlcnRpZXMsXG4gICAgJGN1cnJlbnRCYXNlSWQgPSBpdC5iYXNlSWQ7XG4gIHZhciAkcmVxdWlyZWQgPSBpdC5zY2hlbWEucmVxdWlyZWQ7XG4gIGlmICgkcmVxdWlyZWQgJiYgIShpdC5vcHRzLiRkYXRhICYmICRyZXF1aXJlZC4kZGF0YSkgJiYgJHJlcXVpcmVkLmxlbmd0aCA8IGl0Lm9wdHMubG9vcFJlcXVpcmVkKSB7XG4gICAgdmFyICRyZXF1aXJlZEhhc2ggPSBpdC51dGlsLnRvSGFzaCgkcmVxdWlyZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm90UHJvdG8ocCkge1xuICAgIHJldHVybiBwICE9PSAnX19wcm90b19fJztcbiAgfVxuICBvdXQgKz0gJ3ZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7dmFyICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsnO1xuICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyA9IHVuZGVmaW5lZDsnO1xuICB9XG4gIGlmICgkY2hlY2tBZGRpdGlvbmFsKSB7XG4gICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnID0gJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyB8fCBPYmplY3Qua2V5cygnICsgKCRkYXRhKSArICcpOyBmb3IgKHZhciAnICsgKCRpZHgpICsgJz0wOyAnICsgKCRpZHgpICsgJzwnICsgKCRkYXRhUHJvcGVydGllcykgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyB2YXIgJyArICgka2V5KSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnWycgKyAoJGlkeCkgKyAnXTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgZm9yICh2YXIgJyArICgka2V5KSArICcgaW4gJyArICgkZGF0YSkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkc29tZVByb3BlcnRpZXMpIHtcbiAgICAgIG91dCArPSAnIHZhciBpc0FkZGl0aW9uYWwnICsgKCRsdmwpICsgJyA9ICEoZmFsc2UgJztcbiAgICAgIGlmICgkc2NoZW1hS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCRzY2hlbWFLZXlzLmxlbmd0aCA+IDgpIHtcbiAgICAgICAgICBvdXQgKz0gJyB8fCB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcuaGFzT3duUHJvcGVydHkoJyArICgka2V5KSArICcpICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFycjEgPSAkc2NoZW1hS2V5cztcbiAgICAgICAgICBpZiAoYXJyMSkge1xuICAgICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTEgPSAtMSxcbiAgICAgICAgICAgICAgbDEgPSBhcnIxLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB3aGlsZSAoaTEgPCBsMSkge1xuICAgICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIxW2kxICs9IDFdO1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnICsgKCRrZXkpICsgJyA9PSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHByb3BlcnR5S2V5KSkgKyAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoJHBQcm9wZXJ0eUtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnIyID0gJHBQcm9wZXJ0eUtleXM7XG4gICAgICAgIGlmIChhcnIyKSB7XG4gICAgICAgICAgdmFyICRwUHJvcGVydHksICRpID0gLTEsXG4gICAgICAgICAgICBsMiA9IGFycjIubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMikge1xuICAgICAgICAgICAgJHBQcm9wZXJ0eSA9IGFycjJbJGkgKz0gMV07XG4gICAgICAgICAgICBvdXQgKz0gJyB8fCAnICsgKGl0LnVzZVBhdHRlcm4oJHBQcm9wZXJ0eSkpICsgJy50ZXN0KCcgKyAoJGtleSkgKyAnKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9ICcgKTsgaWYgKGlzQWRkaXRpb25hbCcgKyAoJGx2bCkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkcmVtb3ZlQWRkaXRpb25hbCA9PSAnYWxsJykge1xuICAgICAgb3V0ICs9ICcgZGVsZXRlICcgKyAoJGRhdGEpICsgJ1snICsgKCRrZXkpICsgJ107ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciAkY3VycmVudEVycm9yUGF0aCA9IGl0LmVycm9yUGF0aDtcbiAgICAgIHZhciAkYWRkaXRpb25hbFByb3BlcnR5ID0gJ1xcJyArICcgKyAka2V5ICsgJyArIFxcJyc7XG4gICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgIGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICB9XG4gICAgICBpZiAoJG5vQWRkaXRpb25hbCkge1xuICAgICAgICBpZiAoJHJlbW92ZUFkZGl0aW9uYWwpIHtcbiAgICAgICAgICBvdXQgKz0gJyBkZWxldGUgJyArICgkZGF0YSkgKyAnWycgKyAoJGtleSkgKyAnXTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IGZhbHNlOyAnO1xuICAgICAgICAgIHZhciAkY3VyckVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aDtcbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJztcbiAgICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnYWRkaXRpb25hbFByb3BlcnRpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGFkZGl0aW9uYWxQcm9wZXJ0eTogXFwnJyArICgkYWRkaXRpb25hbFByb3BlcnR5KSArICdcXCcgfSAnO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnaXMgYW4gaW52YWxpZCBhZGRpdGlvbmFsIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJ3Nob3VsZCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiBmYWxzZSAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9ICRjdXJyRXJyU2NoZW1hUGF0aDtcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgYnJlYWs7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCRhZGRpdGlvbmFsSXNTY2hlbWEpIHtcbiAgICAgICAgaWYgKCRyZW1vdmVBZGRpdGlvbmFsID09ICdmYWlsaW5nJykge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7ICAnO1xuICAgICAgICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICAgICAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgICAgICAgICRpdC5zY2hlbWEgPSAkYVByb3BlcnRpZXM7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA/IGl0LmVycm9yUGF0aCA6IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIHsgZXJyb3JzID0gJyArICgkZXJycykgKyAnOyBpZiAodmFsaWRhdGUuZXJyb3JzICE9PSBudWxsKSB7IGlmIChlcnJvcnMpIHZhbGlkYXRlLmVycm9ycy5sZW5ndGggPSBlcnJvcnM7IGVsc2UgdmFsaWRhdGUuZXJyb3JzID0gbnVsbDsgfSBkZWxldGUgJyArICgkZGF0YSkgKyAnWycgKyAoJGtleSkgKyAnXTsgfSAgJztcbiAgICAgICAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRpdC5zY2hlbWEgPSAkYVByb3BlcnRpZXM7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA/IGl0LmVycm9yUGF0aCA6IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSBicmVhazsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGl0LmVycm9yUGF0aCA9ICRjdXJyZW50RXJyb3JQYXRoO1xuICAgIH1cbiAgICBpZiAoJHNvbWVQcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnO1xuICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgIH1cbiAgfVxuICB2YXIgJHVzZURlZmF1bHRzID0gaXQub3B0cy51c2VEZWZhdWx0cyAmJiAhaXQuY29tcG9zaXRlUnVsZTtcbiAgaWYgKCRzY2hlbWFLZXlzLmxlbmd0aCkge1xuICAgIHZhciBhcnIzID0gJHNjaGVtYUtleXM7XG4gICAgaWYgKGFycjMpIHtcbiAgICAgIHZhciAkcHJvcGVydHlLZXksIGkzID0gLTEsXG4gICAgICAgIGwzID0gYXJyMy5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkzIDwgbDMpIHtcbiAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyM1tpMyArPSAxXTtcbiAgICAgICAgdmFyICRzY2ggPSAkc2NoZW1hWyRwcm9wZXJ0eUtleV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICB2YXIgJHByb3AgPSBpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eUtleSksXG4gICAgICAgICAgICAkcGFzc0RhdGEgPSAkZGF0YSArICRwcm9wLFxuICAgICAgICAgICAgJGhhc0RlZmF1bHQgPSAkdXNlRGVmYXVsdHMgJiYgJHNjaC5kZWZhdWx0ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICRwcm9wO1xuICAgICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyBpdC51dGlsLmVzY2FwZUZyYWdtZW50KCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aChpdC5lcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSBpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICAgICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgICAgICAgICRjb2RlID0gaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSk7XG4gICAgICAgICAgICB2YXIgJHVzZURhdGEgPSAkcGFzc0RhdGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciAkdXNlRGF0YSA9ICRuZXh0RGF0YTtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRoYXNEZWZhdWx0KSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCRyZXF1aXJlZEhhc2ggJiYgJHJlcXVpcmVkSGFzaFskcHJvcGVydHlLZXldKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGlmICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJykgeyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IGZhbHNlOyAnO1xuICAgICAgICAgICAgICB2YXIgJGN1cnJlbnRFcnJvclBhdGggPSBpdC5lcnJvclBhdGgsXG4gICAgICAgICAgICAgICAgJGN1cnJFcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGgsXG4gICAgICAgICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9IGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvcmVxdWlyZWQnO1xuICAgICAgICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gJGN1cnJFcnJTY2hlbWFQYXRoO1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgfSBlbHNlIHsgJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcpIHsgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyB9IGVsc2UgeyAnO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCR1c2VEYXRhKSArICcgIT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJiYgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgKSB7ICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGNvZGUpICsgJyB9ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkcFByb3BlcnR5S2V5cy5sZW5ndGgpIHtcbiAgICB2YXIgYXJyNCA9ICRwUHJvcGVydHlLZXlzO1xuICAgIGlmIChhcnI0KSB7XG4gICAgICB2YXIgJHBQcm9wZXJ0eSwgaTQgPSAtMSxcbiAgICAgICAgbDQgPSBhcnI0Lmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoaTQgPCBsNCkge1xuICAgICAgICAkcFByb3BlcnR5ID0gYXJyNFtpNCArPSAxXTtcbiAgICAgICAgdmFyICRzY2ggPSAkcFByb3BlcnRpZXNbJHBQcm9wZXJ0eV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgICAkaXQuc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLnBhdHRlcm5Qcm9wZXJ0aWVzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHBQcm9wZXJ0eSk7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9wYXR0ZXJuUHJvcGVydGllcy8nICsgaXQudXRpbC5lc2NhcGVGcmFnbWVudCgkcFByb3BlcnR5KTtcbiAgICAgICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnIHx8IE9iamVjdC5rZXlzKCcgKyAoJGRhdGEpICsgJyk7IGZvciAodmFyICcgKyAoJGlkeCkgKyAnPTA7ICcgKyAoJGlkeCkgKyAnPCcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcubGVuZ3RoOyAnICsgKCRpZHgpICsgJysrKSB7IHZhciAnICsgKCRrZXkpICsgJyA9ICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICdbJyArICgkaWR4KSArICddOyAnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBmb3IgKHZhciAnICsgKCRrZXkpICsgJyBpbiAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoaXQudXNlUGF0dGVybigkcFByb3BlcnR5KSkgKyAnLnRlc3QoJyArICgka2V5KSArICcpKSB7ICc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSBicmVhazsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBlbHNlICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfcHJvcGVydHlOYW1lcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICB2YXIgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzOyc7XG4gIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaGVtYSA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoZW1hKS5sZW5ndGggPiAwKSB8fCAkc2NoZW1hID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaGVtYSwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgdmFyICRrZXkgPSAna2V5JyArICRsdmwsXG4gICAgICAkaWR4ID0gJ2lkeCcgKyAkbHZsLFxuICAgICAgJGkgPSAnaScgKyAkbHZsLFxuICAgICAgJGludmFsaWROYW1lID0gJ1xcJyArICcgKyAka2V5ICsgJyArIFxcJycsXG4gICAgICAkZGF0YU54dCA9ICRpdC5kYXRhTGV2ZWwgPSBpdC5kYXRhTGV2ZWwgKyAxLFxuICAgICAgJG5leHREYXRhID0gJ2RhdGEnICsgJGRhdGFOeHQsXG4gICAgICAkZGF0YVByb3BlcnRpZXMgPSAnZGF0YVByb3BlcnRpZXMnICsgJGx2bCxcbiAgICAgICRvd25Qcm9wZXJ0aWVzID0gaXQub3B0cy5vd25Qcm9wZXJ0aWVzLFxuICAgICAgJGN1cnJlbnRCYXNlSWQgPSBpdC5iYXNlSWQ7XG4gICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyB2YXIgJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyA9IHVuZGVmaW5lZDsgJztcbiAgICB9XG4gICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnID0gJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyB8fCBPYmplY3Qua2V5cygnICsgKCRkYXRhKSArICcpOyBmb3IgKHZhciAnICsgKCRpZHgpICsgJz0wOyAnICsgKCRpZHgpICsgJzwnICsgKCRkYXRhUHJvcGVydGllcykgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyB2YXIgJyArICgka2V5KSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnWycgKyAoJGlkeCkgKyAnXTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgZm9yICh2YXIgJyArICgka2V5KSArICcgaW4gJyArICgkZGF0YSkgKyAnKSB7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIHZhciBzdGFydEVycnMnICsgKCRsdmwpICsgJyA9IGVycm9yczsgJztcbiAgICB2YXIgJHBhc3NEYXRhID0gJGtleTtcbiAgICB2YXIgJHdhc0NvbXBvc2l0ZSA9IGl0LmNvbXBvc2l0ZVJ1bGU7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gdHJ1ZTtcbiAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgfVxuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgeyBmb3IgKHZhciAnICsgKCRpKSArICc9c3RhcnRFcnJzJyArICgkbHZsKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZFcnJvcnNbJyArICgkaSkgKyAnXS5wcm9wZXJ0eU5hbWUgPSAnICsgKCRrZXkpICsgJzsgfSAgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgncHJvcGVydHlOYW1lcycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcHJvcGVydHlOYW1lOiBcXCcnICsgKCRpbnZhbGlkTmFtZSkgKyAnXFwnIH0gJztcbiAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Byb3BlcnR5IG5hbWUgXFxcXFxcJycgKyAoJGludmFsaWROYW1lKSArICdcXFxcXFwnIGlzIGludmFsaWRcXCcgJztcbiAgICAgIH1cbiAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2RXJyb3JzKTsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGJyZWFrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9IH0nO1xuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfcmVxdWlyZWQoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICR2U2NoZW1hID0gJ3NjaGVtYScgKyAkbHZsO1xuICBpZiAoISRpc0RhdGEpIHtcbiAgICBpZiAoJHNjaGVtYS5sZW5ndGggPCBpdC5vcHRzLmxvb3BSZXF1aXJlZCAmJiBpdC5zY2hlbWEucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyhpdC5zY2hlbWEucHJvcGVydGllcykubGVuZ3RoKSB7XG4gICAgICB2YXIgJHJlcXVpcmVkID0gW107XG4gICAgICB2YXIgYXJyMSA9ICRzY2hlbWE7XG4gICAgICBpZiAoYXJyMSkge1xuICAgICAgICB2YXIgJHByb3BlcnR5LCBpMSA9IC0xLFxuICAgICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoaTEgPCBsMSkge1xuICAgICAgICAgICRwcm9wZXJ0eSA9IGFycjFbaTEgKz0gMV07XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eVNjaCA9IGl0LnNjaGVtYS5wcm9wZXJ0aWVzWyRwcm9wZXJ0eV07XG4gICAgICAgICAgaWYgKCEoJHByb3BlcnR5U2NoICYmIChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkcHJvcGVydHlTY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHByb3BlcnR5U2NoKS5sZW5ndGggPiAwKSB8fCAkcHJvcGVydHlTY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkcHJvcGVydHlTY2gsIGl0LlJVTEVTLmFsbCkpKSkge1xuICAgICAgICAgICAgJHJlcXVpcmVkWyRyZXF1aXJlZC5sZW5ndGhdID0gJHByb3BlcnR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgJHJlcXVpcmVkID0gJHNjaGVtYTtcbiAgICB9XG4gIH1cbiAgaWYgKCRpc0RhdGEgfHwgJHJlcXVpcmVkLmxlbmd0aCkge1xuICAgIHZhciAkY3VycmVudEVycm9yUGF0aCA9IGl0LmVycm9yUGF0aCxcbiAgICAgICRsb29wUmVxdWlyZWQgPSAkaXNEYXRhIHx8ICRyZXF1aXJlZC5sZW5ndGggPj0gaXQub3B0cy5sb29wUmVxdWlyZWQsXG4gICAgICAkb3duUHJvcGVydGllcyA9IGl0Lm9wdHMub3duUHJvcGVydGllcztcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgdmFyIG1pc3NpbmcnICsgKCRsdmwpICsgJzsgJztcbiAgICAgIGlmICgkbG9vcFJlcXVpcmVkKSB7XG4gICAgICAgIGlmICghJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2U2NoZW1hKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICRpID0gJ2knICsgJGx2bCxcbiAgICAgICAgICAkcHJvcGVydHlQYXRoID0gJ3NjaGVtYScgKyAkbHZsICsgJ1snICsgJGkgKyAnXScsXG4gICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9ICdcXCcgKyAnICsgJHByb3BlcnR5UGF0aCArICcgKyBcXCcnO1xuICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyBpZiAoc2NoZW1hJyArICgkbHZsKSArICcgPT09IHVuZGVmaW5lZCkgJyArICgkdmFsaWQpICsgJyA9IHRydWU7IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYScgKyAoJGx2bCkgKyAnKSkgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyBlbHNlIHsnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGZvciAodmFyICcgKyAoJGkpICsgJyA9IDA7ICcgKyAoJGkpICsgJyA8ICcgKyAoJHZTY2hlbWEpICsgJy5sZW5ndGg7ICcgKyAoJGkpICsgJysrKSB7ICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRkYXRhKSArICdbJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ11dICE9PSB1bmRlZmluZWQgJztcbiAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgb3V0ICs9ICcgJiYgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCAnICsgKCR2U2NoZW1hKSArICdbJyArICgkaSkgKyAnXSkgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJzsgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSBicmVhazsgfSAnO1xuICAgICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnICB9ICAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnICBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIH0gZWxzZSB7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyBpZiAoICc7XG4gICAgICAgIHZhciBhcnIyID0gJHJlcXVpcmVkO1xuICAgICAgICBpZiAoYXJyMikge1xuICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksICRpID0gLTEsXG4gICAgICAgICAgICBsMiA9IGFycjIubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMikge1xuICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyMlskaSArPSAxXTtcbiAgICAgICAgICAgIGlmICgkaSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkdXNlRGF0YSA9ICRkYXRhICsgJHByb3A7XG4gICAgICAgICAgICBvdXQgKz0gJyAoICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcpICYmIChtaXNzaW5nJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoaXQub3B0cy5qc29uUG9pbnRlcnMgPyAkcHJvcGVydHlLZXkgOiAkcHJvcCkpICsgJykgKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykgeyAgJztcbiAgICAgICAgdmFyICRwcm9wZXJ0eVBhdGggPSAnbWlzc2luZycgKyAkbHZsLFxuICAgICAgICAgICRtaXNzaW5nUHJvcGVydHkgPSAnXFwnICsgJyArICRwcm9wZXJ0eVBhdGggKyAnICsgXFwnJztcbiAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgIGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuanNvblBvaW50ZXJzID8gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgdHJ1ZSkgOiAkY3VycmVudEVycm9yUGF0aCArICcgKyAnICsgJHByb3BlcnR5UGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIH0gZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkbG9vcFJlcXVpcmVkKSB7XG4gICAgICAgIGlmICghJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2U2NoZW1hKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICRpID0gJ2knICsgJGx2bCxcbiAgICAgICAgICAkcHJvcGVydHlQYXRoID0gJ3NjaGVtYScgKyAkbHZsICsgJ1snICsgJGkgKyAnXScsXG4gICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9ICdcXCcgKyAnICsgJHByb3BlcnR5UGF0aCArICcgKyBcXCcnO1xuICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJHZTY2hlbWEpICsgJyAmJiAhQXJyYXkuaXNBcnJheSgnICsgKCR2U2NoZW1hKSArICcpKSB7ICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJ2lzIGEgcmVxdWlyZWQgcHJvcGVydHknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSBlbHNlIGlmICgnICsgKCR2U2NoZW1hKSArICcgIT09IHVuZGVmaW5lZCkgeyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGZvciAodmFyICcgKyAoJGkpICsgJyA9IDA7ICcgKyAoJGkpICsgJyA8ICcgKyAoJHZTY2hlbWEpICsgJy5sZW5ndGg7ICcgKyAoJGkpICsgJysrKSB7IGlmICgnICsgKCRkYXRhKSArICdbJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ11dID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCAnICsgKCR2U2NoZW1hKSArICdbJyArICgkaSkgKyAnXSkgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyB9IH0gJztcbiAgICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyAgfSAgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFycjMgPSAkcmVxdWlyZWQ7XG4gICAgICAgIGlmIChhcnIzKSB7XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTMgPSAtMSxcbiAgICAgICAgICAgIGwzID0gYXJyMy5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlIChpMyA8IGwzKSB7XG4gICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIzW2kzICs9IDFdO1xuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICAgJHVzZURhdGEgPSAkZGF0YSArICRwcm9wO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICEgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHlLZXkpKSArICdcXCcpICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgncmVxdWlyZWQnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IG1pc3NpbmdQcm9wZXJ0eTogXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXCcgfSAnO1xuICAgICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdzaG91bGQgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSBcXFxcXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXFxcXFwnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgfSBlbHNlIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgaWYgKHRydWUpIHsnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV91bmlxdWVJdGVtcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoKCRzY2hlbWEgfHwgJGlzRGF0YSkgJiYgaXQub3B0cy51bmlxdWVJdGVtcyAhPT0gZmFsc2UpIHtcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHZhbGlkKSArICc7IGlmICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSBmYWxzZSB8fCAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSB1bmRlZmluZWQpICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyBlbHNlIGlmICh0eXBlb2YgJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPSBcXCdib29sZWFuXFwnKSAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7IGVsc2UgeyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB2YXIgaSA9ICcgKyAoJGRhdGEpICsgJy5sZW5ndGggLCAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZSAsIGo7IGlmIChpID4gMSkgeyAnO1xuICAgIHZhciAkaXRlbVR5cGUgPSBpdC5zY2hlbWEuaXRlbXMgJiYgaXQuc2NoZW1hLml0ZW1zLnR5cGUsXG4gICAgICAkdHlwZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCRpdGVtVHlwZSk7XG4gICAgaWYgKCEkaXRlbVR5cGUgfHwgJGl0ZW1UeXBlID09ICdvYmplY3QnIHx8ICRpdGVtVHlwZSA9PSAnYXJyYXknIHx8ICgkdHlwZUlzQXJyYXkgJiYgKCRpdGVtVHlwZS5pbmRleE9mKCdvYmplY3QnKSA+PSAwIHx8ICRpdGVtVHlwZS5pbmRleE9mKCdhcnJheScpID49IDApKSkge1xuICAgICAgb3V0ICs9ICcgb3V0ZXI6IGZvciAoO2ktLTspIHsgZm9yIChqID0gaTsgai0tOykgeyBpZiAoZXF1YWwoJyArICgkZGF0YSkgKyAnW2ldLCAnICsgKCRkYXRhKSArICdbal0pKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgYnJlYWsgb3V0ZXI7IH0gfSB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciBpdGVtSW5kaWNlcyA9IHt9LCBpdGVtOyBmb3IgKDtpLS07KSB7IHZhciBpdGVtID0gJyArICgkZGF0YSkgKyAnW2ldOyAnO1xuICAgICAgdmFyICRtZXRob2QgPSAnY2hlY2tEYXRhVHlwZScgKyAoJHR5cGVJc0FycmF5ID8gJ3MnIDogJycpO1xuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoaXQudXRpbFskbWV0aG9kXSgkaXRlbVR5cGUsICdpdGVtJywgaXQub3B0cy5zdHJpY3ROdW1iZXJzLCB0cnVlKSkgKyAnKSBjb250aW51ZTsgJztcbiAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKHR5cGVvZiBpdGVtID09IFxcJ3N0cmluZ1xcJykgaXRlbSA9IFxcJ1wiXFwnICsgaXRlbTsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGlmICh0eXBlb2YgaXRlbUluZGljZXNbaXRlbV0gPT0gXFwnbnVtYmVyXFwnKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgaiA9IGl0ZW1JbmRpY2VzW2l0ZW1dOyBicmVhazsgfSBpdGVtSW5kaWNlc1tpdGVtXSA9IGk7IH0gJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICBvdXQgKz0gJyAgfSAgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSB7ICAgJztcbiAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgndW5pcXVlSXRlbXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGk6IGksIGo6IGogfSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBoYXZlIGR1cGxpY2F0ZSBpdGVtcyAoaXRlbXMgIyMgXFwnICsgaiArIFxcJyBhbmQgXFwnICsgaSArIFxcJyBhcmUgaWRlbnRpY2FsKVxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogICc7XG4gICAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgICAgICAgICAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgdmFyIF9fZXJyID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8vYWxsIHJlcXVpcmVzIG11c3QgYmUgZXhwbGljaXQgYmVjYXVzZSBicm93c2VyaWZ5IHdvbid0IHdvcmsgd2l0aCBkeW5hbWljIHJlcXVpcmVzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgJyRyZWYnOiByZXF1aXJlKCcuL3JlZicpLFxuICBhbGxPZjogcmVxdWlyZSgnLi9hbGxPZicpLFxuICBhbnlPZjogcmVxdWlyZSgnLi9hbnlPZicpLFxuICAnJGNvbW1lbnQnOiByZXF1aXJlKCcuL2NvbW1lbnQnKSxcbiAgY29uc3Q6IHJlcXVpcmUoJy4vY29uc3QnKSxcbiAgY29udGFpbnM6IHJlcXVpcmUoJy4vY29udGFpbnMnKSxcbiAgZGVwZW5kZW5jaWVzOiByZXF1aXJlKCcuL2RlcGVuZGVuY2llcycpLFxuICAnZW51bSc6IHJlcXVpcmUoJy4vZW51bScpLFxuICBmb3JtYXQ6IHJlcXVpcmUoJy4vZm9ybWF0JyksXG4gICdpZic6IHJlcXVpcmUoJy4vaWYnKSxcbiAgaXRlbXM6IHJlcXVpcmUoJy4vaXRlbXMnKSxcbiAgbWF4aW11bTogcmVxdWlyZSgnLi9fbGltaXQnKSxcbiAgbWluaW11bTogcmVxdWlyZSgnLi9fbGltaXQnKSxcbiAgbWF4SXRlbXM6IHJlcXVpcmUoJy4vX2xpbWl0SXRlbXMnKSxcbiAgbWluSXRlbXM6IHJlcXVpcmUoJy4vX2xpbWl0SXRlbXMnKSxcbiAgbWF4TGVuZ3RoOiByZXF1aXJlKCcuL19saW1pdExlbmd0aCcpLFxuICBtaW5MZW5ndGg6IHJlcXVpcmUoJy4vX2xpbWl0TGVuZ3RoJyksXG4gIG1heFByb3BlcnRpZXM6IHJlcXVpcmUoJy4vX2xpbWl0UHJvcGVydGllcycpLFxuICBtaW5Qcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19saW1pdFByb3BlcnRpZXMnKSxcbiAgbXVsdGlwbGVPZjogcmVxdWlyZSgnLi9tdWx0aXBsZU9mJyksXG4gIG5vdDogcmVxdWlyZSgnLi9ub3QnKSxcbiAgb25lT2Y6IHJlcXVpcmUoJy4vb25lT2YnKSxcbiAgcGF0dGVybjogcmVxdWlyZSgnLi9wYXR0ZXJuJyksXG4gIHByb3BlcnRpZXM6IHJlcXVpcmUoJy4vcHJvcGVydGllcycpLFxuICBwcm9wZXJ0eU5hbWVzOiByZXF1aXJlKCcuL3Byb3BlcnR5TmFtZXMnKSxcbiAgcmVxdWlyZWQ6IHJlcXVpcmUoJy4vcmVxdWlyZWQnKSxcbiAgdW5pcXVlSXRlbXM6IHJlcXVpcmUoJy4vdW5pcXVlSXRlbXMnKSxcbiAgdmFsaWRhdGU6IHJlcXVpcmUoJy4vdmFsaWRhdGUnKVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBydWxlTW9kdWxlcyA9IHJlcXVpcmUoJy4uL2RvdGpzJylcbiAgLCB0b0hhc2ggPSByZXF1aXJlKCcuL3V0aWwnKS50b0hhc2g7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcnVsZXMoKSB7XG4gIHZhciBSVUxFUyA9IFtcbiAgICB7IHR5cGU6ICdudW1iZXInLFxuICAgICAgcnVsZXM6IFsgeyAnbWF4aW11bSc6IFsnZXhjbHVzaXZlTWF4aW11bSddIH0sXG4gICAgICAgICAgICAgICB7ICdtaW5pbXVtJzogWydleGNsdXNpdmVNaW5pbXVtJ10gfSwgJ211bHRpcGxlT2YnLCAnZm9ybWF0J10gfSxcbiAgICB7IHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcnVsZXM6IFsgJ21heExlbmd0aCcsICdtaW5MZW5ndGgnLCAncGF0dGVybicsICdmb3JtYXQnIF0gfSxcbiAgICB7IHR5cGU6ICdhcnJheScsXG4gICAgICBydWxlczogWyAnbWF4SXRlbXMnLCAnbWluSXRlbXMnLCAnaXRlbXMnLCAnY29udGFpbnMnLCAndW5pcXVlSXRlbXMnIF0gfSxcbiAgICB7IHR5cGU6ICdvYmplY3QnLFxuICAgICAgcnVsZXM6IFsgJ21heFByb3BlcnRpZXMnLCAnbWluUHJvcGVydGllcycsICdyZXF1aXJlZCcsICdkZXBlbmRlbmNpZXMnLCAncHJvcGVydHlOYW1lcycsXG4gICAgICAgICAgICAgICB7ICdwcm9wZXJ0aWVzJzogWydhZGRpdGlvbmFsUHJvcGVydGllcycsICdwYXR0ZXJuUHJvcGVydGllcyddIH0gXSB9LFxuICAgIHsgcnVsZXM6IFsgJyRyZWYnLCAnY29uc3QnLCAnZW51bScsICdub3QnLCAnYW55T2YnLCAnb25lT2YnLCAnYWxsT2YnLCAnaWYnIF0gfVxuICBdO1xuXG4gIHZhciBBTEwgPSBbICd0eXBlJywgJyRjb21tZW50JyBdO1xuICB2YXIgS0VZV09SRFMgPSBbXG4gICAgJyRzY2hlbWEnLCAnJGlkJywgJ2lkJywgJyRkYXRhJywgJyRhc3luYycsICd0aXRsZScsXG4gICAgJ2Rlc2NyaXB0aW9uJywgJ2RlZmF1bHQnLCAnZGVmaW5pdGlvbnMnLFxuICAgICdleGFtcGxlcycsICdyZWFkT25seScsICd3cml0ZU9ubHknLFxuICAgICdjb250ZW50TWVkaWFUeXBlJywgJ2NvbnRlbnRFbmNvZGluZycsXG4gICAgJ2FkZGl0aW9uYWxJdGVtcycsICd0aGVuJywgJ2Vsc2UnXG4gIF07XG4gIHZhciBUWVBFUyA9IFsgJ251bWJlcicsICdpbnRlZ2VyJywgJ3N0cmluZycsICdhcnJheScsICdvYmplY3QnLCAnYm9vbGVhbicsICdudWxsJyBdO1xuICBSVUxFUy5hbGwgPSB0b0hhc2goQUxMKTtcbiAgUlVMRVMudHlwZXMgPSB0b0hhc2goVFlQRVMpO1xuXG4gIFJVTEVTLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7XG4gICAgZ3JvdXAucnVsZXMgPSBncm91cC5ydWxlcy5tYXAoZnVuY3Rpb24gKGtleXdvcmQpIHtcbiAgICAgIHZhciBpbXBsS2V5d29yZHM7XG4gICAgICBpZiAodHlwZW9mIGtleXdvcmQgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIGtleSA9IE9iamVjdC5rZXlzKGtleXdvcmQpWzBdO1xuICAgICAgICBpbXBsS2V5d29yZHMgPSBrZXl3b3JkW2tleV07XG4gICAgICAgIGtleXdvcmQgPSBrZXk7XG4gICAgICAgIGltcGxLZXl3b3Jkcy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgQUxMLnB1c2goayk7XG4gICAgICAgICAgUlVMRVMuYWxsW2tdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBBTEwucHVzaChrZXl3b3JkKTtcbiAgICAgIHZhciBydWxlID0gUlVMRVMuYWxsW2tleXdvcmRdID0ge1xuICAgICAgICBrZXl3b3JkOiBrZXl3b3JkLFxuICAgICAgICBjb2RlOiBydWxlTW9kdWxlc1trZXl3b3JkXSxcbiAgICAgICAgaW1wbGVtZW50czogaW1wbEtleXdvcmRzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgfSk7XG5cbiAgICBSVUxFUy5hbGwuJGNvbW1lbnQgPSB7XG4gICAgICBrZXl3b3JkOiAnJGNvbW1lbnQnLFxuICAgICAgY29kZTogcnVsZU1vZHVsZXMuJGNvbW1lbnRcbiAgICB9O1xuXG4gICAgaWYgKGdyb3VwLnR5cGUpIFJVTEVTLnR5cGVzW2dyb3VwLnR5cGVdID0gZ3JvdXA7XG4gIH0pO1xuXG4gIFJVTEVTLmtleXdvcmRzID0gdG9IYXNoKEFMTC5jb25jYXQoS0VZV09SRFMpKTtcbiAgUlVMRVMuY3VzdG9tID0ge307XG5cbiAgcmV0dXJuIFJVTEVTO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBLRVlXT1JEUyA9IFtcbiAgJ211bHRpcGxlT2YnLFxuICAnbWF4aW11bScsXG4gICdleGNsdXNpdmVNYXhpbXVtJyxcbiAgJ21pbmltdW0nLFxuICAnZXhjbHVzaXZlTWluaW11bScsXG4gICdtYXhMZW5ndGgnLFxuICAnbWluTGVuZ3RoJyxcbiAgJ3BhdHRlcm4nLFxuICAnYWRkaXRpb25hbEl0ZW1zJyxcbiAgJ21heEl0ZW1zJyxcbiAgJ21pbkl0ZW1zJyxcbiAgJ3VuaXF1ZUl0ZW1zJyxcbiAgJ21heFByb3BlcnRpZXMnLFxuICAnbWluUHJvcGVydGllcycsXG4gICdyZXF1aXJlZCcsXG4gICdhZGRpdGlvbmFsUHJvcGVydGllcycsXG4gICdlbnVtJyxcbiAgJ2Zvcm1hdCcsXG4gICdjb25zdCdcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGFTY2hlbWEsIGtleXdvcmRzSnNvblBvaW50ZXJzKSB7XG4gIGZvciAodmFyIGk9MDsgaTxrZXl3b3Jkc0pzb25Qb2ludGVycy5sZW5ndGg7IGkrKykge1xuICAgIG1ldGFTY2hlbWEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG1ldGFTY2hlbWEpKTtcbiAgICB2YXIgc2VnbWVudHMgPSBrZXl3b3Jkc0pzb25Qb2ludGVyc1tpXS5zcGxpdCgnLycpO1xuICAgIHZhciBrZXl3b3JkcyA9IG1ldGFTY2hlbWE7XG4gICAgdmFyIGo7XG4gICAgZm9yIChqPTE7IGo8c2VnbWVudHMubGVuZ3RoOyBqKyspXG4gICAgICBrZXl3b3JkcyA9IGtleXdvcmRzW3NlZ21lbnRzW2pdXTtcblxuICAgIGZvciAoaj0wOyBqPEtFWVdPUkRTLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIga2V5ID0gS0VZV09SRFNbal07XG4gICAgICB2YXIgc2NoZW1hID0ga2V5d29yZHNba2V5XTtcbiAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAga2V5d29yZHNba2V5XSA9IHtcbiAgICAgICAgICBhbnlPZjogW1xuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgeyAkcmVmOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXRhU2NoZW1hO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBNaXNzaW5nUmVmRXJyb3IgPSByZXF1aXJlKCcuL2Vycm9yX2NsYXNzZXMnKS5NaXNzaW5nUmVmO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGVBc3luYztcblxuXG4vKipcbiAqIENyZWF0ZXMgdmFsaWRhdGluZyBmdW5jdGlvbiBmb3IgcGFzc2VkIHNjaGVtYSB3aXRoIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIG1pc3Npbmcgc2NoZW1hcy5cbiAqIGBsb2FkU2NoZW1hYCBvcHRpb24gc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHNjaGVtYSB1cmkgYW5kIHJldHVybnMgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNjaGVtYS5cbiAqIEB0aGlzICBBanZcbiAqIEBwYXJhbSB7T2JqZWN0fSAgIHNjaGVtYSBzY2hlbWEgb2JqZWN0XG4gKiBAcGFyYW0ge0Jvb2xlYW59ICBtZXRhIG9wdGlvbmFsIHRydWUgdG8gY29tcGlsZSBtZXRhLXNjaGVtYTsgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNraXBwZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGFuIG9wdGlvbmFsIG5vZGUtc3R5bGUgY2FsbGJhY2ssIGl0IGlzIGNhbGxlZCB3aXRoIDIgcGFyYW1ldGVyczogZXJyb3IgKG9yIG51bGwpIGFuZCB2YWxpZGF0aW5nIGZ1bmN0aW9uLlxuICogQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSB2YWxpZGF0aW5nIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjb21waWxlQXN5bmMoc2NoZW1hLCBtZXRhLCBjYWxsYmFjaykge1xuICAvKiBlc2xpbnQgbm8tc2hhZG93OiAwICovXG4gIC8qIGdsb2JhbCBQcm9taXNlICovXG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodHlwZW9mIHRoaXMuX29wdHMubG9hZFNjaGVtYSAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5sb2FkU2NoZW1hIHNob3VsZCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKHR5cGVvZiBtZXRhID09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG1ldGE7XG4gICAgbWV0YSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBwID0gbG9hZE1ldGFTY2hlbWFPZihzY2hlbWEpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzY2hlbWFPYmogPSBzZWxmLl9hZGRTY2hlbWEoc2NoZW1hLCB1bmRlZmluZWQsIG1ldGEpO1xuICAgIHJldHVybiBzY2hlbWFPYmoudmFsaWRhdGUgfHwgX2NvbXBpbGVBc3luYyhzY2hlbWFPYmopO1xuICB9KTtcblxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBwLnRoZW4oXG4gICAgICBmdW5jdGlvbih2KSB7IGNhbGxiYWNrKG51bGwsIHYpOyB9LFxuICAgICAgY2FsbGJhY2tcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHA7XG5cblxuICBmdW5jdGlvbiBsb2FkTWV0YVNjaGVtYU9mKHNjaCkge1xuICAgIHZhciAkc2NoZW1hID0gc2NoLiRzY2hlbWE7XG4gICAgcmV0dXJuICRzY2hlbWEgJiYgIXNlbGYuZ2V0U2NoZW1hKCRzY2hlbWEpXG4gICAgICAgICAgICA/IGNvbXBpbGVBc3luYy5jYWxsKHNlbGYsIHsgJHJlZjogJHNjaGVtYSB9LCB0cnVlKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gX2NvbXBpbGVBc3luYyhzY2hlbWFPYmopIHtcbiAgICB0cnkgeyByZXR1cm4gc2VsZi5fY29tcGlsZShzY2hlbWFPYmopOyB9XG4gICAgY2F0Y2goZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nUmVmRXJyb3IpIHJldHVybiBsb2FkTWlzc2luZ1NjaGVtYShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBsb2FkTWlzc2luZ1NjaGVtYShlKSB7XG4gICAgICB2YXIgcmVmID0gZS5taXNzaW5nU2NoZW1hO1xuICAgICAgaWYgKGFkZGVkKHJlZikpIHRocm93IG5ldyBFcnJvcignU2NoZW1hICcgKyByZWYgKyAnIGlzIGxvYWRlZCBidXQgJyArIGUubWlzc2luZ1JlZiArICcgY2Fubm90IGJlIHJlc29sdmVkJyk7XG5cbiAgICAgIHZhciBzY2hlbWFQcm9taXNlID0gc2VsZi5fbG9hZGluZ1NjaGVtYXNbcmVmXTtcbiAgICAgIGlmICghc2NoZW1hUHJvbWlzZSkge1xuICAgICAgICBzY2hlbWFQcm9taXNlID0gc2VsZi5fbG9hZGluZ1NjaGVtYXNbcmVmXSA9IHNlbGYuX29wdHMubG9hZFNjaGVtYShyZWYpO1xuICAgICAgICBzY2hlbWFQcm9taXNlLnRoZW4ocmVtb3ZlUHJvbWlzZSwgcmVtb3ZlUHJvbWlzZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWFQcm9taXNlLnRoZW4oZnVuY3Rpb24gKHNjaCkge1xuICAgICAgICBpZiAoIWFkZGVkKHJlZikpIHtcbiAgICAgICAgICByZXR1cm4gbG9hZE1ldGFTY2hlbWFPZihzY2gpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFhZGRlZChyZWYpKSBzZWxmLmFkZFNjaGVtYShzY2gsIHJlZiwgdW5kZWZpbmVkLCBtZXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9jb21waWxlQXN5bmMoc2NoZW1hT2JqKTtcbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiByZW1vdmVQcm9taXNlKCkge1xuICAgICAgICBkZWxldGUgc2VsZi5fbG9hZGluZ1NjaGVtYXNbcmVmXTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYWRkZWQocmVmKSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9yZWZzW3JlZl0gfHwgc2VsZi5fc2NoZW1hc1tyZWZdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY3VzdG9tKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkcnVsZSA9IHRoaXMsXG4gICAgJGRlZmluaXRpb24gPSAnZGVmaW5pdGlvbicgKyAkbHZsLFxuICAgICRyRGVmID0gJHJ1bGUuZGVmaW5pdGlvbixcbiAgICAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICB2YXIgJGNvbXBpbGUsICRpbmxpbmUsICRtYWNybywgJHJ1bGVWYWxpZGF0ZSwgJHZhbGlkYXRlQ29kZTtcbiAgaWYgKCRpc0RhdGEgJiYgJHJEZWYuJGRhdGEpIHtcbiAgICAkdmFsaWRhdGVDb2RlID0gJ2tleXdvcmRWYWxpZGF0ZScgKyAkbHZsO1xuICAgIHZhciAkdmFsaWRhdGVTY2hlbWEgPSAkckRlZi52YWxpZGF0ZVNjaGVtYTtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkZGVmaW5pdGlvbikgKyAnID0gUlVMRVMuY3VzdG9tW1xcJycgKyAoJGtleXdvcmQpICsgJ1xcJ10uZGVmaW5pdGlvbjsgdmFyICcgKyAoJHZhbGlkYXRlQ29kZSkgKyAnID0gJyArICgkZGVmaW5pdGlvbikgKyAnLnZhbGlkYXRlOyc7XG4gIH0gZWxzZSB7XG4gICAgJHJ1bGVWYWxpZGF0ZSA9IGl0LnVzZUN1c3RvbVJ1bGUoJHJ1bGUsICRzY2hlbWEsIGl0LnNjaGVtYSwgaXQpO1xuICAgIGlmICghJHJ1bGVWYWxpZGF0ZSkgcmV0dXJuO1xuICAgICRzY2hlbWFWYWx1ZSA9ICd2YWxpZGF0ZS5zY2hlbWEnICsgJHNjaGVtYVBhdGg7XG4gICAgJHZhbGlkYXRlQ29kZSA9ICRydWxlVmFsaWRhdGUuY29kZTtcbiAgICAkY29tcGlsZSA9ICRyRGVmLmNvbXBpbGU7XG4gICAgJGlubGluZSA9ICRyRGVmLmlubGluZTtcbiAgICAkbWFjcm8gPSAkckRlZi5tYWNybztcbiAgfVxuICB2YXIgJHJ1bGVFcnJzID0gJHZhbGlkYXRlQ29kZSArICcuZXJyb3JzJyxcbiAgICAkaSA9ICdpJyArICRsdmwsXG4gICAgJHJ1bGVFcnIgPSAncnVsZUVycicgKyAkbHZsLFxuICAgICRhc3luY0tleXdvcmQgPSAkckRlZi5hc3luYztcbiAgaWYgKCRhc3luY0tleXdvcmQgJiYgIWl0LmFzeW5jKSB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jIGtleXdvcmQgaW4gc3luYyBzY2hlbWEnKTtcbiAgaWYgKCEoJGlubGluZSB8fCAkbWFjcm8pKSB7XG4gICAgb3V0ICs9ICcnICsgKCRydWxlRXJycykgKyAnID0gbnVsbDsnO1xuICB9XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczt2YXIgJyArICgkdmFsaWQpICsgJzsnO1xuICBpZiAoJGlzRGF0YSAmJiAkckRlZi4kZGF0YSkge1xuICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICBvdXQgKz0gJyBpZiAoJyArICgkc2NoZW1hVmFsdWUpICsgJyA9PT0gdW5kZWZpbmVkKSB7ICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyB9IGVsc2UgeyAnO1xuICAgIGlmICgkdmFsaWRhdGVTY2hlbWEpIHtcbiAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRkZWZpbml0aW9uKSArICcudmFsaWRhdGVTY2hlbWEoJyArICgkc2NoZW1hVmFsdWUpICsgJyk7IGlmICgnICsgKCR2YWxpZCkgKyAnKSB7ICc7XG4gICAgfVxuICB9XG4gIGlmICgkaW5saW5lKSB7XG4gICAgaWYgKCRyRGVmLnN0YXRlbWVudHMpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVWYWxpZGF0ZS52YWxpZGF0ZSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRydWxlVmFsaWRhdGUudmFsaWRhdGUpICsgJzsgJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoJG1hY3JvKSB7XG4gICAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gICAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICAgJGl0LmxldmVsKys7XG4gICAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICAgICRpdC5zY2hlbWEgPSAkcnVsZVZhbGlkYXRlLnZhbGlkYXRlO1xuICAgICRpdC5zY2hlbWFQYXRoID0gJyc7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KS5yZXBsYWNlKC92YWxpZGF0ZVxcLnNjaGVtYS9nLCAkdmFsaWRhdGVDb2RlKTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgIG91dCArPSAnICcgKyAoJGNvZGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJztcbiAgICBvdXQgKz0gJyAgJyArICgkdmFsaWRhdGVDb2RlKSArICcuY2FsbCggJztcbiAgICBpZiAoaXQub3B0cy5wYXNzQ29udGV4dCkge1xuICAgICAgb3V0ICs9ICd0aGlzJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICdzZWxmJztcbiAgICB9XG4gICAgaWYgKCRjb21waWxlIHx8ICRyRGVmLnNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgJyArICgkZGF0YSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICwgJyArICgkc2NoZW1hVmFsdWUpICsgJyAsICcgKyAoJGRhdGEpICsgJyAsIHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnICwgKGRhdGFQYXRoIHx8IFxcJ1xcJyknO1xuICAgIGlmIChpdC5lcnJvclBhdGggIT0gJ1wiXCInKSB7XG4gICAgICBvdXQgKz0gJyArICcgKyAoaXQuZXJyb3JQYXRoKTtcbiAgICB9XG4gICAgdmFyICRwYXJlbnREYXRhID0gJGRhdGFMdmwgPyAnZGF0YScgKyAoKCRkYXRhTHZsIC0gMSkgfHwgJycpIDogJ3BhcmVudERhdGEnLFxuICAgICAgJHBhcmVudERhdGFQcm9wZXJ0eSA9ICRkYXRhTHZsID8gaXQuZGF0YVBhdGhBcnJbJGRhdGFMdmxdIDogJ3BhcmVudERhdGFQcm9wZXJ0eSc7XG4gICAgb3V0ICs9ICcgLCAnICsgKCRwYXJlbnREYXRhKSArICcgLCAnICsgKCRwYXJlbnREYXRhUHJvcGVydHkpICsgJyAsIHJvb3REYXRhICkgICc7XG4gICAgdmFyIGRlZl9jYWxsUnVsZVZhbGlkYXRlID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCRyRGVmLmVycm9ycyA9PT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnO1xuICAgICAgaWYgKCRhc3luY0tleXdvcmQpIHtcbiAgICAgICAgb3V0ICs9ICdhd2FpdCAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcnICsgKGRlZl9jYWxsUnVsZVZhbGlkYXRlKSArICc7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkYXN5bmNLZXl3b3JkKSB7XG4gICAgICAgICRydWxlRXJycyA9ICdjdXN0b21FcnJvcnMnICsgJGx2bDtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHJ1bGVFcnJzKSArICcgPSBudWxsOyB0cnkgeyAnICsgKCR2YWxpZCkgKyAnID0gYXdhaXQgJyArIChkZWZfY2FsbFJ1bGVWYWxpZGF0ZSkgKyAnOyB9IGNhdGNoIChlKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgaWYgKGUgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpICcgKyAoJHJ1bGVFcnJzKSArICcgPSBlLmVycm9yczsgZWxzZSB0aHJvdyBlOyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyAnICsgKCRydWxlRXJycykgKyAnID0gbnVsbDsgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoZGVmX2NhbGxSdWxlVmFsaWRhdGUpICsgJzsgJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCRyRGVmLm1vZGlmeWluZykge1xuICAgIG91dCArPSAnIGlmICgnICsgKCRwYXJlbnREYXRhKSArICcpICcgKyAoJGRhdGEpICsgJyA9ICcgKyAoJHBhcmVudERhdGEpICsgJ1snICsgKCRwYXJlbnREYXRhUHJvcGVydHkpICsgJ107JztcbiAgfVxuICBvdXQgKz0gJycgKyAoJGNsb3NpbmdCcmFjZXMpO1xuICBpZiAoJHJEZWYudmFsaWQpIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgaWYgKCAnO1xuICAgIGlmICgkckRlZi52YWxpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvdXQgKz0gJyAhJztcbiAgICAgIGlmICgkbWFjcm8pIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRuZXh0VmFsaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCR2YWxpZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoISRyRGVmLnZhbGlkKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcpIHsgJztcbiAgICAkZXJyb3JLZXl3b3JkID0gJHJ1bGUua2V5d29yZDtcbiAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgb3V0ID0gJyc7XG4gICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnY3VzdG9tJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBrZXl3b3JkOiBcXCcnICsgKCRydWxlLmtleXdvcmQpICsgJ1xcJyB9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgcGFzcyBcIicgKyAoJHJ1bGUua2V5d29yZCkgKyAnXCIga2V5d29yZCB2YWxpZGF0aW9uXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIHZhciBfX2VyciA9IG91dDtcbiAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICB9XG4gICAgdmFyIGRlZl9jdXN0b21FcnJvciA9IG91dDtcbiAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgIGlmICgkaW5saW5lKSB7XG4gICAgICBpZiAoJHJEZWYuZXJyb3JzKSB7XG4gICAgICAgIGlmICgkckRlZi5lcnJvcnMgIT0gJ2Z1bGwnKSB7XG4gICAgICAgICAgb3V0ICs9ICcgIGZvciAodmFyICcgKyAoJGkpICsgJz0nICsgKCRlcnJzKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZhciAnICsgKCRydWxlRXJyKSArICcgPSB2RXJyb3JzWycgKyAoJGkpICsgJ107IGlmICgnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPT09IHVuZGVmaW5lZCkgJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID0gKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnOyBpZiAoJyArICgkcnVsZUVycikgKyAnLnNjaGVtYVBhdGggPT09IHVuZGVmaW5lZCkgeyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hUGF0aCA9IFwiJyArICgkZXJyU2NoZW1hUGF0aCkgKyAnXCI7IH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hID0gJyArICgkc2NoZW1hVmFsdWUpICsgJzsgJyArICgkcnVsZUVycikgKyAnLmRhdGEgPSAnICsgKCRkYXRhKSArICc7ICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCRyRGVmLmVycm9ycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKGRlZl9jdXN0b21FcnJvcikgKyAnICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJGVycnMpICsgJyA9PSBlcnJvcnMpIHsgJyArIChkZWZfY3VzdG9tRXJyb3IpICsgJyB9IGVsc2UgeyAgZm9yICh2YXIgJyArICgkaSkgKyAnPScgKyAoJGVycnMpICsgJzsgJyArICgkaSkgKyAnPGVycm9yczsgJyArICgkaSkgKyAnKyspIHsgdmFyICcgKyAoJHJ1bGVFcnIpICsgJyA9IHZFcnJvcnNbJyArICgkaSkgKyAnXTsgaWYgKCcgKyAoJHJ1bGVFcnIpICsgJy5kYXRhUGF0aCA9PT0gdW5kZWZpbmVkKSAnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPSAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICc7IGlmICgnICsgKCRydWxlRXJyKSArICcuc2NoZW1hUGF0aCA9PT0gdW5kZWZpbmVkKSB7ICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWFQYXRoID0gXCInICsgKCRlcnJTY2hlbWFQYXRoKSArICdcIjsgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWEgPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnOyAnICsgKCRydWxlRXJyKSArICcuZGF0YSA9ICcgKyAoJGRhdGEpICsgJzsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSB9ICc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCRtYWNybykge1xuICAgICAgb3V0ICs9ICcgICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ2N1c3RvbScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsga2V5d29yZDogXFwnJyArICgkcnVsZS5rZXl3b3JkKSArICdcXCcgfSAnO1xuICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBwYXNzIFwiJyArICgkcnVsZS5rZXl3b3JkKSArICdcIiBrZXl3b3JkIHZhbGlkYXRpb25cXCcgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZFcnJvcnMpOyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoJHJEZWYuZXJyb3JzID09PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAnICsgKGRlZl9jdXN0b21FcnJvcikgKyAnICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyBpZiAoQXJyYXkuaXNBcnJheSgnICsgKCRydWxlRXJycykgKyAnKSkgeyBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9ICcgKyAoJHJ1bGVFcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IHZFcnJvcnMuY29uY2F0KCcgKyAoJHJ1bGVFcnJzKSArICcpOyBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsgIGZvciAodmFyICcgKyAoJGkpICsgJz0nICsgKCRlcnJzKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZhciAnICsgKCRydWxlRXJyKSArICcgPSB2RXJyb3JzWycgKyAoJGkpICsgJ107IGlmICgnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPT09IHVuZGVmaW5lZCkgJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID0gKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnOyAgJyArICgkcnVsZUVycikgKyAnLnNjaGVtYVBhdGggPSBcIicgKyAoJGVyclNjaGVtYVBhdGgpICsgJ1wiOyAgJztcbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWEgPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnOyAnICsgKCRydWxlRXJyKSArICcuZGF0YSA9ICcgKyAoJGRhdGEpICsgJzsgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9IH0gZWxzZSB7ICcgKyAoZGVmX2N1c3RvbUVycm9yKSArICcgfSAnO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIG1ldGFTY2hlbWEgPSByZXF1aXJlKCcuL3JlZnMvanNvbi1zY2hlbWEtZHJhZnQtMDcuanNvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgJGlkOiAnaHR0cHM6Ly9naXRodWIuY29tL2Fqdi12YWxpZGF0b3IvYWp2L2Jsb2IvbWFzdGVyL2xpYi9kZWZpbml0aW9uX3NjaGVtYS5qcycsXG4gIGRlZmluaXRpb25zOiB7XG4gICAgc2ltcGxlVHlwZXM6IG1ldGFTY2hlbWEuZGVmaW5pdGlvbnMuc2ltcGxlVHlwZXNcbiAgfSxcbiAgdHlwZTogJ29iamVjdCcsXG4gIGRlcGVuZGVuY2llczoge1xuICAgIHNjaGVtYTogWyd2YWxpZGF0ZSddLFxuICAgICRkYXRhOiBbJ3ZhbGlkYXRlJ10sXG4gICAgc3RhdGVtZW50czogWydpbmxpbmUnXSxcbiAgICB2YWxpZDoge25vdDoge3JlcXVpcmVkOiBbJ21hY3JvJ119fVxuICB9LFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgdHlwZTogbWV0YVNjaGVtYS5wcm9wZXJ0aWVzLnR5cGUsXG4gICAgc2NoZW1hOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICBzdGF0ZW1lbnRzOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICBpdGVtczoge3R5cGU6ICdzdHJpbmcnfVxuICAgIH0sXG4gICAgbWV0YVNjaGVtYToge3R5cGU6ICdvYmplY3QnfSxcbiAgICBtb2RpZnlpbmc6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgIHZhbGlkOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICAkZGF0YToge3R5cGU6ICdib29sZWFuJ30sXG4gICAgYXN5bmM6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgIGVycm9yczoge1xuICAgICAgYW55T2Y6IFtcbiAgICAgICAge3R5cGU6ICdib29sZWFuJ30sXG4gICAgICAgIHtjb25zdDogJ2Z1bGwnfVxuICAgICAgXVxuICAgIH1cbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBJREVOVElGSUVSID0gL15bYS16XyRdW2EtejAtOV8kLV0qJC9pO1xudmFyIGN1c3RvbVJ1bGVDb2RlID0gcmVxdWlyZSgnLi9kb3Rqcy9jdXN0b20nKTtcbnZhciBkZWZpbml0aW9uU2NoZW1hID0gcmVxdWlyZSgnLi9kZWZpbml0aW9uX3NjaGVtYScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRkOiBhZGRLZXl3b3JkLFxuICBnZXQ6IGdldEtleXdvcmQsXG4gIHJlbW92ZTogcmVtb3ZlS2V5d29yZCxcbiAgdmFsaWRhdGU6IHZhbGlkYXRlS2V5d29yZFxufTtcblxuXG4vKipcbiAqIERlZmluZSBjdXN0b20ga2V5d29yZFxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtTdHJpbmd9IGtleXdvcmQgY3VzdG9tIGtleXdvcmQsIHNob3VsZCBiZSB1bmlxdWUgKGluY2x1ZGluZyBkaWZmZXJlbnQgZnJvbSBhbGwgc3RhbmRhcmQsIGN1c3RvbSBhbmQgbWFjcm8ga2V5d29yZHMpLlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmluaXRpb24ga2V5d29yZCBkZWZpbml0aW9uIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHR5cGVgICh0eXBlKHMpIHdoaWNoIHRoZSBrZXl3b3JkIGFwcGxpZXMgdG8pLCBgdmFsaWRhdGVgIG9yIGBjb21waWxlYC5cbiAqIEByZXR1cm4ge0Fqdn0gdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gKi9cbmZ1bmN0aW9uIGFkZEtleXdvcmQoa2V5d29yZCwgZGVmaW5pdGlvbikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIC8qIGVzbGludCBuby1zaGFkb3c6IDAgKi9cbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcbiAgaWYgKFJVTEVTLmtleXdvcmRzW2tleXdvcmRdKVxuICAgIHRocm93IG5ldyBFcnJvcignS2V5d29yZCAnICsga2V5d29yZCArICcgaXMgYWxyZWFkeSBkZWZpbmVkJyk7XG5cbiAgaWYgKCFJREVOVElGSUVSLnRlc3Qoa2V5d29yZCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdLZXl3b3JkICcgKyBrZXl3b3JkICsgJyBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyJyk7XG5cbiAgaWYgKGRlZmluaXRpb24pIHtcbiAgICB0aGlzLnZhbGlkYXRlS2V5d29yZChkZWZpbml0aW9uLCB0cnVlKTtcblxuICAgIHZhciBkYXRhVHlwZSA9IGRlZmluaXRpb24udHlwZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhVHlwZSkpIHtcbiAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhVHlwZS5sZW5ndGg7IGkrKylcbiAgICAgICAgX2FkZFJ1bGUoa2V5d29yZCwgZGF0YVR5cGVbaV0sIGRlZmluaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfYWRkUnVsZShrZXl3b3JkLCBkYXRhVHlwZSwgZGVmaW5pdGlvbik7XG4gICAgfVxuXG4gICAgdmFyIG1ldGFTY2hlbWEgPSBkZWZpbml0aW9uLm1ldGFTY2hlbWE7XG4gICAgaWYgKG1ldGFTY2hlbWEpIHtcbiAgICAgIGlmIChkZWZpbml0aW9uLiRkYXRhICYmIHRoaXMuX29wdHMuJGRhdGEpIHtcbiAgICAgICAgbWV0YVNjaGVtYSA9IHtcbiAgICAgICAgICBhbnlPZjogW1xuICAgICAgICAgICAgbWV0YVNjaGVtYSxcbiAgICAgICAgICAgIHsgJyRyZWYnOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgZGVmaW5pdGlvbi52YWxpZGF0ZVNjaGVtYSA9IHRoaXMuY29tcGlsZShtZXRhU2NoZW1hLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBSVUxFUy5rZXl3b3Jkc1trZXl3b3JkXSA9IFJVTEVTLmFsbFtrZXl3b3JkXSA9IHRydWU7XG5cblxuICBmdW5jdGlvbiBfYWRkUnVsZShrZXl3b3JkLCBkYXRhVHlwZSwgZGVmaW5pdGlvbikge1xuICAgIHZhciBydWxlR3JvdXA7XG4gICAgZm9yICh2YXIgaT0wOyBpPFJVTEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmcgPSBSVUxFU1tpXTtcbiAgICAgIGlmIChyZy50eXBlID09IGRhdGFUeXBlKSB7XG4gICAgICAgIHJ1bGVHcm91cCA9IHJnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJ1bGVHcm91cCkge1xuICAgICAgcnVsZUdyb3VwID0geyB0eXBlOiBkYXRhVHlwZSwgcnVsZXM6IFtdIH07XG4gICAgICBSVUxFUy5wdXNoKHJ1bGVHcm91cCk7XG4gICAgfVxuXG4gICAgdmFyIHJ1bGUgPSB7XG4gICAgICBrZXl3b3JkOiBrZXl3b3JkLFxuICAgICAgZGVmaW5pdGlvbjogZGVmaW5pdGlvbixcbiAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgIGNvZGU6IGN1c3RvbVJ1bGVDb2RlLFxuICAgICAgaW1wbGVtZW50czogZGVmaW5pdGlvbi5pbXBsZW1lbnRzXG4gICAgfTtcbiAgICBydWxlR3JvdXAucnVsZXMucHVzaChydWxlKTtcbiAgICBSVUxFUy5jdXN0b21ba2V5d29yZF0gPSBydWxlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBHZXQga2V5d29yZFxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtTdHJpbmd9IGtleXdvcmQgcHJlLWRlZmluZWQgb3IgY3VzdG9tIGtleXdvcmQuXG4gKiBAcmV0dXJuIHtPYmplY3R8Qm9vbGVhbn0gY3VzdG9tIGtleXdvcmQgZGVmaW5pdGlvbiwgYHRydWVgIGlmIGl0IGlzIGEgcHJlZGVmaW5lZCBrZXl3b3JkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gZ2V0S2V5d29yZChrZXl3b3JkKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIHJ1bGUgPSB0aGlzLlJVTEVTLmN1c3RvbVtrZXl3b3JkXTtcbiAgcmV0dXJuIHJ1bGUgPyBydWxlLmRlZmluaXRpb24gOiB0aGlzLlJVTEVTLmtleXdvcmRzW2tleXdvcmRdIHx8IGZhbHNlO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlIGtleXdvcmRcbiAqIEB0aGlzICBBanZcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXl3b3JkIHByZS1kZWZpbmVkIG9yIGN1c3RvbSBrZXl3b3JkLlxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlS2V5d29yZChrZXl3b3JkKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcbiAgZGVsZXRlIFJVTEVTLmtleXdvcmRzW2tleXdvcmRdO1xuICBkZWxldGUgUlVMRVMuYWxsW2tleXdvcmRdO1xuICBkZWxldGUgUlVMRVMuY3VzdG9tW2tleXdvcmRdO1xuICBmb3IgKHZhciBpPTA7IGk8UlVMRVMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcnVsZXMgPSBSVUxFU1tpXS5ydWxlcztcbiAgICBmb3IgKHZhciBqPTA7IGo8cnVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChydWxlc1tqXS5rZXl3b3JkID09IGtleXdvcmQpIHtcbiAgICAgICAgcnVsZXMuc3BsaWNlKGosIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBWYWxpZGF0ZSBrZXl3b3JkIGRlZmluaXRpb25cbiAqIEB0aGlzICBBanZcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZpbml0aW9uIGtleXdvcmQgZGVmaW5pdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93RXJyb3IgdHJ1ZSB0byB0aHJvdyBleGNlcHRpb24gaWYgZGVmaW5pdGlvbiBpcyBpbnZhbGlkXG4gKiBAcmV0dXJuIHtib29sZWFufSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUtleXdvcmQoZGVmaW5pdGlvbiwgdGhyb3dFcnJvcikge1xuICB2YWxpZGF0ZUtleXdvcmQuZXJyb3JzID0gbnVsbDtcbiAgdmFyIHYgPSB0aGlzLl92YWxpZGF0ZUtleXdvcmQgPSB0aGlzLl92YWxpZGF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0aGlzLmNvbXBpbGUoZGVmaW5pdGlvblNjaGVtYSwgdHJ1ZSk7XG5cbiAgaWYgKHYoZGVmaW5pdGlvbikpIHJldHVybiB0cnVlO1xuICB2YWxpZGF0ZUtleXdvcmQuZXJyb3JzID0gdi5lcnJvcnM7XG4gIGlmICh0aHJvd0Vycm9yKVxuICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9tIGtleXdvcmQgZGVmaW5pdGlvbiBpcyBpbnZhbGlkOiAnICArIHRoaXMuZXJyb3JzVGV4dCh2LmVycm9ycykpO1xuICBlbHNlXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbXBpbGVTY2hlbWEgPSByZXF1aXJlKCcuL2NvbXBpbGUnKVxuICAsIHJlc29sdmUgPSByZXF1aXJlKCcuL2NvbXBpbGUvcmVzb2x2ZScpXG4gICwgQ2FjaGUgPSByZXF1aXJlKCcuL2NhY2hlJylcbiAgLCBTY2hlbWFPYmplY3QgPSByZXF1aXJlKCcuL2NvbXBpbGUvc2NoZW1hX29iaicpXG4gICwgc3RhYmxlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnknKVxuICAsIGZvcm1hdHMgPSByZXF1aXJlKCcuL2NvbXBpbGUvZm9ybWF0cycpXG4gICwgcnVsZXMgPSByZXF1aXJlKCcuL2NvbXBpbGUvcnVsZXMnKVxuICAsICRkYXRhTWV0YVNjaGVtYSA9IHJlcXVpcmUoJy4vZGF0YScpXG4gICwgdXRpbCA9IHJlcXVpcmUoJy4vY29tcGlsZS91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQWp2O1xuXG5BanYucHJvdG90eXBlLnZhbGlkYXRlID0gdmFsaWRhdGU7XG5BanYucHJvdG90eXBlLmNvbXBpbGUgPSBjb21waWxlO1xuQWp2LnByb3RvdHlwZS5hZGRTY2hlbWEgPSBhZGRTY2hlbWE7XG5BanYucHJvdG90eXBlLmFkZE1ldGFTY2hlbWEgPSBhZGRNZXRhU2NoZW1hO1xuQWp2LnByb3RvdHlwZS52YWxpZGF0ZVNjaGVtYSA9IHZhbGlkYXRlU2NoZW1hO1xuQWp2LnByb3RvdHlwZS5nZXRTY2hlbWEgPSBnZXRTY2hlbWE7XG5BanYucHJvdG90eXBlLnJlbW92ZVNjaGVtYSA9IHJlbW92ZVNjaGVtYTtcbkFqdi5wcm90b3R5cGUuYWRkRm9ybWF0ID0gYWRkRm9ybWF0O1xuQWp2LnByb3RvdHlwZS5lcnJvcnNUZXh0ID0gZXJyb3JzVGV4dDtcblxuQWp2LnByb3RvdHlwZS5fYWRkU2NoZW1hID0gX2FkZFNjaGVtYTtcbkFqdi5wcm90b3R5cGUuX2NvbXBpbGUgPSBfY29tcGlsZTtcblxuQWp2LnByb3RvdHlwZS5jb21waWxlQXN5bmMgPSByZXF1aXJlKCcuL2NvbXBpbGUvYXN5bmMnKTtcbnZhciBjdXN0b21LZXl3b3JkID0gcmVxdWlyZSgnLi9rZXl3b3JkJyk7XG5BanYucHJvdG90eXBlLmFkZEtleXdvcmQgPSBjdXN0b21LZXl3b3JkLmFkZDtcbkFqdi5wcm90b3R5cGUuZ2V0S2V5d29yZCA9IGN1c3RvbUtleXdvcmQuZ2V0O1xuQWp2LnByb3RvdHlwZS5yZW1vdmVLZXl3b3JkID0gY3VzdG9tS2V5d29yZC5yZW1vdmU7XG5BanYucHJvdG90eXBlLnZhbGlkYXRlS2V5d29yZCA9IGN1c3RvbUtleXdvcmQudmFsaWRhdGU7XG5cbnZhciBlcnJvckNsYXNzZXMgPSByZXF1aXJlKCcuL2NvbXBpbGUvZXJyb3JfY2xhc3NlcycpO1xuQWp2LlZhbGlkYXRpb25FcnJvciA9IGVycm9yQ2xhc3Nlcy5WYWxpZGF0aW9uO1xuQWp2Lk1pc3NpbmdSZWZFcnJvciA9IGVycm9yQ2xhc3Nlcy5NaXNzaW5nUmVmO1xuQWp2LiRkYXRhTWV0YVNjaGVtYSA9ICRkYXRhTWV0YVNjaGVtYTtcblxudmFyIE1FVEFfU0NIRU1BX0lEID0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hJztcblxudmFyIE1FVEFfSUdOT1JFX09QVElPTlMgPSBbICdyZW1vdmVBZGRpdGlvbmFsJywgJ3VzZURlZmF1bHRzJywgJ2NvZXJjZVR5cGVzJywgJ3N0cmljdERlZmF1bHRzJyBdO1xudmFyIE1FVEFfU1VQUE9SVF9EQVRBID0gWycvcHJvcGVydGllcyddO1xuXG4vKipcbiAqIENyZWF0ZXMgdmFsaWRhdG9yIGluc3RhbmNlLlxuICogVXNhZ2U6IGBBanYob3B0cylgXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBvcHRpb25hbCBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IGFqdiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBanYob3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQWp2KSkgcmV0dXJuIG5ldyBBanYob3B0cyk7XG4gIG9wdHMgPSB0aGlzLl9vcHRzID0gdXRpbC5jb3B5KG9wdHMpIHx8IHt9O1xuICBzZXRMb2dnZXIodGhpcyk7XG4gIHRoaXMuX3NjaGVtYXMgPSB7fTtcbiAgdGhpcy5fcmVmcyA9IHt9O1xuICB0aGlzLl9mcmFnbWVudHMgPSB7fTtcbiAgdGhpcy5fZm9ybWF0cyA9IGZvcm1hdHMob3B0cy5mb3JtYXQpO1xuXG4gIHRoaXMuX2NhY2hlID0gb3B0cy5jYWNoZSB8fCBuZXcgQ2FjaGU7XG4gIHRoaXMuX2xvYWRpbmdTY2hlbWFzID0ge307XG4gIHRoaXMuX2NvbXBpbGF0aW9ucyA9IFtdO1xuICB0aGlzLlJVTEVTID0gcnVsZXMoKTtcbiAgdGhpcy5fZ2V0SWQgPSBjaG9vc2VHZXRJZChvcHRzKTtcblxuICBvcHRzLmxvb3BSZXF1aXJlZCA9IG9wdHMubG9vcFJlcXVpcmVkIHx8IEluZmluaXR5O1xuICBpZiAob3B0cy5lcnJvckRhdGFQYXRoID09ICdwcm9wZXJ0eScpIG9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA9IHRydWU7XG4gIGlmIChvcHRzLnNlcmlhbGl6ZSA9PT0gdW5kZWZpbmVkKSBvcHRzLnNlcmlhbGl6ZSA9IHN0YWJsZVN0cmluZ2lmeTtcbiAgdGhpcy5fbWV0YU9wdHMgPSBnZXRNZXRhU2NoZW1hT3B0aW9ucyh0aGlzKTtcblxuICBpZiAob3B0cy5mb3JtYXRzKSBhZGRJbml0aWFsRm9ybWF0cyh0aGlzKTtcbiAgaWYgKG9wdHMua2V5d29yZHMpIGFkZEluaXRpYWxLZXl3b3Jkcyh0aGlzKTtcbiAgYWRkRGVmYXVsdE1ldGFTY2hlbWEodGhpcyk7XG4gIGlmICh0eXBlb2Ygb3B0cy5tZXRhID09ICdvYmplY3QnKSB0aGlzLmFkZE1ldGFTY2hlbWEob3B0cy5tZXRhKTtcbiAgaWYgKG9wdHMubnVsbGFibGUpIHRoaXMuYWRkS2V5d29yZCgnbnVsbGFibGUnLCB7bWV0YVNjaGVtYToge3R5cGU6ICdib29sZWFuJ319KTtcbiAgYWRkSW5pdGlhbFNjaGVtYXModGhpcyk7XG59XG5cblxuXG4vKipcbiAqIFZhbGlkYXRlIGRhdGEgdXNpbmcgc2NoZW1hXG4gKiBTY2hlbWEgd2lsbCBiZSBjb21waWxlZCBhbmQgY2FjaGVkICh1c2luZyBzZXJpYWxpemVkIEpTT04gYXMga2V5LiBbZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnldKGh0dHBzOi8vZ2l0aHViLmNvbS9lcG9iZXJlemtpbi9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSkgaXMgdXNlZCB0byBzZXJpYWxpemUuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7U3RyaW5nfE9iamVjdH0gc2NoZW1hS2V5UmVmIGtleSwgcmVmIG9yIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSAge0FueX0gZGF0YSB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHZhbGlkYXRpb24gcmVzdWx0LiBFcnJvcnMgZnJvbSB0aGUgbGFzdCB2YWxpZGF0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIGluIGBhanYuZXJyb3JzYCAoYW5kIGFsc28gaW4gY29tcGlsZWQgc2NoZW1hOiBgc2NoZW1hLmVycm9yc2ApLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZShzY2hlbWFLZXlSZWYsIGRhdGEpIHtcbiAgdmFyIHY7XG4gIGlmICh0eXBlb2Ygc2NoZW1hS2V5UmVmID09ICdzdHJpbmcnKSB7XG4gICAgdiA9IHRoaXMuZ2V0U2NoZW1hKHNjaGVtYUtleVJlZik7XG4gICAgaWYgKCF2KSB0aHJvdyBuZXcgRXJyb3IoJ25vIHNjaGVtYSB3aXRoIGtleSBvciByZWYgXCInICsgc2NoZW1hS2V5UmVmICsgJ1wiJyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVtYU9iaiA9IHRoaXMuX2FkZFNjaGVtYShzY2hlbWFLZXlSZWYpO1xuICAgIHYgPSBzY2hlbWFPYmoudmFsaWRhdGUgfHwgdGhpcy5fY29tcGlsZShzY2hlbWFPYmopO1xuICB9XG5cbiAgdmFyIHZhbGlkID0gdihkYXRhKTtcbiAgaWYgKHYuJGFzeW5jICE9PSB0cnVlKSB0aGlzLmVycm9ycyA9IHYuZXJyb3JzO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cblxuLyoqXG4gKiBDcmVhdGUgdmFsaWRhdGluZyBmdW5jdGlvbiBmb3IgcGFzc2VkIHNjaGVtYS5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtPYmplY3R9IHNjaGVtYSBzY2hlbWEgb2JqZWN0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBfbWV0YSB0cnVlIGlmIHNjaGVtYSBpcyBhIG1ldGEtc2NoZW1hLiBVc2VkIGludGVybmFsbHkgdG8gY29tcGlsZSBtZXRhIHNjaGVtYXMgb2YgY3VzdG9tIGtleXdvcmRzLlxuICogQHJldHVybiB7RnVuY3Rpb259IHZhbGlkYXRpbmcgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gY29tcGlsZShzY2hlbWEsIF9tZXRhKSB7XG4gIHZhciBzY2hlbWFPYmogPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCB1bmRlZmluZWQsIF9tZXRhKTtcbiAgcmV0dXJuIHNjaGVtYU9iai52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlKHNjaGVtYU9iaik7XG59XG5cblxuLyoqXG4gKiBBZGRzIHNjaGVtYSB0byB0aGUgaW5zdGFuY2UuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IHNjaGVtYSBzY2hlbWEgb3IgYXJyYXkgb2Ygc2NoZW1hcy4gSWYgYXJyYXkgaXMgcGFzc2VkLCBga2V5YCBhbmQgb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlnbm9yZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IE9wdGlvbmFsIHNjaGVtYSBrZXkuIENhbiBiZSBwYXNzZWQgdG8gYHZhbGlkYXRlYCBtZXRob2QgaW5zdGVhZCBvZiBzY2hlbWEgb2JqZWN0IG9yIGlkL3JlZi4gT25lIHNjaGVtYSBwZXIgaW5zdGFuY2UgY2FuIGhhdmUgZW1wdHkgYGlkYCBhbmQgYGtleWAuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9za2lwVmFsaWRhdGlvbiB0cnVlIHRvIHNraXAgc2NoZW1hIHZhbGlkYXRpb24uIFVzZWQgaW50ZXJuYWxseSwgb3B0aW9uIHZhbGlkYXRlU2NoZW1hIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9tZXRhIHRydWUgaWYgc2NoZW1hIGlzIGEgbWV0YS1zY2hlbWEuIFVzZWQgaW50ZXJuYWxseSwgYWRkTWV0YVNjaGVtYSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gYWRkU2NoZW1hKHNjaGVtYSwga2V5LCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpe1xuICAgIGZvciAodmFyIGk9MDsgaTxzY2hlbWEubGVuZ3RoOyBpKyspIHRoaXMuYWRkU2NoZW1hKHNjaGVtYVtpXSwgdW5kZWZpbmVkLCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWEpO1xuICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaWQgIT0gJ3N0cmluZycpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY2hlbWEgaWQgbXVzdCBiZSBzdHJpbmcnKTtcbiAga2V5ID0gcmVzb2x2ZS5ub3JtYWxpemVJZChrZXkgfHwgaWQpO1xuICBjaGVja1VuaXF1ZSh0aGlzLCBrZXkpO1xuICB0aGlzLl9zY2hlbWFzW2tleV0gPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhLCB0cnVlKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBBZGQgc2NoZW1hIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIG90aGVyIHNjaGVtYXNcbiAqIG9wdGlvbnMgaW4gTUVUQV9JR05PUkVfT1BUSU9OUyBhcmUgYWx3YXkgc2V0IHRvIGZhbHNlXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBzY2hlbWEgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IG9wdGlvbmFsIHNjaGVtYSBrZXlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2tpcFZhbGlkYXRpb24gdHJ1ZSB0byBza2lwIHNjaGVtYSB2YWxpZGF0aW9uLCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB2YWxpZGF0ZVNjaGVtYSBvcHRpb24gZm9yIG1ldGEtc2NoZW1hXG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiBhZGRNZXRhU2NoZW1hKHNjaGVtYSwga2V5LCBza2lwVmFsaWRhdGlvbikge1xuICB0aGlzLmFkZFNjaGVtYShzY2hlbWEsIGtleSwgc2tpcFZhbGlkYXRpb24sIHRydWUpO1xuICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIFZhbGlkYXRlIHNjaGVtYVxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T3JMb2dFcnJvciBwYXNzIHRydWUgdG8gdGhyb3cgKG9yIGxvZykgYW4gZXJyb3IgaWYgaW52YWxpZFxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBzY2hlbWEgaXMgdmFsaWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0aHJvd09yTG9nRXJyb3IpIHtcbiAgdmFyICRzY2hlbWEgPSBzY2hlbWEuJHNjaGVtYTtcbiAgaWYgKCRzY2hlbWEgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgJHNjaGVtYSAhPSAnc3RyaW5nJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJyRzY2hlbWEgbXVzdCBiZSBhIHN0cmluZycpO1xuICAkc2NoZW1hID0gJHNjaGVtYSB8fCB0aGlzLl9vcHRzLmRlZmF1bHRNZXRhIHx8IGRlZmF1bHRNZXRhKHRoaXMpO1xuICBpZiAoISRzY2hlbWEpIHtcbiAgICB0aGlzLmxvZ2dlci53YXJuKCdtZXRhLXNjaGVtYSBub3QgYXZhaWxhYmxlJyk7XG4gICAgdGhpcy5lcnJvcnMgPSBudWxsO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciB2YWxpZCA9IHRoaXMudmFsaWRhdGUoJHNjaGVtYSwgc2NoZW1hKTtcbiAgaWYgKCF2YWxpZCAmJiB0aHJvd09yTG9nRXJyb3IpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdzY2hlbWEgaXMgaW52YWxpZDogJyArIHRoaXMuZXJyb3JzVGV4dCgpO1xuICAgIGlmICh0aGlzLl9vcHRzLnZhbGlkYXRlU2NoZW1hID09ICdsb2cnKSB0aGlzLmxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICBlbHNlIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cblxuZnVuY3Rpb24gZGVmYXVsdE1ldGEoc2VsZikge1xuICB2YXIgbWV0YSA9IHNlbGYuX29wdHMubWV0YTtcbiAgc2VsZi5fb3B0cy5kZWZhdWx0TWV0YSA9IHR5cGVvZiBtZXRhID09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZWxmLl9nZXRJZChtZXRhKSB8fCBtZXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZWxmLmdldFNjaGVtYShNRVRBX1NDSEVNQV9JRClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTUVUQV9TQ0hFTUFfSURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gc2VsZi5fb3B0cy5kZWZhdWx0TWV0YTtcbn1cblxuXG4vKipcbiAqIEdldCBjb21waWxlZCBzY2hlbWEgZnJvbSB0aGUgaW5zdGFuY2UgYnkgYGtleWAgb3IgYHJlZmAuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7U3RyaW5nfSBrZXlSZWYgYGtleWAgdGhhdCB3YXMgcGFzc2VkIHRvIGBhZGRTY2hlbWFgIG9yIGZ1bGwgc2NoZW1hIHJlZmVyZW5jZSAoYHNjaGVtYS5pZGAgb3IgcmVzb2x2ZWQgaWQpLlxuICogQHJldHVybiB7RnVuY3Rpb259IHNjaGVtYSB2YWxpZGF0aW5nIGZ1bmN0aW9uICh3aXRoIHByb3BlcnR5IGBzY2hlbWFgKS5cbiAqL1xuZnVuY3Rpb24gZ2V0U2NoZW1hKGtleVJlZikge1xuICB2YXIgc2NoZW1hT2JqID0gX2dldFNjaGVtYU9iaih0aGlzLCBrZXlSZWYpO1xuICBzd2l0Y2ggKHR5cGVvZiBzY2hlbWFPYmopIHtcbiAgICBjYXNlICdvYmplY3QnOiByZXR1cm4gc2NoZW1hT2JqLnZhbGlkYXRlIHx8IHRoaXMuX2NvbXBpbGUoc2NoZW1hT2JqKTtcbiAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gdGhpcy5nZXRTY2hlbWEoc2NoZW1hT2JqKTtcbiAgICBjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gX2dldFNjaGVtYUZyYWdtZW50KHRoaXMsIGtleVJlZik7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBfZ2V0U2NoZW1hRnJhZ21lbnQoc2VsZiwgcmVmKSB7XG4gIHZhciByZXMgPSByZXNvbHZlLnNjaGVtYS5jYWxsKHNlbGYsIHsgc2NoZW1hOiB7fSB9LCByZWYpO1xuICBpZiAocmVzKSB7XG4gICAgdmFyIHNjaGVtYSA9IHJlcy5zY2hlbWFcbiAgICAgICwgcm9vdCA9IHJlcy5yb290XG4gICAgICAsIGJhc2VJZCA9IHJlcy5iYXNlSWQ7XG4gICAgdmFyIHYgPSBjb21waWxlU2NoZW1hLmNhbGwoc2VsZiwgc2NoZW1hLCByb290LCB1bmRlZmluZWQsIGJhc2VJZCk7XG4gICAgc2VsZi5fZnJhZ21lbnRzW3JlZl0gPSBuZXcgU2NoZW1hT2JqZWN0KHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgZnJhZ21lbnQ6IHRydWUsXG4gICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgIHJvb3Q6IHJvb3QsXG4gICAgICBiYXNlSWQ6IGJhc2VJZCxcbiAgICAgIHZhbGlkYXRlOiB2XG4gICAgfSk7XG4gICAgcmV0dXJuIHY7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBfZ2V0U2NoZW1hT2JqKHNlbGYsIGtleVJlZikge1xuICBrZXlSZWYgPSByZXNvbHZlLm5vcm1hbGl6ZUlkKGtleVJlZik7XG4gIHJldHVybiBzZWxmLl9zY2hlbWFzW2tleVJlZl0gfHwgc2VsZi5fcmVmc1trZXlSZWZdIHx8IHNlbGYuX2ZyYWdtZW50c1trZXlSZWZdO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlIGNhY2hlZCBzY2hlbWEocykuXG4gKiBJZiBubyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGFsbCBzY2hlbWFzIGJ1dCBtZXRhLXNjaGVtYXMgYXJlIHJlbW92ZWQuXG4gKiBJZiBSZWdFeHAgaXMgcGFzc2VkIGFsbCBzY2hlbWFzIHdpdGgga2V5L2lkIG1hdGNoaW5nIHBhdHRlcm4gYnV0IG1ldGEtc2NoZW1hcyBhcmUgcmVtb3ZlZC5cbiAqIEV2ZW4gaWYgc2NoZW1hIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgc2NoZW1hcyBpdCBzdGlsbCBjYW4gYmUgcmVtb3ZlZCBhcyBvdGhlciBzY2hlbWFzIGhhdmUgbG9jYWwgcmVmZXJlbmNlcy5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtTdHJpbmd8T2JqZWN0fFJlZ0V4cH0gc2NoZW1hS2V5UmVmIGtleSwgcmVmLCBwYXR0ZXJuIHRvIG1hdGNoIGtleS9yZWYgb3Igc2NoZW1hIG9iamVjdFxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU2NoZW1hKHNjaGVtYUtleVJlZikge1xuICBpZiAoc2NoZW1hS2V5UmVmIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgX3JlbW92ZUFsbFNjaGVtYXModGhpcywgdGhpcy5fc2NoZW1hcywgc2NoZW1hS2V5UmVmKTtcbiAgICBfcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLCB0aGlzLl9yZWZzLCBzY2hlbWFLZXlSZWYpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHN3aXRjaCAodHlwZW9mIHNjaGVtYUtleVJlZikge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBfcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLCB0aGlzLl9zY2hlbWFzKTtcbiAgICAgIF9yZW1vdmVBbGxTY2hlbWFzKHRoaXMsIHRoaXMuX3JlZnMpO1xuICAgICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICB2YXIgc2NoZW1hT2JqID0gX2dldFNjaGVtYU9iaih0aGlzLCBzY2hlbWFLZXlSZWYpO1xuICAgICAgaWYgKHNjaGVtYU9iaikgdGhpcy5fY2FjaGUuZGVsKHNjaGVtYU9iai5jYWNoZUtleSk7XG4gICAgICBkZWxldGUgdGhpcy5fc2NoZW1hc1tzY2hlbWFLZXlSZWZdO1xuICAgICAgZGVsZXRlIHRoaXMuX3JlZnNbc2NoZW1hS2V5UmVmXTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgc2VyaWFsaXplID0gdGhpcy5fb3B0cy5zZXJpYWxpemU7XG4gICAgICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemUgPyBzZXJpYWxpemUoc2NoZW1hS2V5UmVmKSA6IHNjaGVtYUtleVJlZjtcbiAgICAgIHRoaXMuX2NhY2hlLmRlbChjYWNoZUtleSk7XG4gICAgICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWFLZXlSZWYpO1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIGlkID0gcmVzb2x2ZS5ub3JtYWxpemVJZChpZCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zY2hlbWFzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3JlZnNbaWRdO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW1vdmVBbGxTY2hlbWFzKHNlbGYsIHNjaGVtYXMsIHJlZ2V4KSB7XG4gIGZvciAodmFyIGtleVJlZiBpbiBzY2hlbWFzKSB7XG4gICAgdmFyIHNjaGVtYU9iaiA9IHNjaGVtYXNba2V5UmVmXTtcbiAgICBpZiAoIXNjaGVtYU9iai5tZXRhICYmICghcmVnZXggfHwgcmVnZXgudGVzdChrZXlSZWYpKSkge1xuICAgICAgc2VsZi5fY2FjaGUuZGVsKHNjaGVtYU9iai5jYWNoZUtleSk7XG4gICAgICBkZWxldGUgc2NoZW1hc1trZXlSZWZdO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qIEB0aGlzICAgQWp2ICovXG5mdW5jdGlvbiBfYWRkU2NoZW1hKHNjaGVtYSwgc2tpcFZhbGlkYXRpb24sIG1ldGEsIHNob3VsZEFkZFNjaGVtYSkge1xuICBpZiAodHlwZW9mIHNjaGVtYSAhPSAnb2JqZWN0JyAmJiB0eXBlb2Ygc2NoZW1hICE9ICdib29sZWFuJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjaGVtYSBzaG91bGQgYmUgb2JqZWN0IG9yIGJvb2xlYW4nKTtcbiAgdmFyIHNlcmlhbGl6ZSA9IHRoaXMuX29wdHMuc2VyaWFsaXplO1xuICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemUgPyBzZXJpYWxpemUoc2NoZW1hKSA6IHNjaGVtYTtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX2NhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgc2hvdWxkQWRkU2NoZW1hID0gc2hvdWxkQWRkU2NoZW1hIHx8IHRoaXMuX29wdHMuYWRkVXNlZFNjaGVtYSAhPT0gZmFsc2U7XG5cbiAgdmFyIGlkID0gcmVzb2x2ZS5ub3JtYWxpemVJZCh0aGlzLl9nZXRJZChzY2hlbWEpKTtcbiAgaWYgKGlkICYmIHNob3VsZEFkZFNjaGVtYSkgY2hlY2tVbmlxdWUodGhpcywgaWQpO1xuXG4gIHZhciB3aWxsVmFsaWRhdGUgPSB0aGlzLl9vcHRzLnZhbGlkYXRlU2NoZW1hICE9PSBmYWxzZSAmJiAhc2tpcFZhbGlkYXRpb247XG4gIHZhciByZWN1cnNpdmVNZXRhO1xuICBpZiAod2lsbFZhbGlkYXRlICYmICEocmVjdXJzaXZlTWV0YSA9IGlkICYmIGlkID09IHJlc29sdmUubm9ybWFsaXplSWQoc2NoZW1hLiRzY2hlbWEpKSlcbiAgICB0aGlzLnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG5cbiAgdmFyIGxvY2FsUmVmcyA9IHJlc29sdmUuaWRzLmNhbGwodGhpcywgc2NoZW1hKTtcblxuICB2YXIgc2NoZW1hT2JqID0gbmV3IFNjaGVtYU9iamVjdCh7XG4gICAgaWQ6IGlkLFxuICAgIHNjaGVtYTogc2NoZW1hLFxuICAgIGxvY2FsUmVmczogbG9jYWxSZWZzLFxuICAgIGNhY2hlS2V5OiBjYWNoZUtleSxcbiAgICBtZXRhOiBtZXRhXG4gIH0pO1xuXG4gIGlmIChpZFswXSAhPSAnIycgJiYgc2hvdWxkQWRkU2NoZW1hKSB0aGlzLl9yZWZzW2lkXSA9IHNjaGVtYU9iajtcbiAgdGhpcy5fY2FjaGUucHV0KGNhY2hlS2V5LCBzY2hlbWFPYmopO1xuXG4gIGlmICh3aWxsVmFsaWRhdGUgJiYgcmVjdXJzaXZlTWV0YSkgdGhpcy52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuXG4gIHJldHVybiBzY2hlbWFPYmo7XG59XG5cblxuLyogQHRoaXMgICBBanYgKi9cbmZ1bmN0aW9uIF9jb21waWxlKHNjaGVtYU9iaiwgcm9vdCkge1xuICBpZiAoc2NoZW1hT2JqLmNvbXBpbGluZykge1xuICAgIHNjaGVtYU9iai52YWxpZGF0ZSA9IGNhbGxWYWxpZGF0ZTtcbiAgICBjYWxsVmFsaWRhdGUuc2NoZW1hID0gc2NoZW1hT2JqLnNjaGVtYTtcbiAgICBjYWxsVmFsaWRhdGUuZXJyb3JzID0gbnVsbDtcbiAgICBjYWxsVmFsaWRhdGUucm9vdCA9IHJvb3QgPyByb290IDogY2FsbFZhbGlkYXRlO1xuICAgIGlmIChzY2hlbWFPYmouc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZSlcbiAgICAgIGNhbGxWYWxpZGF0ZS4kYXN5bmMgPSB0cnVlO1xuICAgIHJldHVybiBjYWxsVmFsaWRhdGU7XG4gIH1cbiAgc2NoZW1hT2JqLmNvbXBpbGluZyA9IHRydWU7XG5cbiAgdmFyIGN1cnJlbnRPcHRzO1xuICBpZiAoc2NoZW1hT2JqLm1ldGEpIHtcbiAgICBjdXJyZW50T3B0cyA9IHRoaXMuX29wdHM7XG4gICAgdGhpcy5fb3B0cyA9IHRoaXMuX21ldGFPcHRzO1xuICB9XG5cbiAgdmFyIHY7XG4gIHRyeSB7IHYgPSBjb21waWxlU2NoZW1hLmNhbGwodGhpcywgc2NoZW1hT2JqLnNjaGVtYSwgcm9vdCwgc2NoZW1hT2JqLmxvY2FsUmVmcyk7IH1cbiAgY2F0Y2goZSkge1xuICAgIGRlbGV0ZSBzY2hlbWFPYmoudmFsaWRhdGU7XG4gICAgdGhyb3cgZTtcbiAgfVxuICBmaW5hbGx5IHtcbiAgICBzY2hlbWFPYmouY29tcGlsaW5nID0gZmFsc2U7XG4gICAgaWYgKHNjaGVtYU9iai5tZXRhKSB0aGlzLl9vcHRzID0gY3VycmVudE9wdHM7XG4gIH1cblxuICBzY2hlbWFPYmoudmFsaWRhdGUgPSB2O1xuICBzY2hlbWFPYmoucmVmcyA9IHYucmVmcztcbiAgc2NoZW1hT2JqLnJlZlZhbCA9IHYucmVmVmFsO1xuICBzY2hlbWFPYmoucm9vdCA9IHYucm9vdDtcbiAgcmV0dXJuIHY7XG5cblxuICAvKiBAdGhpcyAgIHsqfSAtIGN1c3RvbSBjb250ZXh0LCBzZWUgcGFzc0NvbnRleHQgb3B0aW9uICovXG4gIGZ1bmN0aW9uIGNhbGxWYWxpZGF0ZSgpIHtcbiAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gICAgdmFyIF92YWxpZGF0ZSA9IHNjaGVtYU9iai52YWxpZGF0ZTtcbiAgICB2YXIgcmVzdWx0ID0gX3ZhbGlkYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgY2FsbFZhbGlkYXRlLmVycm9ycyA9IF92YWxpZGF0ZS5lcnJvcnM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGNob29zZUdldElkKG9wdHMpIHtcbiAgc3dpdGNoIChvcHRzLnNjaGVtYUlkKSB7XG4gICAgY2FzZSAnYXV0byc6IHJldHVybiBfZ2V0JElkT3JJZDtcbiAgICBjYXNlICdpZCc6IHJldHVybiBfZ2V0SWQ7XG4gICAgZGVmYXVsdDogcmV0dXJuIF9nZXQkSWQ7XG4gIH1cbn1cblxuLyogQHRoaXMgICBBanYgKi9cbmZ1bmN0aW9uIF9nZXRJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS4kaWQpIHRoaXMubG9nZ2VyLndhcm4oJ3NjaGVtYSAkaWQgaWdub3JlZCcsIHNjaGVtYS4kaWQpO1xuICByZXR1cm4gc2NoZW1hLmlkO1xufVxuXG4vKiBAdGhpcyAgIEFqdiAqL1xuZnVuY3Rpb24gX2dldCRJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS5pZCkgdGhpcy5sb2dnZXIud2Fybignc2NoZW1hIGlkIGlnbm9yZWQnLCBzY2hlbWEuaWQpO1xuICByZXR1cm4gc2NoZW1hLiRpZDtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0JElkT3JJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS4kaWQgJiYgc2NoZW1hLmlkICYmIHNjaGVtYS4kaWQgIT0gc2NoZW1hLmlkKVxuICAgIHRocm93IG5ldyBFcnJvcignc2NoZW1hICRpZCBpcyBkaWZmZXJlbnQgZnJvbSBpZCcpO1xuICByZXR1cm4gc2NoZW1hLiRpZCB8fCBzY2hlbWEuaWQ7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIGVycm9yIG1lc3NhZ2Ugb2JqZWN0cyB0byBzdHJpbmdcbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtBcnJheTxPYmplY3Q+fSBlcnJvcnMgb3B0aW9uYWwgYXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvcnMsIGlmIG5vdCBwYXNzZWQgZXJyb3JzIGZyb20gdGhlIGluc3RhbmNlIGFyZSB1c2VkLlxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIG9wdGlvbmFsIG9wdGlvbnMgd2l0aCBwcm9wZXJ0aWVzIGBzZXBhcmF0b3JgIGFuZCBgZGF0YVZhcmAuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGh1bWFuIHJlYWRhYmxlIHN0cmluZyB3aXRoIGFsbCBlcnJvcnMgZGVzY3JpcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGVycm9yc1RleHQoZXJyb3JzLCBvcHRpb25zKSB7XG4gIGVycm9ycyA9IGVycm9ycyB8fCB0aGlzLmVycm9ycztcbiAgaWYgKCFlcnJvcnMpIHJldHVybiAnTm8gZXJyb3JzJztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBzZXBhcmF0b3IgPSBvcHRpb25zLnNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJywgJyA6IG9wdGlvbnMuc2VwYXJhdG9yO1xuICB2YXIgZGF0YVZhciA9IG9wdGlvbnMuZGF0YVZhciA9PT0gdW5kZWZpbmVkID8gJ2RhdGEnIDogb3B0aW9ucy5kYXRhVmFyO1xuXG4gIHZhciB0ZXh0ID0gJyc7XG4gIGZvciAodmFyIGk9MDsgaTxlcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZSA9IGVycm9yc1tpXTtcbiAgICBpZiAoZSkgdGV4dCArPSBkYXRhVmFyICsgZS5kYXRhUGF0aCArICcgJyArIGUubWVzc2FnZSArIHNlcGFyYXRvcjtcbiAgfVxuICByZXR1cm4gdGV4dC5zbGljZSgwLCAtc2VwYXJhdG9yLmxlbmd0aCk7XG59XG5cblxuLyoqXG4gKiBBZGQgY3VzdG9tIGZvcm1hdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGZvcm1hdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB8RnVuY3Rpb259IGZvcm1hdCBzdHJpbmcgaXMgY29udmVydGVkIHRvIFJlZ0V4cDsgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBib29sZWFuICh0cnVlIHdoZW4gdmFsaWQpXG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiBhZGRGb3JtYXQobmFtZSwgZm9ybWF0KSB7XG4gIGlmICh0eXBlb2YgZm9ybWF0ID09ICdzdHJpbmcnKSBmb3JtYXQgPSBuZXcgUmVnRXhwKGZvcm1hdCk7XG4gIHRoaXMuX2Zvcm1hdHNbbmFtZV0gPSBmb3JtYXQ7XG4gIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIGFkZERlZmF1bHRNZXRhU2NoZW1hKHNlbGYpIHtcbiAgdmFyICRkYXRhU2NoZW1hO1xuICBpZiAoc2VsZi5fb3B0cy4kZGF0YSkge1xuICAgICRkYXRhU2NoZW1hID0gcmVxdWlyZSgnLi9yZWZzL2RhdGEuanNvbicpO1xuICAgIHNlbGYuYWRkTWV0YVNjaGVtYSgkZGF0YVNjaGVtYSwgJGRhdGFTY2hlbWEuJGlkLCB0cnVlKTtcbiAgfVxuICBpZiAoc2VsZi5fb3B0cy5tZXRhID09PSBmYWxzZSkgcmV0dXJuO1xuICB2YXIgbWV0YVNjaGVtYSA9IHJlcXVpcmUoJy4vcmVmcy9qc29uLXNjaGVtYS1kcmFmdC0wNy5qc29uJyk7XG4gIGlmIChzZWxmLl9vcHRzLiRkYXRhKSBtZXRhU2NoZW1hID0gJGRhdGFNZXRhU2NoZW1hKG1ldGFTY2hlbWEsIE1FVEFfU1VQUE9SVF9EQVRBKTtcbiAgc2VsZi5hZGRNZXRhU2NoZW1hKG1ldGFTY2hlbWEsIE1FVEFfU0NIRU1BX0lELCB0cnVlKTtcbiAgc2VsZi5fcmVmc1snaHR0cDovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWEnXSA9IE1FVEFfU0NIRU1BX0lEO1xufVxuXG5cbmZ1bmN0aW9uIGFkZEluaXRpYWxTY2hlbWFzKHNlbGYpIHtcbiAgdmFyIG9wdHNTY2hlbWFzID0gc2VsZi5fb3B0cy5zY2hlbWFzO1xuICBpZiAoIW9wdHNTY2hlbWFzKSByZXR1cm47XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdHNTY2hlbWFzKSkgc2VsZi5hZGRTY2hlbWEob3B0c1NjaGVtYXMpO1xuICBlbHNlIGZvciAodmFyIGtleSBpbiBvcHRzU2NoZW1hcykgc2VsZi5hZGRTY2hlbWEob3B0c1NjaGVtYXNba2V5XSwga2V5KTtcbn1cblxuXG5mdW5jdGlvbiBhZGRJbml0aWFsRm9ybWF0cyhzZWxmKSB7XG4gIGZvciAodmFyIG5hbWUgaW4gc2VsZi5fb3B0cy5mb3JtYXRzKSB7XG4gICAgdmFyIGZvcm1hdCA9IHNlbGYuX29wdHMuZm9ybWF0c1tuYW1lXTtcbiAgICBzZWxmLmFkZEZvcm1hdChuYW1lLCBmb3JtYXQpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gYWRkSW5pdGlhbEtleXdvcmRzKHNlbGYpIHtcbiAgZm9yICh2YXIgbmFtZSBpbiBzZWxmLl9vcHRzLmtleXdvcmRzKSB7XG4gICAgdmFyIGtleXdvcmQgPSBzZWxmLl9vcHRzLmtleXdvcmRzW25hbWVdO1xuICAgIHNlbGYuYWRkS2V5d29yZChuYW1lLCBrZXl3b3JkKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGNoZWNrVW5pcXVlKHNlbGYsIGlkKSB7XG4gIGlmIChzZWxmLl9zY2hlbWFzW2lkXSB8fCBzZWxmLl9yZWZzW2lkXSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjaGVtYSB3aXRoIGtleSBvciBpZCBcIicgKyBpZCArICdcIiBhbHJlYWR5IGV4aXN0cycpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1ldGFTY2hlbWFPcHRpb25zKHNlbGYpIHtcbiAgdmFyIG1ldGFPcHRzID0gdXRpbC5jb3B5KHNlbGYuX29wdHMpO1xuICBmb3IgKHZhciBpPTA7IGk8TUVUQV9JR05PUkVfT1BUSU9OUy5sZW5ndGg7IGkrKylcbiAgICBkZWxldGUgbWV0YU9wdHNbTUVUQV9JR05PUkVfT1BUSU9OU1tpXV07XG4gIHJldHVybiBtZXRhT3B0cztcbn1cblxuXG5mdW5jdGlvbiBzZXRMb2dnZXIoc2VsZikge1xuICB2YXIgbG9nZ2VyID0gc2VsZi5fb3B0cy5sb2dnZXI7XG4gIGlmIChsb2dnZXIgPT09IGZhbHNlKSB7XG4gICAgc2VsZi5sb2dnZXIgPSB7bG9nOiBub29wLCB3YXJuOiBub29wLCBlcnJvcjogbm9vcH07XG4gIH0gZWxzZSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSBsb2dnZXIgPSBjb25zb2xlO1xuICAgIGlmICghKHR5cGVvZiBsb2dnZXIgPT0gJ29iamVjdCcgJiYgbG9nZ2VyLmxvZyAmJiBsb2dnZXIud2FybiAmJiBsb2dnZXIuZXJyb3IpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2dnZXIgbXVzdCBpbXBsZW1lbnQgbG9nLCB3YXJuIGFuZCBlcnJvciBtZXRob2RzJyk7XG4gICAgc2VsZi5sb2dnZXIgPSBsb2dnZXI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBub29wKCkge31cbiIsICJmdW5jdGlvbiBIQVJFcnJvciAoZXJyb3JzKSB7XG4gIHZhciBtZXNzYWdlID0gJ3ZhbGlkYXRpb24gZmFpbGVkJ1xuXG4gIHRoaXMubmFtZSA9ICdIQVJFcnJvcidcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZVxuICB0aGlzLmVycm9ycyA9IGVycm9yc1xuXG4gIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKG1lc3NhZ2UpKS5zdGFja1xuICB9XG59XG5cbkhBUkVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhBUkVycm9yXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZnRlclJlcXVlc3Q6IHJlcXVpcmUoJy4vYWZ0ZXJSZXF1ZXN0Lmpzb24nKSxcbiAgYmVmb3JlUmVxdWVzdDogcmVxdWlyZSgnLi9iZWZvcmVSZXF1ZXN0Lmpzb24nKSxcbiAgYnJvd3NlcjogcmVxdWlyZSgnLi9icm93c2VyLmpzb24nKSxcbiAgY2FjaGU6IHJlcXVpcmUoJy4vY2FjaGUuanNvbicpLFxuICBjb250ZW50OiByZXF1aXJlKCcuL2NvbnRlbnQuanNvbicpLFxuICBjb29raWU6IHJlcXVpcmUoJy4vY29va2llLmpzb24nKSxcbiAgY3JlYXRvcjogcmVxdWlyZSgnLi9jcmVhdG9yLmpzb24nKSxcbiAgZW50cnk6IHJlcXVpcmUoJy4vZW50cnkuanNvbicpLFxuICBoYXI6IHJlcXVpcmUoJy4vaGFyLmpzb24nKSxcbiAgaGVhZGVyOiByZXF1aXJlKCcuL2hlYWRlci5qc29uJyksXG4gIGxvZzogcmVxdWlyZSgnLi9sb2cuanNvbicpLFxuICBwYWdlOiByZXF1aXJlKCcuL3BhZ2UuanNvbicpLFxuICBwYWdlVGltaW5nczogcmVxdWlyZSgnLi9wYWdlVGltaW5ncy5qc29uJyksXG4gIHBvc3REYXRhOiByZXF1aXJlKCcuL3Bvc3REYXRhLmpzb24nKSxcbiAgcXVlcnk6IHJlcXVpcmUoJy4vcXVlcnkuanNvbicpLFxuICByZXF1ZXN0OiByZXF1aXJlKCcuL3JlcXVlc3QuanNvbicpLFxuICByZXNwb25zZTogcmVxdWlyZSgnLi9yZXNwb25zZS5qc29uJyksXG4gIHRpbWluZ3M6IHJlcXVpcmUoJy4vdGltaW5ncy5qc29uJylcbn1cbiIsICJ2YXIgQWp2ID0gcmVxdWlyZSgnYWp2JylcbnZhciBIQVJFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3InKVxudmFyIHNjaGVtYXMgPSByZXF1aXJlKCdoYXItc2NoZW1hJylcblxudmFyIGFqdlxuXG5mdW5jdGlvbiBjcmVhdGVBanZJbnN0YW5jZSAoKSB7XG4gIHZhciBhanYgPSBuZXcgQWp2KHtcbiAgICBhbGxFcnJvcnM6IHRydWVcbiAgfSlcbiAgYWp2LmFkZE1ldGFTY2hlbWEocmVxdWlyZSgnYWp2L2xpYi9yZWZzL2pzb24tc2NoZW1hLWRyYWZ0LTA2Lmpzb24nKSlcbiAgYWp2LmFkZFNjaGVtYShzY2hlbWFzKVxuXG4gIHJldHVybiBhanZcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGUgKG5hbWUsIGRhdGEpIHtcbiAgZGF0YSA9IGRhdGEgfHwge31cblxuICAvLyB2YWxpZGF0b3IgY29uZmlnXG4gIGFqdiA9IGFqdiB8fCBjcmVhdGVBanZJbnN0YW5jZSgpXG5cbiAgdmFyIHZhbGlkYXRlID0gYWp2LmdldFNjaGVtYShuYW1lICsgJy5qc29uJylcblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciB2YWxpZCA9IHZhbGlkYXRlKGRhdGEpXG5cbiAgICAhdmFsaWQgPyByZWplY3QobmV3IEhBUkVycm9yKHZhbGlkYXRlLmVycm9ycykpIDogcmVzb2x2ZShkYXRhKVxuICB9KVxufVxuXG5leHBvcnRzLmFmdGVyUmVxdWVzdCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnYWZ0ZXJSZXF1ZXN0JywgZGF0YSlcbn1cblxuZXhwb3J0cy5iZWZvcmVSZXF1ZXN0ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdiZWZvcmVSZXF1ZXN0JywgZGF0YSlcbn1cblxuZXhwb3J0cy5icm93c2VyID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdicm93c2VyJywgZGF0YSlcbn1cblxuZXhwb3J0cy5jYWNoZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnY2FjaGUnLCBkYXRhKVxufVxuXG5leHBvcnRzLmNvbnRlbnQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ2NvbnRlbnQnLCBkYXRhKVxufVxuXG5leHBvcnRzLmNvb2tpZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnY29va2llJywgZGF0YSlcbn1cblxuZXhwb3J0cy5jcmVhdG9yID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdjcmVhdG9yJywgZGF0YSlcbn1cblxuZXhwb3J0cy5lbnRyeSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnZW50cnknLCBkYXRhKVxufVxuXG5leHBvcnRzLmhhciA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnaGFyJywgZGF0YSlcbn1cblxuZXhwb3J0cy5oZWFkZXIgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ2hlYWRlcicsIGRhdGEpXG59XG5cbmV4cG9ydHMubG9nID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdsb2cnLCBkYXRhKVxufVxuXG5leHBvcnRzLnBhZ2UgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ3BhZ2UnLCBkYXRhKVxufVxuXG5leHBvcnRzLnBhZ2VUaW1pbmdzID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdwYWdlVGltaW5ncycsIGRhdGEpXG59XG5cbmV4cG9ydHMucG9zdERhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ3Bvc3REYXRhJywgZGF0YSlcbn1cblxuZXhwb3J0cy5xdWVyeSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgncXVlcnknLCBkYXRhKVxufVxuXG5leHBvcnRzLnJlcXVlc3QgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ3JlcXVlc3QnLCBkYXRhKVxufVxuXG5leHBvcnRzLnJlc3BvbnNlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdyZXNwb25zZScsIGRhdGEpXG59XG5cbmV4cG9ydHMudGltaW5ncyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgndGltaW5ncycsIGRhdGEpXG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBxcyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJylcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ2hhci12YWxpZGF0b3InKVxudmFyIGV4dGVuZCA9IHJlcXVpcmUoJ2V4dGVuZCcpXG5cbmZ1bmN0aW9uIEhhciAocmVxdWVzdCkge1xuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG59XG5cbkhhci5wcm90b3R5cGUucmVkdWNlciA9IGZ1bmN0aW9uIChvYmosIHBhaXIpIHtcbiAgLy8gbmV3IHByb3BlcnR5ID9cbiAgaWYgKG9ialtwYWlyLm5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICBvYmpbcGFpci5uYW1lXSA9IHBhaXIudmFsdWVcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICAvLyBleGlzdGluZz8gY29udmVydCB0byBhcnJheVxuICB2YXIgYXJyID0gW1xuICAgIG9ialtwYWlyLm5hbWVdLFxuICAgIHBhaXIudmFsdWVcbiAgXVxuXG4gIG9ialtwYWlyLm5hbWVdID0gYXJyXG5cbiAgcmV0dXJuIG9ialxufVxuXG5IYXIucHJvdG90eXBlLnByZXAgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAvLyBjb25zdHJ1Y3QgdXRpbGl0eSBwcm9wZXJ0aWVzXG4gIGRhdGEucXVlcnlPYmogPSB7fVxuICBkYXRhLmhlYWRlcnNPYmogPSB7fVxuICBkYXRhLnBvc3REYXRhLmpzb25PYmogPSBmYWxzZVxuICBkYXRhLnBvc3REYXRhLnBhcmFtc09iaiA9IGZhbHNlXG5cbiAgLy8gY29uc3RydWN0IHF1ZXJ5IG9iamVjdHNcbiAgaWYgKGRhdGEucXVlcnlTdHJpbmcgJiYgZGF0YS5xdWVyeVN0cmluZy5sZW5ndGgpIHtcbiAgICBkYXRhLnF1ZXJ5T2JqID0gZGF0YS5xdWVyeVN0cmluZy5yZWR1Y2UodGhpcy5yZWR1Y2VyLCB7fSlcbiAgfVxuXG4gIC8vIGNvbnN0cnVjdCBoZWFkZXJzIG9iamVjdHNcbiAgaWYgKGRhdGEuaGVhZGVycyAmJiBkYXRhLmhlYWRlcnMubGVuZ3RoKSB7XG4gICAgLy8gbG93ZUNhc2UgaGVhZGVyIGtleXNcbiAgICBkYXRhLmhlYWRlcnNPYmogPSBkYXRhLmhlYWRlcnMucmVkdWNlUmlnaHQoZnVuY3Rpb24gKGhlYWRlcnMsIGhlYWRlcikge1xuICAgICAgaGVhZGVyc1toZWFkZXIubmFtZV0gPSBoZWFkZXIudmFsdWVcbiAgICAgIHJldHVybiBoZWFkZXJzXG4gICAgfSwge30pXG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgQ29va2llIGhlYWRlclxuICBpZiAoZGF0YS5jb29raWVzICYmIGRhdGEuY29va2llcy5sZW5ndGgpIHtcbiAgICB2YXIgY29va2llcyA9IGRhdGEuY29va2llcy5tYXAoZnVuY3Rpb24gKGNvb2tpZSkge1xuICAgICAgcmV0dXJuIGNvb2tpZS5uYW1lICsgJz0nICsgY29va2llLnZhbHVlXG4gICAgfSlcblxuICAgIGlmIChjb29raWVzLmxlbmd0aCkge1xuICAgICAgZGF0YS5oZWFkZXJzT2JqLmNvb2tpZSA9IGNvb2tpZXMuam9pbignOyAnKVxuICAgIH1cbiAgfVxuXG4gIC8vIHByZXAgYm9keVxuICBmdW5jdGlvbiBzb21lIChhcnIpIHtcbiAgICByZXR1cm4gYXJyLnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHJldHVybiBkYXRhLnBvc3REYXRhLm1pbWVUeXBlLmluZGV4T2YodHlwZSkgPT09IDBcbiAgICB9KVxuICB9XG5cbiAgaWYgKHNvbWUoW1xuICAgICdtdWx0aXBhcnQvbWl4ZWQnLFxuICAgICdtdWx0aXBhcnQvcmVsYXRlZCcsXG4gICAgJ211bHRpcGFydC9mb3JtLWRhdGEnLFxuICAgICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmUnXSkpIHtcbiAgICAvLyByZXNldCB2YWx1ZXNcbiAgICBkYXRhLnBvc3REYXRhLm1pbWVUeXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gIH0gZWxzZSBpZiAoc29tZShbXG4gICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCddKSkge1xuICAgIGlmICghZGF0YS5wb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgIGRhdGEucG9zdERhdGEudGV4dCA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEucG9zdERhdGEucGFyYW1zT2JqID0gZGF0YS5wb3N0RGF0YS5wYXJhbXMucmVkdWNlKHRoaXMucmVkdWNlciwge30pXG5cbiAgICAgIC8vIGFsd2F5cyBvdmVyd3JpdGVcbiAgICAgIGRhdGEucG9zdERhdGEudGV4dCA9IHFzLnN0cmluZ2lmeShkYXRhLnBvc3REYXRhLnBhcmFtc09iailcbiAgICB9XG4gIH0gZWxzZSBpZiAoc29tZShbXG4gICAgJ3RleHQvanNvbicsXG4gICAgJ3RleHQveC1qc29uJyxcbiAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgJ2FwcGxpY2F0aW9uL3gtanNvbiddKSkge1xuICAgIGRhdGEucG9zdERhdGEubWltZVR5cGUgPSAnYXBwbGljYXRpb24vanNvbidcblxuICAgIGlmIChkYXRhLnBvc3REYXRhLnRleHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEucG9zdERhdGEuanNvbk9iaiA9IEpTT04ucGFyc2UoZGF0YS5wb3N0RGF0YS50ZXh0KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QuZGVidWcoZSlcblxuICAgICAgICAvLyBmb3JjZSBiYWNrIHRvIHRleHQvcGxhaW5cbiAgICAgICAgZGF0YS5wb3N0RGF0YS5taW1lVHlwZSA9ICd0ZXh0L3BsYWluJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhXG59XG5cbkhhci5wcm90b3R5cGUub3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIC8vIHNraXAgaWYgbm8gaGFyIHByb3BlcnR5IGRlZmluZWRcbiAgaWYgKCFvcHRpb25zLmhhcikge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICB2YXIgaGFyID0ge31cbiAgZXh0ZW5kKGhhciwgb3B0aW9ucy5oYXIpXG5cbiAgLy8gb25seSBwcm9jZXNzIHRoZSBmaXJzdCBlbnRyeVxuICBpZiAoaGFyLmxvZyAmJiBoYXIubG9nLmVudHJpZXMpIHtcbiAgICBoYXIgPSBoYXIubG9nLmVudHJpZXNbMF1cbiAgfVxuXG4gIC8vIGFkZCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIG1ha2UgdmFsaWRhdGlvbiBzdWNjZXNzZnVsXG4gIGhhci51cmwgPSBoYXIudXJsIHx8IG9wdGlvbnMudXJsIHx8IG9wdGlvbnMudXJpIHx8IG9wdGlvbnMuYmFzZVVybCB8fCAnLydcbiAgaGFyLmh0dHBWZXJzaW9uID0gaGFyLmh0dHBWZXJzaW9uIHx8ICdIVFRQLzEuMSdcbiAgaGFyLnF1ZXJ5U3RyaW5nID0gaGFyLnF1ZXJ5U3RyaW5nIHx8IFtdXG4gIGhhci5oZWFkZXJzID0gaGFyLmhlYWRlcnMgfHwgW11cbiAgaGFyLmNvb2tpZXMgPSBoYXIuY29va2llcyB8fCBbXVxuICBoYXIucG9zdERhdGEgPSBoYXIucG9zdERhdGEgfHwge31cbiAgaGFyLnBvc3REYXRhLm1pbWVUeXBlID0gaGFyLnBvc3REYXRhLm1pbWVUeXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG5cbiAgaGFyLmJvZHlTaXplID0gMFxuICBoYXIuaGVhZGVyc1NpemUgPSAwXG4gIGhhci5wb3N0RGF0YS5zaXplID0gMFxuXG4gIGlmICghdmFsaWRhdGUucmVxdWVzdChoYXIpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG4gIC8vIGNsZWFuIHVwIGFuZCBnZXQgc29tZSB1dGlsaXR5IHByb3BlcnRpZXNcbiAgdmFyIHJlcSA9IHRoaXMucHJlcChoYXIpXG5cbiAgLy8gY29uc3RydWN0IG5ldyBvcHRpb25zXG4gIGlmIChyZXEudXJsKSB7XG4gICAgb3B0aW9ucy51cmwgPSByZXEudXJsXG4gIH1cblxuICBpZiAocmVxLm1ldGhvZCkge1xuICAgIG9wdGlvbnMubWV0aG9kID0gcmVxLm1ldGhvZFxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHJlcS5xdWVyeU9iaikubGVuZ3RoKSB7XG4gICAgb3B0aW9ucy5xcyA9IHJlcS5xdWVyeU9ialxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHJlcS5oZWFkZXJzT2JqKS5sZW5ndGgpIHtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSByZXEuaGVhZGVyc09ialxuICB9XG5cbiAgZnVuY3Rpb24gdGVzdCAodHlwZSkge1xuICAgIHJldHVybiByZXEucG9zdERhdGEubWltZVR5cGUuaW5kZXhPZih0eXBlKSA9PT0gMFxuICB9XG4gIGlmICh0ZXN0KCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSkge1xuICAgIG9wdGlvbnMuZm9ybSA9IHJlcS5wb3N0RGF0YS5wYXJhbXNPYmpcbiAgfSBlbHNlIGlmICh0ZXN0KCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICBpZiAocmVxLnBvc3REYXRhLmpzb25PYmopIHtcbiAgICAgIG9wdGlvbnMuYm9keSA9IHJlcS5wb3N0RGF0YS5qc29uT2JqXG4gICAgICBvcHRpb25zLmpzb24gPSB0cnVlXG4gICAgfVxuICB9IGVsc2UgaWYgKHRlc3QoJ211bHRpcGFydC9mb3JtLWRhdGEnKSkge1xuICAgIG9wdGlvbnMuZm9ybURhdGEgPSB7fVxuXG4gICAgcmVxLnBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgdmFyIGF0dGFjaG1lbnQgPSB7fVxuXG4gICAgICBpZiAoIXBhcmFtLmZpbGVOYW1lICYmICFwYXJhbS5jb250ZW50VHlwZSkge1xuICAgICAgICBvcHRpb25zLmZvcm1EYXRhW3BhcmFtLm5hbWVdID0gcGFyYW0udmFsdWVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIGF0dGVtcHQgdG8gcmVhZCBmcm9tIGRpc2shXG4gICAgICBpZiAocGFyYW0uZmlsZU5hbWUgJiYgIXBhcmFtLnZhbHVlKSB7XG4gICAgICAgIGF0dGFjaG1lbnQudmFsdWUgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhcmFtLmZpbGVOYW1lKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbS52YWx1ZSkge1xuICAgICAgICBhdHRhY2htZW50LnZhbHVlID0gcGFyYW0udmFsdWVcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtLmZpbGVOYW1lKSB7XG4gICAgICAgIGF0dGFjaG1lbnQub3B0aW9ucyA9IHtcbiAgICAgICAgICBmaWxlbmFtZTogcGFyYW0uZmlsZU5hbWUsXG4gICAgICAgICAgY29udGVudFR5cGU6IHBhcmFtLmNvbnRlbnRUeXBlID8gcGFyYW0uY29udGVudFR5cGUgOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5mb3JtRGF0YVtwYXJhbS5uYW1lXSA9IGF0dGFjaG1lbnRcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGlmIChyZXEucG9zdERhdGEudGV4dCkge1xuICAgICAgb3B0aW9ucy5ib2R5ID0gcmVxLnBvc3REYXRhLnRleHRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5leHBvcnRzLkhhciA9IEhhclxuIiwgIi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuICBJbiB0aGVcbi8vIGJyb3dzZXIgdGhpcyBpcyBhIGxpdHRsZSBjb21wbGljYXRlZCBkdWUgdG8gdW5rbm93biBxdWFsaXR5IG9mIE1hdGgucmFuZG9tKClcbi8vIGFuZCBpbmNvbnNpc3RlbnQgc3VwcG9ydCBmb3IgdGhlIGBjcnlwdG9gIEFQSS4gIFdlIGRvIHRoZSBiZXN0IHdlIGNhbiB2aWFcbi8vIGZlYXR1cmUtZGV0ZWN0aW9uXG5cbi8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0b1xuLy8gaW1wbGVtZW50YXRpb24uIEFsc28sIGZpbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGNyeXB0byBvbiBJRTExLlxudmFyIGdldFJhbmRvbVZhbHVlcyA9ICh0eXBlb2YoY3J5cHRvKSAhPSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YobXNDcnlwdG8pICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09ICdmdW5jdGlvbicgJiYgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pKTtcblxuaWYgKGdldFJhbmRvbVZhbHVlcykge1xuICAvLyBXSEFUV0cgY3J5cHRvIFJORyAtIGh0dHA6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9DcnlwdG9cbiAgdmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3aGF0d2dSTkcoKSB7XG4gICAgZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbiAgICByZXR1cm4gcm5kczg7XG4gIH07XG59IGVsc2Uge1xuICAvLyBNYXRoLnJhbmRvbSgpLWJhc2VkIChSTkcpXG4gIC8vXG4gIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgTWF0aC5yYW5kb20oKS4gIEl0J3MgZmFzdCwgYnV0IGlzIG9mIHVuc3BlY2lmaWVkXG4gIC8vIHF1YWxpdHkuXG4gIHZhciBybmRzID0gbmV3IEFycmF5KDE2KTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1hdGhSTkcoKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHI7IGkgPCAxNjsgaSsrKSB7XG4gICAgICBpZiAoKGkgJiAweDAzKSA9PT0gMCkgciA9IE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMDtcbiAgICAgIHJuZHNbaV0gPSByID4+PiAoKGkgJiAweDAzKSA8PCAzKSAmIDB4ZmY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJuZHM7XG4gIH07XG59XG4iLCAiLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG52YXIgYnl0ZVRvSGV4ID0gW107XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleFtpXSA9IChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzVG9VdWlkKGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gb2Zmc2V0IHx8IDA7XG4gIHZhciBidGggPSBieXRlVG9IZXg7XG4gIC8vIGpvaW4gdXNlZCB0byBmaXggbWVtb3J5IGlzc3VlIGNhdXNlZCBieSBjb25jYXRlbmF0aW9uOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMTc1I2M0XG4gIHJldHVybiAoW1xuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dXG4gIF0pLmpvaW4oJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ5dGVzVG9VdWlkO1xuIiwgInZhciBybmcgPSByZXF1aXJlKCcuL2xpYi9ybmcnKTtcbnZhciBieXRlc1RvVXVpZCA9IHJlcXVpcmUoJy4vbGliL2J5dGVzVG9VdWlkJyk7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuXG4gIGlmICh0eXBlb2Yob3B0aW9ucykgPT0gJ3N0cmluZycpIHtcbiAgICBidWYgPSBvcHRpb25zID09PSAnYmluYXJ5JyA/IG5ldyBBcnJheSgxNikgOiBudWxsO1xuICAgIG9wdGlvbnMgPSBudWxsO1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTtcblxuICAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG4gIHJuZHNbNl0gPSAocm5kc1s2XSAmIDB4MGYpIHwgMHg0MDtcbiAgcm5kc1s4XSA9IChybmRzWzhdICYgMHgzZikgfCAweDgwO1xuXG4gIC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuICBpZiAoYnVmKSB7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IDE2OyArK2lpKSB7XG4gICAgICBidWZbaSArIGlpXSA9IHJuZHNbaWldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWYgfHwgYnl0ZXNUb1V1aWQocm5kcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdjQ7XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBjYXNlbGVzcyA9IHJlcXVpcmUoJ2Nhc2VsZXNzJylcbnZhciB1dWlkID0gcmVxdWlyZSgndXVpZC92NCcpXG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpXG5cbnZhciBtZDUgPSBoZWxwZXJzLm1kNVxudmFyIHRvQmFzZTY0ID0gaGVscGVycy50b0Jhc2U2NFxuXG5mdW5jdGlvbiBBdXRoIChyZXF1ZXN0KSB7XG4gIC8vIGRlZmluZSBhbGwgcHVibGljIHByb3BlcnRpZXMgaGVyZVxuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gIHRoaXMuaGFzQXV0aCA9IGZhbHNlXG4gIHRoaXMuc2VudEF1dGggPSBmYWxzZVxuICB0aGlzLmJlYXJlclRva2VuID0gbnVsbFxuICB0aGlzLnVzZXIgPSBudWxsXG4gIHRoaXMucGFzcyA9IG51bGxcbn1cblxuQXV0aC5wcm90b3R5cGUuYmFzaWMgPSBmdW5jdGlvbiAodXNlciwgcGFzcywgc2VuZEltbWVkaWF0ZWx5KSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAodHlwZW9mIHVzZXIgIT09ICdzdHJpbmcnIHx8IChwYXNzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhc3MgIT09ICdzdHJpbmcnKSkge1xuICAgIHNlbGYucmVxdWVzdC5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignYXV0aCgpIHJlY2VpdmVkIGludmFsaWQgdXNlciBvciBwYXNzd29yZCcpKVxuICB9XG4gIHNlbGYudXNlciA9IHVzZXJcbiAgc2VsZi5wYXNzID0gcGFzc1xuICBzZWxmLmhhc0F1dGggPSB0cnVlXG4gIHZhciBoZWFkZXIgPSB1c2VyICsgJzonICsgKHBhc3MgfHwgJycpXG4gIGlmIChzZW5kSW1tZWRpYXRlbHkgfHwgdHlwZW9mIHNlbmRJbW1lZGlhdGVseSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgYXV0aEhlYWRlciA9ICdCYXNpYyAnICsgdG9CYXNlNjQoaGVhZGVyKVxuICAgIHNlbGYuc2VudEF1dGggPSB0cnVlXG4gICAgcmV0dXJuIGF1dGhIZWFkZXJcbiAgfVxufVxuXG5BdXRoLnByb3RvdHlwZS5iZWFyZXIgPSBmdW5jdGlvbiAoYmVhcmVyLCBzZW5kSW1tZWRpYXRlbHkpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYuYmVhcmVyVG9rZW4gPSBiZWFyZXJcbiAgc2VsZi5oYXNBdXRoID0gdHJ1ZVxuICBpZiAoc2VuZEltbWVkaWF0ZWx5IHx8IHR5cGVvZiBzZW5kSW1tZWRpYXRlbHkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBiZWFyZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJlYXJlciA9IGJlYXJlcigpXG4gICAgfVxuICAgIHZhciBhdXRoSGVhZGVyID0gJ0JlYXJlciAnICsgKGJlYXJlciB8fCAnJylcbiAgICBzZWxmLnNlbnRBdXRoID0gdHJ1ZVxuICAgIHJldHVybiBhdXRoSGVhZGVyXG4gIH1cbn1cblxuQXV0aC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgYXV0aEhlYWRlcikge1xuICAvLyBUT0RPOiBNb3JlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIFJGQyAyNjE3LlxuICAvLyAgIC0gaGFuZGxlIGNoYWxsZW5nZS5kb21haW5cbiAgLy8gICAtIHN1cHBvcnQgcW9wPVwiYXV0aC1pbnRcIiBvbmx5XG4gIC8vICAgLSBoYW5kbGUgQXV0aGVudGljYXRpb24tSW5mbyAobm90IG5lY2Vzc2FyaWx5PylcbiAgLy8gICAtIGNoZWNrIGNoYWxsZW5nZS5zdGFsZSAobm90IG5lY2Vzc2FyaWx5PylcbiAgLy8gICAtIGluY3JlYXNlIG5jIChub3QgbmVjZXNzYXJpbHk/KVxuICAvLyBGb3IgcmVmZXJlbmNlOlxuICAvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNjE3I3NlY3Rpb24tM1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmFnZGVyL2N1cmwvYmxvYi9tYXN0ZXIvbGliL2h0dHBfZGlnZXN0LmNcblxuICB2YXIgc2VsZiA9IHRoaXNcblxuICB2YXIgY2hhbGxlbmdlID0ge31cbiAgdmFyIHJlID0gLyhbYS16MC05Xy1dKyk9KD86XCIoW15cIl0rKVwifChbYS16MC05Xy1dKykpL2dpXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG1hdGNoID0gcmUuZXhlYyhhdXRoSGVhZGVyKVxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNoYWxsZW5nZVttYXRjaFsxXV0gPSBtYXRjaFsyXSB8fCBtYXRjaFszXVxuICB9XG5cbiAgLyoqXG4gICAqIFJGQyAyNjE3OiBoYW5kbGUgYm90aCBNRDUgYW5kIE1ENS1zZXNzIGFsZ29yaXRobXMuXG4gICAqXG4gICAqIElmIHRoZSBhbGdvcml0aG0gZGlyZWN0aXZlJ3MgdmFsdWUgaXMgXCJNRDVcIiBvciB1bnNwZWNpZmllZCwgdGhlbiBIQTEgaXNcbiAgICogICBIQTE9TUQ1KHVzZXJuYW1lOnJlYWxtOnBhc3N3b3JkKVxuICAgKiBJZiB0aGUgYWxnb3JpdGhtIGRpcmVjdGl2ZSdzIHZhbHVlIGlzIFwiTUQ1LXNlc3NcIiwgdGhlbiBIQTEgaXNcbiAgICogICBIQTE9TUQ1KE1ENSh1c2VybmFtZTpyZWFsbTpwYXNzd29yZCk6bm9uY2U6Y25vbmNlKVxuICAgKi9cbiAgdmFyIGhhMUNvbXB1dGUgPSBmdW5jdGlvbiAoYWxnb3JpdGhtLCB1c2VyLCByZWFsbSwgcGFzcywgbm9uY2UsIGNub25jZSkge1xuICAgIHZhciBoYTEgPSBtZDUodXNlciArICc6JyArIHJlYWxtICsgJzonICsgcGFzcylcbiAgICBpZiAoYWxnb3JpdGhtICYmIGFsZ29yaXRobS50b0xvd2VyQ2FzZSgpID09PSAnbWQ1LXNlc3MnKSB7XG4gICAgICByZXR1cm4gbWQ1KGhhMSArICc6JyArIG5vbmNlICsgJzonICsgY25vbmNlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaGExXG4gICAgfVxuICB9XG5cbiAgdmFyIHFvcCA9IC8oXnwsKVxccyphdXRoXFxzKigkfCwpLy50ZXN0KGNoYWxsZW5nZS5xb3ApICYmICdhdXRoJ1xuICB2YXIgbmMgPSBxb3AgJiYgJzAwMDAwMDAxJ1xuICB2YXIgY25vbmNlID0gcW9wICYmIHV1aWQoKS5yZXBsYWNlKC8tL2csICcnKVxuICB2YXIgaGExID0gaGExQ29tcHV0ZShjaGFsbGVuZ2UuYWxnb3JpdGhtLCBzZWxmLnVzZXIsIGNoYWxsZW5nZS5yZWFsbSwgc2VsZi5wYXNzLCBjaGFsbGVuZ2Uubm9uY2UsIGNub25jZSlcbiAgdmFyIGhhMiA9IG1kNShtZXRob2QgKyAnOicgKyBwYXRoKVxuICB2YXIgZGlnZXN0UmVzcG9uc2UgPSBxb3BcbiAgICA/IG1kNShoYTEgKyAnOicgKyBjaGFsbGVuZ2Uubm9uY2UgKyAnOicgKyBuYyArICc6JyArIGNub25jZSArICc6JyArIHFvcCArICc6JyArIGhhMilcbiAgICA6IG1kNShoYTEgKyAnOicgKyBjaGFsbGVuZ2Uubm9uY2UgKyAnOicgKyBoYTIpXG4gIHZhciBhdXRoVmFsdWVzID0ge1xuICAgIHVzZXJuYW1lOiBzZWxmLnVzZXIsXG4gICAgcmVhbG06IGNoYWxsZW5nZS5yZWFsbSxcbiAgICBub25jZTogY2hhbGxlbmdlLm5vbmNlLFxuICAgIHVyaTogcGF0aCxcbiAgICBxb3A6IHFvcCxcbiAgICByZXNwb25zZTogZGlnZXN0UmVzcG9uc2UsXG4gICAgbmM6IG5jLFxuICAgIGNub25jZTogY25vbmNlLFxuICAgIGFsZ29yaXRobTogY2hhbGxlbmdlLmFsZ29yaXRobSxcbiAgICBvcGFxdWU6IGNoYWxsZW5nZS5vcGFxdWVcbiAgfVxuXG4gIGF1dGhIZWFkZXIgPSBbXVxuICBmb3IgKHZhciBrIGluIGF1dGhWYWx1ZXMpIHtcbiAgICBpZiAoYXV0aFZhbHVlc1trXSkge1xuICAgICAgaWYgKGsgPT09ICdxb3AnIHx8IGsgPT09ICduYycgfHwgayA9PT0gJ2FsZ29yaXRobScpIHtcbiAgICAgICAgYXV0aEhlYWRlci5wdXNoKGsgKyAnPScgKyBhdXRoVmFsdWVzW2tdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXV0aEhlYWRlci5wdXNoKGsgKyAnPVwiJyArIGF1dGhWYWx1ZXNba10gKyAnXCInKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhdXRoSGVhZGVyID0gJ0RpZ2VzdCAnICsgYXV0aEhlYWRlci5qb2luKCcsICcpXG4gIHNlbGYuc2VudEF1dGggPSB0cnVlXG4gIHJldHVybiBhdXRoSGVhZGVyXG59XG5cbkF1dGgucHJvdG90eXBlLm9uUmVxdWVzdCA9IGZ1bmN0aW9uICh1c2VyLCBwYXNzLCBzZW5kSW1tZWRpYXRlbHksIGJlYXJlcikge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHJlcXVlc3QgPSBzZWxmLnJlcXVlc3RcblxuICB2YXIgYXV0aEhlYWRlclxuICBpZiAoYmVhcmVyID09PSB1bmRlZmluZWQgJiYgdXNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc2VsZi5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyBhdXRoIG1lY2hhbmlzbSBkZWZpbmVkJykpXG4gIH0gZWxzZSBpZiAoYmVhcmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhdXRoSGVhZGVyID0gc2VsZi5iZWFyZXIoYmVhcmVyLCBzZW5kSW1tZWRpYXRlbHkpXG4gIH0gZWxzZSB7XG4gICAgYXV0aEhlYWRlciA9IHNlbGYuYmFzaWModXNlciwgcGFzcywgc2VuZEltbWVkaWF0ZWx5KVxuICB9XG4gIGlmIChhdXRoSGVhZGVyKSB7XG4gICAgcmVxdWVzdC5zZXRIZWFkZXIoJ2F1dGhvcml6YXRpb24nLCBhdXRoSGVhZGVyKVxuICB9XG59XG5cbkF1dGgucHJvdG90eXBlLm9uUmVzcG9uc2UgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciByZXF1ZXN0ID0gc2VsZi5yZXF1ZXN0XG5cbiAgaWYgKCFzZWxmLmhhc0F1dGggfHwgc2VsZi5zZW50QXV0aCkgeyByZXR1cm4gbnVsbCB9XG5cbiAgdmFyIGMgPSBjYXNlbGVzcyhyZXNwb25zZS5oZWFkZXJzKVxuXG4gIHZhciBhdXRoSGVhZGVyID0gYy5nZXQoJ3d3dy1hdXRoZW50aWNhdGUnKVxuICB2YXIgYXV0aFZlcmIgPSBhdXRoSGVhZGVyICYmIGF1dGhIZWFkZXIuc3BsaXQoJyAnKVswXS50b0xvd2VyQ2FzZSgpXG4gIHJlcXVlc3QuZGVidWcoJ3JlYXV0aCcsIGF1dGhWZXJiKVxuXG4gIHN3aXRjaCAoYXV0aFZlcmIpIHtcbiAgICBjYXNlICdiYXNpYyc6XG4gICAgICByZXR1cm4gc2VsZi5iYXNpYyhzZWxmLnVzZXIsIHNlbGYucGFzcywgdHJ1ZSlcblxuICAgIGNhc2UgJ2JlYXJlcic6XG4gICAgICByZXR1cm4gc2VsZi5iZWFyZXIoc2VsZi5iZWFyZXJUb2tlbiwgdHJ1ZSlcblxuICAgIGNhc2UgJ2RpZ2VzdCc6XG4gICAgICByZXR1cm4gc2VsZi5kaWdlc3QocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QucGF0aCwgYXV0aEhlYWRlcilcbiAgfVxufVxuXG5leHBvcnRzLkF1dGggPSBBdXRoXG4iLCAidmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG5cbmZ1bmN0aW9uIHNoYSAoa2V5LCBib2R5LCBhbGdvcml0aG0pIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIbWFjKGFsZ29yaXRobSwga2V5KS51cGRhdGUoYm9keSkuZGlnZXN0KCdiYXNlNjQnKVxufVxuXG5mdW5jdGlvbiByc2EgKGtleSwgYm9keSkge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEExJykudXBkYXRlKGJvZHkpLnNpZ24oa2V5LCAnYmFzZTY0Jylcbn1cblxuZnVuY3Rpb24gcmZjMzk4NiAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKVxuICAgIC5yZXBsYWNlKC8hL2csJyUyMScpXG4gICAgLnJlcGxhY2UoL1xcKi9nLCclMkEnKVxuICAgIC5yZXBsYWNlKC9cXCgvZywnJTI4JylcbiAgICAucmVwbGFjZSgvXFwpL2csJyUyOScpXG4gICAgLnJlcGxhY2UoLycvZywnJTI3Jylcbn1cblxuLy8gTWFwcyBvYmplY3QgdG8gYmktZGltZW5zaW9uYWwgYXJyYXlcbi8vIENvbnZlcnRzIHsgZm9vOiAnQScsIGJhcjogWyAnYicsICdCJyBdfSB0b1xuLy8gWyBbJ2ZvbycsICdBJ10sIFsnYmFyJywgJ2InXSwgWydiYXInLCAnQiddIF1cbmZ1bmN0aW9uIG1hcCAob2JqKSB7XG4gIHZhciBrZXksIHZhbCwgYXJyID0gW11cbiAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgdmFsID0gb2JqW2tleV1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspXG4gICAgICAgIGFyci5wdXNoKFtrZXksIHZhbFtpXV0pXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpXG4gICAgICBmb3IgKHZhciBwcm9wIGluIHZhbClcbiAgICAgICAgYXJyLnB1c2goW2tleSArICdbJyArIHByb3AgKyAnXScsIHZhbFtwcm9wXV0pXG4gICAgZWxzZVxuICAgICAgYXJyLnB1c2goW2tleSwgdmFsXSlcbiAgfVxuICByZXR1cm4gYXJyXG59XG5cbi8vIENvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnRcbmZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQmFzZSAoaHR0cE1ldGhvZCwgYmFzZV91cmksIHBhcmFtcykge1xuICAvLyBhZGFwdGVkIGZyb20gaHR0cHM6Ly9kZXYudHdpdHRlci5jb20vZG9jcy9hdXRoL29hdXRoIGFuZCBcbiAgLy8gaHR0cHM6Ly9kZXYudHdpdHRlci5jb20vZG9jcy9hdXRoL2NyZWF0aW5nLXNpZ25hdHVyZVxuXG4gIC8vIFBhcmFtZXRlciBub3JtYWxpemF0aW9uXG4gIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU4NDkjc2VjdGlvbi0zLjQuMS4zLjJcbiAgdmFyIG5vcm1hbGl6ZWQgPSBtYXAocGFyYW1zKVxuICAvLyAxLiAgRmlyc3QsIHRoZSBuYW1lIGFuZCB2YWx1ZSBvZiBlYWNoIHBhcmFtZXRlciBhcmUgZW5jb2RlZFxuICAubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIFsgcmZjMzk4NihwWzBdKSwgcmZjMzk4NihwWzFdIHx8ICcnKSBdXG4gIH0pXG4gIC8vIDIuICBUaGUgcGFyYW1ldGVycyBhcmUgc29ydGVkIGJ5IG5hbWUsIHVzaW5nIGFzY2VuZGluZyBieXRlIHZhbHVlXG4gIC8vICAgICBvcmRlcmluZy4gIElmIHR3byBvciBtb3JlIHBhcmFtZXRlcnMgc2hhcmUgdGhlIHNhbWUgbmFtZSwgdGhleVxuICAvLyAgICAgYXJlIHNvcnRlZCBieSB0aGVpciB2YWx1ZS5cbiAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gY29tcGFyZShhWzBdLCBiWzBdKSB8fCBjb21wYXJlKGFbMV0sIGJbMV0pXG4gIH0pXG4gIC8vIDMuICBUaGUgbmFtZSBvZiBlYWNoIHBhcmFtZXRlciBpcyBjb25jYXRlbmF0ZWQgdG8gaXRzIGNvcnJlc3BvbmRpbmdcbiAgLy8gICAgIHZhbHVlIHVzaW5nIGFuIFwiPVwiIGNoYXJhY3RlciAoQVNDSUkgY29kZSA2MSkgYXMgYSBzZXBhcmF0b3IsIGV2ZW5cbiAgLy8gICAgIGlmIHRoZSB2YWx1ZSBpcyBlbXB0eS5cbiAgLm1hcChmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5qb2luKCc9JykgfSlcbiAgIC8vIDQuICBUaGUgc29ydGVkIG5hbWUvdmFsdWUgcGFpcnMgYXJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciBpbnRvIGFcbiAgIC8vICAgICBzaW5nbGUgc3RyaW5nIGJ5IHVzaW5nIGFuIFwiJlwiIGNoYXJhY3RlciAoQVNDSUkgY29kZSAzOCkgYXNcbiAgIC8vICAgICBzZXBhcmF0b3IuXG4gIC5qb2luKCcmJylcblxuICB2YXIgYmFzZSA9IFtcbiAgICByZmMzOTg2KGh0dHBNZXRob2QgPyBodHRwTWV0aG9kLnRvVXBwZXJDYXNlKCkgOiAnR0VUJyksXG4gICAgcmZjMzk4NihiYXNlX3VyaSksXG4gICAgcmZjMzk4Nihub3JtYWxpemVkKVxuICBdLmpvaW4oJyYnKVxuXG4gIHJldHVybiBiYXNlXG59XG5cbmZ1bmN0aW9uIGhtYWNzaWduIChodHRwTWV0aG9kLCBiYXNlX3VyaSwgcGFyYW1zLCBjb25zdW1lcl9zZWNyZXQsIHRva2VuX3NlY3JldCkge1xuICB2YXIgYmFzZSA9IGdlbmVyYXRlQmFzZShodHRwTWV0aG9kLCBiYXNlX3VyaSwgcGFyYW1zKVxuICB2YXIga2V5ID0gW1xuICAgIGNvbnN1bWVyX3NlY3JldCB8fCAnJyxcbiAgICB0b2tlbl9zZWNyZXQgfHwgJydcbiAgXS5tYXAocmZjMzk4Nikuam9pbignJicpXG5cbiAgcmV0dXJuIHNoYShrZXksIGJhc2UsICdzaGExJylcbn1cblxuZnVuY3Rpb24gaG1hY3NpZ24yNTYgKGh0dHBNZXRob2QsIGJhc2VfdXJpLCBwYXJhbXMsIGNvbnN1bWVyX3NlY3JldCwgdG9rZW5fc2VjcmV0KSB7XG4gIHZhciBiYXNlID0gZ2VuZXJhdGVCYXNlKGh0dHBNZXRob2QsIGJhc2VfdXJpLCBwYXJhbXMpXG4gIHZhciBrZXkgPSBbXG4gICAgY29uc3VtZXJfc2VjcmV0IHx8ICcnLFxuICAgIHRva2VuX3NlY3JldCB8fCAnJ1xuICBdLm1hcChyZmMzOTg2KS5qb2luKCcmJylcblxuICByZXR1cm4gc2hhKGtleSwgYmFzZSwgJ3NoYTI1NicpXG59XG5cbmZ1bmN0aW9uIHJzYXNpZ24gKGh0dHBNZXRob2QsIGJhc2VfdXJpLCBwYXJhbXMsIHByaXZhdGVfa2V5LCB0b2tlbl9zZWNyZXQpIHtcbiAgdmFyIGJhc2UgPSBnZW5lcmF0ZUJhc2UoaHR0cE1ldGhvZCwgYmFzZV91cmksIHBhcmFtcylcbiAgdmFyIGtleSA9IHByaXZhdGVfa2V5IHx8ICcnXG5cbiAgcmV0dXJuIHJzYShrZXksIGJhc2UpXG59XG5cbmZ1bmN0aW9uIHBsYWludGV4dCAoY29uc3VtZXJfc2VjcmV0LCB0b2tlbl9zZWNyZXQpIHtcbiAgdmFyIGtleSA9IFtcbiAgICBjb25zdW1lcl9zZWNyZXQgfHwgJycsXG4gICAgdG9rZW5fc2VjcmV0IHx8ICcnXG4gIF0ubWFwKHJmYzM5ODYpLmpvaW4oJyYnKVxuXG4gIHJldHVybiBrZXlcbn1cblxuZnVuY3Rpb24gc2lnbiAoc2lnbk1ldGhvZCwgaHR0cE1ldGhvZCwgYmFzZV91cmksIHBhcmFtcywgY29uc3VtZXJfc2VjcmV0LCB0b2tlbl9zZWNyZXQpIHtcbiAgdmFyIG1ldGhvZFxuICB2YXIgc2tpcEFyZ3MgPSAxXG5cbiAgc3dpdGNoIChzaWduTWV0aG9kKSB7XG4gICAgY2FzZSAnUlNBLVNIQTEnOlxuICAgICAgbWV0aG9kID0gcnNhc2lnblxuICAgICAgYnJlYWtcbiAgICBjYXNlICdITUFDLVNIQTEnOlxuICAgICAgbWV0aG9kID0gaG1hY3NpZ25cbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnSE1BQy1TSEEyNTYnOlxuICAgICAgbWV0aG9kID0gaG1hY3NpZ24yNTZcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnUExBSU5URVhUJzpcbiAgICAgIG1ldGhvZCA9IHBsYWludGV4dFxuICAgICAgc2tpcEFyZ3MgPSA0XG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIG1ldGhvZCBub3Qgc3VwcG9ydGVkOiAnICsgc2lnbk1ldGhvZClcbiAgfVxuXG4gIHJldHVybiBtZXRob2QuYXBwbHkobnVsbCwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIHNraXBBcmdzKSlcbn1cblxuZXhwb3J0cy5obWFjc2lnbiA9IGhtYWNzaWduXG5leHBvcnRzLmhtYWNzaWduMjU2ID0gaG1hY3NpZ24yNTZcbmV4cG9ydHMucnNhc2lnbiA9IHJzYXNpZ25cbmV4cG9ydHMucGxhaW50ZXh0ID0gcGxhaW50ZXh0XG5leHBvcnRzLnNpZ24gPSBzaWduXG5leHBvcnRzLnJmYzM5ODYgPSByZmMzOTg2XG5leHBvcnRzLmdlbmVyYXRlQmFzZSA9IGdlbmVyYXRlQmFzZSIsICIndXNlIHN0cmljdCdcblxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG52YXIgcXMgPSByZXF1aXJlKCdxcycpXG52YXIgY2FzZWxlc3MgPSByZXF1aXJlKCdjYXNlbGVzcycpXG52YXIgdXVpZCA9IHJlcXVpcmUoJ3V1aWQvdjQnKVxudmFyIG9hdXRoID0gcmVxdWlyZSgnb2F1dGgtc2lnbicpXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG5mdW5jdGlvbiBPQXV0aCAocmVxdWVzdCkge1xuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gIHRoaXMucGFyYW1zID0gbnVsbFxufVxuXG5PQXV0aC5wcm90b3R5cGUuYnVpbGRQYXJhbXMgPSBmdW5jdGlvbiAoX29hdXRoLCB1cmksIG1ldGhvZCwgcXVlcnksIGZvcm0sIHFzTGliKSB7XG4gIHZhciBvYSA9IHt9XG4gIGZvciAodmFyIGkgaW4gX29hdXRoKSB7XG4gICAgb2FbJ29hdXRoXycgKyBpXSA9IF9vYXV0aFtpXVxuICB9XG4gIGlmICghb2Eub2F1dGhfdmVyc2lvbikge1xuICAgIG9hLm9hdXRoX3ZlcnNpb24gPSAnMS4wJ1xuICB9XG4gIGlmICghb2Eub2F1dGhfdGltZXN0YW1wKSB7XG4gICAgb2Eub2F1dGhfdGltZXN0YW1wID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkudG9TdHJpbmcoKVxuICB9XG4gIGlmICghb2Eub2F1dGhfbm9uY2UpIHtcbiAgICBvYS5vYXV0aF9ub25jZSA9IHV1aWQoKS5yZXBsYWNlKC8tL2csICcnKVxuICB9XG4gIGlmICghb2Eub2F1dGhfc2lnbmF0dXJlX21ldGhvZCkge1xuICAgIG9hLm9hdXRoX3NpZ25hdHVyZV9tZXRob2QgPSAnSE1BQy1TSEExJ1xuICB9XG5cbiAgdmFyIGNvbnN1bWVyX3NlY3JldF9vcl9wcml2YXRlX2tleSA9IG9hLm9hdXRoX2NvbnN1bWVyX3NlY3JldCB8fCBvYS5vYXV0aF9wcml2YXRlX2tleSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZVxuICBkZWxldGUgb2Eub2F1dGhfY29uc3VtZXJfc2VjcmV0XG4gIGRlbGV0ZSBvYS5vYXV0aF9wcml2YXRlX2tleVxuXG4gIHZhciB0b2tlbl9zZWNyZXQgPSBvYS5vYXV0aF90b2tlbl9zZWNyZXQgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgZGVsZXRlIG9hLm9hdXRoX3Rva2VuX3NlY3JldFxuXG4gIHZhciByZWFsbSA9IG9hLm9hdXRoX3JlYWxtXG4gIGRlbGV0ZSBvYS5vYXV0aF9yZWFsbVxuICBkZWxldGUgb2Eub2F1dGhfdHJhbnNwb3J0X21ldGhvZFxuXG4gIHZhciBiYXNldXJsID0gdXJpLnByb3RvY29sICsgJy8vJyArIHVyaS5ob3N0ICsgdXJpLnBhdGhuYW1lXG4gIHZhciBwYXJhbXMgPSBxc0xpYi5wYXJzZShbXS5jb25jYXQocXVlcnksIGZvcm0sIHFzTGliLnN0cmluZ2lmeShvYSkpLmpvaW4oJyYnKSlcblxuICBvYS5vYXV0aF9zaWduYXR1cmUgPSBvYXV0aC5zaWduKFxuICAgIG9hLm9hdXRoX3NpZ25hdHVyZV9tZXRob2QsXG4gICAgbWV0aG9kLFxuICAgIGJhc2V1cmwsXG4gICAgcGFyYW1zLFxuICAgIGNvbnN1bWVyX3NlY3JldF9vcl9wcml2YXRlX2tleSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgICB0b2tlbl9zZWNyZXQgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgKVxuXG4gIGlmIChyZWFsbSkge1xuICAgIG9hLnJlYWxtID0gcmVhbG1cbiAgfVxuXG4gIHJldHVybiBvYVxufVxuXG5PQXV0aC5wcm90b3R5cGUuYnVpbGRCb2R5SGFzaCA9IGZ1bmN0aW9uIChfb2F1dGgsIGJvZHkpIHtcbiAgaWYgKFsnSE1BQy1TSEExJywgJ1JTQS1TSEExJ10uaW5kZXhPZihfb2F1dGguc2lnbmF0dXJlX21ldGhvZCB8fCAnSE1BQy1TSEExJykgPCAwKSB7XG4gICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdvYXV0aDogJyArIF9vYXV0aC5zaWduYXR1cmVfbWV0aG9kICtcbiAgICAgICcgc2lnbmF0dXJlX21ldGhvZCBub3Qgc3VwcG9ydGVkIHdpdGggYm9keV9oYXNoIHNpZ25pbmcuJykpXG4gIH1cblxuICB2YXIgc2hhc3VtID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKVxuICBzaGFzdW0udXBkYXRlKGJvZHkgfHwgJycpXG4gIHZhciBzaGExID0gc2hhc3VtLmRpZ2VzdCgnaGV4JylcblxuICByZXR1cm4gQnVmZmVyLmZyb20oc2hhMSwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxufVxuXG5PQXV0aC5wcm90b3R5cGUuY29uY2F0UGFyYW1zID0gZnVuY3Rpb24gKG9hLCBzZXAsIHdyYXApIHtcbiAgd3JhcCA9IHdyYXAgfHwgJydcblxuICB2YXIgcGFyYW1zID0gT2JqZWN0LmtleXMob2EpLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpICE9PSAncmVhbG0nICYmIGkgIT09ICdvYXV0aF9zaWduYXR1cmUnXG4gIH0pLnNvcnQoKVxuXG4gIGlmIChvYS5yZWFsbSkge1xuICAgIHBhcmFtcy5zcGxpY2UoMCwgMCwgJ3JlYWxtJylcbiAgfVxuICBwYXJhbXMucHVzaCgnb2F1dGhfc2lnbmF0dXJlJylcblxuICByZXR1cm4gcGFyYW1zLm1hcChmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpICsgJz0nICsgd3JhcCArIG9hdXRoLnJmYzM5ODYob2FbaV0pICsgd3JhcFxuICB9KS5qb2luKHNlcClcbn1cblxuT0F1dGgucHJvdG90eXBlLm9uUmVxdWVzdCA9IGZ1bmN0aW9uIChfb2F1dGgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYucGFyYW1zID0gX29hdXRoXG5cbiAgdmFyIHVyaSA9IHNlbGYucmVxdWVzdC51cmkgfHwge31cbiAgdmFyIG1ldGhvZCA9IHNlbGYucmVxdWVzdC5tZXRob2QgfHwgJydcbiAgdmFyIGhlYWRlcnMgPSBjYXNlbGVzcyhzZWxmLnJlcXVlc3QuaGVhZGVycylcbiAgdmFyIGJvZHkgPSBzZWxmLnJlcXVlc3QuYm9keSB8fCAnJ1xuICB2YXIgcXNMaWIgPSBzZWxmLnJlcXVlc3QucXNMaWIgfHwgcXNcblxuICB2YXIgZm9ybVxuICB2YXIgcXVlcnlcbiAgdmFyIGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpIHx8ICcnXG4gIHZhciBmb3JtQ29udGVudFR5cGUgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICB2YXIgdHJhbnNwb3J0ID0gX29hdXRoLnRyYW5zcG9ydF9tZXRob2QgfHwgJ2hlYWRlcidcblxuICBpZiAoY29udGVudFR5cGUuc2xpY2UoMCwgZm9ybUNvbnRlbnRUeXBlLmxlbmd0aCkgPT09IGZvcm1Db250ZW50VHlwZSkge1xuICAgIGNvbnRlbnRUeXBlID0gZm9ybUNvbnRlbnRUeXBlXG4gICAgZm9ybSA9IGJvZHlcbiAgfVxuICBpZiAodXJpLnF1ZXJ5KSB7XG4gICAgcXVlcnkgPSB1cmkucXVlcnlcbiAgfVxuICBpZiAodHJhbnNwb3J0ID09PSAnYm9keScgJiYgKG1ldGhvZCAhPT0gJ1BPU1QnIHx8IGNvbnRlbnRUeXBlICE9PSBmb3JtQ29udGVudFR5cGUpKSB7XG4gICAgc2VsZi5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdvYXV0aDogdHJhbnNwb3J0X21ldGhvZCBvZiBib2R5IHJlcXVpcmVzIFBPU1QgJyArXG4gICAgICAnYW5kIGNvbnRlbnQtdHlwZSAnICsgZm9ybUNvbnRlbnRUeXBlKSlcbiAgfVxuXG4gIGlmICghZm9ybSAmJiB0eXBlb2YgX29hdXRoLmJvZHlfaGFzaCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgX29hdXRoLmJvZHlfaGFzaCA9IHNlbGYuYnVpbGRCb2R5SGFzaChfb2F1dGgsIHNlbGYucmVxdWVzdC5ib2R5LnRvU3RyaW5nKCkpXG4gIH1cblxuICB2YXIgb2EgPSBzZWxmLmJ1aWxkUGFyYW1zKF9vYXV0aCwgdXJpLCBtZXRob2QsIHF1ZXJ5LCBmb3JtLCBxc0xpYilcblxuICBzd2l0Y2ggKHRyYW5zcG9ydCkge1xuICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICBzZWxmLnJlcXVlc3Quc2V0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ09BdXRoICcgKyBzZWxmLmNvbmNhdFBhcmFtcyhvYSwgJywnLCAnXCInKSlcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdxdWVyeSc6XG4gICAgICB2YXIgaHJlZiA9IHNlbGYucmVxdWVzdC51cmkuaHJlZiArPSAocXVlcnkgPyAnJicgOiAnPycpICsgc2VsZi5jb25jYXRQYXJhbXMob2EsICcmJylcbiAgICAgIHNlbGYucmVxdWVzdC51cmkgPSB1cmwucGFyc2UoaHJlZilcbiAgICAgIHNlbGYucmVxdWVzdC5wYXRoID0gc2VsZi5yZXF1ZXN0LnVyaS5wYXRoXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnYm9keSc6XG4gICAgICBzZWxmLnJlcXVlc3QuYm9keSA9IChmb3JtID8gZm9ybSArICcmJyA6ICcnKSArIHNlbGYuY29uY2F0UGFyYW1zKG9hLCAnJicpXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHNlbGYucmVxdWVzdC5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignb2F1dGg6IHRyYW5zcG9ydF9tZXRob2QgaW52YWxpZCcpKVxuICB9XG59XG5cbmV4cG9ydHMuT0F1dGggPSBPQXV0aFxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcblxuZnVuY3Rpb24gcmFuZG9tU3RyaW5nIChzaXplKSB7XG4gIHZhciBiaXRzID0gKHNpemUgKyAxKSAqIDZcbiAgdmFyIGJ1ZmZlciA9IGNyeXB0by5yYW5kb21CeXRlcyhNYXRoLmNlaWwoYml0cyAvIDgpKVxuICB2YXIgc3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89L2csICcnKVxuICByZXR1cm4gc3RyaW5nLnNsaWNlKDAsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVBheWxvYWRIYXNoIChwYXlsb2FkLCBhbGdvcml0aG0sIGNvbnRlbnRUeXBlKSB7XG4gIHZhciBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goYWxnb3JpdGhtKVxuICBoYXNoLnVwZGF0ZSgnaGF3ay4xLnBheWxvYWRcXG4nKVxuICBoYXNoLnVwZGF0ZSgoY29udGVudFR5cGUgPyBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdLnRyaW0oKS50b0xvd2VyQ2FzZSgpIDogJycpICsgJ1xcbicpXG4gIGhhc2gudXBkYXRlKHBheWxvYWQgfHwgJycpXG4gIGhhc2gudXBkYXRlKCdcXG4nKVxuICByZXR1cm4gaGFzaC5kaWdlc3QoJ2Jhc2U2NCcpXG59XG5cbmV4cG9ydHMuY2FsY3VsYXRlTWFjID0gZnVuY3Rpb24gKGNyZWRlbnRpYWxzLCBvcHRzKSB7XG4gIHZhciBub3JtYWxpemVkID0gJ2hhd2suMS5oZWFkZXJcXG4nICtcbiAgICBvcHRzLnRzICsgJ1xcbicgK1xuICAgIG9wdHMubm9uY2UgKyAnXFxuJyArXG4gICAgKG9wdHMubWV0aG9kIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgJ1xcbicgK1xuICAgIG9wdHMucmVzb3VyY2UgKyAnXFxuJyArXG4gICAgb3B0cy5ob3N0LnRvTG93ZXJDYXNlKCkgKyAnXFxuJyArXG4gICAgb3B0cy5wb3J0ICsgJ1xcbicgK1xuICAgIChvcHRzLmhhc2ggfHwgJycpICsgJ1xcbidcblxuICBpZiAob3B0cy5leHQpIHtcbiAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZCArIG9wdHMuZXh0LnJlcGxhY2UoJ1xcXFwnLCAnXFxcXFxcXFwnKS5yZXBsYWNlKCdcXG4nLCAnXFxcXG4nKVxuICB9XG5cbiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgKyAnXFxuJ1xuXG4gIGlmIChvcHRzLmFwcCkge1xuICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkICsgb3B0cy5hcHAgKyAnXFxuJyArIChvcHRzLmRsZyB8fCAnJykgKyAnXFxuJ1xuICB9XG5cbiAgdmFyIGhtYWMgPSBjcnlwdG8uY3JlYXRlSG1hYyhjcmVkZW50aWFscy5hbGdvcml0aG0sIGNyZWRlbnRpYWxzLmtleSkudXBkYXRlKG5vcm1hbGl6ZWQpXG4gIHZhciBkaWdlc3QgPSBobWFjLmRpZ2VzdCgnYmFzZTY0JylcbiAgcmV0dXJuIGRpZ2VzdFxufVxuXG5leHBvcnRzLmhlYWRlciA9IGZ1bmN0aW9uICh1cmksIG1ldGhvZCwgb3B0cykge1xuICB2YXIgdGltZXN0YW1wID0gb3B0cy50aW1lc3RhbXAgfHwgTWF0aC5mbG9vcigoRGF0ZS5ub3coKSArIChvcHRzLmxvY2FsdGltZU9mZnNldE1zZWMgfHwgMCkpIC8gMTAwMClcbiAgdmFyIGNyZWRlbnRpYWxzID0gb3B0cy5jcmVkZW50aWFsc1xuICBpZiAoIWNyZWRlbnRpYWxzIHx8ICFjcmVkZW50aWFscy5pZCB8fCAhY3JlZGVudGlhbHMua2V5IHx8ICFjcmVkZW50aWFscy5hbGdvcml0aG0pIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChbJ3NoYTEnLCAnc2hhMjU2J10uaW5kZXhPZihjcmVkZW50aWFscy5hbGdvcml0aG0pID09PSAtMSkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgdmFyIGFydGlmYWN0cyA9IHtcbiAgICB0czogdGltZXN0YW1wLFxuICAgIG5vbmNlOiBvcHRzLm5vbmNlIHx8IHJhbmRvbVN0cmluZyg2KSxcbiAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICByZXNvdXJjZTogdXJpLnBhdGhuYW1lICsgKHVyaS5zZWFyY2ggfHwgJycpLFxuICAgIGhvc3Q6IHVyaS5ob3N0bmFtZSxcbiAgICBwb3J0OiB1cmkucG9ydCB8fCAodXJpLnByb3RvY29sID09PSAnaHR0cDonID8gODAgOiA0NDMpLFxuICAgIGhhc2g6IG9wdHMuaGFzaCxcbiAgICBleHQ6IG9wdHMuZXh0LFxuICAgIGFwcDogb3B0cy5hcHAsXG4gICAgZGxnOiBvcHRzLmRsZ1xuICB9XG5cbiAgaWYgKCFhcnRpZmFjdHMuaGFzaCAmJiAob3B0cy5wYXlsb2FkIHx8IG9wdHMucGF5bG9hZCA9PT0gJycpKSB7XG4gICAgYXJ0aWZhY3RzLmhhc2ggPSBjYWxjdWxhdGVQYXlsb2FkSGFzaChvcHRzLnBheWxvYWQsIGNyZWRlbnRpYWxzLmFsZ29yaXRobSwgb3B0cy5jb250ZW50VHlwZSlcbiAgfVxuXG4gIHZhciBtYWMgPSBleHBvcnRzLmNhbGN1bGF0ZU1hYyhjcmVkZW50aWFscywgYXJ0aWZhY3RzKVxuXG4gIHZhciBoYXNFeHQgPSBhcnRpZmFjdHMuZXh0ICE9PSBudWxsICYmIGFydGlmYWN0cy5leHQgIT09IHVuZGVmaW5lZCAmJiBhcnRpZmFjdHMuZXh0ICE9PSAnJ1xuICB2YXIgaGVhZGVyID0gJ0hhd2sgaWQ9XCInICsgY3JlZGVudGlhbHMuaWQgK1xuICAgICdcIiwgdHM9XCInICsgYXJ0aWZhY3RzLnRzICtcbiAgICAnXCIsIG5vbmNlPVwiJyArIGFydGlmYWN0cy5ub25jZSArXG4gICAgKGFydGlmYWN0cy5oYXNoID8gJ1wiLCBoYXNoPVwiJyArIGFydGlmYWN0cy5oYXNoIDogJycpICtcbiAgICAoaGFzRXh0ID8gJ1wiLCBleHQ9XCInICsgYXJ0aWZhY3RzLmV4dC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKSA6ICcnKSArXG4gICAgJ1wiLCBtYWM9XCInICsgbWFjICsgJ1wiJ1xuXG4gIGlmIChhcnRpZmFjdHMuYXBwKSB7XG4gICAgaGVhZGVyID0gaGVhZGVyICsgJywgYXBwPVwiJyArIGFydGlmYWN0cy5hcHAgKyAoYXJ0aWZhY3RzLmRsZyA/ICdcIiwgZGxnPVwiJyArIGFydGlmYWN0cy5kbGcgOiAnJykgKyAnXCInXG4gIH1cblxuICByZXR1cm4gaGVhZGVyXG59XG4iLCAidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERlbGF5ZWRTdHJlYW07XG5mdW5jdGlvbiBEZWxheWVkU3RyZWFtKCkge1xuICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gIHRoaXMuZGF0YVNpemUgPSAwO1xuICB0aGlzLm1heERhdGFTaXplID0gMTAyNCAqIDEwMjQ7XG4gIHRoaXMucGF1c2VTdHJlYW0gPSB0cnVlO1xuXG4gIHRoaXMuX21heERhdGFTaXplRXhjZWVkZWQgPSBmYWxzZTtcbiAgdGhpcy5fcmVsZWFzZWQgPSBmYWxzZTtcbiAgdGhpcy5fYnVmZmVyZWRFdmVudHMgPSBbXTtcbn1cbnV0aWwuaW5oZXJpdHMoRGVsYXllZFN0cmVhbSwgU3RyZWFtKTtcblxuRGVsYXllZFN0cmVhbS5jcmVhdGUgPSBmdW5jdGlvbihzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGRlbGF5ZWRTdHJlYW0gPSBuZXcgdGhpcygpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIGRlbGF5ZWRTdHJlYW1bb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgfVxuXG4gIGRlbGF5ZWRTdHJlYW0uc291cmNlID0gc291cmNlO1xuXG4gIHZhciByZWFsRW1pdCA9IHNvdXJjZS5lbWl0O1xuICBzb3VyY2UuZW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgIGRlbGF5ZWRTdHJlYW0uX2hhbmRsZUVtaXQoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gcmVhbEVtaXQuYXBwbHkoc291cmNlLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHNvdXJjZS5vbignZXJyb3InLCBmdW5jdGlvbigpIHt9KTtcbiAgaWYgKGRlbGF5ZWRTdHJlYW0ucGF1c2VTdHJlYW0pIHtcbiAgICBzb3VyY2UucGF1c2UoKTtcbiAgfVxuXG4gIHJldHVybiBkZWxheWVkU3RyZWFtO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KERlbGF5ZWRTdHJlYW0ucHJvdG90eXBlLCAncmVhZGFibGUnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2UucmVhZGFibGU7XG4gIH1cbn0pO1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2Uuc2V0RW5jb2RpbmcuYXBwbHkodGhpcy5zb3VyY2UsIGFyZ3VtZW50cyk7XG59O1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9yZWxlYXNlZCkge1xuICAgIHRoaXMucmVsZWFzZSgpO1xuICB9XG5cbiAgdGhpcy5zb3VyY2UucmVzdW1lKCk7XG59O1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNvdXJjZS5wYXVzZSgpO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9yZWxlYXNlZCA9IHRydWU7XG5cbiAgdGhpcy5fYnVmZmVyZWRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihhcmdzKSB7XG4gICAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9LmJpbmQodGhpcykpO1xuICB0aGlzLl9idWZmZXJlZEV2ZW50cyA9IFtdO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgciA9IFN0cmVhbS5wcm90b3R5cGUucGlwZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB0aGlzLnJlc3VtZSgpO1xuICByZXR1cm4gcjtcbn07XG5cbkRlbGF5ZWRTdHJlYW0ucHJvdG90eXBlLl9oYW5kbGVFbWl0ID0gZnVuY3Rpb24oYXJncykge1xuICBpZiAodGhpcy5fcmVsZWFzZWQpIHtcbiAgICB0aGlzLmVtaXQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFyZ3NbMF0gPT09ICdkYXRhJykge1xuICAgIHRoaXMuZGF0YVNpemUgKz0gYXJnc1sxXS5sZW5ndGg7XG4gICAgdGhpcy5fY2hlY2tJZk1heERhdGFTaXplRXhjZWVkZWQoKTtcbiAgfVxuXG4gIHRoaXMuX2J1ZmZlcmVkRXZlbnRzLnB1c2goYXJncyk7XG59O1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5fY2hlY2tJZk1heERhdGFTaXplRXhjZWVkZWQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX21heERhdGFTaXplRXhjZWVkZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5kYXRhU2l6ZSA8PSB0aGlzLm1heERhdGFTaXplKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fbWF4RGF0YVNpemVFeGNlZWRlZCA9IHRydWU7XG4gIHZhciBtZXNzYWdlID1cbiAgICAnRGVsYXllZFN0cmVhbSNtYXhEYXRhU2l6ZSBvZiAnICsgdGhpcy5tYXhEYXRhU2l6ZSArICcgYnl0ZXMgZXhjZWVkZWQuJ1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKG1lc3NhZ2UpKTtcbn07XG4iLCAidmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtO1xudmFyIERlbGF5ZWRTdHJlYW0gPSByZXF1aXJlKCdkZWxheWVkLXN0cmVhbScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbWJpbmVkU3RyZWFtO1xuZnVuY3Rpb24gQ29tYmluZWRTdHJlYW0oKSB7XG4gIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gIHRoaXMuZGF0YVNpemUgPSAwO1xuICB0aGlzLm1heERhdGFTaXplID0gMiAqIDEwMjQgKiAxMDI0O1xuICB0aGlzLnBhdXNlU3RyZWFtcyA9IHRydWU7XG5cbiAgdGhpcy5fcmVsZWFzZWQgPSBmYWxzZTtcbiAgdGhpcy5fc3RyZWFtcyA9IFtdO1xuICB0aGlzLl9jdXJyZW50U3RyZWFtID0gbnVsbDtcbiAgdGhpcy5faW5zaWRlTG9vcCA9IGZhbHNlO1xuICB0aGlzLl9wZW5kaW5nTmV4dCA9IGZhbHNlO1xufVxudXRpbC5pbmhlcml0cyhDb21iaW5lZFN0cmVhbSwgU3RyZWFtKTtcblxuQ29tYmluZWRTdHJlYW0uY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgY29tYmluZWRTdHJlYW0gPSBuZXcgdGhpcygpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIGNvbWJpbmVkU3RyZWFtW29wdGlvbl0gPSBvcHRpb25zW29wdGlvbl07XG4gIH1cblxuICByZXR1cm4gY29tYmluZWRTdHJlYW07XG59O1xuXG5Db21iaW5lZFN0cmVhbS5pc1N0cmVhbUxpa2UgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgcmV0dXJuICh0eXBlb2Ygc3RyZWFtICE9PSAnZnVuY3Rpb24nKVxuICAgICYmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJylcbiAgICAmJiAodHlwZW9mIHN0cmVhbSAhPT0gJ2Jvb2xlYW4nKVxuICAgICYmICh0eXBlb2Ygc3RyZWFtICE9PSAnbnVtYmVyJylcbiAgICAmJiAoIUJ1ZmZlci5pc0J1ZmZlcihzdHJlYW0pKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgdmFyIGlzU3RyZWFtTGlrZSA9IENvbWJpbmVkU3RyZWFtLmlzU3RyZWFtTGlrZShzdHJlYW0pO1xuXG4gIGlmIChpc1N0cmVhbUxpa2UpIHtcbiAgICBpZiAoIShzdHJlYW0gaW5zdGFuY2VvZiBEZWxheWVkU3RyZWFtKSkge1xuICAgICAgdmFyIG5ld1N0cmVhbSA9IERlbGF5ZWRTdHJlYW0uY3JlYXRlKHN0cmVhbSwge1xuICAgICAgICBtYXhEYXRhU2l6ZTogSW5maW5pdHksXG4gICAgICAgIHBhdXNlU3RyZWFtOiB0aGlzLnBhdXNlU3RyZWFtcyxcbiAgICAgIH0pO1xuICAgICAgc3RyZWFtLm9uKCdkYXRhJywgdGhpcy5fY2hlY2tEYXRhU2l6ZS5iaW5kKHRoaXMpKTtcbiAgICAgIHN0cmVhbSA9IG5ld1N0cmVhbTtcbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVFcnJvcnMoc3RyZWFtKTtcblxuICAgIGlmICh0aGlzLnBhdXNlU3RyZWFtcykge1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fc3RyZWFtcy5wdXNoKHN0cmVhbSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIFN0cmVhbS5wcm90b3R5cGUucGlwZS5jYWxsKHRoaXMsIGRlc3QsIG9wdGlvbnMpO1xuICB0aGlzLnJlc3VtZSgpO1xuICByZXR1cm4gZGVzdDtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fZ2V0TmV4dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jdXJyZW50U3RyZWFtID0gbnVsbDtcblxuICBpZiAodGhpcy5faW5zaWRlTG9vcCkge1xuICAgIHRoaXMuX3BlbmRpbmdOZXh0ID0gdHJ1ZTtcbiAgICByZXR1cm47IC8vIGRlZmVyIGNhbGxcbiAgfVxuXG4gIHRoaXMuX2luc2lkZUxvb3AgPSB0cnVlO1xuICB0cnkge1xuICAgIGRvIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdOZXh0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9yZWFsR2V0TmV4dCgpO1xuICAgIH0gd2hpbGUgKHRoaXMuX3BlbmRpbmdOZXh0KTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLl9pbnNpZGVMb29wID0gZmFsc2U7XG4gIH1cbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fcmVhbEdldE5leHQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cmVhbSA9IHRoaXMuX3N0cmVhbXMuc2hpZnQoKTtcblxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtID09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy5lbmQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX3BpcGVOZXh0KHN0cmVhbSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldFN0cmVhbSA9IHN0cmVhbTtcbiAgZ2V0U3RyZWFtKGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHZhciBpc1N0cmVhbUxpa2UgPSBDb21iaW5lZFN0cmVhbS5pc1N0cmVhbUxpa2Uoc3RyZWFtKTtcbiAgICBpZiAoaXNTdHJlYW1MaWtlKSB7XG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCB0aGlzLl9jaGVja0RhdGFTaXplLmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5faGFuZGxlRXJyb3JzKHN0cmVhbSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGlwZU5leHQoc3RyZWFtKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fcGlwZU5leHQgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgdGhpcy5fY3VycmVudFN0cmVhbSA9IHN0cmVhbTtcblxuICB2YXIgaXNTdHJlYW1MaWtlID0gQ29tYmluZWRTdHJlYW0uaXNTdHJlYW1MaWtlKHN0cmVhbSk7XG4gIGlmIChpc1N0cmVhbUxpa2UpIHtcbiAgICBzdHJlYW0ub24oJ2VuZCcsIHRoaXMuX2dldE5leHQuYmluZCh0aGlzKSk7XG4gICAgc3RyZWFtLnBpcGUodGhpcywge2VuZDogZmFsc2V9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdmFsdWUgPSBzdHJlYW07XG4gIHRoaXMud3JpdGUodmFsdWUpO1xuICB0aGlzLl9nZXROZXh0KCk7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUuX2hhbmRsZUVycm9ycyA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICBzZWxmLl9lbWl0RXJyb3IoZXJyKTtcbiAgfSk7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7XG4gIHRoaXMuZW1pdCgnZGF0YScsIGRhdGEpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5wYXVzZVN0cmVhbXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZih0aGlzLnBhdXNlU3RyZWFtcyAmJiB0aGlzLl9jdXJyZW50U3RyZWFtICYmIHR5cGVvZih0aGlzLl9jdXJyZW50U3RyZWFtLnBhdXNlKSA9PSAnZnVuY3Rpb24nKSB0aGlzLl9jdXJyZW50U3RyZWFtLnBhdXNlKCk7XG4gIHRoaXMuZW1pdCgncGF1c2UnKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9yZWxlYXNlZCkge1xuICAgIHRoaXMuX3JlbGVhc2VkID0gdHJ1ZTtcbiAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLl9nZXROZXh0KCk7XG4gIH1cblxuICBpZih0aGlzLnBhdXNlU3RyZWFtcyAmJiB0aGlzLl9jdXJyZW50U3RyZWFtICYmIHR5cGVvZih0aGlzLl9jdXJyZW50U3RyZWFtLnJlc3VtZSkgPT0gJ2Z1bmN0aW9uJykgdGhpcy5fY3VycmVudFN0cmVhbS5yZXN1bWUoKTtcbiAgdGhpcy5lbWl0KCdyZXN1bWUnKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVzZXQoKTtcbiAgdGhpcy5lbWl0KCdlbmQnKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuZW1pdCgnY2xvc2UnKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLl9zdHJlYW1zID0gW107XG4gIHRoaXMuX2N1cnJlbnRTdHJlYW0gPSBudWxsO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9jaGVja0RhdGFTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3VwZGF0ZURhdGFTaXplKCk7XG4gIGlmICh0aGlzLmRhdGFTaXplIDw9IHRoaXMubWF4RGF0YVNpemUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbWVzc2FnZSA9XG4gICAgJ0RlbGF5ZWRTdHJlYW0jbWF4RGF0YVNpemUgb2YgJyArIHRoaXMubWF4RGF0YVNpemUgKyAnIGJ5dGVzIGV4Y2VlZGVkLic7XG4gIHRoaXMuX2VtaXRFcnJvcihuZXcgRXJyb3IobWVzc2FnZSkpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl91cGRhdGVEYXRhU2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmRhdGFTaXplID0gMDtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX3N0cmVhbXMuZm9yRWFjaChmdW5jdGlvbihzdHJlYW0pIHtcbiAgICBpZiAoIXN0cmVhbS5kYXRhU2l6ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlbGYuZGF0YVNpemUgKz0gc3RyZWFtLmRhdGFTaXplO1xuICB9KTtcblxuICBpZiAodGhpcy5fY3VycmVudFN0cmVhbSAmJiB0aGlzLl9jdXJyZW50U3RyZWFtLmRhdGFTaXplKSB7XG4gICAgdGhpcy5kYXRhU2l6ZSArPSB0aGlzLl9jdXJyZW50U3RyZWFtLmRhdGFTaXplO1xuICB9XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUuX2VtaXRFcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciB1dWlkID0gcmVxdWlyZSgndXVpZC92NCcpXG52YXIgQ29tYmluZWRTdHJlYW0gPSByZXF1aXJlKCdjb21iaW5lZC1zdHJlYW0nKVxudmFyIGlzc3RyZWFtID0gcmVxdWlyZSgnaXNzdHJlYW0nKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbmZ1bmN0aW9uIE11bHRpcGFydCAocmVxdWVzdCkge1xuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gIHRoaXMuYm91bmRhcnkgPSB1dWlkKClcbiAgdGhpcy5jaHVua2VkID0gZmFsc2VcbiAgdGhpcy5ib2R5ID0gbnVsbFxufVxuXG5NdWx0aXBhcnQucHJvdG90eXBlLmlzQ2h1bmtlZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgY2h1bmtlZCA9IGZhbHNlXG4gIHZhciBwYXJ0cyA9IG9wdGlvbnMuZGF0YSB8fCBvcHRpb25zXG5cbiAgaWYgKCFwYXJ0cy5mb3JFYWNoKSB7XG4gICAgc2VsZi5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdBcmd1bWVudCBlcnJvciwgb3B0aW9ucy5tdWx0aXBhcnQuJykpXG4gIH1cblxuICBpZiAob3B0aW9ucy5jaHVua2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjaHVua2VkID0gb3B0aW9ucy5jaHVua2VkXG4gIH1cblxuICBpZiAoc2VsZi5yZXF1ZXN0LmdldEhlYWRlcigndHJhbnNmZXItZW5jb2RpbmcnKSA9PT0gJ2NodW5rZWQnKSB7XG4gICAgY2h1bmtlZCA9IHRydWVcbiAgfVxuXG4gIGlmICghY2h1bmtlZCkge1xuICAgIHBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHBhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydC5ib2R5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLnJlcXVlc3QuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0JvZHkgYXR0cmlidXRlIG1pc3NpbmcgaW4gbXVsdGlwYXJ0LicpKVxuICAgICAgfVxuICAgICAgaWYgKGlzc3RyZWFtKHBhcnQuYm9keSkpIHtcbiAgICAgICAgY2h1bmtlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGNodW5rZWRcbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS5zZXRIZWFkZXJzID0gZnVuY3Rpb24gKGNodW5rZWQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgaWYgKGNodW5rZWQgJiYgIXNlbGYucmVxdWVzdC5oYXNIZWFkZXIoJ3RyYW5zZmVyLWVuY29kaW5nJykpIHtcbiAgICBzZWxmLnJlcXVlc3Quc2V0SGVhZGVyKCd0cmFuc2Zlci1lbmNvZGluZycsICdjaHVua2VkJylcbiAgfVxuXG4gIHZhciBoZWFkZXIgPSBzZWxmLnJlcXVlc3QuZ2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKVxuXG4gIGlmICghaGVhZGVyIHx8IGhlYWRlci5pbmRleE9mKCdtdWx0aXBhcnQnKSA9PT0gLTEpIHtcbiAgICBzZWxmLnJlcXVlc3Quc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PScgKyBzZWxmLmJvdW5kYXJ5KVxuICB9IGVsc2Uge1xuICAgIGlmIChoZWFkZXIuaW5kZXhPZignYm91bmRhcnknKSAhPT0gLTEpIHtcbiAgICAgIHNlbGYuYm91bmRhcnkgPSBoZWFkZXIucmVwbGFjZSgvLipib3VuZGFyeT0oW15cXHM7XSspLiovLCAnJDEnKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnJlcXVlc3Quc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCBoZWFkZXIgKyAnOyBib3VuZGFyeT0nICsgc2VsZi5ib3VuZGFyeSlcbiAgICB9XG4gIH1cbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChwYXJ0cywgY2h1bmtlZCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGJvZHkgPSBjaHVua2VkID8gbmV3IENvbWJpbmVkU3RyZWFtKCkgOiBbXVxuXG4gIGZ1bmN0aW9uIGFkZCAocGFydCkge1xuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHBhcnQgPSBwYXJ0LnRvU3RyaW5nKClcbiAgICB9XG4gICAgcmV0dXJuIGNodW5rZWQgPyBib2R5LmFwcGVuZChwYXJ0KSA6IGJvZHkucHVzaChCdWZmZXIuZnJvbShwYXJ0KSlcbiAgfVxuXG4gIGlmIChzZWxmLnJlcXVlc3QucHJlYW1ibGVDUkxGKSB7XG4gICAgYWRkKCdcXHJcXG4nKVxuICB9XG5cbiAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCkge1xuICAgIHZhciBwcmVhbWJsZSA9ICctLScgKyBzZWxmLmJvdW5kYXJ5ICsgJ1xcclxcbidcbiAgICBPYmplY3Qua2V5cyhwYXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdib2R5JykgeyByZXR1cm4gfVxuICAgICAgcHJlYW1ibGUgKz0ga2V5ICsgJzogJyArIHBhcnRba2V5XSArICdcXHJcXG4nXG4gICAgfSlcbiAgICBwcmVhbWJsZSArPSAnXFxyXFxuJ1xuICAgIGFkZChwcmVhbWJsZSlcbiAgICBhZGQocGFydC5ib2R5KVxuICAgIGFkZCgnXFxyXFxuJylcbiAgfSlcbiAgYWRkKCctLScgKyBzZWxmLmJvdW5kYXJ5ICsgJy0tJylcblxuICBpZiAoc2VsZi5yZXF1ZXN0LnBvc3RhbWJsZUNSTEYpIHtcbiAgICBhZGQoJ1xcclxcbicpXG4gIH1cblxuICByZXR1cm4gYm9keVxufVxuXG5NdWx0aXBhcnQucHJvdG90eXBlLm9uUmVxdWVzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHZhciBjaHVua2VkID0gc2VsZi5pc0NodW5rZWQob3B0aW9ucylcbiAgdmFyIHBhcnRzID0gb3B0aW9ucy5kYXRhIHx8IG9wdGlvbnNcblxuICBzZWxmLnNldEhlYWRlcnMoY2h1bmtlZClcbiAgc2VsZi5jaHVua2VkID0gY2h1bmtlZFxuICBzZWxmLmJvZHkgPSBzZWxmLmJ1aWxkKHBhcnRzLCBjaHVua2VkKVxufVxuXG5leHBvcnRzLk11bHRpcGFydCA9IE11bHRpcGFydFxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcbnZhciBpc1VybCA9IC9eaHR0cHM/Oi9cblxuZnVuY3Rpb24gUmVkaXJlY3QgKHJlcXVlc3QpIHtcbiAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICB0aGlzLmZvbGxvd1JlZGlyZWN0ID0gdHJ1ZVxuICB0aGlzLmZvbGxvd1JlZGlyZWN0cyA9IHRydWVcbiAgdGhpcy5mb2xsb3dBbGxSZWRpcmVjdHMgPSBmYWxzZVxuICB0aGlzLmZvbGxvd09yaWdpbmFsSHR0cE1ldGhvZCA9IGZhbHNlXG4gIHRoaXMuYWxsb3dSZWRpcmVjdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWUgfVxuICB0aGlzLm1heFJlZGlyZWN0cyA9IDEwXG4gIHRoaXMucmVkaXJlY3RzID0gW11cbiAgdGhpcy5yZWRpcmVjdHNGb2xsb3dlZCA9IDBcbiAgdGhpcy5yZW1vdmVSZWZlcmVySGVhZGVyID0gZmFsc2Vcbn1cblxuUmVkaXJlY3QucHJvdG90eXBlLm9uUmVxdWVzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGlmIChvcHRpb25zLm1heFJlZGlyZWN0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2VsZi5tYXhSZWRpcmVjdHMgPSBvcHRpb25zLm1heFJlZGlyZWN0c1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5mb2xsb3dSZWRpcmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNlbGYuYWxsb3dSZWRpcmVjdCA9IG9wdGlvbnMuZm9sbG93UmVkaXJlY3RcbiAgfVxuICBpZiAob3B0aW9ucy5mb2xsb3dSZWRpcmVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2VsZi5mb2xsb3dSZWRpcmVjdHMgPSAhIW9wdGlvbnMuZm9sbG93UmVkaXJlY3RcbiAgfVxuICBpZiAob3B0aW9ucy5mb2xsb3dBbGxSZWRpcmVjdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHNlbGYuZm9sbG93QWxsUmVkaXJlY3RzID0gb3B0aW9ucy5mb2xsb3dBbGxSZWRpcmVjdHNcbiAgfVxuICBpZiAoc2VsZi5mb2xsb3dSZWRpcmVjdHMgfHwgc2VsZi5mb2xsb3dBbGxSZWRpcmVjdHMpIHtcbiAgICBzZWxmLnJlZGlyZWN0cyA9IHNlbGYucmVkaXJlY3RzIHx8IFtdXG4gIH1cbiAgaWYgKG9wdGlvbnMucmVtb3ZlUmVmZXJlckhlYWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2VsZi5yZW1vdmVSZWZlcmVySGVhZGVyID0gb3B0aW9ucy5yZW1vdmVSZWZlcmVySGVhZGVyXG4gIH1cbiAgaWYgKG9wdGlvbnMuZm9sbG93T3JpZ2luYWxIdHRwTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZWxmLmZvbGxvd09yaWdpbmFsSHR0cE1ldGhvZCA9IG9wdGlvbnMuZm9sbG93T3JpZ2luYWxIdHRwTWV0aG9kXG4gIH1cbn1cblxuUmVkaXJlY3QucHJvdG90eXBlLnJlZGlyZWN0VG8gPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciByZXF1ZXN0ID0gc2VsZi5yZXF1ZXN0XG5cbiAgdmFyIHJlZGlyZWN0VG8gPSBudWxsXG4gIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID49IDMwMCAmJiByZXNwb25zZS5zdGF0dXNDb2RlIDwgNDAwICYmIHJlc3BvbnNlLmNhc2VsZXNzLmhhcygnbG9jYXRpb24nKSkge1xuICAgIHZhciBsb2NhdGlvbiA9IHJlc3BvbnNlLmNhc2VsZXNzLmdldCgnbG9jYXRpb24nKVxuICAgIHJlcXVlc3QuZGVidWcoJ3JlZGlyZWN0JywgbG9jYXRpb24pXG5cbiAgICBpZiAoc2VsZi5mb2xsb3dBbGxSZWRpcmVjdHMpIHtcbiAgICAgIHJlZGlyZWN0VG8gPSBsb2NhdGlvblxuICAgIH0gZWxzZSBpZiAoc2VsZi5mb2xsb3dSZWRpcmVjdHMpIHtcbiAgICAgIHN3aXRjaCAocmVxdWVzdC5tZXRob2QpIHtcbiAgICAgICAgY2FzZSAnUEFUQ0gnOlxuICAgICAgICBjYXNlICdQVVQnOlxuICAgICAgICBjYXNlICdQT1NUJzpcbiAgICAgICAgY2FzZSAnREVMRVRFJzpcbiAgICAgICAgICAvLyBEbyBub3QgZm9sbG93IHJlZGlyZWN0c1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVkaXJlY3RUbyA9IGxvY2F0aW9uXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxKSB7XG4gICAgdmFyIGF1dGhIZWFkZXIgPSByZXF1ZXN0Ll9hdXRoLm9uUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgaWYgKGF1dGhIZWFkZXIpIHtcbiAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCdhdXRob3JpemF0aW9uJywgYXV0aEhlYWRlcilcbiAgICAgIHJlZGlyZWN0VG8gPSByZXF1ZXN0LnVyaVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVkaXJlY3RUb1xufVxuXG5SZWRpcmVjdC5wcm90b3R5cGUub25SZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHJlcXVlc3QgPSBzZWxmLnJlcXVlc3RcblxuICB2YXIgcmVkaXJlY3RUbyA9IHNlbGYucmVkaXJlY3RUbyhyZXNwb25zZSlcbiAgaWYgKCFyZWRpcmVjdFRvIHx8ICFzZWxmLmFsbG93UmVkaXJlY3QuY2FsbChyZXF1ZXN0LCByZXNwb25zZSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJlcXVlc3QuZGVidWcoJ3JlZGlyZWN0IHRvJywgcmVkaXJlY3RUbylcblxuICAvLyBpZ25vcmUgYW55IHBvdGVudGlhbCByZXNwb25zZSBib2R5LiAgaXQgY2Fubm90IHBvc3NpYmx5IGJlIHVzZWZ1bFxuICAvLyB0byB1cyBhdCB0aGlzIHBvaW50LlxuICAvLyByZXNwb25zZS5yZXN1bWUgc2hvdWxkIGJlIGRlZmluZWQsIGJ1dCBjaGVjayBhbnl3YXkgYmVmb3JlIGNhbGxpbmcuIFdvcmthcm91bmQgZm9yIGJyb3dzZXJpZnkuXG4gIGlmIChyZXNwb25zZS5yZXN1bWUpIHtcbiAgICByZXNwb25zZS5yZXN1bWUoKVxuICB9XG5cbiAgaWYgKHNlbGYucmVkaXJlY3RzRm9sbG93ZWQgPj0gc2VsZi5tYXhSZWRpcmVjdHMpIHtcbiAgICByZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdFeGNlZWRlZCBtYXhSZWRpcmVjdHMuIFByb2JhYmx5IHN0dWNrIGluIGEgcmVkaXJlY3QgbG9vcCAnICsgcmVxdWVzdC51cmkuaHJlZikpXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgc2VsZi5yZWRpcmVjdHNGb2xsb3dlZCArPSAxXG5cbiAgaWYgKCFpc1VybC50ZXN0KHJlZGlyZWN0VG8pKSB7XG4gICAgcmVkaXJlY3RUbyA9IHVybC5yZXNvbHZlKHJlcXVlc3QudXJpLmhyZWYsIHJlZGlyZWN0VG8pXG4gIH1cblxuICB2YXIgdXJpUHJldiA9IHJlcXVlc3QudXJpXG4gIHJlcXVlc3QudXJpID0gdXJsLnBhcnNlKHJlZGlyZWN0VG8pXG5cbiAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGNoYW5nZSBwcm90b2NvbCBmcm9tIGh0dHBzIHRvIGh0dHAgb3IgdmljZSB2ZXJzYVxuICBpZiAocmVxdWVzdC51cmkucHJvdG9jb2wgIT09IHVyaVByZXYucHJvdG9jb2wpIHtcbiAgICBkZWxldGUgcmVxdWVzdC5hZ2VudFxuICB9XG5cbiAgc2VsZi5yZWRpcmVjdHMucHVzaCh7IHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlZGlyZWN0VXJpOiByZWRpcmVjdFRvIH0pXG5cbiAgaWYgKHNlbGYuZm9sbG93QWxsUmVkaXJlY3RzICYmIHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcgJiZcbiAgICByZXNwb25zZS5zdGF0dXNDb2RlICE9PSA0MDEgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMzA3KSB7XG4gICAgcmVxdWVzdC5tZXRob2QgPSBzZWxmLmZvbGxvd09yaWdpbmFsSHR0cE1ldGhvZCA/IHJlcXVlc3QubWV0aG9kIDogJ0dFVCdcbiAgfVxuICAvLyByZXF1ZXN0Lm1ldGhvZCA9ICdHRVQnIC8vIEZvcmNlIGFsbCByZWRpcmVjdHMgdG8gdXNlIEdFVCB8fCBjb21tZW50ZWQgb3V0IGZpeGVzICMyMTVcbiAgZGVsZXRlIHJlcXVlc3Quc3JjXG4gIGRlbGV0ZSByZXF1ZXN0LnJlcVxuICBkZWxldGUgcmVxdWVzdC5fc3RhcnRlZFxuICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gNDAxICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDMwNykge1xuICAgIC8vIFJlbW92ZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHByZXZpb3VzIHJlc3BvbnNlLCB1bmxlc3MgdGhpcyBpcyB0aGUgc2Vjb25kIHJlcXVlc3RcbiAgICAvLyBmb3IgYSBzZXJ2ZXIgdGhhdCByZXF1aXJlcyBkaWdlc3QgYXV0aGVudGljYXRpb24uXG4gICAgZGVsZXRlIHJlcXVlc3QuYm9keVxuICAgIGRlbGV0ZSByZXF1ZXN0Ll9mb3JtXG4gICAgaWYgKHJlcXVlc3QuaGVhZGVycykge1xuICAgICAgcmVxdWVzdC5yZW1vdmVIZWFkZXIoJ2hvc3QnKVxuICAgICAgcmVxdWVzdC5yZW1vdmVIZWFkZXIoJ2NvbnRlbnQtdHlwZScpXG4gICAgICByZXF1ZXN0LnJlbW92ZUhlYWRlcignY29udGVudC1sZW5ndGgnKVxuICAgICAgaWYgKHJlcXVlc3QudXJpLmhvc3RuYW1lICE9PSByZXF1ZXN0Lm9yaWdpbmFsSG9zdC5zcGxpdCgnOicpWzBdKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhdXRob3JpemF0aW9uIGlmIGNoYW5naW5nIGhvc3RuYW1lcyAoYnV0IG5vdCBpZiBqdXN0XG4gICAgICAgIC8vIGNoYW5naW5nIHBvcnRzIG9yIHByb3RvY29scykuICBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIGN1cmw6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWdkZXIvY3VybC9ibG9iLzZiZWIwZWVlL2xpYi9odHRwLmMjTDcxMFxuICAgICAgICByZXF1ZXN0LnJlbW92ZUhlYWRlcignYXV0aG9yaXphdGlvbicpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFzZWxmLnJlbW92ZVJlZmVyZXJIZWFkZXIpIHtcbiAgICByZXF1ZXN0LnNldEhlYWRlcigncmVmZXJlcicsIHVyaVByZXYuaHJlZilcbiAgfVxuXG4gIHJlcXVlc3QuZW1pdCgncmVkaXJlY3QnKVxuXG4gIHJlcXVlc3QuaW5pdCgpXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0cy5SZWRpcmVjdCA9IFJlZGlyZWN0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBuZXQgPSByZXF1aXJlKCduZXQnKVxuICAsIHRscyA9IHJlcXVpcmUoJ3RscycpXG4gICwgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKVxuICAsIGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKVxuICAsIGV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpXG4gICwgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbiAgLCB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG4gICwgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbiAgO1xuXG5leHBvcnRzLmh0dHBPdmVySHR0cCA9IGh0dHBPdmVySHR0cFxuZXhwb3J0cy5odHRwc092ZXJIdHRwID0gaHR0cHNPdmVySHR0cFxuZXhwb3J0cy5odHRwT3Zlckh0dHBzID0gaHR0cE92ZXJIdHRwc1xuZXhwb3J0cy5odHRwc092ZXJIdHRwcyA9IGh0dHBzT3Zlckh0dHBzXG5cblxuZnVuY3Rpb24gaHR0cE92ZXJIdHRwKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpXG4gIGFnZW50LnJlcXVlc3QgPSBodHRwLnJlcXVlc3RcbiAgcmV0dXJuIGFnZW50XG59XG5cbmZ1bmN0aW9uIGh0dHBzT3Zlckh0dHAob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucylcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHAucmVxdWVzdFxuICBhZ2VudC5jcmVhdGVTb2NrZXQgPSBjcmVhdGVTZWN1cmVTb2NrZXRcbiAgYWdlbnQuZGVmYXVsdFBvcnQgPSA0NDNcbiAgcmV0dXJuIGFnZW50XG59XG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cHMob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucylcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHBzLnJlcXVlc3RcbiAgcmV0dXJuIGFnZW50XG59XG5cbmZ1bmN0aW9uIGh0dHBzT3Zlckh0dHBzKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpXG4gIGFnZW50LnJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0XG4gIGFnZW50LmNyZWF0ZVNvY2tldCA9IGNyZWF0ZVNlY3VyZVNvY2tldFxuICBhZ2VudC5kZWZhdWx0UG9ydCA9IDQ0M1xuICByZXR1cm4gYWdlbnRcbn1cblxuXG5mdW5jdGlvbiBUdW5uZWxpbmdBZ2VudChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHNlbGYucHJveHlPcHRpb25zID0gc2VsZi5vcHRpb25zLnByb3h5IHx8IHt9XG4gIHNlbGYubWF4U29ja2V0cyA9IHNlbGYub3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuQWdlbnQuZGVmYXVsdE1heFNvY2tldHNcbiAgc2VsZi5yZXF1ZXN0cyA9IFtdXG4gIHNlbGYuc29ja2V0cyA9IFtdXG5cbiAgc2VsZi5vbignZnJlZScsIGZ1bmN0aW9uIG9uRnJlZShzb2NrZXQsIGhvc3QsIHBvcnQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5yZXF1ZXN0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgdmFyIHBlbmRpbmcgPSBzZWxmLnJlcXVlc3RzW2ldXG4gICAgICBpZiAocGVuZGluZy5ob3N0ID09PSBob3N0ICYmIHBlbmRpbmcucG9ydCA9PT0gcG9ydCkge1xuICAgICAgICAvLyBEZXRlY3QgdGhlIHJlcXVlc3QgdG8gY29ubmVjdCBzYW1lIG9yaWdpbiBzZXJ2ZXIsXG4gICAgICAgIC8vIHJldXNlIHRoZSBjb25uZWN0aW9uLlxuICAgICAgICBzZWxmLnJlcXVlc3RzLnNwbGljZShpLCAxKVxuICAgICAgICBwZW5kaW5nLnJlcXVlc3Qub25Tb2NrZXQoc29ja2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgc29ja2V0LmRlc3Ryb3koKVxuICAgIHNlbGYucmVtb3ZlU29ja2V0KHNvY2tldClcbiAgfSlcbn1cbnV0aWwuaW5oZXJpdHMoVHVubmVsaW5nQWdlbnQsIGV2ZW50cy5FdmVudEVtaXR0ZXIpXG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24gYWRkUmVxdWVzdChyZXEsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgIC8vIExlZ2FjeSBBUEk6IGFkZFJlcXVlc3QocmVxLCBob3N0LCBwb3J0LCBwYXRoKVxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGhvc3Q6IG9wdGlvbnMsXG4gICAgICBwb3J0OiBhcmd1bWVudHNbMl0sXG4gICAgICBwYXRoOiBhcmd1bWVudHNbM11cbiAgICB9O1xuICB9XG5cbiAgaWYgKHNlbGYuc29ja2V0cy5sZW5ndGggPj0gdGhpcy5tYXhTb2NrZXRzKSB7XG4gICAgLy8gV2UgYXJlIG92ZXIgbGltaXQgc28gd2UnbGwgYWRkIGl0IHRvIHRoZSBxdWV1ZS5cbiAgICBzZWxmLnJlcXVlc3RzLnB1c2goe2hvc3Q6IG9wdGlvbnMuaG9zdCwgcG9ydDogb3B0aW9ucy5wb3J0LCByZXF1ZXN0OiByZXF9KVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSWYgd2UgYXJlIHVuZGVyIG1heFNvY2tldHMgY3JlYXRlIGEgbmV3IG9uZS5cbiAgc2VsZi5jcmVhdGVDb25uZWN0aW9uKHtob3N0OiBvcHRpb25zLmhvc3QsIHBvcnQ6IG9wdGlvbnMucG9ydCwgcmVxdWVzdDogcmVxfSlcbn1cblxuVHVubmVsaW5nQWdlbnQucHJvdG90eXBlLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9uKHBlbmRpbmcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgc2VsZi5jcmVhdGVTb2NrZXQocGVuZGluZywgZnVuY3Rpb24oc29ja2V0KSB7XG4gICAgc29ja2V0Lm9uKCdmcmVlJywgb25GcmVlKVxuICAgIHNvY2tldC5vbignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpXG4gICAgc29ja2V0Lm9uKCdhZ2VudFJlbW92ZScsIG9uQ2xvc2VPclJlbW92ZSlcbiAgICBwZW5kaW5nLnJlcXVlc3Qub25Tb2NrZXQoc29ja2V0KVxuXG4gICAgZnVuY3Rpb24gb25GcmVlKCkge1xuICAgICAgc2VsZi5lbWl0KCdmcmVlJywgc29ja2V0LCBwZW5kaW5nLmhvc3QsIHBlbmRpbmcucG9ydClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsb3NlT3JSZW1vdmUoZXJyKSB7XG4gICAgICBzZWxmLnJlbW92ZVNvY2tldChzb2NrZXQpXG4gICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2ZyZWUnLCBvbkZyZWUpXG4gICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25DbG9zZU9yUmVtb3ZlKVxuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdhZ2VudFJlbW92ZScsIG9uQ2xvc2VPclJlbW92ZSlcbiAgICB9XG4gIH0pXG59XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQgPSBmdW5jdGlvbiBjcmVhdGVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBwbGFjZWhvbGRlciA9IHt9XG4gIHNlbGYuc29ja2V0cy5wdXNoKHBsYWNlaG9sZGVyKVxuXG4gIHZhciBjb25uZWN0T3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5wcm94eU9wdGlvbnMsXG4gICAgeyBtZXRob2Q6ICdDT05ORUNUJ1xuICAgICwgcGF0aDogb3B0aW9ucy5ob3N0ICsgJzonICsgb3B0aW9ucy5wb3J0XG4gICAgLCBhZ2VudDogZmFsc2VcbiAgICB9XG4gIClcbiAgaWYgKGNvbm5lY3RPcHRpb25zLnByb3h5QXV0aCkge1xuICAgIGNvbm5lY3RPcHRpb25zLmhlYWRlcnMgPSBjb25uZWN0T3B0aW9ucy5oZWFkZXJzIHx8IHt9XG4gICAgY29ubmVjdE9wdGlvbnMuaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgK1xuICAgICAgICBCdWZmZXIuZnJvbShjb25uZWN0T3B0aW9ucy5wcm94eUF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICB9XG5cbiAgZGVidWcoJ21ha2luZyBDT05ORUNUIHJlcXVlc3QnKVxuICB2YXIgY29ubmVjdFJlcSA9IHNlbGYucmVxdWVzdChjb25uZWN0T3B0aW9ucylcbiAgY29ubmVjdFJlcS51c2VDaHVua2VkRW5jb2RpbmdCeURlZmF1bHQgPSBmYWxzZSAvLyBmb3IgdjAuNlxuICBjb25uZWN0UmVxLm9uY2UoJ3Jlc3BvbnNlJywgb25SZXNwb25zZSkgLy8gZm9yIHYwLjZcbiAgY29ubmVjdFJlcS5vbmNlKCd1cGdyYWRlJywgb25VcGdyYWRlKSAgIC8vIGZvciB2MC42XG4gIGNvbm5lY3RSZXEub25jZSgnY29ubmVjdCcsIG9uQ29ubmVjdCkgICAvLyBmb3IgdjAuNyBvciBsYXRlclxuICBjb25uZWN0UmVxLm9uY2UoJ2Vycm9yJywgb25FcnJvcilcbiAgY29ubmVjdFJlcS5lbmQoKVxuXG4gIGZ1bmN0aW9uIG9uUmVzcG9uc2UocmVzKSB7XG4gICAgLy8gVmVyeSBoYWNreS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgaHR0cC1wYXJzZXIgbGVha3MuXG4gICAgcmVzLnVwZ3JhZGUgPSB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBvblVwZ3JhZGUocmVzLCBzb2NrZXQsIGhlYWQpIHtcbiAgICAvLyBIYWNreS5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgb25Db25uZWN0KHJlcywgc29ja2V0LCBoZWFkKVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBvbkNvbm5lY3QocmVzLCBzb2NrZXQsIGhlYWQpIHtcbiAgICBjb25uZWN0UmVxLnJlbW92ZUFsbExpc3RlbmVycygpXG4gICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycygpXG5cbiAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGhlYWQubGVuZ3RoLCAwKVxuICAgICAgZGVidWcoJ3R1bm5lbGluZyBjb25uZWN0aW9uIGhhcyBlc3RhYmxpc2hlZCcpXG4gICAgICBzZWxmLnNvY2tldHNbc2VsZi5zb2NrZXRzLmluZGV4T2YocGxhY2Vob2xkZXIpXSA9IHNvY2tldFxuICAgICAgY2Ioc29ja2V0KVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZygndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsIHN0YXR1c0NvZGU9JWQnLCByZXMuc3RhdHVzQ29kZSlcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsICcgKyAnc3RhdHVzQ29kZT0nICsgcmVzLnN0YXR1c0NvZGUpXG4gICAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnXG4gICAgICBvcHRpb25zLnJlcXVlc3QuZW1pdCgnZXJyb3InLCBlcnJvcilcbiAgICAgIHNlbGYucmVtb3ZlU29ja2V0KHBsYWNlaG9sZGVyKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRXJyb3IoY2F1c2UpIHtcbiAgICBjb25uZWN0UmVxLnJlbW92ZUFsbExpc3RlbmVycygpXG5cbiAgICBkZWJ1ZygndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsIGNhdXNlPSVzXFxuJywgY2F1c2UubWVzc2FnZSwgY2F1c2Uuc3RhY2spXG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCd0dW5uZWxpbmcgc29ja2V0IGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCwgJyArICdjYXVzZT0nICsgY2F1c2UubWVzc2FnZSlcbiAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnXG4gICAgb3B0aW9ucy5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gICAgc2VsZi5yZW1vdmVTb2NrZXQocGxhY2Vob2xkZXIpXG4gIH1cbn1cblxuVHVubmVsaW5nQWdlbnQucHJvdG90eXBlLnJlbW92ZVNvY2tldCA9IGZ1bmN0aW9uIHJlbW92ZVNvY2tldChzb2NrZXQpIHtcbiAgdmFyIHBvcyA9IHRoaXMuc29ja2V0cy5pbmRleE9mKHNvY2tldClcbiAgaWYgKHBvcyA9PT0gLTEpIHJldHVyblxuXG4gIHRoaXMuc29ja2V0cy5zcGxpY2UocG9zLCAxKVxuXG4gIHZhciBwZW5kaW5nID0gdGhpcy5yZXF1ZXN0cy5zaGlmdCgpXG4gIGlmIChwZW5kaW5nKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHJlcXVlc3RzIGFuZCBhIHNvY2tldCBnZXRzIGNsb3NlZCBhIG5ldyBvbmVcbiAgICAvLyBuZWVkcyB0byBiZSBjcmVhdGVkIHRvIHRha2Ugb3ZlciBpbiB0aGUgcG9vbCBmb3IgdGhlIG9uZSB0aGF0IGNsb3NlZC5cbiAgICB0aGlzLmNyZWF0ZUNvbm5lY3Rpb24ocGVuZGluZylcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTZWN1cmVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIFR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQuY2FsbChzZWxmLCBvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICAvLyAwIGlzIGR1bW15IHBvcnQgZm9yIHYwLjZcbiAgICB2YXIgc2VjdXJlU29ja2V0ID0gdGxzLmNvbm5lY3QoMCwgbWVyZ2VPcHRpb25zKHt9LCBzZWxmLm9wdGlvbnMsXG4gICAgICB7IHNlcnZlcm5hbWU6IG9wdGlvbnMuaG9zdFxuICAgICAgLCBzb2NrZXQ6IHNvY2tldFxuICAgICAgfVxuICAgICkpXG4gICAgc2VsZi5zb2NrZXRzW3NlbGYuc29ja2V0cy5pbmRleE9mKHNvY2tldCldID0gc2VjdXJlU29ja2V0XG4gICAgY2Ioc2VjdXJlU29ja2V0KVxuICB9KVxufVxuXG5cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciBvdmVycmlkZXMgPSBhcmd1bWVudHNbaV1cbiAgICBpZiAodHlwZW9mIG92ZXJyaWRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKVxuICAgICAgZm9yICh2YXIgaiA9IDAsIGtleUxlbiA9IGtleXMubGVuZ3RoOyBqIDwga2V5TGVuOyArK2opIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW2pdXG4gICAgICAgIGlmIChvdmVycmlkZXNba10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRhcmdldFtrXSA9IG92ZXJyaWRlc1trXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRcbn1cblxuXG52YXIgZGVidWdcbmlmIChwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmIC9cXGJ0dW5uZWxcXGIvLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRykpIHtcbiAgZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhcmdzWzBdID0gJ1RVTk5FTDogJyArIGFyZ3NbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJncy51bnNoaWZ0KCdUVU5ORUw6JylcbiAgICB9XG4gICAgY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLCBhcmdzKVxuICB9XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge31cbn1cbmV4cG9ydHMuZGVidWcgPSBkZWJ1ZyAvLyBmb3IgdGVzdFxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcbnZhciB0dW5uZWwgPSByZXF1aXJlKCd0dW5uZWwtYWdlbnQnKVxuXG52YXIgZGVmYXVsdFByb3h5SGVhZGVyV2hpdGVMaXN0ID0gW1xuICAnYWNjZXB0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JyxcbiAgJ2FjY2VwdC1lbmNvZGluZycsXG4gICdhY2NlcHQtbGFuZ3VhZ2UnLFxuICAnYWNjZXB0LXJhbmdlcycsXG4gICdjYWNoZS1jb250cm9sJyxcbiAgJ2NvbnRlbnQtZW5jb2RpbmcnLFxuICAnY29udGVudC1sYW5ndWFnZScsXG4gICdjb250ZW50LWxvY2F0aW9uJyxcbiAgJ2NvbnRlbnQtbWQ1JyxcbiAgJ2NvbnRlbnQtcmFuZ2UnLFxuICAnY29udGVudC10eXBlJyxcbiAgJ2Nvbm5lY3Rpb24nLFxuICAnZGF0ZScsXG4gICdleHBlY3QnLFxuICAnbWF4LWZvcndhcmRzJyxcbiAgJ3ByYWdtYScsXG4gICdyZWZlcmVyJyxcbiAgJ3RlJyxcbiAgJ3VzZXItYWdlbnQnLFxuICAndmlhJ1xuXVxuXG52YXIgZGVmYXVsdFByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9IFtcbiAgJ3Byb3h5LWF1dGhvcml6YXRpb24nXG5dXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFByb3h5SG9zdCAodXJpT2JqZWN0KSB7XG4gIHZhciBwb3J0ID0gdXJpT2JqZWN0LnBvcnRcbiAgdmFyIHByb3RvY29sID0gdXJpT2JqZWN0LnByb3RvY29sXG4gIHZhciBwcm94eUhvc3QgPSB1cmlPYmplY3QuaG9zdG5hbWUgKyAnOidcblxuICBpZiAocG9ydCkge1xuICAgIHByb3h5SG9zdCArPSBwb3J0XG4gIH0gZWxzZSBpZiAocHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgcHJveHlIb3N0ICs9ICc0NDMnXG4gIH0gZWxzZSB7XG4gICAgcHJveHlIb3N0ICs9ICc4MCdcbiAgfVxuXG4gIHJldHVybiBwcm94eUhvc3Rcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0UHJveHlIZWFkZXJXaGl0ZUxpc3QgKGhlYWRlcnMsIHByb3h5SGVhZGVyV2hpdGVMaXN0KSB7XG4gIHZhciB3aGl0ZUxpc3QgPSBwcm94eUhlYWRlcldoaXRlTGlzdFxuICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHNldCwgaGVhZGVyKSB7XG4gICAgICBzZXRbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gdHJ1ZVxuICAgICAgcmV0dXJuIHNldFxuICAgIH0sIHt9KVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgcmV0dXJuIHdoaXRlTGlzdFtoZWFkZXIudG9Mb3dlckNhc2UoKV1cbiAgICB9KVxuICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHNldCwgaGVhZGVyKSB7XG4gICAgICBzZXRbaGVhZGVyXSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgcmV0dXJuIHNldFxuICAgIH0sIHt9KVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RUdW5uZWxPcHRpb25zIChyZXF1ZXN0LCBwcm94eUhlYWRlcnMpIHtcbiAgdmFyIHByb3h5ID0gcmVxdWVzdC5wcm94eVxuXG4gIHZhciB0dW5uZWxPcHRpb25zID0ge1xuICAgIHByb3h5OiB7XG4gICAgICBob3N0OiBwcm94eS5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6ICtwcm94eS5wb3J0LFxuICAgICAgcHJveHlBdXRoOiBwcm94eS5hdXRoLFxuICAgICAgaGVhZGVyczogcHJveHlIZWFkZXJzXG4gICAgfSxcbiAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgY2E6IHJlcXVlc3QuY2EsXG4gICAgY2VydDogcmVxdWVzdC5jZXJ0LFxuICAgIGtleTogcmVxdWVzdC5rZXksXG4gICAgcGFzc3BocmFzZTogcmVxdWVzdC5wYXNzcGhyYXNlLFxuICAgIHBmeDogcmVxdWVzdC5wZngsXG4gICAgY2lwaGVyczogcmVxdWVzdC5jaXBoZXJzLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZDogcmVxdWVzdC5yZWplY3RVbmF1dGhvcml6ZWQsXG4gICAgc2VjdXJlT3B0aW9uczogcmVxdWVzdC5zZWN1cmVPcHRpb25zLFxuICAgIHNlY3VyZVByb3RvY29sOiByZXF1ZXN0LnNlY3VyZVByb3RvY29sXG4gIH1cblxuICByZXR1cm4gdHVubmVsT3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RUdW5uZWxGbk5hbWUgKHVyaSwgcHJveHkpIHtcbiAgdmFyIHVyaVByb3RvY29sID0gKHVyaS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnaHR0cHMnIDogJ2h0dHAnKVxuICB2YXIgcHJveHlQcm90b2NvbCA9IChwcm94eS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnSHR0cHMnIDogJ0h0dHAnKVxuICByZXR1cm4gW3VyaVByb3RvY29sLCBwcm94eVByb3RvY29sXS5qb2luKCdPdmVyJylcbn1cblxuZnVuY3Rpb24gZ2V0VHVubmVsRm4gKHJlcXVlc3QpIHtcbiAgdmFyIHVyaSA9IHJlcXVlc3QudXJpXG4gIHZhciBwcm94eSA9IHJlcXVlc3QucHJveHlcbiAgdmFyIHR1bm5lbEZuTmFtZSA9IGNvbnN0cnVjdFR1bm5lbEZuTmFtZSh1cmksIHByb3h5KVxuICByZXR1cm4gdHVubmVsW3R1bm5lbEZuTmFtZV1cbn1cblxuZnVuY3Rpb24gVHVubmVsIChyZXF1ZXN0KSB7XG4gIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgdGhpcy5wcm94eUhlYWRlcldoaXRlTGlzdCA9IGRlZmF1bHRQcm94eUhlYWRlcldoaXRlTGlzdFxuICB0aGlzLnByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9IFtdXG4gIGlmICh0eXBlb2YgcmVxdWVzdC50dW5uZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy50dW5uZWxPdmVycmlkZSA9IHJlcXVlc3QudHVubmVsXG4gIH1cbn1cblxuVHVubmVsLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgcmVxdWVzdCA9IHNlbGYucmVxdWVzdFxuICAgIC8vIFR1bm5lbCBIVFRQUyBieSBkZWZhdWx0LiBBbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGlzIHNldHRpbmcuXG5cbiAgLy8gSWYgc2VsZi50dW5uZWxPdmVycmlkZSBpcyBzZXQgKHRoZSB1c2VyIHNwZWNpZmllZCBhIHZhbHVlKSwgdXNlIGl0LlxuICBpZiAodHlwZW9mIHNlbGYudHVubmVsT3ZlcnJpZGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHNlbGYudHVubmVsT3ZlcnJpZGVcbiAgfVxuXG4gIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBIVFRQUywgdHVubmVsLlxuICBpZiAocmVxdWVzdC51cmkucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgZG8gbm90IHVzZSB0dW5uZWwuXG4gIHJldHVybiBmYWxzZVxufVxuXG5UdW5uZWwucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciByZXF1ZXN0ID0gc2VsZi5yZXF1ZXN0XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAodHlwZW9mIHJlcXVlc3QucHJveHkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVxdWVzdC5wcm94eSA9IHVybC5wYXJzZShyZXF1ZXN0LnByb3h5KVxuICB9XG5cbiAgaWYgKCFyZXF1ZXN0LnByb3h5IHx8ICFyZXF1ZXN0LnR1bm5lbCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gU2V0dXAgUHJveHkgSGVhZGVyIEV4Y2x1c2l2ZSBMaXN0IGFuZCBXaGl0ZSBMaXN0XG4gIGlmIChvcHRpb25zLnByb3h5SGVhZGVyV2hpdGVMaXN0KSB7XG4gICAgc2VsZi5wcm94eUhlYWRlcldoaXRlTGlzdCA9IG9wdGlvbnMucHJveHlIZWFkZXJXaGl0ZUxpc3RcbiAgfVxuICBpZiAob3B0aW9ucy5wcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3QpIHtcbiAgICBzZWxmLnByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9IG9wdGlvbnMucHJveHlIZWFkZXJFeGNsdXNpdmVMaXN0XG4gIH1cblxuICB2YXIgcHJveHlIZWFkZXJFeGNsdXNpdmVMaXN0ID0gc2VsZi5wcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3QuY29uY2F0KGRlZmF1bHRQcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3QpXG4gIHZhciBwcm94eUhlYWRlcldoaXRlTGlzdCA9IHNlbGYucHJveHlIZWFkZXJXaGl0ZUxpc3QuY29uY2F0KHByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdClcblxuICAvLyBTZXR1cCBQcm94eSBIZWFkZXJzIGFuZCBQcm94eSBIZWFkZXJzIEhvc3RcbiAgLy8gT25seSBzZW5kIHRoZSBQcm94eSBXaGl0ZSBMaXN0ZWQgSGVhZGVyIG5hbWVzXG4gIHZhciBwcm94eUhlYWRlcnMgPSBjb25zdHJ1Y3RQcm94eUhlYWRlcldoaXRlTGlzdChyZXF1ZXN0LmhlYWRlcnMsIHByb3h5SGVhZGVyV2hpdGVMaXN0KVxuICBwcm94eUhlYWRlcnMuaG9zdCA9IGNvbnN0cnVjdFByb3h5SG9zdChyZXF1ZXN0LnVyaSlcblxuICBwcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3QuZm9yRWFjaChyZXF1ZXN0LnJlbW92ZUhlYWRlciwgcmVxdWVzdClcblxuICAvLyBTZXQgQWdlbnQgZnJvbSBUdW5uZWwgRGF0YVxuICB2YXIgdHVubmVsRm4gPSBnZXRUdW5uZWxGbihyZXF1ZXN0KVxuICB2YXIgdHVubmVsT3B0aW9ucyA9IGNvbnN0cnVjdFR1bm5lbE9wdGlvbnMocmVxdWVzdCwgcHJveHlIZWFkZXJzKVxuICByZXF1ZXN0LmFnZW50ID0gdHVubmVsRm4odHVubmVsT3B0aW9ucylcblxuICByZXR1cm4gdHJ1ZVxufVxuXG5UdW5uZWwuZGVmYXVsdFByb3h5SGVhZGVyV2hpdGVMaXN0ID0gZGVmYXVsdFByb3h5SGVhZGVyV2hpdGVMaXN0XG5UdW5uZWwuZGVmYXVsdFByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9IGRlZmF1bHRQcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3RcbmV4cG9ydHMuVHVubmVsID0gVHVubmVsXG4iLCBudWxsLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpXG52YXIgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG52YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbnZhciB6bGliID0gcmVxdWlyZSgnemxpYicpXG52YXIgYXdzMiA9IHJlcXVpcmUoJ2F3cy1zaWduMicpXG52YXIgYXdzNCA9IHJlcXVpcmUoJ2F3czQnKVxudmFyIGh0dHBTaWduYXR1cmUgPSByZXF1aXJlKCdodHRwLXNpZ25hdHVyZScpXG52YXIgbWltZSA9IHJlcXVpcmUoJ21pbWUtdHlwZXMnKVxudmFyIGNhc2VsZXNzID0gcmVxdWlyZSgnY2FzZWxlc3MnKVxudmFyIEZvcmV2ZXJBZ2VudCA9IHJlcXVpcmUoJ2ZvcmV2ZXItYWdlbnQnKVxudmFyIEZvcm1EYXRhID0gcmVxdWlyZSgnZm9ybS1kYXRhJylcbnZhciBleHRlbmQgPSByZXF1aXJlKCdleHRlbmQnKVxudmFyIGlzc3RyZWFtID0gcmVxdWlyZSgnaXNzdHJlYW0nKVxudmFyIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJ2lzLXR5cGVkYXJyYXknKS5zdHJpY3RcbnZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9saWIvaGVscGVycycpXG52YXIgY29va2llcyA9IHJlcXVpcmUoJy4vbGliL2Nvb2tpZXMnKVxudmFyIGdldFByb3h5RnJvbVVSSSA9IHJlcXVpcmUoJy4vbGliL2dldFByb3h5RnJvbVVSSScpXG52YXIgUXVlcnlzdHJpbmcgPSByZXF1aXJlKCcuL2xpYi9xdWVyeXN0cmluZycpLlF1ZXJ5c3RyaW5nXG52YXIgSGFyID0gcmVxdWlyZSgnLi9saWIvaGFyJykuSGFyXG52YXIgQXV0aCA9IHJlcXVpcmUoJy4vbGliL2F1dGgnKS5BdXRoXG52YXIgT0F1dGggPSByZXF1aXJlKCcuL2xpYi9vYXV0aCcpLk9BdXRoXG52YXIgaGF3ayA9IHJlcXVpcmUoJy4vbGliL2hhd2snKVxudmFyIE11bHRpcGFydCA9IHJlcXVpcmUoJy4vbGliL211bHRpcGFydCcpLk11bHRpcGFydFxudmFyIFJlZGlyZWN0ID0gcmVxdWlyZSgnLi9saWIvcmVkaXJlY3QnKS5SZWRpcmVjdFxudmFyIFR1bm5lbCA9IHJlcXVpcmUoJy4vbGliL3R1bm5lbCcpLlR1bm5lbFxudmFyIG5vdyA9IHJlcXVpcmUoJ3BlcmZvcm1hbmNlLW5vdycpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIHNhZmVTdHJpbmdpZnkgPSBoZWxwZXJzLnNhZmVTdHJpbmdpZnlcbnZhciBpc1JlYWRTdHJlYW0gPSBoZWxwZXJzLmlzUmVhZFN0cmVhbVxudmFyIHRvQmFzZTY0ID0gaGVscGVycy50b0Jhc2U2NFxudmFyIGRlZmVyID0gaGVscGVycy5kZWZlclxudmFyIGNvcHkgPSBoZWxwZXJzLmNvcHlcbnZhciB2ZXJzaW9uID0gaGVscGVycy52ZXJzaW9uXG52YXIgZ2xvYmFsQ29va2llSmFyID0gY29va2llcy5qYXIoKVxuXG52YXIgZ2xvYmFsUG9vbCA9IHt9XG5cbmZ1bmN0aW9uIGZpbHRlckZvck5vblJlc2VydmVkIChyZXNlcnZlZCwgb3B0aW9ucykge1xuICAvLyBGaWx0ZXIgb3V0IHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHJlc2VydmVkLlxuICAvLyBSZXNlcnZlZCB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBhdCBjYWxsIHNpdGUuXG5cbiAgdmFyIG9iamVjdCA9IHt9XG4gIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgIHZhciBub3RSZXNlcnZlZCA9IChyZXNlcnZlZC5pbmRleE9mKGkpID09PSAtMSlcbiAgICBpZiAobm90UmVzZXJ2ZWQpIHtcbiAgICAgIG9iamVjdFtpXSA9IG9wdGlvbnNbaV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iamVjdFxufVxuXG5mdW5jdGlvbiBmaWx0ZXJPdXRSZXNlcnZlZEZ1bmN0aW9ucyAocmVzZXJ2ZWQsIG9wdGlvbnMpIHtcbiAgLy8gRmlsdGVyIG91dCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucyBhbmQgYXJlIHJlc2VydmVkLlxuICAvLyBSZXNlcnZlZCB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBhdCBjYWxsIHNpdGUuXG5cbiAgdmFyIG9iamVjdCA9IHt9XG4gIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgIHZhciBpc1Jlc2VydmVkID0gIShyZXNlcnZlZC5pbmRleE9mKGkpID09PSAtMSlcbiAgICB2YXIgaXNGdW5jdGlvbiA9ICh0eXBlb2Ygb3B0aW9uc1tpXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBpZiAoIShpc1Jlc2VydmVkICYmIGlzRnVuY3Rpb24pKSB7XG4gICAgICBvYmplY3RbaV0gPSBvcHRpb25zW2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBvYmplY3Rcbn1cblxuLy8gUmV0dXJuIGEgc2ltcGxlciByZXF1ZXN0IG9iamVjdCB0byBhbGxvdyBzZXJpYWxpemF0aW9uXG5mdW5jdGlvbiByZXF1ZXN0VG9KU09OICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiB7XG4gICAgdXJpOiBzZWxmLnVyaSxcbiAgICBtZXRob2Q6IHNlbGYubWV0aG9kLFxuICAgIGhlYWRlcnM6IHNlbGYuaGVhZGVyc1xuICB9XG59XG5cbi8vIFJldHVybiBhIHNpbXBsZXIgcmVzcG9uc2Ugb2JqZWN0IHRvIGFsbG93IHNlcmlhbGl6YXRpb25cbmZ1bmN0aW9uIHJlc3BvbnNlVG9KU09OICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiB7XG4gICAgc3RhdHVzQ29kZTogc2VsZi5zdGF0dXNDb2RlLFxuICAgIGJvZHk6IHNlbGYuYm9keSxcbiAgICBoZWFkZXJzOiBzZWxmLmhlYWRlcnMsXG4gICAgcmVxdWVzdDogcmVxdWVzdFRvSlNPTi5jYWxsKHNlbGYucmVxdWVzdClcbiAgfVxufVxuXG5mdW5jdGlvbiBSZXF1ZXN0IChvcHRpb25zKSB7XG4gIC8vIGlmIGdpdmVuIHRoZSBtZXRob2QgcHJvcGVydHkgaW4gb3B0aW9ucywgc2V0IHByb3BlcnR5IGV4cGxpY2l0TWV0aG9kIHRvIHRydWVcblxuICAvLyBleHRlbmQgdGhlIFJlcXVlc3QgaW5zdGFuY2Ugd2l0aCBhbnkgbm9uLXJlc2VydmVkIHByb3BlcnRpZXNcbiAgLy8gcmVtb3ZlIGFueSByZXNlcnZlZCBmdW5jdGlvbnMgZnJvbSB0aGUgb3B0aW9ucyBvYmplY3RcbiAgLy8gc2V0IFJlcXVlc3QgaW5zdGFuY2UgdG8gYmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4gIC8vIGNhbGwgaW5pdFxuXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIC8vIHN0YXJ0IHdpdGggSEFSLCB0aGVuIG92ZXJyaWRlIHdpdGggYWRkaXRpb25hbCBvcHRpb25zXG4gIGlmIChvcHRpb25zLmhhcikge1xuICAgIHNlbGYuX2hhciA9IG5ldyBIYXIoc2VsZilcbiAgICBvcHRpb25zID0gc2VsZi5faGFyLm9wdGlvbnMob3B0aW9ucylcbiAgfVxuXG4gIHN0cmVhbS5TdHJlYW0uY2FsbChzZWxmKVxuICB2YXIgcmVzZXJ2ZWQgPSBPYmplY3Qua2V5cyhSZXF1ZXN0LnByb3RvdHlwZSlcbiAgdmFyIG5vblJlc2VydmVkID0gZmlsdGVyRm9yTm9uUmVzZXJ2ZWQocmVzZXJ2ZWQsIG9wdGlvbnMpXG5cbiAgZXh0ZW5kKHNlbGYsIG5vblJlc2VydmVkKVxuICBvcHRpb25zID0gZmlsdGVyT3V0UmVzZXJ2ZWRGdW5jdGlvbnMocmVzZXJ2ZWQsIG9wdGlvbnMpXG5cbiAgc2VsZi5yZWFkYWJsZSA9IHRydWVcbiAgc2VsZi53cml0YWJsZSA9IHRydWVcbiAgaWYgKG9wdGlvbnMubWV0aG9kKSB7XG4gICAgc2VsZi5leHBsaWNpdE1ldGhvZCA9IHRydWVcbiAgfVxuICBzZWxmLl9xcyA9IG5ldyBRdWVyeXN0cmluZyhzZWxmKVxuICBzZWxmLl9hdXRoID0gbmV3IEF1dGgoc2VsZilcbiAgc2VsZi5fb2F1dGggPSBuZXcgT0F1dGgoc2VsZilcbiAgc2VsZi5fbXVsdGlwYXJ0ID0gbmV3IE11bHRpcGFydChzZWxmKVxuICBzZWxmLl9yZWRpcmVjdCA9IG5ldyBSZWRpcmVjdChzZWxmKVxuICBzZWxmLl90dW5uZWwgPSBuZXcgVHVubmVsKHNlbGYpXG4gIHNlbGYuaW5pdChvcHRpb25zKVxufVxuXG51dGlsLmluaGVyaXRzKFJlcXVlc3QsIHN0cmVhbS5TdHJlYW0pXG5cbi8vIERlYnVnZ2luZ1xuUmVxdWVzdC5kZWJ1ZyA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiYgL1xcYnJlcXVlc3RcXGIvLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRylcbmZ1bmN0aW9uIGRlYnVnICgpIHtcbiAgaWYgKFJlcXVlc3QuZGVidWcpIHtcbiAgICBjb25zb2xlLmVycm9yKCdSRVFVRVNUICVzJywgdXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKSlcbiAgfVxufVxuUmVxdWVzdC5wcm90b3R5cGUuZGVidWcgPSBkZWJ1Z1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgLy8gaW5pdCgpIGNvbnRhaW5zIGFsbCB0aGUgY29kZSB0byBzZXR1cCB0aGUgcmVxdWVzdCBvYmplY3QuXG4gIC8vIHRoZSBhY3R1YWwgb3V0Z29pbmcgcmVxdWVzdCBpcyBub3Qgc3RhcnRlZCB1bnRpbCBzdGFydCgpIGlzIGNhbGxlZFxuICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGJvdGggdGhlIGNvbnN0cnVjdG9yIGFuZCBvbiByZWRpcmVjdC5cbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG4gIHNlbGYuaGVhZGVycyA9IHNlbGYuaGVhZGVycyA/IGNvcHkoc2VsZi5oZWFkZXJzKSA6IHt9XG5cbiAgLy8gRGVsZXRlIGhlYWRlcnMgd2l0aCB2YWx1ZSB1bmRlZmluZWQgc2luY2UgdGhleSBicmVha1xuICAvLyBDbGllbnRSZXF1ZXN0Lk91dGdvaW5nTWVzc2FnZS5zZXRIZWFkZXIgaW4gbm9kZSAwLjEyXG4gIGZvciAodmFyIGhlYWRlck5hbWUgaW4gc2VsZi5oZWFkZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBzZWxmLmhlYWRlcnNbaGVhZGVyTmFtZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZWxldGUgc2VsZi5oZWFkZXJzW2hlYWRlck5hbWVdXG4gICAgfVxuICB9XG5cbiAgY2FzZWxlc3MuaHR0cGlmeShzZWxmLCBzZWxmLmhlYWRlcnMpXG5cbiAgaWYgKCFzZWxmLm1ldGhvZCkge1xuICAgIHNlbGYubWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgJ0dFVCdcbiAgfVxuICBpZiAoIXNlbGYubG9jYWxBZGRyZXNzKSB7XG4gICAgc2VsZi5sb2NhbEFkZHJlc3MgPSBvcHRpb25zLmxvY2FsQWRkcmVzc1xuICB9XG5cbiAgc2VsZi5fcXMuaW5pdChvcHRpb25zKVxuXG4gIGRlYnVnKG9wdGlvbnMpXG4gIGlmICghc2VsZi5wb29sICYmIHNlbGYucG9vbCAhPT0gZmFsc2UpIHtcbiAgICBzZWxmLnBvb2wgPSBnbG9iYWxQb29sXG4gIH1cbiAgc2VsZi5kZXN0cyA9IHNlbGYuZGVzdHMgfHwgW11cbiAgc2VsZi5fX2lzUmVxdWVzdFJlcXVlc3QgPSB0cnVlXG5cbiAgLy8gUHJvdGVjdCBhZ2FpbnN0IGRvdWJsZSBjYWxsYmFja1xuICBpZiAoIXNlbGYuX2NhbGxiYWNrICYmIHNlbGYuY2FsbGJhY2spIHtcbiAgICBzZWxmLl9jYWxsYmFjayA9IHNlbGYuY2FsbGJhY2tcbiAgICBzZWxmLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuX2NhbGxiYWNrQ2FsbGVkKSB7XG4gICAgICAgIHJldHVybiAvLyBQcmludCBhIHdhcm5pbmcgbWF5YmU/XG4gICAgICB9XG4gICAgICBzZWxmLl9jYWxsYmFja0NhbGxlZCA9IHRydWVcbiAgICAgIHNlbGYuX2NhbGxiYWNrLmFwcGx5KHNlbGYsIGFyZ3VtZW50cylcbiAgICB9XG4gICAgc2VsZi5vbignZXJyb3InLCBzZWxmLmNhbGxiYWNrLmJpbmQoKSlcbiAgICBzZWxmLm9uKCdjb21wbGV0ZScsIHNlbGYuY2FsbGJhY2suYmluZChzZWxmLCBudWxsKSlcbiAgfVxuXG4gIC8vIFBlb3BsZSB1c2UgdGhpcyBwcm9wZXJ0eSBpbnN0ZWFkIGFsbCB0aGUgdGltZSwgc28gc3VwcG9ydCBpdFxuICBpZiAoIXNlbGYudXJpICYmIHNlbGYudXJsKSB7XG4gICAgc2VsZi51cmkgPSBzZWxmLnVybFxuICAgIGRlbGV0ZSBzZWxmLnVybFxuICB9XG5cbiAgLy8gSWYgdGhlcmUncyBhIGJhc2VVcmwsIHRoZW4gdXNlIGl0IGFzIHRoZSBiYXNlIFVSTCAoaS5lLiB1cmkgbXVzdCBiZVxuICAvLyBzcGVjaWZpZWQgYXMgYSByZWxhdGl2ZSBwYXRoIGFuZCBpcyBhcHBlbmRlZCB0byBiYXNlVXJsKS5cbiAgaWYgKHNlbGYuYmFzZVVybCkge1xuICAgIGlmICh0eXBlb2Ygc2VsZi5iYXNlVXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ29wdGlvbnMuYmFzZVVybCBtdXN0IGJlIGEgc3RyaW5nJykpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZWxmLnVyaSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdvcHRpb25zLnVyaSBtdXN0IGJlIGEgc3RyaW5nIHdoZW4gdXNpbmcgb3B0aW9ucy5iYXNlVXJsJykpXG4gICAgfVxuXG4gICAgaWYgKHNlbGYudXJpLmluZGV4T2YoJy8vJykgPT09IDAgfHwgc2VsZi51cmkuaW5kZXhPZignOi8vJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignb3B0aW9ucy51cmkgbXVzdCBiZSBhIHBhdGggd2hlbiB1c2luZyBvcHRpb25zLmJhc2VVcmwnKSlcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYWxsIGNhc2VzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3Mgb25seSBvbmUgc2xhc2ggYmV0d2VlblxuICAgIC8vIGJhc2VVcmwgYW5kIHVyaS5cbiAgICB2YXIgYmFzZVVybEVuZHNXaXRoU2xhc2ggPSBzZWxmLmJhc2VVcmwubGFzdEluZGV4T2YoJy8nKSA9PT0gc2VsZi5iYXNlVXJsLmxlbmd0aCAtIDFcbiAgICB2YXIgdXJpU3RhcnRzV2l0aFNsYXNoID0gc2VsZi51cmkuaW5kZXhPZignLycpID09PSAwXG5cbiAgICBpZiAoYmFzZVVybEVuZHNXaXRoU2xhc2ggJiYgdXJpU3RhcnRzV2l0aFNsYXNoKSB7XG4gICAgICBzZWxmLnVyaSA9IHNlbGYuYmFzZVVybCArIHNlbGYudXJpLnNsaWNlKDEpXG4gICAgfSBlbHNlIGlmIChiYXNlVXJsRW5kc1dpdGhTbGFzaCB8fCB1cmlTdGFydHNXaXRoU2xhc2gpIHtcbiAgICAgIHNlbGYudXJpID0gc2VsZi5iYXNlVXJsICsgc2VsZi51cmlcbiAgICB9IGVsc2UgaWYgKHNlbGYudXJpID09PSAnJykge1xuICAgICAgc2VsZi51cmkgPSBzZWxmLmJhc2VVcmxcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi51cmkgPSBzZWxmLmJhc2VVcmwgKyAnLycgKyBzZWxmLnVyaVxuICAgIH1cbiAgICBkZWxldGUgc2VsZi5iYXNlVXJsXG4gIH1cblxuICAvLyBBIFVSSSBpcyBuZWVkZWQgYnkgdGhpcyBwb2ludCwgZW1pdCBlcnJvciBpZiB3ZSBoYXZlbid0IGJlZW4gYWJsZSB0byBnZXQgb25lXG4gIGlmICghc2VsZi51cmkpIHtcbiAgICByZXR1cm4gc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignb3B0aW9ucy51cmkgaXMgYSByZXF1aXJlZCBhcmd1bWVudCcpKVxuICB9XG5cbiAgLy8gSWYgYSBzdHJpbmcgVVJJL1VSTCB3YXMgZ2l2ZW4sIHBhcnNlIGl0IGludG8gYSBVUkwgb2JqZWN0XG4gIGlmICh0eXBlb2Ygc2VsZi51cmkgPT09ICdzdHJpbmcnKSB7XG4gICAgc2VsZi51cmkgPSB1cmwucGFyc2Uoc2VsZi51cmkpXG4gIH1cblxuICAvLyBTb21lIFVSTCBvYmplY3RzIGFyZSBub3QgZnJvbSBhIFVSTCBwYXJzZWQgc3RyaW5nIGFuZCBuZWVkIGhyZWYgYWRkZWRcbiAgaWYgKCFzZWxmLnVyaS5ocmVmKSB7XG4gICAgc2VsZi51cmkuaHJlZiA9IHVybC5mb3JtYXQoc2VsZi51cmkpXG4gIH1cblxuICAvLyBERVBSRUNBVEVEOiBXYXJuaW5nIGZvciB1c2VycyBvZiB0aGUgb2xkIFVuaXggU29ja2V0cyBVUkwgU2NoZW1lXG4gIGlmIChzZWxmLnVyaS5wcm90b2NvbCA9PT0gJ3VuaXg6Jykge1xuICAgIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdgdW5peDovL2AgVVJMIHNjaGVtZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIHRoZSBmb3JtYXQgYGh0dHA6Ly91bml4OlNPQ0tFVDpQQVRIYCcpKVxuICB9XG5cbiAgLy8gU3VwcG9ydCBVbml4IFNvY2tldHNcbiAgaWYgKHNlbGYudXJpLmhvc3QgPT09ICd1bml4Jykge1xuICAgIHNlbGYuZW5hYmxlVW5peFNvY2tldCgpXG4gIH1cblxuICBpZiAoc2VsZi5zdHJpY3RTU0wgPT09IGZhbHNlKSB7XG4gICAgc2VsZi5yZWplY3RVbmF1dGhvcml6ZWQgPSBmYWxzZVxuICB9XG5cbiAgaWYgKCFzZWxmLnVyaS5wYXRobmFtZSkgeyBzZWxmLnVyaS5wYXRobmFtZSA9ICcvJyB9XG5cbiAgaWYgKCEoc2VsZi51cmkuaG9zdCB8fCAoc2VsZi51cmkuaG9zdG5hbWUgJiYgc2VsZi51cmkucG9ydCkpICYmICFzZWxmLnVyaS5pc1VuaXgpIHtcbiAgICAvLyBJbnZhbGlkIFVSSTogaXQgbWF5IGdlbmVyYXRlIGxvdCBvZiBiYWQgZXJyb3JzLCBsaWtlICdUeXBlRXJyb3I6IENhbm5vdCBjYWxsIG1ldGhvZCBgaW5kZXhPZmAgb2YgdW5kZWZpbmVkJyBpbiBDb29raWVKYXJcbiAgICAvLyBEZXRlY3QgYW5kIHJlamVjdCBpdCBhcyBzb29uIGFzIHBvc3NpYmxlXG4gICAgdmFyIGZhdWx0eVVyaSA9IHVybC5mb3JtYXQoc2VsZi51cmkpXG4gICAgdmFyIG1lc3NhZ2UgPSAnSW52YWxpZCBVUkkgXCInICsgZmF1bHR5VXJpICsgJ1wiJ1xuICAgIGlmIChPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIE5vIG9wdGlvbiA/IFRoaXMgY2FuIGJlIHRoZSBzaWduIG9mIGEgcmVkaXJlY3RcbiAgICAgIC8vIEFzIHRoaXMgaXMgYSBjYXNlIHdoZXJlIHRoZSB1c2VyIGNhbm5vdCBkbyBhbnl0aGluZyAodGhleSBkaWRuJ3QgY2FsbCByZXF1ZXN0IGRpcmVjdGx5IHdpdGggdGhpcyBVUkwpXG4gICAgICAvLyB0aGV5IHNob3VsZCBiZSB3YXJuZWQgdGhhdCBpdCBjYW4gYmUgY2F1c2VkIGJ5IGEgcmVkaXJlY3Rpb24gKGNhbiBzYXZlIHNvbWUgaGFpcilcbiAgICAgIG1lc3NhZ2UgKz0gJy4gVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgY3JhcHB5IHJlZGlyZWN0aW9uLidcbiAgICB9XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgZmF0YWxcbiAgICBzZWxmLmFib3J0KClcbiAgICByZXR1cm4gc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihtZXNzYWdlKSlcbiAgfVxuXG4gIGlmICghc2VsZi5oYXNPd25Qcm9wZXJ0eSgncHJveHknKSkge1xuICAgIHNlbGYucHJveHkgPSBnZXRQcm94eUZyb21VUkkoc2VsZi51cmkpXG4gIH1cblxuICBzZWxmLnR1bm5lbCA9IHNlbGYuX3R1bm5lbC5pc0VuYWJsZWQoKVxuICBpZiAoc2VsZi5wcm94eSkge1xuICAgIHNlbGYuX3R1bm5lbC5zZXR1cChvcHRpb25zKVxuICB9XG5cbiAgc2VsZi5fcmVkaXJlY3Qub25SZXF1ZXN0KG9wdGlvbnMpXG5cbiAgc2VsZi5zZXRIb3N0ID0gZmFsc2VcbiAgaWYgKCFzZWxmLmhhc0hlYWRlcignaG9zdCcpKSB7XG4gICAgdmFyIGhvc3RIZWFkZXJOYW1lID0gc2VsZi5vcmlnaW5hbEhvc3RIZWFkZXJOYW1lIHx8ICdob3N0J1xuICAgIHNlbGYuc2V0SGVhZGVyKGhvc3RIZWFkZXJOYW1lLCBzZWxmLnVyaS5ob3N0KVxuICAgIC8vIERyb3AgOnBvcnQgc3VmZml4IGZyb20gSG9zdCBoZWFkZXIgaWYga25vd24gcHJvdG9jb2wuXG4gICAgaWYgKHNlbGYudXJpLnBvcnQpIHtcbiAgICAgIGlmICgoc2VsZi51cmkucG9ydCA9PT0gJzgwJyAmJiBzZWxmLnVyaS5wcm90b2NvbCA9PT0gJ2h0dHA6JykgfHxcbiAgICAgICAgICAoc2VsZi51cmkucG9ydCA9PT0gJzQ0MycgJiYgc2VsZi51cmkucHJvdG9jb2wgPT09ICdodHRwczonKSkge1xuICAgICAgICBzZWxmLnNldEhlYWRlcihob3N0SGVhZGVyTmFtZSwgc2VsZi51cmkuaG9zdG5hbWUpXG4gICAgICB9XG4gICAgfVxuICAgIHNlbGYuc2V0SG9zdCA9IHRydWVcbiAgfVxuXG4gIHNlbGYuamFyKHNlbGYuX2phciB8fCBvcHRpb25zLmphcilcblxuICBpZiAoIXNlbGYudXJpLnBvcnQpIHtcbiAgICBpZiAoc2VsZi51cmkucHJvdG9jb2wgPT09ICdodHRwOicpIHsgc2VsZi51cmkucG9ydCA9IDgwIH0gZWxzZSBpZiAoc2VsZi51cmkucHJvdG9jb2wgPT09ICdodHRwczonKSB7IHNlbGYudXJpLnBvcnQgPSA0NDMgfVxuICB9XG5cbiAgaWYgKHNlbGYucHJveHkgJiYgIXNlbGYudHVubmVsKSB7XG4gICAgc2VsZi5wb3J0ID0gc2VsZi5wcm94eS5wb3J0XG4gICAgc2VsZi5ob3N0ID0gc2VsZi5wcm94eS5ob3N0bmFtZVxuICB9IGVsc2Uge1xuICAgIHNlbGYucG9ydCA9IHNlbGYudXJpLnBvcnRcbiAgICBzZWxmLmhvc3QgPSBzZWxmLnVyaS5ob3N0bmFtZVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuZm9ybSkge1xuICAgIHNlbGYuZm9ybShvcHRpb25zLmZvcm0pXG4gIH1cblxuICBpZiAob3B0aW9ucy5mb3JtRGF0YSkge1xuICAgIHZhciBmb3JtRGF0YSA9IG9wdGlvbnMuZm9ybURhdGFcbiAgICB2YXIgcmVxdWVzdEZvcm0gPSBzZWxmLmZvcm0oKVxuICAgIHZhciBhcHBlbmRGb3JtVmFsdWUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmIHZhbHVlLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpIHtcbiAgICAgICAgcmVxdWVzdEZvcm0uYXBwZW5kKGtleSwgdmFsdWUudmFsdWUsIHZhbHVlLm9wdGlvbnMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0Rm9ybS5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgZm9ybUtleSBpbiBmb3JtRGF0YSkge1xuICAgICAgaWYgKGZvcm1EYXRhLmhhc093blByb3BlcnR5KGZvcm1LZXkpKSB7XG4gICAgICAgIHZhciBmb3JtVmFsdWUgPSBmb3JtRGF0YVtmb3JtS2V5XVxuICAgICAgICBpZiAoZm9ybVZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZvcm1WYWx1ZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgYXBwZW5kRm9ybVZhbHVlKGZvcm1LZXksIGZvcm1WYWx1ZVtqXSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwZW5kRm9ybVZhbHVlKGZvcm1LZXksIGZvcm1WYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnFzKSB7XG4gICAgc2VsZi5xcyhvcHRpb25zLnFzKVxuICB9XG5cbiAgaWYgKHNlbGYudXJpLnBhdGgpIHtcbiAgICBzZWxmLnBhdGggPSBzZWxmLnVyaS5wYXRoXG4gIH0gZWxzZSB7XG4gICAgc2VsZi5wYXRoID0gc2VsZi51cmkucGF0aG5hbWUgKyAoc2VsZi51cmkuc2VhcmNoIHx8ICcnKVxuICB9XG5cbiAgaWYgKHNlbGYucGF0aC5sZW5ndGggPT09IDApIHtcbiAgICBzZWxmLnBhdGggPSAnLydcbiAgfVxuXG4gIC8vIEF1dGggbXVzdCBoYXBwZW4gbGFzdCBpbiBjYXNlIHNpZ25pbmcgaXMgZGVwZW5kZW50IG9uIG90aGVyIGhlYWRlcnNcbiAgaWYgKG9wdGlvbnMuYXdzKSB7XG4gICAgc2VsZi5hd3Mob3B0aW9ucy5hd3MpXG4gIH1cblxuICBpZiAob3B0aW9ucy5oYXdrKSB7XG4gICAgc2VsZi5oYXdrKG9wdGlvbnMuaGF3aylcbiAgfVxuXG4gIGlmIChvcHRpb25zLmh0dHBTaWduYXR1cmUpIHtcbiAgICBzZWxmLmh0dHBTaWduYXR1cmUob3B0aW9ucy5odHRwU2lnbmF0dXJlKVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5hdXRoLCAndXNlcm5hbWUnKSkge1xuICAgICAgb3B0aW9ucy5hdXRoLnVzZXIgPSBvcHRpb25zLmF1dGgudXNlcm5hbWVcbiAgICB9XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLmF1dGgsICdwYXNzd29yZCcpKSB7XG4gICAgICBvcHRpb25zLmF1dGgucGFzcyA9IG9wdGlvbnMuYXV0aC5wYXNzd29yZFxuICAgIH1cblxuICAgIHNlbGYuYXV0aChcbiAgICAgIG9wdGlvbnMuYXV0aC51c2VyLFxuICAgICAgb3B0aW9ucy5hdXRoLnBhc3MsXG4gICAgICBvcHRpb25zLmF1dGguc2VuZEltbWVkaWF0ZWx5LFxuICAgICAgb3B0aW9ucy5hdXRoLmJlYXJlclxuICAgIClcbiAgfVxuXG4gIGlmIChzZWxmLmd6aXAgJiYgIXNlbGYuaGFzSGVhZGVyKCdhY2NlcHQtZW5jb2RpbmcnKSkge1xuICAgIHNlbGYuc2V0SGVhZGVyKCdhY2NlcHQtZW5jb2RpbmcnLCAnZ3ppcCwgZGVmbGF0ZScpXG4gIH1cblxuICBpZiAoc2VsZi51cmkuYXV0aCAmJiAhc2VsZi5oYXNIZWFkZXIoJ2F1dGhvcml6YXRpb24nKSkge1xuICAgIHZhciB1cmlBdXRoUGllY2VzID0gc2VsZi51cmkuYXV0aC5zcGxpdCgnOicpLm1hcChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gc2VsZi5fcXMudW5lc2NhcGUoaXRlbSkgfSlcbiAgICBzZWxmLmF1dGgodXJpQXV0aFBpZWNlc1swXSwgdXJpQXV0aFBpZWNlcy5zbGljZSgxKS5qb2luKCc6JyksIHRydWUpXG4gIH1cblxuICBpZiAoIXNlbGYudHVubmVsICYmIHNlbGYucHJveHkgJiYgc2VsZi5wcm94eS5hdXRoICYmICFzZWxmLmhhc0hlYWRlcigncHJveHktYXV0aG9yaXphdGlvbicpKSB7XG4gICAgdmFyIHByb3h5QXV0aFBpZWNlcyA9IHNlbGYucHJveHkuYXV0aC5zcGxpdCgnOicpLm1hcChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gc2VsZi5fcXMudW5lc2NhcGUoaXRlbSkgfSlcbiAgICB2YXIgYXV0aEhlYWRlciA9ICdCYXNpYyAnICsgdG9CYXNlNjQocHJveHlBdXRoUGllY2VzLmpvaW4oJzonKSlcbiAgICBzZWxmLnNldEhlYWRlcigncHJveHktYXV0aG9yaXphdGlvbicsIGF1dGhIZWFkZXIpXG4gIH1cblxuICBpZiAoc2VsZi5wcm94eSAmJiAhc2VsZi50dW5uZWwpIHtcbiAgICBzZWxmLnBhdGggPSAoc2VsZi51cmkucHJvdG9jb2wgKyAnLy8nICsgc2VsZi51cmkuaG9zdCArIHNlbGYucGF0aClcbiAgfVxuXG4gIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICBzZWxmLmpzb24ob3B0aW9ucy5qc29uKVxuICB9XG4gIGlmIChvcHRpb25zLm11bHRpcGFydCkge1xuICAgIHNlbGYubXVsdGlwYXJ0KG9wdGlvbnMubXVsdGlwYXJ0KVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGltZSkge1xuICAgIHNlbGYudGltaW5nID0gdHJ1ZVxuXG4gICAgLy8gTk9URTogZWxhcHNlZFRpbWUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAudGltaW5nc1xuICAgIHNlbGYuZWxhcHNlZFRpbWUgPSBzZWxmLmVsYXBzZWRUaW1lIHx8IDBcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldENvbnRlbnRMZW5ndGggKCkge1xuICAgIGlmIChpc1R5cGVkQXJyYXkoc2VsZi5ib2R5KSkge1xuICAgICAgc2VsZi5ib2R5ID0gQnVmZmVyLmZyb20oc2VsZi5ib2R5KVxuICAgIH1cblxuICAgIGlmICghc2VsZi5oYXNIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIHZhciBsZW5ndGhcbiAgICAgIGlmICh0eXBlb2Ygc2VsZi5ib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzZWxmLmJvZHkpXG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc2VsZi5ib2R5KSkge1xuICAgICAgICBsZW5ndGggPSBzZWxmLmJvZHkucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgYi5sZW5ndGggfSwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbmd0aCA9IHNlbGYuYm9keS5sZW5ndGhcbiAgICAgIH1cblxuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICBzZWxmLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBsZW5ndGgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdBcmd1bWVudCBlcnJvciwgb3B0aW9ucy5ib2R5LicpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoc2VsZi5ib2R5ICYmICFpc3N0cmVhbShzZWxmLmJvZHkpKSB7XG4gICAgc2V0Q29udGVudExlbmd0aCgpXG4gIH1cblxuICBpZiAob3B0aW9ucy5vYXV0aCkge1xuICAgIHNlbGYub2F1dGgob3B0aW9ucy5vYXV0aClcbiAgfSBlbHNlIGlmIChzZWxmLl9vYXV0aC5wYXJhbXMgJiYgc2VsZi5oYXNIZWFkZXIoJ2F1dGhvcml6YXRpb24nKSkge1xuICAgIHNlbGYub2F1dGgoc2VsZi5fb2F1dGgucGFyYW1zKVxuICB9XG5cbiAgdmFyIHByb3RvY29sID0gc2VsZi5wcm94eSAmJiAhc2VsZi50dW5uZWwgPyBzZWxmLnByb3h5LnByb3RvY29sIDogc2VsZi51cmkucHJvdG9jb2xcbiAgdmFyIGRlZmF1bHRNb2R1bGVzID0geydodHRwOic6IGh0dHAsICdodHRwczonOiBodHRwc31cbiAgdmFyIGh0dHBNb2R1bGVzID0gc2VsZi5odHRwTW9kdWxlcyB8fCB7fVxuXG4gIHNlbGYuaHR0cE1vZHVsZSA9IGh0dHBNb2R1bGVzW3Byb3RvY29sXSB8fCBkZWZhdWx0TW9kdWxlc1twcm90b2NvbF1cblxuICBpZiAoIXNlbGYuaHR0cE1vZHVsZSkge1xuICAgIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdJbnZhbGlkIHByb3RvY29sOiAnICsgcHJvdG9jb2wpKVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuY2EpIHtcbiAgICBzZWxmLmNhID0gb3B0aW9ucy5jYVxuICB9XG5cbiAgaWYgKCFzZWxmLmFnZW50KSB7XG4gICAgaWYgKG9wdGlvbnMuYWdlbnRPcHRpb25zKSB7XG4gICAgICBzZWxmLmFnZW50T3B0aW9ucyA9IG9wdGlvbnMuYWdlbnRPcHRpb25zXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWdlbnRDbGFzcykge1xuICAgICAgc2VsZi5hZ2VudENsYXNzID0gb3B0aW9ucy5hZ2VudENsYXNzXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmZvcmV2ZXIpIHtcbiAgICAgIHZhciB2ID0gdmVyc2lvbigpXG4gICAgICAvLyB1c2UgRm9yZXZlckFnZW50IGluIG5vZGUgMC4xMC0gb25seVxuICAgICAgaWYgKHYubWFqb3IgPT09IDAgJiYgdi5taW5vciA8PSAxMCkge1xuICAgICAgICBzZWxmLmFnZW50Q2xhc3MgPSBwcm90b2NvbCA9PT0gJ2h0dHA6JyA/IEZvcmV2ZXJBZ2VudCA6IEZvcmV2ZXJBZ2VudC5TU0xcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuYWdlbnRDbGFzcyA9IHNlbGYuaHR0cE1vZHVsZS5BZ2VudFxuICAgICAgICBzZWxmLmFnZW50T3B0aW9ucyA9IHNlbGYuYWdlbnRPcHRpb25zIHx8IHt9XG4gICAgICAgIHNlbGYuYWdlbnRPcHRpb25zLmtlZXBBbGl2ZSA9IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5hZ2VudENsYXNzID0gc2VsZi5odHRwTW9kdWxlLkFnZW50XG4gICAgfVxuICB9XG5cbiAgaWYgKHNlbGYucG9vbCA9PT0gZmFsc2UpIHtcbiAgICBzZWxmLmFnZW50ID0gZmFsc2VcbiAgfSBlbHNlIHtcbiAgICBzZWxmLmFnZW50ID0gc2VsZi5hZ2VudCB8fCBzZWxmLmdldE5ld0FnZW50KClcbiAgfVxuXG4gIHNlbGYub24oJ3BpcGUnLCBmdW5jdGlvbiAoc3JjKSB7XG4gICAgaWYgKHNlbGYubnRpY2sgJiYgc2VsZi5fc3RhcnRlZCkge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignWW91IGNhbm5vdCBwaXBlIHRvIHRoaXMgc3RyZWFtIGFmdGVyIHRoZSBvdXRib3VuZCByZXF1ZXN0IGhhcyBzdGFydGVkLicpKVxuICAgIH1cbiAgICBzZWxmLnNyYyA9IHNyY1xuICAgIGlmIChpc1JlYWRTdHJlYW0oc3JjKSkge1xuICAgICAgaWYgKCFzZWxmLmhhc0hlYWRlcignY29udGVudC10eXBlJykpIHtcbiAgICAgICAgc2VsZi5zZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScsIG1pbWUubG9va3VwKHNyYy5wYXRoKSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNyYy5oZWFkZXJzKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gc3JjLmhlYWRlcnMpIHtcbiAgICAgICAgICBpZiAoIXNlbGYuaGFzSGVhZGVyKGkpKSB7XG4gICAgICAgICAgICBzZWxmLnNldEhlYWRlcihpLCBzcmMuaGVhZGVyc1tpXSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLl9qc29uICYmICFzZWxmLmhhc0hlYWRlcignY29udGVudC10eXBlJykpIHtcbiAgICAgICAgc2VsZi5zZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi9qc29uJylcbiAgICAgIH1cbiAgICAgIGlmIChzcmMubWV0aG9kICYmICFzZWxmLmV4cGxpY2l0TWV0aG9kKSB7XG4gICAgICAgIHNlbGYubWV0aG9kID0gc3JjLm1ldGhvZFxuICAgICAgfVxuICAgIH1cblxuICAvLyBzZWxmLm9uKCdwaXBlJywgZnVuY3Rpb24gKCkge1xuICAvLyAgIGNvbnNvbGUuZXJyb3IoJ1lvdSBoYXZlIGFscmVhZHkgcGlwZWQgdG8gdGhpcyBzdHJlYW0uIFBpcGVpbmcgdHdpY2UgaXMgbGlrZWx5IHRvIGJyZWFrIHRoZSByZXF1ZXN0LicpXG4gIC8vIH0pXG4gIH0pXG5cbiAgZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxmLl9hYm9ydGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuX2Zvcm0pIHtcbiAgICAgICAgaWYgKCFzZWxmLl9hdXRoLmhhc0F1dGgpIHtcbiAgICAgICAgICBzZWxmLl9mb3JtLnBpcGUoc2VsZilcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLl9hdXRoLmhhc0F1dGggJiYgc2VsZi5fYXV0aC5zZW50QXV0aCkge1xuICAgICAgICAgIHNlbGYuX2Zvcm0ucGlwZShzZWxmKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2VsZi5fbXVsdGlwYXJ0ICYmIHNlbGYuX211bHRpcGFydC5jaHVua2VkKSB7XG4gICAgICAgIHNlbGYuX211bHRpcGFydC5ib2R5LnBpcGUoc2VsZilcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLmJvZHkpIHtcbiAgICAgICAgaWYgKGlzc3RyZWFtKHNlbGYuYm9keSkpIHtcbiAgICAgICAgICBzZWxmLmJvZHkucGlwZShzZWxmKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldENvbnRlbnRMZW5ndGgoKVxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGYuYm9keSkpIHtcbiAgICAgICAgICAgIHNlbGYuYm9keS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJ0KSB7XG4gICAgICAgICAgICAgIHNlbGYud3JpdGUocGFydClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYud3JpdGUoc2VsZi5ib2R5KVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLmVuZCgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5yZXF1ZXN0Qm9keVN0cmVhbSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ29wdGlvbnMucmVxdWVzdEJvZHlTdHJlYW0gaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHBhc3MgdGhlIHJlcXVlc3Qgb2JqZWN0IHRvIHN0cmVhbS5waXBlLicpXG4gICAgICAgIHNlbGYucmVxdWVzdEJvZHlTdHJlYW0ucGlwZShzZWxmKVxuICAgICAgfSBlbHNlIGlmICghc2VsZi5zcmMpIHtcbiAgICAgICAgaWYgKHNlbGYuX2F1dGguaGFzQXV0aCAmJiAhc2VsZi5fYXV0aC5zZW50QXV0aCkge1xuICAgICAgICAgIHNlbGYuZW5kKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5tZXRob2QgIT09ICdHRVQnICYmIHR5cGVvZiBzZWxmLm1ldGhvZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCAwKVxuICAgICAgICB9XG4gICAgICAgIHNlbGYuZW5kKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VsZi5fZm9ybSAmJiAhc2VsZi5oYXNIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIC8vIEJlZm9yZSBlbmRpbmcgdGhlIHJlcXVlc3QsIHdlIGhhZCB0byBjb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIHdob2xlIGZvcm0sIGFzeW5jbHlcbiAgICAgIHNlbGYuc2V0SGVhZGVyKHNlbGYuX2Zvcm0uZ2V0SGVhZGVycygpLCB0cnVlKVxuICAgICAgc2VsZi5fZm9ybS5nZXRMZW5ndGgoZnVuY3Rpb24gKGVyciwgbGVuZ3RoKSB7XG4gICAgICAgIGlmICghZXJyICYmICFpc05hTihsZW5ndGgpKSB7XG4gICAgICAgICAgc2VsZi5zZXRIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJywgbGVuZ3RoKVxuICAgICAgICB9XG4gICAgICAgIGVuZCgpXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbmQoKVxuICAgIH1cblxuICAgIHNlbGYubnRpY2sgPSB0cnVlXG4gIH0pXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmdldE5ld0FnZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIEFnZW50ID0gc2VsZi5hZ2VudENsYXNzXG4gIHZhciBvcHRpb25zID0ge31cbiAgaWYgKHNlbGYuYWdlbnRPcHRpb25zKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzZWxmLmFnZW50T3B0aW9ucykge1xuICAgICAgb3B0aW9uc1tpXSA9IHNlbGYuYWdlbnRPcHRpb25zW2ldXG4gICAgfVxuICB9XG4gIGlmIChzZWxmLmNhKSB7XG4gICAgb3B0aW9ucy5jYSA9IHNlbGYuY2FcbiAgfVxuICBpZiAoc2VsZi5jaXBoZXJzKSB7XG4gICAgb3B0aW9ucy5jaXBoZXJzID0gc2VsZi5jaXBoZXJzXG4gIH1cbiAgaWYgKHNlbGYuc2VjdXJlUHJvdG9jb2wpIHtcbiAgICBvcHRpb25zLnNlY3VyZVByb3RvY29sID0gc2VsZi5zZWN1cmVQcm90b2NvbFxuICB9XG4gIGlmIChzZWxmLnNlY3VyZU9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnNlY3VyZU9wdGlvbnMgPSBzZWxmLnNlY3VyZU9wdGlvbnNcbiAgfVxuICBpZiAodHlwZW9mIHNlbGYucmVqZWN0VW5hdXRob3JpemVkICE9PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID0gc2VsZi5yZWplY3RVbmF1dGhvcml6ZWRcbiAgfVxuXG4gIGlmIChzZWxmLmNlcnQgJiYgc2VsZi5rZXkpIHtcbiAgICBvcHRpb25zLmtleSA9IHNlbGYua2V5XG4gICAgb3B0aW9ucy5jZXJ0ID0gc2VsZi5jZXJ0XG4gIH1cblxuICBpZiAoc2VsZi5wZngpIHtcbiAgICBvcHRpb25zLnBmeCA9IHNlbGYucGZ4XG4gIH1cblxuICBpZiAoc2VsZi5wYXNzcGhyYXNlKSB7XG4gICAgb3B0aW9ucy5wYXNzcGhyYXNlID0gc2VsZi5wYXNzcGhyYXNlXG4gIH1cblxuICB2YXIgcG9vbEtleSA9ICcnXG5cbiAgLy8gZGlmZmVyZW50IHR5cGVzIG9mIGFnZW50cyBhcmUgaW4gZGlmZmVyZW50IHBvb2xzXG4gIGlmIChBZ2VudCAhPT0gc2VsZi5odHRwTW9kdWxlLkFnZW50KSB7XG4gICAgcG9vbEtleSArPSBBZ2VudC5uYW1lXG4gIH1cblxuICAvLyBjYSBvcHRpb24gaXMgb25seSByZWxldmFudCBpZiBwcm94eSBvciBkZXN0aW5hdGlvbiBhcmUgaHR0cHNcbiAgdmFyIHByb3h5ID0gc2VsZi5wcm94eVxuICBpZiAodHlwZW9mIHByb3h5ID09PSAnc3RyaW5nJykge1xuICAgIHByb3h5ID0gdXJsLnBhcnNlKHByb3h5KVxuICB9XG4gIHZhciBpc0h0dHBzID0gKHByb3h5ICYmIHByb3h5LnByb3RvY29sID09PSAnaHR0cHM6JykgfHwgdGhpcy51cmkucHJvdG9jb2wgPT09ICdodHRwczonXG5cbiAgaWYgKGlzSHR0cHMpIHtcbiAgICBpZiAob3B0aW9ucy5jYSkge1xuICAgICAgaWYgKHBvb2xLZXkpIHtcbiAgICAgICAgcG9vbEtleSArPSAnOidcbiAgICAgIH1cbiAgICAgIHBvb2xLZXkgKz0gb3B0aW9ucy5jYVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAocG9vbEtleSkge1xuICAgICAgICBwb29sS2V5ICs9ICc6J1xuICAgICAgfVxuICAgICAgcG9vbEtleSArPSBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNlcnQpIHtcbiAgICAgIGlmIChwb29sS2V5KSB7XG4gICAgICAgIHBvb2xLZXkgKz0gJzonXG4gICAgICB9XG4gICAgICBwb29sS2V5ICs9IG9wdGlvbnMuY2VydC50b1N0cmluZygnYXNjaWknKSArIG9wdGlvbnMua2V5LnRvU3RyaW5nKCdhc2NpaScpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucGZ4KSB7XG4gICAgICBpZiAocG9vbEtleSkge1xuICAgICAgICBwb29sS2V5ICs9ICc6J1xuICAgICAgfVxuICAgICAgcG9vbEtleSArPSBvcHRpb25zLnBmeC50b1N0cmluZygnYXNjaWknKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNpcGhlcnMpIHtcbiAgICAgIGlmIChwb29sS2V5KSB7XG4gICAgICAgIHBvb2xLZXkgKz0gJzonXG4gICAgICB9XG4gICAgICBwb29sS2V5ICs9IG9wdGlvbnMuY2lwaGVyc1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNlY3VyZVByb3RvY29sKSB7XG4gICAgICBpZiAocG9vbEtleSkge1xuICAgICAgICBwb29sS2V5ICs9ICc6J1xuICAgICAgfVxuICAgICAgcG9vbEtleSArPSBvcHRpb25zLnNlY3VyZVByb3RvY29sXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2VjdXJlT3B0aW9ucykge1xuICAgICAgaWYgKHBvb2xLZXkpIHtcbiAgICAgICAgcG9vbEtleSArPSAnOidcbiAgICAgIH1cbiAgICAgIHBvb2xLZXkgKz0gb3B0aW9ucy5zZWN1cmVPcHRpb25zXG4gICAgfVxuICB9XG5cbiAgaWYgKHNlbGYucG9vbCA9PT0gZ2xvYmFsUG9vbCAmJiAhcG9vbEtleSAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPT09IDAgJiYgc2VsZi5odHRwTW9kdWxlLmdsb2JhbEFnZW50KSB7XG4gICAgLy8gbm90IGRvaW5nIGFueXRoaW5nIHNwZWNpYWwuICBVc2UgdGhlIGdsb2JhbEFnZW50XG4gICAgcmV0dXJuIHNlbGYuaHR0cE1vZHVsZS5nbG9iYWxBZ2VudFxuICB9XG5cbiAgLy8gd2UncmUgdXNpbmcgYSBzdG9yZWQgYWdlbnQuICBNYWtlIHN1cmUgaXQncyBwcm90b2NvbC1zcGVjaWZpY1xuICBwb29sS2V5ID0gc2VsZi51cmkucHJvdG9jb2wgKyBwb29sS2V5XG5cbiAgLy8gZ2VuZXJhdGUgYSBuZXcgYWdlbnQgZm9yIHRoaXMgc2V0dGluZyBpZiBub25lIHlldCBleGlzdHNcbiAgaWYgKCFzZWxmLnBvb2xbcG9vbEtleV0pIHtcbiAgICBzZWxmLnBvb2xbcG9vbEtleV0gPSBuZXcgQWdlbnQob3B0aW9ucylcbiAgICAvLyBwcm9wZXJseSBzZXQgbWF4U29ja2V0cyBvbiBuZXcgYWdlbnRzXG4gICAgaWYgKHNlbGYucG9vbC5tYXhTb2NrZXRzKSB7XG4gICAgICBzZWxmLnBvb2xbcG9vbEtleV0ubWF4U29ja2V0cyA9IHNlbGYucG9vbC5tYXhTb2NrZXRzXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNlbGYucG9vbFtwb29sS2V5XVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gc3RhcnQoKSBpcyBjYWxsZWQgb25jZSB3ZSBhcmUgcmVhZHkgdG8gc2VuZCB0aGUgb3V0Z29pbmcgSFRUUCByZXF1ZXN0LlxuICAvLyB0aGlzIGlzIHVzdWFsbHkgY2FsbGVkIG9uIHRoZSBmaXJzdCB3cml0ZSgpLCBlbmQoKSBvciBvbiBuZXh0VGljaygpXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGlmIChzZWxmLnRpbWluZykge1xuICAgIC8vIEFsbCB0aW1pbmdzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyByZXF1ZXN0J3Mgc3RhcnRUaW1lLiAgSW4gb3JkZXIgdG8gZG8gdGhpcyxcbiAgICAvLyB3ZSBuZWVkIHRvIGNhcHR1cmUgdGhlIHdhbGwtY2xvY2sgc3RhcnQgdGltZSAodmlhIERhdGUpLCBpbW1lZGlhdGVseSBmb2xsb3dlZFxuICAgIC8vIGJ5IHRoZSBoaWdoLXJlc29sdXRpb24gdGltZXIgKHZpYSBub3coKSkuICBXaGlsZSB0aGVzZSB0d28gd29uJ3QgYmUgc2V0XG4gICAgLy8gYXQgdGhlIF9leGFjdF8gc2FtZSB0aW1lLCB0aGV5IHNob3VsZCBiZSBjbG9zZSBlbm91Z2ggdG8gYmUgYWJsZSB0byBjYWxjdWxhdGVcbiAgICAvLyBoaWdoLXJlc29sdXRpb24sIG1vbm90b25pY2FsbHkgbm9uLWRlY3JlYXNpbmcgdGltZXN0YW1wcyByZWxhdGl2ZSB0byBzdGFydFRpbWUuXG4gICAgdmFyIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgdmFyIHN0YXJ0VGltZU5vdyA9IG5vdygpXG4gIH1cblxuICBpZiAoc2VsZi5fYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgc2VsZi5fc3RhcnRlZCA9IHRydWVcbiAgc2VsZi5tZXRob2QgPSBzZWxmLm1ldGhvZCB8fCAnR0VUJ1xuICBzZWxmLmhyZWYgPSBzZWxmLnVyaS5ocmVmXG5cbiAgaWYgKHNlbGYuc3JjICYmIHNlbGYuc3JjLnN0YXQgJiYgc2VsZi5zcmMuc3RhdC5zaXplICYmICFzZWxmLmhhc0hlYWRlcignY29udGVudC1sZW5ndGgnKSkge1xuICAgIHNlbGYuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIHNlbGYuc3JjLnN0YXQuc2l6ZSlcbiAgfVxuICBpZiAoc2VsZi5fYXdzKSB7XG4gICAgc2VsZi5hd3Moc2VsZi5fYXdzLCB0cnVlKVxuICB9XG5cbiAgLy8gV2UgaGF2ZSBhIG1ldGhvZCBuYW1lZCBhdXRoLCB3aGljaCBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudCBmcm9tIHRoZSBodHRwLnJlcXVlc3RcbiAgLy8gYXV0aCBvcHRpb24uICBJZiB3ZSBkb24ndCByZW1vdmUgaXQsIHdlJ3JlIGdvbm5hIGhhdmUgYSBiYWQgdGltZS5cbiAgdmFyIHJlcU9wdGlvbnMgPSBjb3B5KHNlbGYpXG4gIGRlbGV0ZSByZXFPcHRpb25zLmF1dGhcblxuICBkZWJ1ZygnbWFrZSByZXF1ZXN0Jywgc2VsZi51cmkuaHJlZilcblxuICAvLyBub2RlIHY2LjguMCBub3cgc3VwcG9ydHMgYSBgdGltZW91dGAgdmFsdWUgaW4gYGh0dHAucmVxdWVzdCgpYCwgYnV0IHdlXG4gIC8vIHNob3VsZCBkZWxldGUgaXQgZm9yIG5vdyBzaW5jZSB3ZSBoYW5kbGUgdGltZW91dHMgbWFudWFsbHkgZm9yIGJldHRlclxuICAvLyBjb25zaXN0ZW5jeSB3aXRoIG5vZGUgdmVyc2lvbnMgYmVmb3JlIHY2LjguMFxuICBkZWxldGUgcmVxT3B0aW9ucy50aW1lb3V0XG5cbiAgdHJ5IHtcbiAgICBzZWxmLnJlcSA9IHNlbGYuaHR0cE1vZHVsZS5yZXF1ZXN0KHJlcU9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoc2VsZi50aW1pbmcpIHtcbiAgICBzZWxmLnN0YXJ0VGltZSA9IHN0YXJ0VGltZVxuICAgIHNlbGYuc3RhcnRUaW1lTm93ID0gc3RhcnRUaW1lTm93XG5cbiAgICAvLyBUaW1pbmcgdmFsdWVzIHdpbGwgYWxsIGJlIHJlbGF0aXZlIHRvIHN0YXJ0VGltZSAoYnkgY29tcGFyaW5nIHRvIHN0YXJ0VGltZU5vd1xuICAgIC8vIHNvIHdlIGhhdmUgYW4gYWNjdXJhdGUgY2xvY2spXG4gICAgc2VsZi50aW1pbmdzID0ge31cbiAgfVxuXG4gIHZhciB0aW1lb3V0XG4gIGlmIChzZWxmLnRpbWVvdXQgJiYgIXNlbGYudGltZW91dFRpbWVyKSB7XG4gICAgaWYgKHNlbGYudGltZW91dCA8IDApIHtcbiAgICAgIHRpbWVvdXQgPSAwXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZi50aW1lb3V0ID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShzZWxmLnRpbWVvdXQpKSB7XG4gICAgICB0aW1lb3V0ID0gc2VsZi50aW1lb3V0XG4gICAgfVxuICB9XG5cbiAgc2VsZi5yZXEub24oJ3Jlc3BvbnNlJywgc2VsZi5vblJlcXVlc3RSZXNwb25zZS5iaW5kKHNlbGYpKVxuICBzZWxmLnJlcS5vbignZXJyb3InLCBzZWxmLm9uUmVxdWVzdEVycm9yLmJpbmQoc2VsZikpXG4gIHNlbGYucmVxLm9uKCdkcmFpbicsIGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLmVtaXQoJ2RyYWluJylcbiAgfSlcblxuICBzZWxmLnJlcS5vbignc29ja2V0JywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIGAuX2Nvbm5lY3RpbmdgIHdhcyB0aGUgb2xkIHByb3BlcnR5IHdoaWNoIHdhcyBtYWRlIHB1YmxpYyBpbiBub2RlIHY2LjEuMFxuICAgIHZhciBpc0Nvbm5lY3RpbmcgPSBzb2NrZXQuX2Nvbm5lY3RpbmcgfHwgc29ja2V0LmNvbm5lY3RpbmdcbiAgICBpZiAoc2VsZi50aW1pbmcpIHtcbiAgICAgIHNlbGYudGltaW5ncy5zb2NrZXQgPSBub3coKSAtIHNlbGYuc3RhcnRUaW1lTm93XG5cbiAgICAgIGlmIChpc0Nvbm5lY3RpbmcpIHtcbiAgICAgICAgdmFyIG9uTG9va3VwVGltaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYudGltaW5ncy5sb29rdXAgPSBub3coKSAtIHNlbGYuc3RhcnRUaW1lTm93XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb25Db25uZWN0VGltaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYudGltaW5ncy5jb25uZWN0ID0gbm93KCkgLSBzZWxmLnN0YXJ0VGltZU5vd1xuICAgICAgICB9XG5cbiAgICAgICAgc29ja2V0Lm9uY2UoJ2xvb2t1cCcsIG9uTG9va3VwVGltaW5nKVxuICAgICAgICBzb2NrZXQub25jZSgnY29ubmVjdCcsIG9uQ29ubmVjdFRpbWluZylcblxuICAgICAgICAvLyBjbGVhbiB1cCB0aW1pbmcgZXZlbnQgbGlzdGVuZXJzIGlmIG5lZWRlZCBvbiBlcnJvclxuICAgICAgICBzZWxmLnJlcS5vbmNlKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2xvb2t1cCcsIG9uTG9va3VwVGltaW5nKVxuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uQ29ubmVjdFRpbWluZylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2V0UmVxVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgdGltZW91dCBzZXRzIHRoZSBhbW91bnQgb2YgdGltZSB0byB3YWl0ICpiZXR3ZWVuKiBieXRlcyBzZW50XG4gICAgICAvLyBmcm9tIHRoZSBzZXJ2ZXIgb25jZSBjb25uZWN0ZWQuXG4gICAgICAvL1xuICAgICAgLy8gSW4gcGFydGljdWxhciwgaXQncyB1c2VmdWwgZm9yIGVycm9yaW5nIGlmIHRoZSBzZXJ2ZXIgZmFpbHMgdG8gc2VuZFxuICAgICAgLy8gZGF0YSBoYWxmd2F5IHRocm91Z2ggc3RyZWFtaW5nIGEgcmVzcG9uc2UuXG4gICAgICBzZWxmLnJlcS5zZXRUaW1lb3V0KHRpbWVvdXQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHNlbGYucmVxKSB7XG4gICAgICAgICAgc2VsZi5hYm9ydCgpXG4gICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ0VTT0NLRVRUSU1FRE9VVCcpXG4gICAgICAgICAgZS5jb2RlID0gJ0VTT0NLRVRUSU1FRE9VVCdcbiAgICAgICAgICBlLmNvbm5lY3QgPSBmYWxzZVxuICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPbmx5IHN0YXJ0IHRoZSBjb25uZWN0aW9uIHRpbWVyIGlmIHdlJ3JlIGFjdHVhbGx5IGNvbm5lY3RpbmcgYSBuZXdcbiAgICAgIC8vIHNvY2tldCwgb3RoZXJ3aXNlIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIChiZWNhdXNlIHRoaXMgaXMgYVxuICAgICAgLy8ga2VlcC1hbGl2ZSBjb25uZWN0aW9uKSBkbyBub3QgYm90aGVyLiBUaGlzIGlzIGltcG9ydGFudCBzaW5jZSB3ZSB3b24ndFxuICAgICAgLy8gZ2V0IGEgJ2Nvbm5lY3QnIGV2ZW50IGZvciBhbiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQuXG4gICAgICBpZiAoaXNDb25uZWN0aW5nKSB7XG4gICAgICAgIHZhciBvblJlcVNvY2tDb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uUmVxU29ja0Nvbm5lY3QpXG4gICAgICAgICAgc2VsZi5jbGVhclRpbWVvdXQoKVxuICAgICAgICAgIHNldFJlcVRpbWVvdXQoKVxuICAgICAgICB9XG5cbiAgICAgICAgc29ja2V0Lm9uKCdjb25uZWN0Jywgb25SZXFTb2NrQ29ubmVjdClcblxuICAgICAgICBzZWxmLnJlcS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaGFuZGxlLWNhbGxiYWNrLWVyclxuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uUmVxU29ja0Nvbm5lY3QpXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU2V0IGEgdGltZW91dCBpbiBtZW1vcnkgLSB0aGlzIGJsb2NrIHdpbGwgdGhyb3cgaWYgdGhlIHNlcnZlciB0YWtlcyBtb3JlXG4gICAgICAgIC8vIHRoYW4gYHRpbWVvdXRgIHRvIHdyaXRlIHRoZSBIVFRQIHN0YXR1cyBhbmQgaGVhZGVycyAoY29ycmVzcG9uZGluZyB0b1xuICAgICAgICAvLyB0aGUgb24oJ3Jlc3BvbnNlJykgZXZlbnQgb24gdGhlIGNsaWVudCkuIE5COiB0aGlzIG1lYXN1cmVzIHdhbGwtY2xvY2tcbiAgICAgICAgLy8gdGltZSwgbm90IHRoZSB0aW1lIGJldHdlZW4gYnl0ZXMgc2VudCBieSB0aGUgc2VydmVyLlxuICAgICAgICBzZWxmLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uUmVxU29ja0Nvbm5lY3QpXG4gICAgICAgICAgc2VsZi5hYm9ydCgpXG4gICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ0VUSU1FRE9VVCcpXG4gICAgICAgICAgZS5jb2RlID0gJ0VUSU1FRE9VVCdcbiAgICAgICAgICBlLmNvbm5lY3QgPSB0cnVlXG4gICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpXG4gICAgICAgIH0sIHRpbWVvdXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IGNvbm5lY3RlZFxuICAgICAgICBzZXRSZXFUaW1lb3V0KClcbiAgICAgIH1cbiAgICB9XG4gICAgc2VsZi5lbWl0KCdzb2NrZXQnLCBzb2NrZXQpXG4gIH0pXG5cbiAgc2VsZi5lbWl0KCdyZXF1ZXN0Jywgc2VsZi5yZXEpXG59XG5cblJlcXVlc3QucHJvdG90eXBlLm9uUmVxdWVzdEVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5fYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChzZWxmLnJlcSAmJiBzZWxmLnJlcS5fcmV1c2VkU29ja2V0ICYmIGVycm9yLmNvZGUgPT09ICdFQ09OTlJFU0VUJyAmJlxuICAgIHNlbGYuYWdlbnQuYWRkUmVxdWVzdE5vcmV1c2UpIHtcbiAgICBzZWxmLmFnZW50ID0geyBhZGRSZXF1ZXN0OiBzZWxmLmFnZW50LmFkZFJlcXVlc3ROb3JldXNlLmJpbmQoc2VsZi5hZ2VudCkgfVxuICAgIHNlbGYuc3RhcnQoKVxuICAgIHNlbGYucmVxLmVuZCgpXG4gICAgcmV0dXJuXG4gIH1cbiAgc2VsZi5jbGVhclRpbWVvdXQoKVxuICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG59XG5cblJlcXVlc3QucHJvdG90eXBlLm9uUmVxdWVzdFJlc3BvbnNlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGlmIChzZWxmLnRpbWluZykge1xuICAgIHNlbGYudGltaW5ncy5yZXNwb25zZSA9IG5vdygpIC0gc2VsZi5zdGFydFRpbWVOb3dcbiAgfVxuXG4gIGRlYnVnKCdvblJlcXVlc3RSZXNwb25zZScsIHNlbGYudXJpLmhyZWYsIHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMpXG4gIHJlc3BvbnNlLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGYudGltaW5nKSB7XG4gICAgICBzZWxmLnRpbWluZ3MuZW5kID0gbm93KCkgLSBzZWxmLnN0YXJ0VGltZU5vd1xuICAgICAgcmVzcG9uc2UudGltaW5nU3RhcnQgPSBzZWxmLnN0YXJ0VGltZVxuXG4gICAgICAvLyBmaWxsIGluIHRoZSBibGFua3MgZm9yIGFueSBwZXJpb2RzIHRoYXQgZGlkbid0IHRyaWdnZXIsIHN1Y2ggYXNcbiAgICAgIC8vIG5vIGxvb2t1cCBvciBjb25uZWN0IGR1ZSB0byBrZWVwIGFsaXZlXG4gICAgICBpZiAoIXNlbGYudGltaW5ncy5zb2NrZXQpIHtcbiAgICAgICAgc2VsZi50aW1pbmdzLnNvY2tldCA9IDBcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi50aW1pbmdzLmxvb2t1cCkge1xuICAgICAgICBzZWxmLnRpbWluZ3MubG9va3VwID0gc2VsZi50aW1pbmdzLnNvY2tldFxuICAgICAgfVxuICAgICAgaWYgKCFzZWxmLnRpbWluZ3MuY29ubmVjdCkge1xuICAgICAgICBzZWxmLnRpbWluZ3MuY29ubmVjdCA9IHNlbGYudGltaW5ncy5sb29rdXBcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi50aW1pbmdzLnJlc3BvbnNlKSB7XG4gICAgICAgIHNlbGYudGltaW5ncy5yZXNwb25zZSA9IHNlbGYudGltaW5ncy5jb25uZWN0XG4gICAgICB9XG5cbiAgICAgIGRlYnVnKCdlbGFwc2VkIHRpbWUnLCBzZWxmLnRpbWluZ3MuZW5kKVxuXG4gICAgICAvLyBlbGFwc2VkVGltZSBpbmNsdWRlcyBhbGwgcmVkaXJlY3RzXG4gICAgICBzZWxmLmVsYXBzZWRUaW1lICs9IE1hdGgucm91bmQoc2VsZi50aW1pbmdzLmVuZClcblxuICAgICAgLy8gTk9URTogZWxhcHNlZFRpbWUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAudGltaW5nc1xuICAgICAgcmVzcG9uc2UuZWxhcHNlZFRpbWUgPSBzZWxmLmVsYXBzZWRUaW1lXG5cbiAgICAgIC8vIHRpbWluZ3MgaXMganVzdCBmb3IgdGhlIGZpbmFsIGZldGNoXG4gICAgICByZXNwb25zZS50aW1pbmdzID0gc2VsZi50aW1pbmdzXG5cbiAgICAgIC8vIHByZS1jYWxjdWxhdGUgcGhhc2UgdGltaW5ncyBhcyB3ZWxsXG4gICAgICByZXNwb25zZS50aW1pbmdQaGFzZXMgPSB7XG4gICAgICAgIHdhaXQ6IHNlbGYudGltaW5ncy5zb2NrZXQsXG4gICAgICAgIGRuczogc2VsZi50aW1pbmdzLmxvb2t1cCAtIHNlbGYudGltaW5ncy5zb2NrZXQsXG4gICAgICAgIHRjcDogc2VsZi50aW1pbmdzLmNvbm5lY3QgLSBzZWxmLnRpbWluZ3MubG9va3VwLFxuICAgICAgICBmaXJzdEJ5dGU6IHNlbGYudGltaW5ncy5yZXNwb25zZSAtIHNlbGYudGltaW5ncy5jb25uZWN0LFxuICAgICAgICBkb3dubG9hZDogc2VsZi50aW1pbmdzLmVuZCAtIHNlbGYudGltaW5ncy5yZXNwb25zZSxcbiAgICAgICAgdG90YWw6IHNlbGYudGltaW5ncy5lbmRcbiAgICAgIH1cbiAgICB9XG4gICAgZGVidWcoJ3Jlc3BvbnNlIGVuZCcsIHNlbGYudXJpLmhyZWYsIHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMpXG4gIH0pXG5cbiAgaWYgKHNlbGYuX2Fib3J0ZWQpIHtcbiAgICBkZWJ1ZygnYWJvcnRlZCcsIHNlbGYudXJpLmhyZWYpXG4gICAgcmVzcG9uc2UucmVzdW1lKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNlbGYucmVzcG9uc2UgPSByZXNwb25zZVxuICByZXNwb25zZS5yZXF1ZXN0ID0gc2VsZlxuICByZXNwb25zZS50b0pTT04gPSByZXNwb25zZVRvSlNPTlxuXG4gIC8vIFhYWCBUaGlzIGlzIGRpZmZlcmVudCBvbiAwLjEwLCBiZWNhdXNlIFNTTCBpcyBzdHJpY3QgYnkgZGVmYXVsdFxuICBpZiAoc2VsZi5odHRwTW9kdWxlID09PSBodHRwcyAmJlxuICAgIHNlbGYuc3RyaWN0U1NMICYmICghcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ3NvY2tldCcpIHx8XG4gICAgIXJlc3BvbnNlLnNvY2tldC5hdXRob3JpemVkKSkge1xuICAgIGRlYnVnKCdzdHJpY3Qgc3NsIGVycm9yJywgc2VsZi51cmkuaHJlZilcbiAgICB2YXIgc3NsRXJyID0gcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ3NvY2tldCcpID8gcmVzcG9uc2Uuc29ja2V0LmF1dGhvcml6YXRpb25FcnJvciA6IHNlbGYudXJpLmhyZWYgKyAnIGRvZXMgbm90IHN1cHBvcnQgU1NMJ1xuICAgIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ1NTTCBFcnJvcjogJyArIHNzbEVycikpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBTYXZlIHRoZSBvcmlnaW5hbCBob3N0IGJlZm9yZSBhbnkgcmVkaXJlY3QgKGlmIGl0IGNoYW5nZXMsIHdlIG5lZWQgdG9cbiAgLy8gcmVtb3ZlIGFueSBhdXRob3JpemF0aW9uIGhlYWRlcnMpLiAgQWxzbyByZW1lbWJlciB0aGUgY2FzZSBvZiB0aGUgaGVhZGVyXG4gIC8vIG5hbWUgYmVjYXVzZSBsb3RzIG9mIGJyb2tlbiBzZXJ2ZXJzIGV4cGVjdCBIb3N0IGluc3RlYWQgb2YgaG9zdCBhbmQgd2VcbiAgLy8gd2FudCB0aGUgY2FsbGVyIHRvIGJlIGFibGUgdG8gc3BlY2lmeSB0aGlzLlxuICBzZWxmLm9yaWdpbmFsSG9zdCA9IHNlbGYuZ2V0SGVhZGVyKCdob3N0JylcbiAgaWYgKCFzZWxmLm9yaWdpbmFsSG9zdEhlYWRlck5hbWUpIHtcbiAgICBzZWxmLm9yaWdpbmFsSG9zdEhlYWRlck5hbWUgPSBzZWxmLmhhc0hlYWRlcignaG9zdCcpXG4gIH1cbiAgaWYgKHNlbGYuc2V0SG9zdCkge1xuICAgIHNlbGYucmVtb3ZlSGVhZGVyKCdob3N0JylcbiAgfVxuICBzZWxmLmNsZWFyVGltZW91dCgpXG5cbiAgdmFyIHRhcmdldENvb2tpZUphciA9IChzZWxmLl9qYXIgJiYgc2VsZi5famFyLnNldENvb2tpZSkgPyBzZWxmLl9qYXIgOiBnbG9iYWxDb29raWVKYXJcbiAgdmFyIGFkZENvb2tpZSA9IGZ1bmN0aW9uIChjb29raWUpIHtcbiAgICAvLyBzZXQgdGhlIGNvb2tpZSBpZiBpdCdzIGRvbWFpbiBpbiB0aGUgaHJlZidzIGRvbWFpbi5cbiAgICB0cnkge1xuICAgICAgdGFyZ2V0Q29va2llSmFyLnNldENvb2tpZShjb29raWUsIHNlbGYudXJpLmhyZWYsIHtpZ25vcmVFcnJvcjogdHJ1ZX0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpXG4gICAgfVxuICB9XG5cbiAgcmVzcG9uc2UuY2FzZWxlc3MgPSBjYXNlbGVzcyhyZXNwb25zZS5oZWFkZXJzKVxuXG4gIGlmIChyZXNwb25zZS5jYXNlbGVzcy5oYXMoJ3NldC1jb29raWUnKSAmJiAoIXNlbGYuX2Rpc2FibGVDb29raWVzKSkge1xuICAgIHZhciBoZWFkZXJOYW1lID0gcmVzcG9uc2UuY2FzZWxlc3MuaGFzKCdzZXQtY29va2llJylcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZS5oZWFkZXJzW2hlYWRlck5hbWVdKSkge1xuICAgICAgcmVzcG9uc2UuaGVhZGVyc1toZWFkZXJOYW1lXS5mb3JFYWNoKGFkZENvb2tpZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkQ29va2llKHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyTmFtZV0pXG4gICAgfVxuICB9XG5cbiAgaWYgKHNlbGYuX3JlZGlyZWN0Lm9uUmVzcG9uc2UocmVzcG9uc2UpKSB7XG4gICAgcmV0dXJuIC8vIElnbm9yZSB0aGUgcmVzdCBvZiB0aGUgcmVzcG9uc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBCZSBhIGdvb2Qgc3RyZWFtIGFuZCBlbWl0IGVuZCB3aGVuIHRoZSByZXNwb25zZSBpcyBmaW5pc2hlZC5cbiAgICAvLyBIYWNrIHRvIGVtaXQgZW5kIG9uIGNsb3NlIGJlY2F1c2Ugb2YgYSBjb3JlIGJ1ZyB0aGF0IG5ldmVyIGZpcmVzIGVuZFxuICAgIHJlc3BvbnNlLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghc2VsZi5fZW5kZWQpIHtcbiAgICAgICAgc2VsZi5yZXNwb25zZS5lbWl0KCdlbmQnKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXNwb25zZS5vbmNlKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWVcbiAgICB9KVxuXG4gICAgdmFyIG5vQm9keSA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzZWxmLm1ldGhvZCA9PT0gJ0hFQUQnIHx8XG4gICAgICAgIC8vIEluZm9ybWF0aW9uYWxcbiAgICAgICAgKGNvZGUgPj0gMTAwICYmIGNvZGUgPCAyMDApIHx8XG4gICAgICAgIC8vIE5vIENvbnRlbnRcbiAgICAgICAgY29kZSA9PT0gMjA0IHx8XG4gICAgICAgIC8vIE5vdCBNb2RpZmllZFxuICAgICAgICBjb2RlID09PSAzMDRcbiAgICAgIClcbiAgICB9XG5cbiAgICB2YXIgcmVzcG9uc2VDb250ZW50XG4gICAgaWYgKHNlbGYuZ3ppcCAmJiAhbm9Cb2R5KHJlc3BvbnNlLnN0YXR1c0NvZGUpKSB7XG4gICAgICB2YXIgY29udGVudEVuY29kaW5nID0gcmVzcG9uc2UuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddIHx8ICdpZGVudGl0eSdcbiAgICAgIGNvbnRlbnRFbmNvZGluZyA9IGNvbnRlbnRFbmNvZGluZy50cmltKCkudG9Mb3dlckNhc2UoKVxuXG4gICAgICAvLyBCZSBtb3JlIGxlbmllbnQgd2l0aCBkZWNvZGluZyBjb21wcmVzc2VkIHJlc3BvbnNlcywgc2luY2UgKHZlcnkgcmFyZWx5KVxuICAgICAgLy8gc2VydmVycyBzZW5kIHNsaWdodGx5IGludmFsaWQgZ3ppcCByZXNwb25zZXMgdGhhdCBhcmUgc3RpbGwgYWNjZXB0ZWRcbiAgICAgIC8vIGJ5IGNvbW1vbiBicm93c2Vycy5cbiAgICAgIC8vIEFsd2F5cyB1c2luZyBaX1NZTkNfRkxVU0ggaXMgd2hhdCBjVVJMIGRvZXMuXG4gICAgICB2YXIgemxpYk9wdGlvbnMgPSB7XG4gICAgICAgIGZsdXNoOiB6bGliLlpfU1lOQ19GTFVTSCxcbiAgICAgICAgZmluaXNoRmx1c2g6IHpsaWIuWl9TWU5DX0ZMVVNIXG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50RW5jb2RpbmcgPT09ICdnemlwJykge1xuICAgICAgICByZXNwb25zZUNvbnRlbnQgPSB6bGliLmNyZWF0ZUd1bnppcCh6bGliT3B0aW9ucylcbiAgICAgICAgcmVzcG9uc2UucGlwZShyZXNwb25zZUNvbnRlbnQpXG4gICAgICB9IGVsc2UgaWYgKGNvbnRlbnRFbmNvZGluZyA9PT0gJ2RlZmxhdGUnKSB7XG4gICAgICAgIHJlc3BvbnNlQ29udGVudCA9IHpsaWIuY3JlYXRlSW5mbGF0ZSh6bGliT3B0aW9ucylcbiAgICAgICAgcmVzcG9uc2UucGlwZShyZXNwb25zZUNvbnRlbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSBwcmV2aW91cyB2ZXJzaW9ucyBkaWRuJ3QgY2hlY2sgZm9yIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyLFxuICAgICAgICAvLyBpZ25vcmUgYW55IGludmFsaWQgdmFsdWVzIHRvIHByZXNlcnZlIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5XG4gICAgICAgIGlmIChjb250ZW50RW5jb2RpbmcgIT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgICBkZWJ1ZygnaWdub3JpbmcgdW5yZWNvZ25pemVkIENvbnRlbnQtRW5jb2RpbmcgJyArIGNvbnRlbnRFbmNvZGluZylcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZUNvbnRlbnQgPSByZXNwb25zZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNwb25zZUNvbnRlbnQgPSByZXNwb25zZVxuICAgIH1cblxuICAgIGlmIChzZWxmLmVuY29kaW5nKSB7XG4gICAgICBpZiAoc2VsZi5kZXN0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignSWdub3JpbmcgZW5jb2RpbmcgcGFyYW1ldGVyIGFzIHRoaXMgc3RyZWFtIGlzIGJlaW5nIHBpcGVkIHRvIGFub3RoZXIgc3RyZWFtIHdoaWNoIG1ha2VzIHRoZSBlbmNvZGluZyBvcHRpb24gaW52YWxpZC4nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VDb250ZW50LnNldEVuY29kaW5nKHNlbGYuZW5jb2RpbmcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuX3BhdXNlZCkge1xuICAgICAgcmVzcG9uc2VDb250ZW50LnBhdXNlKClcbiAgICB9XG5cbiAgICBzZWxmLnJlc3BvbnNlQ29udGVudCA9IHJlc3BvbnNlQ29udGVudFxuXG4gICAgc2VsZi5lbWl0KCdyZXNwb25zZScsIHJlc3BvbnNlKVxuXG4gICAgc2VsZi5kZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChkZXN0KSB7XG4gICAgICBzZWxmLnBpcGVEZXN0KGRlc3QpXG4gICAgfSlcblxuICAgIHJlc3BvbnNlQ29udGVudC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgaWYgKHNlbGYudGltaW5nICYmICFzZWxmLnJlc3BvbnNlU3RhcnRlZCkge1xuICAgICAgICBzZWxmLnJlc3BvbnNlU3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKVxuXG4gICAgICAgIC8vIE5PVEU6IHJlc3BvbnNlU3RhcnRUaW1lIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgLnRpbWluZ3NcbiAgICAgICAgcmVzcG9uc2UucmVzcG9uc2VTdGFydFRpbWUgPSBzZWxmLnJlc3BvbnNlU3RhcnRUaW1lXG4gICAgICB9XG4gICAgICBzZWxmLl9kZXN0ZGF0YSA9IHRydWVcbiAgICAgIHNlbGYuZW1pdCgnZGF0YScsIGNodW5rKVxuICAgIH0pXG4gICAgcmVzcG9uc2VDb250ZW50Lm9uY2UoJ2VuZCcsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgc2VsZi5lbWl0KCdlbmQnLCBjaHVuaylcbiAgICB9KVxuICAgIHJlc3BvbnNlQ29udGVudC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnJvcilcbiAgICB9KVxuICAgIHJlc3BvbnNlQ29udGVudC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IHNlbGYuZW1pdCgnY2xvc2UnKSB9KVxuXG4gICAgaWYgKHNlbGYuY2FsbGJhY2spIHtcbiAgICAgIHNlbGYucmVhZFJlc3BvbnNlQm9keShyZXNwb25zZSlcbiAgICB9IGVsc2UgeyAvLyBpZiBubyBjYWxsYmFja1xuICAgICAgc2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2VsZi5fYWJvcnRlZCkge1xuICAgICAgICAgIGRlYnVnKCdhYm9ydGVkJywgc2VsZi51cmkuaHJlZilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgcmVzcG9uc2UpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBkZWJ1ZygnZmluaXNoIGluaXQgZnVuY3Rpb24nLCBzZWxmLnVyaS5ocmVmKVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5yZWFkUmVzcG9uc2VCb2R5ID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBkZWJ1ZyhcInJlYWRpbmcgcmVzcG9uc2UncyBib2R5XCIpXG4gIHZhciBidWZmZXJzID0gW11cbiAgdmFyIGJ1ZmZlckxlbmd0aCA9IDBcbiAgdmFyIHN0cmluZ3MgPSBbXVxuXG4gIHNlbGYub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICAgIHN0cmluZ3MucHVzaChjaHVuaylcbiAgICB9IGVsc2UgaWYgKGNodW5rLmxlbmd0aCkge1xuICAgICAgYnVmZmVyTGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuICAgICAgYnVmZmVycy5wdXNoKGNodW5rKVxuICAgIH1cbiAgfSlcbiAgc2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGRlYnVnKCdlbmQgZXZlbnQnLCBzZWxmLnVyaS5ocmVmKVxuICAgIGlmIChzZWxmLl9hYm9ydGVkKSB7XG4gICAgICBkZWJ1ZygnYWJvcnRlZCcsIHNlbGYudXJpLmhyZWYpXG4gICAgICAvLyBgYnVmZmVyYCBpcyBkZWZpbmVkIGluIHRoZSBwYXJlbnQgc2NvcGUgYW5kIHVzZWQgaW4gYSBjbG9zdXJlIGl0IGV4aXN0cyBmb3IgdGhlIGxpZmUgb2YgdGhlIHJlcXVlc3QuXG4gICAgICAvLyBUaGlzIGNhbiBsZWFkIHRvIGxlYWt5IGJlaGF2aW9yIGlmIHRoZSB1c2VyIHJldGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHJlcXVlc3Qgb2JqZWN0LlxuICAgICAgYnVmZmVycyA9IFtdXG4gICAgICBidWZmZXJMZW5ndGggPSAwXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYnVmZmVyTGVuZ3RoKSB7XG4gICAgICBkZWJ1ZygnaGFzIGJvZHknLCBzZWxmLnVyaS5ocmVmLCBidWZmZXJMZW5ndGgpXG4gICAgICByZXNwb25zZS5ib2R5ID0gQnVmZmVyLmNvbmNhdChidWZmZXJzLCBidWZmZXJMZW5ndGgpXG4gICAgICBpZiAoc2VsZi5lbmNvZGluZyAhPT0gbnVsbCkge1xuICAgICAgICByZXNwb25zZS5ib2R5ID0gcmVzcG9uc2UuYm9keS50b1N0cmluZyhzZWxmLmVuY29kaW5nKVxuICAgICAgfVxuICAgICAgLy8gYGJ1ZmZlcmAgaXMgZGVmaW5lZCBpbiB0aGUgcGFyZW50IHNjb3BlIGFuZCB1c2VkIGluIGEgY2xvc3VyZSBpdCBleGlzdHMgZm9yIHRoZSBsaWZlIG9mIHRoZSBSZXF1ZXN0LlxuICAgICAgLy8gVGhpcyBjYW4gbGVhZCB0byBsZWFreSBiZWhhdmlvciBpZiB0aGUgdXNlciByZXRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSByZXF1ZXN0IG9iamVjdC5cbiAgICAgIGJ1ZmZlcnMgPSBbXVxuICAgICAgYnVmZmVyTGVuZ3RoID0gMFxuICAgIH0gZWxzZSBpZiAoc3RyaW5ncy5sZW5ndGgpIHtcbiAgICAgIC8vIFRoZSBVVEY4IEJPTSBbMHhFRiwweEJCLDB4QkZdIGlzIGNvbnZlcnRlZCB0byBbMHhGRSwweEZGXSBpbiB0aGUgSlMgVVRDMTYvVUNTMiByZXByZXNlbnRhdGlvbi5cbiAgICAgIC8vIFN0cmlwIHRoaXMgdmFsdWUgb3V0IHdoZW4gdGhlIGVuY29kaW5nIGlzIHNldCB0byAndXRmOCcsIGFzIHVwc3RyZWFtIGNvbnN1bWVycyB3b24ndCBleHBlY3QgaXQgYW5kIGl0IGJyZWFrcyBKU09OLnBhcnNlKCkuXG4gICAgICBpZiAoc2VsZi5lbmNvZGluZyA9PT0gJ3V0ZjgnICYmIHN0cmluZ3NbMF0ubGVuZ3RoID4gMCAmJiBzdHJpbmdzWzBdWzBdID09PSAnXFx1RkVGRicpIHtcbiAgICAgICAgc3RyaW5nc1swXSA9IHN0cmluZ3NbMF0uc3Vic3RyaW5nKDEpXG4gICAgICB9XG4gICAgICByZXNwb25zZS5ib2R5ID0gc3RyaW5ncy5qb2luKCcnKVxuICAgIH1cblxuICAgIGlmIChzZWxmLl9qc29uKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZS5ib2R5ID0gSlNPTi5wYXJzZShyZXNwb25zZS5ib2R5LCBzZWxmLl9qc29uUmV2aXZlcilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGVidWcoJ2ludmFsaWQgSlNPTiByZWNlaXZlZCcsIHNlbGYudXJpLmhyZWYpXG4gICAgICB9XG4gICAgfVxuICAgIGRlYnVnKCdlbWl0dGluZyBjb21wbGV0ZScsIHNlbGYudXJpLmhyZWYpXG4gICAgaWYgKHR5cGVvZiByZXNwb25zZS5ib2R5ID09PSAndW5kZWZpbmVkJyAmJiAhc2VsZi5fanNvbikge1xuICAgICAgcmVzcG9uc2UuYm9keSA9IHNlbGYuZW5jb2RpbmcgPT09IG51bGwgPyBCdWZmZXIuYWxsb2MoMCkgOiAnJ1xuICAgIH1cbiAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgcmVzcG9uc2UsIHJlc3BvbnNlLmJvZHkpXG4gIH0pXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgc2VsZi5fYWJvcnRlZCA9IHRydWVcblxuICBpZiAoc2VsZi5yZXEpIHtcbiAgICBzZWxmLnJlcS5hYm9ydCgpXG4gIH0gZWxzZSBpZiAoc2VsZi5yZXNwb25zZSkge1xuICAgIHNlbGYucmVzcG9uc2UuZGVzdHJveSgpXG4gIH1cblxuICBzZWxmLmNsZWFyVGltZW91dCgpXG4gIHNlbGYuZW1pdCgnYWJvcnQnKVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5waXBlRGVzdCA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgcmVzcG9uc2UgPSBzZWxmLnJlc3BvbnNlXG4gIC8vIENhbGxlZCBhZnRlciB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWRcbiAgaWYgKGRlc3QuaGVhZGVycyAmJiAhZGVzdC5oZWFkZXJzU2VudCkge1xuICAgIGlmIChyZXNwb25zZS5jYXNlbGVzcy5oYXMoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICB2YXIgY3RuYW1lID0gcmVzcG9uc2UuY2FzZWxlc3MuaGFzKCdjb250ZW50LXR5cGUnKVxuICAgICAgaWYgKGRlc3Quc2V0SGVhZGVyKSB7XG4gICAgICAgIGRlc3Quc2V0SGVhZGVyKGN0bmFtZSwgcmVzcG9uc2UuaGVhZGVyc1tjdG5hbWVdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdC5oZWFkZXJzW2N0bmFtZV0gPSByZXNwb25zZS5oZWFkZXJzW2N0bmFtZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UuY2FzZWxlc3MuaGFzKCdjb250ZW50LWxlbmd0aCcpKSB7XG4gICAgICB2YXIgY2xuYW1lID0gcmVzcG9uc2UuY2FzZWxlc3MuaGFzKCdjb250ZW50LWxlbmd0aCcpXG4gICAgICBpZiAoZGVzdC5zZXRIZWFkZXIpIHtcbiAgICAgICAgZGVzdC5zZXRIZWFkZXIoY2xuYW1lLCByZXNwb25zZS5oZWFkZXJzW2NsbmFtZV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXN0LmhlYWRlcnNbY2xuYW1lXSA9IHJlc3BvbnNlLmhlYWRlcnNbY2xuYW1lXVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGVzdC5zZXRIZWFkZXIgJiYgIWRlc3QuaGVhZGVyc1NlbnQpIHtcbiAgICBmb3IgKHZhciBpIGluIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgIC8vIElmIHRoZSByZXNwb25zZSBjb250ZW50IGlzIGJlaW5nIGRlY29kZWQsIHRoZSBDb250ZW50LUVuY29kaW5nIGhlYWRlclxuICAgICAgLy8gb2YgdGhlIHJlc3BvbnNlIGRvZXNuJ3QgcmVwcmVzZW50IHRoZSBwaXBlZCBjb250ZW50LCBzbyBkb24ndCBwYXNzIGl0LlxuICAgICAgaWYgKCFzZWxmLmd6aXAgfHwgaSAhPT0gJ2NvbnRlbnQtZW5jb2RpbmcnKSB7XG4gICAgICAgIGRlc3Quc2V0SGVhZGVyKGksIHJlc3BvbnNlLmhlYWRlcnNbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIGRlc3Quc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c0NvZGVcbiAgfVxuICBpZiAoc2VsZi5waXBlZmlsdGVyKSB7XG4gICAgc2VsZi5waXBlZmlsdGVyKHJlc3BvbnNlLCBkZXN0KVxuICB9XG59XG5cblJlcXVlc3QucHJvdG90eXBlLnFzID0gZnVuY3Rpb24gKHEsIGNsb2JiZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBiYXNlXG4gIGlmICghY2xvYmJlciAmJiBzZWxmLnVyaS5xdWVyeSkge1xuICAgIGJhc2UgPSBzZWxmLl9xcy5wYXJzZShzZWxmLnVyaS5xdWVyeSlcbiAgfSBlbHNlIHtcbiAgICBiYXNlID0ge31cbiAgfVxuXG4gIGZvciAodmFyIGkgaW4gcSkge1xuICAgIGJhc2VbaV0gPSBxW2ldXG4gIH1cblxuICB2YXIgcXMgPSBzZWxmLl9xcy5zdHJpbmdpZnkoYmFzZSlcblxuICBpZiAocXMgPT09ICcnKSB7XG4gICAgcmV0dXJuIHNlbGZcbiAgfVxuXG4gIHNlbGYudXJpID0gdXJsLnBhcnNlKHNlbGYudXJpLmhyZWYuc3BsaXQoJz8nKVswXSArICc/JyArIHFzKVxuICBzZWxmLnVybCA9IHNlbGYudXJpXG4gIHNlbGYucGF0aCA9IHNlbGYudXJpLnBhdGhcblxuICBpZiAoc2VsZi51cmkuaG9zdCA9PT0gJ3VuaXgnKSB7XG4gICAgc2VsZi5lbmFibGVVbml4U29ja2V0KClcbiAgfVxuXG4gIHJldHVybiBzZWxmXG59XG5SZXF1ZXN0LnByb3RvdHlwZS5mb3JtID0gZnVuY3Rpb24gKGZvcm0pIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChmb3JtKSB7XG4gICAgaWYgKCEvXmFwcGxpY2F0aW9uXFwveC13d3ctZm9ybS11cmxlbmNvZGVkXFxiLy50ZXN0KHNlbGYuZ2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSkpIHtcbiAgICAgIHNlbGYuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJylcbiAgICB9XG4gICAgc2VsZi5ib2R5ID0gKHR5cGVvZiBmb3JtID09PSAnc3RyaW5nJylcbiAgICAgID8gc2VsZi5fcXMucmZjMzk4Nihmb3JtLnRvU3RyaW5nKCd1dGY4JykpXG4gICAgICA6IHNlbGYuX3FzLnN0cmluZ2lmeShmb3JtKS50b1N0cmluZygndXRmOCcpXG4gICAgcmV0dXJuIHNlbGZcbiAgfVxuICAvLyBjcmVhdGUgZm9ybS1kYXRhIG9iamVjdFxuICBzZWxmLl9mb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgc2VsZi5fZm9ybS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgZXJyLm1lc3NhZ2UgPSAnZm9ybS1kYXRhOiAnICsgZXJyLm1lc3NhZ2VcbiAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIHNlbGYuYWJvcnQoKVxuICB9KVxuICByZXR1cm4gc2VsZi5fZm9ybVxufVxuUmVxdWVzdC5wcm90b3R5cGUubXVsdGlwYXJ0ID0gZnVuY3Rpb24gKG11bHRpcGFydCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBzZWxmLl9tdWx0aXBhcnQub25SZXF1ZXN0KG11bHRpcGFydClcblxuICBpZiAoIXNlbGYuX211bHRpcGFydC5jaHVua2VkKSB7XG4gICAgc2VsZi5ib2R5ID0gc2VsZi5fbXVsdGlwYXJ0LmJvZHlcbiAgfVxuXG4gIHJldHVybiBzZWxmXG59XG5SZXF1ZXN0LnByb3RvdHlwZS5qc29uID0gZnVuY3Rpb24gKHZhbCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBpZiAoIXNlbGYuaGFzSGVhZGVyKCdhY2NlcHQnKSkge1xuICAgIHNlbGYuc2V0SGVhZGVyKCdhY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpXG4gIH1cblxuICBpZiAodHlwZW9mIHNlbGYuanNvblJlcGxhY2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2VsZi5fanNvblJlcGxhY2VyID0gc2VsZi5qc29uUmVwbGFjZXJcbiAgfVxuXG4gIHNlbGYuX2pzb24gPSB0cnVlXG4gIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICBpZiAoc2VsZi5ib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghL15hcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcYi8udGVzdChzZWxmLmdldEhlYWRlcignY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIHNlbGYuYm9keSA9IHNhZmVTdHJpbmdpZnkoc2VsZi5ib2R5LCBzZWxmLl9qc29uUmVwbGFjZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmJvZHkgPSBzZWxmLl9xcy5yZmMzOTg2KHNlbGYuYm9keSlcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi5oYXNIZWFkZXIoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgIHNlbGYuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNlbGYuYm9keSA9IHNhZmVTdHJpbmdpZnkodmFsLCBzZWxmLl9qc29uUmVwbGFjZXIpXG4gICAgaWYgKCFzZWxmLmhhc0hlYWRlcignY29udGVudC10eXBlJykpIHtcbiAgICAgIHNlbGYuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpXG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzZWxmLmpzb25SZXZpdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2VsZi5fanNvblJldml2ZXIgPSBzZWxmLmpzb25SZXZpdmVyXG4gIH1cblxuICByZXR1cm4gc2VsZlxufVxuUmVxdWVzdC5wcm90b3R5cGUuZ2V0SGVhZGVyID0gZnVuY3Rpb24gKG5hbWUsIGhlYWRlcnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciByZXN1bHQsIHJlLCBtYXRjaFxuICBpZiAoIWhlYWRlcnMpIHtcbiAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzXG4gIH1cbiAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggIT09IG5hbWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmUgPSBuZXcgUmVnRXhwKG5hbWUsICdpJylcbiAgICBtYXRjaCA9IGtleS5tYXRjaChyZSlcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJlc3VsdCA9IGhlYWRlcnNba2V5XVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufVxuUmVxdWVzdC5wcm90b3R5cGUuZW5hYmxlVW5peFNvY2tldCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gR2V0IHRoZSBzb2NrZXQgJiByZXF1ZXN0IHBhdGhzIGZyb20gdGhlIFVSTFxuICB2YXIgdW5peFBhcnRzID0gdGhpcy51cmkucGF0aC5zcGxpdCgnOicpXG4gIHZhciBob3N0ID0gdW5peFBhcnRzWzBdXG4gIHZhciBwYXRoID0gdW5peFBhcnRzWzFdXG4gIC8vIEFwcGx5IHVuaXggcHJvcGVydGllcyB0byByZXF1ZXN0XG4gIHRoaXMuc29ja2V0UGF0aCA9IGhvc3RcbiAgdGhpcy51cmkucGF0aG5hbWUgPSBwYXRoXG4gIHRoaXMudXJpLnBhdGggPSBwYXRoXG4gIHRoaXMudXJpLmhvc3QgPSBob3N0XG4gIHRoaXMudXJpLmhvc3RuYW1lID0gaG9zdFxuICB0aGlzLnVyaS5pc1VuaXggPSB0cnVlXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmF1dGggPSBmdW5jdGlvbiAodXNlciwgcGFzcywgc2VuZEltbWVkaWF0ZWx5LCBiZWFyZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgc2VsZi5fYXV0aC5vblJlcXVlc3QodXNlciwgcGFzcywgc2VuZEltbWVkaWF0ZWx5LCBiZWFyZXIpXG5cbiAgcmV0dXJuIHNlbGZcbn1cblJlcXVlc3QucHJvdG90eXBlLmF3cyA9IGZ1bmN0aW9uIChvcHRzLCBub3cpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgaWYgKCFub3cpIHtcbiAgICBzZWxmLl9hd3MgPSBvcHRzXG4gICAgcmV0dXJuIHNlbGZcbiAgfVxuXG4gIGlmIChvcHRzLnNpZ25fdmVyc2lvbiA9PT0gNCB8fCBvcHRzLnNpZ25fdmVyc2lvbiA9PT0gJzQnKSB7XG4gICAgLy8gdXNlIGF3czRcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGhvc3Q6IHNlbGYudXJpLmhvc3QsXG4gICAgICBwYXRoOiBzZWxmLnVyaS5wYXRoLFxuICAgICAgbWV0aG9kOiBzZWxmLm1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHNlbGYuaGVhZGVycyxcbiAgICAgIGJvZHk6IHNlbGYuYm9keVxuICAgIH1cbiAgICBpZiAob3B0cy5zZXJ2aWNlKSB7XG4gICAgICBvcHRpb25zLnNlcnZpY2UgPSBvcHRzLnNlcnZpY2VcbiAgICB9XG4gICAgdmFyIHNpZ25SZXMgPSBhd3M0LnNpZ24ob3B0aW9ucywge1xuICAgICAgYWNjZXNzS2V5SWQ6IG9wdHMua2V5LFxuICAgICAgc2VjcmV0QWNjZXNzS2V5OiBvcHRzLnNlY3JldCxcbiAgICAgIHNlc3Npb25Ub2tlbjogb3B0cy5zZXNzaW9uXG4gICAgfSlcbiAgICBzZWxmLnNldEhlYWRlcignYXV0aG9yaXphdGlvbicsIHNpZ25SZXMuaGVhZGVycy5BdXRob3JpemF0aW9uKVxuICAgIHNlbGYuc2V0SGVhZGVyKCd4LWFtei1kYXRlJywgc2lnblJlcy5oZWFkZXJzWydYLUFtei1EYXRlJ10pXG4gICAgaWYgKHNpZ25SZXMuaGVhZGVyc1snWC1BbXotU2VjdXJpdHktVG9rZW4nXSkge1xuICAgICAgc2VsZi5zZXRIZWFkZXIoJ3gtYW16LXNlY3VyaXR5LXRva2VuJywgc2lnblJlcy5oZWFkZXJzWydYLUFtei1TZWN1cml0eS1Ub2tlbiddKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBkZWZhdWx0OiB1c2UgYXdzLXNpZ24yXG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgc2VsZi5zZXRIZWFkZXIoJ2RhdGUnLCBkYXRlLnRvVVRDU3RyaW5nKCkpXG4gICAgdmFyIGF1dGggPSB7XG4gICAgICBrZXk6IG9wdHMua2V5LFxuICAgICAgc2VjcmV0OiBvcHRzLnNlY3JldCxcbiAgICAgIHZlcmI6IHNlbGYubWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICBkYXRlOiBkYXRlLFxuICAgICAgY29udGVudFR5cGU6IHNlbGYuZ2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSB8fCAnJyxcbiAgICAgIG1kNTogc2VsZi5nZXRIZWFkZXIoJ2NvbnRlbnQtbWQ1JykgfHwgJycsXG4gICAgICBhbWF6b25IZWFkZXJzOiBhd3MyLmNhbm9uaWNhbGl6ZUhlYWRlcnMoc2VsZi5oZWFkZXJzKVxuICAgIH1cbiAgICB2YXIgcGF0aCA9IHNlbGYudXJpLnBhdGhcbiAgICBpZiAob3B0cy5idWNrZXQgJiYgcGF0aCkge1xuICAgICAgYXV0aC5yZXNvdXJjZSA9ICcvJyArIG9wdHMuYnVja2V0ICsgcGF0aFxuICAgIH0gZWxzZSBpZiAob3B0cy5idWNrZXQgJiYgIXBhdGgpIHtcbiAgICAgIGF1dGgucmVzb3VyY2UgPSAnLycgKyBvcHRzLmJ1Y2tldFxuICAgIH0gZWxzZSBpZiAoIW9wdHMuYnVja2V0ICYmIHBhdGgpIHtcbiAgICAgIGF1dGgucmVzb3VyY2UgPSBwYXRoXG4gICAgfSBlbHNlIGlmICghb3B0cy5idWNrZXQgJiYgIXBhdGgpIHtcbiAgICAgIGF1dGgucmVzb3VyY2UgPSAnLydcbiAgICB9XG4gICAgYXV0aC5yZXNvdXJjZSA9IGF3czIuY2Fub25pY2FsaXplUmVzb3VyY2UoYXV0aC5yZXNvdXJjZSlcbiAgICBzZWxmLnNldEhlYWRlcignYXV0aG9yaXphdGlvbicsIGF3czIuYXV0aG9yaXphdGlvbihhdXRoKSlcbiAgfVxuXG4gIHJldHVybiBzZWxmXG59XG5SZXF1ZXN0LnByb3RvdHlwZS5odHRwU2lnbmF0dXJlID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGh0dHBTaWduYXR1cmUuc2lnblJlcXVlc3Qoe1xuICAgIGdldEhlYWRlcjogZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0SGVhZGVyKGhlYWRlciwgc2VsZi5oZWFkZXJzKVxuICAgIH0sXG4gICAgc2V0SGVhZGVyOiBmdW5jdGlvbiAoaGVhZGVyLCB2YWx1ZSkge1xuICAgICAgc2VsZi5zZXRIZWFkZXIoaGVhZGVyLCB2YWx1ZSlcbiAgICB9LFxuICAgIG1ldGhvZDogc2VsZi5tZXRob2QsXG4gICAgcGF0aDogc2VsZi5wYXRoXG4gIH0sIG9wdHMpXG4gIGRlYnVnKCdodHRwU2lnbmF0dXJlIGF1dGhvcml6YXRpb24nLCBzZWxmLmdldEhlYWRlcignYXV0aG9yaXphdGlvbicpKVxuXG4gIHJldHVybiBzZWxmXG59XG5SZXF1ZXN0LnByb3RvdHlwZS5oYXdrID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYuc2V0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgaGF3ay5oZWFkZXIoc2VsZi51cmksIHNlbGYubWV0aG9kLCBvcHRzKSlcbn1cblJlcXVlc3QucHJvdG90eXBlLm9hdXRoID0gZnVuY3Rpb24gKF9vYXV0aCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBzZWxmLl9vYXV0aC5vblJlcXVlc3QoX29hdXRoKVxuXG4gIHJldHVybiBzZWxmXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmphciA9IGZ1bmN0aW9uIChqYXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBjb29raWVzXG5cbiAgaWYgKHNlbGYuX3JlZGlyZWN0LnJlZGlyZWN0c0ZvbGxvd2VkID09PSAwKSB7XG4gICAgc2VsZi5vcmlnaW5hbENvb2tpZUhlYWRlciA9IHNlbGYuZ2V0SGVhZGVyKCdjb29raWUnKVxuICB9XG5cbiAgaWYgKCFqYXIpIHtcbiAgICAvLyBkaXNhYmxlIGNvb2tpZXNcbiAgICBjb29raWVzID0gZmFsc2VcbiAgICBzZWxmLl9kaXNhYmxlQ29va2llcyA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFyZ2V0Q29va2llSmFyID0gamFyLmdldENvb2tpZVN0cmluZyA/IGphciA6IGdsb2JhbENvb2tpZUphclxuICAgIHZhciB1cmlocmVmID0gc2VsZi51cmkuaHJlZlxuICAgIC8vIGZldGNoIGNvb2tpZSBpbiB0aGUgU3BlY2lmaWVkIGhvc3RcbiAgICBpZiAodGFyZ2V0Q29va2llSmFyKSB7XG4gICAgICBjb29raWVzID0gdGFyZ2V0Q29va2llSmFyLmdldENvb2tpZVN0cmluZyh1cmlocmVmKVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIG5lZWQgY29va2llIGFuZCBjb29raWUgaXMgbm90IGVtcHR5XG4gIGlmIChjb29raWVzICYmIGNvb2tpZXMubGVuZ3RoKSB7XG4gICAgaWYgKHNlbGYub3JpZ2luYWxDb29raWVIZWFkZXIpIHtcbiAgICAgIC8vIERvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBDb29raWUgaGVhZGVyXG4gICAgICBzZWxmLnNldEhlYWRlcignY29va2llJywgc2VsZi5vcmlnaW5hbENvb2tpZUhlYWRlciArICc7ICcgKyBjb29raWVzKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNldEhlYWRlcignY29va2llJywgY29va2llcylcbiAgICB9XG4gIH1cbiAgc2VsZi5famFyID0gamFyXG4gIHJldHVybiBzZWxmXG59XG5cbi8vIFN0cmVhbSBBUElcblJlcXVlc3QucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgb3B0cykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBpZiAoc2VsZi5yZXNwb25zZSkge1xuICAgIGlmIChzZWxmLl9kZXN0ZGF0YSkge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignWW91IGNhbm5vdCBwaXBlIGFmdGVyIGRhdGEgaGFzIGJlZW4gZW1pdHRlZCBmcm9tIHRoZSByZXNwb25zZS4nKSlcbiAgICB9IGVsc2UgaWYgKHNlbGYuX2VuZGVkKSB7XG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdZb3UgY2Fubm90IHBpcGUgYWZ0ZXIgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIGVuZGVkLicpKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0uU3RyZWFtLnByb3RvdHlwZS5waXBlLmNhbGwoc2VsZiwgZGVzdCwgb3B0cylcbiAgICAgIHNlbGYucGlwZURlc3QoZGVzdClcbiAgICAgIHJldHVybiBkZXN0XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNlbGYuZGVzdHMucHVzaChkZXN0KVxuICAgIHN0cmVhbS5TdHJlYW0ucHJvdG90eXBlLnBpcGUuY2FsbChzZWxmLCBkZXN0LCBvcHRzKVxuICAgIHJldHVybiBkZXN0XG4gIH1cbn1cblJlcXVlc3QucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuX2Fib3J0ZWQpIHsgcmV0dXJuIH1cblxuICBpZiAoIXNlbGYuX3N0YXJ0ZWQpIHtcbiAgICBzZWxmLnN0YXJ0KClcbiAgfVxuICBpZiAoc2VsZi5yZXEpIHtcbiAgICByZXR1cm4gc2VsZi5yZXEud3JpdGUuYXBwbHkoc2VsZi5yZXEsIGFyZ3VtZW50cylcbiAgfVxufVxuUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5fYWJvcnRlZCkgeyByZXR1cm4gfVxuXG4gIGlmIChjaHVuaykge1xuICAgIHNlbGYud3JpdGUoY2h1bmspXG4gIH1cbiAgaWYgKCFzZWxmLl9zdGFydGVkKSB7XG4gICAgc2VsZi5zdGFydCgpXG4gIH1cbiAgaWYgKHNlbGYucmVxKSB7XG4gICAgc2VsZi5yZXEuZW5kKClcbiAgfVxufVxuUmVxdWVzdC5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoIXNlbGYucmVzcG9uc2VDb250ZW50KSB7XG4gICAgc2VsZi5fcGF1c2VkID0gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHNlbGYucmVzcG9uc2VDb250ZW50LnBhdXNlLmFwcGx5KHNlbGYucmVzcG9uc2VDb250ZW50LCBhcmd1bWVudHMpXG4gIH1cbn1cblJlcXVlc3QucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghc2VsZi5yZXNwb25zZUNvbnRlbnQpIHtcbiAgICBzZWxmLl9wYXVzZWQgPSBmYWxzZVxuICB9IGVsc2Uge1xuICAgIHNlbGYucmVzcG9uc2VDb250ZW50LnJlc3VtZS5hcHBseShzZWxmLnJlc3BvbnNlQ29udGVudCwgYXJndW1lbnRzKVxuICB9XG59XG5SZXF1ZXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdGhpcy5jbGVhclRpbWVvdXQoKVxuICBpZiAoIXNlbGYuX2VuZGVkKSB7XG4gICAgc2VsZi5lbmQoKVxuICB9IGVsc2UgaWYgKHNlbGYucmVzcG9uc2UpIHtcbiAgICBzZWxmLnJlc3BvbnNlLmRlc3Ryb3koKVxuICB9XG59XG5cblJlcXVlc3QucHJvdG90eXBlLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMudGltZW91dFRpbWVyKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRpbWVyKVxuICAgIHRoaXMudGltZW91dFRpbWVyID0gbnVsbFxuICB9XG59XG5cblJlcXVlc3QuZGVmYXVsdFByb3h5SGVhZGVyV2hpdGVMaXN0ID1cbiAgVHVubmVsLmRlZmF1bHRQcm94eUhlYWRlcldoaXRlTGlzdC5zbGljZSgpXG5cblJlcXVlc3QuZGVmYXVsdFByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9XG4gIFR1bm5lbC5kZWZhdWx0UHJveHlIZWFkZXJFeGNsdXNpdmVMaXN0LnNsaWNlKClcblxuLy8gRXhwb3J0c1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50b0pTT04gPSByZXF1ZXN0VG9KU09OXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RcbiIsICIvLyBDb3B5cmlnaHQgMjAxMC0yMDEyIE1pa2VhbCBSb2dlcnNcbi8vXG4vLyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnZXh0ZW5kJylcbnZhciBjb29raWVzID0gcmVxdWlyZSgnLi9saWIvY29va2llcycpXG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vbGliL2hlbHBlcnMnKVxuXG52YXIgcGFyYW1zSGF2ZVJlcXVlc3RCb2R5ID0gaGVscGVycy5wYXJhbXNIYXZlUmVxdWVzdEJvZHlcblxuLy8gb3JnYW5pemUgcGFyYW1zIGZvciBwYXRjaCwgcG9zdCwgcHV0LCBoZWFkLCBkZWxcbmZ1bmN0aW9uIGluaXRQYXJhbXMgKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gIH1cblxuICB2YXIgcGFyYW1zID0ge31cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgZXh0ZW5kKHBhcmFtcywgb3B0aW9ucywge3VyaTogdXJpfSlcbiAgfSBlbHNlIGlmICh0eXBlb2YgdXJpID09PSAnc3RyaW5nJykge1xuICAgIGV4dGVuZChwYXJhbXMsIHt1cmk6IHVyaX0pXG4gIH0gZWxzZSB7XG4gICAgZXh0ZW5kKHBhcmFtcywgdXJpKVxuICB9XG5cbiAgcGFyYW1zLmNhbGxiYWNrID0gY2FsbGJhY2sgfHwgcGFyYW1zLmNhbGxiYWNrXG4gIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gcmVxdWVzdCAodXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIHVyaSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZGVmaW5lZCBpcyBub3QgYSB2YWxpZCB1cmkgb3Igb3B0aW9ucyBvYmplY3QuJylcbiAgfVxuXG4gIHZhciBwYXJhbXMgPSBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spXG5cbiAgaWYgKHBhcmFtcy5tZXRob2QgPT09ICdIRUFEJyAmJiBwYXJhbXNIYXZlUmVxdWVzdEJvZHkocGFyYW1zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSFRUUCBIRUFEIHJlcXVlc3RzIE1VU1QgTk9UIGluY2x1ZGUgYSByZXF1ZXN0IGJvZHkuJylcbiAgfVxuXG4gIHJldHVybiBuZXcgcmVxdWVzdC5SZXF1ZXN0KHBhcmFtcylcbn1cblxuZnVuY3Rpb24gdmVyYkZ1bmMgKHZlcmIpIHtcbiAgdmFyIG1ldGhvZCA9IHZlcmIudG9VcHBlckNhc2UoKVxuICByZXR1cm4gZnVuY3Rpb24gKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgcGFyYW1zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgIHBhcmFtcy5tZXRob2QgPSBtZXRob2RcbiAgICByZXR1cm4gcmVxdWVzdChwYXJhbXMsIHBhcmFtcy5jYWxsYmFjaylcbiAgfVxufVxuXG4vLyBkZWZpbmUgbGlrZSB0aGlzIHRvIHBsZWFzZSBjb2RlaW50ZWwvaW50ZWxsaXNlbnNlIElERXNcbnJlcXVlc3QuZ2V0ID0gdmVyYkZ1bmMoJ2dldCcpXG5yZXF1ZXN0LmhlYWQgPSB2ZXJiRnVuYygnaGVhZCcpXG5yZXF1ZXN0Lm9wdGlvbnMgPSB2ZXJiRnVuYygnb3B0aW9ucycpXG5yZXF1ZXN0LnBvc3QgPSB2ZXJiRnVuYygncG9zdCcpXG5yZXF1ZXN0LnB1dCA9IHZlcmJGdW5jKCdwdXQnKVxucmVxdWVzdC5wYXRjaCA9IHZlcmJGdW5jKCdwYXRjaCcpXG5yZXF1ZXN0LmRlbCA9IHZlcmJGdW5jKCdkZWxldGUnKVxucmVxdWVzdFsnZGVsZXRlJ10gPSB2ZXJiRnVuYygnZGVsZXRlJylcblxucmVxdWVzdC5qYXIgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgcmV0dXJuIGNvb2tpZXMuamFyKHN0b3JlKVxufVxuXG5yZXF1ZXN0LmNvb2tpZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGNvb2tpZXMucGFyc2Uoc3RyKVxufVxuXG5mdW5jdGlvbiB3cmFwUmVxdWVzdE1ldGhvZCAobWV0aG9kLCBvcHRpb25zLCByZXF1ZXN0ZXIsIHZlcmIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh1cmksIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHBhcmFtcyA9IGluaXRQYXJhbXModXJpLCBvcHRzLCBjYWxsYmFjaylcblxuICAgIHZhciB0YXJnZXQgPSB7fVxuICAgIGV4dGVuZCh0cnVlLCB0YXJnZXQsIG9wdGlvbnMsIHBhcmFtcylcblxuICAgIHRhcmdldC5wb29sID0gcGFyYW1zLnBvb2wgfHwgb3B0aW9ucy5wb29sXG5cbiAgICBpZiAodmVyYikge1xuICAgICAgdGFyZ2V0Lm1ldGhvZCA9IHZlcmIudG9VcHBlckNhc2UoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVxdWVzdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtZXRob2QgPSByZXF1ZXN0ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0aG9kKHRhcmdldCwgdGFyZ2V0LmNhbGxiYWNrKVxuICB9XG59XG5cbnJlcXVlc3QuZGVmYXVsdHMgPSBmdW5jdGlvbiAob3B0aW9ucywgcmVxdWVzdGVyKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVxdWVzdGVyID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgdmFyIGRlZmF1bHRzID0gd3JhcFJlcXVlc3RNZXRob2Qoc2VsZiwgb3B0aW9ucywgcmVxdWVzdGVyKVxuXG4gIHZhciB2ZXJicyA9IFsnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnZGVsJywgJ2RlbGV0ZSddXG4gIHZlcmJzLmZvckVhY2goZnVuY3Rpb24gKHZlcmIpIHtcbiAgICBkZWZhdWx0c1t2ZXJiXSA9IHdyYXBSZXF1ZXN0TWV0aG9kKHNlbGZbdmVyYl0sIG9wdGlvbnMsIHJlcXVlc3RlciwgdmVyYilcbiAgfSlcblxuICBkZWZhdWx0cy5jb29raWUgPSB3cmFwUmVxdWVzdE1ldGhvZChzZWxmLmNvb2tpZSwgb3B0aW9ucywgcmVxdWVzdGVyKVxuICBkZWZhdWx0cy5qYXIgPSBzZWxmLmphclxuICBkZWZhdWx0cy5kZWZhdWx0cyA9IHNlbGYuZGVmYXVsdHNcbiAgcmV0dXJuIGRlZmF1bHRzXG59XG5cbnJlcXVlc3QuZm9yZXZlciA9IGZ1bmN0aW9uIChhZ2VudE9wdGlvbnMsIG9wdGlvbnNBcmcpIHtcbiAgdmFyIG9wdGlvbnMgPSB7fVxuICBpZiAob3B0aW9uc0FyZykge1xuICAgIGV4dGVuZChvcHRpb25zLCBvcHRpb25zQXJnKVxuICB9XG4gIGlmIChhZ2VudE9wdGlvbnMpIHtcbiAgICBvcHRpb25zLmFnZW50T3B0aW9ucyA9IGFnZW50T3B0aW9uc1xuICB9XG5cbiAgb3B0aW9ucy5mb3JldmVyID0gdHJ1ZVxuICByZXR1cm4gcmVxdWVzdC5kZWZhdWx0cyhvcHRpb25zKVxufVxuXG4vLyBFeHBvcnRzXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdFxucmVxdWVzdC5SZXF1ZXN0ID0gcmVxdWlyZSgnLi9yZXF1ZXN0JylcbnJlcXVlc3QuaW5pdFBhcmFtcyA9IGluaXRQYXJhbXNcblxuLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHJlcXVlc3QuZGVidWdcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1ZXN0LCAnZGVidWcnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZXF1ZXN0LlJlcXVlc3QuZGVidWdcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoZGVidWcpIHtcbiAgICByZXF1ZXN0LlJlcXVlc3QuZGVidWcgPSBkZWJ1Z1xuICB9XG59KVxuIiwgIm1vZHVsZS5leHBvcnRzID0gaXNleGVcbmlzZXhlLnN5bmMgPSBzeW5jXG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcblxuZnVuY3Rpb24gY2hlY2tQYXRoRXh0IChwYXRoLCBvcHRpb25zKSB7XG4gIHZhciBwYXRoZXh0ID0gb3B0aW9ucy5wYXRoRXh0ICE9PSB1bmRlZmluZWQgP1xuICAgIG9wdGlvbnMucGF0aEV4dCA6IHByb2Nlc3MuZW52LlBBVEhFWFRcblxuICBpZiAoIXBhdGhleHQpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcGF0aGV4dCA9IHBhdGhleHQuc3BsaXQoJzsnKVxuICBpZiAocGF0aGV4dC5pbmRleE9mKCcnKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aGV4dC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwID0gcGF0aGV4dFtpXS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKHAgJiYgcGF0aC5zdWJzdHIoLXAubGVuZ3RoKS50b0xvd2VyQ2FzZSgpID09PSBwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gY2hlY2tTdGF0IChzdGF0LCBwYXRoLCBvcHRpb25zKSB7XG4gIGlmICghc3RhdC5pc1N5bWJvbGljTGluaygpICYmICFzdGF0LmlzRmlsZSgpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGNoZWNrUGF0aEV4dChwYXRoLCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBpc2V4ZSAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgZnMuc3RhdChwYXRoLCBmdW5jdGlvbiAoZXIsIHN0YXQpIHtcbiAgICBjYihlciwgZXIgPyBmYWxzZSA6IGNoZWNrU3RhdChzdGF0LCBwYXRoLCBvcHRpb25zKSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gc3luYyAocGF0aCwgb3B0aW9ucykge1xuICByZXR1cm4gY2hlY2tTdGF0KGZzLnN0YXRTeW5jKHBhdGgpLCBwYXRoLCBvcHRpb25zKVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gaXNleGVcbmlzZXhlLnN5bmMgPSBzeW5jXG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcblxuZnVuY3Rpb24gaXNleGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gIGZzLnN0YXQocGF0aCwgZnVuY3Rpb24gKGVyLCBzdGF0KSB7XG4gICAgY2IoZXIsIGVyID8gZmFsc2UgOiBjaGVja1N0YXQoc3RhdCwgb3B0aW9ucykpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmMgKHBhdGgsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNoZWNrU3RhdChmcy5zdGF0U3luYyhwYXRoKSwgb3B0aW9ucylcbn1cblxuZnVuY3Rpb24gY2hlY2tTdGF0IChzdGF0LCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGF0LmlzRmlsZSgpICYmIGNoZWNrTW9kZShzdGF0LCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBjaGVja01vZGUgKHN0YXQsIG9wdGlvbnMpIHtcbiAgdmFyIG1vZCA9IHN0YXQubW9kZVxuICB2YXIgdWlkID0gc3RhdC51aWRcbiAgdmFyIGdpZCA9IHN0YXQuZ2lkXG5cbiAgdmFyIG15VWlkID0gb3B0aW9ucy51aWQgIT09IHVuZGVmaW5lZCA/XG4gICAgb3B0aW9ucy51aWQgOiBwcm9jZXNzLmdldHVpZCAmJiBwcm9jZXNzLmdldHVpZCgpXG4gIHZhciBteUdpZCA9IG9wdGlvbnMuZ2lkICE9PSB1bmRlZmluZWQgP1xuICAgIG9wdGlvbnMuZ2lkIDogcHJvY2Vzcy5nZXRnaWQgJiYgcHJvY2Vzcy5nZXRnaWQoKVxuXG4gIHZhciB1ID0gcGFyc2VJbnQoJzEwMCcsIDgpXG4gIHZhciBnID0gcGFyc2VJbnQoJzAxMCcsIDgpXG4gIHZhciBvID0gcGFyc2VJbnQoJzAwMScsIDgpXG4gIHZhciB1ZyA9IHUgfCBnXG5cbiAgdmFyIHJldCA9IChtb2QgJiBvKSB8fFxuICAgIChtb2QgJiBnKSAmJiBnaWQgPT09IG15R2lkIHx8XG4gICAgKG1vZCAmIHUpICYmIHVpZCA9PT0gbXlVaWQgfHxcbiAgICAobW9kICYgdWcpICYmIG15VWlkID09PSAwXG5cbiAgcmV0dXJuIHJldFxufVxuIiwgInZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBjb3JlXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyB8fCBnbG9iYWwuVEVTVElOR19XSU5ET1dTKSB7XG4gIGNvcmUgPSByZXF1aXJlKCcuL3dpbmRvd3MuanMnKVxufSBlbHNlIHtcbiAgY29yZSA9IHJlcXVpcmUoJy4vbW9kZS5qcycpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNleGVcbmlzZXhlLnN5bmMgPSBzeW5jXG5cbmZ1bmN0aW9uIGlzZXhlIChwYXRoLCBvcHRpb25zLCBjYikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdGlvbnNcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIGlmICghY2IpIHtcbiAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIG5vdCBwcm92aWRlZCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlzZXhlKHBhdGgsIG9wdGlvbnMgfHwge30sIGZ1bmN0aW9uIChlciwgaXMpIHtcbiAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgcmVqZWN0KGVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoaXMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGNvcmUocGF0aCwgb3B0aW9ucyB8fCB7fSwgZnVuY3Rpb24gKGVyLCBpcykge1xuICAgIC8vIGlnbm9yZSBFQUNDRVMgYmVjYXVzZSB0aGF0IGp1c3QgbWVhbnMgd2UgYXJlbid0IGFsbG93ZWQgdG8gcnVuIGl0XG4gICAgaWYgKGVyKSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gJ0VBQ0NFUycgfHwgb3B0aW9ucyAmJiBvcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICBlciA9IG51bGxcbiAgICAgICAgaXMgPSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBjYihlciwgaXMpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmMgKHBhdGgsIG9wdGlvbnMpIHtcbiAgLy8gbXkga2luZ2RvbSBmb3IgYSBmaWx0ZXJlZCBjYXRjaFxuICB0cnkge1xuICAgIHJldHVybiBjb3JlLnN5bmMocGF0aCwgb3B0aW9ucyB8fCB7fSlcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmlnbm9yZUVycm9ycyB8fCBlci5jb2RlID09PSAnRUFDQ0VTJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVyXG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyB8fFxuICAgIHByb2Nlc3MuZW52Lk9TVFlQRSA9PT0gJ2N5Z3dpbicgfHxcbiAgICBwcm9jZXNzLmVudi5PU1RZUEUgPT09ICdtc3lzJ1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBDT0xPTiA9IGlzV2luZG93cyA/ICc7JyA6ICc6J1xuY29uc3QgaXNleGUgPSByZXF1aXJlKCdpc2V4ZScpXG5cbmNvbnN0IGdldE5vdEZvdW5kRXJyb3IgPSAoY21kKSA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgbm90IGZvdW5kOiAke2NtZH1gKSwgeyBjb2RlOiAnRU5PRU5UJyB9KVxuXG5jb25zdCBnZXRQYXRoSW5mbyA9IChjbWQsIG9wdCkgPT4ge1xuICBjb25zdCBjb2xvbiA9IG9wdC5jb2xvbiB8fCBDT0xPTlxuXG4gIC8vIElmIGl0IGhhcyBhIHNsYXNoLCB0aGVuIHdlIGRvbid0IGJvdGhlciBzZWFyY2hpbmcgdGhlIHBhdGhlbnYuXG4gIC8vIGp1c3QgY2hlY2sgdGhlIGZpbGUgaXRzZWxmLCBhbmQgdGhhdCdzIGl0LlxuICBjb25zdCBwYXRoRW52ID0gY21kLm1hdGNoKC9cXC8vKSB8fCBpc1dpbmRvd3MgJiYgY21kLm1hdGNoKC9cXFxcLykgPyBbJyddXG4gICAgOiAoXG4gICAgICBbXG4gICAgICAgIC8vIHdpbmRvd3MgYWx3YXlzIGNoZWNrcyB0aGUgY3dkIGZpcnN0XG4gICAgICAgIC4uLihpc1dpbmRvd3MgPyBbcHJvY2Vzcy5jd2QoKV0gOiBbXSksXG4gICAgICAgIC4uLihvcHQucGF0aCB8fCBwcm9jZXNzLmVudi5QQVRIIHx8XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHZlcnkgdW51c3VhbCAqLyAnJykuc3BsaXQoY29sb24pLFxuICAgICAgXVxuICAgIClcbiAgY29uc3QgcGF0aEV4dEV4ZSA9IGlzV2luZG93c1xuICAgID8gb3B0LnBhdGhFeHQgfHwgcHJvY2Vzcy5lbnYuUEFUSEVYVCB8fCAnLkVYRTsuQ01EOy5CQVQ7LkNPTSdcbiAgICA6ICcnXG4gIGNvbnN0IHBhdGhFeHQgPSBpc1dpbmRvd3MgPyBwYXRoRXh0RXhlLnNwbGl0KGNvbG9uKSA6IFsnJ11cblxuICBpZiAoaXNXaW5kb3dzKSB7XG4gICAgaWYgKGNtZC5pbmRleE9mKCcuJykgIT09IC0xICYmIHBhdGhFeHRbMF0gIT09ICcnKVxuICAgICAgcGF0aEV4dC51bnNoaWZ0KCcnKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoRW52LFxuICAgIHBhdGhFeHQsXG4gICAgcGF0aEV4dEV4ZSxcbiAgfVxufVxuXG5jb25zdCB3aGljaCA9IChjbWQsIG9wdCwgY2IpID0+IHtcbiAgaWYgKHR5cGVvZiBvcHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdFxuICAgIG9wdCA9IHt9XG4gIH1cbiAgaWYgKCFvcHQpXG4gICAgb3B0ID0ge31cblxuICBjb25zdCB7IHBhdGhFbnYsIHBhdGhFeHQsIHBhdGhFeHRFeGUgfSA9IGdldFBhdGhJbmZvKGNtZCwgb3B0KVxuICBjb25zdCBmb3VuZCA9IFtdXG5cbiAgY29uc3Qgc3RlcCA9IGkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChpID09PSBwYXRoRW52Lmxlbmd0aClcbiAgICAgIHJldHVybiBvcHQuYWxsICYmIGZvdW5kLmxlbmd0aCA/IHJlc29sdmUoZm91bmQpXG4gICAgICAgIDogcmVqZWN0KGdldE5vdEZvdW5kRXJyb3IoY21kKSlcblxuICAgIGNvbnN0IHBwUmF3ID0gcGF0aEVudltpXVxuICAgIGNvbnN0IHBhdGhQYXJ0ID0gL15cIi4qXCIkLy50ZXN0KHBwUmF3KSA/IHBwUmF3LnNsaWNlKDEsIC0xKSA6IHBwUmF3XG5cbiAgICBjb25zdCBwQ21kID0gcGF0aC5qb2luKHBhdGhQYXJ0LCBjbWQpXG4gICAgY29uc3QgcCA9ICFwYXRoUGFydCAmJiAvXlxcLltcXFxcXFwvXS8udGVzdChjbWQpID8gY21kLnNsaWNlKDAsIDIpICsgcENtZFxuICAgICAgOiBwQ21kXG5cbiAgICByZXNvbHZlKHN1YlN0ZXAocCwgaSwgMCkpXG4gIH0pXG5cbiAgY29uc3Qgc3ViU3RlcCA9IChwLCBpLCBpaSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChpaSA9PT0gcGF0aEV4dC5sZW5ndGgpXG4gICAgICByZXR1cm4gcmVzb2x2ZShzdGVwKGkgKyAxKSlcbiAgICBjb25zdCBleHQgPSBwYXRoRXh0W2lpXVxuICAgIGlzZXhlKHAgKyBleHQsIHsgcGF0aEV4dDogcGF0aEV4dEV4ZSB9LCAoZXIsIGlzKSA9PiB7XG4gICAgICBpZiAoIWVyICYmIGlzKSB7XG4gICAgICAgIGlmIChvcHQuYWxsKVxuICAgICAgICAgIGZvdW5kLnB1c2gocCArIGV4dClcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHAgKyBleHQpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZShzdWJTdGVwKHAsIGksIGlpICsgMSkpXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gY2IgPyBzdGVwKDApLnRoZW4ocmVzID0+IGNiKG51bGwsIHJlcyksIGNiKSA6IHN0ZXAoMClcbn1cblxuY29uc3Qgd2hpY2hTeW5jID0gKGNtZCwgb3B0KSA9PiB7XG4gIG9wdCA9IG9wdCB8fCB7fVxuXG4gIGNvbnN0IHsgcGF0aEVudiwgcGF0aEV4dCwgcGF0aEV4dEV4ZSB9ID0gZ2V0UGF0aEluZm8oY21kLCBvcHQpXG4gIGNvbnN0IGZvdW5kID0gW11cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhFbnYubGVuZ3RoOyBpICsrKSB7XG4gICAgY29uc3QgcHBSYXcgPSBwYXRoRW52W2ldXG4gICAgY29uc3QgcGF0aFBhcnQgPSAvXlwiLipcIiQvLnRlc3QocHBSYXcpID8gcHBSYXcuc2xpY2UoMSwgLTEpIDogcHBSYXdcblxuICAgIGNvbnN0IHBDbWQgPSBwYXRoLmpvaW4ocGF0aFBhcnQsIGNtZClcbiAgICBjb25zdCBwID0gIXBhdGhQYXJ0ICYmIC9eXFwuW1xcXFxcXC9dLy50ZXN0KGNtZCkgPyBjbWQuc2xpY2UoMCwgMikgKyBwQ21kXG4gICAgICA6IHBDbWRcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGF0aEV4dC5sZW5ndGg7IGogKyspIHtcbiAgICAgIGNvbnN0IGN1ciA9IHAgKyBwYXRoRXh0W2pdXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpcyA9IGlzZXhlLnN5bmMoY3VyLCB7IHBhdGhFeHQ6IHBhdGhFeHRFeGUgfSlcbiAgICAgICAgaWYgKGlzKSB7XG4gICAgICAgICAgaWYgKG9wdC5hbGwpXG4gICAgICAgICAgICBmb3VuZC5wdXNoKGN1cilcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gY3VyXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGV4KSB7fVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHQuYWxsICYmIGZvdW5kLmxlbmd0aClcbiAgICByZXR1cm4gZm91bmRcblxuICBpZiAob3B0Lm5vdGhyb3cpXG4gICAgcmV0dXJuIG51bGxcblxuICB0aHJvdyBnZXROb3RGb3VuZEVycm9yKGNtZClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aGljaFxud2hpY2guc3luYyA9IHdoaWNoU3luY1xuIiwgImltcG9ydCB7IGFwaVZlcnNpb24sIEFwcCwgTWFya2Rvd25WaWV3LCBNb2RhbCwgUGx1Z2luLCBTZXR0aW5nLCBUZXh0Q29tcG9uZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT3B0aW9ucywgT3B0aW9uU2V0dGluZyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBEZXNrdG9wIH0gZnJvbSAnLi9kZXNrdG9wJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2FrYVRpbWUgZXh0ZW5kcyBQbHVnaW4ge1xuICBvcHRpb25zOiBPcHRpb25zO1xuICBzdGF0dXNCYXI6IEhUTUxFbGVtZW50O1xuICBzaG93U3RhdHVzQmFyOiBib29sZWFuO1xuICBzaG93Q29kaW5nQWN0aXZpdHk6IGJvb2xlYW47XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY2llcztcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGxhc3RGZXRjaFRvZGF5ID0gMDtcbiAgZmV0Y2hUb2RheUludGVydmFsID0gNjAwMDA7XG4gIGxhc3RGaWxlOiBzdHJpbmc7XG4gIGxhc3RIZWFydGJlYXQgPSAwO1xuXG4gIGFzeW5jIG9ubG9hZCgpIHtcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIoTG9nTGV2ZWwuSU5GTyk7XG4gICAgdGhpcy5vcHRpb25zID0gbmV3IE9wdGlvbnModGhpcy5sb2dnZXIpO1xuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiAnd2FrYXRpbWUtYXBpLWtleScsXG4gICAgICBuYW1lOiAnV2FrYVRpbWUgQVBJIEtleScsXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICB0aGlzLnByb21wdEZvckFwaUtleSgpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMub3B0aW9ucy5nZXRTZXR0aW5nKCdzZXR0aW5ncycsICdkZWJ1ZycsIGZhbHNlLCAoZGVidWc6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLnNldExldmVsKGRlYnVnLnZhbHVlID09ICd0cnVlJyA/IExvZ0xldmVsLkRFQlVHIDogTG9nTGV2ZWwuSU5GTyk7XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBEZXBlbmRlbmNpZXModGhpcy5vcHRpb25zLCB0aGlzLmxvZ2dlcik7XG5cbiAgICAgIHRoaXMub3B0aW9ucy5nZXRTZXR0aW5nKCdzZXR0aW5ncycsICdkaXNhYmxlZCcsIGZhbHNlLCAoZGlzYWJsZWQ6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkLnZhbHVlID09PSAndHJ1ZSc7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplRGVwZW5kZW5jaWVzKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9udW5sb2FkKCkge31cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURlcGVuZGVuY2llcygpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgSW5pdGlhbGl6aW5nIFdha2FUaW1lIHYke3RoaXMubWFuaWZlc3QudmVyc2lvbn1gKTtcblxuICAgIHRoaXMuc3RhdHVzQmFyID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZyhcbiAgICAgICdzZXR0aW5ncycsXG4gICAgICAnc3RhdHVzX2Jhcl9lbmFibGVkJyxcbiAgICAgIGZhbHNlLFxuICAgICAgKHN0YXR1c0JhckVuYWJsZWQ6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zaG93U3RhdHVzQmFyID0gc3RhdHVzQmFyRW5hYmxlZC52YWx1ZSAhPT0gJ2ZhbHNlJztcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXNCYXJUZXh0KCdXYWthVGltZSBJbml0aWFsaXppbmcuLi4nKTtcblxuICAgICAgICB0aGlzLmNoZWNrQXBpS2V5KCk7XG5cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoXG4gICAgICAgICAgJ3NldHRpbmdzJyxcbiAgICAgICAgICAnc3RhdHVzX2Jhcl9jb2RpbmdfYWN0aXZpdHknLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIChzaG93Q29kaW5nQWN0aXZpdHk6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvZGluZ0FjdGl2aXR5ID0gc2hvd0NvZGluZ0FjdGl2aXR5LnZhbHVlICE9PSAnZmFsc2UnO1xuXG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llcy5jaGVja0FuZEluc3RhbGxDbGkoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnV2FrYVRpbWUgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXNCYXJUZXh0KCk7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVG9vbHRpcCgnV2FrYVRpbWU6IEluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0Q29kaW5nQWN0aXZpdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQXBpS2V5KCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5oYXNBcGlLZXkoKGhhc0FwaUtleSkgPT4ge1xuICAgICAgaWYgKCFoYXNBcGlLZXkpIHRoaXMucHJvbXB0Rm9yQXBpS2V5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlckRvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snLCAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm9uRXZlbnQoZmFsc2UpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJEb21FdmVudChkb2N1bWVudCwgJ2tleWRvd24nLCAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm9uRXZlbnQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkV2ZW50KGlzV3JpdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBpZiAoIXZpZXcpIHJldHVybjtcbiAgICBjb25zdCBhY3RpdmVGaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICBpZiAoIWFjdGl2ZUZpbGUpIHJldHVybjtcbiAgICBjb25zdCBjdXJzb3IgPSB2aWV3LmVkaXRvci5nZXRDdXJzb3IoKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgZmlsZSA9IGAke3RoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuYmFzZVBhdGh9LyR7YWN0aXZlRmlsZS5wYXRofWA7XG4gICAgY29uc3QgdGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoaXNXcml0ZSB8fCB0aGlzLmVub3VnaFRpbWVQYXNzZWQodGltZSkgfHwgdGhpcy5sYXN0RmlsZSAhPT0gZmlsZSkge1xuICAgICAgdGhpcy5zZW5kSGVhcnRiZWF0KGZpbGUsIHRpbWUsIGN1cnNvci5saW5lLCBjdXJzb3IuY2gsIGlzV3JpdGUpO1xuICAgICAgdGhpcy5sYXN0RmlsZSA9IGZpbGU7XG4gICAgICB0aGlzLmxhc3RIZWFydGJlYXQgPSB0aW1lO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5vdWdoVGltZVBhc3NlZCh0aW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0SGVhcnRiZWF0ICsgMTIwMDAwIDwgdGltZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzQmFyVGV4dCh0ZXh0Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YXR1c0JhcikgcmV0dXJuO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhpcy5zdGF0dXNCYXIuc2V0VGV4dCgnXHVEODNEXHVERDUyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFyLnNldFRleHQoJ1x1RDgzRFx1REQ1MiAnICsgdGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXJUb29sdGlwKHRvb2x0aXBUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFyKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXNCYXIuc2V0QXR0cigndGl0bGUnLCB0b29sdGlwVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgcHJvbXB0Rm9yQXBpS2V5KCk6IHZvaWQge1xuICAgIG5ldyBBcGlLZXlNb2RhbCh0aGlzLmFwcCwgdGhpcy5vcHRpb25zKS5vcGVuKCk7XG4gIH1cblxuICBwcml2YXRlIHNlbmRIZWFydGJlYXQoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIHRpbWU6IG51bWJlcixcbiAgICBsaW5lbm86IG51bWJlcixcbiAgICBjdXJzb3Jwb3M6IG51bWJlcixcbiAgICBpc1dyaXRlOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMuZ2V0QXBpS2V5KChhcGlLZXkpID0+IHtcbiAgICAgIGlmICghYXBpS2V5KSByZXR1cm47XG4gICAgICB0aGlzLl9zZW5kSGVhcnRiZWF0KGZpbGUsIHRpbWUsIGxpbmVubywgY3Vyc29ycG9zLCBpc1dyaXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbmRIZWFydGJlYXQoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIHRpbWU6IG51bWJlcixcbiAgICBsaW5lbm86IG51bWJlcixcbiAgICBjdXJzb3Jwb3M6IG51bWJlcixcbiAgICBpc1dyaXRlOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzLmlzQ2xpSW5zdGFsbGVkKCkpIHJldHVybjtcblxuICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBhcmdzLnB1c2goJy0tZW50aXR5JywgVXRpbHMucXVvdGUoZmlsZSkpO1xuXG4gICAgY29uc3QgdXNlcl9hZ2VudCA9ICdvYnNpZGlhbi8nICsgYXBpVmVyc2lvbiArICcgb2JzaWRpYW4td2FrYXRpbWUvJyArIHRoaXMubWFuaWZlc3QudmVyc2lvbjtcbiAgICBhcmdzLnB1c2goJy0tcGx1Z2luJywgVXRpbHMucXVvdGUodXNlcl9hZ2VudCkpO1xuXG4gICAgYXJncy5wdXNoKCctLWxpbmVubycsIFN0cmluZyhsaW5lbm8gKyAxKSk7XG4gICAgYXJncy5wdXNoKCctLWN1cnNvcnBvcycsIFN0cmluZyhjdXJzb3Jwb3MgKyAxKSk7XG5cbiAgICBpZiAoaXNXcml0ZSkgYXJncy5wdXNoKCctLXdyaXRlJyk7XG5cbiAgICBpZiAoRGVza3RvcC5pc1dpbmRvd3MoKSkge1xuICAgICAgYXJncy5wdXNoKFxuICAgICAgICAnLS1jb25maWcnLFxuICAgICAgICBVdGlscy5xdW90ZSh0aGlzLm9wdGlvbnMuZ2V0Q29uZmlnRmlsZShmYWxzZSkpLFxuICAgICAgICAnLS1sb2ctZmlsZScsXG4gICAgICAgIFV0aWxzLnF1b3RlKHRoaXMub3B0aW9ucy5nZXRMb2dGaWxlKCkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXRDbGlMb2NhdGlvbigpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBTZW5kaW5nIGhlYXJ0YmVhdDogJHtVdGlscy5mb3JtYXRBcmd1bWVudHMoYmluYXJ5LCBhcmdzKX1gKTtcbiAgICBjb25zdCBvcHRpb25zID0gRGVza3RvcC5idWlsZE9wdGlvbnMoKTtcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5leGVjRmlsZShiaW5hcnksIGFyZ3MsIG9wdGlvbnMsIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChzdGRlcnIgJiYgc3RkZXJyLnRvU3RyaW5nKCkgIT0gJycpIHRoaXMubG9nZ2VyLmVycm9yKHN0ZGVyci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHN0ZG91dCAmJiBzdGRvdXQudG9TdHJpbmcoKSAhPSAnJykgdGhpcy5sb2dnZXIuZXJyb3Ioc3Rkb3V0LnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvci50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlLCBfc2lnbmFsKSA9PiB7XG4gICAgICBpZiAoY29kZSA9PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dTdGF0dXNCYXIpIHRoaXMuZ2V0Q29kaW5nQWN0aXZpdHkoKTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxhc3QgaGVhcnRiZWF0IHNlbnQgJHtVdGlscy5mb3JtYXREYXRlKG5ldyBEYXRlKCkpfWApO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID09IDEwMiB8fCBjb2RlID09IDExMikge1xuICAgICAgICBpZiAodGhpcy5zaG93U3RhdHVzQmFyKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnNob3dDb2RpbmdBY3Rpdml0eSkgdGhpcy51cGRhdGVTdGF0dXNCYXJUZXh0KCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXNCYXJUb29sdGlwKFxuICAgICAgICAgICAgJ1dha2FUaW1lOiB3b3JraW5nIG9mZmxpbmUuLi4gY29kaW5nIGFjdGl2aXR5IHdpbGwgc3luYyBuZXh0IHRpbWUgd2UgYXJlIG9ubGluZScsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBXb3JraW5nIG9mZmxpbmUgKCR7Y29kZX0pOyBDaGVjayB5b3VyICR7dGhpcy5vcHRpb25zLmdldExvZ0ZpbGUoKX0gZmlsZSBmb3IgbW9yZSBkZXRhaWxzYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAxMDMpIHtcbiAgICAgICAgY29uc3QgZXJyb3JfbXNnID0gYENvbmZpZyBwYXJzaW5nIGVycm9yICgxMDMpOyBDaGVjayB5b3VyICR7dGhpcy5vcHRpb25zLmdldExvZ0ZpbGUoKX0gZmlsZSBmb3IgbW9yZSBkZXRhaWxzYDtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1N0YXR1c0Jhcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgnV2FrYVRpbWUgRXJyb3InKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRvb2x0aXAoYFdha2FUaW1lOiAke2Vycm9yX21zZ31gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcl9tc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID09IDEwNCkge1xuICAgICAgICBjb25zdCBlcnJvcl9tc2cgPSAnSW52YWxpZCBBcGkgS2V5ICgxMDQpOyBNYWtlIHN1cmUgeW91ciBBcGkgS2V5IGlzIGNvcnJlY3QhJztcbiAgICAgICAgaWYgKHRoaXMuc2hvd1N0YXR1c0Jhcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgnV2FrYVRpbWUgRXJyb3InKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRvb2x0aXAoYFdha2FUaW1lOiAke2Vycm9yX21zZ31gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcl9tc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JfbXNnID0gYFVua25vd24gRXJyb3IgKCR7Y29kZX0pOyBDaGVjayB5b3VyICR7dGhpcy5vcHRpb25zLmdldExvZ0ZpbGUoKX0gZmlsZSBmb3IgbW9yZSBkZXRhaWxzYDtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1N0YXR1c0Jhcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgnV2FrYVRpbWUgRXJyb3InKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRvb2x0aXAoYFdha2FUaW1lOiAke2Vycm9yX21zZ31gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcl9tc2cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2RpbmdBY3Rpdml0eSgpIHtcbiAgICBpZiAoIXRoaXMuc2hvd1N0YXR1c0Jhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHByZXZlbnQgdXBkYXRpbmcgaWYgd2UgaGF2ZW4ndCBjb2RlZCBzaW5jZSBsYXN0IGNoZWNrZWRcbiAgICBpZiAodGhpcy5sYXN0RmV0Y2hUb2RheSA+IDAgJiYgdGhpcy5sYXN0RmV0Y2hUb2RheSA+IHRoaXMubGFzdEhlYXJ0YmVhdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIHRoaXMuZmV0Y2hUb2RheUludGVydmFsO1xuICAgIGlmICh0aGlzLmxhc3RGZXRjaFRvZGF5ID4gY3V0b2ZmKSByZXR1cm47XG5cbiAgICB0aGlzLmxhc3RGZXRjaFRvZGF5ID0gRGF0ZS5ub3coKTtcblxuICAgIHRoaXMub3B0aW9ucy5nZXRBcGlLZXkoKGFwaUtleSkgPT4ge1xuICAgICAgaWYgKCFhcGlLZXkpIHJldHVybjtcbiAgICAgIHRoaXMuX2dldENvZGluZ0FjdGl2aXR5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb2RpbmdBY3Rpdml0eSgpIHtcbiAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzLmlzQ2xpSW5zdGFsbGVkKCkpIHJldHVybjtcblxuICAgIGNvbnN0IHVzZXJfYWdlbnQgPSAnb2JzaWRpYW4vJyArIGFwaVZlcnNpb24gKyAnIG9ic2lkaWFuLXdha2F0aW1lLycgKyB0aGlzLm1hbmlmZXN0LnZlcnNpb247XG4gICAgY29uc3QgYXJncyA9IFsnLS10b2RheScsICctLXBsdWdpbicsIFV0aWxzLnF1b3RlKHVzZXJfYWdlbnQpXTtcblxuICAgIGlmIChEZXNrdG9wLmlzV2luZG93cygpKSB7XG4gICAgICBhcmdzLnB1c2goXG4gICAgICAgICctLWNvbmZpZycsXG4gICAgICAgIFV0aWxzLnF1b3RlKHRoaXMub3B0aW9ucy5nZXRDb25maWdGaWxlKGZhbHNlKSksXG4gICAgICAgICctLWxvZ2ZpbGUnLFxuICAgICAgICBVdGlscy5xdW90ZSh0aGlzLm9wdGlvbnMuZ2V0TG9nRmlsZSgpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmluYXJ5ID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0Q2xpTG9jYXRpb24oKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBGZXRjaGluZyBjb2RpbmcgYWN0aXZpdHkgZm9yIFRvZGF5IGZyb20gYXBpOiAke1V0aWxzLmZvcm1hdEFyZ3VtZW50cyhiaW5hcnksIGFyZ3MpfWAsXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25zID0gRGVza3RvcC5idWlsZE9wdGlvbnMoKTtcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5leGVjRmlsZShiaW5hcnksIGFyZ3MsIG9wdGlvbnMsIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChzdGRlcnIgJiYgc3RkZXJyLnRvU3RyaW5nKCkgIT0gJycpIHRoaXMubG9nZ2VyLmVycm9yKHN0ZGVyci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHN0ZG91dCAmJiBzdGRvdXQudG9TdHJpbmcoKSAhPSAnJykgdGhpcy5sb2dnZXIuZXJyb3Ioc3Rkb3V0LnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvci50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgaWYgKHByb2Muc3Rkb3V0KSB7XG4gICAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmIChkYXRhKSBvdXRwdXQgKz0gZGF0YTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlLCBfc2lnbmFsKSA9PiB7XG4gICAgICBpZiAoY29kZSA9PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dTdGF0dXNCYXIpIHtcbiAgICAgICAgICBpZiAob3V0cHV0ICYmIG91dHB1dC50cmltKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dDb2RpbmdBY3Rpdml0eSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRleHQob3V0cHV0LnRyaW0oKSk7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVG9vbHRpcCgnV2FrYVRpbWU6IFRvZGF5XHUyMDE5cyBjb2RpbmcgdGltZS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgpO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRvb2x0aXAob3V0cHV0LnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXNCYXJUb29sdGlwKCdXYWthVGltZTogQ2FsY3VsYXRpbmcgdGltZSBzcGVudCB0b2RheSBpbiBiYWNrZ3JvdW5kLi4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMTAyIHx8IGNvZGUgPT0gMTEyKSB7XG4gICAgICAgIC8vIG5vb3AsIHdvcmtpbmcgb2ZmbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JfbXNnID0gYEVycm9yIGZldGNoaW5nIHRvZGF5IGNvZGluZyBhY3Rpdml0eSAoJHtjb2RlfSk7IENoZWNrIHlvdXIgJHt0aGlzLm9wdGlvbnMuZ2V0TG9nRmlsZSgpfSBmaWxlIGZvciBtb3JlIGRldGFpbHNgO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhlcnJvcl9tc2cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIEFwaUtleU1vZGFsIGV4dGVuZHMgTW9kYWwge1xuICBvcHRpb25zOiBPcHRpb25zO1xuICBpbnB1dDogVGV4dENvbXBvbmVudDtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFwaUtleU1vZGFsO1xuXG4gIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgaWYgKEFwaUtleU1vZGFsLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gQXBpS2V5TW9kYWwuaW5zdGFuY2U7XG4gICAgfVxuICAgIHN1cGVyKGFwcCk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICBBcGlLZXlNb2RhbC5pbnN0YW5jZSA9IHRoaXM7XG4gIH1cblxuICBvbk9wZW4oKSB7XG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cbiAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZygnc2V0dGluZ3MnLCAnYXBpX2tleScsIGZhbHNlLCAoc2V0dGluZzogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgbGV0IGRlZmF1bHRWYWwgPSBzZXR0aW5nLnZhbHVlO1xuICAgICAgaWYgKFV0aWxzLmFwaUtleUludmFsaWQoZGVmYXVsdFZhbCkpIGRlZmF1bHRWYWwgPSAnJztcblxuICAgICAgY29udGVudEVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0VudGVyIHlvdXIgV2FrYVRpbWUgQVBJIEtleScgfSk7XG5cbiAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbCkuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICB0ZXh0LnNldFZhbHVlKGRlZmF1bHRWYWwpO1xuICAgICAgICB0ZXh0LmlucHV0RWwuYWRkQ2xhc3MoJ2FwaS1rZXktaW5wdXQnKTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IHRleHQ7XG4gICAgICB9KTtcblxuICAgICAgbmV3IFNldHRpbmcoY29udGVudEVsKS5hZGRCdXR0b24oKGJ0bikgPT5cbiAgICAgICAgYnRuXG4gICAgICAgICAgLnNldEJ1dHRvblRleHQoJ1NhdmUnKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuaW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGludmFsaWQgPSBVdGlscy5hcGlLZXlJbnZhbGlkKHZhbCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpbnZhbGlkKTtcbiAgICAgICAgICAgIGlmICghaW52YWxpZCkge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXRTZXR0aW5nKCdzZXR0aW5ncycsICdhcGlfa2V5JywgdmFsLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgb25DbG9zZSgpIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICBjb250ZW50RWwuZW1wdHkoKTtcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5cbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgRGVza3RvcCB9IGZyb20gJy4vZGVza3RvcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uU2V0dGluZyB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlcnJvcj86IEVycm9yO1xufVxuXG50eXBlIEZvdW5kT3B0aW9uID0ge1xuICBba2V5OiBzdHJpbmddOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wdGlvbnMge1xuICBwcml2YXRlIGNvbmZpZ0ZpbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBpbnRlcm5hbENvbmZpZ0ZpbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBsb2dGaWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgY2FjaGU6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgY29uc3Qgd2FrYUhvbWUgPSBEZXNrdG9wLmdldEhvbWVEaXJlY3RvcnkoKTtcbiAgICB0aGlzLmNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4od2FrYUhvbWUsICcud2FrYXRpbWUuY2ZnJyk7XG4gICAgdGhpcy5pbnRlcm5hbENvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4od2FrYUhvbWUsICcud2FrYXRpbWUtaW50ZXJuYWwuY2ZnJyk7XG4gICAgdGhpcy5sb2dGaWxlID0gcGF0aC5qb2luKHdha2FIb21lLCAnLndha2F0aW1lLmxvZycpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNldHRpbmdBc3luYyhzZWN0aW9uOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5nZXRTZXR0aW5nKHNlY3Rpb24sIGtleSwgZmFsc2UsIChzZXR0aW5nKSA9PiB7XG4gICAgICAgIHNldHRpbmcuZXJyb3IgPyByZWplY3Qoc2V0dGluZy5lcnJvcikgOiByZXNvbHZlKHNldHRpbmcudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZyhcbiAgICBzZWN0aW9uOiBzdHJpbmcsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaW50ZXJuYWw6IGJvb2xlYW4sXG4gICAgY2FsbGJhY2s6IChfOiBPcHRpb25TZXR0aW5nKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBmcy5yZWFkRmlsZShcbiAgICAgIHRoaXMuZ2V0Q29uZmlnRmlsZShpbnRlcm5hbCksXG4gICAgICAndXRmLTgnLFxuICAgICAgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgbnVsbCwgY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKGBjb3VsZCBub3QgcmVhZCAke3RoaXMuZ2V0Q29uZmlnRmlsZShpbnRlcm5hbCl9YCksXG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgY3VycmVudFNlY3Rpb24gPSAnJztcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0c1dpdGgobGluZS50cmltKCksICdbJykgJiYgdGhpcy5lbmRzV2l0aChsaW5lLnRyaW0oKSwgJ10nKSkge1xuICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbiA9IGxpbmVcbiAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgLnN1YnN0cmluZygxLCBsaW5lLnRyaW0oKS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50U2VjdGlvbiA9PT0gc2VjdGlvbikge1xuICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhcnRzWzBdLnRyaW0oKTtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRLZXkgPT09IGtleSAmJiBwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soeyBrZXk6IGtleSwgdmFsdWU6IHRoaXMucmVtb3ZlTnVsbHMocGFydHNbMV0udHJpbSgpKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2soeyBrZXk6IGtleSwgdmFsdWU6ICcnIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0U2V0dGluZyhzZWN0aW9uOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWw6IHN0cmluZywgaW50ZXJuYWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gdGhpcy5nZXRDb25maWdGaWxlKGludGVybmFsKTtcbiAgICBmcy5yZWFkRmlsZShjb25maWdGaWxlLCAndXRmLTgnLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24gfCBudWxsLCBjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIGlnbm9yZSBlcnJvcnMgYmVjYXVzZSBjb25maWcgZmlsZSBtaWdodCBub3QgZXhpc3QgeWV0XG4gICAgICBpZiAoZXJyKSBjb250ZW50ID0gJyc7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uID0gJyc7XG5cbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAodGhpcy5zdGFydHNXaXRoKGxpbmUudHJpbSgpLCAnWycpICYmIHRoaXMuZW5kc1dpdGgobGluZS50cmltKCksICddJykpIHtcbiAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24gPT09IHNlY3Rpb24gJiYgIWZvdW5kKSB7XG4gICAgICAgICAgICBjb250ZW50cy5wdXNoKHRoaXMucmVtb3ZlTnVsbHMoa2V5ICsgJyA9ICcgKyB2YWwpKTtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFNlY3Rpb24gPSBsaW5lXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAuc3Vic3RyaW5nKDEsIGxpbmUudHJpbSgpLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBjb250ZW50cy5wdXNoKHRoaXMucmVtb3ZlTnVsbHMobGluZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTZWN0aW9uID09PSBzZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhcnRzWzBdLnRyaW0oKTtcbiAgICAgICAgICBpZiAoY3VycmVudEtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhrZXkgKyAnID0gJyArIHZhbCkpO1xuICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhsaW5lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhsaW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24gIT09IHNlY3Rpb24pIHtcbiAgICAgICAgICBjb250ZW50cy5wdXNoKCdbJyArIHNlY3Rpb24gKyAnXScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhrZXkgKyAnID0gJyArIHZhbCkpO1xuICAgICAgfVxuXG4gICAgICBmcy53cml0ZUZpbGUoY29uZmlnRmlsZSBhcyBzdHJpbmcsIGNvbnRlbnRzLmpvaW4oJ1xcbicpLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldFNldHRpbmdzKHNlY3Rpb246IHN0cmluZywgc2V0dGluZ3M6IE9wdGlvblNldHRpbmdbXSwgaW50ZXJuYWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gdGhpcy5nZXRDb25maWdGaWxlKGludGVybmFsKTtcbiAgICBmcy5yZWFkRmlsZShjb25maWdGaWxlLCAndXRmLTgnLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24gfCBudWxsLCBjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIGlnbm9yZSBlcnJvcnMgYmVjYXVzZSBjb25maWcgZmlsZSBtaWdodCBub3QgZXhpc3QgeWV0XG4gICAgICBpZiAoZXJyKSBjb250ZW50ID0gJyc7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uID0gJyc7XG5cbiAgICAgIGNvbnN0IGZvdW5kOiBGb3VuZE9wdGlvbiA9IHt9O1xuICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAodGhpcy5zdGFydHNXaXRoKGxpbmUudHJpbSgpLCAnWycpICYmIHRoaXMuZW5kc1dpdGgobGluZS50cmltKCksICddJykpIHtcbiAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24gPT09IHNlY3Rpb24pIHtcbiAgICAgICAgICAgIHNldHRpbmdzLmZvckVhY2goKHNldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFmb3VuZFtzZXR0aW5nLmtleV0pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50cy5wdXNoKHRoaXMucmVtb3ZlTnVsbHMoc2V0dGluZy5rZXkgKyAnID0gJyArIHNldHRpbmcudmFsdWUpKTtcbiAgICAgICAgICAgICAgICBmb3VuZFtzZXR0aW5nLmtleV0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFNlY3Rpb24gPSBsaW5lXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAuc3Vic3RyaW5nKDEsIGxpbmUudHJpbSgpLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBjb250ZW50cy5wdXNoKHRoaXMucmVtb3ZlTnVsbHMobGluZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTZWN0aW9uID09PSBzZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhcnRzWzBdLnRyaW0oKTtcbiAgICAgICAgICBsZXQga2VlcExpbmVVbmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHRpbmdzLmZvckVhY2goKHNldHRpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50S2V5ID09PSBzZXR0aW5nLmtleSkge1xuICAgICAgICAgICAgICBrZWVwTGluZVVuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoIWZvdW5kW3NldHRpbmcua2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhzZXR0aW5nLmtleSArICcgPSAnICsgc2V0dGluZy52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIGZvdW5kW3NldHRpbmcua2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoa2VlcExpbmVVbmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhsaW5lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhsaW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0dGluZ3MuZm9yRWFjaCgoc2V0dGluZykgPT4ge1xuICAgICAgICBpZiAoIWZvdW5kW3NldHRpbmcua2V5XSkge1xuICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbiAhPT0gc2VjdGlvbikge1xuICAgICAgICAgICAgY29udGVudHMucHVzaCgnWycgKyBzZWN0aW9uICsgJ10nKTtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uID0gc2VjdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGVudHMucHVzaCh0aGlzLnJlbW92ZU51bGxzKHNldHRpbmcua2V5ICsgJyA9ICcgKyBzZXR0aW5nLnZhbHVlKSk7XG4gICAgICAgICAgZm91bmRbc2V0dGluZy5rZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZShjb25maWdGaWxlIGFzIHN0cmluZywgY29udGVudHMuam9pbignXFxuJyksIChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikgdGhyb3cgZXJyO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uZmlnRmlsZShpbnRlcm5hbDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGludGVybmFsID8gdGhpcy5pbnRlcm5hbENvbmZpZ0ZpbGUgOiB0aGlzLmNvbmZpZ0ZpbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9nRmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvZ0ZpbGU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXBpS2V5QXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIVV0aWxzLmFwaUtleUludmFsaWQodGhpcy5jYWNoZS5hcGlfa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuYXBpX2tleTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBpS2V5RnJvbVZhdWx0ID0gYXdhaXQgdGhpcy5nZXRBcGlLZXlGcm9tVmF1bHRDbWQoKTtcbiAgICAgIGlmICghVXRpbHMuYXBpS2V5SW52YWxpZChhcGlLZXlGcm9tVmF1bHQpKSB7XG4gICAgICAgIHRoaXMuY2FjaGUuYXBpX2tleSA9IGFwaUtleUZyb21WYXVsdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuYXBpX2tleTtcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH0gY2F0Y2ggKGVycikge31cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcGlLZXkgPSBhd2FpdCB0aGlzLmdldFNldHRpbmdBc3luYygnc2V0dGluZ3MnLCAnYXBpX2tleScpO1xuICAgICAgaWYgKCFVdGlscy5hcGlLZXlJbnZhbGlkKGFwaUtleSkpIHRoaXMuY2FjaGUuYXBpX2tleSA9IGFwaUtleTtcbiAgICAgIHJldHVybiBhcGlLZXk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgQVBJIEtleSBmcm9tIGNvbmZpZyBmaWxlOiAke2Vycn1gKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXBpS2V5RnJvbVZhdWx0Q21kKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFwaUtleUNtZCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZ0FzeW5jKCdzZXR0aW5ncycsICdhcGlfa2V5X3ZhdWx0X2NtZCcpO1xuICAgICAgaWYgKCFhcGlLZXlDbWQpIHJldHVybiAnJztcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IERlc2t0b3AuYnVpbGRPcHRpb25zKCk7XG4gICAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bihhcGlLZXlDbWQsIG9wdGlvbnMpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHByb2Muc3Rkb3V0KSB7XG4gICAgICAgIHN0ZG91dCArPSBjaHVuaztcbiAgICAgIH1cbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcHJvYy5zdGRlcnIpIHtcbiAgICAgICAgc3RkZXJyICs9IGNodW5rO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBwcm9jLm9uKCdjbG9zZScsIHJlc29sdmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChleGl0Q29kZSkgdGhpcy5sb2dnZXIud2FybihgYXBpIGtleSB2YXVsdCBjb21tYW5kIGVycm9yICgke2V4aXRDb2RlfSk6ICR7c3RkZXJyfWApO1xuICAgICAgZWxzZSBpZiAoc3RkZXJyICYmIHN0ZGVyci50cmltKCkpIHRoaXMubG9nZ2VyLndhcm4oc3RkZXJyLnRyaW0oKSk7XG5cbiAgICAgIGNvbnN0IGFwaUtleSA9IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgIHJldHVybiBhcGlLZXk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgQVBJIEtleSBWYXVsdCBDbWQgZnJvbSBjb25maWcgZmlsZTogJHtlcnJ9YCk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEFwaUtleShjYWxsYmFjazogKGFwaUtleTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0QXBpS2V5QXN5bmMoKVxuICAgICAgLnRoZW4oKGFwaUtleSkgPT4ge1xuICAgICAgICBpZiAoIVV0aWxzLmFwaUtleUludmFsaWQoYXBpS2V5KSkge1xuICAgICAgICAgIGNhbGxiYWNrKGFwaUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbmFibGUgdG8gZ2V0IGFwaSBrZXk6ICR7ZXJyfWApO1xuICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhc0FwaUtleShjYWxsYmFjazogKHZhbGlkOiBib29sZWFuKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5nZXRBcGlLZXlBc3luYygpXG4gICAgICAudGhlbigoYXBpS2V5KSA9PiBjYWxsYmFjayghVXRpbHMuYXBpS2V5SW52YWxpZChhcGlLZXkpKSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuYWJsZSB0byBjaGVjayBmb3IgYXBpIGtleTogJHtlcnJ9YCk7XG4gICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydHNXaXRoKG91dGVyOiBzdHJpbmcsIGlubmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb3V0ZXIuc2xpY2UoMCwgaW5uZXIubGVuZ3RoKSA9PT0gaW5uZXI7XG4gIH1cblxuICBwcml2YXRlIGVuZHNXaXRoKG91dGVyOiBzdHJpbmcsIGlubmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5uZXIgPT09ICcnIHx8IG91dGVyLnNsaWNlKC1pbm5lci5sZW5ndGgpID09PSBpbm5lcjtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTnVsbHMoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9cXDAvZywgJycpO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFV0aWxzIHtcbiAgcHVibGljIHN0YXRpYyBxdW90ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0ci5pbmNsdWRlcygnICcpKSByZXR1cm4gYFwiJHtzdHIucmVwbGFjZSgnXCInLCAnXFxcXFwiJyl9XCJgO1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFwaUtleUludmFsaWQoa2V5Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBlcnIgPSAnSW52YWxpZCBhcGkga2V5Li4uIGNoZWNrIGh0dHBzOi8vd2FrYXRpbWUuY29tL3NldHRpbmdzIGZvciB5b3VyIGtleSc7XG4gICAgaWYgKCFrZXkpIHJldHVybiBlcnI7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKFxuICAgICAgJ14od2FrYV8pP1swLTlBLUZdezh9LVswLTlBLUZdezR9LTRbMC05QS1GXXszfS1bODlBQl1bMC05QS1GXXszfS1bMC05QS1GXXsxMn0kJyxcbiAgICAgICdpJyxcbiAgICApO1xuICAgIGlmICghcmUudGVzdChrZXkpKSByZXR1cm4gZXJyO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVQcm94eShwcm94eTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXByb3h5KSByZXR1cm4gJyc7XG4gICAgbGV0IHJlO1xuICAgIGlmIChwcm94eS5pbmRleE9mKCdcXFxcJykgPT09IC0xKSB7XG4gICAgICByZSA9IG5ldyBSZWdFeHAoJ14oKGh0dHBzP3xzb2NrczUpOi8vKT8oW146QF0rKDooW146QF0pKyk/QCk/W1xcXFx3XFxcXC4tXSsoOlxcXFxkKyk/JCcsICdpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlID0gbmV3IFJlZ0V4cCgnXi4qXFxcXFxcXFwuKyQnLCAnaScpO1xuICAgIH1cbiAgICBpZiAoIXJlLnRlc3QocHJveHkpKVxuICAgICAgcmV0dXJuICdJbnZhbGlkIHByb3h5LiBWYWxpZCBmb3JtYXRzIGFyZSBodHRwczovL3VzZXI6cGFzc0Bob3N0OnBvcnQgb3Igc29ja3M1Oi8vdXNlcjpwYXNzQGhvc3Q6cG9ydCBvciBkb21haW5cXFxcdXNlcjpwYXNzJztcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhzID0gW1xuICAgICAgJ0phbicsXG4gICAgICAnRmViJyxcbiAgICAgICdNYXInLFxuICAgICAgJ0FwcicsXG4gICAgICAnTWF5JyxcbiAgICAgICdKdW4nLFxuICAgICAgJ0p1bCcsXG4gICAgICAnQXVnJyxcbiAgICAgICdTZXAnLFxuICAgICAgJ09jdCcsXG4gICAgICAnTm92JyxcbiAgICAgICdEZWMnLFxuICAgIF07XG4gICAgbGV0IGFtcG0gPSAnQU0nO1xuICAgIGxldCBob3VyID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGlmIChob3VyID4gMTEpIHtcbiAgICAgIGFtcG0gPSAnUE0nO1xuICAgICAgaG91ciA9IGhvdXIgLSAxMjtcbiAgICB9XG4gICAgaWYgKGhvdXIgPT0gMCkge1xuICAgICAgaG91ciA9IDEyO1xuICAgIH1cbiAgICBjb25zdCBtaW51dGUgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICByZXR1cm4gYCR7bW9udGhzW2RhdGUuZ2V0TW9udGgoKV19ICR7ZGF0ZS5nZXREYXRlKCl9LCAke2RhdGUuZ2V0RnVsbFllYXIoKX0gJHtob3VyfToke1xuICAgICAgbWludXRlIDwgMTAgPyBgMCR7bWludXRlfWAgOiBtaW51dGVcbiAgICB9ICR7YW1wbX1gO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBvYmZ1c2NhdGVLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBuZXdLZXkgPSAnJztcbiAgICBpZiAoa2V5KSB7XG4gICAgICBuZXdLZXkgPSBrZXk7XG4gICAgICBpZiAoa2V5Lmxlbmd0aCA+IDQpXG4gICAgICAgIG5ld0tleSA9ICdYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWCcgKyBrZXkuc3Vic3RyaW5nKGtleS5sZW5ndGggLSA0KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0tleTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgd3JhcEFyZyhhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGFyZy5pbmRleE9mKCcgJykgPiAtMSkgcmV0dXJuICdcIicgKyBhcmcucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiJztcbiAgICByZXR1cm4gYXJnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmb3JtYXRBcmd1bWVudHMoYmluYXJ5OiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbG9uZSA9IGFyZ3Muc2xpY2UoMCk7XG4gICAgY2xvbmUudW5zaGlmdCh0aGlzLndyYXBBcmcoYmluYXJ5KSk7XG4gICAgY29uc3QgbmV3Q21kczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbGFzdENtZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsYXN0Q21kID09ICctLWtleScpIG5ld0NtZHMucHVzaCh0aGlzLndyYXBBcmcodGhpcy5vYmZ1c2NhdGVLZXkoY2xvbmVbaV0pKSk7XG4gICAgICBlbHNlIG5ld0NtZHMucHVzaCh0aGlzLndyYXBBcmcoY2xvbmVbaV0pKTtcbiAgICAgIGxhc3RDbWQgPSBjbG9uZVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0NtZHMuam9pbignICcpO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuXG5pbnRlcmZhY2UgT3B0aW9uIHtcbiAgd2luZG93c0hpZGU6IGJvb2xlYW47XG4gIGVudj86IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIERlc2t0b3Age1xuICBwdWJsaWMgc3RhdGljIGlzV2luZG93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb3MucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SG9tZURpcmVjdG9yeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhvbWUgPSBwcm9jZXNzLmVudi5XQUtBVElNRV9IT01FO1xuICAgIGlmIChob21lICYmIGhvbWUudHJpbSgpICYmIGZzLmV4aXN0c1N5bmMoaG9tZS50cmltKCkpKSByZXR1cm4gaG9tZS50cmltKCk7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W3RoaXMuaXNXaW5kb3dzKCkgPyAnVVNFUlBST0ZJTEUnIDogJ0hPTUUnXSB8fCBwcm9jZXNzLmN3ZCgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBidWlsZE9wdGlvbnMoKTogYW55IHtcbiAgICBjb25zdCBvcHRpb25zOiBPcHRpb24gPSB7XG4gICAgICB3aW5kb3dzSGlkZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmICghdGhpcy5pc1dpbmRvd3MoKSAmJiAhcHJvY2Vzcy5lbnYuV0FLQVRJTUVfSE9NRSAmJiAhcHJvY2Vzcy5lbnYuSE9NRSkge1xuICAgICAgb3B0aW9uc1snZW52J10gPSB7IC4uLnByb2Nlc3MuZW52LCBXQUtBVElNRV9IT01FOiB0aGlzLmdldEhvbWVEaXJlY3RvcnkoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxufVxuIiwgImV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgREVCVUcgPSAwLFxuICBJTkZPLFxuICBXQVJOLFxuICBFUlJPUixcbn1cbiIsICJpbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIHByaXZhdGUgbGV2ZWw6IExvZ0xldmVsO1xuXG4gIGNvbnN0cnVjdG9yKGxldmVsOiBMb2dMZXZlbCkge1xuICAgIHRoaXMuc2V0TGV2ZWwobGV2ZWwpO1xuICB9XG5cbiAgcHVibGljIGdldExldmVsKCk6IExvZ0xldmVsIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRMZXZlbChsZXZlbDogTG9nTGV2ZWwpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICBwdWJsaWMgbG9nKGxldmVsOiBMb2dMZXZlbCwgbXNnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobGV2ZWwgPj0gdGhpcy5sZXZlbCkge1xuICAgICAgbXNnID0gYFtXYWthVGltZV1bJHtMb2dMZXZlbFtsZXZlbF19XSAke21zZ31gO1xuICAgICAgaWYgKGxldmVsID09IExvZ0xldmVsLkRFQlVHKSBjb25zb2xlLmxvZyhtc2cpO1xuICAgICAgaWYgKGxldmVsID09IExvZ0xldmVsLklORk8pIGNvbnNvbGUuaW5mbyhtc2cpO1xuICAgICAgaWYgKGxldmVsID09IExvZ0xldmVsLldBUk4pIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgaWYgKGxldmVsID09IExvZ0xldmVsLkVSUk9SKSBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlYnVnKG1zZzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuREVCVUcsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgaW5mbyhtc2c6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLklORk8sIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgd2Fybihtc2c6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLldBUk4sIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgd2FybkV4Y2VwdGlvbihtc2c6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoKG1zZyBhcyBFcnJvcikubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZyhMb2dMZXZlbC5XQVJOLCAobXNnIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZXJyb3IobXNnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5FUlJPUiwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBlcnJvckV4Y2VwdGlvbihtc2c6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoKG1zZyBhcyBFcnJvcikubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZyhMb2dMZXZlbC5FUlJPUiwgKG1zZyBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IEFkbVppcCBmcm9tICdhZG0temlwJztcbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgcmVxdWVzdCBmcm9tICdyZXF1ZXN0JztcbmltcG9ydCAqIGFzIHdoaWNoIGZyb20gJ3doaWNoJztcblxuaW1wb3J0IHsgT3B0aW9ucywgT3B0aW9uU2V0dGluZyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBEZXNrdG9wIH0gZnJvbSAnLi9kZXNrdG9wJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIERlcGVuZGVuY2llcyB7XG4gIHByaXZhdGUgb3B0aW9uczogT3B0aW9ucztcbiAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlcjtcbiAgcHJpdmF0ZSByZXNvdXJjZXNMb2NhdGlvbj86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjbGlMb2NhdGlvbj86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjbGlMb2NhdGlvbkdsb2JhbD86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjbGlJbnN0YWxsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnaXRodWJEb3dubG9hZFByZWZpeCA9ICdodHRwczovL2dpdGh1Yi5jb20vd2FrYXRpbWUvd2FrYXRpbWUtY2xpL3JlbGVhc2VzL2Rvd25sb2FkJztcbiAgcHJpdmF0ZSBnaXRodWJSZWxlYXNlc1N0YWJsZVVybCA9XG4gICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvd2FrYXRpbWUvd2FrYXRpbWUtY2xpL3JlbGVhc2VzL2xhdGVzdCc7XG4gIHByaXZhdGUgZ2l0aHViUmVsZWFzZXNBbHBoYVVybCA9XG4gICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvd2FrYXRpbWUvd2FrYXRpbWUtY2xpL3JlbGVhc2VzP3Blcl9wYWdlPTEnO1xuICBwcml2YXRlIGxhdGVzdENsaVZlcnNpb24gPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zLCBsb2dnZXI6IExvZ2dlcikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gIH1cblxuICBwcml2YXRlIGdldFJlc291cmNlc0xvY2F0aW9uKCkge1xuICAgIGlmICh0aGlzLnJlc291cmNlc0xvY2F0aW9uKSByZXR1cm4gdGhpcy5yZXNvdXJjZXNMb2NhdGlvbjtcblxuICAgIGNvbnN0IGZvbGRlciA9IHBhdGguam9pbihEZXNrdG9wLmdldEhvbWVEaXJlY3RvcnkoKSwgJy53YWthdGltZScpO1xuICAgIHRyeSB7XG4gICAgICBmcy5ta2RpclN5bmMoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHRoaXMucmVzb3VyY2VzTG9jYXRpb24gPSBmb2xkZXI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5yZXNvdXJjZXNMb2NhdGlvbiA9IFwiLi8ud2FrYXRpbWVcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzTG9jYXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xpTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jbGlMb2NhdGlvbikgcmV0dXJuIHRoaXMuY2xpTG9jYXRpb247XG5cbiAgICB0aGlzLmNsaUxvY2F0aW9uID0gdGhpcy5nZXRDbGlMb2NhdGlvbkdsb2JhbCgpO1xuICAgIGlmICh0aGlzLmNsaUxvY2F0aW9uKSByZXR1cm4gdGhpcy5jbGlMb2NhdGlvbjtcblxuICAgIGNvbnN0IGV4dCA9IERlc2t0b3AuaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJztcbiAgICBsZXQgb3NuYW1lID0gb3MucGxhdGZvcm0oKSBhcyBzdHJpbmc7XG4gICAgaWYgKG9zbmFtZSA9PSAnd2luMzInKSBvc25hbWUgPSAnd2luZG93cyc7XG4gICAgY29uc3QgYXJjaCA9IHRoaXMuYXJjaGl0ZWN0dXJlKCk7XG4gICAgdGhpcy5jbGlMb2NhdGlvbiA9IHBhdGguam9pbihcbiAgICAgIHRoaXMuZ2V0UmVzb3VyY2VzTG9jYXRpb24oKSxcbiAgICAgIGB3YWthdGltZS1jbGktJHtvc25hbWV9LSR7YXJjaH0ke2V4dH1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5jbGlMb2NhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbGlMb2NhdGlvbkdsb2JhbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmNsaUxvY2F0aW9uR2xvYmFsKSByZXR1cm4gdGhpcy5jbGlMb2NhdGlvbkdsb2JhbDtcblxuICAgIGNvbnN0IGJpbmFyeU5hbWUgPSBgd2FrYXRpbWUtY2xpJHtEZXNrdG9wLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgICBjb25zdCBwYXRoID0gd2hpY2guc3luYyhiaW5hcnlOYW1lLCB7IG5vdGhyb3c6IHRydWUgfSk7XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHRoaXMuY2xpTG9jYXRpb25HbG9iYWwgPSBwYXRoO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFVzaW5nIGdsb2JhbCB3YWthdGltZS1jbGkgbG9jYXRpb246ICR7cGF0aH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbGlMb2NhdGlvbkdsb2JhbDtcbiAgfVxuXG4gIHB1YmxpYyBpc0NsaUluc3RhbGxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jbGlJbnN0YWxsZWQpIHJldHVybiB0cnVlO1xuICAgIHRoaXMuY2xpSW5zdGFsbGVkID0gZnMuZXhpc3RzU3luYyh0aGlzLmdldENsaUxvY2F0aW9uKCkpO1xuICAgIHJldHVybiB0aGlzLmNsaUluc3RhbGxlZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0FuZEluc3RhbGxDbGkoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDbGlJbnN0YWxsZWQoKSkge1xuICAgICAgdGhpcy5pbnN0YWxsQ2xpKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0NsaUxhdGVzdCgoaXNMYXRlc3QpID0+IHtcbiAgICAgICAgaWYgKCFpc0xhdGVzdCkge1xuICAgICAgICAgIHRoaXMuaW5zdGFsbENsaShjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0NsaUxhdGVzdChjYWxsYmFjazogKGFyZzA6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRDbGlMb2NhdGlvbkdsb2JhbCgpKSB7XG4gICAgICBjYWxsYmFjayh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhcmdzID0gWyctLXZlcnNpb24nXTtcbiAgICBjb25zdCBvcHRpb25zID0gRGVza3RvcC5idWlsZE9wdGlvbnMoKTtcbiAgICB0cnkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5leGVjRmlsZSh0aGlzLmdldENsaUxvY2F0aW9uKCksIGFyZ3MsIG9wdGlvbnMsIChlcnJvciwgX3N0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmICghKGVycm9yICE9IG51bGwpKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBfc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpICsgc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDdXJyZW50IHdha2F0aW1lLWNsaSB2ZXJzaW9uIGlzICR7Y3VycmVudFZlcnNpb259YCk7XG5cbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ2hlY2tpbmcgZm9yIHVwZGF0ZXMgdG8gd2FrYXRpbWUtY2xpLi4uJyk7XG4gICAgICAgICAgdGhpcy5nZXRMYXRlc3RDbGlWZXJzaW9uKChsYXRlc3RWZXJzaW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFZlcnNpb24gPT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3dha2F0aW1lLWNsaSBpcyB1cCB0byBkYXRlJyk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlc3RWZXJzaW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBGb3VuZCBhbiB1cGRhdGVkIHdha2F0aW1lLWNsaSAke2xhdGVzdFZlcnNpb259YCk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdVbmFibGUgdG8gZmluZCBsYXRlc3Qgd2FrYXRpbWUtY2xpIHZlcnNpb24nKTtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2FsbGJhY2soZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF0ZXN0Q2xpVmVyc2lvbihjYWxsYmFjazogKGFyZzA6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhdGVzdENsaVZlcnNpb24pIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMubGF0ZXN0Q2xpVmVyc2lvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucy5nZXRTZXR0aW5nKCdzZXR0aW5ncycsICdwcm94eScsIGZhbHNlLCAocHJveHk6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgIHRoaXMub3B0aW9ucy5nZXRTZXR0aW5nKCdzZXR0aW5ncycsICdub19zc2xfdmVyaWZ5JywgZmFsc2UsIChub1NTTFZlcmlmeTogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZyhcbiAgICAgICAgICAnaW50ZXJuYWwnLFxuICAgICAgICAgICdjbGlfdmVyc2lvbl9sYXN0X21vZGlmaWVkJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIChtb2RpZmllZDogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoJ2ludGVybmFsJywgJ2NsaV92ZXJzaW9uJywgdHJ1ZSwgKHZlcnNpb246IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoJ3NldHRpbmdzJywgJ2FscGhhJywgZmFsc2UsIChhbHBoYTogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IHJlcXVlc3QuT3B0aW9uc1dpdGhVcmwgPSB7XG4gICAgICAgICAgICAgICAgICB1cmw6XG4gICAgICAgICAgICAgICAgICAgIGFscGhhLnZhbHVlID09ICd0cnVlJ1xuICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5naXRodWJSZWxlYXNlc0FscGhhVXJsXG4gICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmdpdGh1YlJlbGVhc2VzU3RhYmxlVXJsLFxuICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnZ2l0aHViLmNvbS93YWthdGltZS92c2NvZGUtd2FrYXRpbWUnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChwcm94eS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFVzaW5nIFByb3h5OiAke3Byb3h5LnZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgb3B0aW9uc1sncHJveHknXSA9IHByb3h5LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9TU0xWZXJpZnkudmFsdWUgPT09ICd0cnVlJykgb3B0aW9uc1snc3RyaWN0U1NMJ10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWQudmFsdWUgJiYgdmVyc2lvbi52YWx1ZSAmJiBvcHRpb25zLmhlYWRlcnMpXG4gICAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0lmLU1vZGlmaWVkLVNpbmNlJ10gPSBtb2RpZmllZC52YWx1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXQob3B0aW9ucywgKGVycm9yLCByZXNwb25zZSwganNvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgIWVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSAzMDQpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBHaXRIdWIgQVBJIFJlc3BvbnNlICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSAzMDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF0ZXN0Q2xpVmVyc2lvbiA9IHZlcnNpb24udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLmxhdGVzdENsaVZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdENsaVZlcnNpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEudmFsdWUgPT0gJ3RydWUnID8ganNvblswXVsndGFnX25hbWUnXSA6IGpzb25bJ3RhZ19uYW1lJ107XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICBgTGF0ZXN0IHdha2F0aW1lLWNsaSB2ZXJzaW9uIGZyb20gR2l0SHViOiAke3RoaXMubGF0ZXN0Q2xpVmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gcmVzcG9uc2UuaGVhZGVyc1snbGFzdC1tb2RpZmllZCddIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkICYmIHRoaXMubGF0ZXN0Q2xpVmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNldFNldHRpbmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW50ZXJuYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBrZXk6ICdjbGlfdmVyc2lvbicsIHZhbHVlOiB0aGlzLmxhdGVzdENsaVZlcnNpb24gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGtleTogJ2NsaV92ZXJzaW9uX2xhc3RfbW9kaWZpZWQnLCB2YWx1ZTogbGFzdE1vZGlmaWVkIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLmxhdGVzdENsaVZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgR2l0SHViIEFQSSBSZXNwb25zZSAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9OiAke2Vycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBHaXRIdWIgQVBJIFJlc3BvbnNlIEVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5FeGNlcHRpb24oZSk7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbENsaShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0TGF0ZXN0Q2xpVmVyc2lvbigodmVyc2lvbikgPT4ge1xuICAgICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBEb3dubG9hZGluZyB3YWthdGltZS1jbGkgJHt2ZXJzaW9ufS4uLmApO1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5jbGlEb3dubG9hZFVybCh2ZXJzaW9uKTtcbiAgICAgIGNvbnN0IHppcEZpbGUgPSBwYXRoLmpvaW4oXG4gICAgICAgIHRoaXMuZ2V0UmVzb3VyY2VzTG9jYXRpb24oKSxcbiAgICAgICAgJ3dha2F0aW1lLWNsaScgKyB0aGlzLnJhbmRTdHIoKSArICcuemlwJyxcbiAgICAgICk7XG4gICAgICB0aGlzLmRvd25sb2FkRmlsZShcbiAgICAgICAgdXJsLFxuICAgICAgICB6aXBGaWxlLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHRyYWN0Q2xpKHppcEZpbGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N5bWxpbmsoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmcy5sc3RhdFN5bmMoZmlsZSkuaXNTeW1ib2xpY0xpbmsoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICB9IGNhdGNoIChfKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdENsaSh6aXBGaWxlOiBzdHJpbmcsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYEV4dHJhY3Rpbmcgd2FrYXRpbWUtY2xpIGludG8gXCIke3RoaXMuZ2V0UmVzb3VyY2VzTG9jYXRpb24oKX1cIi4uLmApO1xuICAgIHRoaXMucmVtb3ZlQ2xpKCgpID0+IHtcbiAgICAgIHRoaXMudW56aXAoemlwRmlsZSwgdGhpcy5nZXRSZXNvdXJjZXNMb2NhdGlvbigpLCAoKSA9PiB7XG4gICAgICAgIGlmICghRGVza3RvcC5pc1dpbmRvd3MoKSkge1xuICAgICAgICAgIGNvbnN0IGNsaSA9IHRoaXMuZ2V0Q2xpTG9jYXRpb24oKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NobW9kIDc1NSB3YWthdGltZS1jbGkuLi4nKTtcbiAgICAgICAgICAgIGZzLmNobW9kU3luYyhjbGksIDBvNzU1KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuRXhjZXB0aW9uKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleHQgPSBEZXNrdG9wLmlzV2luZG93cygpID8gJy5leGUnIDogJyc7XG4gICAgICAgICAgY29uc3QgbGluayA9IHBhdGguam9pbih0aGlzLmdldFJlc291cmNlc0xvY2F0aW9uKCksIGB3YWthdGltZS1jbGkke2V4dH1gKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNTeW1saW5rKGxpbmspKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRlIHN5bWxpbmsgZnJvbSB3YWthdGltZS1jbGkgdG8gJHtjbGl9YCk7XG4gICAgICAgICAgICAgIGZzLnN5bWxpbmtTeW5jKGNsaSwgbGluayk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5FeGNlcHRpb24oZSk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKGNsaSwgbGluayk7XG4gICAgICAgICAgICAgICAgZnMuY2htb2RTeW5jKGxpbmssIDBvNzU1KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuRXhjZXB0aW9uKGUyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRmluaXNoZWQgZXh0cmFjdGluZyB3YWthdGltZS1jbGkuJyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUNsaShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMuZ2V0Q2xpTG9jYXRpb24oKSkpIHtcbiAgICAgIGZzLnVubGluayh0aGlzLmdldENsaUxvY2F0aW9uKCksICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZG93bmxvYWRGaWxlKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG91dHB1dEZpbGU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogKCkgPT4gdm9pZCxcbiAgICBlcnJvcjogKCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoJ3NldHRpbmdzJywgJ3Byb3h5JywgZmFsc2UsIChwcm94eTogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoJ3NldHRpbmdzJywgJ25vX3NzbF92ZXJpZnknLCBmYWxzZSwgKG5vU1NMVmVyaWZ5OiBPcHRpb25TZXR0aW5nKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9wdGlvbnM6IHJlcXVlc3QuT3B0aW9uc1dpdGhVcmwgPSB7IHVybDogdXJsIH07XG4gICAgICAgIGlmIChwcm94eS52YWx1ZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBVc2luZyBQcm94eTogJHtwcm94eS52YWx1ZX1gKTtcbiAgICAgICAgICBvcHRpb25zWydwcm94eSddID0gcHJveHkudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vU1NMVmVyaWZ5LnZhbHVlID09PSAndHJ1ZScpIG9wdGlvbnNbJ3N0cmljdFNTTCddID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgciA9IHJlcXVlc3QuZ2V0KG9wdGlvbnMpO1xuICAgICAgICAgIHIub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkb3dubG9hZCAke3VybH1gKTtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGVycm9yKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgb3V0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0ob3V0cHV0RmlsZSk7XG4gICAgICAgICAgci5waXBlKG91dCk7XG4gICAgICAgICAgci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgb3V0Lm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5FeGNlcHRpb24oZSk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVuemlwKGZpbGU6IHN0cmluZywgb3V0cHV0RGlyOiBzdHJpbmcsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHppcCA9IG5ldyBBZG1aaXAoZmlsZSk7XG4gICAgICAgIHppcC5leHRyYWN0QWxsVG8ob3V0cHV0RGlyLCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3JFeGNlcHRpb24oZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZzLnVubGluayhmaWxlLCAoKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFyY2hpdGVjdHVyZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyY2ggPSBvcy5hcmNoKCk7XG4gICAgaWYgKGFyY2guaW5kZXhPZignMzInKSA+IC0xKSByZXR1cm4gJzM4Nic7XG4gICAgaWYgKGFyY2guaW5kZXhPZigneDY0JykgPiAtMSkgcmV0dXJuICdhbWQ2NCc7XG4gICAgcmV0dXJuIGFyY2g7XG4gIH1cblxuICBwcml2YXRlIGNsaURvd25sb2FkVXJsKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IG9zbmFtZSA9IG9zLnBsYXRmb3JtKCkgYXMgc3RyaW5nO1xuICAgIGlmIChvc25hbWUgPT0gJ3dpbjMyJykgb3NuYW1lID0gJ3dpbmRvd3MnO1xuICAgIGNvbnN0IGFyY2ggPSB0aGlzLmFyY2hpdGVjdHVyZSgpO1xuXG4gICAgY29uc3QgdmFsaWRDb21iaW5hdGlvbnMgPSBbXG4gICAgICAnZGFyd2luLWFtZDY0JyxcbiAgICAgICdkYXJ3aW4tYXJtNjQnLFxuICAgICAgJ2ZyZWVic2QtMzg2JyxcbiAgICAgICdmcmVlYnNkLWFtZDY0JyxcbiAgICAgICdmcmVlYnNkLWFybScsXG4gICAgICAnbGludXgtMzg2JyxcbiAgICAgICdsaW51eC1hbWQ2NCcsXG4gICAgICAnbGludXgtYXJtJyxcbiAgICAgICdsaW51eC1hcm02NCcsXG4gICAgICAnbmV0YnNkLTM4NicsXG4gICAgICAnbmV0YnNkLWFtZDY0JyxcbiAgICAgICduZXRic2QtYXJtJyxcbiAgICAgICdvcGVuYnNkLTM4NicsXG4gICAgICAnb3BlbmJzZC1hbWQ2NCcsXG4gICAgICAnb3BlbmJzZC1hcm0nLFxuICAgICAgJ29wZW5ic2QtYXJtNjQnLFxuICAgICAgJ3dpbmRvd3MtMzg2JyxcbiAgICAgICd3aW5kb3dzLWFtZDY0JyxcbiAgICAgICd3aW5kb3dzLWFybTY0JyxcbiAgICBdO1xuICAgIGlmICghdmFsaWRDb21iaW5hdGlvbnMuaW5jbHVkZXMoYCR7b3NuYW1lfS0ke2FyY2h9YCkpXG4gICAgICB0aGlzLnJlcG9ydE1pc3NpbmdQbGF0Zm9ybVN1cHBvcnQob3NuYW1lLCBhcmNoKTtcblxuICAgIHJldHVybiBgJHt0aGlzLmdpdGh1YkRvd25sb2FkUHJlZml4fS8ke3ZlcnNpb259L3dha2F0aW1lLWNsaS0ke29zbmFtZX0tJHthcmNofS56aXBgO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBvcnRNaXNzaW5nUGxhdGZvcm1TdXBwb3J0KG9zbmFtZTogc3RyaW5nLCBhcmNoaXRlY3R1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS53YWthdGltZS5jb20vYXBpL3YxL2NsaS1taXNzaW5nP29zbmFtZT0ke29zbmFtZX0mYXJjaGl0ZWN0dXJlPSR7YXJjaGl0ZWN0dXJlfSZwbHVnaW49dnNjb2RlYDtcbiAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZygnc2V0dGluZ3MnLCAncHJveHknLCBmYWxzZSwgKHByb3h5OiBPcHRpb25TZXR0aW5nKSA9PiB7XG4gICAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZygnc2V0dGluZ3MnLCAnbm9fc3NsX3ZlcmlmeScsIGZhbHNlLCAobm9TU0xWZXJpZnk6IE9wdGlvblNldHRpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3B0aW9uczogcmVxdWVzdC5PcHRpb25zV2l0aFVybCA9IHsgdXJsOiB1cmwgfTtcbiAgICAgICAgaWYgKHByb3h5LnZhbHVlKSBvcHRpb25zWydwcm94eSddID0gcHJveHkudmFsdWU7XG4gICAgICAgIGlmIChub1NTTFZlcmlmeS52YWx1ZSA9PT0gJ3RydWUnKSBvcHRpb25zWydzdHJpY3RTU0wnXSA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcXVlc3QuZ2V0KG9wdGlvbnMpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmFuZFN0cigpOiBzdHJpbmcge1xuICAgIHJldHVybiAoTWF0aC5yYW5kb20oKSArIDEpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNyk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSxZQUFRLFVBQVUsV0FBWTtBQUMxQixVQUFJLE9BQU8sWUFBWSxZQUFZLFFBQVEsWUFBWSxRQUFRLFNBQVMsYUFBYTtBQUNqRixZQUFJO0FBQ0EsZ0JBQU0sYUFBYSxRQUFRO0FBQzNCLGNBQUksT0FBTyxLQUFLLFVBQVUsRUFBRSxTQUFTLEdBQUc7QUFDcEMsbUJBQU87QUFBQSxVQUNYO0FBQUEsUUFDSixTQUFTLEdBQVA7QUFBQSxRQUFXO0FBQUEsTUFDakI7QUFDQSxhQUFPLFFBQVE7QUFBQSxJQUNuQjtBQUFBO0FBQUE7OztBQ1ZBO0FBQUE7QUFBQSxZQUFPLFVBQVU7QUFBQSxNQUViLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUduQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFHbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BR25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFFbkIsVUFBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFlBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixlQUFtQjtBQUFBLE1BRW5CLFVBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixXQUFtQjtBQUFBLE1BQ25CLFdBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsYUFBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsV0FBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFlBQW1CO0FBQUEsTUFHbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUVuQixVQUFtQjtBQUFBLE1BQ25CLG1CQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFFbkIsT0FBbUI7QUFBQSxNQUVuQixNQUFtQjtBQUFBLE1BRW5CLFdBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixhQUFtQjtBQUFBLE1BSW5CLFNBQW1CO0FBQUEsTUFDbkIsV0FBbUI7QUFBQSxNQUNuQixXQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsU0FBbUI7QUFBQSxNQUNuQixXQUFtQjtBQUFBLE1BQ25CLFNBQW1CO0FBQUEsTUFFbkIsU0FBbUI7QUFBQSxNQUluQixTQUFtQjtBQUFBLE1BR25CLE1BQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixNQUFtQjtBQUFBLE1BR25CLE9BQW1CO0FBQUEsTUFDbkIsU0FBbUI7QUFBQSxNQUduQixVQUFtQjtBQUFBLE1BQ25CLFdBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFNBQW1CO0FBQUEsTUFDbkIsWUFBbUI7QUFBQSxNQUNuQixTQUFtQjtBQUFBLE1BQ25CLFNBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixlQUFtQjtBQUFBLE1BQ25CLGtCQUFtQjtBQUFBLE1BQ25CLGtCQUFtQjtBQUFBLE1BQ25CLGNBQW1CO0FBQUEsTUFDbkIsZUFBbUI7QUFBQSxNQUNuQixrQkFBbUI7QUFBQSxNQUNuQixTQUFtQjtBQUFBLE1BQ25CLFNBQW1CO0FBQUEsTUFDbkIsV0FBbUI7QUFBQSxNQUVuQixnQkFBbUI7QUFBQSxNQUNuQixnQkFBbUI7QUFBQSxNQUNuQixrQkFBbUI7QUFBQSxNQUNuQixnQkFBbUI7QUFBQSxNQUNuQixjQUFtQjtBQUFBLE1BQ25CLGNBQW1CO0FBQUEsSUFDdkI7QUFBQTtBQUFBOzs7QUM3SUE7QUFBQTtBQUFBLFFBQU0sVUFBVSxxQkFBd0IsUUFBUTtBQUNoRCxRQUFNLE1BQU0sUUFBUTtBQUNwQixRQUFNLFlBQVk7QUFDbEIsUUFBTSxRQUFRLE9BQU8sWUFBWSxZQUFZLEFBQVksUUFBUSxhQUFwQjtBQUU3QyxRQUFNLFNBQVMsQ0FBQyxRQUFRLE9BQU8sT0FBTyxRQUFRO0FBRzlDLFFBQU0sV0FBVyxJQUFJLFlBQVksR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU07QUFDaEQsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFDeEIsWUFBSyxLQUFJLE9BQU8sR0FBRztBQUNmLGNBQUksYUFBYyxNQUFNO0FBQUEsUUFDNUIsT0FBTztBQUNILGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFDQSxhQUFPLE1BQU07QUFBQSxJQUNqQixDQUFDO0FBSUQsb0JBQWUsTUFBTTtBQUNqQixXQUFLLE1BQU0sSUFBSTtBQUNmLFdBQUssS0FBSztBQUVWLFVBQUksT0FBTyxJQUFJLEdBQUc7QUFFZCxZQUFJLE9BQU8sS0FBSyxFQUFFLEtBQUssT0FBTyxLQUFLLEdBQUcsYUFBYSxZQUFZO0FBQzNELGVBQUssS0FBSyxLQUFLO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUVBLFlBQU8sVUFBVTtBQUlqQixXQUFNLFVBQVUsVUFBVSxTQUFxQixRQUFRO0FBQ25ELFlBQU0sUUFBTztBQUdiLDBCQUE4QixPQUFPO0FBQ2pDLFlBQUksZUFBZSxNQUFNLE1BQU0sTUFBSyxHQUFHLEVBQUU7QUFDekMsY0FBTSxNQUFNLE1BQUssR0FBRyxFQUFFLFFBQVEsU0FBVSxNQUFNO0FBQzFDLGNBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTTtBQUFLO0FBQ3pDLDBCQUFnQixNQUFLLE1BQU07QUFDM0IsY0FBSTtBQUNKLGNBQUk7QUFDQSxtQkFBTyxNQUFLLEdBQUcsU0FBUyxZQUFZO0FBQUEsVUFDeEMsU0FBUyxHQUFQO0FBQ0Usa0JBQUssR0FBRyxVQUFVLFlBQVk7QUFBQSxVQUNsQztBQUNBLGNBQUksUUFBUSxLQUFLLE9BQU87QUFBRyxrQkFBTSxPQUFPLGdCQUFnQixRQUFRLE1BQU0sWUFBWTtBQUFBLFFBQ3RGLENBQUM7QUFBQSxNQUNMO0FBRUEsaUJBQVUsTUFBTTtBQUFBLElBQ3BCO0FBRUEsV0FBTSxVQUFVLGNBQWMsU0FBcUIsT0FBaUIsU0FBcUIsV0FBc0IsTUFBTTtBQUNqSCxZQUFNLFFBQU87QUFDYixVQUFJLE1BQUssR0FBRyxXQUFXLEtBQUksR0FBRztBQUMxQixZQUFJLENBQUM7QUFBVyxpQkFBTztBQUV2QixZQUFJLE9BQU8sTUFBSyxHQUFHLFNBQVMsS0FBSTtBQUNoQyxZQUFJLEtBQUssWUFBWSxHQUFHO0FBQ3BCLGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFDQSxVQUFJLFNBQVMsSUFBSSxRQUFRLEtBQUk7QUFDN0IsVUFBSSxDQUFDLE1BQUssR0FBRyxXQUFXLE1BQU0sR0FBRztBQUM3QixjQUFLLFFBQVEsTUFBTTtBQUFBLE1BQ3ZCO0FBRUEsVUFBSTtBQUNKLFVBQUk7QUFDQSxhQUFLLE1BQUssR0FBRyxTQUFTLE9BQU0sS0FBSyxHQUFHO0FBQUEsTUFDeEMsU0FBUyxHQUFQO0FBQ0UsY0FBSyxHQUFHLFVBQVUsT0FBTSxHQUFHO0FBQzNCLGFBQUssTUFBSyxHQUFHLFNBQVMsT0FBTSxLQUFLLEdBQUc7QUFBQSxNQUN4QztBQUNBLFVBQUksSUFBSTtBQUNKLFlBQUk7QUFDQSxnQkFBSyxHQUFHLFVBQVUsSUFBSSxTQUFTLEdBQUcsUUFBUSxRQUFRLENBQUM7QUFBQSxRQUN2RCxVQUFFO0FBQ0UsZ0JBQUssR0FBRyxVQUFVLEVBQUU7QUFBQSxRQUN4QjtBQUFBLE1BQ0o7QUFDQSxZQUFLLEdBQUcsVUFBVSxPQUFNLFFBQVEsR0FBRztBQUNuQyxhQUFPO0FBQUEsSUFDWDtBQUVBLFdBQU0sVUFBVSxtQkFBbUIsU0FBcUIsT0FBaUIsU0FBcUIsV0FBc0IsTUFBbUIsVUFBVTtBQUM3SSxVQUFJLE9BQU8sU0FBUyxZQUFZO0FBQzVCLG1CQUFXO0FBQ1gsZUFBTztBQUFBLE1BQ1g7QUFFQSxZQUFNLFFBQU87QUFFYixZQUFLLEdBQUcsT0FBTyxPQUFNLFNBQVUsT0FBTztBQUNsQyxZQUFJLFNBQVMsQ0FBQztBQUFXLGlCQUFPLFNBQVMsS0FBSztBQUU5QyxjQUFLLEdBQUcsS0FBSyxPQUFNLFNBQVUsS0FBSyxNQUFNO0FBQ3BDLGNBQUksU0FBUyxLQUFLLFlBQVksR0FBRztBQUM3QixtQkFBTyxTQUFTLEtBQUs7QUFBQSxVQUN6QjtBQUVBLGNBQUksU0FBUyxJQUFJLFFBQVEsS0FBSTtBQUM3QixnQkFBSyxHQUFHLE9BQU8sUUFBUSxTQUFVLFFBQVE7QUFDckMsZ0JBQUksQ0FBQztBQUFRLG9CQUFLLFFBQVEsTUFBTTtBQUVoQyxrQkFBSyxHQUFHLEtBQUssT0FBTSxLQUFLLEtBQUssU0FBVSxNQUFLLElBQUk7QUFDNUMsa0JBQUksTUFBSztBQUNMLHNCQUFLLEdBQUcsTUFBTSxPQUFNLEtBQUssV0FBWTtBQUNqQyx3QkFBSyxHQUFHLEtBQUssT0FBTSxLQUFLLEtBQUssU0FBVSxNQUFLLEtBQUk7QUFDNUMsMEJBQUssR0FBRyxNQUFNLEtBQUksU0FBUyxHQUFHLFFBQVEsUUFBUSxHQUFHLFdBQVk7QUFDekQsNEJBQUssR0FBRyxNQUFNLEtBQUksV0FBWTtBQUMxQiw4QkFBSyxHQUFHLE1BQU0sT0FBTSxRQUFRLEtBQUssV0FBWTtBQUN6QyxtQ0FBUyxJQUFJO0FBQUEsd0JBQ2pCLENBQUM7QUFBQSxzQkFDTCxDQUFDO0FBQUEsb0JBQ0wsQ0FBQztBQUFBLGtCQUNMLENBQUM7QUFBQSxnQkFDTCxDQUFDO0FBQUEsY0FDTCxXQUFXLElBQUk7QUFDWCxzQkFBSyxHQUFHLE1BQU0sSUFBSSxTQUFTLEdBQUcsUUFBUSxRQUFRLEdBQUcsV0FBWTtBQUN6RCx3QkFBSyxHQUFHLE1BQU0sSUFBSSxXQUFZO0FBQzFCLDBCQUFLLEdBQUcsTUFBTSxPQUFNLFFBQVEsS0FBSyxXQUFZO0FBQ3pDLCtCQUFTLElBQUk7QUFBQSxvQkFDakIsQ0FBQztBQUFBLGtCQUNMLENBQUM7QUFBQSxnQkFDTCxDQUFDO0FBQUEsY0FDTCxPQUFPO0FBQ0gsc0JBQUssR0FBRyxNQUFNLE9BQU0sUUFBUSxLQUFLLFdBQVk7QUFDekMsMkJBQVMsSUFBSTtBQUFBLGdCQUNqQixDQUFDO0FBQUEsY0FDTDtBQUFBLFlBQ0osQ0FBQztBQUFBLFVBQ0wsQ0FBQztBQUFBLFFBQ0wsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ0w7QUFFQSxXQUFNLFVBQVUsWUFBWSxTQUFxQixPQUFNO0FBQ25ELFlBQU0sUUFBTztBQUViLHdCQUE2QixLQUFnQixTQUFxQixXQUFXO0FBQ3pFLFlBQUksT0FBTyxZQUFZLFdBQVc7QUFDOUIsc0JBQVk7QUFDWixvQkFBVTtBQUFBLFFBQ2Q7QUFDQSxZQUFJLFFBQVEsQ0FBQztBQUNiLGNBQUssR0FBRyxZQUFZLEdBQUcsRUFBRSxRQUFRLFNBQVUsTUFBTTtBQUM3QyxjQUFJLFFBQU8sSUFBSSxLQUFLLEtBQUssSUFBSTtBQUU3QixjQUFJLE1BQUssR0FBRyxTQUFTLEtBQUksRUFBRSxZQUFZLEtBQUs7QUFBVyxvQkFBUSxNQUFNLE9BQU8sU0FBUyxPQUFNLFNBQVMsU0FBUyxDQUFDO0FBRTlHLGNBQUksQ0FBQyxXQUFXLFFBQVEsS0FBSyxLQUFJLEdBQUc7QUFDaEMsa0JBQU0sS0FBSyxJQUFJLFVBQVUsS0FBSSxJQUFLLE9BQUssR0FBRyxTQUFTLEtBQUksRUFBRSxZQUFZLElBQUksTUFBSyxNQUFNLEdBQUc7QUFBQSxVQUMzRjtBQUFBLFFBQ0osQ0FBQztBQUNELGVBQU87QUFBQSxNQUNYO0FBRUEsYUFBTyxTQUFTLE9BQU0sUUFBVyxJQUFJO0FBQUEsSUFDekM7QUFFQSxXQUFNLFVBQVUsZ0JBQWdCLFdBQVk7QUFBQSxJQUFDO0FBRTdDLFdBQU0sVUFBVSxnQkFBZ0IsV0FBWTtBQUFBLElBQUM7QUFLN0MsV0FBTSxjQUFjLFNBQVUsS0FBSyxNQUFNO0FBQ3JDLGFBQU8sU0FBVSxPQUFNLFFBQVEsT0FBUyxRQUFRO0FBQUEsSUFDcEQ7QUFFQSxXQUFNLFFBQVEsU0FBVSxLQUFLO0FBQ3pCLFVBQUksT0FBTyxRQUFRLFVBQVU7QUFDekIsY0FBTSxPQUFPLEtBQUssS0FBSyxNQUFNO0FBQUEsTUFDakM7QUFFQSxVQUFJLENBQUMsU0FBUztBQUFRLG9CQUFZO0FBRWxDLFVBQUksTUFBTSxJQUFJO0FBQ2QsVUFBSSxNQUFNLENBQUM7QUFDWCxlQUFTLE1BQU0sR0FBRyxNQUFNO0FBQU8sY0FBTSxPQUFNLFlBQVksS0FBSyxJQUFJLE1BQU07QUFFdEUsYUFBTyxDQUFDLFFBQVE7QUFBQSxJQUNwQjtBQUVBLFdBQU0saUJBQWlCLFNBQXFCLFFBQVE7QUFDaEQsY0FBUTtBQUFBLGFBQ0MsVUFBVTtBQUNYLGlCQUFPLGFBQWEsU0FBUztBQUFBLGFBQzVCLFVBQVU7QUFDWCxpQkFBTyxlQUFlLFNBQVM7QUFBQTtBQUUvQixpQkFBTyxrQkFBa0IsU0FBUztBQUFBO0FBQUEsSUFFOUM7QUFHQSxXQUFNLFlBQVksU0FBcUIsT0FBTTtBQUN6QyxVQUFJLENBQUM7QUFBTSxlQUFPO0FBRWxCLFVBQUksYUFBYSxJQUFJLE1BQU0sVUFBVSxNQUFNLE1BQUssTUFBTSxJQUFJLEVBQUUsS0FBSyxHQUFHLENBQUM7QUFDckUsYUFBTyxJQUFJLEtBQUssS0FBSyxVQUFVO0FBQUEsSUFDbkM7QUFHQSxXQUFNLFdBQVcsU0FBcUIsUUFBbUIsTUFBTTtBQUMzRCxlQUFTLElBQUksUUFBUSxJQUFJLFVBQVUsTUFBTSxDQUFDO0FBQzFDLFVBQUksUUFBUSxLQUFLLE1BQU0sR0FBRztBQUMxQixlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUcsS0FBSztBQUMxQyxZQUFJLFFBQU8sSUFBSSxVQUFVLElBQUksS0FBSyxRQUFRLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUM7QUFDMUUsWUFBSSxNQUFLLFFBQVEsTUFBTSxNQUFNLEdBQUc7QUFDNUIsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUNBLGFBQU8sSUFBSSxVQUFVLElBQUksS0FBSyxRQUFRLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQztBQUFBLElBQzdEO0FBR0EsV0FBTSxXQUFXLGtCQUFpRCxPQUFPO0FBQ3JFLFVBQUksT0FBTyxTQUFTLEtBQUssR0FBRztBQUN4QixlQUFPO0FBQUEsTUFDWCxXQUFXLGlCQUFpQixZQUFZO0FBQ3BDLGVBQU8sT0FBTyxLQUFLLEtBQUs7QUFBQSxNQUM1QixPQUFPO0FBRUgsZUFBTyxPQUFPLFVBQVUsV0FBVyxPQUFPLEtBQUssT0FBTyxNQUFNLElBQUksT0FBTyxNQUFNLENBQUM7QUFBQSxNQUNsRjtBQUFBLElBQ0o7QUFFQSxXQUFNLGtCQUFrQixTQUFxQixRQUFnQixPQUFPO0FBQ2hFLFVBQUksUUFBUSxPQUFPLEtBQUssT0FBTyxNQUFNLE9BQU8sUUFBUSxDQUFDLENBQUM7QUFDdEQsWUFBTSxPQUFPO0FBRWIsYUFBTyxTQUFTLEtBQUssTUFBTSxTQUFTLEtBQUssR0FBRztBQUFBLElBQ2hEO0FBRUEsV0FBTSxRQUFRO0FBQ2QsV0FBTSxXQUFXO0FBQUE7QUFBQTs7O0FDclBqQjtBQUFBO0FBQUEsWUFBTyxVQUFVO0FBQUEsTUFFYixhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFHYixTQUFTO0FBQUEsTUFDVCxTQUFTO0FBQUEsTUFDVCxpQkFBaUI7QUFBQSxNQUNqQixnQkFBZ0I7QUFBQSxNQUdoQixZQUFZO0FBQUEsTUFDWixrQkFBa0I7QUFBQSxNQUNsQixlQUFlO0FBQUEsTUFDZixvQkFBb0I7QUFBQSxNQUNwQixzQkFBc0I7QUFBQSxNQUN0QixrQkFBa0I7QUFBQSxNQUNsQixzQkFBc0I7QUFBQSxNQUN0QixtQkFBbUI7QUFBQSxNQUNuQixxQkFBcUI7QUFBQSxNQUNyQixvQkFBb0I7QUFBQSxNQUdwQixtQkFBbUI7QUFBQSxNQUNuQixlQUFlO0FBQUEsTUFDZixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVix5QkFBeUI7QUFBQSxNQUN6QixnQkFBZ0I7QUFBQSxNQUNoQixpQkFBaUI7QUFBQSxNQUNqQixrQkFBa0I7QUFBQSxNQUNsQixnQkFBZ0I7QUFBQSxJQUNwQjtBQUFBO0FBQUE7OztBQ2xDQTtBQUFBO0FBQUEsUUFBTSxNQUFLLHFCQUF3QixRQUFRO0FBQzNDLFFBQU0sTUFBTSxRQUFRO0FBRXBCLFFBQUcsYUFBYSxJQUFHLGNBQWMsSUFBSTtBQUVyQyxZQUFPLFVBQVUsU0FBcUIsT0FBTTtBQUN4QyxVQUFJLFFBQVEsU0FBUSxJQUNoQixPQUFPLFFBQVEsR0FDZixRQUFRO0FBRVoseUJBQW1CO0FBQ2YsZUFBTztBQUFBLFVBQ0gsV0FBVztBQUFBLFVBQ1gsVUFBVTtBQUFBLFVBQ1YsUUFBUTtBQUFBLFVBQ1IsWUFBWTtBQUFBLFVBQ1osT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBRUEsVUFBSSxTQUFTLElBQUcsV0FBVyxLQUFLLEdBQUc7QUFDL0IsZ0JBQVEsSUFBRyxTQUFTLEtBQUs7QUFDekIsYUFBSyxZQUFZLE1BQU0sWUFBWTtBQUNuQyxhQUFLLFFBQVEsTUFBTTtBQUNuQixhQUFLLFFBQVEsTUFBTTtBQUNuQixhQUFLLGFBQWMsTUFBUSxNQUFNLFVBQVU7QUFDM0MsYUFBSyxXQUFZLE9BQVEsTUFBTSxVQUFVO0FBQ3pDLGFBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxFQUFFLE9BQU87QUFBQSxNQUM3QyxPQUFPO0FBQ0gsZ0JBQVEsS0FBSyxtQkFBbUIsS0FBSztBQUFBLE1BQ3pDO0FBRUEsYUFBTztBQUFBLFFBQ0gsSUFBSSxZQUFZO0FBQ1osaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFFQSxJQUFJLFdBQVc7QUFDWCxpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUVBLElBQUksU0FBUztBQUNULGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBRUEsSUFBSSxRQUFRO0FBQ1IsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFFQSxJQUFJLFFBQVE7QUFDUixpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUVBLElBQUksYUFBYTtBQUNiLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBRUEsa0JBQWtCLFdBQVk7QUFBQSxRQUFDO0FBQUEsUUFFL0Isa0JBQWtCLFdBQVk7QUFBQSxRQUFDO0FBQUEsUUFFL0IsUUFBUSxXQUFZO0FBQ2hCLGlCQUFPO0FBQUEsWUFDSCxNQUFNO0FBQUEsWUFDTixhQUFhLEtBQUs7QUFBQSxZQUNsQixZQUFZLEtBQUs7QUFBQSxZQUNqQixVQUFVLEtBQUs7QUFBQSxZQUNmLGNBQWMsS0FBSztBQUFBLFlBQ25CLE9BQU8sS0FBSztBQUFBLFlBQ1osT0FBTyxLQUFLO0FBQUEsVUFDaEI7QUFBQSxRQUNKO0FBQUEsUUFFQSxVQUFVLFdBQVk7QUFDbEIsaUJBQU8sS0FBSyxVQUFVLEtBQUssT0FBTyxHQUFHLE1BQU0sR0FBSTtBQUFBLFFBQ25EO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUM5RUE7QUFBQTtBQUFBLFlBQU8sVUFBVTtBQUNqQixZQUFPLFFBQVEsWUFBWTtBQUMzQixZQUFPLFFBQVEsU0FBUztBQUN4QixZQUFPLFFBQVEsV0FBVztBQUFBO0FBQUE7OztBQ0gxQjtBQUFBO0FBQUEsUUFBSSxTQUFRO0FBQVosUUFDSSxZQUFZLE9BQU07QUFHdEIsWUFBTyxVQUFVLFdBQVk7QUFDekIsVUFBSSxXQUFXLElBQ1gsV0FBVyxJQUNYLFNBQVMsR0FDVCxVQUFVLEdBQ1YsUUFBUSxHQUNSLE9BQU8sR0FDUCxrQkFBa0IsR0FDbEIsUUFBUSxHQUNSLFlBQVksR0FDWixZQUFZLEdBQ1osVUFBVSxHQUNWLGFBQWEsR0FDYixVQUFVLEdBQ1YsUUFBUSxHQUNSLFVBQVU7QUFFZCxrQkFBWSxPQUFNLFFBQVEsT0FBUztBQUluQyxnQkFBVSxVQUFVO0FBRXBCLFVBQUksY0FBYyxDQUFDO0FBRW5CLHVCQUFpQixLQUFLO0FBQ2xCLGNBQU0sSUFBSSxLQUFLLEdBQUc7QUFDbEIsZ0JBQ08sS0FBSSxZQUFZLElBQUksT0FBUSxRQUFTLEtBQ3RDLElBQUksU0FBUyxJQUFJLEtBQU0sS0FDeEIsSUFBSSxRQUFRLEtBQUssS0FFakIsSUFBSSxTQUFTLEtBQUssS0FDbEIsSUFBSSxXQUFXLEtBQUssSUFDcEIsSUFBSSxXQUFXLEtBQUs7QUFBQSxNQUM3QjtBQUVBLGNBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUVuQixhQUFPO0FBQUEsUUFDSCxJQUFJLE9BQU87QUFDUCxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksS0FBSyxLQUFLO0FBQ1YscUJBQVc7QUFBQSxRQUNmO0FBQUEsUUFFQSxJQUFJLFVBQVU7QUFDVixpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksUUFBUSxLQUFLO0FBQ2IscUJBQVc7QUFBQSxRQUNmO0FBQUEsUUFFQSxJQUFJLFFBQVE7QUFDUixpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksTUFBTSxLQUFLO0FBQ1gsbUJBQVM7QUFBQSxRQUNiO0FBQUEsUUFFQSxJQUFJLFNBQVM7QUFDVCxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksT0FBTyxLQUFLO0FBQ1osa0JBQVE7QUFBQSxpQkFDQyxVQUFVO0FBQ1gsbUJBQUssVUFBVTtBQUFBLGlCQUNkLFVBQVU7QUFBQTtBQUVYLG1CQUFLLFVBQVU7QUFBQTtBQUV2QixvQkFBVTtBQUFBLFFBQ2Q7QUFBQSxRQUVBLElBQUksT0FBTztBQUNQLGlCQUFPLElBQUksS0FBTyxVQUFTLEtBQU0sT0FBUSxNQUFRLFVBQVMsS0FBTSxNQUFRLEdBQUksU0FBUyxLQUFNLElBQU8sU0FBUyxLQUFNLElBQU8sU0FBUyxJQUFLLElBQU8sU0FBUSxPQUFTLENBQUM7QUFBQSxRQUNuSztBQUFBLFFBQ0EsSUFBSSxLQUFLLEtBQUs7QUFDVixrQkFBUSxHQUFHO0FBQUEsUUFDZjtBQUFBLFFBRUEsSUFBSSxNQUFNO0FBQ04saUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxJQUFJLElBQUksS0FBSztBQUNULGlCQUFPLEtBQUssSUFBSSxHQUFHLEdBQUcsTUFBTTtBQUFBLFFBQ2hDO0FBQUEsUUFFQSxJQUFJLGlCQUFpQjtBQUNqQixpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksZUFBZSxLQUFLO0FBQ3BCLDRCQUFrQixLQUFLLElBQUksR0FBRyxHQUFHLE1BQU07QUFBQSxRQUMzQztBQUFBLFFBRUEsSUFBSSxPQUFPO0FBQ1AsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxJQUFJLEtBQUssS0FBSztBQUNWLGtCQUFRLEtBQUssSUFBSSxHQUFHLEdBQUcsTUFBTTtBQUFBLFFBQ2pDO0FBQUEsUUFFQSxJQUFJLGlCQUFpQjtBQUNqQixpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksZUFBZSxLQUFLO0FBQ3BCLHNCQUFZO0FBQUEsUUFDaEI7QUFBQSxRQUVBLElBQUksY0FBYztBQUNkLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsSUFBSSxZQUFZLEtBQUs7QUFDakIsc0JBQVk7QUFBQSxRQUNoQjtBQUFBLFFBRUEsSUFBSSxnQkFBZ0I7QUFDaEIsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxJQUFJLGNBQWMsS0FBSztBQUNuQixvQkFBVTtBQUFBLFFBQ2Q7QUFBQSxRQUVBLElBQUksZUFBZTtBQUNmLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsSUFBSSxhQUFhLEtBQUs7QUFDbEIsdUJBQWEsS0FBSyxJQUFJLEdBQUcsR0FBRyxNQUFNO0FBQUEsUUFDdEM7QUFBQSxRQUVBLElBQUksU0FBUztBQUNULGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsSUFBSSxPQUFPLEtBQUs7QUFDWixvQkFBVSxLQUFLLElBQUksR0FBRyxHQUFHLE1BQU07QUFBQSxRQUNuQztBQUFBLFFBRUEsSUFBSSxPQUFPO0FBQ1AsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxJQUFJLEtBQUssS0FBSztBQUNWLGtCQUFRLEtBQUssSUFBSSxHQUFHLEdBQUcsTUFBTTtBQUFBLFFBQ2pDO0FBQUEsUUFHQSxJQUFJLFdBQVc7QUFDWCxpQkFBTyxRQUFXLFdBQVUsSUFBSyxNQUFNLEtBQU0sT0FBUTtBQUFBLFFBQ3pEO0FBQUEsUUFFQSxJQUFJLFNBQVM7QUFDVCxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksT0FBTyxLQUFLO0FBQ1osb0JBQVUsS0FBSyxJQUFJLEdBQUcsR0FBRyxNQUFNO0FBQUEsUUFDbkM7QUFBQSxRQUVBLElBQUksWUFBWTtBQUNaLGlCQUFRLFVBQVMsT0FBTztBQUFBLFFBQzVCO0FBQUEsUUFFQSxJQUFJLGtCQUFrQjtBQUNsQixpQkFBTyxVQUFVLFNBQVMsWUFBWSxZQUFZO0FBQUEsUUFDdEQ7QUFBQSxRQUVBLElBQUksaUJBQWlCO0FBQ2pCLGlCQUFPLFVBQVUsVUFBVSxTQUFTLFlBQVksV0FBVyxZQUFZO0FBQUEsUUFDM0U7QUFBQSxRQUVBLElBQUksYUFBYTtBQUNiLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBRUEsMEJBQTBCLFNBQXFCLE9BQU87QUFDbEQsY0FBSSxPQUFPLE1BQU0sTUFBTSxTQUFTLFVBQVUsVUFBVSxNQUFNO0FBRTFELGNBQUksS0FBSyxhQUFhLENBQUMsTUFBTSxVQUFVLFFBQVE7QUFDM0Msa0JBQU0sSUFBSSxNQUFNLE9BQU0sT0FBTyxXQUFXO0FBQUEsVUFDNUM7QUFDQSx3QkFBYztBQUFBLFlBRVYsU0FBUyxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBQUEsWUFFM0MsT0FBTyxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBQUEsWUFFekMsUUFBUSxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBQUEsWUFFMUMsTUFBTSxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBQUEsWUFFeEMsS0FBSyxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBQUEsWUFFdkMsZ0JBQWdCLEtBQUssYUFBYSxVQUFVLE1BQU07QUFBQSxZQUVsRCxNQUFNLEtBQUssYUFBYSxVQUFVLE1BQU07QUFBQSxZQUV4QyxVQUFVLEtBQUssYUFBYSxVQUFVLE1BQU07QUFBQSxZQUU1QyxVQUFVLEtBQUssYUFBYSxVQUFVLE1BQU07QUFBQSxVQUNoRDtBQUFBLFFBQ0o7QUFBQSxRQUVBLGdCQUFnQixTQUFxQixNQUFNO0FBRXZDLGNBQUksS0FBSyxXQUFXLFVBQVUsVUFBVSxLQUFLLGFBQWEsQ0FBQyxNQUFNLFVBQVUsUUFBUTtBQUMvRSxrQkFBTSxJQUFJLE1BQU0sT0FBTSxPQUFPLFdBQVc7QUFBQSxVQUM1QztBQUVBLHFCQUFXLEtBQUssYUFBYSxVQUFVLE1BQU07QUFFN0MscUJBQVcsS0FBSyxhQUFhLFVBQVUsTUFBTTtBQUU3QyxtQkFBUyxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBRTNDLG9CQUFVLEtBQUssYUFBYSxVQUFVLE1BQU07QUFFNUMsa0JBQVEsS0FBSyxhQUFhLFVBQVUsTUFBTTtBQUUxQyxpQkFBTyxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBRXpDLDRCQUFrQixLQUFLLGFBQWEsVUFBVSxNQUFNO0FBRXBELGtCQUFRLEtBQUssYUFBYSxVQUFVLE1BQU07QUFFMUMsc0JBQVksS0FBSyxhQUFhLFVBQVUsTUFBTTtBQUU5QyxzQkFBWSxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBRTlDLG9CQUFVLEtBQUssYUFBYSxVQUFVLE1BQU07QUFFNUMsdUJBQWEsS0FBSyxhQUFhLFVBQVUsTUFBTTtBQUUvQyxvQkFBVSxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBRTVDLGtCQUFRLEtBQUssYUFBYSxVQUFVLE1BQU07QUFFMUMsb0JBQVUsS0FBSyxhQUFhLFVBQVUsTUFBTTtBQUFBLFFBQ2hEO0FBQUEsUUFFQSxvQkFBb0IsV0FBWTtBQUU1QixjQUFJLE9BQU8sT0FBTyxNQUFNLFVBQVUsTUFBTTtBQUV4QyxlQUFLLGNBQWMsVUFBVSxRQUFRLENBQUM7QUFFdEMsZUFBSyxjQUFjLFVBQVUsVUFBVSxNQUFNO0FBRTdDLGVBQUssY0FBYyxRQUFRLFVBQVUsTUFBTTtBQUUzQyxlQUFLLGNBQWMsU0FBUyxVQUFVLE1BQU07QUFFNUMsZUFBSyxjQUFjLE9BQU8sVUFBVSxNQUFNO0FBRTFDLGVBQUssY0FBYyxNQUFNLFVBQVUsTUFBTTtBQUV6QyxlQUFLLGNBQWMsaUJBQWlCLFVBQVUsTUFBTTtBQUVwRCxlQUFLLGNBQWMsT0FBTyxVQUFVLE1BQU07QUFFMUMsZUFBSyxjQUFjLFdBQVcsVUFBVSxNQUFNO0FBRTlDLGVBQUssY0FBYyxXQUFXLFVBQVUsTUFBTTtBQUM5QyxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUVBLHFCQUFxQixXQUFZO0FBRTdCLGNBQUksT0FBTyxPQUFPLE1BQU0sVUFBVSxTQUFTLFlBQVksWUFBWSxPQUFPO0FBRTFFLGVBQUssY0FBYyxVQUFVLFFBQVEsQ0FBQztBQUV0QyxlQUFLLGNBQWMsVUFBVSxVQUFVLE1BQU07QUFFN0MsZUFBSyxjQUFjLFVBQVUsVUFBVSxNQUFNO0FBRTdDLGVBQUssY0FBYyxRQUFRLFVBQVUsTUFBTTtBQUUzQyxlQUFLLGNBQWMsU0FBUyxVQUFVLE1BQU07QUFFNUMsZUFBSyxjQUFjLE9BQU8sVUFBVSxNQUFNO0FBRTFDLGVBQUssY0FBYyxNQUFNLFVBQVUsTUFBTTtBQUV6QyxlQUFLLGNBQWMsaUJBQWlCLFVBQVUsTUFBTTtBQUVwRCxlQUFLLGNBQWMsT0FBTyxVQUFVLE1BQU07QUFFMUMsZUFBSyxjQUFjLFdBQVcsVUFBVSxNQUFNO0FBRTlDLGVBQUssY0FBYyxXQUFXLFVBQVUsTUFBTTtBQUU5QyxlQUFLLGNBQWMsU0FBUyxVQUFVLE1BQU07QUFFNUMsZUFBSyxjQUFjLFlBQVksVUFBVSxNQUFNO0FBRS9DLGVBQUssY0FBYyxTQUFTLFVBQVUsTUFBTTtBQUU1QyxlQUFLLGNBQWMsT0FBTyxVQUFVLE1BQU07QUFFMUMsZUFBSyxjQUFjLFNBQVMsVUFBVSxNQUFNO0FBRTVDLGVBQUssS0FBSyxHQUFNLFVBQVUsTUFBTTtBQUNoQyxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUVBLFFBQVEsV0FBWTtBQUNoQixnQkFBTSxRQUFRLFNBQVUsSUFBSTtBQUN4QixtQkFBTyxLQUFLO0FBQUEsVUFDaEI7QUFFQSxpQkFBTztBQUFBLFlBQ0gsTUFBTTtBQUFBLFlBQ04sU0FBUztBQUFBLFlBQ1QsT0FBTztBQUFBLFlBQ1AsUUFBUSxPQUFNLGVBQWUsT0FBTztBQUFBLFlBQ3BDLE1BQU0sS0FBSztBQUFBLFlBQ1gsS0FBSyxPQUFPLEtBQUssU0FBUyxFQUFFLEVBQUUsWUFBWTtBQUFBLFlBQzFDLGdCQUFnQixNQUFNLGVBQWU7QUFBQSxZQUNyQyxNQUFNLE1BQU0sS0FBSztBQUFBLFlBQ2pCLGdCQUFnQixNQUFNLFNBQVM7QUFBQSxZQUMvQixhQUFhLE1BQU0sU0FBUztBQUFBLFlBQzVCLGVBQWUsTUFBTSxPQUFPO0FBQUEsWUFDNUIsY0FBYztBQUFBLFlBQ2QsUUFBUTtBQUFBLFlBQ1IsTUFBTTtBQUFBLFlBQ04sUUFBUTtBQUFBLFlBQ1IsaUJBQWlCLE1BQU0sVUFBVSxTQUFTLFlBQVksWUFBWSxPQUFPO0FBQUEsVUFDN0U7QUFBQSxRQUNKO0FBQUEsUUFFQSxVQUFVLFdBQVk7QUFDbEIsaUJBQU8sS0FBSyxVQUFVLEtBQUssT0FBTyxHQUFHLE1BQU0sR0FBSTtBQUFBLFFBQ25EO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNqVkE7QUFBQTtBQUFBLFFBQUksU0FBUTtBQUFaLFFBQ0ksWUFBWSxPQUFNO0FBR3RCLFlBQU8sVUFBVSxXQUFZO0FBQ3pCLFVBQUksaUJBQWlCLEdBQ2pCLGdCQUFnQixHQUNoQixRQUFRLEdBQ1IsVUFBVSxHQUNWLGlCQUFpQjtBQUVyQixhQUFPO0FBQUEsUUFDSCxJQUFJLGNBQWM7QUFDZCxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksWUFBdUIsS0FBSztBQUM1QiwyQkFBaUIsZ0JBQWdCO0FBQUEsUUFDckM7QUFBQSxRQUVBLElBQUksZUFBZTtBQUNmLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsSUFBSSxhQUF3QixLQUFLO0FBQzdCLDBCQUFnQixpQkFBaUI7QUFBQSxRQUNyQztBQUFBLFFBRUEsSUFBSSxPQUFPO0FBQ1AsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxJQUFJLEtBQWdCLEtBQUs7QUFDckIsa0JBQVE7QUFBQSxRQUNaO0FBQUEsUUFFQSxJQUFJLFNBQVM7QUFDVCxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLElBQUksT0FBa0IsS0FBSztBQUN2QixvQkFBVTtBQUFBLFFBQ2Q7QUFBQSxRQUVBLElBQUksZ0JBQWdCO0FBQ2hCLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsSUFBSSxjQUF5QixLQUFLO0FBQzlCLDJCQUFpQjtBQUFBLFFBQ3JCO0FBQUEsUUFFQSxJQUFJLGlCQUFpQjtBQUNqQixpQkFBTyxVQUFVLFNBQVM7QUFBQSxRQUM5QjtBQUFBLFFBRUEsZ0JBQWdCLFNBQXFCLE1BQU07QUFHdkMsY0FDSyxNQUFLLFdBQVcsVUFBVSxVQUFVLEtBQUssYUFBYSxDQUFDLE1BQU0sVUFBVSxXQUN2RSxNQUFLLFNBQVMsVUFBVSxZQUFZLEtBQUssYUFBYSxDQUFDLE1BQU0sVUFBVSxXQUMxRTtBQUNFLGtCQUFNLElBQUksTUFBTSxPQUFNLE9BQU8sV0FBVztBQUFBLFVBQzVDO0FBRUEsY0FBSSxLQUFLLGFBQWEsQ0FBQyxNQUFNLFVBQVUsUUFBUTtBQUUzQyw2QkFBaUIsS0FBSyxhQUFhLFVBQVUsTUFBTTtBQUVuRCw0QkFBZ0IsS0FBSyxhQUFhLFVBQVUsTUFBTTtBQUVsRCxvQkFBUSxLQUFLLGFBQWEsVUFBVSxNQUFNO0FBRTFDLHNCQUFVLEtBQUssYUFBYSxVQUFVLE1BQU07QUFFNUMsNkJBQWlCLEtBQUssYUFBYSxVQUFVLE1BQU07QUFBQSxVQUN2RCxPQUFPO0FBRUgsNkJBQWlCLE9BQU0sZ0JBQWdCLE1BQU0sVUFBVSxRQUFRO0FBRS9ELDRCQUFnQixPQUFNLGdCQUFnQixNQUFNLFVBQVUsUUFBUTtBQUU5RCxvQkFBUSxPQUFNLGdCQUFnQixNQUFNLFVBQVUsUUFBUTtBQUV0RCxzQkFBVSxPQUFNLGdCQUFnQixNQUFNLFVBQVUsUUFBUTtBQUV4RCw2QkFBaUI7QUFBQSxVQUNyQjtBQUFBLFFBQ0o7QUFBQSxRQUVBLFVBQVUsV0FBWTtBQUNsQixjQUFJLElBQUksT0FBTyxNQUFNLFVBQVUsU0FBUyxjQUFjO0FBRXRELFlBQUUsY0FBYyxVQUFVLFFBQVEsQ0FBQztBQUNuQyxZQUFFLGNBQWMsR0FBRyxDQUFDO0FBRXBCLFlBQUUsY0FBYyxnQkFBZ0IsVUFBVSxNQUFNO0FBRWhELFlBQUUsY0FBYyxlQUFlLFVBQVUsTUFBTTtBQUUvQyxZQUFFLGNBQWMsT0FBTyxVQUFVLE1BQU07QUFFdkMsWUFBRSxjQUFjLFNBQVMsVUFBVSxNQUFNO0FBRXpDLFlBQUUsY0FBYyxnQkFBZ0IsVUFBVSxNQUFNO0FBRWhELFlBQUUsS0FBSyxLQUFLLFVBQVUsTUFBTTtBQUU1QixpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUVBLFFBQVEsV0FBWTtBQUVoQixnQkFBTSxTQUFTLFNBQVUsSUFBSSxLQUFLO0FBQzlCLGdCQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsRUFBRSxZQUFZO0FBQ3ZDLG1CQUFPLEtBQUssU0FBUztBQUFLLHFCQUFPLE1BQU07QUFDdkMsbUJBQU8sT0FBTztBQUFBLFVBQ2xCO0FBRUEsaUJBQU87QUFBQSxZQUNILGFBQWE7QUFBQSxZQUNiLGNBQWM7QUFBQSxZQUNkLE1BQU0sUUFBUTtBQUFBLFlBQ2QsUUFBUSxPQUFPLFNBQVMsQ0FBQztBQUFBLFlBQ3pCLGVBQWU7QUFBQSxVQUNuQjtBQUFBLFFBQ0o7QUFBQSxRQUVBLFVBQVUsV0FBWTtBQUNsQixpQkFBTyxLQUFLLFVBQVUsS0FBSyxPQUFPLEdBQUcsTUFBTSxHQUFJO0FBQUEsUUFDbkQ7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ2hJQTtBQUFBO0FBQUEsWUFBUSxjQUFjO0FBQ3RCLFlBQVEsYUFBYTtBQUFBO0FBQUE7OztBQ0RyQjtBQUFBO0FBQUEsWUFBTyxVQUFVLFNBQXFCLE9BQU87QUFDekMsVUFBSSxPQUFPLFFBQVE7QUFFbkIsVUFBSSxPQUFPLEVBQUUsV0FBWSxVQUFTLE1BQU0sU0FBUyxJQUFJLElBQUksS0FBSyxLQUFLO0FBRW5FLGFBQU87QUFBQSxRQUNILFNBQVMsV0FBWTtBQUNqQixpQkFBTyxLQUFLLGVBQWUsT0FBTyxJQUFJO0FBQUEsUUFDMUM7QUFBQSxRQUVBLGNBQWMsU0FBdUIsVUFBVTtBQUMzQyxjQUFJLE1BQU0sS0FBSyxpQkFBaUIsSUFBSSxHQUNoQyxRQUFRLENBQUMsR0FDVCxRQUFRO0FBQ1osY0FBSSxHQUFHLFFBQVEsU0FBVSxNQUFNO0FBQzNCLGtCQUFNLEtBQUssSUFBSTtBQUNmLHFCQUFTLEtBQUs7QUFBQSxVQUNsQixDQUFDO0FBQ0QsY0FBSSxHQUFHLE9BQU8sV0FBWTtBQUN0QixnQkFBSSxNQUFNLE9BQU8sTUFBTSxLQUFLLEdBQ3hCLFVBQVU7QUFDZCxnQkFBSSxLQUFLLENBQUM7QUFDVixxQkFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxrQkFBSSxPQUFPLE1BQU07QUFDakIsbUJBQUssS0FBSyxLQUFLLE9BQU87QUFDdEIseUJBQVcsS0FBSztBQUFBLFlBQ3BCO0FBQ0Esd0JBQVksU0FBUyxHQUFHO0FBQUEsVUFDNUIsQ0FBQztBQUNELGNBQUksSUFBSSxLQUFLO0FBQUEsUUFDakI7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ2hDQTtBQUFBO0FBQUEsWUFBTyxVQUFVLFNBQXFCLE9BQU87QUFDekMsVUFBSSxPQUFPLFFBQVE7QUFFbkIsYUFBTztBQUFBLFFBQ0gsU0FBUyxXQUFZO0FBQ2pCLGlCQUFPLEtBQUssZUFBZSxLQUFLO0FBQUEsUUFDcEM7QUFBQSxRQUVBLGNBQWMsU0FBdUIsVUFBVTtBQUMzQyxjQUFJLE1BQU0sS0FBSyxpQkFBaUIsR0FDNUIsUUFBUSxDQUFDLEdBQ1QsUUFBUTtBQUNaLGNBQUksR0FBRyxRQUFRLFNBQVUsTUFBTTtBQUMzQixrQkFBTSxLQUFLLElBQUk7QUFDZixxQkFBUyxLQUFLO0FBQUEsVUFDbEIsQ0FBQztBQUNELGNBQUksR0FBRyxPQUFPLFdBQVk7QUFDdEIsZ0JBQUksTUFBTSxPQUFPLE1BQU0sS0FBSyxHQUN4QixVQUFVO0FBQ2QsZ0JBQUksS0FBSyxDQUFDO0FBQ1YscUJBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsa0JBQUksT0FBTyxNQUFNO0FBQ2pCLG1CQUFLLEtBQUssS0FBSyxPQUFPO0FBQ3RCLHlCQUFXLEtBQUs7QUFBQSxZQUNwQjtBQUNBLHdCQUFZLFNBQVMsR0FBRztBQUFBLFVBQzVCLENBQUM7QUFDRCxjQUFJLElBQUksS0FBSztBQUFBLFFBQ2pCO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUM5QkE7QUFBQTtBQUFBO0FBSUEsUUFBTSxFQUFFLG1CQUFtQixRQUFRO0FBR25DLFFBQU0sV0FBVyxJQUFJLFlBQVksR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLFFBQVE7QUFDbEQsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFDeEIsWUFBSSxBQUFPLE9BQU0sT0FBYixHQUFpQjtBQUNqQixnQkFBTyxRQUFRLElBQUs7QUFBQSxRQUN4QixPQUFPO0FBQ0gsbUJBQVM7QUFBQSxRQUNiO0FBQUEsTUFDSjtBQUNBLGFBQU8sUUFBUTtBQUFBLElBQ25CLENBQUM7QUFHRCxRQUFNLE9BQU8sQ0FBQyxHQUFHLE1BQU0sS0FBSyxLQUFLLEdBQUcsQ0FBQyxNQUFNO0FBRzNDLFFBQU0sY0FBYyxDQUFDLFFBQVEsU0FBUztBQUNsQyxhQUFPLFNBQVUsVUFBUyxRQUFRLE9BQVMsV0FBVztBQUFBLElBQzFEO0FBR0EsUUFBTSxVQUFVLE1BQU07QUFDbEIsVUFBSSxBQUFlLE9BQU8sbUJBQXRCLFlBQXNDO0FBQ3RDLGVBQU8sZUFBZSxPQUFPLE1BQU0sRUFBRSxDQUFDO0FBQUEsTUFDMUMsT0FBTztBQUVILGVBQU8sUUFBUSxLQUFLO0FBQUEsTUFDeEI7QUFBQSxJQUNKO0FBR0EsWUFBUSxPQUFPLE1BQU07QUFDakIsWUFBTSxPQUFPLE9BQU8sTUFBTSxFQUFFO0FBQzVCLFlBQU0sTUFBTSxLQUFLO0FBQ2pCLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSztBQUFLLGFBQUssS0FBTSxLQUFLLE9BQU8sSUFBSSxNQUFPO0FBQ2hFLGFBQU87QUFBQSxJQUNYO0FBR0EsUUFBTSxTQUFTO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFHQSxzQkFBa0IsSUFBSTtBQUNsQixZQUFNLE9BQU8sT0FBTyxTQUFTLEVBQUUsSUFBSSxLQUFLLE9BQU8sS0FBSyxFQUFFO0FBQ3RELFdBQUssT0FBTyxJQUFJLFlBQVksQ0FBQyxXQUFZLFdBQVksU0FBVSxDQUFDO0FBQ2hFLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDbEMsYUFBSyxXQUFXLEtBQUssRUFBRTtBQUFBLE1BQzNCO0FBQUEsSUFDSjtBQUVBLGFBQVMsVUFBVSxhQUFhLFNBQVUsV0FBVztBQUNqRCxZQUFNLE9BQU8sS0FBSztBQUNsQixXQUFLLEtBQUssWUFBWSxLQUFLLElBQUksU0FBUztBQUN4QyxXQUFLLE1BQU0sS0FBSyxLQUFLO0FBQ3JCLFdBQUssS0FBSyxLQUFLLEtBQUssSUFBSSxTQUFTLElBQUk7QUFDckMsV0FBSyxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssT0FBTyxFQUFFO0FBQzdDLGFBQU87QUFBQSxJQUNYO0FBRUEsYUFBUyxVQUFVLE9BQU8sV0FBWTtBQUNsQyxZQUFNLElBQUssTUFBSyxLQUFLLEtBQUssT0FBTztBQUNqQyxhQUFRLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFLO0FBQUEsSUFDbkM7QUFFQSw0QkFBbUMsS0FBSztBQUVwQyxZQUFNLE9BQU8sSUFBSSxTQUFTLEdBQUc7QUFHN0IsYUFBTyxTQUFxQixNQUFNO0FBRTlCLGNBQU0sU0FBUyxPQUFPLE1BQU0sS0FBSyxNQUFNO0FBQ3ZDLFlBQUksTUFBTTtBQUVWLGlCQUFTLEtBQUssTUFBTTtBQUdoQixpQkFBTyxTQUFTLEtBQUssV0FBVyxJQUFJLEtBQUssS0FBSyxDQUFDO0FBQUEsUUFDbkQ7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFFQSw0QkFBbUMsS0FBSztBQUVwQyxZQUFNLE9BQU8sSUFBSSxTQUFTLEdBQUc7QUFHN0IsYUFBTyxTQUFxQixNQUFpQixRQUFxQixNQUFNLEdBQUc7QUFFdkUsWUFBSSxDQUFDO0FBQVEsbUJBQVMsT0FBTyxNQUFNLEtBQUssTUFBTTtBQUU5QyxpQkFBUyxLQUFLLE1BQU07QUFDaEIsZ0JBQU0sSUFBSSxLQUFLLEtBQUs7QUFDcEIsaUJBQU8sU0FBUyxJQUFJO0FBQ3BCLGVBQUssV0FBVyxDQUFDO0FBQUEsUUFDckI7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFFQSxxQkFBNEIsTUFBaUIsUUFBMkIsS0FBSztBQUN6RSxVQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sU0FBUyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUk7QUFDckQsZUFBTyxPQUFPLE1BQU0sQ0FBQztBQUFBLE1BQ3pCO0FBR0EsWUFBTSxZQUFZLGVBQWUsR0FBRztBQUdwQyxZQUFNLE9BQU8sVUFBVSxLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFHeEMsVUFBSSxLQUFLLFFBQVEsT0FBTyxRQUFRLElBQUk7QUFDaEMsY0FBTTtBQUFBLE1BQ1Y7QUFHQSxhQUFPLFVBQVUsS0FBSyxNQUFNLEVBQUUsQ0FBQztBQUFBLElBQ25DO0FBR0EscUJBQWlCLE1BQU07QUFDbkIsVUFBSSxPQUFPLFNBQVMsSUFBSSxLQUFLLEtBQUssVUFBVSxJQUFJO0FBRTVDLGVBQU8sVUFBVSxXQUFZO0FBQ3pCLGlCQUFPLEtBQUssTUFBTSxHQUFHLEVBQUU7QUFBQSxRQUMzQjtBQUFBLE1BQ0osV0FBVyxTQUFTLFFBQVE7QUFFeEIsZUFBTyxVQUFVLFFBQVE7QUFBQSxNQUM3QixPQUFPO0FBRUgsZUFBTyxVQUFVO0FBQUEsTUFDckI7QUFBQSxJQUNKO0FBRUEscUJBQTRCLE1BQWlCLFFBQTJCLEtBQWlCLFVBQVUsT0FBTztBQUV0RyxVQUFJLFFBQVE7QUFBTSxlQUFPLE9BQU8sTUFBTSxDQUFDO0FBRXZDLFVBQUksQ0FBQyxPQUFPLFNBQVMsSUFBSTtBQUFHLGVBQU8sT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBRzlELFlBQU0sWUFBWSxlQUFlLEdBQUc7QUFHcEMsWUFBTSxPQUFPLE9BQU8sUUFBUTtBQUM1QixXQUFLLE1BQU8sT0FBTyxRQUFRLEtBQU07QUFHakMsVUFBSTtBQUFTLGFBQUssTUFBTyxPQUFPLFFBQVEsS0FBTTtBQUc5QyxZQUFNLFNBQVMsT0FBTyxNQUFNLEtBQUssU0FBUyxFQUFFO0FBQzVDLGdCQUFVLE1BQU0sTUFBTTtBQUd0QixhQUFPLFVBQVUsTUFBTSxRQUFRLEVBQUU7QUFBQSxJQUNyQztBQUVBLFlBQU8sVUFBVSxFQUFFLFNBQVMsU0FBUyxRQUFRO0FBQUE7QUFBQTs7O0FDeks3QztBQUFBO0FBQUEsWUFBUSxXQUFXO0FBQ25CLFlBQVEsV0FBVztBQUNuQixZQUFRLFlBQVk7QUFBQTtBQUFBOzs7QUNGcEI7QUFBQTtBQUFBLFFBQUksU0FBUTtBQUFaLFFBQ0ksVUFBVTtBQURkLFFBRUksWUFBWSxPQUFNO0FBRnRCLFFBR0ksVUFBVTtBQUVkLFlBQU8sVUFBVSxTQUFxQixPQUFPO0FBQ3pDLFVBQUksZUFBZSxJQUFJLFFBQVEsWUFBWSxHQUN2QyxhQUFhLE9BQU8sTUFBTSxDQUFDLEdBQzNCLFdBQVcsT0FBTyxNQUFNLENBQUMsR0FDekIsZUFBZSxPQUNmLG1CQUFtQixNQUNuQixTQUFTLE9BQU8sTUFBTSxDQUFDO0FBRTNCLDBDQUFvQztBQUNoQyxZQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFDbkMsaUJBQU8sT0FBTyxNQUFNLENBQUM7QUFBQSxRQUN6QjtBQUNBLHFCQUFhLHlCQUF5QixLQUFLO0FBQzNDLGVBQU8sTUFBTSxNQUFNLGFBQWEsZ0JBQWdCLGFBQWEsaUJBQWlCLGFBQWEsY0FBYztBQUFBLE1BQzdHO0FBRUEsdUJBQWlCLE1BQU07QUFFbkIsWUFBSyxjQUFhLFFBQVEsT0FBUyxHQUFLO0FBQ3BDLGNBQUksT0FBTSxNQUFNLElBQUksTUFBTSxhQUFhLFdBQVcsS0FBSztBQUNuRCxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKLE9BQU87QUFBQSxRQUlQO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFFQSwwQkFBZ0MsT0FBb0IsVUFBNkIsTUFBTTtBQUNuRixZQUFJLE9BQU8sYUFBYSxlQUFlLE9BQU8sVUFBVSxVQUFVO0FBQzlELGlCQUFPO0FBQ1Asa0JBQVE7QUFBQSxRQUNaO0FBQ0EsWUFBSSxjQUFjO0FBQ2QsY0FBSSxTQUFTLFVBQVU7QUFDbkIscUJBQVMsT0FBTyxNQUFNLENBQUMsR0FBRyxPQUFNLE9BQU8sdUJBQXVCO0FBQUEsVUFDbEU7QUFDQSxpQkFBTyxPQUFPLE1BQU0sQ0FBQztBQUFBLFFBQ3pCO0FBRUEsWUFBSSxpQkFBaUIseUJBQXlCO0FBRTlDLFlBQUksZUFBZSxXQUFXLEdBQUc7QUFFN0IsY0FBSSxTQUFTO0FBQVUscUJBQVMsY0FBYztBQUM5QyxpQkFBTztBQUFBLFFBQ1g7QUFFQSxZQUFJLGFBQWEsV0FBVztBQUN4QixjQUFJLEFBQWEsT0FBTyxTQUFwQixZQUE0QixDQUFDLE9BQU8sU0FBUyxJQUFJLEdBQUc7QUFDcEQsa0JBQU0sSUFBSSxNQUFNLDBDQUEwQztBQUFBLFVBQzlEO0FBQ0EsMkJBQWlCLFFBQVEsVUFBVSxRQUFRLGdCQUFnQixjQUFjLElBQUk7QUFBQSxRQUNqRjtBQUVBLFlBQUksT0FBTyxPQUFPLE1BQU0sYUFBYSxJQUFJO0FBRXpDLGdCQUFRLGFBQWE7QUFBQSxlQUNaLE9BQU0sVUFBVTtBQUNqQiwyQkFBZSxLQUFLLElBQUk7QUFDeEIsZ0JBQUksQ0FBQyxRQUFRLElBQUksR0FBRztBQUNoQixrQkFBSSxTQUFTO0FBQVUseUJBQVMsTUFBTSxPQUFNLE9BQU8sT0FBTztBQUMxRCxvQkFBTSxJQUFJLE1BQU0sT0FBTSxPQUFPLE9BQU87QUFBQSxZQUN4QyxPQUFPO0FBRUgsa0JBQUksU0FBUztBQUFVLHlCQUFTLElBQUk7QUFDcEMscUJBQU87QUFBQSxZQUNYO0FBQUEsZUFDQyxPQUFNLFVBQVU7QUFDakIsZ0JBQUksV0FBVyxJQUFJLFFBQVEsU0FBUyxjQUFjO0FBQ2xELGdCQUFJLENBQUMsT0FBTztBQUNSLG9CQUFNLFNBQVMsU0FBUyxRQUFRLElBQUk7QUFDcEMscUJBQU8sS0FBSyxNQUFNLENBQUM7QUFDbkIsa0JBQUksQ0FBQyxRQUFRLElBQUksR0FBRztBQUNoQixzQkFBTSxJQUFJLE1BQU0sT0FBTSxPQUFPLFVBQVUsTUFBTSxXQUFXLFNBQVMsQ0FBQztBQUFBLGNBQ3RFO0FBQ0EscUJBQU87QUFBQSxZQUNYLE9BQU87QUFDSCx1QkFBUyxhQUFhLFNBQVUsUUFBUTtBQUNwQyx1QkFBTyxLQUFLLFFBQVEsQ0FBQztBQUNyQixvQkFBSSxVQUFVO0FBQ1Ysc0JBQUksQ0FBQyxRQUFRLE1BQU0sR0FBRztBQUNsQiw2QkFBUyxRQUFRLE9BQU0sT0FBTyxPQUFPO0FBQUEsa0JBQ3pDLE9BQU87QUFDSCw2QkFBUyxNQUFNO0FBQUEsa0JBQ25CO0FBQUEsZ0JBQ0o7QUFBQSxjQUNKLENBQUM7QUFBQSxZQUNMO0FBQ0E7QUFBQTtBQUVBLGdCQUFJLFNBQVM7QUFBVSx1QkFBUyxPQUFPLE1BQU0sQ0FBQyxHQUFHLE9BQU0sT0FBTyxjQUFjO0FBQzVFLGtCQUFNLElBQUksTUFBTSxPQUFNLE9BQU8sY0FBYztBQUFBO0FBQUEsTUFFdkQ7QUFFQSx3QkFBOEIsT0FBb0IsVUFBVTtBQUN4RCxZQUFLLEVBQUMsb0JBQW9CLENBQUMsaUJBQWlCLFdBQVcsT0FBTyxTQUFTLEtBQUssR0FBRztBQUUzRSxjQUFJLFNBQVM7QUFBVSxxQkFBUyx5QkFBeUIsQ0FBQztBQUMxRCxpQkFBTyx5QkFBeUI7QUFBQSxRQUNwQztBQUVBLFlBQUksaUJBQWlCLFVBQVUsQ0FBQyxjQUFjO0FBQzFDLGNBQUk7QUFFSixrQkFBUSxhQUFhO0FBQUEsaUJBQ1osT0FBTSxVQUFVO0FBQ2pCLDJCQUFhLGlCQUFpQixhQUFhO0FBRTNDLCtCQUFpQixPQUFPLE1BQU0saUJBQWlCLE1BQU07QUFDckQsK0JBQWlCLEtBQUssY0FBYztBQUVwQyxrQkFBSSxTQUFTO0FBQVUseUJBQVMsY0FBYztBQUM5QyxxQkFBTztBQUFBO0FBQUEsaUJBRU4sT0FBTSxVQUFVO0FBQ2pCLGtCQUFJLFdBQVcsSUFBSSxRQUFRLFNBQVMsZ0JBQWdCO0FBQ3BELGtCQUFJLENBQUMsT0FBTztBQUNSLG9CQUFJLFdBQVcsU0FBUyxRQUFRO0FBQ2hDLDZCQUFhLGlCQUFpQixTQUFTO0FBQ3ZDLHVCQUFPO0FBQUEsY0FDWCxPQUFPO0FBQ0gseUJBQVMsYUFBYSxTQUFVLE1BQU07QUFDbEMsbUNBQWlCLE9BQU8sTUFBTSxLQUFLLE1BQU07QUFDekMsK0JBQWEsaUJBQWlCLEtBQUs7QUFDbkMsdUJBQUssS0FBSyxjQUFjO0FBQ3hCLDhCQUFZLFNBQVMsY0FBYztBQUFBLGdCQUN2QyxDQUFDO0FBQUEsY0FDTDtBQUNBLHlCQUFXO0FBQ1g7QUFBQTtBQUFBLFFBRVosV0FBVyxTQUFTLFVBQVU7QUFDMUIsbUJBQVMsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUFBLFFBQzVCLE9BQU87QUFDSCxpQkFBTyxPQUFPLE1BQU0sQ0FBQztBQUFBLFFBQ3pCO0FBQUEsTUFDSjtBQUVBLDRCQUFzQixRQUFRLFFBQVE7QUFDbEMsZUFBUSxRQUFPLGFBQWEsU0FBUyxDQUFDLEtBQUssS0FBSyxPQUFPLGFBQWEsTUFBTTtBQUFBLE1BQzlFO0FBRUEsMEJBQW9CLE1BQU07QUFDdEIsWUFBSSxTQUFTO0FBQ2IsWUFBSSxXQUFXLE1BQU07QUFDckIsZUFBTyxTQUFTLEtBQUssUUFBUTtBQUN6QixzQkFBWSxLQUFLLGFBQWEsTUFBTTtBQUNwQyxvQkFBVTtBQUNWLGlCQUFPLEtBQUssYUFBYSxNQUFNO0FBQy9CLG9CQUFVO0FBQ1YsaUJBQU8sS0FBSyxNQUFNLFFBQVEsU0FBUyxJQUFJO0FBQ3ZDLG9CQUFVO0FBQ1YsY0FBSSxVQUFVLGFBQWEsV0FBVztBQUNsQywwQ0FBOEIsSUFBSTtBQUFBLFVBQ3RDO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFHQSw2Q0FBdUMsTUFBTTtBQUN6QyxZQUFJLE1BQU0sZ0JBQWdCLFFBQVE7QUFFbEMsWUFBSSxLQUFLLFVBQVUsVUFBVSxnQkFBZ0I7QUFDekMsaUJBQU8sYUFBYSxNQUFNLFVBQVUsZ0JBQWdCO0FBQ3BELGNBQUksYUFBYSxTQUFTLFVBQVUsZ0JBQWdCO0FBQ2hELHlCQUFhLE9BQU87QUFBQSxVQUN4QjtBQUFBLFFBQ0o7QUFDQSxZQUFJLEtBQUssVUFBVSxVQUFVLGNBQWM7QUFDdkMsMkJBQWlCLGFBQWEsTUFBTSxVQUFVLGNBQWM7QUFDNUQsY0FBSSxhQUFhLG1CQUFtQixVQUFVLGdCQUFnQjtBQUMxRCx5QkFBYSxpQkFBaUI7QUFBQSxVQUNsQztBQUFBLFFBQ0o7QUFDQSxZQUFJLEtBQUssVUFBVSxVQUFVLGNBQWM7QUFDdkMsbUJBQVMsYUFBYSxNQUFNLFVBQVUsWUFBWTtBQUNsRCxjQUFJLGFBQWEsV0FBVyxVQUFVLGdCQUFnQjtBQUNsRCx5QkFBYSxTQUFTO0FBQUEsVUFDMUI7QUFBQSxRQUNKO0FBQ0EsWUFBSSxLQUFLLFVBQVUsVUFBVSxlQUFlLEdBQUc7QUFDM0MseUJBQWUsS0FBSyxhQUFhLFVBQVUsWUFBWTtBQUN2RCxjQUFJLGFBQWEsaUJBQWlCLFVBQVUsZ0JBQWdCO0FBQ3hELHlCQUFhLGVBQWU7QUFBQSxVQUNoQztBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsYUFBTztBQUFBLFFBQ0gsSUFBSSxZQUFZO0FBQ1osaUJBQU8sV0FBVyxTQUFTO0FBQUEsUUFDL0I7QUFBQSxRQUNBLElBQUksZUFBZTtBQUNmLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsSUFBSSxVQUFVLEtBQUs7QUFDZix1QkFBYSxPQUFNLFNBQVMsR0FBRztBQUMvQixjQUFJLFdBQVcsV0FBVyxXQUFXLFNBQVM7QUFDOUMseUJBQWUsYUFBYSxNQUFNLGFBQWE7QUFDL0MsdUJBQWEsaUJBQWlCLFdBQVc7QUFBQSxRQUM3QztBQUFBLFFBRUEsSUFBSSxRQUFRO0FBQ1IsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxJQUFJLE1BQU0sS0FBSztBQUNYLG1CQUFTO0FBQ1QsdUJBQWEsY0FBYyxJQUFJO0FBQy9CLHFCQUFXLEdBQUc7QUFBQSxRQUNsQjtBQUFBLFFBRUEsSUFBSSxVQUFVO0FBQ1YsaUJBQU8sU0FBUyxTQUFTO0FBQUEsUUFDN0I7QUFBQSxRQUNBLElBQUksUUFBUSxLQUFLO0FBQ2IscUJBQVcsT0FBTSxTQUFTLEdBQUc7QUFDN0IsdUJBQWEsZ0JBQWdCLFNBQVM7QUFBQSxRQUMxQztBQUFBLFFBRUEsSUFBSSxPQUFPO0FBQ1AsY0FBSSxJQUFJLFdBQVcsU0FBUztBQUM1QixpQkFBTyxlQUNELEVBQ0ssT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUNuQixNQUFNLEdBQUcsRUFDVCxJQUFJLElBQ1QsRUFBRSxNQUFNLEdBQUcsRUFBRSxJQUFJO0FBQUEsUUFDM0I7QUFBQSxRQUNBLElBQUksY0FBYztBQUNkLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBRUEsbUJBQW1CLFdBQVk7QUFDM0IsaUJBQU8sU0FBUyxPQUFPLElBQUk7QUFBQSxRQUMvQjtBQUFBLFFBRUEsd0JBQXdCLFNBQXVCLFVBQVU7QUFDckQsbUJBQVMsTUFBTSxRQUFRO0FBQUEsUUFDM0I7QUFBQSxRQUVBLFNBQVMsU0FBVSxPQUFPO0FBQ3RCLDZCQUFtQixPQUFNLFNBQVMsS0FBSztBQUN2QyxjQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixRQUFRO0FBQzFDLHlCQUFhLE9BQU8saUJBQWlCO0FBQ3JDLHlCQUFhLFNBQVMsT0FBTSxVQUFVO0FBQ3RDLHlCQUFhLE1BQU0sT0FBTSxNQUFNLEtBQUs7QUFDcEMseUJBQWEsVUFBVTtBQUFBLFVBQzNCLE9BQU87QUFFSCx5QkFBYSxTQUFTLE9BQU0sVUFBVTtBQUFBLFVBQzFDO0FBQUEsUUFDSjtBQUFBLFFBRUEsU0FBUyxTQUFVLE1BQU07QUFDckIsY0FBSSxhQUFhLFNBQVM7QUFDdEIsbUJBQU87QUFBQSxVQUNYLE9BQU87QUFDSCxtQkFBTyxXQUFXLE9BQU8sTUFBTSxJQUFJO0FBQUEsVUFDdkM7QUFBQSxRQUNKO0FBQUEsUUFFQSxjQUFjLFNBQXVCLFVBQVUsTUFBTTtBQUNqRCxjQUFJLGFBQWEsU0FBUztBQUN0QixxQkFBUyxnQkFBZ0I7QUFBQSxVQUM3QixPQUFPO0FBQ0gsdUJBQVcsTUFBTSxVQUFVLElBQUk7QUFBQSxVQUNuQztBQUFBLFFBQ0o7QUFBQSxRQUVBLElBQUksS0FBSyxNQUFNO0FBQ1gsdUJBQWEsT0FBTztBQUFBLFFBQ3hCO0FBQUEsUUFDQSxJQUFJLE9BQU87QUFDUCxpQkFBTyxhQUFhO0FBQUEsUUFDeEI7QUFBQSxRQUVBLElBQUksT0FBa0IsTUFBTTtBQUN4Qix1QkFBYSxlQUFlLElBQUk7QUFBQSxRQUNwQztBQUFBLFFBRUEsSUFBSSxTQUFTO0FBQ1QsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFFQSxZQUFZLFdBQVk7QUFFcEIsY0FBSSxTQUFTLGFBQWEsb0JBQW9CO0FBQzlDLGNBQUksU0FBUyxPQUFNLFVBQVU7QUFFN0IscUJBQVcsS0FBSyxRQUFRLE1BQU07QUFDOUIsb0JBQVUsV0FBVztBQUVyQixjQUFJLGFBQWEsYUFBYTtBQUMxQixtQkFBTyxLQUFLLFFBQVEsTUFBTTtBQUMxQixzQkFBVSxhQUFhO0FBQUEsVUFDM0I7QUFFQSxjQUFJLGFBQWEsZUFBZTtBQUM1QixxQkFBUyxLQUFLLFFBQVEsTUFBTTtBQUFBLFVBQ2hDO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFFQSxRQUFRLFdBQVk7QUFDaEIsZ0JBQU0sUUFBUSxTQUFVLElBQUk7QUFDeEIsbUJBQU8sTUFBUSxPQUFNLEdBQUcsU0FBUyxtQkFBb0IsVUFBVTtBQUFBLFVBQ25FO0FBRUEsaUJBQU87QUFBQSxZQUNILFdBQVcsS0FBSztBQUFBLFlBQ2hCLE1BQU0sS0FBSztBQUFBLFlBQ1gsU0FBUyxLQUFLO0FBQUEsWUFDZCxhQUFhLEtBQUs7QUFBQSxZQUNsQixRQUFRLGFBQWEsT0FBTztBQUFBLFlBQzVCLGdCQUFnQixNQUFNLEtBQUs7QUFBQSxZQUMzQixNQUFNLE1BQU0sZ0JBQWdCO0FBQUEsVUFDaEM7QUFBQSxRQUNKO0FBQUEsUUFFQSxVQUFVLFdBQVk7QUFDbEIsaUJBQU8sS0FBSyxVQUFVLEtBQUssT0FBTyxHQUFHLE1BQU0sR0FBSTtBQUFBLFFBQ25EO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUM1VUE7QUFBQTtBQUFBLFFBQU0sV0FBVztBQUNqQixRQUFNLFVBQVU7QUFDaEIsUUFBTSxTQUFRO0FBRWQsWUFBTyxVQUFVLFNBQTBCLFVBQXdCLFNBQVM7QUFDeEUsVUFBSSxZQUFZLENBQUMsR0FDYixhQUFhLENBQUMsR0FDZCxXQUFXLE9BQU8sTUFBTSxDQUFDLEdBQ3pCLGFBQWEsSUFBSSxRQUFRLFdBQVcsR0FDcEMsZ0JBQWdCO0FBR3BCLFlBQU0sT0FBTyxPQUFPLE9BQU8sdUJBQU8sT0FBTyxJQUFJLEdBQUcsT0FBTztBQUV2RCxZQUFNLEVBQUUsV0FBVztBQUVuQixVQUFJLFVBQVU7QUFFVix1QkFBZSxLQUFLLFdBQVc7QUFBQSxNQUNuQyxPQUFPO0FBRUgsd0JBQWdCO0FBQUEsTUFDcEI7QUFFQSw4QkFBd0IsVUFBVTtBQUM5QixjQUFNLGVBQWUsV0FBVztBQUNoQyxZQUFJLFFBQVEsV0FBVztBQUV2QixpQkFBUyxJQUFJLEdBQUcsSUFBSSxjQUFjLEtBQUs7QUFDbkMsY0FBSSxNQUFNO0FBQ1YsZ0JBQU0sUUFBUSxJQUFJLFNBQVMsUUFBUTtBQUVuQyxnQkFBTSxTQUFTLFNBQVMsTUFBTSxLQUFNLE9BQU8sT0FBTSxVQUFVLE1BQU87QUFDbEUsZ0JBQU0sWUFBWSxTQUFTLE1BQU0sS0FBTSxPQUFPLE1BQU0sT0FBTyxjQUFlO0FBRTFFLG1CQUFTLE1BQU0sT0FBTztBQUV0QixtQkFBUyxLQUFLO0FBQUEsUUFDbEI7QUFBQSxNQUNKO0FBRUEsNkJBQXVCO0FBQ25CLHdCQUFnQjtBQUNoQixxQkFBYSxDQUFDO0FBQ2Qsb0JBQVksSUFBSSxNQUFNLFdBQVcsV0FBVztBQUM1QyxZQUFJLFFBQVEsV0FBVztBQUN2QixpQkFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUN2QyxjQUFJLE1BQU0sT0FDTixRQUFRLElBQUksU0FBUyxRQUFRO0FBQ2pDLGdCQUFNLFNBQVMsU0FBUyxNQUFNLEtBQU0sT0FBTyxPQUFNLFVBQVUsTUFBTztBQUVsRSxnQkFBTSxZQUFZLFNBQVMsTUFBTSxLQUFNLE9BQU8sTUFBTSxPQUFPLGNBQWU7QUFFMUUsY0FBSSxNQUFNLE9BQU8sYUFBYTtBQUMxQixrQkFBTSxRQUFRLFNBQVMsTUFBTSxLQUFNLE9BQU8sTUFBTSxPQUFPLFdBQVk7QUFBQSxVQUN2RTtBQUVBLGNBQUksTUFBTSxPQUFPO0FBQWUsa0JBQU0sVUFBVSxTQUFTLE1BQU0sS0FBSyxNQUFNLE1BQU0sT0FBTyxhQUFhO0FBRXBHLG1CQUFTLE1BQU0sT0FBTztBQUV0QixvQkFBVSxLQUFLO0FBQ2YscUJBQVcsTUFBTSxhQUFhO0FBQUEsUUFDbEM7QUFBQSxNQUNKO0FBRUEsOEJBQW9DLFNBQVM7QUFDekMsWUFBSSxJQUFJLFNBQVMsU0FBUyxPQUFNLFVBQVUsUUFDdEMsTUFBTSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQU0sR0FDNUIsSUFBSSxLQUNKLFdBQVcsU0FBUyxRQUNwQixZQUFZLElBQ1osYUFBYTtBQUVqQixhQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDakIsY0FBSSxTQUFTLE9BQU87QUFBTTtBQUMxQixjQUFJLFNBQVMsYUFBYSxDQUFDLE1BQU0sT0FBTSxVQUFVLFFBQVE7QUFFckQsd0JBQVk7QUFDWix5QkFBYTtBQUNiLHVCQUFXLElBQUksT0FBTSxVQUFVO0FBRS9CLGdCQUFJLElBQUksT0FBTSxVQUFVO0FBQ3hCO0FBQUEsVUFDSjtBQUVBLGNBQUksU0FBUyxhQUFhLENBQUMsTUFBTSxPQUFNLFVBQVUsVUFBVTtBQUV2RCxnQkFBSTtBQUNKO0FBQUEsVUFDSjtBQUVBLGNBQUksU0FBUyxhQUFhLENBQUMsTUFBTSxPQUFNLFVBQVUsVUFBVTtBQUV2RCx3QkFBWTtBQUNaLHVCQUFXLElBQUksT0FBTSxnQkFBZ0IsVUFBVSxJQUFJLE9BQU0sVUFBVSxTQUFTLElBQUksT0FBTSxVQUFVO0FBQ2hHO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFFQSxZQUFJLENBQUMsQ0FBQztBQUFXLGdCQUFNLElBQUksTUFBTSxPQUFNLE9BQU8sY0FBYztBQUU1RCxtQkFBVyxlQUFlLFNBQVMsTUFBTSxXQUFXLFFBQVEsQ0FBQztBQUM3RCxZQUFJLFdBQVcsZUFBZTtBQUMxQixxQkFBVyxTQUFTLE1BQU0sYUFBYSxPQUFNLFVBQVUsTUFBTTtBQUFBLFFBQ2pFO0FBQ0EsWUFBSTtBQUFTLHNCQUFZO0FBQUEsTUFDN0I7QUFFQSw2QkFBdUI7QUFDbkIsWUFBSSxVQUFVLFNBQVMsS0FBSyxDQUFDLFFBQVE7QUFDakMsb0JBQVUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLFVBQVUsWUFBWSxFQUFFLGNBQWMsRUFBRSxVQUFVLFlBQVksQ0FBQyxDQUFDO0FBQUEsUUFDL0Y7QUFBQSxNQUNKO0FBRUEsYUFBTztBQUFBLFFBS0gsSUFBSSxVQUFVO0FBQ1YsY0FBSSxDQUFDLGVBQWU7QUFDaEIsd0JBQVk7QUFBQSxVQUNoQjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBTUEsSUFBSSxVQUFVO0FBQ1YsaUJBQU8sU0FBUyxTQUFTO0FBQUEsUUFDN0I7QUFBQSxRQUNBLElBQUksUUFBUSxLQUFLO0FBQ2IscUJBQVcsT0FBTSxTQUFTLEdBQUc7QUFDN0IscUJBQVcsZ0JBQWdCLFNBQVM7QUFBQSxRQUN4QztBQUFBLFFBRUEsZUFBZSxXQUFZO0FBQ3ZCLGNBQUksQ0FBQyxlQUFlO0FBQ2hCLG1CQUFPLFdBQVc7QUFBQSxVQUN0QjtBQUVBLGlCQUFPLFVBQVU7QUFBQSxRQUNyQjtBQUFBLFFBRUEsU0FBUyxTQUFVLFVBQVU7QUFDekIsY0FBSSxDQUFDLGVBQWU7QUFDaEIsMkJBQWUsUUFBUTtBQUN2QjtBQUFBLFVBQ0o7QUFFQSxvQkFBVSxRQUFRLFFBQVE7QUFBQSxRQUM5QjtBQUFBLFFBUUEsVUFBVSxTQUFxQixXQUFXO0FBQ3RDLGNBQUksQ0FBQyxlQUFlO0FBQ2hCLHdCQUFZO0FBQUEsVUFDaEI7QUFDQSxpQkFBTyxXQUFXLGNBQWM7QUFBQSxRQUNwQztBQUFBLFFBT0EsVUFBVSxTQUF1QixPQUFPO0FBQ3BDLGNBQUksQ0FBQyxlQUFlO0FBQ2hCLHdCQUFZO0FBQUEsVUFDaEI7QUFDQSxvQkFBVSxLQUFLLEtBQUs7QUFDcEIscUJBQVcsTUFBTSxhQUFhO0FBQzlCLHFCQUFXLGVBQWUsVUFBVTtBQUFBLFFBQ3hDO0FBQUEsUUFRQSxhQUFhLFNBQXFCLFdBQVc7QUFDekMsY0FBSSxDQUFDLGVBQWU7QUFDaEIsd0JBQVk7QUFBQSxVQUNoQjtBQUNBLGNBQUksUUFBUSxXQUFXO0FBQ3ZCLGNBQUksU0FBUyxNQUFNLGFBQWE7QUFDNUIsZ0JBQUksUUFBUTtBQUNaLGlCQUFLLGlCQUFpQixLQUFLLEVBQUUsUUFBUSxTQUFVLE9BQU87QUFDbEQsa0JBQUksTUFBTSxjQUFjLFdBQVc7QUFDL0Isc0JBQU0sWUFBWSxNQUFNLFNBQVM7QUFBQSxjQUNyQztBQUFBLFlBQ0osQ0FBQztBQUFBLFVBQ0w7QUFDQSxvQkFBVSxPQUFPLFVBQVUsUUFBUSxLQUFLLEdBQUcsQ0FBQztBQUM1QyxpQkFBTyxXQUFXO0FBQ2xCLHFCQUFXLGVBQWUsVUFBVTtBQUFBLFFBQ3hDO0FBQUEsUUFRQSxrQkFBa0IsU0FBdUIsT0FBTztBQUM1QyxjQUFJLENBQUMsZUFBZTtBQUNoQix3QkFBWTtBQUFBLFVBQ2hCO0FBQ0EsY0FBSSxTQUFTLE1BQU0sYUFBYTtBQUM1QixrQkFBTSxPQUFPLENBQUM7QUFDZCxrQkFBTSxPQUFPLE1BQU07QUFDbkIsa0JBQU0sTUFBTSxLQUFLO0FBRWpCLHNCQUFVLFFBQVEsU0FBVSxVQUFVO0FBQ2xDLGtCQUFJLFNBQVMsVUFBVSxPQUFPLEdBQUcsR0FBRyxNQUFNLE1BQU07QUFDNUMscUJBQUssS0FBSyxRQUFRO0FBQUEsY0FDdEI7QUFBQSxZQUNKLENBQUM7QUFDRCxtQkFBTztBQUFBLFVBQ1g7QUFDQSxpQkFBTyxDQUFDO0FBQUEsUUFDWjtBQUFBLFFBT0Esa0JBQWtCLFdBQVk7QUFDMUIsY0FBSSxDQUFDLGVBQWU7QUFDaEIsd0JBQVk7QUFBQSxVQUNoQjtBQUNBLHNCQUFZO0FBRVosZ0JBQU0sWUFBWSxDQUFDO0FBQ25CLGdCQUFNLGVBQWUsQ0FBQztBQUN0QixjQUFJLFlBQVk7QUFDaEIsY0FBSSxTQUFTO0FBRWIscUJBQVcsT0FBTztBQUNsQixxQkFBVyxTQUFTO0FBRXBCLHFCQUFXLFNBQVMsV0FBVztBQUUzQixrQkFBTSxpQkFBaUIsTUFBTSxrQkFBa0I7QUFFL0Msa0JBQU0sT0FBTyxTQUFTO0FBQ3RCLGtCQUFNLGFBQWEsTUFBTSxPQUFPLG1CQUFtQjtBQUNuRCxrQkFBTSxlQUFlLE1BQU0sYUFBYTtBQUV4QyxrQkFBTSxhQUFhLE9BQU8sTUFBTSxlQUFlLE1BQU0sTUFBTSxNQUFNO0FBQ2pFLGtCQUFNLGFBQWEsS0FBSyxZQUFZLENBQUM7QUFDckMsdUJBQVcsS0FBSyxNQUFNLE9BQU8sWUFBWTtBQUd6QyxrQkFBTSxhQUFhLFdBQVcsU0FBUyxXQUFXLFNBQVMsZUFBZTtBQUMxRSxzQkFBVTtBQUdWLHNCQUFVLEtBQUssVUFBVTtBQUN6QixzQkFBVSxLQUFLLFVBQVU7QUFDekIsc0JBQVUsS0FBSyxjQUFjO0FBRzdCLGtCQUFNLGNBQWMsTUFBTSxXQUFXO0FBQ3JDLHlCQUFhLEtBQUssV0FBVztBQUU3Qix1QkFBVyxRQUFRLFlBQVk7QUFDL0IseUJBQWEsYUFBYSxZQUFZO0FBQUEsVUFDMUM7QUFFQSx1QkFBYSxXQUFXO0FBRXhCLHFCQUFXLFNBQVM7QUFFcEIsbUJBQVM7QUFDVCxnQkFBTSxZQUFZLE9BQU8sTUFBTSxTQUFTO0FBRXhDLHFCQUFXLFdBQVcsV0FBVztBQUM3QixvQkFBUSxLQUFLLFdBQVcsTUFBTTtBQUM5QixzQkFBVSxRQUFRO0FBQUEsVUFDdEI7QUFHQSxxQkFBVyxXQUFXLGNBQWM7QUFDaEMsb0JBQVEsS0FBSyxXQUFXLE1BQU07QUFDOUIsc0JBQVUsUUFBUTtBQUFBLFVBQ3RCO0FBR0EsZ0JBQU0sS0FBSyxXQUFXLFNBQVM7QUFDL0IsY0FBSSxVQUFVO0FBQ1YscUJBQVMsS0FBSyxJQUFJLE9BQU0sVUFBVSxNQUFNO0FBQUEsVUFDNUM7QUFDQSxhQUFHLEtBQUssV0FBVyxNQUFNO0FBRXpCLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBRUEsZUFBZSxTQUF1QixXQUF3QixRQUFxQixhQUEwQixXQUFXO0FBQ3BILGNBQUk7QUFDQSxnQkFBSSxDQUFDLGVBQWU7QUFDaEIsMEJBQVk7QUFBQSxZQUNoQjtBQUNBLHdCQUFZO0FBRVosa0JBQU0sWUFBWSxDQUFDO0FBQ25CLGtCQUFNLGVBQWUsQ0FBQztBQUN0QixnQkFBSSxZQUFZO0FBQ2hCLGdCQUFJLFNBQVM7QUFFYix1QkFBVyxPQUFPO0FBQ2xCLHVCQUFXLFNBQVM7QUFFcEIsa0JBQU0sa0JBQWtCLFNBQVUsWUFBWTtBQUMxQyxrQkFBSSxXQUFXLFFBQVE7QUFDbkIsc0JBQU0sUUFBUSxXQUFXLElBQUk7QUFDN0Isc0JBQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxNQUFNLFNBQVM7QUFDcEQsb0JBQUk7QUFBYSw4QkFBWSxJQUFJO0FBQ2pDLHNCQUFNLHVCQUF1QixTQUFVLGdCQUFnQjtBQUNuRCxzQkFBSTtBQUFXLDhCQUFVLElBQUk7QUFFN0Isd0JBQU0sT0FBTyxTQUFTO0FBRXRCLHdCQUFNLGFBQWEsTUFBTSxPQUFPLG1CQUFtQjtBQUNuRCx3QkFBTSxhQUFhLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSTtBQUNqRCx3QkFBTSxhQUFhLFdBQVcsU0FBUyxXQUFXLFNBQVMsZUFBZTtBQUUxRSw0QkFBVTtBQUVWLDRCQUFVLEtBQUssVUFBVTtBQUN6Qiw0QkFBVSxLQUFLLFVBQVU7QUFDekIsNEJBQVUsS0FBSyxjQUFjO0FBRTdCLHdCQUFNLGNBQWMsTUFBTSxXQUFXO0FBQ3JDLCtCQUFhLEtBQUssV0FBVztBQUM3Qiw2QkFBVyxRQUFRLFlBQVk7QUFDL0IsK0JBQWEsYUFBYSxZQUFZO0FBRXRDLGtDQUFnQixVQUFVO0FBQUEsZ0JBQzlCLENBQUM7QUFBQSxjQUNMLE9BQU87QUFDSCw2QkFBYSxXQUFXO0FBRXhCLDJCQUFXLFNBQVM7QUFFcEIseUJBQVM7QUFDVCxzQkFBTSxZQUFZLE9BQU8sTUFBTSxTQUFTO0FBQ3hDLDBCQUFVLFFBQVEsU0FBVSxTQUFTO0FBQ2pDLDBCQUFRLEtBQUssV0FBVyxNQUFNO0FBQzlCLDRCQUFVLFFBQVE7QUFBQSxnQkFDdEIsQ0FBQztBQUNELDZCQUFhLFFBQVEsU0FBVSxTQUFTO0FBQ3BDLDBCQUFRLEtBQUssV0FBVyxNQUFNO0FBQzlCLDRCQUFVLFFBQVE7QUFBQSxnQkFDdEIsQ0FBQztBQUVELHNCQUFNLEtBQUssV0FBVyxTQUFTO0FBQy9CLG9CQUFJLFVBQVU7QUFDViwyQkFBUyxLQUFLLElBQUksT0FBTSxVQUFVLE1BQU07QUFBQSxnQkFDNUM7QUFFQSxtQkFBRyxLQUFLLFdBQVcsTUFBTTtBQUV6QiwwQkFBVSxTQUFTO0FBQUEsY0FDdkI7QUFBQSxZQUNKO0FBRUEsNEJBQWdCLFNBQVM7QUFBQSxVQUM3QixTQUFTLEdBQVA7QUFDRSxtQkFBTyxDQUFDO0FBQUEsVUFDWjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQy9YQTtBQUFBO0FBQUEsUUFBTSxTQUFRO0FBQ2QsUUFBTSxNQUFNLFFBQVE7QUFDcEIsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sVUFBVTtBQUVoQixRQUFNLFdBQVcsQ0FBQyxLQUFLLFFBQVMsT0FBTyxRQUFRLFlBQVksTUFBTTtBQUNqRSxRQUFNLFVBQVUsQ0FBQyxLQUFLLFFBQVMsT0FBTyxRQUFRLFdBQVcsTUFBTTtBQUUvRCxRQUFNLGlCQUFpQjtBQUFBLE1BRW5CLFFBQVE7QUFBQSxNQUVSLGFBQWE7QUFBQSxNQUViLFFBQVEsT0FBTSxVQUFVO0FBQUEsTUFFeEIsSUFBSTtBQUFBLElBQ1I7QUFFQSxZQUFPLFVBQVUsU0FBc0IsT0FBcUIsU0FBUztBQUNqRSxVQUFJLFdBQVc7QUFHZixZQUFNLE9BQU8sT0FBTyxPQUFPLHVCQUFPLE9BQU8sSUFBSSxHQUFHLGNBQWM7QUFHOUQsVUFBSSxTQUFTLEFBQWEsT0FBTyxVQUFwQixVQUEyQjtBQUVwQyxZQUFJLENBQUUsa0JBQWlCLGFBQWE7QUFDaEMsaUJBQU8sT0FBTyxNQUFNLEtBQUs7QUFDekIsa0JBQVEsS0FBSyxRQUFRLEtBQUssUUFBUTtBQUNsQyxjQUFJLEtBQUs7QUFBTyxtQkFBTyxLQUFLO0FBQUEsUUFDaEM7QUFHQSxZQUFJLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFDeEIscUJBQVc7QUFDWCxlQUFLLFNBQVMsT0FBTSxVQUFVO0FBQzlCLGtCQUFRO0FBQUEsUUFDWjtBQUFBLE1BQ0o7QUFHQSxhQUFPLE9BQU8sTUFBTSxPQUFPO0FBRzNCLFlBQU0sWUFBWSxJQUFJLE9BQU0sSUFBSTtBQUdoQyxVQUFJLFNBQVMsQUFBYSxPQUFPLFVBQXBCLFVBQTJCO0FBRXBDLFlBQUksVUFBVSxHQUFHLFdBQVcsS0FBSyxHQUFHO0FBQ2hDLGVBQUssU0FBUyxPQUFNLFVBQVU7QUFDOUIsZUFBSyxXQUFXO0FBQ2hCLHFCQUFXLFVBQVUsR0FBRyxhQUFhLEtBQUs7QUFBQSxRQUM5QyxPQUFPO0FBQ0gsZ0JBQU0sSUFBSSxNQUFNLE9BQU0sT0FBTyxnQkFBZ0I7QUFBQSxRQUNqRDtBQUFBLE1BQ0o7QUFHQSxZQUFNLE9BQU8sSUFBSSxRQUFRLFVBQVUsSUFBSTtBQUV2QyxZQUFNLEVBQUUsV0FBVyxhQUFhO0FBRWhDLHdCQUE4QixPQUFPO0FBQ2pDLFlBQUksU0FBUyxNQUFNO0FBQ2YsY0FBSTtBQUVKLGNBQUksT0FBTyxVQUFVO0FBQVUsbUJBQU8sS0FBSyxTQUFTLEtBQUs7QUFFekQsY0FBSSxPQUFPLFVBQVUsWUFBWSxPQUFPLE1BQU0sY0FBYyxlQUFlLE9BQU8sTUFBTSxXQUFXO0FBQWEsbUJBQU8sS0FBSyxTQUFTLE1BQU0sU0FBUztBQUVwSixjQUFJLE1BQU07QUFDTixtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFFQSx1QkFBaUIsU0FBUztBQUN0QixjQUFNLEVBQUUsYUFBTSxXQUFXLFFBQVEsSUFBSTtBQUVyQyxlQUFPLE1BQUssS0FBSyxVQUFVLE1BQU0sUUFBUSxNQUFNLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFBQSxNQUN6RTtBQUVBLGFBQU87QUFBQSxRQU9ILFVBQVUsU0FBc0IsT0FBMEIsTUFBTTtBQUM1RCxjQUFJLE9BQU8sU0FBUyxLQUFLO0FBQ3pCLGlCQUFRLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBTTtBQUFBLFFBQzNDO0FBQUEsUUFTQSxlQUFlLFNBQXNCLE9BQXFCLFVBQVU7QUFDaEUsY0FBSSxPQUFPLFNBQVMsS0FBSztBQUN6QixjQUFJLE1BQU07QUFDTixpQkFBSyxhQUFhLFFBQVE7QUFBQSxVQUM5QixPQUFPO0FBQ0gscUJBQVMsTUFBTSx5QkFBeUIsS0FBSztBQUFBLFVBQ2pEO0FBQUEsUUFDSjtBQUFBLFFBU0EsWUFBWSxTQUFzQixPQUFvQixVQUFVO0FBQzVELGNBQUksT0FBTyxTQUFTLEtBQUs7QUFDekIsY0FBSSxNQUFNO0FBQ04sZ0JBQUksT0FBTyxLQUFLLFFBQVE7QUFDeEIsZ0JBQUksUUFBUSxLQUFLLFFBQVE7QUFDckIscUJBQU8sS0FBSyxTQUFTLFlBQVksTUFBTTtBQUFBLFlBQzNDO0FBQUEsVUFDSjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBVUEsaUJBQWlCLFNBQXNCLE9BQXFCLFVBQXVCLFVBQVU7QUFDekYsY0FBSSxPQUFPLFNBQVMsS0FBSztBQUN6QixjQUFJLE1BQU07QUFDTixpQkFBSyxhQUFhLFNBQVUsTUFBTSxLQUFLO0FBQ25DLGtCQUFJLEtBQUs7QUFDTCx5QkFBUyxNQUFNLEdBQUc7QUFDbEI7QUFBQSxjQUNKO0FBRUEsa0JBQUksUUFBUSxLQUFLLFFBQVE7QUFDckIseUJBQVMsS0FBSyxTQUFTLFlBQVksTUFBTSxDQUFDO0FBQUEsY0FDOUMsT0FBTztBQUNILHlCQUFTLEVBQUU7QUFBQSxjQUNmO0FBQUEsWUFDSixDQUFDO0FBQUEsVUFDTCxPQUFPO0FBQ0gscUJBQVMsRUFBRTtBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFPQSxZQUFZLFNBQXNCLE9BQU87QUFFckMsY0FBSSxPQUFPLFNBQVMsS0FBSztBQUN6QixjQUFJLE1BQU07QUFDTixpQkFBSyxZQUFZLEtBQUssU0FBUztBQUFBLFVBQ25DO0FBQUEsUUFDSjtBQUFBLFFBT0EsZUFBZSxTQUFzQixTQUFTO0FBRTFDLGVBQUssVUFBVTtBQUFBLFFBQ25CO0FBQUEsUUFPQSxlQUFlLFdBQVk7QUFDdkIsaUJBQU8sS0FBSyxXQUFXO0FBQUEsUUFDM0I7QUFBQSxRQVNBLG9CQUFvQixTQUFzQixPQUFtQixTQUFTO0FBQ2xFLGNBQUksT0FBTyxTQUFTLEtBQUs7QUFDekIsY0FBSSxNQUFNO0FBQ04saUJBQUssVUFBVTtBQUFBLFVBQ25CO0FBQUEsUUFDSjtBQUFBLFFBUUEsb0JBQW9CLFNBQXNCLE9BQU87QUFDN0MsY0FBSSxPQUFPLFNBQVMsS0FBSztBQUN6QixjQUFJLE1BQU07QUFDTixtQkFBTyxLQUFLLFdBQVc7QUFBQSxVQUMzQjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBUUEsWUFBWSxTQUFzQixPQUFtQixTQUFTO0FBQzFELGNBQUksT0FBTyxTQUFTLEtBQUs7QUFDekIsY0FBSSxNQUFNO0FBQ04saUJBQUssUUFBUSxPQUFPO0FBQUEsVUFDeEI7QUFBQSxRQUNKO0FBQUEsUUFTQSxjQUFjLFNBQXNCLFdBQXdCLFNBQXNCLFNBQXFCLFNBQVM7QUFDNUcsY0FBSSxVQUFVLEdBQUcsV0FBVyxTQUFTLEdBQUc7QUFFcEMsc0JBQVUsVUFBVSxRQUFRLE9BQU8sSUFBSTtBQUd2QyxnQkFBSSxJQUFJLFVBQVUsTUFBTSxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsSUFBSTtBQUd2RCx1QkFBVyxVQUFVLFVBQVU7QUFHL0Isa0JBQU0sUUFBUSxVQUFVLEdBQUcsU0FBUyxTQUFTO0FBRzdDLGlCQUFLLFFBQVEsU0FBUyxVQUFVLEdBQUcsYUFBYSxTQUFTLEdBQUcsU0FBUyxLQUFLO0FBQUEsVUFDOUUsT0FBTztBQUNILGtCQUFNLElBQUksTUFBTSxPQUFNLE9BQU8sZUFBZSxRQUFRLE1BQU0sU0FBUyxDQUFDO0FBQUEsVUFDeEU7QUFBQSxRQUNKO0FBQUEsUUFVQSxnQkFBZ0IsU0FBc0IsV0FBd0IsU0FBK0IsUUFBUTtBQUVqRyxjQUFJLGtCQUFrQixRQUFRO0FBRTFCLHFCQUFVLFNBQVUsSUFBSTtBQUNwQixxQkFBTyxTQUFVLFVBQVU7QUFDdkIsdUJBQU8sR0FBRyxLQUFLLFFBQVE7QUFBQSxjQUMzQjtBQUFBLFlBQ0osRUFBRyxNQUFNO0FBQUEsVUFDYixXQUFXLEFBQWUsT0FBTyxXQUF0QixZQUE4QjtBQUVyQyxxQkFBUyxXQUFZO0FBQ2pCLHFCQUFPO0FBQUEsWUFDWDtBQUFBLFVBQ0o7QUFHQSxvQkFBVSxVQUFVLFFBQVEsT0FBTyxJQUFJO0FBR3ZDLHNCQUFZLElBQUksVUFBVSxTQUFTO0FBRW5DLGNBQUksVUFBVSxHQUFHLFdBQVcsU0FBUyxHQUFHO0FBQ3BDLGtCQUFNLFFBQVEsVUFBVSxVQUFVLFNBQVM7QUFDM0Msa0JBQU0sUUFBTztBQUViLGdCQUFJLE1BQU0sUUFBUTtBQUNkLG9CQUFNLFFBQVEsU0FBVSxVQUFVO0FBQzlCLG9CQUFJLElBQUksSUFBSSxTQUFTLFdBQVcsUUFBUSxFQUFFLE1BQU0sSUFBSSxFQUFFLEtBQUssR0FBRztBQUM5RCxvQkFBSSxPQUFPLENBQUMsR0FBRztBQUNYLHNCQUFJLFFBQVEsVUFBVSxHQUFHLFNBQVMsUUFBUTtBQUMxQyxzQkFBSSxNQUFNLE9BQU8sR0FBRztBQUNoQiwwQkFBSyxRQUFRLFVBQVUsR0FBRyxVQUFVLEdBQUcsYUFBYSxRQUFRLEdBQUcsSUFBSSxLQUFLO0FBQUEsa0JBQzVFLE9BQU87QUFDSCwwQkFBSyxRQUFRLFVBQVUsSUFBSSxLQUFLLE9BQU8sTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLO0FBQUEsa0JBQzlEO0FBQUEsZ0JBQ0o7QUFBQSxjQUNKLENBQUM7QUFBQSxZQUNMO0FBQUEsVUFDSixPQUFPO0FBQ0gsa0JBQU0sSUFBSSxNQUFNLE9BQU0sT0FBTyxlQUFlLFFBQVEsTUFBTSxTQUFTLENBQUM7QUFBQSxVQUN4RTtBQUFBLFFBQ0o7QUFBQSxRQVVBLHFCQUFxQixTQUFxQixXQUF3QixVQUFxQixTQUE2QixRQUFRO0FBQ3hILGNBQUksa0JBQWtCLFFBQVE7QUFDMUIscUJBQVUsU0FBVSxJQUFJO0FBQ3BCLHFCQUFPLFNBQVUsVUFBVTtBQUN2Qix1QkFBTyxHQUFHLEtBQUssUUFBUTtBQUFBLGNBQzNCO0FBQUEsWUFDSixFQUFHLE1BQU07QUFBQSxVQUNiLFdBQVcsQUFBZSxPQUFPLFdBQXRCLFlBQThCO0FBQ3JDLHFCQUFTLFdBQVk7QUFDakIscUJBQU87QUFBQSxZQUNYO0FBQUEsVUFDSjtBQUdBLG9CQUFVLFVBQVUsUUFBUSxPQUFPLElBQUk7QUFHdkMsc0JBQVksSUFBSSxVQUFVLFNBQVM7QUFFbkMsY0FBSSxRQUFPO0FBQ1gsb0JBQVUsR0FBRyxLQUFLLFdBQVcsS0FBSyxTQUFVLEtBQUs7QUFDN0MsZ0JBQUksT0FBTyxJQUFJLFNBQVMsVUFBVTtBQUM5Qix1QkFBUyxRQUFXLE9BQU0sT0FBTyxlQUFlLFFBQVEsTUFBTSxTQUFTLENBQUM7QUFBQSxZQUM1RSxXQUFXLEtBQUs7QUFDWix1QkFBUyxRQUFXLEdBQUc7QUFBQSxZQUMzQixPQUFPO0FBQ0gsa0JBQUksUUFBUSxVQUFVLFVBQVUsU0FBUztBQUN6QyxrQkFBSSxJQUFJO0FBRVIsa0JBQUksT0FBTyxXQUFZO0FBQ25CLHFCQUFLO0FBQ0wsb0JBQUksSUFBSSxNQUFNLFFBQVE7QUFDbEIsc0JBQUksV0FBVyxNQUFNO0FBQ3JCLHNCQUFJLElBQUksSUFBSSxTQUFTLFdBQVcsUUFBUSxFQUFFLE1BQU0sSUFBSSxFQUFFLEtBQUssR0FBRztBQUM5RCxzQkFBSSxFQUNDLFVBQVUsS0FBSyxFQUNmLFFBQVEsb0JBQW9CLEVBQUUsRUFDOUIsUUFBUSxpQkFBaUIsRUFBRTtBQUNoQyxzQkFBSSxPQUFPLENBQUMsR0FBRztBQUNYLDhCQUFVLEdBQUcsS0FBSyxVQUFVLFNBQVUsS0FBSyxPQUFPO0FBQzlDLDBCQUFJO0FBQUssaUNBQVMsUUFBVyxHQUFHO0FBQ2hDLDBCQUFJLE1BQU0sT0FBTyxHQUFHO0FBQ2hCLGtDQUFVLEdBQUcsU0FBUyxVQUFVLFNBQVUsS0FBSyxNQUFNO0FBQ2pELDhCQUFJLEtBQUs7QUFDTCxxQ0FBUyxRQUFXLEdBQUc7QUFBQSwwQkFDM0IsT0FBTztBQUNILGtDQUFLLFFBQVEsVUFBVSxHQUFHLE1BQU0sSUFBSSxLQUFLO0FBQ3pDLGlDQUFLO0FBQUEsMEJBQ1Q7QUFBQSx3QkFDSixDQUFDO0FBQUEsc0JBQ0wsT0FBTztBQUNILDhCQUFLLFFBQVEsVUFBVSxJQUFJLEtBQUssT0FBTyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUs7QUFDMUQsNkJBQUs7QUFBQSxzQkFDVDtBQUFBLG9CQUNKLENBQUM7QUFBQSxrQkFDTCxPQUFPO0FBQ0gseUJBQUs7QUFBQSxrQkFDVDtBQUFBLGdCQUNKLE9BQU87QUFDSCwyQkFBUyxNQUFNLE1BQVM7QUFBQSxnQkFDNUI7QUFBQSxjQUNKO0FBRUEsbUJBQUs7QUFBQSxZQUNUO0FBQUEsVUFDSixDQUFDO0FBQUEsUUFDTDtBQUFBLFFBU0EsdUJBQXVCLFNBQXFCLFdBQXdCLE9BQU87QUFDdkUsaUJBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3BDLGtCQUFNLEVBQUUsUUFBUSxZQUFZLE9BQU8sT0FBTyxDQUFDLEdBQUcsS0FBSztBQUNuRCxpQkFBSyxvQkFDRCxXQUNBLENBQUMsTUFBTSxRQUFRO0FBQ1gsa0JBQUk7QUFBSyx1QkFBTyxHQUFHO0FBQ25CLGtCQUFJO0FBQU0sd0JBQVEsSUFBSTtBQUFBLFlBQzFCLEdBQ0EsU0FDQSxNQUNKO0FBQUEsVUFDSixDQUFDO0FBQUEsUUFDTDtBQUFBLFFBWUEsU0FBUyxTQUFzQixXQUF1QixTQUFxQixTQUFxQixNQUFNO0FBQ2xHLGNBQUksUUFBUSxTQUFTLFNBQVM7QUFDOUIsZ0JBQU0sU0FBUyxTQUFTO0FBR3hCLGNBQUksQ0FBQyxRQUFRO0FBQ1Qsb0JBQVEsSUFBSSxTQUFTO0FBQ3JCLGtCQUFNLFlBQVk7QUFBQSxVQUN0QjtBQUNBLGdCQUFNLFVBQVUsV0FBVztBQUUzQixnQkFBTSxTQUFTLEFBQWEsT0FBTyxTQUFwQixZQUE0QixnQkFBZ0IsVUFBVSxHQUFHO0FBR3hFLGNBQUksUUFBUTtBQUNSLGtCQUFNLE9BQU8sT0FBTyxLQUFLO0FBQUEsVUFDN0I7QUFHQSxjQUFJLFdBQVcsTUFBTSxjQUFjLEtBQU87QUFHMUMsY0FBSSxDQUFDLE9BQU0sT0FBTztBQUVkLGdCQUFJLE9BQU8sTUFBTSxjQUFjLFFBQVM7QUFFeEMsZ0JBQUksUUFBUTtBQUVSLHNCQUFRLE9BQVEsS0FBSztBQUFBLFlBQ3pCLFdBQVcsQUFBYSxPQUFPLFNBQXBCLFVBQTBCO0FBRWpDLHNCQUFRLE9BQVE7QUFBQSxZQUNwQixPQUFPO0FBRUgsc0JBQVEsTUFBTSxjQUFjLE1BQVE7QUFBQSxZQUN4QztBQUVBLHVCQUFZLFlBQVksUUFBUSxRQUFTO0FBQUEsVUFDN0M7QUFFQSxnQkFBTSxPQUFPO0FBRWIsZ0JBQU0sUUFBUSxPQUFPO0FBQ3JCLGNBQUksQ0FBQztBQUFRLGlCQUFLLFNBQVMsS0FBSztBQUFBLFFBQ3BDO0FBQUEsUUFPQSxZQUFZLFdBQVk7QUFDcEIsaUJBQU8sT0FBTyxLQUFLLFVBQVUsQ0FBQztBQUFBLFFBQ2xDO0FBQUEsUUFRQSxVQUFVLFNBQXNCLE1BQU07QUFDbEMsaUJBQU8sU0FBUyxJQUFJO0FBQUEsUUFDeEI7QUFBQSxRQUVBLGVBQWUsV0FBWTtBQUN2QixpQkFBTyxLQUFLLGNBQWM7QUFBQSxRQUM5QjtBQUFBLFFBRUEsU0FBUyxTQUFVLFVBQVU7QUFDekIsaUJBQU8sS0FBSyxRQUFRLFFBQVE7QUFBQSxRQUNoQztBQUFBLFFBa0JBLGdCQUFnQixTQUNBLE9BQ0EsWUFDQyxtQkFDQSxXQUNBLHdCQUNBLGFBQ2Y7QUFDRSxzQkFBWSxTQUFTLFdBQVcsS0FBSztBQUNyQyxtQ0FBeUIsU0FBUyx3QkFBd0IsS0FBSztBQUMvRCw4QkFBb0IsU0FBUyxtQkFBbUIsSUFBSTtBQUNwRCx3QkFBYyxRQUFRLGFBQWEsUUFBUSx3QkFBd0IsTUFBUyxDQUFDO0FBRTdFLGNBQUksT0FBTyxTQUFTLEtBQUs7QUFDekIsY0FBSSxDQUFDLE1BQU07QUFDUCxrQkFBTSxJQUFJLE1BQU0sT0FBTSxPQUFPLFFBQVE7QUFBQSxVQUN6QztBQUVBLGNBQUksWUFBWSxVQUFVLEtBQUssU0FBUztBQUV4QyxjQUFJLFNBQVMsU0FBUyxZQUFZLGVBQWUsQ0FBQyxLQUFLLGNBQWMsY0FBYyxvQkFBb0IsWUFBWSxJQUFJLFNBQVMsU0FBUyxDQUFDO0FBRTFJLGNBQUksS0FBSyxhQUFhO0FBQ2xCLGdCQUFJLFdBQVcsS0FBSyxpQkFBaUIsSUFBSTtBQUN6QyxxQkFBUyxRQUFRLFNBQVUsT0FBTztBQUM5QixrQkFBSSxNQUFNO0FBQWE7QUFDdkIsa0JBQUksV0FBVSxNQUFNLFFBQVE7QUFDNUIsa0JBQUksQ0FBQyxVQUFTO0FBQ1Ysc0JBQU0sSUFBSSxNQUFNLE9BQU0sT0FBTyxpQkFBaUI7QUFBQSxjQUNsRDtBQUNBLGtCQUFJLE9BQU8sVUFBVSxNQUFNLFNBQVM7QUFDcEMsa0JBQUksWUFBWSxTQUFTLFlBQVksb0JBQW9CLE9BQU8sSUFBSSxTQUFTLElBQUksQ0FBQztBQUVsRixvQkFBTSxZQUFXLHlCQUF5QixNQUFNLE9BQU8sV0FBVztBQUNsRSx3QkFBVSxZQUFZLFdBQVcsVUFBUyxXQUFXLFNBQVE7QUFBQSxZQUNqRSxDQUFDO0FBQ0QsbUJBQU87QUFBQSxVQUNYO0FBRUEsY0FBSSxVQUFVLEtBQUssUUFBUTtBQUMzQixjQUFJLENBQUM7QUFBUyxrQkFBTSxJQUFJLE1BQU0sT0FBTSxPQUFPLGlCQUFpQjtBQUU1RCxjQUFJLFVBQVUsR0FBRyxXQUFXLE1BQU0sS0FBSyxDQUFDLFdBQVc7QUFDL0Msa0JBQU0sSUFBSSxNQUFNLE9BQU0sT0FBTyxhQUFhO0FBQUEsVUFDOUM7QUFFQSxnQkFBTSxXQUFXLHlCQUF5QixNQUFNLE9BQU8sV0FBVztBQUNsRSxvQkFBVSxZQUFZLFFBQVEsU0FBUyxXQUFXLFFBQVE7QUFFMUQsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFNQSxNQUFNLFNBQVUsTUFBTTtBQUNsQixjQUFJLENBQUMsTUFBTTtBQUNQLG1CQUFPO0FBQUEsVUFDWDtBQUVBLG1CQUFTLFNBQVMsS0FBSyxTQUFTO0FBQzVCLGdCQUFJO0FBQ0Esa0JBQUksTUFBTSxhQUFhO0FBQ25CO0FBQUEsY0FDSjtBQUNBLGtCQUFJLFVBQVUsS0FBSyxRQUFRLE9BQU8sUUFBUSxJQUFJO0FBQzlDLGtCQUFJLENBQUMsU0FBUztBQUNWLHVCQUFPO0FBQUEsY0FDWDtBQUFBLFlBQ0osU0FBUyxLQUFQO0FBQ0UscUJBQU87QUFBQSxZQUNYO0FBQUEsVUFDSjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBV0EsY0FBYyxTQUFzQixZQUF5QixXQUF3Qix3QkFBMkMsTUFBTTtBQUNsSSxzQkFBWSxTQUFTLFdBQVcsS0FBSztBQUNyQyxpQkFBTyxRQUFRLHdCQUF3QixJQUFJO0FBQzNDLG1DQUF5QixTQUFTLHdCQUF3QixLQUFLO0FBQy9ELGNBQUksQ0FBQyxNQUFNO0FBQ1Asa0JBQU0sSUFBSSxNQUFNLE9BQU0sT0FBTyxNQUFNO0FBQUEsVUFDdkM7QUFDQSxlQUFLLFFBQVEsUUFBUSxTQUFVLE9BQU87QUFDbEMsZ0JBQUksWUFBWSxTQUFTLFlBQVksVUFBVSxNQUFNLFVBQVUsU0FBUyxDQUFDLENBQUM7QUFDMUUsZ0JBQUksTUFBTSxhQUFhO0FBQ25CLHdCQUFVLFFBQVEsU0FBUztBQUMzQjtBQUFBLFlBQ0o7QUFDQSxnQkFBSSxVQUFVLE1BQU0sUUFBUSxJQUFJO0FBQ2hDLGdCQUFJLENBQUMsU0FBUztBQUNWLG9CQUFNLElBQUksTUFBTSxPQUFNLE9BQU8saUJBQWlCO0FBQUEsWUFDbEQ7QUFFQSxrQkFBTSxXQUFXLHlCQUF5QixNQUFNLE9BQU8sV0FBVztBQUNsRSxzQkFBVSxZQUFZLFdBQVcsU0FBUyxXQUFXLFFBQVE7QUFDN0QsZ0JBQUk7QUFDQSx3QkFBVSxHQUFHLFdBQVcsV0FBVyxNQUFNLE9BQU8sTUFBTSxNQUFNLE9BQU8sSUFBSTtBQUFBLFlBQzNFLFNBQVMsS0FBUDtBQUNFLG9CQUFNLElBQUksTUFBTSxPQUFNLE9BQU8saUJBQWlCO0FBQUEsWUFDbEQ7QUFBQSxVQUNKLENBQUM7QUFBQSxRQUNMO0FBQUEsUUFZQSxtQkFBbUIsU0FBc0IsWUFBeUIsV0FBd0Isd0JBQXNDLFVBQVU7QUFDdEksY0FBSSxDQUFDLFVBQVU7QUFDWCx1QkFBVyxXQUFZO0FBQUEsWUFBQztBQUFBLFVBQzVCO0FBQ0Esc0JBQVksU0FBUyxXQUFXLEtBQUs7QUFDckMsY0FBSSxPQUFPLDJCQUEyQixjQUFjLENBQUM7QUFBVSx1QkFBVztBQUMxRSxtQ0FBeUIsU0FBUyx3QkFBd0IsS0FBSztBQUMvRCxjQUFJLENBQUMsTUFBTTtBQUNQLHFCQUFTLElBQUksTUFBTSxPQUFNLE9BQU8sTUFBTSxDQUFDO0FBQ3ZDO0FBQUEsVUFDSjtBQUVBLHVCQUFhLElBQUksUUFBUSxVQUFVO0FBRW5DLGdCQUFNLFVBQVUsQ0FBQyxVQUFVLFNBQVMsWUFBWSxJQUFJLFVBQVUsVUFBVSxNQUFNLFVBQVUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNwRyxnQkFBTSxXQUFXLENBQUMsS0FBSyxTQUFTLElBQUksTUFBTSxNQUFNLFFBQVEsT0FBTyxHQUFHO0FBR2xFLGdCQUFNLGFBQWEsQ0FBQztBQUNwQixnQkFBTSxjQUFjLG9CQUFJLElBQUk7QUFDNUIsZUFBSyxRQUFRLFFBQVEsQ0FBQyxNQUFNO0FBQ3hCLGdCQUFJLEVBQUUsYUFBYTtBQUNmLHlCQUFXLEtBQUssQ0FBQztBQUFBLFlBQ3JCLE9BQU87QUFDSCwwQkFBWSxJQUFJLENBQUM7QUFBQSxZQUNyQjtBQUFBLFVBQ0osQ0FBQztBQUlELHFCQUFXLFNBQVMsWUFBWTtBQUM1QixrQkFBTSxVQUFVLFFBQVEsS0FBSztBQUU3QixrQkFBTSxVQUFVLHlCQUF5QixNQUFNLE9BQU8sV0FBVztBQUNqRSxnQkFBSTtBQUNBLHdCQUFVLFFBQVEsT0FBTztBQUN6QixrQkFBSTtBQUFTLDBCQUFVLEdBQUcsVUFBVSxTQUFTLE9BQU87QUFFcEQsd0JBQVUsR0FBRyxXQUFXLFNBQVMsTUFBTSxPQUFPLE1BQU0sTUFBTSxPQUFPLElBQUk7QUFBQSxZQUN6RSxTQUFTLElBQVA7QUFDRSx1QkFBUyxTQUFTLDJCQUEyQixPQUFPLENBQUM7QUFBQSxZQUN6RDtBQUFBLFVBQ0o7QUFHQSxnQkFBTSxPQUFPLE1BQU07QUFDZixnQkFBSSxZQUFZLFNBQVMsR0FBRztBQUN4Qix1QkFBUztBQUFBLFlBQ2I7QUFBQSxVQUNKO0FBR0EscUJBQVcsU0FBUyxZQUFZLE9BQU8sR0FBRztBQUN0QyxrQkFBTSxZQUFZLElBQUksVUFBVSxVQUFVLE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBQztBQUNyRSxrQkFBTSxXQUFXLFNBQVMsWUFBWSxTQUFTO0FBQy9DLGtCQUFNLGFBQWEsU0FBVSxTQUFTLE9BQU87QUFDekMsa0JBQUksT0FBTztBQUNQLHlCQUFTLElBQUksTUFBTSxLQUFLLENBQUM7QUFDekI7QUFBQSxjQUNKO0FBQ0Esa0JBQUksQ0FBQyxTQUFTO0FBQ1YseUJBQVMsSUFBSSxNQUFNLE9BQU0sT0FBTyxpQkFBaUIsQ0FBQztBQUFBLGNBQ3RELE9BQU87QUFFSCxzQkFBTSxXQUFXLHlCQUF5QixNQUFNLE9BQU8sV0FBVztBQUNsRSwwQkFBVSxpQkFBaUIsVUFBVSxTQUFTLFdBQVcsVUFBVSxTQUFVLE1BQU07QUFDL0Usc0JBQUksQ0FBQyxNQUFNO0FBQ1AsNkJBQVMsU0FBUyx3QkFBd0IsUUFBUSxDQUFDO0FBQ25EO0FBQUEsa0JBQ0o7QUFDQSw0QkFBVSxHQUFHLE9BQU8sVUFBVSxNQUFNLE9BQU8sTUFBTSxNQUFNLE9BQU8sTUFBTSxTQUFVLE9BQU87QUFDakYsd0JBQUksT0FBTztBQUNQLCtCQUFTLFNBQVMsdUJBQXVCLFFBQVEsQ0FBQztBQUNsRDtBQUFBLG9CQUNKO0FBQ0EsZ0NBQVksT0FBTyxLQUFLO0FBRXhCLHlCQUFLO0FBQUEsa0JBQ1QsQ0FBQztBQUFBLGdCQUNMLENBQUM7QUFBQSxjQUNMO0FBQUEsWUFDSixDQUFDO0FBQUEsVUFDTDtBQUVBLGVBQUs7QUFBQSxRQUNUO0FBQUEsUUFRQSxVQUFVLFNBQXNCLGdCQUE4QixVQUFVO0FBQ3BFLGNBQUksVUFBVSxXQUFXLEdBQUc7QUFDeEIsZ0JBQUksT0FBTyxtQkFBbUIsWUFBWTtBQUN0Qyx5QkFBVztBQUNYLCtCQUFpQjtBQUFBLFlBQ3JCO0FBQUEsVUFDSjtBQUVBLGNBQUksQ0FBQyxrQkFBa0IsS0FBSyxVQUFVO0FBQ2xDLDZCQUFpQixLQUFLO0FBQUEsVUFDMUI7QUFDQSxjQUFJLENBQUM7QUFBZ0I7QUFFckIsY0FBSSxVQUFVLEtBQUssaUJBQWlCO0FBQ3BDLGNBQUksU0FBUztBQUNULGdCQUFJLEtBQUssVUFBVSxZQUFZLGdCQUFnQixTQUFTLElBQUk7QUFDNUQsZ0JBQUksT0FBTyxhQUFhO0FBQVksdUJBQVMsQ0FBQyxLQUFLLElBQUksTUFBTSxRQUFRLElBQUksTUFBTSxFQUFFO0FBQUEsVUFDckY7QUFBQSxRQUNKO0FBQUEsUUFFQSxpQkFBaUIsU0FBc0IsZ0JBQTZCLE9BQU87QUFDdkUsZ0JBQU0sRUFBRSxXQUFXLFNBQVMsT0FBTyxPQUFPLEVBQUUsV0FBVyxLQUFLLEdBQUcsS0FBSztBQUVwRSxpQkFBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFFcEMsZ0JBQUksQ0FBQyxrQkFBa0IsS0FBSztBQUFVLCtCQUFpQixLQUFLO0FBQzVELGdCQUFJLENBQUM7QUFBZ0IscUJBQU8sZ0NBQWdDO0FBRTVELGlCQUFLLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxZQUFZO0FBQ3JDLG9CQUFNLE1BQU0sQ0FBQyxTQUFVLE9BQU8sUUFBUSxJQUFJLElBQUksT0FBTyx3Q0FBd0M7QUFDN0Ysd0JBQVUsaUJBQWlCLGdCQUFnQixTQUFTLFdBQVcsTUFBTSxHQUFHO0FBQUEsWUFDNUUsR0FBRyxNQUFNO0FBQUEsVUFDYixDQUFDO0FBQUEsUUFDTDtBQUFBLFFBRUEsaUJBQWlCLFdBQVk7QUFDekIsaUJBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3BDLGlCQUFLLGNBQWMsU0FBUyxNQUFNO0FBQUEsVUFDdEMsQ0FBQztBQUFBLFFBQ0w7QUFBQSxRQU9BLFVBQVUsU0FBeUIsV0FBMEIsUUFBdUIsYUFBNEIsV0FBVztBQUN2SCxlQUFLLFVBQVU7QUFDZixjQUFJLE9BQU8sY0FBYyxZQUFZO0FBQ2pDLGlCQUFLLGNBQWMsV0FBVyxRQUFRLGFBQWEsU0FBUztBQUM1RCxtQkFBTztBQUFBLFVBQ1g7QUFDQSxpQkFBTyxLQUFLLGlCQUFpQjtBQUFBLFFBQ2pDO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUM5d0JBO0FBQUE7QUFBQTtBQUVBLFFBQUksU0FBUyxPQUFPLFVBQVU7QUFDOUIsUUFBSSxRQUFRLE9BQU8sVUFBVTtBQUM3QixRQUFJLGlCQUFpQixPQUFPO0FBQzVCLFFBQUksT0FBTyxPQUFPO0FBRWxCLFFBQUksVUFBVSxrQkFBaUIsS0FBSztBQUNuQyxVQUFJLE9BQU8sTUFBTSxZQUFZLFlBQVk7QUFDeEMsZUFBTyxNQUFNLFFBQVEsR0FBRztBQUFBLE1BQ3pCO0FBRUEsYUFBTyxNQUFNLEtBQUssR0FBRyxNQUFNO0FBQUEsSUFDNUI7QUFFQSxRQUFJLGdCQUFnQix3QkFBdUIsS0FBSztBQUMvQyxVQUFJLENBQUMsT0FBTyxNQUFNLEtBQUssR0FBRyxNQUFNLG1CQUFtQjtBQUNsRCxlQUFPO0FBQUEsTUFDUjtBQUVBLFVBQUksb0JBQW9CLE9BQU8sS0FBSyxLQUFLLGFBQWE7QUFDdEQsVUFBSSxtQkFBbUIsSUFBSSxlQUFlLElBQUksWUFBWSxhQUFhLE9BQU8sS0FBSyxJQUFJLFlBQVksV0FBVyxlQUFlO0FBRTdILFVBQUksSUFBSSxlQUFlLENBQUMscUJBQXFCLENBQUMsa0JBQWtCO0FBQy9ELGVBQU87QUFBQSxNQUNSO0FBSUEsVUFBSTtBQUNKLFdBQUssT0FBTyxLQUFLO0FBQUEsTUFBTztBQUV4QixhQUFPLE9BQU8sUUFBUSxlQUFlLE9BQU8sS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUMxRDtBQUdBLFFBQUksY0FBYyxzQkFBcUIsUUFBUSxTQUFTO0FBQ3ZELFVBQUksa0JBQWtCLFFBQVEsU0FBUyxhQUFhO0FBQ25ELHVCQUFlLFFBQVEsUUFBUSxNQUFNO0FBQUEsVUFDcEMsWUFBWTtBQUFBLFVBQ1osY0FBYztBQUFBLFVBQ2QsT0FBTyxRQUFRO0FBQUEsVUFDZixVQUFVO0FBQUEsUUFDWCxDQUFDO0FBQUEsTUFDRixPQUFPO0FBQ04sZUFBTyxRQUFRLFFBQVEsUUFBUTtBQUFBLE1BQ2hDO0FBQUEsSUFDRDtBQUdBLFFBQUksY0FBYyxzQkFBcUIsS0FBSyxNQUFNO0FBQ2pELFVBQUksU0FBUyxhQUFhO0FBQ3pCLFlBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFDNUIsaUJBQU87QUFBQSxRQUNSLFdBQVcsTUFBTTtBQUdoQixpQkFBTyxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQUEsUUFDeEI7QUFBQSxNQUNEO0FBRUEsYUFBTyxJQUFJO0FBQUEsSUFDWjtBQUVBLFlBQU8sVUFBVSxrQkFBa0I7QUFDbEMsVUFBSSxTQUFTLE1BQU0sS0FBSyxNQUFNLGFBQWE7QUFDM0MsVUFBSSxTQUFTLFVBQVU7QUFDdkIsVUFBSSxJQUFJO0FBQ1IsVUFBSSxTQUFTLFVBQVU7QUFDdkIsVUFBSSxPQUFPO0FBR1gsVUFBSSxPQUFPLFdBQVcsV0FBVztBQUNoQyxlQUFPO0FBQ1AsaUJBQVMsVUFBVSxNQUFNLENBQUM7QUFFMUIsWUFBSTtBQUFBLE1BQ0w7QUFDQSxVQUFJLFVBQVUsUUFBUyxPQUFPLFdBQVcsWUFBWSxPQUFPLFdBQVcsWUFBYTtBQUNuRixpQkFBUyxDQUFDO0FBQUEsTUFDWDtBQUVBLGFBQU8sSUFBSSxRQUFRLEVBQUUsR0FBRztBQUN2QixrQkFBVSxVQUFVO0FBRXBCLFlBQUksV0FBVyxNQUFNO0FBRXBCLGVBQUssUUFBUSxTQUFTO0FBQ3JCLGtCQUFNLFlBQVksUUFBUSxJQUFJO0FBQzlCLG1CQUFPLFlBQVksU0FBUyxJQUFJO0FBR2hDLGdCQUFJLFdBQVcsTUFBTTtBQUVwQixrQkFBSSxRQUFRLFFBQVMsZUFBYyxJQUFJLEtBQU0sZUFBYyxRQUFRLElBQUksS0FBSztBQUMzRSxvQkFBSSxhQUFhO0FBQ2hCLGdDQUFjO0FBQ2QsMEJBQVEsT0FBTyxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUM7QUFBQSxnQkFDdEMsT0FBTztBQUNOLDBCQUFRLE9BQU8sY0FBYyxHQUFHLElBQUksTUFBTSxDQUFDO0FBQUEsZ0JBQzVDO0FBR0EsNEJBQVksUUFBUSxFQUFFLE1BQVksVUFBVSxPQUFPLE1BQU0sT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUFBLGNBR3hFLFdBQVcsT0FBTyxTQUFTLGFBQWE7QUFDdkMsNEJBQVksUUFBUSxFQUFFLE1BQVksVUFBVSxLQUFLLENBQUM7QUFBQSxjQUNuRDtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUFBLE1BQ0Q7QUFHQSxhQUFPO0FBQUEsSUFDUjtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwSEE7QUFBQTtBQUFBO0FBSUEsUUFBSSxXQUFXLFFBQVE7QUFHdkIsUUFBSSxZQUFZLENBQUM7QUFNakIs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SztBQUFHLGlCQUFPLEVBQUUsU0FBUyxDQUFDO0FBQzNDLFlBQUcsRUFBRSxPQUFPLElBQUk7QUFBRyxZQUFFLE1BQU0sR0FBRSxDQUFDO0FBQUE7QUFBUSxpQkFBTztBQUM3QyxZQUFHLEVBQUUsT0FBTyxJQUFJO0FBQUcsaUJBQU8sRUFBRSxJQUFJLENBQUM7QUFBQTtBQUFRLGlCQUFPO0FBQUEsTUFDbEQ7QUFFQSxVQUFJLFlBQVksQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxL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QUssUUFBTyxJQUM5RSxLQUFNLEVBQUcsS0FBSyxNQUFRLEdBQUcsS0FBSyxRQUFPLElBQUssR0FBRyxLQUFLLFFBQU8sS0FBTSxHQUFHLEtBQUssUUFBTyxJQUM5RSxLQUFNLEVBQUcsS0FBSyxNQUFRLEdBQUcsS0FBSyxRQUFPLElBQUssR0FBRyxLQUFLLFFBQU8sS0FBTSxHQUFHLEtBQUssUUFBTyxJQUM5RSxLQUFNLEVBQUcsS0FBSyxNQUFRLEdBQUcsS0FBSyxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxLQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUcsS0FBSyxNQUFRLEdBQUcsS0FBSyxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTztBQUVsRixZQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxL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LFVBQUUsTUFBTSxPQUFRLElBQUk7QUFDcEIsVUFBRSxNQUFNLE9BQU8sS0FBSztBQUNwQixVQUFFLE1BQU0sT0FBTyxLQUFLO0FBRXBCLFVBQUUsTUFBTSxPQUFRLElBQUk7QUFDcEIsVUFBRSxNQUFNLE9BQVEsSUFBSTtBQUNwQixVQUFFLE1BQU0sT0FBTyxLQUFLO0FBQ3BCLFVBQUUsTUFBTSxPQUFPLEtBQUs7QUFFcEIsVUFBRSxNQUFNLE9BQVEsSUFBSTtBQUNwQixVQUFFLE1BQU0sT0FBUSxJQUFJO0FBQ3BCLFVBQUUsTUFBTSxPQUFPLEtBQUs7QUFDcEIsVUFBRSxNQUFNLE9BQU8sS0FBSztBQUVwQixVQUFFLE1BQU0sT0FBUSxJQUFJO0FBQ3BCLFVBQUUsTUFBTSxPQUFRLElBQUk7QUFDcEIsVUFBRSxNQUFNLE9BQU8sS0FBSztBQUNwQixVQUFFLE1BQU0sT0FBTyxLQUFLO0FBRXBCLFVBQUUsTUFBTSxPQUFRLElBQUk7QUFDcEIsVUFBRSxNQUFNLE9BQVEsSUFBSTtBQUNwQixVQUFFLE1BQU0sT0FBTyxLQUFLO0FBQ3BCLFVBQUUsTUFBTSxPQUFPLEtBQUs7QUFFcEIsVUFBRSxNQUFNLFFBQVMsSUFBSTtBQUNyQixVQUFFLE1BQU0sUUFBUyxJQUFJO0FBQ3JCLFVBQUUsTUFBTSxRQUFRLEtBQUs7QUFDckIsVUFBRSxNQUFNLFFBQVEsS0FBSztBQUVyQixVQUFFLE1BQU0sUUFBUyxJQUFJO0FBQ3JCLFVBQUUsTUFBTSxRQUFTLElBQUk7QUFDckIsVUFBRSxNQUFNLFFBQVEsS0FBSztBQUNyQixVQUFFLE1BQU0sUUFBUSxLQUFLO0FBRXJCLFVBQUUsTUFBTSxRQUFTLElBQUk7QUFDckIsVUFBRSxNQUFNLFFBQVMsSUFBSTtBQUNyQixVQUFFLE1BQU0sUUFBUSxLQUFLO0FBQ3JCLFVBQUUsTUFBTSxRQUFRLEtBQUs7QUFFckIsVUFBRSxNQUFNLFFBQVMsSUFBSTtBQUNyQixVQUFFLE1BQU0sUUFBUyxJQUFJO0FBQ3JCLFVBQUUsTUFBTSxRQUFRLEtBQUs7QUFDckIsVUFBRSxNQUFNLFFBQVEsS0FBSztBQUVyQixVQUFFLE1BQU0sUUFBUyxJQUFJO0FBQ3JCLFVBQUUsTUFBTSxRQUFTLElBQUk7QUFDckIsVUFBRSxNQUFNLFFBQVEsS0FBSztBQUNyQixVQUFFLE1BQU0sUUFBUSxLQUFLO0FBRXJCLFVBQUUsTUFBTSxRQUFTLElBQUk7QUFDckIsVUFBRSxNQUFNLFFBQVMsSUFBSTtBQUNyQixVQUFFLE1BQU0sUUFBUSxLQUFLO0FBQ3JCLFVBQUUsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUN2QjtBQUVBLDZCQUF1QixHQUFFLEdBQUUsR0FBRSxHQUFHO0FBQzlCLFlBQUksS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsS0FBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsS0FBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU87QUFFbEYsWUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUNwRSxLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQ3BFLE1BQU0sS0FBSztBQUVmLGlCQUFTLElBQUksR0FBRyxJQUFJLElBQUksS0FBSyxHQUFHO0FBQzlCLGNBQUksS0FBSyxNQUFNO0FBQ2YsZ0JB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LEtBQU0sR0FBRSxJQUFFLElBQUUsTUFBTTtBQUN0RCxVQUFFLE9BQU87QUFBQSxNQUNYO0FBRUEsaUJBQVcsR0FBRyxHQUFHLEdBQUc7QUFDbEIsaUJBQVMsSUFBSSxHQUFHLElBQUksSUFBSTtBQUFLLFlBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUFBLE1BQy9DO0FBRUEsaUJBQVcsR0FBRyxHQUFHLEdBQUc7QUFDbEIsaUJBQVMsSUFBSSxHQUFHLElBQUksSUFBSTtBQUFLLFlBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUFBLE1BQy9DO0FBRUEsaUJBQVcsR0FBRyxHQUFHLEdBQUc7QUFDbEIsWUFBSSxHQUFHLEdBQ0osS0FBSyxHQUFJLEtBQUssR0FBSSxLQUFLLEdBQUksS0FBSyxHQUFJLEtBQUssR0FBSSxLQUFLLEdBQUksS0FBSyxHQUFJLEtBQUssR0FDcEUsS0FBSyxHQUFJLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FDckUsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FDckUsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUM1RCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUU7QUFFVixZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFFWCxjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFJWixZQUFJO0FBQ0osWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFJLE1BQU0sSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFHLGNBQU0sSUFBSSxJQUFJO0FBQzlELFlBQUksTUFBTSxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUcsY0FBTSxJQUFJLElBQUk7QUFDOUQsWUFBSSxNQUFNLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBRyxjQUFNLElBQUksSUFBSTtBQUM5RCxZQUFJLE1BQU0sSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFHLGNBQU0sSUFBSSxJQUFJO0FBQzlELFlBQUksTUFBTSxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUcsY0FBTSxJQUFJLElBQUk7QUFDOUQsWUFBSSxNQUFNLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBRyxjQUFNLElBQUksSUFBSTtBQUM5RCxjQUFNLElBQUUsSUFBSSxLQUFNLEtBQUU7QUFHcEIsWUFBSTtBQUNKLFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSSxNQUFNLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBRyxjQUFNLElBQUksSUFBSTtBQUM5RCxZQUFJLE1BQU0sSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFHLGNBQU0sSUFBSSxJQUFJO0FBQzlELFlBQUks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QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxNQUN0QztBQUVBLG9DQUE4QixJQUFJLElBQUksR0FBRyxHQUFHO0FBQzFDLFlBQUksS0FBSyxJQUFJLFdBQVcsRUFBRSxHQUFHLEtBQUssSUFBSSxXQUFXLEVBQUUsR0FDL0MsS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUNuQyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQ25DLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBRWpDLFlBQUksTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBRVQsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHLElBQ1QsTUFBTSxHQUFHO0FBRWIsWUFBSSxNQUFNO0FBQ1YsZUFBTyxLQUFLLEtBQUs7QUFDZixlQUFLLElBQUksR0FBRyxJQUFJLElBQUksS0FBSztBQUN2QixnQkFBSSxJQUFJLElBQUk7QUFDWixlQUFHLEtBQU0sRUFBRSxJQUFFLE1BQU0sS0FBTyxFQUFFLElBQUUsTUFBTSxLQUFPLEVBQUUsSUFBRSxNQUFNLElBQUssRUFBRSxJQUFFO0FBQzlELGVBQUcsS0FBTSxFQUFFLElBQUUsTUFBTSxLQUFPLEVBQUUsSUFBRSxNQUFNLEtBQU8sRUFBRSxJQUFFLE1BQU0sSUFBSyxFQUFFLElBQUU7QUFBQSxVQUNoRTtBQUNBLGVBQUssSUFBSSxHQUFHLElBQUksSUFBSSxLQUFLO0FBQ3ZCLGtCQUFNO0FBQ04sa0JBQU07QUFDTixrQkFBTTtBQUNOLGtCQUFNO0FBQ04sa0JBQU07QUFDTixrQkFBTTtBQUNOLGtCQUFNO0FBQ04sa0JBQU07QUFFTixrQkFBTTtBQUNOLGtCQUFNO0FBQ04sa0JBQU07QUFDTixrQkFBTTtBQUNOLGtCQUFNO0FBQ04sa0JBQU07QUFDTixrQkFBTTtBQUNOLGtCQUFNO0FBR04sZ0JBQUk7QUFDSixnQkFBSTtBQUVKLGdCQUFJLElBQUk7QUFBUSxnQkFBSSxNQUFNO0FBQzFCLGdCQUFJLElBQUk7QUFBUSxnQkFBSSxNQUFNO0FBRzFCLGdCQUFNLFNBQVEsS0FBTyxPQUFRLEtBQUcsTUFBVSxTQUFRLEtBQU8sT0FBUSxLQUFHLE1BQVUsU0FBUyxLQUFHLEtBQVEsT0FBUSxLQUFJLE1BQUc7QUFDakgsZ0JBQU0sU0FBUSxLQUFPLE9BQVEsS0FBRyxNQUFVLFNBQVEsS0FBTyxPQUFRLEtBQUcsTUFBVSxTQUFTLEtBQUcsS0FBUSxPQUFRLEtBQUksTUFBRztBQUVqSCxpQkFBSyxJQUFJO0FBQVEsaUJBQUssTUFBTTtBQUM1QixpQkFBSyxJQUFJO0FBQVEsaUJBQUssTUFBTTtBQUc1QixnQkFBSyxNQUFNLE1BQVEsQ0FBQyxNQUFNO0FBQzFCLGdCQUFLLE1BQU0sTUFBUSxDQUFDLE1BQU07QUFFMUIsaUJBQUssSUFBSTtBQUFRLGlCQUFLLE1BQU07QUFDNUIsaUJBQUssSUFBSTtBQUFRLGlCQUFLLE1BQU07QUFHNUIsZ0JBQUksRUFBRSxJQUFFO0FBQ1IsZ0JBQUksRUFBRSxJQUFFLElBQUU7QUFFVixpQkFBSyxJQUFJO0FBQVEsaUJBQUssTUFBTTtBQUM1QixpQkFBSyxJQUFJO0FBQVEsaUJBQUssTUFBTTtBQUc1QixnQkFBSSxHQUFHLElBQUU7QUFDVCxnQkFBSSxHQUFHLElBQUU7QUFFVCxpQkFBSyxJQUFJO0FBQVEsaUJBQUssTUFBTTtBQUM1QixpQkFBSyxJQUFJO0FBQVEsaUJBQUssTUFBTTtBQUU1QixpQkFBSyxNQUFNO0FBQ1gsaUJBQUssTUFBTTtBQUNYLGlCQUFLLE1BQU07QUFFWCxpQkFBSyxJQUFJLFFBQVMsS0FBSztBQUN2QixpQkFBSyxJQUFJLFFBQVMsS0FBSztBQUd2QixnQkFBSTtBQUNKLGdCQUFJO0FBRUosZ0JBQUksSUFBSTtBQUFRLGdCQUFJLE1BQU07QUFDMUIsZ0JBQUksSUFBSTtBQUFRLGdCQUFJLE1BQU07QUFHMUIsZ0JBQU0sU0FBUSxLQUFPLE9BQVEsS0FBRyxNQUFVLFNBQVMsS0FBRyxLQUFRLE9BQVEsS0FBSSxNQUFHLE9BQVcsU0FBUyxLQUFHLEtBQVEsT0FBUSxLQUFJLE1BQUc7QUFDM0gsZ0JBQU0sU0FBUSxLQUFPLE9BQVEsS0FBRyxNQUFVLFNBQVMsS0FBRyxLQUFRLE9BQVEsS0FBSSxNQUFHLE9BQVcsU0FBUyxLQUFHLEtBQVEsT0FBUSxLQUFJLE1BQUc7QUFFM0gsaUJBQUssSUFBSTtBQUFRLGlCQUFLLE1BQU07QUFDNUIsaUJBQUssSUFBSTtBQUFRLGlCQUFLLE1BQU07QUFHNUIsZ0JBQUssTUFBTSxNQUFRLE1BQU0sTUFBUSxNQUFNO0FBQ3ZDLGdCQUFLLE1BQU0sTUFBUSxNQUFNLE1BQVEsTUFBTTtBQUV2QyxpQkFBSyxJQUFJO0FBQVEsaUJBQUssTUFBTTtBQUM1QixpQkFBSyxJQUFJO0FBQVEsaUJBQUssTUFBTTtBQUU1QixpQkFBSyxNQUFNO0FBQ1gsaUJBQUssTUFBTTtBQUNYLGlCQUFLLE1BQU07QUFFWCxrQkFBTyxJQUFJLFFBQVcsS0FBSztBQUMzQixrQkFBTyxJQUFJLFFBQVcsS0FBSztBQUczQixnQkFBSTtBQUNKLGdCQUFJO0FBRUosZ0JBQUksSUFBSTtBQUFRLGdCQUFJLE1BQU07QUFDMUIsZ0JBQUksSUFBSTtBQUFRLGdCQUFJLE1BQU07QUFFMUIsZ0JBQUk7QUFDSixnQkFBSTtBQUVKLGlCQUFLLElBQUk7QUFBUSxpQkFBSyxNQUFNO0FBQzVCLGlCQUFLLElBQUk7QUFBUSxpQkFBSyxNQUFNO0FBRTVCLGlCQUFLLE1BQU07QUFDWCxpQkFBSyxNQUFNO0FBQ1gsaUJBQUssTUFBTTtBQUVYLGtCQUFPLElBQUksUUFBVyxLQUFLO0FBQzNCLGtCQUFPLElBQUksUUFBVyxLQUFLO0FBRTNCLGtCQUFNO0FBQ04sa0JBQU07QUFDTixrQkFBTTtBQUNOLGtCQUFNO0FBQ04sa0JBQU07QUFDTixrQkFBTTtBQUNOLGtCQUFNO0FBQ04sa0JBQU07QUFFTixrQkFBTTtBQUNOLGtCQUFNO0FBQ04sa0JBQU07QUFDTixrQkFBTTtBQUNOLGtCQUFNO0FBQ04sa0JBQU07QUFDTixrQkFBTTtBQUNOLGtCQUFNO0FBRU4sZ0JBQUksSUFBRSxPQUFPLElBQUk7QUFDZixtQkFBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEtBQUs7QUFFdkIsb0JBQUksR0FBRztBQUNQLG9CQUFJLEdBQUc7QUFFUCxvQkFBSSxJQUFJO0FBQVEsb0JBQUksTUFBTTtBQUMxQixvQkFBSSxJQUFJO0FBQVEsb0JBQUksTUFBTTtBQUUxQixvQkFBSSxHQUFJLEtBQUUsS0FBRztBQUNiLG9CQUFJLEdBQUksS0FBRSxLQUFHO0FBRWIscUJBQUssSUFBSTtBQUFRLHFCQUFLLE1BQU07QUFDNUIscUJBQUssSUFBSTtBQUFRLHFCQUFLLE1BQU07QUFHNUIscUJBQUssR0FBSSxLQUFFLEtBQUc7QUFDZCxxQkFBSyxHQUFJLEtBQUUsS0FBRztBQUNkLG9CQUFNLFFBQU8sSUFBTSxNQUFPLEtBQUcsS0FBUyxRQUFPLElBQU0sTUFBTyxLQUFHLEtBQVEsT0FBTztBQUM1RSxvQkFBTSxRQUFPLElBQU0sTUFBTyxLQUFHLEtBQVMsUUFBTyxJQUFNLE1BQU8sS0FBRyxLQUFTLFFBQU8sSUFBTSxNQUFPLEtBQUc7QUFFN0YscUJBQUssSUFBSTtBQUFRLHFCQUFLLE1BQU07QUFDNUIscUJBQUssSUFBSTtBQUFRLHFCQUFLLE1BQU07QUFHNUIscUJBQUssR0FBSSxLQUFFLE1BQUk7QUFDZixxQkFBSyxHQUFJLEtBQUUsTUFBSTtBQUNmLG9CQUFNLFFBQU8sS0FBTyxNQUFPLEtBQUcsTUFBVSxRQUFRLEtBQUcsS0FBUSxNQUFPLEtBQUksTUFBRyxPQUFVLE9BQU87QUFDMUYsb0JBQU0sUUFBTyxLQUFPLE1BQU8sS0FBRyxNQUFVLFFBQVEsS0FBRyxLQUFRLE1BQU8sS0FBSSxNQUFHLE9BQVcsUUFBTyxJQUFNLE1BQU8sS0FBRztBQUUzRyxxQkFBSyxJQUFJO0FBQVEscUJBQUssTUFBTTtBQUM1QixxQkFBSyxJQUFJO0FBQVEscUJBQUssTUFBTTtBQUU1QixxQkFBSyxNQUFNO0FBQ1gscUJBQUssTUFBTTtBQUNYLHFCQUFLLE1BQU07QUFFWCxtQkFBRyxLQUFNLElBQUksUUFBVyxLQUFLO0FBQzdCLG1CQUFHLEtBQU0sSUFBSSxRQUFXLEtBQUs7QUFBQSxjQUMvQjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBR0EsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1B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LFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsUUFBVSxDQUFDO0FBQUEsUUFDakQsSUFBSSxZQUFZO0FBQUEsVUFDZDtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFFBQVUsQ0FBQztBQUFBLFFBQ2pELElBQUksWUFBWTtBQUFBLFVBQ2Q7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxRQUFVLENBQUM7QUFBQSxRQUNqRCxJQUFJLFlBQVk7QUFBQSxVQUNkO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsUUFBVSxDQUFDO0FBQUEsTUFDakQ7QUFDRixXQUFLLElBQUks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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1QkE7QUFBQTtBQVdBLFlBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ1hqQjtBQUFBO0FBQUE7QUFjQSxRQUFJLEtBQUs7QUFDVCxRQUFJLFVBQVUsUUFBUSxR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LEtBQUssQ0FBQztBQUFBLFlBQzNDO0FBQUEsVUFDRixPQUFPO0FBQ0wsaUJBQUssb0JBQW9CO0FBQ3pCLGlCQUFLLHVCQUF1Qix5REFBeUQ7QUFBQSxVQUN2RjtBQUFBLFFBQ0Y7QUFBQSxNQUNGLFdBQVcsUUFBUSxPQUFPLFFBQVEsS0FBSztBQUFBLE1BRXZDLE9BQU87QUFDTCxjQUFNLFlBQVkseUNBQXlDLHFCQUFxQixLQUFLLFFBQVEsV0FBVztBQUN4RyxhQUFLLE9BQU8sTUFBTSxTQUFTO0FBQUEsTUFDN0I7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFFQSxJQUFNLGNBQU4sY0FBMEIsc0JBQU07QUFBQSxFQUs5QixZQUFZLEtBQVUsU0FBa0I7QUFDdEMsUUFBSSxZQUFZLFVBQVU7QUFDeEIsYUFBTyxZQUFZO0FBQUEsSUFDckI7QUFDQSxVQUFNLEdBQUc7QUFDVCxTQUFLLFVBQVU7QUFDZixnQkFBWSxXQUFXO0FBQUEsRUFDekI7QUFBQSxFQUVBLFNBQVM7QUFDUCxVQUFNLEVBQUUsY0FBYztBQUV0QixTQUFLLFFBQVEsV0FBVyxZQUFZLFdBQVcsT0FBTyxDQUFDLFlBQTJCO0FBQ2hGLFVBQUksYUFBYSxRQUFRO0FBQ3pCLFVBQUksTUFBTSxjQUFjLFVBQVU7QUFBRyxxQkFBYTtBQUVsRCxnQkFBVSxTQUFTLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhFLFVBQUksd0JBQVEsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO0FBQ3ZDLGFBQUssU0FBUyxVQUFVO0FBQ3hCLGFBQUssUUFBUSxTQUFTLGVBQWU7QUFDckMsYUFBSyxRQUFRO0FBQUEsTUFDZixDQUFDO0FBRUQsVUFBSSx3QkFBUSxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQ2hDLElBQ0csY0FBYyxNQUFNLEVBQ3BCLE9BQU8sRUFDUCxRQUFRLE1BQU07QUFDYixjQUFNLE1BQU0sS0FBSyxNQUFNLFNBQVM7QUFDaEMsY0FBTSxVQUFVLE1BQU0sY0FBYyxHQUFHO0FBQ3ZDLGdCQUFRLElBQUksT0FBTztBQUNuQixZQUFJLENBQUMsU0FBUztBQUNaLGVBQUssTUFBTTtBQUNYLGVBQUssUUFBUSxXQUFXLFlBQVksV0FBVyxLQUFLLEtBQUs7QUFBQSxRQUMzRDtBQUFBLE1BQ0YsQ0FBQyxDQUNMO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRUEsVUFBVTtBQUNSLFVBQU0sRUFBRSxjQUFjO0FBQ3RCLGNBQVUsTUFBTTtBQUFBLEVBQ2xCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==