browserfs
Version:
A filesystem in your browser!
339 lines • 46.2 kB
JavaScript
"use strict";
var BrowserFS = require('../core/browserfs');
var fs = require('../core/node_fs');
var util_1 = require('../core/util');
var BFSEmscriptenStreamOps = (function () {
function BFSEmscriptenStreamOps(fs) {
this.fs = fs;
this.nodefs = fs.getNodeFS();
this.FS = fs.getFS();
this.PATH = fs.getPATH();
this.ERRNO_CODES = fs.getERRNO_CODES();
}
BFSEmscriptenStreamOps.prototype.open = function (stream) {
var path = this.fs.realPath(stream.node), FS = this.FS;
try {
if (FS.isFile(stream.node.mode)) {
stream.nfd = this.nodefs.openSync(path, this.fs.flagsToPermissionString(stream.flags));
}
}
catch (e) {
if (!e.code)
throw e;
throw new FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenStreamOps.prototype.close = function (stream) {
var FS = this.FS;
try {
if (FS.isFile(stream.node.mode) && stream.nfd) {
this.nodefs.closeSync(stream.nfd);
}
}
catch (e) {
if (!e.code)
throw e;
throw new FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenStreamOps.prototype.read = function (stream, buffer, offset, length, position) {
try {
return this.nodefs.readSync(stream.nfd, util_1.uint8Array2Buffer(buffer), offset, length, position);
}
catch (e) {
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenStreamOps.prototype.write = function (stream, buffer, offset, length, position) {
try {
return this.nodefs.writeSync(stream.nfd, util_1.uint8Array2Buffer(buffer), offset, length, position);
}
catch (e) {
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenStreamOps.prototype.llseek = function (stream, offset, whence) {
var position = offset;
if (whence === 1) {
position += stream.position;
}
else if (whence === 2) {
if (this.FS.isFile(stream.node.mode)) {
try {
var stat = this.nodefs.fstatSync(stream.nfd);
position += stat.size;
}
catch (e) {
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
}
}
if (position < 0) {
throw new this.FS.ErrnoError(this.ERRNO_CODES.EINVAL);
}
stream.position = position;
return position;
};
return BFSEmscriptenStreamOps;
}());
var BFSEmscriptenNodeOps = (function () {
function BFSEmscriptenNodeOps(fs) {
this.fs = fs;
this.nodefs = fs.getNodeFS();
this.FS = fs.getFS();
this.PATH = fs.getPATH();
this.ERRNO_CODES = fs.getERRNO_CODES();
}
BFSEmscriptenNodeOps.prototype.getattr = function (node) {
var path = this.fs.realPath(node);
var stat;
try {
stat = this.nodefs.lstatSync(path);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
return {
dev: stat.dev,
ino: stat.ino,
mode: stat.mode,
nlink: stat.nlink,
uid: stat.uid,
gid: stat.gid,
rdev: stat.rdev,
size: stat.size,
atime: stat.atime,
mtime: stat.mtime,
ctime: stat.ctime,
blksize: stat.blksize,
blocks: stat.blocks
};
};
BFSEmscriptenNodeOps.prototype.setattr = function (node, attr) {
var path = this.fs.realPath(node);
try {
if (attr.mode !== undefined) {
this.nodefs.chmodSync(path, attr.mode);
node.mode = attr.mode;
}
if (attr.timestamp !== undefined) {
var date = new Date(attr.timestamp);
this.nodefs.utimesSync(path, date, date);
}
}
catch (e) {
if (!e.code)
throw e;
if (e.code !== "ENOTSUP") {
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
}
if (attr.size !== undefined) {
try {
this.nodefs.truncateSync(path, attr.size);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
}
};
BFSEmscriptenNodeOps.prototype.lookup = function (parent, name) {
var path = this.PATH.join2(this.fs.realPath(parent), name);
var mode = this.fs.getMode(path);
return this.fs.createNode(parent, name, mode);
};
BFSEmscriptenNodeOps.prototype.mknod = function (parent, name, mode, dev) {
var node = this.fs.createNode(parent, name, mode, dev);
var path = this.fs.realPath(node);
try {
if (this.FS.isDir(node.mode)) {
this.nodefs.mkdirSync(path, node.mode);
}
else {
this.nodefs.writeFileSync(path, '', { mode: node.mode });
}
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
return node;
};
BFSEmscriptenNodeOps.prototype.rename = function (oldNode, newDir, newName) {
var oldPath = this.fs.realPath(oldNode);
var newPath = this.PATH.join2(this.fs.realPath(newDir), newName);
try {
this.nodefs.renameSync(oldPath, newPath);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenNodeOps.prototype.unlink = function (parent, name) {
var path = this.PATH.join2(this.fs.realPath(parent), name);
try {
this.nodefs.unlinkSync(path);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenNodeOps.prototype.rmdir = function (parent, name) {
var path = this.PATH.join2(this.fs.realPath(parent), name);
try {
this.nodefs.rmdirSync(path);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenNodeOps.prototype.readdir = function (node) {
var path = this.fs.realPath(node);
try {
return this.nodefs.readdirSync(path);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenNodeOps.prototype.symlink = function (parent, newName, oldPath) {
var newPath = this.PATH.join2(this.fs.realPath(parent), newName);
try {
this.nodefs.symlinkSync(oldPath, newPath);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
BFSEmscriptenNodeOps.prototype.readlink = function (node) {
var path = this.fs.realPath(node);
try {
return this.nodefs.readlinkSync(path);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
};
return BFSEmscriptenNodeOps;
}());
var BFSEmscriptenFS = (function () {
function BFSEmscriptenFS(_FS, _PATH, _ERRNO_CODES, nodefs) {
if (_FS === void 0) { _FS = self['FS']; }
if (_PATH === void 0) { _PATH = self['PATH']; }
if (_ERRNO_CODES === void 0) { _ERRNO_CODES = self['ERRNO_CODES']; }
if (nodefs === void 0) { nodefs = fs; }
this.flagsToPermissionStringMap = {
0: 'r',
1: 'r+',
2: 'r+',
64: 'r',
65: 'r+',
66: 'r+',
129: 'rx+',
193: 'rx+',
514: 'w+',
577: 'w',
578: 'w+',
705: 'wx',
706: 'wx+',
1024: 'a',
1025: 'a',
1026: 'a+',
1089: 'a',
1090: 'a+',
1153: 'ax',
1154: 'ax+',
1217: 'ax',
1218: 'ax+',
4096: 'rs',
4098: 'rs+'
};
if (typeof BrowserFS === 'undefined') {
throw new Error("BrowserFS is not loaded. Please load it before this library.");
}
this.nodefs = nodefs;
this.FS = _FS;
this.PATH = _PATH;
this.ERRNO_CODES = _ERRNO_CODES;
this.node_ops = new BFSEmscriptenNodeOps(this);
this.stream_ops = new BFSEmscriptenStreamOps(this);
}
BFSEmscriptenFS.prototype.mount = function (mount) {
return this.createNode(null, '/', this.getMode(mount.opts.root), 0);
};
BFSEmscriptenFS.prototype.createNode = function (parent, name, mode, dev) {
var FS = this.FS;
if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
throw new FS.ErrnoError(this.ERRNO_CODES.EINVAL);
}
var node = FS.createNode(parent, name, mode);
node.node_ops = this.node_ops;
node.stream_ops = this.stream_ops;
return node;
};
BFSEmscriptenFS.prototype.getMode = function (path) {
var stat;
try {
stat = this.nodefs.lstatSync(path);
}
catch (e) {
if (!e.code)
throw e;
throw new this.FS.ErrnoError(this.ERRNO_CODES[e.code]);
}
return stat.mode;
};
BFSEmscriptenFS.prototype.realPath = function (node) {
var parts = [];
while (node.parent !== node) {
parts.push(node.name);
node = node.parent;
}
parts.push(node.mount.opts.root);
parts.reverse();
return this.PATH.join.apply(null, parts);
};
BFSEmscriptenFS.prototype.flagsToPermissionString = function (flags) {
var parsedFlags = (typeof flags === "string") ? parseInt(flags, 10) : flags;
parsedFlags &= 0x1FFF;
if (parsedFlags in this.flagsToPermissionStringMap) {
return this.flagsToPermissionStringMap[parsedFlags];
}
else {
return flags;
}
};
BFSEmscriptenFS.prototype.getNodeFS = function () {
return this.nodefs;
};
BFSEmscriptenFS.prototype.getFS = function () {
return this.FS;
};
BFSEmscriptenFS.prototype.getPATH = function () {
return this.PATH;
};
BFSEmscriptenFS.prototype.getERRNO_CODES = function () {
return this.ERRNO_CODES;
};
return BFSEmscriptenFS;
}());
exports.__esModule = true;
exports["default"] = BFSEmscriptenFS;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1zY3JpcHRlbl9mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nZW5lcmljL2Vtc2NyaXB0ZW5fZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQVdBLElBQU8sU0FBUyxXQUFXLG1CQUFtQixDQUFDLENBQUM7QUFFaEQsSUFBTyxFQUFFLFdBQVcsaUJBQWlCLENBQUMsQ0FBQztBQUV2QyxxQkFBZ0MsY0FBYyxDQUFDLENBQUE7QUFpRS9DO0lBTUUsZ0NBQW9CLEVBQW1CO1FBQW5CLE9BQUUsR0FBRixFQUFFLENBQWlCO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTSxxQ0FBSSxHQUFYLFVBQVksTUFBd0I7UUFDbEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUN0QyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQztZQUNILEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDekYsQ0FBQztRQUNILENBQUU7UUFBQSxLQUFLLENBQUMs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MUIsQ0FBQztJQUlILHNCQUFDO0FBQUQsQ0FBQyxBQTlHRCxJQThHQztBQTlHRDtvQ0E4R0MsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmaW5lcyBhbiBFbXNjcmlwdGVuIGZpbGUgc3lzdGVtIG9iamVjdCBmb3IgdXNlIGluIHRoZSBFbXNjcmlwdGVuIHZpcnR1YWxcbiAqIGZpbGVzeXN0ZW0uIEFsbG93cyB5b3UgdG8gdXNlIHN5bmNocm9ub3VzIEJyb3dzZXJGUyBmaWxlIHN5c3RlbXMgZnJvbSB3aXRoaW5cbiAqIEVtc2NyaXB0ZW4uXG4gKlxuICogWW91IGNhbiBjb25zdHJ1Y3QgYSBCRlNFbXNjcmlwdGVuRlMsIG1vdW50IGl0IHVzaW5nIGl0cyBtb3VudCBjb21tYW5kLFxuICogYW5kIHRoZW4gbW91bnQgaXQgaW50byBFbXNjcmlwdGVuLlxuICpcbiAqIEFkYXB0ZWQgZnJvbSBFbXNjcmlwdGVuJ3MgTm9kZUZTOlxuICogaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9rcmlwa2VuL2Vtc2NyaXB0ZW4vbWFzdGVyL3NyYy9saWJyYXJ5X25vZGVmcy5qc1xuICovXG5pbXBvcnQgQnJvd3NlckZTID0gcmVxdWlyZSgnLi4vY29yZS9icm93c2VyZnMnKTtcbmltcG9ydCBGUyBmcm9tICcuLi9jb3JlL0ZTJztcbmltcG9ydCBmcyA9IHJlcXVpcmUoJy4uL2NvcmUvbm9kZV9mcycpO1xuaW1wb3J0IE5vZGVTdGF0cyBmcm9tICcuLi9jb3JlL25vZGVfZnNfc3RhdHMnO1xuaW1wb3J0IHt1aW50OEFycmF5MkJ1ZmZlcn0gZnJvbSAnLi4vY29yZS91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0cyB7XG4gIGRldjogbnVtYmVyO1xuICBpbm86IG51bWJlcjtcbiAgbW9kZTogbnVtYmVyO1xuICBubGluazogbnVtYmVyO1xuICB1aWQ6IG51bWJlcjtcbiAgZ2lkOiBudW1iZXI7XG4gIHJkZXY6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xuICBibGtzaXplOiBudW1iZXI7XG4gIGJsb2NrczogbnVtYmVyO1xuICBhdGltZTogRGF0ZTtcbiAgbXRpbWU6IERhdGU7XG4gIGN0aW1lOiBEYXRlO1xuICB0aW1lc3RhbXA/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1zY3JpcHRlbkZTTm9kZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbW9kZTogbnVtYmVyO1xuICBwYXJlbnQ6IEVtc2NyaXB0ZW5GU05vZGU7XG4gIG1vdW50OiB7b3B0czoge3Jvb3Q6IHN0cmluZ319O1xuICBzdHJlYW1fb3BzOiBFbXNjcmlwdGVuU3RyZWFtT3BzO1xuICBub2RlX29wczogRW1zY3JpcHRlbk5vZGVPcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1zY3JpcHRlblN0cmVhbSB7XG4gIG5vZGU6IEVtc2NyaXB0ZW5GU05vZGU7XG4gIG5mZDogYW55O1xuICBmbGFnczogc3RyaW5nO1xuICBwb3NpdGlvbjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtc2NyaXB0ZW5Ob2RlT3BzIHtcbiAgZ2V0YXR0cihub2RlOiBFbXNjcmlwdGVuRlNOb2RlKTogU3RhdHM7XG4gIHNldGF0dHIobm9kZTogRW1zY3JpcHRlbkZTTm9kZSwgYXR0cjogU3RhdHMpOiB2b2lkO1xuICBsb29rdXAocGFyZW50OiBFbXNjcmlwdGVuRlNOb2RlLCBuYW1lOiBzdHJpbmcpOiBFbXNjcmlwdGVuRlNOb2RlO1xuICBta25vZChwYXJlbnQ6IEVtc2NyaXB0ZW5GU05vZGUsIG5hbWU6IHN0cmluZywgbW9kZTogbnVtYmVyLCBkZXY6IGFueSk6IEVtc2NyaXB0ZW5GU05vZGU7XG4gIHJlbmFtZShvbGROb2RlOiBFbXNjcmlwdGVuRlNOb2RlLCBuZXdEaXI6IEVtc2NyaXB0ZW5GU05vZGUsIG5ld05hbWU6IHN0cmluZyk6IHZvaWQ7XG4gIHVubGluayhwYXJlbnQ6IEVtc2NyaXB0ZW5GU05vZGUsIG5hbWU6IHN0cmluZyk6IHZvaWQ7XG4gIHJtZGlyKHBhcmVudDogRW1zY3JpcHRlbkZTTm9kZSwgbmFtZTogc3RyaW5nKTogdm9pZDtcbiAgcmVhZGRpcihub2RlOiBFbXNjcmlwdGVuRlNOb2RlKTogc3RyaW5nW107XG4gIHN5bWxpbmsocGFyZW50OiBFbXNjcmlwdGVuRlNOb2RlLCBuZXdOYW1lOiBzdHJpbmcsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQ7XG4gIHJlYWRsaW5rKG5vZGU6IEVtc2NyaXB0ZW5GU05vZGUpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1zY3JpcHRlblN0cmVhbU9wcyB7XG4gIG9wZW4oc3RyZWFtOiBFbXNjcmlwdGVuU3RyZWFtKTogdm9pZDtcbiAgY2xvc2Uoc3RyZWFtOiBFbXNjcmlwdGVuU3RyZWFtKTogdm9pZDtcbiAgcmVhZChzdHJlYW06IEVtc2NyaXB0ZW5TdHJlYW0sIGJ1ZmZlcjogVWludDhBcnJheSwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBwb3NpdGlvbjogbnVtYmVyKTogbnVtYmVyO1xuICB3cml0ZShzdHJlYW06IEVtc2NyaXB0ZW5TdHJlYW0sIGJ1ZmZlcjogVWludDhBcnJheSwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBwb3NpdGlvbjogbnVtYmVyKTogbnVtYmVyO1xuICBsbHNlZWsoc3RyZWFtOiBFbXNjcmlwdGVuU3RyZWFtLCBvZmZzZXQ6IG51bWJlciwgd2hlbmNlOiBudW1iZXIpOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1zY3JpcHRlbkZTIHtcbiAgbW91bnQobW91bnQ6IHtvcHRzOiB7cm9vdDogc3RyaW5nfX0pOiBFbXNjcmlwdGVuRlNOb2RlO1xuICBjcmVhdGVOb2RlKHBhcmVudDogRW1zY3JpcHRlbkZTTm9kZSwgbmFtZTogc3RyaW5nLCBtb2RlOiBudW1iZXIsIGRldj86IGFueSk6IEVtc2NyaXB0ZW5GU05vZGU7XG4gIGdldE1vZGUocGF0aDogc3RyaW5nKTogbnVtYmVyO1xuICByZWFsUGF0aChub2RlOiBFbXNjcmlwdGVuRlNOb2RlKTogc3RyaW5nO1xuICBub2RlX29wczogRW1zY3JpcHRlbk5vZGVPcHM7XG4gIHN0cmVhbV9vcHM6IEVtc2NyaXB0ZW5TdHJlYW1PcHM7XG59XG5cbmNsYXNzIEJGU0Vtc2NyaXB0ZW5TdHJlYW1PcHMgaW1wbGVtZW50cyBFbXNjcmlwdGVuU3RyZWFtT3BzIHtcbiAgcHJpdmF0ZSBGUzogYW55O1xuICBwcml2YXRlIFBBVEg6IGFueTtcbiAgcHJpdmF0ZSBFUlJOT19DT0RFUzogYW55O1xuICBwcml2YXRlIG5vZGVmczogRlM7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmczogQkZTRW1zY3JpcHRlbkZTKSB7XG4gICAgdGhpcy5ub2RlZnMgPSBmcy5nZXROb2RlRlMoKTtcbiAgICB0aGlzLkZTID0gZnMuZ2V0RlMoKTtcbiAgICB0aGlzLlBBVEggPSBmcy5nZXRQQVRIKCk7XG4gICAgdGhpcy5FUlJOT19DT0RFUyA9IGZzLmdldEVSUk5PX0NPREVTKCk7XG4gIH1cblxuICBwdWJsaWMgb3BlbihzdHJlYW06IEVtc2NyaXB0ZW5TdHJlYW0pOiB2b2lkIHtcbiAgICB2YXIgcGF0aCA9IHRoaXMuZnMucmVhbFBhdGgoc3RyZWFtLm5vZGUpLFxuICAgICAgRlMgPSB0aGlzLkZTO1xuICAgIHRyeSB7XG4gICAgICBpZiAoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKSB7XG4gICAgICAgIHN0cmVhbS5uZmQgPSB0aGlzLm5vZGVmcy5vcGVuU3luYyhwYXRoLCB0aGlzLmZzLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKHN0cmVhbS5mbGFncykpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghZS5jb2RlKSB0aHJvdyBlO1xuICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IodGhpcy5FUlJOT19DT0RFU1tlLmNvZGVdKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xvc2Uoc3RyZWFtOiBFbXNjcmlwdGVuU3RyZWFtKTogdm9pZCB7XG4gICAgdmFyIEZTID0gdGhpcy5GUztcbiAgICB0cnkge1xuICAgICAgaWYgKEZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSAmJiBzdHJlYW0ubmZkKSB7XG4gICAgICAgIHRoaXMubm9kZWZzLmNsb3NlU3luYyhzdHJlYW0ubmZkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIWUuY29kZSkgdGhyb3cgZTtcbiAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKHRoaXMuRVJSTk9fQ09ERVNbZS5jb2RlXSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlYWQoc3RyZWFtOiBFbXNjcmlwdGVuU3RyZWFtLCBidWZmZXI6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgcG9zaXRpb246IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gQXZvaWQgY29weWluZyBvdmVyaGVhZCBieSByZWFkaW5nIGRpcmVjdGx5IGludG8gYnVmZmVyLlxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlZnMucmVhZFN5bmMoc3RyZWFtLm5mZCwgdWludDhBcnJheTJCdWZmZXIoYnVmZmVyKSwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgdGhpcy5GUy5FcnJub0Vycm9yKHRoaXMuRVJSTk9fQ09ERVNbZS5jb2RlXSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdyaXRlKHN0cmVhbTogRW1zY3JpcHRlblN0cmVhbSwgYnVmZmVyOiBVaW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEF2b2lkIGNvcHlpbmcgb3ZlcmhlYWQuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVmcy53cml0ZVN5bmMoc3RyZWFtLm5mZCwgdWludDhBcnJheTJCdWZmZXIoYnVmZmVyKSwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgdGhpcy5GUy5FcnJub0Vycm9yKHRoaXMuRVJSTk9fQ09ERVNbZS5jb2RlXSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxsc2VlayhzdHJlYW06IEVtc2NyaXB0ZW5TdHJlYW0sIG9mZnNldDogbnVtYmVyLCB3aGVuY2U6IG51bWJlcik6IG51bWJlciB7XG4gICAgdmFyIHBvc2l0aW9uID0gb2Zmc2V0O1xuICAgIGlmICh3aGVuY2UgPT09IDEpIHsgIC8vIFNFRUtfQ1VSLlxuICAgICAgcG9zaXRpb24gKz0gc3RyZWFtLnBvc2l0aW9uO1xuICAgIH0gZWxzZSBpZiAod2hlbmNlID09PSAyKSB7ICAvLyBTRUVLX0VORC5cbiAgICAgIGlmICh0aGlzLkZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBzdGF0ID0gdGhpcy5ub2RlZnMuZnN0YXRTeW5jKHN0cmVhbS5uZmQpO1xuICAgICAgICAgIHBvc2l0aW9uICs9IHN0YXQuc2l6ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyB0aGlzLkZTLkVycm5vRXJyb3IodGhpcy5FUlJOT19DT0RFU1tlLmNvZGVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApIHtcbiAgICAgIHRocm93IG5ldyB0aGlzLkZTLkVycm5vRXJyb3IodGhpcy5FUlJOT19DT0RFUy5FSU5WQUwpO1xuICAgIH1cblxuICAgIHN0cmVhbS5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxufVxuXG5jbGFzcyBCRlNFbXNjcmlwdGVuTm9kZU9wcyBpbXBsZW1lbnRzIEVtc2NyaXB0ZW5Ob2RlT3BzIHtcbiAgcHJpdmF0ZSBGUzogYW55O1xuICBwcml2YXRlIFBBVEg6IGFueTtcbiAgcHJpdmF0ZSBFUlJOT19DT0RFUzogYW55O1xuICBwcml2YXRlIG5vZGVmczogRlM7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmczogQkZTRW1zY3JpcHRlbkZTKSB7XG4gICAgdGhpcy5ub2RlZnMgPSBmcy5nZXROb2RlRlMoKTtcbiAgICB0aGlzLkZTID0gZnMuZ2V0RlMoKTtcbiAgICB0aGlzLlBBVEggPSBmcy5nZXRQQVRIKCk7XG4gICAgdGhpcy5FUlJOT19DT0RFUyA9IGZzLmdldEVSUk5PX0NPREVTKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0YXR0cihub2RlOiBFbXNjcmlwdGVuRlNOb2RlKTogU3RhdHMge1xuICAgIHZhciBwYXRoID0gdGhpcy5mcy5yZWFsUGF0aChub2RlKTtcbiAgICB2YXIgc3RhdDogTm9kZVN0YXRzO1xuICAgIHRyeSB7XG4gICAgICBzdGF0ID0gdGhpcy5ub2RlZnMubHN0YXRTeW5jKHBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghZS5jb2RlKSB0aHJvdyBlO1xuICAgICAgdGhyb3cgbmV3IHRoaXMuRlMuRXJybm9FcnJvcih0aGlzLkVSUk5PX0NPREVTW2UuY29kZV0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGV2OiBzdGF0LmRldixcbiAgICAgIGlubzogc3RhdC5pbm8sXG4gICAgICBtb2RlOiBzdGF0Lm1vZGUsXG4gICAgICBubGluazogc3RhdC5ubGluayxcbiAgICAgIHVpZDogc3RhdC51aWQsXG4gICAgICBnaWQ6IHN0YXQuZ2lkLFxuICAgICAgcmRldjogc3RhdC5yZGV2LFxuICAgICAgc2l6ZTogc3RhdC5zaXplLFxuICAgICAgYXRpbWU6IHN0YXQuYXRpbWUsXG4gICAgICBtdGltZTogc3RhdC5tdGltZSxcbiAgICAgIGN0aW1lOiBzdGF0LmN0aW1lLFxuICAgICAgYmxrc2l6ZTogc3RhdC5ibGtzaXplLFxuICAgICAgYmxvY2tzOiBzdGF0LmJsb2Nrc1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc2V0YXR0cihub2RlOiBFbXNjcmlwdGVuRlNOb2RlLCBhdHRyOiBTdGF0cyk6IHZvaWQge1xuICAgIHZhciBwYXRoID0gdGhpcy5mcy5yZWFsUGF0aChub2RlKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGF0dHIubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubm9kZWZzLmNobW9kU3luYyhwYXRoLCBhdHRyLm1vZGUpO1xuICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbW1vbiBub2RlIHN0cnVjdHVyZSBtb2RlIGFzIHdlbGxcbiAgICAgICAgbm9kZS5tb2RlID0gYXR0ci5tb2RlO1xuICAgICAgfVxuICAgICAgaWYgKGF0dHIudGltZXN0YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShhdHRyLnRpbWVzdGFtcCk7XG4gICAgICAgIHRoaXMubm9kZWZzLnV0aW1lc1N5bmMocGF0aCwgZGF0ZSwgZGF0ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFlLmNvZGUpIHRocm93IGU7XG4gICAgICAvLyBJZ25vcmUgbm90IHN1cHBvcnRlZCBlcnJvcnMuIEVtc2NyaXB0ZW4gZG9lcyB1dGltZXNTeW5jIHdoZW4gaXRcbiAgICAgIC8vIHdyaXRlcyBmaWxlcywgYnV0IG5ldmVyIHJlYWxseSByZXF1aXJlcyB0aGUgdmFsdWUgdG8gYmUgc2V0LlxuICAgICAgaWYgKGUuY29kZSAhPT0gXCJFTk9UU1VQXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IHRoaXMuRlMuRXJybm9FcnJvcih0aGlzLkVSUk5PX0NPREVTW2UuY29kZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXR0ci5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMubm9kZWZzLnRydW5jYXRlU3luYyhwYXRoLCBhdHRyLnNpemUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoIWUuY29kZSkgdGhyb3cgZTtcbiAgICAgICAgdGhyb3cgbmV3IHRoaXMuRlMuRXJybm9FcnJvcih0aGlzLkVSUk5PX0NPREVTW2UuY29kZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb29rdXAocGFyZW50OiBFbXNjcmlwdGVuRlNOb2RlLCBuYW1lOiBzdHJpbmcpOiBFbXNjcmlwdGVuRlNOb2RlIHtcbiAgICB2YXIgcGF0aCA9IHRoaXMuUEFUSC5qb2luMih0aGlzLmZzLnJlYWxQYXRoKHBhcmVudCksIG5hbWUpO1xuICAgIHZhciBtb2RlID0gdGhpcy5mcy5nZXRNb2RlKHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmZzLmNyZWF0ZU5vZGUocGFyZW50LCBuYW1lLCBtb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBta25vZChwYXJlbnQ6IEVtc2NyaXB0ZW5GU05vZGUsIG5hbWU6IHN0cmluZywgbW9kZTogbnVtYmVyLCBkZXY6IGFueSk6IEVtc2NyaXB0ZW5GU05vZGUge1xuICAgIHZhciBub2RlID0gdGhpcy5mcy5jcmVhdGVOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2KTtcbiAgICAvLyBjcmVhdGUgdGhlIGJhY2tpbmcgbm9kZSBmb3IgdGhpcyBpbiB0aGUgZnMgcm9vdCBhcyB3ZWxsXG4gICAgdmFyIHBhdGggPSB0aGlzLmZzLnJlYWxQYXRoKG5vZGUpO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5GUy5pc0Rpcihub2RlLm1vZGUpKSB7XG4gICAgICAgIHRoaXMubm9kZWZzLm1rZGlyU3luYyhwYXRoLCBub2RlLm1vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ub2RlZnMud3JpdGVGaWxlU3luYyhwYXRoLCAnJywgeyBtb2RlOiBub2RlLm1vZGUgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFlLmNvZGUpIHRocm93IGU7XG4gICAgICB0aHJvdyBuZXcgdGhpcy5GUy5FcnJub0Vycm9yKHRoaXMuRVJSTk9fQ09ERVNbZS5jb2RlXSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZShvbGROb2RlOiBFbXNjcmlwdGVuRlNOb2RlLCBuZXdEaXI6IEVtc2NyaXB0ZW5GU05vZGUsIG5ld05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhciBvbGRQYXRoID0gdGhpcy5mcy5yZWFsUGF0aChvbGROb2RlKTtcbiAgICB2YXIgbmV3UGF0aCA9IHRoaXMuUEFUSC5qb2luMih0aGlzLmZzLnJlYWxQYXRoKG5ld0RpciksIG5ld05hbWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm5vZGVmcy5yZW5hbWVTeW5jKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghZS5jb2RlKSB0aHJvdyBlO1xuICAgICAgdGhyb3cgbmV3IHRoaXMuRlMuRXJybm9FcnJvcih0aGlzLkVSUk5PX0NPREVTW2UuY29kZV0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmxpbmsocGFyZW50OiBFbXNjcmlwdGVuRlNOb2RlLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB2YXIgcGF0aCA9IHRoaXMuUEFUSC5qb2luMih0aGlzLmZzLnJlYWxQYXRoKHBhcmVudCksIG5hbWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm5vZGVmcy51bmxpbmtTeW5jKHBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghZS5jb2RlKSB0aHJvdyBlO1xuICAgICAgdGhyb3cgbmV3IHRoaXMuRlMuRXJybm9FcnJvcih0aGlzLkVSUk5PX0NPREVTW2UuY29kZV0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBybWRpcihwYXJlbnQ6IEVtc2NyaXB0ZW5GU05vZGUsIG5hbWU6IHN0cmluZykge1xuICAgIHZhciBwYXRoID0gdGhpcy5QQVRILmpvaW4yKHRoaXMuZnMucmVhbFBhdGgocGFyZW50KSwgbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubm9kZWZzLnJtZGlyU3luYyhwYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIWUuY29kZSkgdGhyb3cgZTtcbiAgICAgIHRocm93IG5ldyB0aGlzLkZTLkVycm5vRXJyb3IodGhpcy5FUlJOT19DT0RFU1tlLmNvZGVdKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVhZGRpcihub2RlOiBFbXNjcmlwdGVuRlNOb2RlKTogc3RyaW5nW10ge1xuICAgIHZhciBwYXRoID0gdGhpcy5mcy5yZWFsUGF0aChub2RlKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZWZzLnJlYWRkaXJTeW5jKHBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghZS5jb2RlKSB0aHJvdyBlO1xuICAgICAgdGhyb3cgbmV3IHRoaXMuRlMuRXJybm9FcnJvcih0aGlzLkVSUk5PX0NPREVTW2UuY29kZV0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzeW1saW5rKHBhcmVudDogRW1zY3JpcHRlbkZTTm9kZSwgbmV3TmFtZTogc3RyaW5nLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB2YXIgbmV3UGF0aCA9IHRoaXMuUEFUSC5qb2luMih0aGlzLmZzLnJlYWxQYXRoKHBhcmVudCksIG5ld05hbWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm5vZGVmcy5zeW1saW5rU3luYyhvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIWUuY29kZSkgdGhyb3cgZTtcbiAgICAgIHRocm93IG5ldyB0aGlzLkZTLkVycm5vRXJyb3IodGhpcy5FUlJOT19DT0RFU1tlLmNvZGVdKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVhZGxpbmsobm9kZTogRW1zY3JpcHRlbkZTTm9kZSk6IHN0cmluZyB7XG4gICAgdmFyIHBhdGggPSB0aGlzLmZzLnJlYWxQYXRoKG5vZGUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlZnMucmVhZGxpbmtTeW5jKHBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghZS5jb2RlKSB0aHJvdyBlO1xuICAgICAgdGhyb3cgbmV3IHRoaXMuRlMuRXJybm9FcnJvcih0aGlzLkVSUk5PX0NPREVTW2UuY29kZV0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCRlNFbXNjcmlwdGVuRlMgaW1wbGVtZW50cyBFbXNjcmlwdGVuRlMge1xuICBwcml2YXRlIEZTOiBhbnk7XG4gIHByaXZhdGUgUEFUSDogYW55O1xuICBwcml2YXRlIEVSUk5PX0NPREVTOiBhbnk7XG4gIHByaXZhdGUgbm9kZWZzOiBGUztcbiAgY29uc3RydWN0b3IoX0ZTID0gKDxhbnk+IHNlbGYpWydGUyddLCBfUEFUSCA9ICg8YW55PiBzZWxmKVsnUEFUSCddLCBfRVJSTk9fQ09ERVMgPSAoPGFueT4gc2VsZilbJ0VSUk5PX0NPREVTJ10sIG5vZGVmczogRlMgPSBmcykge1xuICAgIGlmICh0eXBlb2YgQnJvd3NlckZTID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlckZTIGlzIG5vdCBsb2FkZWQuIFBsZWFzZSBsb2FkIGl0IGJlZm9yZSB0aGlzIGxpYnJhcnkuXCIpO1xuICAgIH1cbiAgICB0aGlzLm5vZGVmcyA9IG5vZGVmcztcbiAgICB0aGlzLkZTID0gX0ZTO1xuICAgIHRoaXMuUEFUSCA9IF9QQVRIO1xuICAgIHRoaXMuRVJSTk9fQ09ERVMgPSBfRVJSTk9fQ09ERVM7XG4gICAgdGhpcy5ub2RlX29wcyA9IG5ldyBCRlNFbXNjcmlwdGVuTm9kZU9wcyh0aGlzKTtcbiAgICB0aGlzLnN0cmVhbV9vcHMgPSBuZXcgQkZTRW1zY3JpcHRlblN0cmVhbU9wcyh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3VudChtb3VudDoge29wdHM6IHtyb290OiBzdHJpbmd9fSk6IEVtc2NyaXB0ZW5GU05vZGUge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vZGUobnVsbCwgJy8nLCB0aGlzLmdldE1vZGUobW91bnQub3B0cy5yb290KSwgMCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlTm9kZShwYXJlbnQ6IEVtc2NyaXB0ZW5GU05vZGUsIG5hbWU6IHN0cmluZywgbW9kZTogbnVtYmVyLCBkZXY/OiBhbnkpOiBFbXNjcmlwdGVuRlNOb2RlIHtcbiAgICB2YXIgRlMgPSB0aGlzLkZTO1xuICAgIGlmICghRlMuaXNEaXIobW9kZSkgJiYgIUZTLmlzRmlsZShtb2RlKSAmJiAhRlMuaXNMaW5rKG1vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcih0aGlzLkVSUk5PX0NPREVTLkVJTlZBTCk7XG4gICAgfVxuICAgIHZhciBub2RlID0gRlMuY3JlYXRlTm9kZShwYXJlbnQsIG5hbWUsIG1vZGUpO1xuICAgIG5vZGUubm9kZV9vcHMgPSB0aGlzLm5vZGVfb3BzO1xuICAgIG5vZGUuc3RyZWFtX29wcyA9IHRoaXMuc3RyZWFtX29wcztcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2RlKHBhdGg6IHN0cmluZyk6IG51bWJlciB7XG4gICAgdmFyIHN0YXQ6IE5vZGVTdGF0cztcbiAgICB0cnkge1xuICAgICAgc3RhdCA9IHRoaXMubm9kZWZzLmxzdGF0U3luYyhwYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIWUuY29kZSkgdGhyb3cgZTtcbiAgICAgIHRocm93IG5ldyB0aGlzLkZTLkVycm5vRXJyb3IodGhpcy5FUlJOT19DT0RFU1tlLmNvZGVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXQubW9kZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFsUGF0aChub2RlOiBFbXNjcmlwdGVuRlNOb2RlKTogc3RyaW5nIHtcbiAgICB2YXIgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgd2hpbGUgKG5vZGUucGFyZW50ICE9PSBub2RlKSB7XG4gICAgICBwYXJ0cy5wdXNoKG5vZGUubmFtZSk7XG4gICAgICBub2RlID0gbm9kZS5wYXJlbnQ7XG4gICAgfVxuICAgIHBhcnRzLnB1c2gobm9kZS5tb3VudC5vcHRzLnJvb3QpO1xuICAgIHBhcnRzLnJldmVyc2UoKTtcbiAgICByZXR1cm4gdGhpcy5QQVRILmpvaW4uYXBwbHkobnVsbCwgcGFydHMpO1xuICB9XG4gIC8vIFRoaXMgbWFwcyB0aGUgaW50ZWdlciBwZXJtaXNzaW9uIG1vZGVzIGZyb20gaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzMvb3BlblxuICAvLyB0byBub2RlLmpzLXNwZWNpZmljIGZpbGUgb3BlbiBwZXJtaXNzaW9uIHN0cmluZ3MgYXQgaHR0cDovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfZnNfb3Blbl9wYXRoX2ZsYWdzX21vZGVfY2FsbGJhY2tcbiAgcHVibGljIGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nTWFwID0ge1xuICAgIDAvKk9fUkRPTkxZKi86ICdyJyxcbiAgICAxLypPX1dST05MWSovOiAncisnLFxuICAgIDIvKk9fUkRXUiovOiAncisnLFxuICAgIDY0LypPX0NSRUFUKi86ICdyJyxcbiAgICA2NS8qT19XUk9OTFl8T19DUkVBVCovOiAncisnLFxuICAgIDY2LypPX1JEV1J8T19DUkVBVCovOiAncisnLFxuICAgIDEyOS8qT19XUk9OTFl8T19FWENMKi86ICdyeCsnLFxuICAgIDE5My8qT19XUk9OTFl8T19DUkVBVHxPX0VYQ0wqLzogJ3J4KycsXG4gICAgNTE0LypPX1JEV1J8T19UUlVOQyovOiAndysnLFxuICAgIDU3Ny8qT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DKi86ICd3JyxcbiAgICA1NzgvKk9fQ1JFQVR8T19SRFdSfE9fVFJVTkMqLzogJ3crJyxcbiAgICA3MDUvKk9fV1JPTkxZfE9fQ1JFQVR8T19FWENMfE9fVFJVTkMqLzogJ3d4JyxcbiAgICA3MDYvKk9fUkRXUnxPX0NSRUFUfE9fRVhDTHxPX1RSVU5DKi86ICd3eCsnLFxuICAgIDEwMjQvKk9fQVBQRU5EKi86ICdhJyxcbiAgICAxMDI1LypPX1dST05MWXxPX0FQUEVORCovOiAnYScsXG4gICAgMTAyNi8qT19SRFdSfE9fQVBQRU5EKi86ICdhKycsXG4gICAgMTA4OS8qT19XUk9OTFl8T19DUkVBVHxPX0FQUEVORCovOiAnYScsXG4gICAgMTA5MC8qT19SRFdSfE9fQ1JFQVR8T19BUFBFTkQqLzogJ2ErJyxcbiAgICAxMTUzLypPX1dST05MWXxPX0VYQ0x8T19BUFBFTkQqLzogJ2F4JyxcbiAgICAxMTU0LypPX1JEV1J8T19FWENMfE9fQVBQRU5EKi86ICdheCsnLFxuICAgIDEyMTcvKk9fV1JPTkxZfE9fQ1JFQVR8T19FWENMfE9fQVBQRU5EKi86ICdheCcsXG4gICAgMTIxOC8qT19SRFdSfE9fQ1JFQVR8T19FWENMfE9fQVBQRU5EKi86ICdheCsnLFxuICAgIDQwOTYvKk9fUkRPTkxZfE9fRFNZTkMqLzogJ3JzJyxcbiAgICA0MDk4LypPX1JEV1J8T19EU1lOQyovOiAncnMrJ1xuICB9XG5cbiAgcHVibGljIGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBwYXJzZWRGbGFncyA9ICh0eXBlb2YgZmxhZ3MgPT09IFwic3RyaW5nXCIpID8gcGFyc2VJbnQoZmxhZ3MsIDEwKSA6IDxudW1iZXI+PGFueT4gZmxhZ3M7XG4gICAgcGFyc2VkRmxhZ3MgJj0gMHgxRkZGO1xuICAgIGlmIChwYXJzZWRGbGFncyBpbiB0aGlzLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nTWFwKSB7XG4gICAgICByZXR1cm4gKDxhbnk+IHRoaXMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXApW3BhcnNlZEZsYWdzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZsYWdzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXROb2RlRlMoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZWZzO1xuICB9XG5cbiAgcHVibGljIGdldEZTKCkge1xuICAgIHJldHVybiB0aGlzLkZTO1xuICB9XG5cbiAgcHVibGljIGdldFBBVEgoKSB7XG4gICAgcmV0dXJuIHRoaXMuUEFUSDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFUlJOT19DT0RFUygpIHtcbiAgICByZXR1cm4gdGhpcy5FUlJOT19DT0RFUztcbiAgfVxuXG4gIHB1YmxpYyBub2RlX29wczogRW1zY3JpcHRlbk5vZGVPcHM7XG4gIHB1YmxpYyBzdHJlYW1fb3BzOiBFbXNjcmlwdGVuU3RyZWFtT3BzO1xufVxuIl19