browserfs
Version:
A filesystem in your browser!
238 lines • 31.3 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var file_system = require('../core/file_system');
var api_error_1 = require('../core/api_error');
var file_flag = require('../core/file_flag');
var preload_file = require('../generic/preload_file');
var path = require('path');
var MirrorFile = (function (_super) {
__extends(MirrorFile, _super);
function MirrorFile(fs, path, flag, stat, data) {
_super.call(this, fs, path, flag, stat, data);
}
MirrorFile.prototype.syncSync = function () {
if (this.isDirty()) {
this._fs._syncSync(this);
this.resetDirty();
}
};
MirrorFile.prototype.closeSync = function () {
this.syncSync();
};
return MirrorFile;
}(preload_file.PreloadFile));
var AsyncMirror = (function (_super) {
__extends(AsyncMirror, _super);
function AsyncMirror(sync, async) {
_super.call(this);
this._queue = [];
this._queueRunning = false;
this._isInitialized = false;
this._initializeCallbacks = [];
this._sync = sync;
this._async = async;
if (!sync.supportsSynch()) {
throw new Error("Expected synchronous storage.");
}
if (async.supportsSynch()) {
throw new Error("Expected asynchronous storage.");
}
}
AsyncMirror.prototype.getName = function () {
return "AsyncMirror";
};
AsyncMirror.isAvailable = function () {
return true;
};
AsyncMirror.prototype._syncSync = function (fd) {
this._sync.writeFileSync(fd.getPath(), fd.getBuffer(), null, file_flag.FileFlag.getFileFlag('w'), fd.getStats().mode);
this.enqueueOp({
apiMethod: 'writeFile',
arguments: [fd.getPath(), fd.getBuffer(), null, fd.getFlag(), fd.getStats().mode]
});
};
AsyncMirror.prototype.initialize = function (userCb) {
var _this = this;
var callbacks = this._initializeCallbacks;
var end = function (e) {
_this._isInitialized = !e;
_this._initializeCallbacks = [];
callbacks.forEach(function (cb) { return cb(e); });
};
if (!this._isInitialized) {
if (callbacks.push(userCb) === 1) {
var copyDirectory_1 = function (p, mode, cb) {
if (p !== '/') {
_this._sync.mkdirSync(p, mode);
}
_this._async.readdir(p, function (err, files) {
var i = 0;
function copyNextFile(err) {
if (err) {
cb(err);
}
else if (i < files.length) {
copyItem_1(path.join(p, files[i]), copyNextFile);
i++;
}
else {
cb();
}
}
if (err) {
cb(err);
}
else {
copyNextFile();
}
});
}, copyFile_1 = function (p, mode, cb) {
_this._async.readFile(p, null, file_flag.FileFlag.getFileFlag('r'), function (err, data) {
if (err) {
cb(err);
}
else {
try {
_this._sync.writeFileSync(p, data, null, file_flag.FileFlag.getFileFlag('w'), mode);
}
catch (e) {
err = e;
}
finally {
cb(err);
}
}
});
}, copyItem_1 = function (p, cb) {
_this._async.stat(p, false, function (err, stats) {
if (err) {
cb(err);
}
else if (stats.isDirectory()) {
copyDirectory_1(p, stats.mode, cb);
}
else {
copyFile_1(p, stats.mode, cb);
}
});
};
copyDirectory_1('/', 0, end);
}
}
else {
userCb();
}
};
AsyncMirror.prototype.checkInitialized = function () {
if (!this._isInitialized) {
throw new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, "AsyncMirrorFS is not initialized. Please initialize AsyncMirrorFS using its initialize() method before using it.");
}
};
AsyncMirror.prototype.isReadOnly = function () { return false; };
AsyncMirror.prototype.supportsSynch = function () { return true; };
AsyncMirror.prototype.supportsLinks = function () { return false; };
AsyncMirror.prototype.supportsProps = function () { return this._sync.supportsProps() && this._async.supportsProps(); };
AsyncMirror.prototype.enqueueOp = function (op) {
var _this = this;
this._queue.push(op);
if (!this._queueRunning) {
this._queueRunning = true;
var doNextOp = function (err) {
if (err) {
console.error("WARNING: File system has desynchronized. Received following error: " + err + "\n$");
}
if (_this._queue.length > 0) {
var op = _this._queue.shift(), args = op.arguments;
args.push(doNextOp);
_this._async[op.apiMethod].apply(_this._async, args);
}
else {
_this._queueRunning = false;
}
};
doNextOp();
}
};
AsyncMirror.prototype.renameSync = function (oldPath, newPath) {
this.checkInitialized();
this._sync.renameSync(oldPath, newPath);
this.enqueueOp({
apiMethod: 'rename',
arguments: [oldPath, newPath]
});
};
AsyncMirror.prototype.statSync = function (p, isLstat) {
this.checkInitialized();
return this._sync.statSync(p, isLstat);
};
AsyncMirror.prototype.openSync = function (p, flag, mode) {
this.checkInitialized();
var fd = this._sync.openSync(p, flag, mode);
fd.closeSync();
return new MirrorFile(this, p, flag, this._sync.statSync(p, false), this._sync.readFileSync(p, null, file_flag.FileFlag.getFileFlag('r')));
};
AsyncMirror.prototype.unlinkSync = function (p) {
this.checkInitialized();
this._sync.unlinkSync(p);
this.enqueueOp({
apiMethod: 'unlink',
arguments: [p]
});
};
AsyncMirror.prototype.rmdirSync = function (p) {
this.checkInitialized();
this._sync.rmdirSync(p);
this.enqueueOp({
apiMethod: 'rmdir',
arguments: [p]
});
};
AsyncMirror.prototype.mkdirSync = function (p, mode) {
this.checkInitialized();
this._sync.mkdirSync(p, mode);
this.enqueueOp({
apiMethod: 'mkdir',
arguments: [p, mode]
});
};
AsyncMirror.prototype.readdirSync = function (p) {
this.checkInitialized();
return this._sync.readdirSync(p);
};
AsyncMirror.prototype.existsSync = function (p) {
this.checkInitialized();
return this._sync.existsSync(p);
};
AsyncMirror.prototype.chmodSync = function (p, isLchmod, mode) {
this.checkInitialized();
this._sync.chmodSync(p, isLchmod, mode);
this.enqueueOp({
apiMethod: 'chmod',
arguments: [p, isLchmod, mode]
});
};
AsyncMirror.prototype.chownSync = function (p, isLchown, uid, gid) {
this.checkInitialized();
this._sync.chownSync(p, isLchown, uid, gid);
this.enqueueOp({
apiMethod: 'chown',
arguments: [p, isLchown, uid, gid]
});
};
AsyncMirror.prototype.utimesSync = function (p, atime, mtime) {
this.checkInitialized();
this._sync.utimesSync(p, atime, mtime);
this.enqueueOp({
apiMethod: 'utimes',
arguments: [p, atime, mtime]
});
};
return AsyncMirror;
}(file_system.SynchronousFileSystem));
exports.__esModule = true;
exports["default"] = AsyncMirror;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXN5bmNNaXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZC9Bc3luY01pcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFPLFdBQVcsV0FBVyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3BELDBCQUFrQyxtQkFBbUIsQ0FBQyxDQUFBO0FBQ3RELElBQU8sU0FBUyxXQUFXLG1CQUFtQixDQUFDLENBQUM7QUFHaEQsSUFBTyxZQUFZLFdBQVcseUJBQXlCLENBQUMsQ0FBQztBQUN6RCxJQUFZLElBQUksV0FBTSxNQUFNLENBQUMsQ0FBQTtBQVU3QjtJQUF5Qiw4QkFBcUM7SUFDNUQsb0JBQVksRUFBZSxFQUFFLElBQVksRUFBRSxJQUF3QixFQUFFLElBQVcsRUFBRSxJQUFZO1FBQzVGLGtCQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sNkJBQVEsR0FBZjtRQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRU0sOEJBQVMsR0FBaEI7UUFDRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQWZELENBQXlCLFlBQVksQ0FBQyxXQUFXLEdBZWhEO0FBWUQ7SUFBeUMsK0JBQWlDO0lBVXhFLHFCQUFZLElBQTRCLEVBQUUsS0FBNkI7UUFDckUsaUJBQU8sQ0FBQztRQVBGLFdBQU0sR0FBc0IsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRy9CLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hD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WyJpbXBvcnQgZmlsZV9zeXN0ZW0gPSByZXF1aXJlKCcuLi9jb3JlL2ZpbGVfc3lzdGVtJyk7XG5pbXBvcnQge0FwaUVycm9yLCBFcnJvckNvZGV9IGZyb20gJy4uL2NvcmUvYXBpX2Vycm9yJztcbmltcG9ydCBmaWxlX2ZsYWcgPSByZXF1aXJlKCcuLi9jb3JlL2ZpbGVfZmxhZycpO1xuaW1wb3J0IGZpbGUgPSByZXF1aXJlKCcuLi9jb3JlL2ZpbGUnKTtcbmltcG9ydCBTdGF0cyBmcm9tICcuLi9jb3JlL25vZGVfZnNfc3RhdHMnO1xuaW1wb3J0IHByZWxvYWRfZmlsZSA9IHJlcXVpcmUoJy4uL2dlbmVyaWMvcHJlbG9hZF9maWxlJyk7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbnRlcmZhY2UgSUFzeW5jT3BlcmF0aW9uIHtcblx0YXBpTWV0aG9kOiBzdHJpbmc7XG5cdGFyZ3VtZW50czogYW55W107XG59XG5cbi8qKlxuICogV2UgZGVmaW5lIG91ciBvd24gZmlsZSB0byBpbnRlcnBvc2Ugb24gc3luY1N5bmMoKSBmb3IgbWlycm9yaW5nIHB1cnBvc2VzLlxuICovXG5jbGFzcyBNaXJyb3JGaWxlIGV4dGVuZHMgcHJlbG9hZF9maWxlLlByZWxvYWRGaWxlPEFzeW5jTWlycm9yPiBpbXBsZW1lbnRzIGZpbGUuRmlsZSB7XG4gIGNvbnN0cnVjdG9yKGZzOiBBc3luY01pcnJvciwgcGF0aDogc3RyaW5nLCBmbGFnOiBmaWxlX2ZsYWcuRmlsZUZsYWcsIHN0YXQ6IFN0YXRzLCBkYXRhOiBCdWZmZXIpIHtcbiAgICBzdXBlcihmcywgcGF0aCwgZmxhZywgc3RhdCwgZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgc3luY1N5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXJ0eSgpKSB7XG4gICAgICB0aGlzLl9mcy5fc3luY1N5bmModGhpcyk7XG4gICAgICB0aGlzLnJlc2V0RGlydHkoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xvc2VTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuc3luY1N5bmMoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFzeW5jTWlycm9yRlMgbWlycm9ycyBhIHN5bmNocm9ub3VzIGZpbGVzeXN0ZW0gaW50byBhbiBhc3luY2hyb25vdXMgZmlsZXN5c3RlbVxuICogYnk6XG4gKiAqIFBlcmZvcm1pbmcgb3BlcmF0aW9ucyBvdmVyIHRoZSBpbi1tZW1vcnkgY29weSwgd2hpbGUgYXN5bmNocm9ub3VzbHkgcGlwZWxpbmluZyB0aGVtXG4gKiAgIHRvIHRoZSBiYWNraW5nIHN0b3JlLlxuICogKiBEdXJpbmcgYXBwbGljYXRpb24gbG9hZGluZywgdGhlIGNvbnRlbnRzIG9mIHRoZSBhc3luYyBmaWxlIHN5c3RlbSBjYW4gYmUgcmVsb2FkZWQgaW50b1xuICogICB0aGUgc3luY2hyb25vdXMgc3RvcmUsIGlmIGRlc2lyZWQuXG4gKiBUaGUgdHdvIHN0b3JlcyB3aWxsIGJlIGtlcHQgaW4gc3luYy4gVGhlIG1vc3QgY29tbW9uIHVzZS1jYXNlIGlzIHRvIHBhaXIgYSBzeW5jaHJvbm91c1xuICogaW4tbWVtb3J5IGZpbGVzeXN0ZW0gd2l0aCBhbiBhc3luY2hyb25vdXMgYmFja2luZyBzdG9yZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXN5bmNNaXJyb3IgZXh0ZW5kcyBmaWxlX3N5c3RlbS5TeW5jaHJvbm91c0ZpbGVTeXN0ZW0gaW1wbGVtZW50cyBmaWxlX3N5c3RlbS5GaWxlU3lzdGVtIHtcbiAgLyoqXG4gICAqIFF1ZXVlIG9mIHBlbmRpbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIF9xdWV1ZTogSUFzeW5jT3BlcmF0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfcXVldWVSdW5uaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3N5bmM6IGZpbGVfc3lzdGVtLkZpbGVTeXN0ZW07XG4gIHByaXZhdGUgX2FzeW5jOiBmaWxlX3N5c3RlbS5GaWxlU3lzdGVtO1xuICBwcml2YXRlIF9pc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2luaXRpYWxpemVDYWxsYmFja3M6ICgoZT86IEFwaUVycm9yKSA9PiB2b2lkKVtdID0gW107XG4gIGNvbnN0cnVjdG9yKHN5bmM6IGZpbGVfc3lzdGVtLkZpbGVTeXN0ZW0sIGFzeW5jOiBmaWxlX3N5c3RlbS5GaWxlU3lzdGVtKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9zeW5jID0gc3luYztcbiAgICB0aGlzLl9hc3luYyA9IGFzeW5jO1xuICAgIGlmICghc3luYy5zdXBwb3J0c1N5bmNoKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHN5bmNocm9ub3VzIHN0b3JhZ2UuXCIpO1xuICAgIH1cbiAgICBpZiAoYXN5bmMuc3VwcG9ydHNTeW5jaCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBhc3luY2hyb25vdXMgc3RvcmFnZS5cIik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcblx0IFx0cmV0dXJuIFwiQXN5bmNNaXJyb3JcIjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgX3N5bmNTeW5jKGZkOiBwcmVsb2FkX2ZpbGUuUHJlbG9hZEZpbGU8YW55Pikge1xuICAgIHRoaXMuX3N5bmMud3JpdGVGaWxlU3luYyhmZC5nZXRQYXRoKCksIGZkLmdldEJ1ZmZlcigpLCBudWxsLCBmaWxlX2ZsYWcuRmlsZUZsYWcuZ2V0RmlsZUZsYWcoJ3cnKSwgZmQuZ2V0U3RhdHMoKS5tb2RlKTtcbiAgICB0aGlzLmVucXVldWVPcCh7XG4gICAgICBhcGlNZXRob2Q6ICd3cml0ZUZpbGUnLFxuICAgICAgYXJndW1lbnRzOiBbZmQuZ2V0UGF0aCgpLCBmZC5nZXRCdWZmZXIoKSwgbnVsbCwgZmQuZ2V0RmxhZygpLCBmZC5nZXRTdGF0cygpLm1vZGVdXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgdG8gbG9hZCB1cCBmaWxlcyBmcm9tIGFzeW5jIHN0b3JhZ2UgaW50byBzeW5jIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSh1c2VyQ2I6IChlcnI/OiBBcGlFcnJvcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuX2luaXRpYWxpemVDYWxsYmFja3M7XG5cbiAgICBjb25zdCBlbmQgPSAoZT86IEFwaUVycm9yKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gIWU7XG4gICAgICB0aGlzLl9pbml0aWFsaXplQ2FsbGJhY2tzID0gW107XG4gICAgICBjYWxsYmFja3MuZm9yRWFjaCgoY2IpID0+IGNiKGUpKTtcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XG4gICAgICAvLyBGaXJzdCBjYWxsIHRyaWdnZXJzIGluaXRpYWxpemF0aW9uLCB0aGUgcmVzdCB3YWl0LlxuICAgICAgaWYgKGNhbGxiYWNrcy5wdXNoKHVzZXJDYikgPT09IDEpIHtcbiAgICAgICAgY29uc3QgY29weURpcmVjdG9yeSA9IChwOiBzdHJpbmcsIG1vZGU6IG51bWJlciwgY2I6IChlcnI/OiBBcGlFcnJvcikgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgIGlmIChwICE9PSAnLycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N5bmMubWtkaXJTeW5jKHAsIG1vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9hc3luYy5yZWFkZGlyKHAsIChlcnIsIGZpbGVzKSA9PiB7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGluIGEgbGV4aWNhbGx5IG5lc3RlZCBzdGF0ZW1lbnQsXG4gICAgICAgICAgICAvLyBzdWNoIGFzIGFuIGlmIG9yIHdoaWxlIHN0YXRlbWVudC4gU2FmYXJpIHJlZnVzZXMgdG8gcnVuIHRoZVxuICAgICAgICAgICAgLy8gc2NyaXB0IHNpbmNlIGl0IGlzIHVuZGVmaW5lZCBiZWhhdmlvci5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvcHlOZXh0RmlsZShlcnI/OiBBcGlFcnJvcikge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29weUl0ZW0ocGF0aC5qb2luKHAsIGZpbGVzW2ldKSwgY29weU5leHRGaWxlKTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICBjYihlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29weU5leHRGaWxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGNvcHlGaWxlID0gKHA6IHN0cmluZywgbW9kZTogbnVtYmVyLCBjYjogKGVycj86IEFwaUVycm9yKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgdGhpcy5fYXN5bmMucmVhZEZpbGUocCwgbnVsbCwgZmlsZV9mbGFnLkZpbGVGbGFnLmdldEZpbGVGbGFnKCdyJyksIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3luYy53cml0ZUZpbGVTeW5jKHAsIGRhdGEsIG51bGwsIGZpbGVfZmxhZy5GaWxlRmxhZy5nZXRGaWxlRmxhZygndycpLCBtb2RlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGVyciA9IGU7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBjb3B5SXRlbSA9IChwOiBzdHJpbmcsIGNiOiAoZXJyPzogQXBpRXJyb3IpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICB0aGlzLl9hc3luYy5zdGF0KHAsIGZhbHNlLCAoZXJyLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICBjYihlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgIGNvcHlEaXJlY3RvcnkocCwgc3RhdHMubW9kZSwgY2IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29weUZpbGUocCwgc3RhdHMubW9kZSwgY2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb3B5RGlyZWN0b3J5KCcvJywgMCwgZW5kKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXNlckNiKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0luaXRpYWxpemVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKEVycm9yQ29kZS5FUEVSTSwgXCJBc3luY01pcnJvckZTIGlzIG5vdCBpbml0aWFsaXplZC4gUGxlYXNlIGluaXRpYWxpemUgQXN5bmNNaXJyb3JGUyB1c2luZyBpdHMgaW5pdGlhbGl6ZSgpIG1ldGhvZCBiZWZvcmUgdXNpbmcgaXQuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1JlYWRPbmx5KCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cbiAgcHVibGljIHN1cHBvcnRzU3luY2goKTogYm9vbGVhbiB7IHJldHVybiB0cnVlOyB9XG4gIHB1YmxpYyBzdXBwb3J0c0xpbmtzKCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cbiAgcHVibGljIHN1cHBvcnRzUHJvcHMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zeW5jLnN1cHBvcnRzUHJvcHMoKSAmJiB0aGlzLl9hc3luYy5zdXBwb3J0c1Byb3BzKCk7IH1cblxuICBwcml2YXRlIGVucXVldWVPcChvcDogSUFzeW5jT3BlcmF0aW9uKSB7XG4gICAgdGhpcy5fcXVldWUucHVzaChvcCk7XG4gICAgaWYgKCF0aGlzLl9xdWV1ZVJ1bm5pbmcpIHtcbiAgICAgIHRoaXMuX3F1ZXVlUnVubmluZyA9IHRydWU7XG4gICAgICB2YXIgZG9OZXh0T3AgPSAoZXJyPzogQXBpRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFdBUk5JTkc6IEZpbGUgc3lzdGVtIGhhcyBkZXN5bmNocm9uaXplZC4gUmVjZWl2ZWQgZm9sbG93aW5nIGVycm9yOiAke2Vycn1cXG4kYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgb3AgPSB0aGlzLl9xdWV1ZS5zaGlmdCgpLFxuICAgICAgICAgICAgYXJncyA9IG9wLmFyZ3VtZW50cztcbiAgICAgICAgICBhcmdzLnB1c2goZG9OZXh0T3ApO1xuICAgICAgICAgICg8RnVuY3Rpb24+ICg8YW55PiB0aGlzLl9hc3luYylbb3AuYXBpTWV0aG9kXSkuYXBwbHkodGhpcy5fYXN5bmMsIGFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3F1ZXVlUnVubmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZG9OZXh0T3AoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lU3luYyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tJbml0aWFsaXplZCgpO1xuICAgIHRoaXMuX3N5bmMucmVuYW1lU3luYyhvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICB0aGlzLmVucXVldWVPcCh7XG4gICAgICBhcGlNZXRob2Q6ICdyZW5hbWUnLFxuICAgICAgYXJndW1lbnRzOiBbb2xkUGF0aCwgbmV3UGF0aF1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgc3RhdFN5bmMocDogc3RyaW5nLCBpc0xzdGF0OiBib29sZWFuKTogU3RhdHMge1xuICAgIHRoaXMuY2hlY2tJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLl9zeW5jLnN0YXRTeW5jKHAsIGlzTHN0YXQpO1xuICB9XG4gIHB1YmxpYyBvcGVuU3luYyhwOiBzdHJpbmcsIGZsYWc6IGZpbGVfZmxhZy5GaWxlRmxhZywgbW9kZTogbnVtYmVyKTogZmlsZS5GaWxlIHtcbiAgICB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQoKTtcbiAgICAvLyBTYW5pdHkgY2hlY2s6IElzIHRoaXMgb3Blbi9jbG9zZSBwZXJtaXR0ZWQ/XG4gICAgdmFyIGZkID0gdGhpcy5fc3luYy5vcGVuU3luYyhwLCBmbGFnLCBtb2RlKTtcbiAgICBmZC5jbG9zZVN5bmMoKTtcbiAgICByZXR1cm4gbmV3IE1pcnJvckZpbGUodGhpcywgcCwgZmxhZywgdGhpcy5fc3luYy5zdGF0U3luYyhwLCBmYWxzZSksIHRoaXMuX3N5bmMucmVhZEZpbGVTeW5jKHAsIG51bGwsIGZpbGVfZmxhZy5GaWxlRmxhZy5nZXRGaWxlRmxhZygncicpKSk7XG4gIH1cbiAgcHVibGljIHVubGlua1N5bmMocDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja0luaXRpYWxpemVkKCk7XG4gICAgdGhpcy5fc3luYy51bmxpbmtTeW5jKHApO1xuICAgIHRoaXMuZW5xdWV1ZU9wKHtcbiAgICAgIGFwaU1ldGhvZDogJ3VubGluaycsXG4gICAgICBhcmd1bWVudHM6IFtwXVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBybWRpclN5bmMocDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja0luaXRpYWxpemVkKCk7XG4gICAgdGhpcy5fc3luYy5ybWRpclN5bmMocCk7XG4gICAgdGhpcy5lbnF1ZXVlT3Aoe1xuICAgICAgYXBpTWV0aG9kOiAncm1kaXInLFxuICAgICAgYXJndW1lbnRzOiBbcF1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgbWtkaXJTeW5jKHA6IHN0cmluZywgbW9kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja0luaXRpYWxpemVkKCk7XG4gICAgdGhpcy5fc3luYy5ta2RpclN5bmMocCwgbW9kZSk7XG4gICAgdGhpcy5lbnF1ZXVlT3Aoe1xuICAgICAgYXBpTWV0aG9kOiAnbWtkaXInLFxuICAgICAgYXJndW1lbnRzOiBbcCwgbW9kZV1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgcmVhZGRpclN5bmMocDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHRoaXMuY2hlY2tJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLl9zeW5jLnJlYWRkaXJTeW5jKHApO1xuICB9XG4gIHB1YmxpYyBleGlzdHNTeW5jKHA6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuY2hlY2tJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLl9zeW5jLmV4aXN0c1N5bmMocCk7XG4gIH1cbiAgcHVibGljIGNobW9kU3luYyhwOiBzdHJpbmcsIGlzTGNobW9kOiBib29sZWFuLCBtb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQoKTtcbiAgICB0aGlzLl9zeW5jLmNobW9kU3luYyhwLCBpc0xjaG1vZCwgbW9kZSk7XG4gICAgdGhpcy5lbnF1ZXVlT3Aoe1xuICAgICAgYXBpTWV0aG9kOiAnY2htb2QnLFxuICAgICAgYXJndW1lbnRzOiBbcCwgaXNMY2htb2QsIG1vZGVdXG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGNob3duU3luYyhwOiBzdHJpbmcsIGlzTGNob3duOiBib29sZWFuLCB1aWQ6IG51bWJlciwgZ2lkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQoKTtcbiAgICB0aGlzLl9zeW5jLmNob3duU3luYyhwLCBpc0xjaG93biwgdWlkLCBnaWQpO1xuICAgIHRoaXMuZW5xdWV1ZU9wKHtcbiAgICAgIGFwaU1ldGhvZDogJ2Nob3duJyxcbiAgICAgIGFyZ3VtZW50czogW3AsIGlzTGNob3duLCB1aWQsIGdpZF1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgdXRpbWVzU3luYyhwOiBzdHJpbmcsIGF0aW1lOiBEYXRlLCBtdGltZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tJbml0aWFsaXplZCgpO1xuICAgIHRoaXMuX3N5bmMudXRpbWVzU3luYyhwLCBhdGltZSwgbXRpbWUpO1xuICAgIHRoaXMuZW5xdWV1ZU9wKHtcbiAgICAgIGFwaU1ldGhvZDogJ3V0aW1lcycsXG4gICAgICBhcmd1bWVudHM6IFtwLCBhdGltZSwgbXRpbWVdXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==