"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var stream_1 = require("stream"); var Parameters_1 = require("./Parameters"); var ParseRuntime_1 = require("./ParseRuntime"); var bluebird_1 = __importDefault(require("bluebird")); // import { ProcessorFork } from "./ProcessFork"; var ProcessorLocal_1 = require("./ProcessorLocal"); var Result_1 = require("./Result"); var Converter = /** @class */ (function (_super) { __extends(Converter, _super); function Converter(param, options) { if (options === void 0) { options = {}; } var _this = _super.call(this, options) || this; _this.options = options; _this.params = Parameters_1.mergeParams(param); _this.runtime = ParseRuntime_1.initParseRuntime(_this); _this.result = new Result_1.Result(_this); // if (this.params.fork) { // this.processor = new ProcessorFork(this); // } else { _this.processor = new ProcessorLocal_1.ProcessorLocal(_this); // } _this.once("error", function (err) { // console.log("BBB"); setTimeout(function () { _this.result.processError(err); _this.emit("done", err); }, 0); }); _this.once("done", function () { _this.processor.destroy(); }); return _this; } Converter.prototype.preRawData = function (onRawData) { this.runtime.preRawDataHook = onRawData; return this; }; Converter.prototype.preFileLine = function (onFileLine) { this.runtime.preFileLineHook = onFileLine; return this; }; Converter.prototype.subscribe = function (onNext, onError, onCompleted) { this.parseRuntime.subscribe = { onNext: onNext, onError: onError, onCompleted: onCompleted }; return this; }; Converter.prototype.fromFile = function (filePath, options) { var _this = this; var fs = require("fs"); // var rs = null; // this.wrapCallback(cb, function () { // if (rs && rs.destroy) { // rs.destroy(); // } // }); fs.exists(filePath, function (exist) { if (exist) { var rs = fs.createReadStream(filePath, options); rs.pipe(_this); } else { _this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct.")); } }); return this; }; Converter.prototype.fromStream = function (readStream) { readStream.pipe(this); return this; }; Converter.prototype.fromString = function (csvString) { var csv = csvString.toString(); var read = new stream_1.Readable(); var idx = 0; read._read = function (size) { if (idx >= csvString.length) { this.push(null); } else { var str = csvString.substr(idx, size); this.push(str); idx += size; } }; return this.fromStream(read); }; Converter.prototype.then = function (onfulfilled, onrejected) { var _this = this; return new bluebird_1.default(function (resolve, reject) { _this.parseRuntime.then = { onfulfilled: function (value) { if (onfulfilled) { resolve(onfulfilled(value)); } else { resolve(value); } }, onrejected: function (err) { if (onrejected) { resolve(onrejected(err)); } else { reject(err); } } }; }); }; Object.defineProperty(Converter.prototype, "parseParam", { get: function () { return this.params; }, enumerable: true, configurable: true }); Object.defineProperty(Converter.prototype, "parseRuntime", { get: function () { return this.runtime; }, enumerable: true, configurable: true }); Converter.prototype._transform = function (chunk, encoding, cb) { var _this = this; this.processor.process(chunk) .then(function (result) { // console.log(result); if (result.length > 0) { _this.runtime.started = true; return _this.result.processResult(result); } }) .then(function () { _this.emit("drained"); cb(); }, function (error) { _this.runtime.hasError = true; _this.runtime.error = error; _this.emit("error", error); cb(); }); }; Converter.prototype._flush = function (cb) { var _this = this; this.processor.flush() .then(function (data) { if (data.length > 0) { return _this.result.processResult(data); } }) .then(function () { _this.processEnd(cb); }, function (err) { _this.emit("error", err); cb(); }); }; Converter.prototype.processEnd = function (cb) { this.result.endProcess(); this.emit("done"); cb(); }; Object.defineProperty(Converter.prototype, "parsedLineNumber", { get: function () { return this.runtime.parsedLineNumber; }, enumerable: true, configurable: true }); return Converter; }(stream_1.Transform)); exports.Converter = Converter; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9Db252ZXJ0ZXIudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi9zcmMvQ29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUErRDtBQUMvRCwyQ0FBMEQ7QUFDMUQsK0NBQWdFO0FBQ2hFLHNEQUF5QjtBQU96QixpREFBaUQ7QUFDakQsbURBQWtEO0FBQ2xELG1DQUFrQztBQU1sQztJQUErQiw2QkFBUztJQXVGdEMsbUJBQVksS0FBOEIsRUFBUyxPQUE4QjtRQUE5Qix3QkFBQSxFQUFBLFlBQThCO1FBQWpGLFlBQ0Usa0JBQU0sT0FBTyxDQUFDLFNBdUJmO1FBeEJrRCxhQUFPLEdBQVAsT0FBTyxDQUF1QjtRQUUvRSxLQUFJLENBQUMsTUFBTSxHQUFHLHdCQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsS0FBSSxDQUFDLE9BQU8sR0FBRywrQkFBZ0IsQ0FBQyxLQUFJLENBQUMsQ0FBQztRQUN0QyxLQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUksQ0FBQyxDQUFDO1FBQy9CLDBCQUEwQjtRQUMxQiw4Q0FBOEM7UUFDOUMsV0FBVztRQUNYLEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSwrQkFBYyxDQUFDLEtBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUk7UUFDSixLQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFDLEdBQVE7WUFDMUIsc0JBQXNCO1lBRXRCLFVBQVUsQ0FBQztnQkFDVCxLQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsS0FBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRVIsQ0FBQyxDQUFDLENBQUM7UUFD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QUFLLENBQUM7WUFDM0IsS0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUIsRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCwwQkFBTSxHQUFOLFVBQU8sRUFBWTtRQUFuQixpQkFjQztRQWJDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO2FBQ25CLElBQUksQ0FBQyxVQUFDLElBQUk7WUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUVuQixPQUFPLEtBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDO1lBQ0osS0FBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDLEVBQUUsVUFBQyxHQUFHO1lBQ0wsS0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEIsRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFDTyw4QkFBVSxHQUFsQixVQUFtQixFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQixFQUFFLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFDRCxzQkFBSSx1Q0FBZ0I7YUFBcEI7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDdkMsQ0FBQzs7O09BQUE7SUFDSCxnQkFBQztBQUFELENBQUMsQUEzSkQsQ0FBK0Isa0JBQVMsR0EySnZDO0FBM0pZLDhCQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNmb3JtLCBUcmFuc2Zvcm1PcHRpb25zLCBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCB7IENTVlBhcnNlUGFyYW0sIG1lcmdlUGFyYW1zIH0gZnJvbSBcIi4vUGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgUGFyc2VSdW50aW1lLCBpbml0UGFyc2VSdW50aW1lIH0gZnJvbSBcIi4vUGFyc2VSdW50aW1lXCI7XG5pbXBvcnQgUCBmcm9tIFwiYmx1ZWJpcmRcIjtcbmltcG9ydCB7IHN0cmluZ1RvTGluZXMgfSBmcm9tIFwiLi9maWxlbGluZVwiO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSBcImxvZGFzaC9tYXBcIjtcbmltcG9ydCB7IFJvd1NwbGl0LCBSb3dTcGxpdFJlc3VsdCB9IGZyb20gXCIuL3Jvd1NwbGl0XCI7XG5pbXBvcnQgZ2V0RW9sIGZyb20gXCIuL2dldEVvbFwiO1xuaW1wb3J0IGxpbmVUb0pzb24sIHsgSlNPTlJlc3VsdCB9IGZyb20gXCIuL2xpbmVUb0pzb25cIjtcbmltcG9ydCB7IFByb2Nlc3NvciwgUHJvY2Vzc0xpbmVSZXN1bHQgfSBmcm9tIFwiLi9Qcm9jZXNzb3JcIjtcbi8vIGltcG9ydCB7IFByb2Nlc3NvckZvcmsgfSBmcm9tIFwiLi9Qcm9jZXNzRm9ya1wiO1xuaW1wb3J0IHsgUHJvY2Vzc29yTG9jYWwgfSBmcm9tIFwiLi9Qcm9jZXNzb3JMb2NhbFwiO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSBcIi4vUmVzdWx0XCI7XG5pbXBvcnQgQ1NWRXJyb3IgZnJvbSBcIi4vQ1NWRXJyb3JcIjtcbmltcG9ydCB7IGJ1ZkZyb21TdHJpbmcgfSBmcm9tIFwiLi91dGlsXCI7XG5cblxuXG5leHBvcnQgY2xhc3MgQ29udmVydGVyIGV4dGVuZHMgVHJhbnNmb3JtIGltcGxlbWVudHMgUHJvbWlzZUxpa2U8QXJyYXk8YW55Pj4ge1xuICBwcmVSYXdEYXRhKG9uUmF3RGF0YTogUHJlUmF3RGF0YUNhbGxiYWNrKTogQ29udmVydGVyIHtcbiAgICB0aGlzLnJ1bnRpbWUucHJlUmF3RGF0YUhvb2sgPSBvblJhd0RhdGE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcHJlRmlsZUxpbmUob25GaWxlTGluZTogUHJlRmlsZUxpbmVDYWxsYmFjayk6IENvbnZlcnRlciB7XG4gICAgdGhpcy5ydW50aW1lLnByZUZpbGVMaW5lSG9vayA9IG9uRmlsZUxpbmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc3Vic2NyaWJlKFxuICAgIG9uTmV4dD86IChkYXRhOiBhbnksIGxpbmVOdW1iZXI6IG51bWJlcikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+LFxuICAgIG9uRXJyb3I/OiAoZXJyOiBDU1ZFcnJvcikgPT4gdm9pZCxcbiAgICBvbkNvbXBsZXRlZD86ICgpID0+IHZvaWQpOiBDb252ZXJ0ZXIge1xuICAgIHRoaXMucGFyc2VSdW50aW1lLnN1YnNjcmliZSA9IHtcbiAgICAgIG9uTmV4dCxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBvbkNvbXBsZXRlZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nLCBvcHRpb25zPzogc3RyaW5nIHwgQ3JlYXRlUmVhZFN0cmVhbU9wdGlvbiB8IHVuZGVmaW5lZCk6IENvbnZlcnRlciB7XG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gICAgLy8gdmFyIHJzID0gbnVsbDtcbiAgICAvLyB0aGlzLndyYXBDYWxsYmFjayhjYiwgZnVuY3Rpb24gKCkge1xuICAgIC8vICAgaWYgKHJzICYmIHJzLmRlc3Ryb3kpIHtcbiAgICAvLyAgICAgcnMuZGVzdHJveSgpO1xuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICAgIGZzLmV4aXN0cyhmaWxlUGF0aCwgKGV4aXN0KSA9PiB7XG4gICAgICBpZiAoZXhpc3QpIHtcbiAgICAgICAgY29uc3QgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoLCBvcHRpb25zKTtcbiAgICAgICAgcnMucGlwZSh0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXCJGaWxlIGRvZXMgbm90IGV4aXN0LiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGZpbGUgcGF0aCB0byB5b3VyIGNzdiBpcyBjb3JyZWN0LlwiKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnJvbVN0cmVhbShyZWFkU3RyZWFtOiBSZWFkYWJsZSk6IENvbnZlcnRlciB7XG4gICAgcmVhZFN0cmVhbS5waXBlKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZyb21TdHJpbmcoY3N2U3RyaW5nOiBzdHJpbmcpOiBDb252ZXJ0ZXIge1xuICAgIGNvbnN0IGNzdiA9IGNzdlN0cmluZy50b1N0cmluZygpO1xuICAgIGNvbnN0IHJlYWQgPSBuZXcgUmVhZGFibGUoKTtcbiAgICBsZXQgaWR4ID0gMDtcbiAgICByZWFkLl9yZWFkID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgIGlmIChpZHggPj0gY3N2U3RyaW5nLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnB1c2gobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdHIgPSBjc3ZTdHJpbmcuc3Vic3RyKGlkeCwgc2l6ZSk7XG4gICAgICAgIHRoaXMucHVzaChzdHIpO1xuICAgICAgICBpZHggKz0gc2l6ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZnJvbVN0cmVhbShyZWFkKTtcbiAgfVxuICB0aGVuPFRSZXN1bHQxID0gYW55W10sIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKHZhbHVlOiBhbnlbXSkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4sIG9ucmVqZWN0ZWQ/OiAocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KTogUHJvbWlzZUxpa2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiBuZXcgUCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnBhcnNlUnVudGltZS50aGVuID0ge1xuICAgICAgICBvbmZ1bGZpbGxlZDogKHZhbHVlOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGlmIChvbmZ1bGZpbGxlZCkge1xuICAgICAgICAgICAgcmVzb2x2ZShvbmZ1bGZpbGxlZCh2YWx1ZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlIGFzIGFueSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbnJlamVjdGVkOiAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChvbnJlamVjdGVkKSB7XG4gICAgICAgICAgICByZXNvbHZlKG9ucmVqZWN0ZWQoZXJyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXQgcGFyc2VQYXJhbSgpOiBDU1ZQYXJzZVBhcmFtIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXM7XG4gIH1cbiAgcHVibGljIGdldCBwYXJzZVJ1bnRpbWUoKTogUGFyc2VSdW50aW1lIHtcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lO1xuICB9XG4gIHByaXZhdGUgcGFyYW1zOiBDU1ZQYXJzZVBhcmFtO1xuICBwcml2YXRlIHJ1bnRpbWU6IFBhcnNlUnVudGltZTtcbiAgcHJpdmF0ZSBwcm9jZXNzb3I6IFByb2Nlc3NvcjtcbiAgcHJpdmF0ZSByZXN1bHQ6IFJlc3VsdDtcbiAgY29uc3RydWN0b3IocGFyYW0/OiBQYXJ0aWFsPENTVlBhcnNlUGFyYW0+LCBwdWJsaWMgb3B0aW9uczogVHJhbnNmb3JtT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5wYXJhbXMgPSBtZXJnZVBhcmFtcyhwYXJhbSk7XG4gICAgdGhpcy5ydW50aW1lID0gaW5pdFBhcnNlUnVudGltZSh0aGlzKTtcbiAgICB0aGlzLnJlc3VsdCA9IG5ldyBSZXN1bHQodGhpcyk7XG4gICAgLy8gaWYgKHRoaXMucGFyYW1zLmZvcmspIHtcbiAgICAvLyAgIHRoaXMucHJvY2Vzc29yID0gbmV3IFByb2Nlc3NvckZvcmsodGhpcyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICB0aGlzLnByb2Nlc3NvciA9IG5ldyBQcm9jZXNzb3JMb2NhbCh0aGlzKTtcbiAgICAvLyB9XG4gICAgdGhpcy5vbmNlKFwiZXJyb3JcIiwgKGVycjogYW55KSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkJCQlwiKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzdWx0LnByb2Nlc3NFcnJvcihlcnIpO1xuICAgICAgICB0aGlzLmVtaXQoXCJkb25lXCIsIGVycik7XG4gICAgICB9LCAwKTtcblxuICAgIH0pO1xuICAgIHRoaXMub25jZShcImRvbmVcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5wcm9jZXNzb3IuZGVzdHJveSgpO1xuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBfdHJhbnNmb3JtKGNodW5rOiBhbnksIGVuY29kaW5nOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikge1xuICAgIHRoaXMucHJvY2Vzc29yLnByb2Nlc3MoY2h1bmspXG4gICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMucnVudGltZS5zdGFydGVkID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5wcm9jZXNzUmVzdWx0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChcImRyYWluZWRcIik7XG4gICAgICAgIGNiKCk7XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ydW50aW1lLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH0pO1xuICB9XG4gIF9mbHVzaChjYjogRnVuY3Rpb24pIHtcbiAgICB0aGlzLnByb2Nlc3Nvci5mbHVzaCgpXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQucHJvY2Vzc1Jlc3VsdChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRW5kKGNiKTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH0pXG4gIH1cbiAgcHJpdmF0ZSBwcm9jZXNzRW5kKGNiKSB7XG4gICAgdGhpcy5yZXN1bHQuZW5kUHJvY2VzcygpO1xuICAgIHRoaXMuZW1pdChcImRvbmVcIik7XG4gICAgY2IoKTtcbiAgfVxuICBnZXQgcGFyc2VkTGluZU51bWJlcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWUucGFyc2VkTGluZU51bWJlcjtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSZWFkU3RyZWFtT3B0aW9uIHtcbiAgZmxhZ3M/OiBzdHJpbmc7XG4gIGVuY29kaW5nPzogc3RyaW5nO1xuICBmZD86IG51bWJlcjtcbiAgbW9kZT86IG51bWJlcjtcbiAgYXV0b0Nsb3NlPzogYm9vbGVhbjtcbiAgc3RhcnQ/OiBudW1iZXI7XG4gIGVuZD86IG51bWJlcjtcbiAgaGlnaFdhdGVyTWFyaz86IG51bWJlcjtcbn1cbmV4cG9ydCB0eXBlIENhbGxCYWNrID0gKGVycjogRXJyb3IsIGRhdGE6IEFycmF5PGFueT4pID0+IHZvaWQ7XG5cblxuZXhwb3J0IHR5cGUgUHJlRmlsZUxpbmVDYWxsYmFjayA9IChsaW5lOiBzdHJpbmcsIGxpbmVOdW1iZXI6IG51bWJlcikgPT4gc3RyaW5nIHwgUHJvbWlzZUxpa2U8c3RyaW5nPjtcbmV4cG9ydCB0eXBlIFByZVJhd0RhdGFDYWxsYmFjayA9IChjc3ZTdHJpbmc6IHN0cmluZykgPT4gc3RyaW5nIHwgUHJvbWlzZUxpa2U8c3RyaW5nPjtcbiJdfQ==