Comparing version 1.0.30 to 1.0.31
@@ -0,1 +1,7 @@ | ||
## [1.0.31](https://github.com/GMOD/bbi-js/compare/v1.0.30...v1.0.31) (2021-12-14) | ||
- Add esm module builds with less babelification for smaller bundle sizes | ||
## [1.0.30](https://github.com/GMOD/bbi-js/compare/v1.0.29...v1.0.30) (2020-06-25) | ||
@@ -2,0 +8,0 @@ |
906
dist/bbi.js
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
var __assign = (this && this.__assign) || function () { | ||
__assign = Object.assign || function(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) | ||
t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
return __assign.apply(this, arguments); | ||
}; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.BBI = void 0; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); | ||
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
var _binaryParser = require("@gmod/binary-parser"); | ||
var _genericFilehandle = require("generic-filehandle"); | ||
var _rxjs = require("rxjs"); | ||
var _operators = require("rxjs/operators"); | ||
var _abortablePromiseCache = _interopRequireDefault(require("abortable-promise-cache")); | ||
var _quickLru = _interopRequireDefault(require("quick-lru")); | ||
var _blockView = require("./blockView"); | ||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } | ||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } | ||
var binary_parser_1 = require("@gmod/binary-parser"); | ||
var generic_filehandle_1 = require("generic-filehandle"); | ||
var rxjs_1 = require("rxjs"); | ||
var operators_1 = require("rxjs/operators"); | ||
var abortable_promise_cache_1 = __importDefault(require("abortable-promise-cache")); | ||
var quick_lru_1 = __importDefault(require("quick-lru")); | ||
var blockView_1 = require("./blockView"); | ||
var BIG_WIG_MAGIC = -2003829722; | ||
var BIG_BED_MAGIC = -2021002517; | ||
/* get the compiled parsers for different sections of the bigwig file | ||
@@ -47,35 +69,52 @@ * | ||
function getParsers(isBE) { | ||
var le = isBE ? 'big' : 'little'; | ||
var headerParser = new _binaryParser.Parser().endianess(le).int32('magic').uint16('version').uint16('numZoomLevels').uint64('chromTreeOffset').uint64('unzoomedDataOffset').uint64('unzoomedIndexOffset').uint16('fieldCount').uint16('definedFieldCount').uint64('asOffset') // autoSql offset, used in bigbed | ||
.uint64('totalSummaryOffset').uint32('uncompressBufSize').uint64('extHeaderOffset') // name index offset, used in bigbed | ||
.array('zoomLevels', { | ||
length: 'numZoomLevels', | ||
type: new _binaryParser.Parser().uint32('reductionLevel').uint32('reserved').uint64('dataOffset').uint64('indexOffset') | ||
}); | ||
var totalSummaryParser = new _binaryParser.Parser().endianess(le).uint64('basesCovered').double('scoreMin').double('scoreMax').double('scoreSum').double('scoreSumSquares'); | ||
var chromTreeParser = new _binaryParser.Parser().endianess(le).uint32('magic').uint32('blockSize').uint32('keySize').uint32('valSize').uint64('itemCount'); | ||
var isLeafNode = new _binaryParser.Parser().endianess(le).uint8('isLeafNode').skip(1).uint16('cnt'); | ||
return { | ||
chromTreeParser: chromTreeParser, | ||
totalSummaryParser: totalSummaryParser, | ||
headerParser: headerParser, | ||
isLeafNode: isLeafNode | ||
}; | ||
var le = isBE ? 'big' : 'little'; | ||
var headerParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.int32('magic') | ||
.uint16('version') | ||
.uint16('numZoomLevels') | ||
.uint64('chromTreeOffset') | ||
.uint64('unzoomedDataOffset') | ||
.uint64('unzoomedIndexOffset') | ||
.uint16('fieldCount') | ||
.uint16('definedFieldCount') | ||
.uint64('asOffset') // autoSql offset, used in bigbed | ||
.uint64('totalSummaryOffset') | ||
.uint32('uncompressBufSize') | ||
.uint64('extHeaderOffset') // name index offset, used in bigbed | ||
.array('zoomLevels', { | ||
length: 'numZoomLevels', | ||
type: new binary_parser_1.Parser() | ||
.uint32('reductionLevel') | ||
.uint32('reserved') | ||
.uint64('dataOffset') | ||
.uint64('indexOffset'), | ||
}); | ||
var totalSummaryParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.uint64('basesCovered') | ||
.double('scoreMin') | ||
.double('scoreMax') | ||
.double('scoreSum') | ||
.double('scoreSumSquares'); | ||
var chromTreeParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.uint32('magic') | ||
.uint32('blockSize') | ||
.uint32('keySize') | ||
.uint32('valSize') | ||
.uint64('itemCount'); | ||
var isLeafNode = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.uint8('isLeafNode') | ||
.skip(1) | ||
.uint16('cnt'); | ||
return { | ||
chromTreeParser: chromTreeParser, | ||
totalSummaryParser: totalSummaryParser, | ||
headerParser: headerParser, | ||
isLeafNode: isLeafNode, | ||
}; | ||
} | ||
var BBI = /*#__PURE__*/function () { | ||
(0, _createClass2.default)(BBI, [{ | ||
key: "getHeader", | ||
/* fetch and parse header information from a bigwig or bigbed file | ||
* @param abortSignal - abort the operation, can be null | ||
* @return a Header object | ||
*/ | ||
value: function getHeader() { | ||
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var options = 'aborted' in opts ? { | ||
signal: opts | ||
} : opts; | ||
return this.headerCache.get(JSON.stringify(options), options, options.signal); | ||
} | ||
var BBI = /** @class */ (function () { | ||
/* | ||
@@ -87,318 +126,180 @@ * @param filehandle - a filehandle from generic-filehandle or implementing something similar to the node10 fs.promises API | ||
*/ | ||
}]); | ||
function BBI() { | ||
var _this = this; | ||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
(0, _classCallCheck2.default)(this, BBI); | ||
(0, _defineProperty2.default)(this, "bbi", void 0); | ||
(0, _defineProperty2.default)(this, "headerCache", new _abortablePromiseCache.default({ | ||
cache: new _quickLru.default({ | ||
maxSize: 1 | ||
}), | ||
fill: function () { | ||
var _fill = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(params, signal) { | ||
return _regenerator.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
return _context.abrupt("return", _this._getHeader(_objectSpread(_objectSpread({}, params), {}, { | ||
signal: signal | ||
}))); | ||
case 1: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
function fill(_x, _x2) { | ||
return _fill.apply(this, arguments); | ||
function BBI(options) { | ||
var _this = this; | ||
if (options === void 0) { options = {}; } | ||
this.headerCache = new abortable_promise_cache_1.default({ | ||
cache: new quick_lru_1.default({ maxSize: 1 }), | ||
fill: function (params, signal) { return __awaiter(_this, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
return [2 /*return*/, this._getHeader(__assign(__assign({}, params), { signal: signal }))]; | ||
}); | ||
}); }, | ||
}); | ||
var filehandle = options.filehandle, renameRefSeqs = options.renameRefSeqs, path = options.path, url = options.url; | ||
this.renameRefSeqs = renameRefSeqs || (function (s) { return s; }); | ||
if (filehandle) { | ||
this.bbi = filehandle; | ||
} | ||
return fill; | ||
}() | ||
})); | ||
(0, _defineProperty2.default)(this, "renameRefSeqs", void 0); | ||
var filehandle = options.filehandle, | ||
renameRefSeqs = options.renameRefSeqs, | ||
path = options.path, | ||
url = options.url; | ||
this.renameRefSeqs = renameRefSeqs || function (s) { | ||
return s; | ||
else if (url) { | ||
this.bbi = new generic_filehandle_1.RemoteFile(url); | ||
} | ||
else if (path) { | ||
this.bbi = new generic_filehandle_1.LocalFile(path); | ||
} | ||
else { | ||
throw new Error('no file given'); | ||
} | ||
} | ||
/* fetch and parse header information from a bigwig or bigbed file | ||
* @param abortSignal - abort the operation, can be null | ||
* @return a Header object | ||
*/ | ||
BBI.prototype.getHeader = function (opts) { | ||
if (opts === void 0) { opts = {}; } | ||
var options = 'aborted' in opts ? { signal: opts } : opts; | ||
return this.headerCache.get(JSON.stringify(options), options, options.signal); | ||
}; | ||
if (filehandle) { | ||
this.bbi = filehandle; | ||
} else if (url) { | ||
this.bbi = new _genericFilehandle.RemoteFile(url); | ||
} else if (path) { | ||
this.bbi = new _genericFilehandle.LocalFile(path); | ||
} else { | ||
throw new Error('no file given'); | ||
} | ||
} | ||
(0, _createClass2.default)(BBI, [{ | ||
key: "_getHeader", | ||
value: function () { | ||
var _getHeader2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(opts) { | ||
var header, chroms; | ||
return _regenerator.default.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_context2.next = 2; | ||
return this._getMainHeader(opts); | ||
case 2: | ||
header = _context2.sent; | ||
_context2.next = 5; | ||
return this._readChromTree(header, opts); | ||
case 5: | ||
chroms = _context2.sent; | ||
return _context2.abrupt("return", _objectSpread(_objectSpread({}, header), chroms)); | ||
case 7: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, this); | ||
})); | ||
function _getHeader(_x3) { | ||
return _getHeader2.apply(this, arguments); | ||
} | ||
return _getHeader; | ||
}() | ||
}, { | ||
key: "_getMainHeader", | ||
value: function () { | ||
var _getMainHeader2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(opts) { | ||
var requestSize, | ||
_yield$this$bbi$read, | ||
buffer, | ||
isBigEndian, | ||
ret, | ||
header, | ||
tail, | ||
_args3 = arguments; | ||
return _regenerator.default.wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
requestSize = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : 2000; | ||
_context3.next = 3; | ||
return this.bbi.read(Buffer.alloc(requestSize), 0, requestSize, 0, opts); | ||
case 3: | ||
_yield$this$bbi$read = _context3.sent; | ||
buffer = _yield$this$bbi$read.buffer; | ||
isBigEndian = this._isBigEndian(buffer); | ||
ret = getParsers(isBigEndian); | ||
header = ret.headerParser.parse(buffer).result; | ||
header.fileType = header.magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig'; | ||
if (!(header.asOffset > requestSize || header.totalSummaryOffset > requestSize)) { | ||
_context3.next = 11; | ||
break; | ||
BBI.prototype._getHeader = function (opts) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var header, chroms; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, this._getMainHeader(opts)]; | ||
case 1: | ||
header = _a.sent(); | ||
return [4 /*yield*/, this._readChromTree(header, opts)]; | ||
case 2: | ||
chroms = _a.sent(); | ||
return [2 /*return*/, __assign(__assign({}, header), chroms)]; | ||
} | ||
return _context3.abrupt("return", this._getMainHeader(opts, requestSize * 2)); | ||
case 11: | ||
if (header.asOffset) { | ||
header.autoSql = buffer.slice(header.asOffset, buffer.indexOf(0, header.asOffset)).toString('utf8'); | ||
}); | ||
}); | ||
}; | ||
BBI.prototype._getMainHeader = function (opts, requestSize) { | ||
if (requestSize === void 0) { requestSize = 2000; } | ||
return __awaiter(this, void 0, void 0, function () { | ||
var buffer, isBigEndian, ret, header, tail; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, this.bbi.read(Buffer.alloc(requestSize), 0, requestSize, 0, opts)]; | ||
case 1: | ||
buffer = (_a.sent()).buffer; | ||
isBigEndian = this._isBigEndian(buffer); | ||
ret = getParsers(isBigEndian); | ||
header = ret.headerParser.parse(buffer).result; | ||
header.fileType = header.magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig'; | ||
if (header.asOffset > requestSize || | ||
header.totalSummaryOffset > requestSize) { | ||
return [2 /*return*/, this._getMainHeader(opts, requestSize * 2)]; | ||
} | ||
if (header.asOffset) { | ||
header.autoSql = buffer | ||
.slice(header.asOffset, buffer.indexOf(0, header.asOffset)) | ||
.toString('utf8'); | ||
} | ||
if (header.totalSummaryOffset > requestSize) { | ||
return [2 /*return*/, this._getMainHeader(opts, requestSize * 2)]; | ||
} | ||
if (header.totalSummaryOffset) { | ||
tail = buffer.slice(header.totalSummaryOffset); | ||
header.totalSummary = ret.totalSummaryParser.parse(tail).result; | ||
} | ||
return [2 /*return*/, __assign(__assign({}, header), { isBigEndian: isBigEndian })]; | ||
} | ||
if (!(header.totalSummaryOffset > requestSize)) { | ||
_context3.next = 14; | ||
break; | ||
}); | ||
}); | ||
}; | ||
BBI.prototype._isBigEndian = function (buffer) { | ||
var ret = buffer.readInt32LE(0); | ||
if (ret === BIG_WIG_MAGIC || ret === BIG_BED_MAGIC) { | ||
return false; | ||
} | ||
ret = buffer.readInt32BE(0); | ||
if (ret === BIG_WIG_MAGIC || ret === BIG_BED_MAGIC) { | ||
return true; | ||
} | ||
throw new Error('not a BigWig/BigBed file'); | ||
}; | ||
// todo: add progress if long running | ||
BBI.prototype._readChromTree = function (header, opts) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var isBE, le, refsByNumber, refsByName, chromTreeOffset, unzoomedDataOffset, data, p, keySize, leafNodeParser, nonleafNodeParser, rootNodeOffset, bptReadNode; | ||
var _this = this; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
isBE = header.isBigEndian; | ||
le = isBE ? 'big' : 'little'; | ||
refsByNumber = []; | ||
refsByName = {}; | ||
chromTreeOffset = header.chromTreeOffset; | ||
unzoomedDataOffset = header.unzoomedDataOffset; | ||
while (unzoomedDataOffset % 4 !== 0) { | ||
unzoomedDataOffset += 1; | ||
} | ||
return [4 /*yield*/, this.bbi.read(Buffer.alloc(unzoomedDataOffset - chromTreeOffset), 0, unzoomedDataOffset - chromTreeOffset, chromTreeOffset, opts)]; | ||
case 1: | ||
data = (_a.sent()).buffer; | ||
p = getParsers(isBE); | ||
keySize = p.chromTreeParser.parse(data).result.keySize; | ||
leafNodeParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.string('key', { stripNull: true, length: keySize }) | ||
.uint32('refId') | ||
.uint32('refSize'); | ||
nonleafNodeParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.skip(keySize) | ||
.uint64('childOffset'); | ||
rootNodeOffset = 32; | ||
bptReadNode = function (currentOffset) { return __awaiter(_this, void 0, void 0, function () { | ||
var offset, ret, _a, isLeafNode, cnt, n, leafRet, _b, key, refId, refSize, refRec, nextNodes, n, nonleafRet, childOffset; | ||
return __generator(this, function (_c) { | ||
switch (_c.label) { | ||
case 0: | ||
offset = currentOffset; | ||
if (offset >= data.length) { | ||
throw new Error('reading beyond end of buffer'); | ||
} | ||
ret = p.isLeafNode.parse(data.slice(offset)); | ||
_a = ret.result, isLeafNode = _a.isLeafNode, cnt = _a.cnt; | ||
offset += ret.offset; | ||
if (!isLeafNode) return [3 /*break*/, 1]; | ||
for (n = 0; n < cnt; n += 1) { | ||
leafRet = leafNodeParser.parse(data.slice(offset)); | ||
offset += leafRet.offset; | ||
_b = leafRet.result, key = _b.key, refId = _b.refId, refSize = _b.refSize; | ||
refRec = { name: key, id: refId, length: refSize }; | ||
refsByName[this.renameRefSeqs(key)] = refId; | ||
refsByNumber[refId] = refRec; | ||
} | ||
return [3 /*break*/, 3]; | ||
case 1: | ||
nextNodes = []; | ||
for (n = 0; n < cnt; n += 1) { | ||
nonleafRet = nonleafNodeParser.parse(data.slice(offset)); | ||
childOffset = nonleafRet.result.childOffset; | ||
offset += nonleafRet.offset; | ||
childOffset -= chromTreeOffset; | ||
nextNodes.push(bptReadNode(childOffset)); | ||
} | ||
return [4 /*yield*/, Promise.all(nextNodes)]; | ||
case 2: | ||
_c.sent(); | ||
_c.label = 3; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
return [4 /*yield*/, bptReadNode(rootNodeOffset)]; | ||
case 2: | ||
_a.sent(); | ||
return [2 /*return*/, { | ||
refsByName: refsByName, | ||
refsByNumber: refsByNumber, | ||
}]; | ||
} | ||
return _context3.abrupt("return", this._getMainHeader(opts, requestSize * 2)); | ||
case 14: | ||
if (header.totalSummaryOffset) { | ||
tail = buffer.slice(header.totalSummaryOffset); | ||
header.totalSummary = ret.totalSummaryParser.parse(tail).result; | ||
} | ||
return _context3.abrupt("return", _objectSpread(_objectSpread({}, header), {}, { | ||
isBigEndian: isBigEndian | ||
})); | ||
case 16: | ||
case "end": | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee3, this); | ||
})); | ||
function _getMainHeader(_x4) { | ||
return _getMainHeader2.apply(this, arguments); | ||
} | ||
return _getMainHeader; | ||
}() | ||
}, { | ||
key: "_isBigEndian", | ||
value: function _isBigEndian(buffer) { | ||
var ret = buffer.readInt32LE(0); | ||
if (ret === BIG_WIG_MAGIC || ret === BIG_BED_MAGIC) { | ||
return false; | ||
} | ||
ret = buffer.readInt32BE(0); | ||
if (ret === BIG_WIG_MAGIC || ret === BIG_BED_MAGIC) { | ||
return true; | ||
} | ||
throw new Error('not a BigWig/BigBed file'); | ||
} // todo: add progress if long running | ||
}, { | ||
key: "_readChromTree", | ||
value: function () { | ||
var _readChromTree2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(header, opts) { | ||
var _this2 = this; | ||
var isBE, le, refsByNumber, refsByName, chromTreeOffset, unzoomedDataOffset, _yield$this$bbi$read2, data, p, keySize, leafNodeParser, nonleafNodeParser, rootNodeOffset, bptReadNode; | ||
return _regenerator.default.wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
isBE = header.isBigEndian; | ||
le = isBE ? 'big' : 'little'; | ||
refsByNumber = []; | ||
refsByName = {}; | ||
chromTreeOffset = header.chromTreeOffset; | ||
unzoomedDataOffset = header.unzoomedDataOffset; | ||
while (unzoomedDataOffset % 4 !== 0) { | ||
unzoomedDataOffset += 1; | ||
} | ||
_context5.next = 9; | ||
return this.bbi.read(Buffer.alloc(unzoomedDataOffset - chromTreeOffset), 0, unzoomedDataOffset - chromTreeOffset, chromTreeOffset, opts); | ||
case 9: | ||
_yield$this$bbi$read2 = _context5.sent; | ||
data = _yield$this$bbi$read2.buffer; | ||
p = getParsers(isBE); | ||
keySize = p.chromTreeParser.parse(data).result.keySize; | ||
leafNodeParser = new _binaryParser.Parser().endianess(le).string('key', { | ||
stripNull: true, | ||
length: keySize | ||
}).uint32('refId').uint32('refSize'); | ||
nonleafNodeParser = new _binaryParser.Parser().endianess(le).skip(keySize).uint64('childOffset'); | ||
rootNodeOffset = 32; | ||
bptReadNode = /*#__PURE__*/function () { | ||
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(currentOffset) { | ||
var offset, ret, _ret$result, isLeafNode, cnt, n, leafRet, _leafRet$result, _key, refId, refSize, refRec, nextNodes, _n, nonleafRet, childOffset; | ||
return _regenerator.default.wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
offset = currentOffset; | ||
if (!(offset >= data.length)) { | ||
_context4.next = 3; | ||
break; | ||
} | ||
throw new Error('reading beyond end of buffer'); | ||
case 3: | ||
ret = p.isLeafNode.parse(data.slice(offset)); | ||
_ret$result = ret.result, isLeafNode = _ret$result.isLeafNode, cnt = _ret$result.cnt; | ||
offset += ret.offset; | ||
if (!isLeafNode) { | ||
_context4.next = 10; | ||
break; | ||
} | ||
for (n = 0; n < cnt; n += 1) { | ||
leafRet = leafNodeParser.parse(data.slice(offset)); | ||
offset += leafRet.offset; | ||
_leafRet$result = leafRet.result, _key = _leafRet$result.key, refId = _leafRet$result.refId, refSize = _leafRet$result.refSize; | ||
refRec = { | ||
name: _key, | ||
id: refId, | ||
length: refSize | ||
}; | ||
refsByName[_this2.renameRefSeqs(_key)] = refId; | ||
refsByNumber[refId] = refRec; | ||
} | ||
_context4.next = 14; | ||
break; | ||
case 10: | ||
// parse index node | ||
nextNodes = []; | ||
for (_n = 0; _n < cnt; _n += 1) { | ||
nonleafRet = nonleafNodeParser.parse(data.slice(offset)); | ||
childOffset = nonleafRet.result.childOffset; | ||
offset += nonleafRet.offset; | ||
childOffset -= chromTreeOffset; | ||
nextNodes.push(bptReadNode(childOffset)); | ||
} | ||
_context4.next = 14; | ||
return Promise.all(nextNodes); | ||
case 14: | ||
case "end": | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee4); | ||
})); | ||
return function bptReadNode(_x7) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}(); | ||
_context5.next = 19; | ||
return bptReadNode(rootNodeOffset); | ||
case 19: | ||
return _context5.abrupt("return", { | ||
refsByName: refsByName, | ||
refsByNumber: refsByNumber | ||
}); | ||
case 20: | ||
case "end": | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee5, this); | ||
})); | ||
function _readChromTree(_x5, _x6) { | ||
return _readChromTree2.apply(this, arguments); | ||
} | ||
return _readChromTree; | ||
}() | ||
}); | ||
}); | ||
}; | ||
/* | ||
@@ -408,49 +309,17 @@ * fetches the "unzoomed" view of the bigwig data. this is the default for bigbed | ||
*/ | ||
}, { | ||
key: "getUnzoomedView", | ||
value: function () { | ||
var _getUnzoomedView = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(opts) { | ||
var _yield$this$getHeader, unzoomedIndexOffset, zoomLevels, refsByName, uncompressBufSize, isBigEndian, fileType, nzl, cirLen; | ||
return _regenerator.default.wrap(function _callee6$(_context6) { | ||
while (1) { | ||
switch (_context6.prev = _context6.next) { | ||
case 0: | ||
_context6.next = 2; | ||
return this.getHeader(opts); | ||
case 2: | ||
_yield$this$getHeader = _context6.sent; | ||
unzoomedIndexOffset = _yield$this$getHeader.unzoomedIndexOffset; | ||
zoomLevels = _yield$this$getHeader.zoomLevels; | ||
refsByName = _yield$this$getHeader.refsByName; | ||
uncompressBufSize = _yield$this$getHeader.uncompressBufSize; | ||
isBigEndian = _yield$this$getHeader.isBigEndian; | ||
fileType = _yield$this$getHeader.fileType; | ||
nzl = zoomLevels[0]; | ||
cirLen = nzl ? nzl.dataOffset - unzoomedIndexOffset : 4000; | ||
return _context6.abrupt("return", new _blockView.BlockView(this.bbi, refsByName, unzoomedIndexOffset, cirLen, isBigEndian, uncompressBufSize > 0, fileType)); | ||
case 12: | ||
case "end": | ||
return _context6.stop(); | ||
} | ||
} | ||
}, _callee6, this); | ||
})); | ||
function getUnzoomedView(_x8) { | ||
return _getUnzoomedView.apply(this, arguments); | ||
} | ||
return getUnzoomedView; | ||
}() | ||
/* | ||
* abstract method - get the view for a given scale | ||
*/ | ||
}, { | ||
key: "getFeatureStream", | ||
BBI.prototype.getUnzoomedView = function (opts) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var _a, unzoomedIndexOffset, zoomLevels, refsByName, uncompressBufSize, isBigEndian, fileType, nzl, cirLen; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: return [4 /*yield*/, this.getHeader(opts)]; | ||
case 1: | ||
_a = _b.sent(), unzoomedIndexOffset = _a.unzoomedIndexOffset, zoomLevels = _a.zoomLevels, refsByName = _a.refsByName, uncompressBufSize = _a.uncompressBufSize, isBigEndian = _a.isBigEndian, fileType = _a.fileType; | ||
nzl = zoomLevels[0]; | ||
cirLen = nzl ? nzl.dataOffset - unzoomedIndexOffset : 4000; | ||
return [2 /*return*/, new blockView_1.BlockView(this.bbi, refsByName, unzoomedIndexOffset, cirLen, isBigEndian, uncompressBufSize > 0, fileType)]; | ||
} | ||
}); | ||
}); | ||
}; | ||
/** | ||
@@ -464,130 +333,63 @@ * Gets features from a BigWig file | ||
*/ | ||
value: function () { | ||
var _getFeatureStream = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(refName, start, end) { | ||
var opts, | ||
chrName, | ||
view, | ||
_args7 = arguments; | ||
return _regenerator.default.wrap(function _callee7$(_context7) { | ||
while (1) { | ||
switch (_context7.prev = _context7.next) { | ||
case 0: | ||
opts = _args7.length > 3 && _args7[3] !== undefined ? _args7[3] : { | ||
scale: 1 | ||
}; | ||
_context7.next = 3; | ||
return this.getHeader(opts); | ||
case 3: | ||
chrName = this.renameRefSeqs(refName); | ||
if (!opts.basesPerSpan) { | ||
_context7.next = 10; | ||
break; | ||
BBI.prototype.getFeatureStream = function (refName, start, end, opts) { | ||
if (opts === void 0) { opts = { | ||
scale: 1, | ||
}; } | ||
return __awaiter(this, void 0, void 0, function () { | ||
var chrName, view; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, this.getHeader(opts)]; | ||
case 1: | ||
_a.sent(); | ||
chrName = this.renameRefSeqs(refName); | ||
if (!opts.basesPerSpan) return [3 /*break*/, 3]; | ||
return [4 /*yield*/, this.getView(1 / opts.basesPerSpan, opts)]; | ||
case 2: | ||
view = _a.sent(); | ||
return [3 /*break*/, 7]; | ||
case 3: | ||
if (!opts.scale) return [3 /*break*/, 5]; | ||
return [4 /*yield*/, this.getView(opts.scale, opts)]; | ||
case 4: | ||
view = _a.sent(); | ||
return [3 /*break*/, 7]; | ||
case 5: return [4 /*yield*/, this.getView(1, opts)]; | ||
case 6: | ||
view = _a.sent(); | ||
_a.label = 7; | ||
case 7: | ||
if (!view) { | ||
throw new Error('unable to get block view for data'); | ||
} | ||
return [2 /*return*/, new rxjs_1.Observable(function (observer) { | ||
view.readWigData(chrName, start, end, observer, opts); | ||
})]; | ||
} | ||
_context7.next = 7; | ||
return this.getView(1 / opts.basesPerSpan, opts); | ||
case 7: | ||
view = _context7.sent; | ||
_context7.next = 19; | ||
break; | ||
case 10: | ||
if (!opts.scale) { | ||
_context7.next = 16; | ||
break; | ||
}); | ||
}); | ||
}; | ||
BBI.prototype.getFeatures = function (refName, start, end, opts) { | ||
if (opts === void 0) { opts = { | ||
scale: 1, | ||
}; } | ||
return __awaiter(this, void 0, void 0, function () { | ||
var ob, ret; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, this.getFeatureStream(refName, start, end, opts)]; | ||
case 1: | ||
ob = _a.sent(); | ||
return [4 /*yield*/, ob | ||
.pipe((0, operators_1.reduce)(function (acc, curr) { return acc.concat(curr); })) | ||
.toPromise()]; | ||
case 2: | ||
ret = _a.sent(); | ||
return [2 /*return*/, ret || []]; | ||
} | ||
_context7.next = 13; | ||
return this.getView(opts.scale, opts); | ||
case 13: | ||
view = _context7.sent; | ||
_context7.next = 19; | ||
break; | ||
case 16: | ||
_context7.next = 18; | ||
return this.getView(1, opts); | ||
case 18: | ||
view = _context7.sent; | ||
case 19: | ||
if (view) { | ||
_context7.next = 21; | ||
break; | ||
} | ||
throw new Error('unable to get block view for data'); | ||
case 21: | ||
return _context7.abrupt("return", new _rxjs.Observable(function (observer) { | ||
view.readWigData(chrName, start, end, observer, opts); | ||
})); | ||
case 22: | ||
case "end": | ||
return _context7.stop(); | ||
} | ||
} | ||
}, _callee7, this); | ||
})); | ||
function getFeatureStream(_x9, _x10, _x11) { | ||
return _getFeatureStream.apply(this, arguments); | ||
} | ||
return getFeatureStream; | ||
}() | ||
}, { | ||
key: "getFeatures", | ||
value: function () { | ||
var _getFeatures = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(refName, start, end) { | ||
var opts, | ||
ob, | ||
ret, | ||
_args8 = arguments; | ||
return _regenerator.default.wrap(function _callee8$(_context8) { | ||
while (1) { | ||
switch (_context8.prev = _context8.next) { | ||
case 0: | ||
opts = _args8.length > 3 && _args8[3] !== undefined ? _args8[3] : { | ||
scale: 1 | ||
}; | ||
_context8.next = 3; | ||
return this.getFeatureStream(refName, start, end, opts); | ||
case 3: | ||
ob = _context8.sent; | ||
_context8.next = 6; | ||
return ob.pipe((0, _operators.reduce)(function (acc, curr) { | ||
return acc.concat(curr); | ||
})).toPromise(); | ||
case 6: | ||
ret = _context8.sent; | ||
return _context8.abrupt("return", ret || []); | ||
case 8: | ||
case "end": | ||
return _context8.stop(); | ||
} | ||
} | ||
}, _callee8, this); | ||
})); | ||
function getFeatures(_x12, _x13, _x14) { | ||
return _getFeatures.apply(this, arguments); | ||
} | ||
return getFeatures; | ||
}() | ||
}]); | ||
return BBI; | ||
}(); | ||
}); | ||
}); | ||
}; | ||
return BBI; | ||
}()); | ||
exports.BBI = BBI; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYmkudHMiXSwibmFtZXMiOlsiQklHX1dJR19NQUdJQyIsIkJJR19CRURfTUFHSUMiLCJnZXRQYXJzZXJzIiwiaXNCRSIsImxlIiwiaGVhZGVyUGFyc2VyIiwiUGFyc2VyIiwiZW5kaWFuZXNzIiwiaW50MzIiLCJ1aW50MTYiLCJ1aW50NjQiLCJ1aW50MzIiLCJhcnJheSIsImxlbmd0aCIsInR5cGUiLCJ0b3RhbFN1bW1hcnlQYXJzZXIiLCJkb3VibGUiLCJjaHJvbVRyZWVQYXJzZXIiLCJpc0xlYWZOb2RlIiwidWludDgiLCJza2lwIiwiQkJJIiwib3B0cyIsIm9wdGlvbnMiLCJzaWduYWwiLCJoZWFkZXJDYWNoZSIsImdldCIsIkpTT04iLCJzdHJpbmdpZnkiLCJBYm9ydGFibGVQcm9taXNlQ2FjaGUiLCJjYWNoZSIsIlF1aWNrTFJVIiwibWF4U2l6ZSIsImZpbGwiLCJwYXJhbXMiLCJfZ2V0SGVhZGVyIiwiZmlsZWhhbmRsZSIsInJlbmFtZVJlZlNlcXMiLCJwYXRoIiwidXJsIiwicyIsImJiaSIsIlJlbW90ZUZpbGUiLCJMb2NhbEZpbGUiLCJFcnJvciIsIl9nZXRNYWluSGVhZGVyIiwiaGVhZGVyIiwiX3JlYWRDaHJvbVRyZWUiLCJjaHJvbXMiLCJyZXF1ZXN0U2l6ZSIsInJlYWQiLCJCdWZmZXIiLCJhbGxvYyIsImJ1ZmZlciIsImlzQmlnRW5kaWFuIiwiX2lzQmlnRW5kaWFuIiwicmV0IiwicGFyc2UiLCJyZXN1bHQiLCJmaWxlVHlwZSIsIm1hZ2ljIiwiYXNPZmZzZXQiLCJ0b3RhbFN1bW1hcnlPZmZzZXQiLCJhdXRvU3FsIiwic2xpY2UiLCJpbmRleE9mIiwidG9TdHJpbmciLCJ0YWlsIiwidG90YWxTdW1tYXJ5IiwicmVhZEludDMyTEUiLCJyZWFkSW50MzJCRSIsInJlZnNCeU51bWJlciIsInJlZnNCeU5hbWUiLCJjaHJvbVRyZWVPZmZzZXQiLCJ1bnpvb21lZERhdGFPZmZzZXQiLCJkYXRhIiwicCIsImtleVNpemUiLCJsZWFmTm9kZVBhcnNlciIsInN0cmluZyIsInN0cmlwTnVsbCIsIm5vbmxlYWZOb2RlUGFyc2VyIiwicm9vdE5vZGVPZmZzZXQiLCJicHRSZWFkTm9kZSIsImN1cnJlbnRPZmZzZXQiLCJvZmZzZXQiLCJjbnQiLCJuIiwibGVhZlJldCIsImtleSIsInJlZklkIiwicmVmU2l6ZSIsInJlZlJlYyIsIm5hbWUiLCJpZCIsIm5leHROb2RlcyIsIm5vbmxlYWZSZXQiLCJjaGlsZE9mZnNldCIsInB1c2giLCJQcm9taXNlIiwiYWxsIiwiZ2V0SGVhZGVyIiwidW56b29tZWRJbmRleE9mZnNldCIsInpvb21MZXZlbHMiLCJ1bmNvbXByZXNzQnVmU2l6ZSIsIm56bCIsImNpckxlbiIsImRhdGFPZmZzZXQiLCJCbG9ja1ZpZXciLCJyZWZOYW1lIiwic3RhcnQiLCJlbmQiLCJzY2FsZSIsImNock5hbWUiLCJiYXNlc1BlclNwYW4iLCJnZXRWaWV3IiwidmlldyIsIk9ic2VydmFibGUiLCJvYnNlcnZlciIsInJlYWRXaWdEYXRhIiwiZ2V0RmVhdHVyZVN0cmVhbSIsIm9iIiwicGlwZSIsImFjYyIsImN1cnIiLCJjb25jYXQiLCJ0b1Byb21pc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsYUFBYSxHQUFHLENBQUMsVUFBdkI7QUFDQSxJQUFNQyxhQUFhLEdBQUcsQ0FBQyxVQUF2Qjs7QUF5Q0E7Ozs7O0FBS0EsU0FBU0MsVUFBVCxDQUFvQkMsSUFBcEIsRUFBd0M7QUFDdEMsTUFBTUMsRUFBRSxHQUFHRCxJQUFJLEdBQUcsS0FBSCxHQUFXLFFBQTFCO0FBQ0EsTUFBTUUsWUFBWSxHQUFHLElBQUlDLG9CQUFKLEdBQ2xCQyxTQURrQixDQUNSSCxFQURRLEVBRWxCSSxLQUZrQixDQUVaLE9BRlksRUFHbEJDLE1BSGtCLENBR1gsU0FIVyxFQUlsQkEsTUFKa0IsQ0FJWCxlQUpXLEVBS2xCQyxNQUxrQixDQUtY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WyJpbXBvcnQgeyBQYXJzZXIgfSBmcm9tICdAZ21vZC9iaW5hcnktcGFyc2VyJ1xuaW1wb3J0IHsgTG9jYWxGaWxlLCBSZW1vdGVGaWxlLCBHZW5lcmljRmlsZWhhbmRsZSB9IGZyb20gJ2dlbmVyaWMtZmlsZWhhbmRsZSdcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IEFib3J0YWJsZVByb21pc2VDYWNoZSBmcm9tICdhYm9ydGFibGUtcHJvbWlzZS1jYWNoZSdcbmltcG9ydCBRdWlja0xSVSBmcm9tICdxdWljay1scnUnXG5pbXBvcnQgeyBCbG9ja1ZpZXcgfSBmcm9tICcuL2Jsb2NrVmlldydcblxuY29uc3QgQklHX1dJR19NQUdJQyA9IC0yMDAzODI5NzIyXG5jb25zdCBCSUdfQkVEX01BR0lDID0gLTIwMjEwMDI1MTdcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlIHtcbiAgc3RhcnQ6IG51bWJlclxuICBlbmQ6IG51bWJlclxuICBzY29yZTogbnVtYmVyXG4gIHJlc3Q/OiBzdHJpbmcgLy8gZm9yIGJpZ2JlZCBsaW5lXG4gIG1pblNjb3JlPzogbnVtYmVyIC8vIGZvciBzdW1tYXJ5IGxpbmVcbiAgbWF4U2NvcmU/OiBudW1iZXIgLy8gZm9yIHN1bW1hcnkgbGluZVxuICBzdW1tYXJ5PzogYm9vbGVhbiAvLyBpcyBzdW1tYXJ5IGxpbmVcbiAgdW5pcXVlSWQ/OiBzdHJpbmcgLy8gZm9yIGJpZ2JlZCBjb250YWlucyB1bmlxdWVJZCBjYWxjdWxhdGVkIGZyb20gZmlsZSBvZmZzZXRcbiAgZmllbGQ/OiBudW1iZXIgLy8gdXNlZCBpbiBiaWdiZWQgc2VhcmNoaW5nXG59XG5pbnRlcmZhY2UgU3RhdGlzdGljcyB7XG4gIHNjb3JlU3VtOiBudW1iZXJcbiAgYmFzZXNDb3ZlcmVkOiBudW1iZXJcbiAgc2NvcmVTdW1TcXVhcmVzOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFJlZkluZm8ge1xuICBuYW1lOiBzdHJpbmdcbiAgaWQ6IG51bWJlclxuICBsZW5ndGg6IG51bWJlclxufVxuZXhwb3J0IGludGVyZmFjZSBIZWFkZXIge1xuICBhdXRvU3FsOiBzdHJpbmdcbiAgdG90YWxTdW1tYXJ5OiBTdGF0aXN0aWNzXG4gIHpvb21MZXZlbHM6IGFueVxuICB1bnpvb21lZEluZGV4T2Zmc2V0OiBudW1iZXJcbiAgdW56b29tZWREYXRhT2Zmc2V0OiBudW1iZXJcbiAgZGVmaW5lZEZpZWxkQ291bnQ6IG51bWJlclxuICB1bmNvbXByZXNzQnVmU2l6ZTogbnVtYmVyXG4gIGNocm9tVHJlZU9mZnNldDogbnVtYmVyXG4gIGZpbGVTaXplOiBudW1iZXJcbiAgZXh0SGVhZGVyT2Zmc2V0OiBudW1iZXJcbiAgaXNCaWdFbmRpYW46IGJvb2xlYW5cbiAgZmlsZVR5cGU6IHN0cmluZ1xuICByZWZzQnlOYW1lOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9XG4gIHJlZnNCeU51bWJlcjogeyBba2V5OiBudW1iZXJdOiBSZWZJbmZvIH1cbn1cblxuLyogZ2V0IHRoZSBjb21waWxlZCBwYXJzZXJzIGZvciBkaWZmZXJlbnQgc2VjdGlvbnMgb2YgdGhlIGJpZ3dpZyBmaWxlXG4gKlxuICogQHBhcmFtIGlzQkUgLSBpcyBiaWcgZW5kaWFuLCB0eXBpY2FsbHkgZmFsc2VcbiAqIEByZXR1cm4gYW4gb2JqZWN0IHdpdGggY29tcGlsZWQgcGFyc2Vyc1xuICovXG5mdW5jdGlvbiBnZXRQYXJzZXJzKGlzQkU6IGJvb2xlYW4pOiBhbnkge1xuICBjb25zdCBsZSA9IGlzQkUgPyAnYmlnJyA6ICdsaXR0bGUnXG4gIGNvbnN0IGhlYWRlclBhcnNlciA9IG5ldyBQYXJzZXIoKVxuICAgIC5lbmRpYW5lc3MobGUpXG4gICAgLmludDMyKCdtYWdpYycpXG4gICAgLnVpbnQxNigndmVyc2lvbicpXG4gICAgLnVpbnQxNignbnVtWm9vbUxldmVscycpXG4gICAgLnVpbnQ2NCgnY2hyb21UcmVlT2Zmc2V0JylcbiAgICAudWludDY0KCd1bnpvb21lZERhdGFPZmZzZXQnKVxuICAgIC51aW50NjQoJ3Vuem9vbWVkSW5kZXhPZmZzZXQnKVxuICAgIC51aW50MTYoJ2ZpZWxkQ291bnQnKVxuICAgIC51aW50MTYoJ2RlZmluZWRGaWVsZENvdW50JylcbiAgICAudWludDY0KCdhc09mZnNldCcpIC8vIGF1dG9TcWwgb2Zmc2V0LCB1c2VkIGluIGJpZ2JlZFxuICAgIC51aW50NjQoJ3RvdGFsU3VtbWFyeU9mZnNldCcpXG4gICAgLnVpbnQzMigndW5jb21wcmVzc0J1ZlNpemUnKVxuICAgIC51aW50NjQoJ2V4dEhlYWRlck9mZnNldCcpIC8vIG5hbWUgaW5kZXggb2Zmc2V0LCB1c2VkIGluIGJpZ2JlZFxuICAgIC5hcnJheSgnem9vbUxldmVscycsIHtcbiAgICAgIGxlbmd0aDogJ251bVpvb21MZXZlbHMnLFxuICAgICAgdHlwZTogbmV3IFBhcnNlcigpXG4gICAgICAgIC51aW50MzIoJ3JlZHVjdGlvbkxldmVsJylcbiAgICAgICAgLnVpbnQzMigncmVzZXJ2ZWQnKVxuICAgICAgICAudWludDY0KCdkYXRhT2Zmc2V0JylcbiAgICAgICAgLnVpbnQ2NCgnaW5kZXhPZmZzZXQnKSxcbiAgICB9KVxuXG4gIGNvbnN0IHRvdGFsU3VtbWFyeVBhcnNlciA9IG5ldyBQYXJzZXIoKVxuICAgIC5lbmRpYW5lc3MobGUpXG4gICAgLnVpbnQ2NCgnYmFzZXNDb3ZlcmVkJylcbiAgICAuZG91YmxlKCdzY29yZU1pbicpXG4gICAgLmRvdWJsZSgnc2NvcmVNYXgnKVxuICAgIC5kb3VibGUoJ3Njb3JlU3VtJylcbiAgICAuZG91YmxlKCdzY29yZVN1bVNxdWFyZXMnKVxuXG4gIGNvbnN0IGNocm9tVHJlZVBhcnNlciA9IG5ldyBQYXJzZXIoKVxuICAgIC5lbmRpYW5lc3MobGUpXG4gICAgLnVpbnQzMignbWFnaWMnKVxuICAgIC51aW50MzIoJ2Jsb2NrU2l6ZScpXG4gICAgLnVpbnQzMigna2V5U2l6ZScpXG4gICAgLnVpbnQzMigndmFsU2l6ZScpXG4gICAgLnVpbnQ2NCgnaXRlbUNvdW50JylcblxuICBjb25zdCBpc0xlYWZOb2RlID0gbmV3IFBhcnNlcigpXG4gICAgLmVuZGlhbmVzcyhsZSlcbiAgICAudWludDgoJ2lzTGVhZk5vZGUnKVxuICAgIC5za2lwKDEpXG4gICAgLnVpbnQxNignY250JylcblxuICByZXR1cm4ge1xuICAgIGNocm9tVHJlZVBhcnNlcixcbiAgICB0b3RhbFN1bW1hcnlQYXJzZXIsXG4gICAgaGVhZGVyUGFyc2VyLFxuICAgIGlzTGVhZk5vZGUsXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3B0aW9ucyB7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJCSSB7XG4gIHByb3RlY3RlZCBiYmk6IEdlbmVyaWNGaWxlaGFuZGxlXG5cbiAgcHJvdGVjdGVkIGhlYWRlckNhY2hlID0gbmV3IEFib3J0YWJsZVByb21pc2VDYWNoZSh7XG4gICAgY2FjaGU6IG5ldyBRdWlja0xSVSh7IG1heFNpemU6IDEgfSksXG4gICAgZmlsbDogYXN5bmMgKHBhcmFtczogYW55LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEhlYWRlcih7IC4uLnBhcmFtcywgc2lnbmFsIH0pXG4gICAgfSxcbiAgfSlcblxuICBwcm90ZWN0ZWQgcmVuYW1lUmVmU2VxczogKGE6IHN0cmluZykgPT4gc3RyaW5nXG5cbiAgLyogZmV0Y2ggYW5kIHBhcnNlIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIGEgYmlnd2lnIG9yIGJpZ2JlZCBmaWxlXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIGFib3J0IHRoZSBvcGVyYXRpb24sIGNhbiBiZSBudWxsXG4gICAqIEByZXR1cm4gYSBIZWFkZXIgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgZ2V0SGVhZGVyKG9wdHM6IFJlcXVlc3RPcHRpb25zIHwgQWJvcnRTaWduYWwgPSB7fSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAnYWJvcnRlZCcgaW4gb3B0cyA/IHsgc2lnbmFsOiBvcHRzIH0gOiBvcHRzXG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyQ2FjaGUuZ2V0KEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLCBvcHRpb25zLCBvcHRpb25zLnNpZ25hbClcbiAgfVxuXG4gIC8qXG4gICAqIEBwYXJhbSBmaWxlaGFuZGxlIC0gYSBmaWxlaGFuZGxlIGZyb20gZ2VuZXJpYy1maWxlaGFuZGxlIG9yIGltcGxlbWVudGluZyBzb21ldGhpbmcgc2ltaWxhciB0byB0aGUgbm9kZTEwIGZzLnByb21pc2VzIEFQSVxuICAgKiBAcGFyYW0gcGF0aCAtIGEgTG9jYWwgZmlsZSBwYXRoIGFzIGEgc3RyaW5nXG4gICAqIEBwYXJhbSB1cmwgLSBhIFVSTCBzdHJpbmdcbiAgICogQHBhcmFtIHJlbmFtZVJlZlNlcXMgLSBhbiBvcHRpb25hbCBtZXRob2QgdG8gcmVuYW1lIHRoZSBpbnRlcm5hbCByZWZlcmVuY2Ugc2VxdWVuY2VzIHVzaW5nIGEgbWFwcGluZyBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGZpbGVoYW5kbGU/OiBHZW5lcmljRmlsZWhhbmRsZVxuICAgICAgcGF0aD86IHN0cmluZ1xuICAgICAgdXJsPzogc3RyaW5nXG4gICAgICByZW5hbWVSZWZTZXFzPzogKGE6IHN0cmluZykgPT4gc3RyaW5nXG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCB7IGZpbGVoYW5kbGUsIHJlbmFtZVJlZlNlcXMsIHBhdGgsIHVybCB9ID0gb3B0aW9uc1xuICAgIHRoaXMucmVuYW1lUmVmU2VxcyA9IHJlbmFtZVJlZlNlcXMgfHwgKChzOiBzdHJpbmcpOiBzdHJpbmcgPT4gcylcbiAgICBpZiAoZmlsZWhhbmRsZSkge1xuICAgICAgdGhpcy5iYmkgPSBmaWxlaGFuZGxlXG4gICAgfSBlbHNlIGlmICh1cmwpIHtcbiAgICAgIHRoaXMuYmJpID0gbmV3IFJlbW90ZUZpbGUodXJsKVxuICAgIH0gZWxzZSBpZiAocGF0aCkge1xuICAgICAgdGhpcy5iYmkgPSBuZXcgTG9jYWxGaWxlKHBhdGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZmlsZSBnaXZlbicpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0SGVhZGVyKG9wdHM6IFJlcXVlc3RPcHRpb25zKSB7XG4gICAgY29uc3QgaGVhZGVyID0gYXdhaXQgdGhpcy5fZ2V0TWFpbkhlYWRlcihvcHRzKVxuICAgIGNvbnN0IGNocm9tcyA9IGF3YWl0IHRoaXMuX3JlYWRDaHJvbVRyZWUoaGVhZGVyLCBvcHRzKVxuICAgIHJldHVybiB7IC4uLmhlYWRlciwgLi4uY2hyb21zIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldE1haW5IZWFkZXIob3B0czogUmVxdWVzdE9wdGlvbnMsIHJlcXVlc3RTaXplID0gMjAwMCk6IFByb21pc2U8SGVhZGVyPiB7XG4gICAgY29uc3QgeyBidWZmZXIgfSA9IGF3YWl0IHRoaXMuYmJpLnJlYWQoQnVmZmVyLmFsbG9jKHJlcXVlc3RTaXplKSwgMCwgcmVxdWVzdFNpemUsIDAsIG9wdHMpXG4gICAgY29uc3QgaXNCaWdFbmRpYW4gPSB0aGlzLl9pc0JpZ0VuZGlhbihidWZmZXIpXG4gICAgY29uc3QgcmV0ID0gZ2V0UGFyc2Vycyhpc0JpZ0VuZGlhbilcbiAgICBjb25zdCBoZWFkZXIgPSByZXQuaGVhZGVyUGFyc2VyLnBhcnNlKGJ1ZmZlcikucmVzdWx0XG4gICAgaGVhZGVyLmZpbGVUeXBlID0gaGVhZGVyLm1hZ2ljID09PSBCSUdfQkVEX01BR0lDID8gJ2JpZ2JlZCcgOiAnYmlnd2lnJ1xuICAgIGlmIChoZWFkZXIuYXNPZmZzZXQgPiByZXF1ZXN0U2l6ZSB8fCBoZWFkZXIudG90YWxTdW1tYXJ5T2Zmc2V0ID4gcmVxdWVzdFNpemUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRNYWluSGVhZGVyKG9wdHMsIHJlcXVlc3RTaXplICogMilcbiAgICB9XG4gICAgaWYgKGhlYWRlci5hc09mZnNldCkge1xuICAgICAgaGVhZGVyLmF1dG9TcWwgPSBidWZmZXJcbiAgICAgICAgLnNsaWNlKGhlYWRlci5hc09mZnNldCwgYnVmZmVyLmluZGV4T2YoMCwgaGVhZGVyLmFzT2Zmc2V0KSlcbiAgICAgICAgLnRvU3RyaW5nKCd1dGY4JylcbiAgICB9XG4gICAgaWYgKGhlYWRlci50b3RhbFN1bW1hcnlPZmZzZXQgPiByZXF1ZXN0U2l6ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldE1haW5IZWFkZXIob3B0cywgcmVxdWVzdFNpemUgKiAyKVxuICAgIH1cbiAgICBpZiAoaGVhZGVyLnRvdGFsU3VtbWFyeU9mZnNldCkge1xuICAgICAgY29uc3QgdGFpbCA9IGJ1ZmZlci5zbGljZShoZWFkZXIudG90YWxTdW1tYXJ5T2Zmc2V0KVxuICAgICAgaGVhZGVyLnRvdGFsU3VtbWFyeSA9IHJldC50b3RhbFN1bW1hcnlQYXJzZXIucGFyc2UodGFpbCkucmVzdWx0XG4gICAgfVxuICAgIHJldHVybiB7IC4uLmhlYWRlciwgaXNCaWdFbmRpYW4gfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNCaWdFbmRpYW4oYnVmZmVyOiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICBsZXQgcmV0ID0gYnVmZmVyLnJlYWRJbnQzMkxFKDApXG4gICAgaWYgKHJldCA9PT0gQklHX1dJR19NQUdJQyB8fCByZXQgPT09IEJJR19CRURfTUFHSUMpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXQgPSBidWZmZXIucmVhZEludDMyQkUoMClcbiAgICBpZiAocmV0ID09PSBCSUdfV0lHX01BR0lDIHx8IHJldCA9PT0gQklHX0JFRF9NQUdJQykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSBCaWdXaWcvQmlnQmVkIGZpbGUnKVxuICB9XG5cbiAgLy8gdG9kbzogYWRkIHByb2dyZXNzIGlmIGxvbmcgcnVubmluZ1xuICBwcml2YXRlIGFzeW5jIF9yZWFkQ2hyb21UcmVlKGhlYWRlcjogSGVhZGVyLCBvcHRzOiB7IHNpZ25hbD86IEFib3J0U2lnbmFsIH0pIHtcbiAgICBjb25zdCBpc0JFID0gaGVhZGVyLmlzQmlnRW5kaWFuXG4gICAgY29uc3QgbGUgPSBpc0JFID8gJ2JpZycgOiAnbGl0dGxlJ1xuICAgIGNvbnN0IHJlZnNCeU51bWJlcjogeyBba2V5OiBudW1iZXJdOiB7IG5hbWU6IHN0cmluZzsgaWQ6IG51bWJlcjsgbGVuZ3RoOiBudW1iZXIgfSB9ID0gW11cbiAgICBjb25zdCByZWZzQnlOYW1lOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICBjb25zdCB7IGNocm9tVHJlZU9mZnNldCB9ID0gaGVhZGVyXG4gICAgbGV0IHsgdW56b29tZWREYXRhT2Zmc2V0IH0gPSBoZWFkZXJcblxuICAgIHdoaWxlICh1bnpvb21lZERhdGFPZmZzZXQgJSA0ICE9PSAwKSB7XG4gICAgICB1bnpvb21lZERhdGFPZmZzZXQgKz0gMVxuICAgIH1cblxuICAgIGNvbnN0IHsgYnVmZmVyOiBkYXRhIH0gPSBhd2FpdCB0aGlzLmJiaS5yZWFkKFxuICAgICAgQnVmZmVyLmFsbG9jKHVuem9vbWVkRGF0YU9mZnNldCAtIGNocm9tVHJlZU9mZnNldCksXG4gICAgICAwLFxuICAgICAgdW56b29tZWREYXRhT2Zmc2V0IC0gY2hyb21UcmVlT2Zmc2V0LFxuICAgICAgY2hyb21UcmVlT2Zmc2V0LFxuICAgICAgb3B0cyxcbiAgICApXG5cbiAgICBjb25zdCBwID0gZ2V0UGFyc2Vycyhpc0JFKVxuICAgIGNvbnN0IHsga2V5U2l6ZSB9ID0gcC5jaHJvbVRyZWVQYXJzZXIucGFyc2UoZGF0YSkucmVzdWx0XG4gICAgY29uc3QgbGVhZk5vZGVQYXJzZXIgPSBuZXcgUGFyc2VyKClcbiAgICAgIC5lbmRpYW5lc3MobGUpXG4gICAgICAuc3RyaW5nKCdrZXknLCB7IHN0cmlwTnVsbDogdHJ1ZSwgbGVuZ3RoOiBrZXlTaXplIH0pXG4gICAgICAudWludDMyKCdyZWZJZCcpXG4gICAgICAudWludDMyKCdyZWZTaXplJylcbiAgICBjb25zdCBub25sZWFmTm9kZVBhcnNlciA9IG5ldyBQYXJzZXIoKVxuICAgICAgLmVuZGlhbmVzcyhsZSlcbiAgICAgIC5za2lwKGtleVNpemUpXG4gICAgICAudWludDY0KCdjaGlsZE9mZnNldCcpXG4gICAgY29uc3Qgcm9vdE5vZGVPZmZzZXQgPSAzMlxuICAgIGNvbnN0IGJwdFJlYWROb2RlID0gYXN5bmMgKGN1cnJlbnRPZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgbGV0IG9mZnNldCA9IGN1cnJlbnRPZmZzZXRcbiAgICAgIGlmIChvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcigncmVhZGluZyBiZXlvbmQgZW5kIG9mIGJ1ZmZlcicpXG4gICAgICBjb25zdCByZXQgPSBwLmlzTGVhZk5vZGUucGFyc2UoZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgY29uc3QgeyBpc0xlYWZOb2RlLCBjbnQgfSA9IHJldC5yZXN1bHRcbiAgICAgIG9mZnNldCArPSByZXQub2Zmc2V0XG4gICAgICBpZiAoaXNMZWFmTm9kZSkge1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGNudDsgbiArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbGVhZlJldCA9IGxlYWZOb2RlUGFyc2VyLnBhcnNlKGRhdGEuc2xpY2Uob2Zmc2V0KSlcbiAgICAgICAgICBvZmZzZXQgKz0gbGVhZlJldC5vZmZzZXRcbiAgICAgICAgICBjb25zdCB7IGtleSwgcmVmSWQsIHJlZlNpemUgfSA9IGxlYWZSZXQucmVzdWx0XG4gICAgICAgICAgY29uc3QgcmVmUmVjID0geyBuYW1lOiBrZXksIGlkOiByZWZJZCwgbGVuZ3RoOiByZWZTaXplIH1cbiAgICAgICAgICByZWZzQnlOYW1lW3RoaXMucmVuYW1lUmVmU2VxcyhrZXkpXSA9IHJlZklkXG4gICAgICAgICAgcmVmc0J5TnVtYmVyW3JlZklkXSA9IHJlZlJlY1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBwYXJzZSBpbmRleCBub2RlXG4gICAgICAgIGNvbnN0IG5leHROb2RlcyA9IFtdXG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgY250OyBuICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBub25sZWFmUmV0ID0gbm9ubGVhZk5vZGVQYXJzZXIucGFyc2UoZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgICAgIGxldCB7IGNoaWxkT2Zmc2V0IH0gPSBub25sZWFmUmV0LnJlc3VsdFxuICAgICAgICAgIG9mZnNldCArPSBub25sZWFmUmV0Lm9mZnNldFxuICAgICAgICAgIGNoaWxkT2Zmc2V0IC09IGNocm9tVHJlZU9mZnNldFxuICAgICAgICAgIG5leHROb2Rlcy5wdXNoKGJwdFJlYWROb2RlKGNoaWxkT2Zmc2V0KSlcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChuZXh0Tm9kZXMpXG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IGJwdFJlYWROb2RlKHJvb3ROb2RlT2Zmc2V0KVxuICAgIHJldHVybiB7XG4gICAgICByZWZzQnlOYW1lLFxuICAgICAgcmVmc0J5TnVtYmVyLFxuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIGZldGNoZXMgdGhlIFwidW56b29tZWRcIiB2aWV3IG9mIHRoZSBiaWd3aWcgZGF0YS4gdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgYmlnYmVkXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIGEgc2lnbmFsIHRvIG9wdGlvbmFsbHkgYWJvcnQgdGhpcyBvcGVyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRVbnpvb21lZFZpZXcob3B0czogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEJsb2NrVmlldz4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHVuem9vbWVkSW5kZXhPZmZzZXQsXG4gICAgICB6b29tTGV2ZWxzLFxuICAgICAgcmVmc0J5TmFtZSxcbiAgICAgIHVuY29tcHJlc3NCdWZTaXplLFxuICAgICAgaXNCaWdFbmRpYW4sXG4gICAgICBmaWxlVHlwZSxcbiAgICB9ID0gYXdhaXQgdGhpcy5nZXRIZWFkZXIob3B0cylcbiAgICBjb25zdCBuemwgPSB6b29tTGV2ZWxzWzBdXG4gICAgY29uc3QgY2lyTGVuID0gbnpsID8gbnpsLmRhdGFPZmZzZXQgLSB1bnpvb21lZEluZGV4T2Zmc2V0IDogNDAwMFxuICAgIHJldHVybiBuZXcgQmxvY2tWaWV3KFxuICAgICAgdGhpcy5iYmksXG4gICAgICByZWZzQnlOYW1lLFxuICAgICAgdW56b29tZWRJbmRleE9mZnNldCxcbiAgICAgIGNpckxlbixcbiAgICAgIGlzQmlnRW5kaWFuLFxuICAgICAgdW5jb21wcmVzc0J1ZlNpemUgPiAwLFxuICAgICAgZmlsZVR5cGUsXG4gICAgKVxuICB9XG5cbiAgLypcbiAgICogYWJzdHJhY3QgbWV0aG9kIC0gZ2V0IHRoZSB2aWV3IGZvciBhIGdpdmVuIHNjYWxlXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgZ2V0VmlldyhzY2FsZTogbnVtYmVyLCBvcHRzOiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8QmxvY2tWaWV3PlxuXG4gIC8qKlxuICAgKiBHZXRzIGZlYXR1cmVzIGZyb20gYSBCaWdXaWcgZmlsZVxuICAgKlxuICAgKiBAcGFyYW0gcmVmTmFtZSAtIFRoZSBjaHJvbW9zb21lIG5hbWVcbiAgICogQHBhcmFtIHN0YXJ0IC0gVGhlIHN0YXJ0IG9mIGEgcmVnaW9uXG4gICAqIEBwYXJhbSBlbmQgLSBUaGUgZW5kIG9mIGEgcmVnaW9uXG4gICAqIEBwYXJhbSBvcHRzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYmFzZXNQZXJTcGFuIChlLmcuIHBpeGVscyBwZXIgYmFzZXBhaXIpIG9yIHNjYWxlIHVzZWQgdG8gaW5mZXIgdGhlIHpvb21MZXZlbCB0byB1c2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRGZWF0dXJlU3RyZWFtKFxuICAgIHJlZk5hbWU6IHN0cmluZyxcbiAgICBzdGFydDogbnVtYmVyLFxuICAgIGVuZDogbnVtYmVyLFxuICAgIG9wdHM6IFJlcXVlc3RPcHRpb25zICYgeyBzY2FsZT86IG51bWJlcjsgYmFzZXNQZXJTcGFuPzogbnVtYmVyIH0gPSB7IHNjYWxlOiAxIH0sXG4gICk6IFByb21pc2U8T2JzZXJ2YWJsZTxGZWF0dXJlW10+PiB7XG4gICAgYXdhaXQgdGhpcy5nZXRIZWFkZXIob3B0cylcbiAgICBjb25zdCBjaHJOYW1lID0gdGhpcy5yZW5hbWVSZWZTZXFzKHJlZk5hbWUpXG4gICAgbGV0IHZpZXc6IEJsb2NrVmlld1xuXG4gICAgaWYgKG9wdHMuYmFzZXNQZXJTcGFuKSB7XG4gICAgICB2aWV3ID0gYXdhaXQgdGhpcy5nZXRWaWV3KDEgLyBvcHRzLmJhc2VzUGVyU3Bhbiwgb3B0cylcbiAgICB9IGVsc2UgaWYgKG9wdHMuc2NhbGUpIHtcbiAgICAgIHZpZXcgPSBhd2FpdCB0aGlzLmdldFZpZXcob3B0cy5zY2FsZSwgb3B0cylcbiAgICB9IGVsc2Uge1xuICAgICAgdmlldyA9IGF3YWl0IHRoaXMuZ2V0VmlldygxLCBvcHRzKVxuICAgIH1cblxuICAgIGlmICghdmlldykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmFibGUgdG8gZ2V0IGJsb2NrIHZpZXcgZm9yIGRhdGEnKVxuICAgIH1cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxGZWF0dXJlW10+KTogdm9pZCA9PiB7XG4gICAgICB2aWV3LnJlYWRXaWdEYXRhKGNock5hbWUsIHN0YXJ0LCBlbmQsIG9ic2VydmVyLCBvcHRzKVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RmVhdHVyZXMoXG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIHN0YXJ0OiBudW1iZXIsXG4gICAgZW5kOiBudW1iZXIsXG4gICAgb3B0czogUmVxdWVzdE9wdGlvbnMgJiB7IHNjYWxlPzogbnVtYmVyOyBiYXNlc1BlclNwYW4/OiBudW1iZXIgfSA9IHsgc2NhbGU6IDEgfSxcbiAgKTogUHJvbWlzZTxGZWF0dXJlW10+IHtcbiAgICBjb25zdCBvYiA9IGF3YWl0IHRoaXMuZ2V0RmVhdHVyZVN0cmVhbShyZWZOYW1lLCBzdGFydCwgZW5kLCBvcHRzKVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgb2IucGlwZShyZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjLmNvbmNhdChjdXJyKSkpLnRvUHJvbWlzZSgpXG4gICAgcmV0dXJuIHJldCB8fCBbXVxuICB9XG59XG4iXX0= |
@@ -6,3 +6,3 @@ import { BBI, Feature, RequestOptions } from './bbi'; | ||
readIndicesCache: any; | ||
constructor(opts: any); | ||
constructor(opts?: any); | ||
readIndices(opts?: AbortSignal | RequestOptions): any; | ||
@@ -9,0 +9,0 @@ protected getView(scale: number, opts: RequestOptions): Promise<BlockView>; |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.filterUndef = filterUndef; | ||
exports.BigBed = void 0; | ||
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); | ||
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); | ||
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); | ||
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); | ||
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); | ||
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
var _binaryParser = require("@gmod/binary-parser"); | ||
var _rxjs = require("rxjs"); | ||
var _operators = require("rxjs/operators"); | ||
var _abortablePromiseCache = _interopRequireDefault(require("abortable-promise-cache")); | ||
var _quickLru = _interopRequireDefault(require("quick-lru")); | ||
var _bbi = require("./bbi"); | ||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } | ||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } | ||
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } | ||
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } | ||
var __extends = (this && this.__extends) || (function () { | ||
var extendStatics = function (d, b) { | ||
extendStatics = Object.setPrototypeOf || | ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || | ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; | ||
return extendStatics(d, b); | ||
}; | ||
return function (d, b) { | ||
if (typeof b !== "function" && b !== null) | ||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); | ||
extendStatics(d, b); | ||
function __() { this.constructor = d; } | ||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | ||
}; | ||
})(); | ||
var __assign = (this && this.__assign) || function () { | ||
__assign = Object.assign || function(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) | ||
t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
return __assign.apply(this, arguments); | ||
}; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.BigBed = exports.filterUndef = void 0; | ||
var binary_parser_1 = require("@gmod/binary-parser"); | ||
var rxjs_1 = require("rxjs"); | ||
var operators_1 = require("rxjs/operators"); | ||
var abortable_promise_cache_1 = __importDefault(require("abortable-promise-cache")); | ||
var quick_lru_1 = __importDefault(require("quick-lru")); | ||
var bbi_1 = require("./bbi"); | ||
function filterUndef(ts) { | ||
return ts.filter(function (t) { | ||
return !!t; | ||
}); | ||
return ts.filter(function (t) { return !!t; }); | ||
} | ||
var BigBed = /*#__PURE__*/function (_BBI) { | ||
(0, _inherits2.default)(BigBed, _BBI); | ||
var _super = _createSuper(BigBed); | ||
function BigBed(opts) { | ||
var _this; | ||
(0, _classCallCheck2.default)(this, BigBed); | ||
_this = _super.call(this, opts); | ||
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "readIndicesCache", new _abortablePromiseCache.default({ | ||
cache: new _quickLru.default({ | ||
maxSize: 1 | ||
}), | ||
fill: function () { | ||
var _fill = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(args, signal) { | ||
return _regenerator.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
return _context.abrupt("return", _this._readIndices(_objectSpread(_objectSpread({}, args), {}, { | ||
signal: signal | ||
}))); | ||
case 1: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
function fill(_x, _x2) { | ||
return _fill.apply(this, arguments); | ||
} | ||
return fill; | ||
}() | ||
})); | ||
return _this; | ||
} | ||
(0, _createClass2.default)(BigBed, [{ | ||
key: "readIndices", | ||
value: function readIndices() { | ||
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var options = 'aborted' in opts ? { | ||
signal: opts | ||
} : opts; | ||
return this.readIndicesCache.get(JSON.stringify(options), options, options.signal); | ||
exports.filterUndef = filterUndef; | ||
var BigBed = /** @class */ (function (_super) { | ||
__extends(BigBed, _super); | ||
function BigBed(opts) { | ||
var _this = _super.call(this, opts) || this; | ||
_this.readIndicesCache = new abortable_promise_cache_1.default({ | ||
cache: new quick_lru_1.default({ maxSize: 1 }), | ||
fill: function (args, signal) { return __awaiter(_this, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
return [2 /*return*/, this._readIndices(__assign(__assign({}, args), { signal: signal }))]; | ||
}); | ||
}); }, | ||
}); | ||
return _this; | ||
} | ||
BigBed.prototype.readIndices = function (opts) { | ||
if (opts === void 0) { opts = {}; } | ||
var options = 'aborted' in opts ? { signal: opts } : opts; | ||
return this.readIndicesCache.get(JSON.stringify(options), options, options.signal); | ||
}; | ||
/* | ||
@@ -114,27 +104,9 @@ * retrieve unzoomed view for any scale | ||
*/ | ||
}, { | ||
key: "getView", | ||
value: function () { | ||
var _getView = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(scale, opts) { | ||
return _regenerator.default.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
return _context2.abrupt("return", this.getUnzoomedView(opts)); | ||
case 1: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, this); | ||
})); | ||
function getView(_x3, _x4) { | ||
return _getView.apply(this, arguments); | ||
} | ||
return getView; | ||
}() | ||
BigBed.prototype.getView = function (scale, opts) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
return [2 /*return*/, this.getUnzoomedView(opts)]; | ||
}); | ||
}); | ||
}; | ||
/* | ||
@@ -145,69 +117,46 @@ * parse the bigbed extraIndex fields | ||
*/ | ||
}, { | ||
key: "_readIndices", | ||
value: function () { | ||
var _readIndices2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(opts) { | ||
var _yield$this$getHeader, extHeaderOffset, isBigEndian, _yield$this$bbi$read, data, le, ret, count, offset, blocklen, len, _yield$this$bbi$read2, buffer, extParser, indices, i; | ||
return _regenerator.default.wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
_context3.next = 2; | ||
return this.getHeader(opts); | ||
case 2: | ||
_yield$this$getHeader = _context3.sent; | ||
extHeaderOffset = _yield$this$getHeader.extHeaderOffset; | ||
isBigEndian = _yield$this$getHeader.isBigEndian; | ||
_context3.next = 7; | ||
return this.bbi.read(Buffer.alloc(64), 0, 64, extHeaderOffset); | ||
case 7: | ||
_yield$this$bbi$read = _context3.sent; | ||
data = _yield$this$bbi$read.buffer; | ||
le = isBigEndian ? 'big' : 'little'; | ||
ret = new _binaryParser.Parser().endianess(le).uint16('size').uint16('count').uint64('offset').parse(data).result; | ||
count = ret.count, offset = ret.offset; // no extra index is defined if count==0 | ||
if (!(count === 0)) { | ||
_context3.next = 14; | ||
break; | ||
BigBed.prototype._readIndices = function (opts) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var _a, extHeaderOffset, isBigEndian, data, le, ret, count, offset, blocklen, len, buffer, extParser, indices, i; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: return [4 /*yield*/, this.getHeader(opts)]; | ||
case 1: | ||
_a = _b.sent(), extHeaderOffset = _a.extHeaderOffset, isBigEndian = _a.isBigEndian; | ||
return [4 /*yield*/, this.bbi.read(Buffer.alloc(64), 0, 64, extHeaderOffset)]; | ||
case 2: | ||
data = (_b.sent()).buffer; | ||
le = isBigEndian ? 'big' : 'little'; | ||
ret = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.uint16('size') | ||
.uint16('count') | ||
.uint64('offset') | ||
.parse(data).result; | ||
count = ret.count, offset = ret.offset; | ||
// no extra index is defined if count==0 | ||
if (count === 0) { | ||
return [2 /*return*/, []]; | ||
} | ||
blocklen = 20; | ||
len = blocklen * count; | ||
return [4 /*yield*/, this.bbi.read(Buffer.alloc(len), 0, len, offset)]; | ||
case 3: | ||
buffer = (_b.sent()).buffer; | ||
extParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.int16('type') | ||
.int16('fieldcount') | ||
.uint64('offset') | ||
.skip(4) | ||
.int16('field'); | ||
indices = []; | ||
for (i = 0; i < count; i += 1) { | ||
indices.push(extParser.parse(buffer.slice(i * blocklen)).result); | ||
} | ||
return [2 /*return*/, indices]; | ||
} | ||
return _context3.abrupt("return", []); | ||
case 14: | ||
blocklen = 20; | ||
len = blocklen * count; | ||
_context3.next = 18; | ||
return this.bbi.read(Buffer.alloc(len), 0, len, offset); | ||
case 18: | ||
_yield$this$bbi$read2 = _context3.sent; | ||
buffer = _yield$this$bbi$read2.buffer; | ||
extParser = new _binaryParser.Parser().endianess(le).int16('type').int16('fieldcount').uint64('offset').skip(4).int16('field'); | ||
indices = []; | ||
for (i = 0; i < count; i += 1) { | ||
indices.push(extParser.parse(buffer.slice(i * blocklen)).result); | ||
} | ||
return _context3.abrupt("return", indices); | ||
case 24: | ||
case "end": | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee3, this); | ||
})); | ||
function _readIndices(_x5) { | ||
return _readIndices2.apply(this, arguments); | ||
} | ||
return _readIndices; | ||
}() | ||
}); | ||
}); | ||
}; | ||
/* | ||
@@ -221,204 +170,102 @@ * perform a search in the bigbed extraIndex to find which blocks in the bigbed data to look for the | ||
*/ | ||
}, { | ||
key: "searchExtraIndexBlocks", | ||
value: function () { | ||
var _searchExtraIndexBlocks = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(name) { | ||
var _this2 = this; | ||
var opts, | ||
_yield$this$getHeader2, | ||
isBigEndian, | ||
indices, | ||
locs, | ||
_args6 = arguments; | ||
return _regenerator.default.wrap(function _callee6$(_context6) { | ||
while (1) { | ||
switch (_context6.prev = _context6.next) { | ||
case 0: | ||
opts = _args6.length > 1 && _args6[1] !== undefined ? _args6[1] : {}; | ||
_context6.next = 3; | ||
return this.getHeader(opts); | ||
case 3: | ||
_yield$this$getHeader2 = _context6.sent; | ||
isBigEndian = _yield$this$getHeader2.isBigEndian; | ||
_context6.next = 7; | ||
return this.readIndices(opts); | ||
case 7: | ||
indices = _context6.sent; | ||
if (indices.length) { | ||
_context6.next = 10; | ||
break; | ||
BigBed.prototype.searchExtraIndexBlocks = function (name, opts) { | ||
if (opts === void 0) { opts = {}; } | ||
return __awaiter(this, void 0, void 0, function () { | ||
var isBigEndian, indices, locs, _a; | ||
var _this = this; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: return [4 /*yield*/, this.getHeader(opts)]; | ||
case 1: | ||
isBigEndian = (_b.sent()).isBigEndian; | ||
return [4 /*yield*/, this.readIndices(opts)]; | ||
case 2: | ||
indices = _b.sent(); | ||
if (!indices.length) { | ||
return [2 /*return*/, []]; | ||
} | ||
locs = indices.map(function (index) { return __awaiter(_this, void 0, void 0, function () { | ||
var offset, field, data, p, _a, blockSize, keySize, valSize, bpt, bptReadNode, rootNodeOffset; | ||
var _this = this; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
offset = index.offset, field = index.field; | ||
return [4 /*yield*/, this.bbi.read(Buffer.alloc(32), 0, 32, offset, opts)]; | ||
case 1: | ||
data = (_b.sent()).buffer; | ||
p = new binary_parser_1.Parser() | ||
.endianess(isBigEndian ? 'big' : 'little') | ||
.int32('magic') | ||
.int32('blockSize') | ||
.int32('keySize') | ||
.int32('valSize') | ||
.uint64('itemCount'); | ||
_a = p.parse(data).result, blockSize = _a.blockSize, keySize = _a.keySize, valSize = _a.valSize; | ||
bpt = new binary_parser_1.Parser() | ||
.endianess(isBigEndian ? 'big' : 'little') | ||
.int8('nodeType') | ||
.skip(1) | ||
.int16('cnt') | ||
.choice({ | ||
tag: 'nodeType', | ||
choices: { | ||
0: new binary_parser_1.Parser().array('leafkeys', { | ||
length: 'cnt', | ||
type: new binary_parser_1.Parser() | ||
.string('key', { length: keySize, stripNull: true }) | ||
.uint64('offset'), | ||
}), | ||
1: new binary_parser_1.Parser().array('keys', { | ||
length: 'cnt', | ||
type: new binary_parser_1.Parser() | ||
.string('key', { length: keySize, stripNull: true }) | ||
.uint64('offset') | ||
.uint32('length') | ||
.uint32('reserved'), | ||
}), | ||
}, | ||
}); | ||
bptReadNode = function (nodeOffset) { return __awaiter(_this, void 0, void 0, function () { | ||
var len, buffer, node, lastOffset, i, key, i; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
len = 4 + blockSize * (keySize + valSize); | ||
return [4 /*yield*/, this.bbi.read(Buffer.alloc(len), 0, len, nodeOffset, opts)]; | ||
case 1: | ||
buffer = (_a.sent()).buffer; | ||
node = bpt.parse(buffer).result; | ||
if (node.leafkeys) { | ||
lastOffset = void 0; | ||
for (i = 0; i < node.leafkeys.length; i += 1) { | ||
key = node.leafkeys[i].key; | ||
if (name.localeCompare(key) < 0 && lastOffset) { | ||
return [2 /*return*/, bptReadNode(lastOffset)]; | ||
} | ||
lastOffset = node.leafkeys[i].offset; | ||
} | ||
return [2 /*return*/, bptReadNode(lastOffset)]; | ||
} | ||
for (i = 0; i < node.keys.length; i += 1) { | ||
if (node.keys[i].key === name) { | ||
return [2 /*return*/, __assign(__assign({}, node.keys[i]), { field: field })]; | ||
} | ||
} | ||
return [2 /*return*/, undefined]; | ||
} | ||
}); | ||
}); }; | ||
rootNodeOffset = 32; | ||
return [2 /*return*/, bptReadNode(offset + rootNodeOffset)]; | ||
} | ||
}); | ||
}); }); | ||
_a = filterUndef; | ||
return [4 /*yield*/, Promise.all(locs)]; | ||
case 3: return [2 /*return*/, _a.apply(void 0, [_b.sent()])]; | ||
} | ||
return _context6.abrupt("return", []); | ||
case 10: | ||
locs = indices.map( /*#__PURE__*/function () { | ||
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(index) { | ||
var offset, field, _yield$_this2$bbi$rea, data, p, _p$parse$result, blockSize, keySize, valSize, bpt, bptReadNode, rootNodeOffset; | ||
return _regenerator.default.wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
offset = index.offset, field = index.field; | ||
_context5.next = 3; | ||
return _this2.bbi.read(Buffer.alloc(32), 0, 32, offset, opts); | ||
case 3: | ||
_yield$_this2$bbi$rea = _context5.sent; | ||
data = _yield$_this2$bbi$rea.buffer; | ||
p = new _binaryParser.Parser().endianess(isBigEndian ? 'big' : 'little').int32('magic').int32('blockSize').int32('keySize').int32('valSize').uint64('itemCount'); | ||
_p$parse$result = p.parse(data).result, blockSize = _p$parse$result.blockSize, keySize = _p$parse$result.keySize, valSize = _p$parse$result.valSize; | ||
bpt = new _binaryParser.Parser().endianess(isBigEndian ? 'big' : 'little').int8('nodeType').skip(1).int16('cnt').choice({ | ||
tag: 'nodeType', | ||
choices: { | ||
0: new _binaryParser.Parser().array('leafkeys', { | ||
length: 'cnt', | ||
type: new _binaryParser.Parser().string('key', { | ||
length: keySize, | ||
stripNull: true | ||
}).uint64('offset') | ||
}), | ||
1: new _binaryParser.Parser().array('keys', { | ||
length: 'cnt', | ||
type: new _binaryParser.Parser().string('key', { | ||
length: keySize, | ||
stripNull: true | ||
}).uint64('offset').uint32('length').uint32('reserved') | ||
}) | ||
} | ||
}); | ||
bptReadNode = /*#__PURE__*/function () { | ||
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(nodeOffset) { | ||
var len, _yield$_this2$bbi$rea2, buffer, node, lastOffset, i, key, _i; | ||
return _regenerator.default.wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
len = 4 + blockSize * (keySize + valSize); | ||
_context4.next = 3; | ||
return _this2.bbi.read(Buffer.alloc(len), 0, len, nodeOffset, opts); | ||
case 3: | ||
_yield$_this2$bbi$rea2 = _context4.sent; | ||
buffer = _yield$_this2$bbi$rea2.buffer; | ||
node = bpt.parse(buffer).result; | ||
if (!node.leafkeys) { | ||
_context4.next = 17; | ||
break; | ||
} | ||
i = 0; | ||
case 8: | ||
if (!(i < node.leafkeys.length)) { | ||
_context4.next = 16; | ||
break; | ||
} | ||
key = node.leafkeys[i].key; | ||
if (!(name.localeCompare(key) < 0 && lastOffset)) { | ||
_context4.next = 12; | ||
break; | ||
} | ||
return _context4.abrupt("return", bptReadNode(lastOffset)); | ||
case 12: | ||
lastOffset = node.leafkeys[i].offset; | ||
case 13: | ||
i += 1; | ||
_context4.next = 8; | ||
break; | ||
case 16: | ||
return _context4.abrupt("return", bptReadNode(lastOffset)); | ||
case 17: | ||
_i = 0; | ||
case 18: | ||
if (!(_i < node.keys.length)) { | ||
_context4.next = 24; | ||
break; | ||
} | ||
if (!(node.keys[_i].key === name)) { | ||
_context4.next = 21; | ||
break; | ||
} | ||
return _context4.abrupt("return", _objectSpread(_objectSpread({}, node.keys[_i]), {}, { | ||
field: field | ||
})); | ||
case 21: | ||
_i += 1; | ||
_context4.next = 18; | ||
break; | ||
case 24: | ||
return _context4.abrupt("return", undefined); | ||
case 25: | ||
case "end": | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee4); | ||
})); | ||
return function bptReadNode(_x8) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}(); | ||
rootNodeOffset = 32; | ||
return _context5.abrupt("return", bptReadNode(offset + rootNodeOffset)); | ||
case 11: | ||
case "end": | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee5); | ||
})); | ||
return function (_x7) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}()); | ||
_context6.t0 = filterUndef; | ||
_context6.next = 14; | ||
return Promise.all(locs); | ||
case 14: | ||
_context6.t1 = _context6.sent; | ||
return _context6.abrupt("return", (0, _context6.t0)(_context6.t1)); | ||
case 16: | ||
case "end": | ||
return _context6.stop(); | ||
} | ||
} | ||
}, _callee6, this); | ||
})); | ||
function searchExtraIndexBlocks(_x6) { | ||
return _searchExtraIndexBlocks.apply(this, arguments); | ||
} | ||
return searchExtraIndexBlocks; | ||
}() | ||
}); | ||
}); | ||
}; | ||
/* | ||
@@ -432,78 +279,39 @@ * retrieve the features from the bigbed data that were found through the lookup of the extraIndex | ||
*/ | ||
}, { | ||
key: "searchExtraIndex", | ||
value: function () { | ||
var _searchExtraIndex = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(name) { | ||
var opts, | ||
blocks, | ||
view, | ||
res, | ||
ret, | ||
_args7 = arguments; | ||
return _regenerator.default.wrap(function _callee7$(_context7) { | ||
while (1) { | ||
switch (_context7.prev = _context7.next) { | ||
case 0: | ||
opts = _args7.length > 1 && _args7[1] !== undefined ? _args7[1] : {}; | ||
_context7.next = 3; | ||
return this.searchExtraIndexBlocks(name, opts); | ||
case 3: | ||
blocks = _context7.sent; | ||
if (blocks.length) { | ||
_context7.next = 6; | ||
break; | ||
BigBed.prototype.searchExtraIndex = function (name, opts) { | ||
if (opts === void 0) { opts = {}; } | ||
return __awaiter(this, void 0, void 0, function () { | ||
var blocks, view, res, ret; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, this.searchExtraIndexBlocks(name, opts)]; | ||
case 1: | ||
blocks = _a.sent(); | ||
if (!blocks.length) { | ||
return [2 /*return*/, []]; | ||
} | ||
return [4 /*yield*/, this.getUnzoomedView(opts)]; | ||
case 2: | ||
view = _a.sent(); | ||
res = blocks.map(function (block) { | ||
return new rxjs_1.Observable(function (observer) { | ||
view.readFeatures(observer, [block], opts); | ||
}).pipe((0, operators_1.reduce)(function (acc, curr) { return acc.concat(curr); }), (0, operators_1.map)(function (x) { | ||
for (var i = 0; i < x.length; i += 1) { | ||
x[i].field = block.field; | ||
} | ||
return x; | ||
})); | ||
}); | ||
return [4 /*yield*/, rxjs_1.merge.apply(void 0, res).toPromise()]; | ||
case 3: | ||
ret = _a.sent(); | ||
return [2 /*return*/, ret.filter(function (f) { | ||
return f.rest.split('\t')[f.field - 3] === name; | ||
})]; | ||
} | ||
return _context7.abrupt("return", []); | ||
case 6: | ||
_context7.next = 8; | ||
return this.getUnzoomedView(opts); | ||
case 8: | ||
view = _context7.sent; | ||
res = blocks.map(function (block) { | ||
return new _rxjs.Observable(function (observer) { | ||
view.readFeatures(observer, [block], opts); | ||
}).pipe((0, _operators.reduce)(function (acc, curr) { | ||
return acc.concat(curr); | ||
}), (0, _operators.map)(function (x) { | ||
for (var i = 0; i < x.length; i += 1) { | ||
x[i].field = block.field; // eslint-disable-line | ||
} | ||
return x; | ||
})); | ||
}); | ||
_context7.next = 12; | ||
return _rxjs.merge.apply(void 0, (0, _toConsumableArray2.default)(res)).toPromise(); | ||
case 12: | ||
ret = _context7.sent; | ||
return _context7.abrupt("return", ret.filter(function (f) { | ||
return f.rest.split('\t')[f.field - 3] === name; | ||
})); | ||
case 14: | ||
case "end": | ||
return _context7.stop(); | ||
} | ||
} | ||
}, _callee7, this); | ||
})); | ||
function searchExtraIndex(_x9) { | ||
return _searchExtraIndex.apply(this, arguments); | ||
} | ||
return searchExtraIndex; | ||
}() | ||
}]); | ||
return BigBed; | ||
}(_bbi.BBI); | ||
}); | ||
}); | ||
}; | ||
return BigBed; | ||
}(bbi_1.BBI)); | ||
exports.BigBed = BigBed; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iaWdiZWQudHMiXSwibmFtZXMiOlsiZmlsdGVyVW5kZWYiLCJ0cyIsImZpbHRlciIsInQiLCJCaWdCZWQiLCJvcHRzIiwiQWJvcnRhYmxlUHJvbWlzZUNhY2hlIiwiY2FjaGUiLCJRdWlja0xSVSIsIm1heFNpemUiLCJmaWxsIiwiYXJncyIsInNpZ25hbCIsIl9yZWFkSW5kaWNlcyIsIm9wdGlvbnMiLCJyZWFkSW5kaWNlc0NhY2hlIiwiZ2V0IiwiSlNPTiIsInN0cmluZ2lmeSIsInNjYWxlIiwiZ2V0VW56b29tZWRWaWV3IiwiZ2V0SGVhZGVyIiwiZXh0SGVhZGVyT2Zmc2V0IiwiaXNCaWdFbmRpYW4iLCJiYmkiLCJyZWFkIiwiQnVmZmVyIiwiYWxsb2MiLCJkYXRhIiwiYnVmZmVyIiwibGUiLCJyZXQiLCJQYXJzZXIiLCJlbmRpYW5lc3MiLCJ1aW50MTYiLCJ1aW50NjQiLCJwYXJzZSIsInJlc3VsdCIsImNvdW50Iiwib2Zmc2V0IiwiYmxvY2tsZW4iLCJsZW4iLCJleHRQYXJzZXIiLCJpbnQxNiIsInNraXAiLCJpbmRpY2VzIiwiaSIsInB1c2giLCJzbGljZSIsIm5hbWUiLCJyZWFkSW5kaWNlcyIsImxlbmd0aCIsImxvY3MiLCJtYXAiLCJpbmRleCIsImZpZWxkIiwicCIsImludDMyIiwiYmxvY2tTaXplIiwia2V5U2l6ZSIsInZhbFNpemUiLCJicHQiLCJpbnQ4IiwiY2hvaWNlIiwidGFnIiwiY2hvaWNlcyIsImFycmF5IiwidHlwZSIsInN0cmluZyIsInN0cmlwTnVsbCIsInVpbnQzMiIsImJwdFJlYWROb2RlIiwibm9kZU9mZnNldCIsIm5vZGUiLCJsZWFma2V5cyIsImtleSIsImxvY2FsZUNvbXBhcmUiLCJsYXN0T2Zmc2V0Iiwia2V5cyIsInVuZGVmaW5lZCIsInJvb3ROb2RlT2Zmc2V0IiwiUHJvbWlzZSIsImFsbCIsInNlYXJjaEV4dHJhSW5kZXhCbG9ja3MiLCJibG9ja3MiLCJ2aWV3IiwicmVzIiwiYmxvY2siLCJPYnNlcnZhYmxlIiwib2JzZXJ2ZXIiLCJyZWFkRmVhdHVyZXMiLCJwaXBlIiwiYWNjIiwiY3VyciIsImNvbmNhdCIsIngiLCJtZXJnZSIsInRvUHJvbWlzZSIsImYiLCJyZXN0Iiwic3BsaXQiLCJCQkkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7O0FBaUJPLFNBQVNBLFdBQVQsQ0FBd0JDLEVBQXhCLEVBQW9EO0FBQ3pELFNBQU9BLEVBQUUsQ0FBQ0MsTUFBSCxDQUFVLFVBQUNDLENBQUQ7QUFBQSxXQUE4QixDQUFDLENBQUNBLENBQWhDO0FBQUEsR0FBVixDQUFQO0FBQ0Q7O0lBRVlDLE07Ozs7O0FBUVgsa0JBQW1CQyxJQUFuQixFQUE4QjtBQUFBOztBQUFBO0FBQzVCLDhCQUFNQSxJQUFOO0FBRDRCLG1HQVBKLElBQUlDLDhCQUFKLENBQTBCO0FBQ2xEQyxNQUFBQSxLQUFLLEVBQUUsSUFBSUMsaUJBQUosQ0FBYTtBQUFFQyxRQUFBQSxPQUFPLEVBQUU7QUFBWCxPQUFiLENBRDJDO0FBRWxEQyxNQUFBQSxJQUFJO0FBQUEsNEZBQUUsaUJBQU9DLElBQVAsRUFBa0JDLE1BQWxCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtREFDRyxNQUFLQyxZQUFMLGlDQUF1QkYsSUFBdkI7QUFBNkJDLG9CQUFBQSxNQUFNLEVBQU5BO0FBQTdCLHFCQURIOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQUY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFGOEMsS0FBMUIsQ0FPSTtBQUFBO0FBRTdCOzs7O2tDQUUyRDtBQUFBLFVBQXpDUCxJQUF5Qyx1RUFBSixFQUFJO0FBQzFELFVBQU1TLE9BQU8sR0FBRyxhQUFhVCxJQUFiLEdBQW9CO0FBQUVPLFFBQUFBLE1BQU0sRUFBRVA7QUFBVixPQUFwQixHQUF1Q0EsSUFBdkQ7QUFDQSxhQUFPLEtBQUtVLGdCQUFMLENBQXNCQyxHQUF0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QU9BLENBQUMsQ0FBQ0MsSUFBRixDQUFPQyxLQUFQLENBQWEsSUFBYixFQUFtQkYsQ0FBQyxDQUFDM0MsS0FBRixHQUFVLENBQTdCLE1BQW9DTixJQUEzQztBQUNELGlCQUZNLEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQS9LaUJvRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnQGdtb2QvYmluYXJ5LXBhcnNlcidcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAsIHJlZHVjZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IEFib3J0YWJsZVByb21pc2VDYWNoZSBmcm9tICdhYm9ydGFibGUtcHJvbWlzZS1jYWNoZSdcbmltcG9ydCBRdWlja0xSVSBmcm9tICdxdWljay1scnUnXG5cbmltcG9ydCB7IEJCSSwgRmVhdHVyZSwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2JiaSdcbmltcG9ydCB7IEJsb2NrVmlldyB9IGZyb20gJy4vYmxvY2tWaWV3J1xuXG5pbnRlcmZhY2UgTG9jIHtcbiAga2V5OiBzdHJpbmdcbiAgb2Zmc2V0OiBudW1iZXJcbiAgbGVuZ3RoOiBudW1iZXJcbiAgZmllbGQ/OiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIEluZGV4IHtcbiAgdHlwZTogbnVtYmVyXG4gIGZpZWxkY291bnQ6IG51bWJlclxuICBvZmZzZXQ6IG51bWJlclxuICBmaWVsZDogbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJVbmRlZjxUPih0czogKFQgfCB1bmRlZmluZWQpW10pOiBUW10ge1xuICByZXR1cm4gdHMuZmlsdGVyKCh0OiBUIHwgdW5kZWZpbmVkKTogdCBpcyBUID0+ICEhdClcbn1cblxuZXhwb3J0IGNsYXNzIEJpZ0JlZCBleHRlbmRzIEJCSSB7XG4gIHB1YmxpYyByZWFkSW5kaWNlc0NhY2hlID0gbmV3IEFib3J0YWJsZVByb21pc2VDYWNoZSh7XG4gICAgY2FjaGU6IG5ldyBRdWlja0xSVSh7IG1heFNpemU6IDEgfSksXG4gICAgZmlsbDogYXN5bmMgKGFyZ3M6IGFueSwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkSW5kaWNlcyh7IC4uLmFyZ3MsIHNpZ25hbCB9KVxuICAgIH0sXG4gIH0pXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdHM6IGFueSkge1xuICAgIHN1cGVyKG9wdHMpXG4gIH1cblxuICBwdWJsaWMgcmVhZEluZGljZXMob3B0czogQWJvcnRTaWduYWwgfCBSZXF1ZXN0T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICdhYm9ydGVkJyBpbiBvcHRzID8geyBzaWduYWw6IG9wdHMgfSA6IG9wdHNcbiAgICByZXR1cm4gdGhpcy5yZWFkSW5kaWNlc0NhY2hlLmdldChKU09OLnN0cmluZ2lmeShvcHRpb25zKSwgb3B0aW9ucywgb3B0aW9ucy5zaWduYWwpXG4gIH1cblxuICAvKlxuICAgKiByZXRyaWV2ZSB1bnpvb21lZCB2aWV3IGZvciBhbnkgc2NhbGVcbiAgICogQHBhcmFtIHNjYWxlIC0gdW51c2VkXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIGFuIG9wdGlvbmFsIEFib3J0U2lnbmFsIHRvIGtpbGwgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gcHJvbWlzZSBmb3IgYSBCbG9ja1ZpZXdcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRWaWV3KHNjYWxlOiBudW1iZXIsIG9wdHM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxCbG9ja1ZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRVbnpvb21lZFZpZXcob3B0cylcbiAgfVxuXG4gIC8qXG4gICAqIHBhcnNlIHRoZSBiaWdiZWQgZXh0cmFJbmRleCBmaWVsZHNcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIHRvIGFib3J0IG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIGEgUHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgSW5kZXggZGF0YSBzdHJ1Y3R1cmUgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGV4dHJhSW5kZXhlcyBpbiBhIGJpZ2JlZCwgc2VlIGJlZFRvQmlnQmVkIGRvY3VtZW50YXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3JlYWRJbmRpY2VzKG9wdHM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxJbmRleFtdPiB7XG4gICAgY29uc3QgeyBleHRIZWFkZXJPZmZzZXQsIGlzQmlnRW5kaWFuIH0gPSBhd2FpdCB0aGlzLmdldEhlYWRlcihvcHRzKVxuICAgIGNvbnN0IHsgYnVmZmVyOiBkYXRhIH0gPSBhd2FpdCB0aGlzLmJiaS5yZWFkKEJ1ZmZlci5hbGxvYyg2NCksIDAsIDY0LCBleHRIZWFkZXJPZmZzZXQpXG4gICAgY29uc3QgbGUgPSBpc0JpZ0VuZGlhbiA/ICdiaWcnIDogJ2xpdHRsZSdcbiAgICBjb25zdCByZXQgPSBuZXcgUGFyc2VyKClcbiAgICAgIC5lbmRpYW5lc3MobGUpXG4gICAgICAudWludDE2KCdzaXplJylcbiAgICAgIC51aW50MTYoJ2NvdW50JylcbiAgICAgIC51aW50NjQoJ29mZnNldCcpXG4gICAgICAucGFyc2UoZGF0YSkucmVzdWx0XG4gICAgY29uc3QgeyBjb3VudCwgb2Zmc2V0IH0gPSByZXRcblxuICAgIC8vIG5vIGV4dHJhIGluZGV4IGlzIGRlZmluZWQgaWYgY291bnQ9PTBcbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IGJsb2NrbGVuID0gMjBcbiAgICBjb25zdCBsZW4gPSBibG9ja2xlbiAqIGNvdW50XG4gICAgY29uc3QgeyBidWZmZXIgfSA9IGF3YWl0IHRoaXMuYmJpLnJlYWQoQnVmZmVyLmFsbG9jKGxlbiksIDAsIGxlbiwgb2Zmc2V0KVxuICAgIGNvbnN0IGV4dFBhcnNlciA9IG5ldyBQYXJzZXIoKVxuICAgICAgLmVuZGlhbmVzcyhsZSlcbiAgICAgIC5pbnQxNigndHlwZScpXG4gICAgICAuaW50MTYoJ2ZpZWxkY291bnQnKVxuICAgICAgLnVpbnQ2NCgnb2Zmc2V0JylcbiAgICAgIC5za2lwKDQpXG4gICAgICAuaW50MTYoJ2ZpZWxkJylcbiAgICBjb25zdCBpbmRpY2VzID0gW11cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMSkge1xuICAgICAgaW5kaWNlcy5wdXNoKGV4dFBhcnNlci5wYXJzZShidWZmZXIuc2xpY2UoaSAqIGJsb2NrbGVuKSkucmVzdWx0KVxuICAgIH1cbiAgICByZXR1cm4gaW5kaWNlc1xuICB9XG5cbiAgLypcbiAgICogcGVyZm9ybSBhIHNlYXJjaCBpbiB0aGUgYmlnYmVkIGV4dHJhSW5kZXggdG8gZmluZCB3aGljaCBibG9ja3MgaW4gdGhlIGJpZ2JlZCBkYXRhIHRvIGxvb2sgZm9yIHRoZVxuICAgKiBhY3R1YWwgZmVhdHVyZSBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcGFyYW0gb3B0cyAtIGEgU2VhcmNoT3B0aW9ucyBhcmd1bWVudCB3aXRoIG9wdGlvbmFsIHNpZ25hbFxuICAgKiBAcmV0dXJuIGEgUHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgYmlnYmVkIGJsb2NrIExvYyBlbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlYXJjaEV4dHJhSW5kZXhCbG9ja3MobmFtZTogc3RyaW5nLCBvcHRzOiBSZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxMb2NbXT4ge1xuICAgIGNvbnN0IHsgaXNCaWdFbmRpYW4gfSA9IGF3YWl0IHRoaXMuZ2V0SGVhZGVyKG9wdHMpXG4gICAgY29uc3QgaW5kaWNlcyA9IGF3YWl0IHRoaXMucmVhZEluZGljZXMob3B0cylcbiAgICBpZiAoIWluZGljZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgY29uc3QgbG9jcyA9IGluZGljZXMubWFwKFxuICAgICAgYXN5bmMgKGluZGV4OiBhbnkpOiBQcm9taXNlPExvYyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCB7IG9mZnNldCwgZmllbGQgfSA9IGluZGV4XG4gICAgICAgIGNvbnN0IHsgYnVmZmVyOiBkYXRhIH0gPSBhd2FpdCB0aGlzLmJiaS5yZWFkKEJ1ZmZlci5hbGxvYygzMiksIDAsIDMyLCBvZmZzZXQsIG9wdHMpXG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUGFyc2VyKClcbiAgICAgICAgICAuZW5kaWFuZXNzKGlzQmlnRW5kaWFuID8gJ2JpZycgOiAnbGl0dGxlJylcbiAgICAgICAgICAuaW50MzIoJ21hZ2ljJylcbiAgICAgICAgICAuaW50MzIoJ2Jsb2NrU2l6ZScpXG4gICAgICAgICAgLmludDMyKCdrZXlTaXplJylcbiAgICAgICAgICAuaW50MzIoJ3ZhbFNpemUnKVxuICAgICAgICAgIC51aW50NjQoJ2l0ZW1Db3VudCcpXG5cbiAgICAgICAgY29uc3QgeyBibG9ja1NpemUsIGtleVNpemUsIHZhbFNpemUgfSA9IHAucGFyc2UoZGF0YSkucmVzdWx0XG4gICAgICAgIGNvbnN0IGJwdCA9IG5ldyBQYXJzZXIoKVxuICAgICAgICAgIC5lbmRpYW5lc3MoaXNCaWdFbmRpYW4gPyAnYmlnJyA6ICdsaXR0bGUnKVxuICAgICAgICAgIC5pbnQ4KCdub2RlVHlwZScpXG4gICAgICAgICAgLnNraXAoMSlcbiAgICAgICAgICAuaW50MTYoJ2NudCcpXG4gICAgICAgICAgLmNob2ljZSh7XG4gICAgICAgICAgICB0YWc6ICdub2RlVHlwZScsXG4gICAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAgIDA6IG5ldyBQYXJzZXIoKS5hcnJheSgnbGVhZmtleXMnLCB7XG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAnY250JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBuZXcgUGFyc2VyKClcbiAgICAgICAgICAgICAgICAgIC5zdHJpbmcoJ2tleScsIHsgbGVuZ3RoOiBrZXlTaXplLCBzdHJpcE51bGw6IHRydWUgfSlcbiAgICAgICAgICAgICAgICAgIC51aW50NjQoJ29mZnNldCcpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgMTogbmV3IFBhcnNlcigpLmFycmF5KCdrZXlzJywge1xuICAgICAgICAgICAgICAgIGxlbmd0aDogJ2NudCcsXG4gICAgICAgICAgICAgICAgdHlwZTogbmV3IFBhcnNlcigpXG4gICAgICAgICAgICAgICAgICAuc3RyaW5nKCdrZXknLCB7IGxlbmd0aDoga2V5U2l6ZSwgc3RyaXBOdWxsOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAudWludDY0KCdvZmZzZXQnKVxuICAgICAgICAgICAgICAgICAgLnVpbnQzMignbGVuZ3RoJylcbiAgICAgICAgICAgICAgICAgIC51aW50MzIoJ3Jlc2VydmVkJyksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGJwdFJlYWROb2RlID0gYXN5bmMgKG5vZGVPZmZzZXQ6IG51bWJlcik6IFByb21pc2U8TG9jIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgICAgY29uc3QgbGVuID0gNCArIGJsb2NrU2l6ZSAqIChrZXlTaXplICsgdmFsU2l6ZSlcbiAgICAgICAgICBjb25zdCB7IGJ1ZmZlciB9ID0gYXdhaXQgdGhpcy5iYmkucmVhZChCdWZmZXIuYWxsb2MobGVuKSwgMCwgbGVuLCBub2RlT2Zmc2V0LCBvcHRzKVxuICAgICAgICAgIGNvbnN0IG5vZGUgPSBicHQucGFyc2UoYnVmZmVyKS5yZXN1bHRcbiAgICAgICAgICBpZiAobm9kZS5sZWFma2V5cykge1xuICAgICAgICAgICAgbGV0IGxhc3RPZmZzZXRcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5sZWFma2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICBjb25zdCB7IGtleSB9ID0gbm9kZS5sZWFma2V5c1tpXVxuICAgICAgICAgICAgICBpZiAobmFtZS5sb2NhbGVDb21wYXJlKGtleSkgPCAwICYmIGxhc3RPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnB0UmVhZE5vZGUobGFzdE9mZnNldClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gbm9kZS5sZWFma2V5c1tpXS5vZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBicHRSZWFkTm9kZShsYXN0T2Zmc2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUua2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUua2V5c1tpXS5rZXkgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ubm9kZS5rZXlzW2ldLCBmaWVsZCB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvb3ROb2RlT2Zmc2V0ID0gMzJcbiAgICAgICAgcmV0dXJuIGJwdFJlYWROb2RlKG9mZnNldCArIHJvb3ROb2RlT2Zmc2V0KVxuICAgICAgfSxcbiAgICApXG4gICAgcmV0dXJuIGZpbHRlclVuZGVmKGF3YWl0IFByb21pc2UuYWxsKGxvY3MpKVxuICB9XG5cbiAgLypcbiAgICogcmV0cmlldmUgdGhlIGZlYXR1cmVzIGZyb20gdGhlIGJpZ2JlZCBkYXRhIHRoYXQgd2VyZSBmb3VuZCB0aHJvdWdoIHRoZSBsb29rdXAgb2YgdGhlIGV4dHJhSW5kZXhcbiAgICogbm90ZSB0aGF0IHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBleHRyYUluZGV4LCBzZWUgdGhlIEJpZ0JlZCBzcGVjaWZpY2F0aW9uIGFuZCB0aGUgLWV4dHJhSW5kZXggYXJndW1lbnQgdG8gYmVkVG9CaWdCZWRcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEBwYXJhbSBvcHRzIC0gYSBTZWFyY2hPcHRpb25zIGFyZ3VtZW50IHdpdGggb3B0aW9uYWwgc2lnbmFsXG4gICAqIEByZXR1cm4gYSBQcm9taXNlIGZvciBhbiBhcnJheSBvZiBGZWF0dXJlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VhcmNoRXh0cmFJbmRleChuYW1lOiBzdHJpbmcsIG9wdHM6IFJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPEZlYXR1cmVbXT4ge1xuICAgIGNvbnN0IGJsb2NrcyA9IGF3YWl0IHRoaXMuc2VhcmNoRXh0cmFJbmRleEJsb2NrcyhuYW1lLCBvcHRzKVxuICAgIGlmICghYmxvY2tzLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgY29uc3QgdmlldyA9IGF3YWl0IHRoaXMuZ2V0VW56b29tZWRWaWV3KG9wdHMpXG4gICAgY29uc3QgcmVzID0gYmxvY2tzLm1hcChibG9jayA9PiB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxGZWF0dXJlW10+KSA9PiB7XG4gICAgICAgIHZpZXcucmVhZEZlYXR1cmVzKG9ic2VydmVyLCBbYmxvY2tdLCBvcHRzKVxuICAgICAgfSkucGlwZShcbiAgICAgICAgcmVkdWNlKChhY2MsIGN1cnIpID0+IGFjYy5jb25jYXQoY3VycikpLFxuICAgICAgICBtYXAoeCA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgeFtpXS5maWVsZCA9IGJsb2NrLmZpZWxkIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHhcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSlcbiAgICBjb25zdCByZXQgPSBhd2FpdCBtZXJnZSguLi5yZXMpLnRvUHJvbWlzZSgpXG4gICAgcmV0dXJuIHJldC5maWx0ZXIoKGY6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGYucmVzdC5zcGxpdCgnXFx0JylbZi5maWVsZCAtIDNdID09PSBuYW1lXG4gICAgfSlcbiAgfVxufVxuIl19 |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
var __extends = (this && this.__extends) || (function () { | ||
var extendStatics = function (d, b) { | ||
extendStatics = Object.setPrototypeOf || | ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || | ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; | ||
return extendStatics(d, b); | ||
}; | ||
return function (d, b) { | ||
if (typeof b !== "function" && b !== null) | ||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); | ||
extendStatics(d, b); | ||
function __() { this.constructor = d; } | ||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | ||
}; | ||
})(); | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.BigWig = void 0; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); | ||
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); | ||
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); | ||
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); | ||
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); | ||
var _blockView = require("./blockView"); | ||
var _bbi = require("./bbi"); | ||
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } | ||
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } | ||
var BigWig = /*#__PURE__*/function (_BBI) { | ||
(0, _inherits2.default)(BigWig, _BBI); | ||
var _super = _createSuper(BigWig); | ||
function BigWig() { | ||
(0, _classCallCheck2.default)(this, BigWig); | ||
return _super.apply(this, arguments); | ||
} | ||
(0, _createClass2.default)(BigWig, [{ | ||
key: "getView", | ||
var blockView_1 = require("./blockView"); | ||
var bbi_1 = require("./bbi"); | ||
var BigWig = /** @class */ (function (_super) { | ||
__extends(BigWig, _super); | ||
function BigWig() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
} | ||
/** | ||
@@ -53,73 +70,32 @@ * Retrieves a BlockView of a specific zoomLevel | ||
*/ | ||
value: function () { | ||
var _getView = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(scale, opts) { | ||
var _yield$this$getHeader, zoomLevels, refsByName, fileSize, isBigEndian, uncompressBufSize, basesPerPx, maxLevel, i, zh, indexLength; | ||
return _regenerator.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.next = 2; | ||
return this.getHeader(opts); | ||
case 2: | ||
_yield$this$getHeader = _context.sent; | ||
zoomLevels = _yield$this$getHeader.zoomLevels; | ||
refsByName = _yield$this$getHeader.refsByName; | ||
fileSize = _yield$this$getHeader.fileSize; | ||
isBigEndian = _yield$this$getHeader.isBigEndian; | ||
uncompressBufSize = _yield$this$getHeader.uncompressBufSize; | ||
basesPerPx = 1 / scale; | ||
maxLevel = zoomLevels.length; | ||
if (!fileSize) { | ||
// if we don't know the file size, we can't fetch the highest zoom level :-( | ||
maxLevel -= 1; | ||
BigWig.prototype.getView = function (scale, opts) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var _a, zoomLevels, refsByName, fileSize, isBigEndian, uncompressBufSize, basesPerPx, maxLevel, i, zh, indexLength; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: return [4 /*yield*/, this.getHeader(opts)]; | ||
case 1: | ||
_a = _b.sent(), zoomLevels = _a.zoomLevels, refsByName = _a.refsByName, fileSize = _a.fileSize, isBigEndian = _a.isBigEndian, uncompressBufSize = _a.uncompressBufSize; | ||
basesPerPx = 1 / scale; | ||
maxLevel = zoomLevels.length; | ||
if (!fileSize) { | ||
// if we don't know the file size, we can't fetch the highest zoom level :-( | ||
maxLevel -= 1; | ||
} | ||
for (i = maxLevel; i >= 0; i -= 1) { | ||
zh = zoomLevels[i]; | ||
if (zh && zh.reductionLevel <= 2 * basesPerPx) { | ||
indexLength = i < zoomLevels.length - 1 | ||
? zoomLevels[i + 1].dataOffset - zh.indexOffset | ||
: fileSize - 4 - zh.indexOffset; | ||
return [2 /*return*/, new blockView_1.BlockView(this.bbi, refsByName, zh.indexOffset, indexLength, isBigEndian, uncompressBufSize > 0, 'summary')]; | ||
} | ||
} | ||
return [2 /*return*/, this.getUnzoomedView(opts)]; | ||
} | ||
i = maxLevel; | ||
case 12: | ||
if (!(i >= 0)) { | ||
_context.next = 20; | ||
break; | ||
} | ||
zh = zoomLevels[i]; | ||
if (!(zh && zh.reductionLevel <= 2 * basesPerPx)) { | ||
_context.next = 17; | ||
break; | ||
} | ||
indexLength = i < zoomLevels.length - 1 ? zoomLevels[i + 1].dataOffset - zh.indexOffset : fileSize - 4 - zh.indexOffset; | ||
return _context.abrupt("return", new _blockView.BlockView(this.bbi, refsByName, zh.indexOffset, indexLength, isBigEndian, uncompressBufSize > 0, 'summary')); | ||
case 17: | ||
i -= 1; | ||
_context.next = 12; | ||
break; | ||
case 20: | ||
return _context.abrupt("return", this.getUnzoomedView(opts)); | ||
case 21: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, this); | ||
})); | ||
function getView(_x, _x2) { | ||
return _getView.apply(this, arguments); | ||
} | ||
return getView; | ||
}() | ||
}]); | ||
return BigWig; | ||
}(_bbi.BBI); | ||
}); | ||
}); | ||
}; | ||
return BigWig; | ||
}(bbi_1.BBI)); | ||
exports.BigWig = BigWig; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iaWd3aWcudHMiXSwibmFtZXMiOlsiQmlnV2lnIiwic2NhbGUiLCJvcHRzIiwiZ2V0SGVhZGVyIiwiem9vbUxldmVscyIsInJlZnNCeU5hbWUiLCJmaWxlU2l6ZSIsImlzQmlnRW5kaWFuIiwidW5jb21wcmVzc0J1ZlNpemUiLCJiYXNlc1BlclB4IiwibWF4TGV2ZWwiLCJsZW5ndGgiLCJpIiwiemgiLCJyZWR1Y3Rpb25MZXZlbCIsImluZGV4TGVuZ3RoIiwiZGF0YU9mZnNldCIsImluZGV4T2Zmc2V0IiwiQmxvY2tWaWV3IiwiYmJpIiwiZ2V0VW56b29tZWRWaWV3IiwiQkJJIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7SUFFYUEsTTs7Ozs7Ozs7Ozs7OztBQUNYOzs7Ozs7Ozs7OEdBUXdCQyxLLEVBQWVDLEk7Ozs7Ozs7O3VCQU8zQixLQUFLQyxTQUFMLENBQWVELElBQWYsQzs7OztBQUxSRSxnQkFBQUEsVSx5QkFBQUEsVTtBQUNBQyxnQkFBQUEsVSx5QkFBQUEsVTtBQUNBQyxnQkFBQUEsUSx5QkFBQUEsUTtBQUNBQyxnQkFBQUEsVyx5QkFBQUEsVztBQUNBQyxnQkFBQUEsaUIseUJBQUFBLGlCO0FBRUlDLGdCQUFBQSxVLEdBQWEsSUFBSVIsSztBQUNuQlMsZ0JBQUFBLFEsR0FBV04sVUFBVSxDQUFDTyxNOztBQUMxQixvQkFBSSxDQUFDTCxRQUFMLEVBQWU7QUFDYjtBQUNBSSxrQkFBQUEsUUFBUSxJQUFJLENBQVo7QUFDRDs7QUFFUUUsZ0JBQUFBLEMsR0FBSUYsUTs7O3NCQUFVRSxDQUFDLElBQUksQzs7Ozs7QUFDcEJDLGdCQUFBQSxFLEdBQUtULFVBQVUsQ0FBQ1EsQ0FBRCxDOztzQkFDakJDLEVBQUUsSUFBSUEsRUFBRSxDQUFDQyxjQUFILElBQXFCLElBQUlMLFU7Ozs7O0FBQzNCTSxnQkFBQUEsVyxHQUNKSCxDQUFDLEdBQUdSLFVBQVUsQ0FBQ08sTUFBWCxHQUFvQixDQUF4QixHQUNJUCxVQUFVLENBQUNRLENBQUMsR0FBRyxDQUFMLENBQVYsQ0FBa0JJLFVBQWxCLEdBQStCSCxFQUFFLENBQUNJLFdBRHRDLEdBRUlYLFFBQVEsR0FBRyxDQUFYLEdBQWVPLEVBQUUsQ0FBQ0ksVztpREFDakIsSUFBSUMsb0JBQUosQ0FDTCxLQUFLQyxHQURBLEVBRUxkLFVBRkssRUFHTFEsRUFBRSxDQUFDSSxXQUhFLEVBSUxGLFdBSkssRUFLTFIsV0FMSyxFQU1MQyxpQkFBaUIsR0FBRyxDQU5mLEVBT0wsU0FQSyxDOzs7QUFQb0JJLGdCQUFBQSxDQUFDLElBQUksQzs7Ozs7aURBa0I3QixLQUFLUSxlQUFMLENBQXFCbEIsSUFBckIsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMUNpQm1CLFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja1ZpZXcgfSBmcm9tICcuL2Jsb2NrVmlldydcbmltcG9ydCB7IEJCSSwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2JiaSdcblxuZXhwb3J0IGNsYXNzIEJpZ1dpZyBleHRlbmRzIEJCSSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBCbG9ja1ZpZXcgb2YgYSBzcGVjaWZpYyB6b29tTGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHJlZk5hbWUgLSBUaGUgY2hyb21vc29tZSBuYW1lXG4gICAqIEBwYXJhbSBzdGFydCAtIFRoZSBzdGFydCBvZiBhIHJlZ2lvblxuICAgKiBAcGFyYW0gZW5kIC0gVGhlIGVuZCBvZiBhIHJlZ2lvblxuICAgKiBAcGFyYW0gb3B0cyAtIEFuIG9iamVjdCBjb250YWluaW5nIGJhc2VzUGVyU3BhbiAoZS5nLiBwaXhlbHMgcGVyIGJhc2VwYWlyKSBvciBzY2FsZSB1c2VkIHRvIGluZmVyIHRoZSB6b29tTGV2ZWwgdG8gdXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VmlldyhzY2FsZTogbnVtYmVyLCBvcHRzOiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8QmxvY2tWaWV3PiB7XG4gICAgY29uc3Qge1xuICAgICAgem9vbUxldmVscyxcbiAgICAgIHJlZnNCeU5hbWUsXG4gICAgICBmaWxlU2l6ZSxcbiAgICAgIGlzQmlnRW5kaWFuLFxuICAgICAgdW5jb21wcmVzc0J1ZlNpemUsXG4gICAgfSA9IGF3YWl0IHRoaXMuZ2V0SGVhZGVyKG9wdHMpXG4gICAgY29uc3QgYmFzZXNQZXJQeCA9IDEgLyBzY2FsZVxuICAgIGxldCBtYXhMZXZlbCA9IHpvb21MZXZlbHMubGVuZ3RoXG4gICAgaWYgKCFmaWxlU2l6ZSkge1xuICAgICAgLy8gaWYgd2UgZG9uJ3Qga25vdyB0aGUgZmlsZSBzaXplLCB3ZSBjYW4ndCBmZXRjaCB0aGUgaGlnaGVzdCB6b29tIGxldmVsIDotKFxuICAgICAgbWF4TGV2ZWwgLT0gMVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBtYXhMZXZlbDsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IHpoID0gem9vbUxldmVsc1tpXVxuICAgICAgaWYgKHpoICYmIHpoLnJlZHVjdGlvbkxldmVsIDw9IDIgKiBiYXNlc1BlclB4KSB7XG4gICAgICAgIGNvbnN0IGluZGV4TGVuZ3RoID1cbiAgICAgICAgICBpIDwgem9vbUxldmVscy5sZW5ndGggLSAxXG4gICAgICAgICAgICA/IHpvb21MZXZlbHNbaSArIDFdLmRhdGFPZmZzZXQgLSB6aC5pbmRleE9mZnNldFxuICAgICAgICAgICAgOiBmaWxlU2l6ZSAtIDQgLSB6aC5pbmRleE9mZnNldFxuICAgICAgICByZXR1cm4gbmV3IEJsb2NrVmlldyhcbiAgICAgICAgICB0aGlzLmJiaSxcbiAgICAgICAgICByZWZzQnlOYW1lLFxuICAgICAgICAgIHpoLmluZGV4T2Zmc2V0LFxuICAgICAgICAgIGluZGV4TGVuZ3RoLFxuICAgICAgICAgIGlzQmlnRW5kaWFuLFxuICAgICAgICAgIHVuY29tcHJlc3NCdWZTaXplID4gMCxcbiAgICAgICAgICAnc3VtbWFyeScsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0VW56b29tZWRWaWV3KG9wdHMpXG4gIH1cbn1cbiJdfQ== |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
var __assign = (this && this.__assign) || function () { | ||
__assign = Object.assign || function(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) | ||
t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
return __assign.apply(this, arguments); | ||
}; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.BlockView = void 0; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); | ||
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
var _binaryParser = require("@gmod/binary-parser"); | ||
var _abortablePromiseCache = _interopRequireDefault(require("abortable-promise-cache")); | ||
var _zlib = _interopRequireDefault(require("zlib")); | ||
var _quickLru = _interopRequireDefault(require("quick-lru")); | ||
var _range = _interopRequireDefault(require("./range")); | ||
var _util = require("./util"); | ||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } | ||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } | ||
var binary_parser_1 = require("@gmod/binary-parser"); | ||
var abortable_promise_cache_1 = __importDefault(require("abortable-promise-cache")); | ||
var zlib_1 = __importDefault(require("zlib")); | ||
var quick_lru_1 = __importDefault(require("quick-lru")); | ||
var range_1 = __importDefault(require("./range")); | ||
var util_1 = require("./util"); | ||
var BIG_WIG_TYPE_GRAPH = 1; | ||
var BIG_WIG_TYPE_VSTEP = 2; | ||
var BIG_WIG_TYPE_FSTEP = 3; | ||
function getParsers(isBigEndian) { | ||
var _choices; | ||
var le = isBigEndian ? 'big' : 'little'; | ||
var summaryParser = new _binaryParser.Parser().endianess(le).uint32('chromId').uint32('start').uint32('end').uint32('validCnt').float('minScore').float('maxScore').float('sumData').float('sumSqData'); | ||
var leafParser = new _binaryParser.Parser().endianess(le).uint8('isLeaf').skip(1).uint16('cnt').choice({ | ||
tag: 'isLeaf', | ||
choices: { | ||
1: new _binaryParser.Parser().array('blocksToFetch', { | ||
length: 'cnt', | ||
type: new _binaryParser.Parser().uint32('startChrom').uint32('startBase').uint32('endChrom').uint32('endBase').uint64('blockOffset').uint64('blockSize') | ||
}), | ||
0: new _binaryParser.Parser().array('recurOffsets', { | ||
length: 'cnt', | ||
type: new _binaryParser.Parser().uint32('startChrom').uint32('startBase').uint32('endChrom').uint32('endBase').uint64('blockOffset') | ||
}) | ||
} | ||
}); | ||
var bigBedParser = new _binaryParser.Parser().endianess(le).uint32('chromId').int32('start').int32('end').string('rest', { | ||
zeroTerminated: true | ||
}); | ||
var bigWigParser = new _binaryParser.Parser().endianess(le).skip(4).int32('blockStart').skip(4).uint32('itemStep').uint32('itemSpan').uint8('blockType').skip(1).uint16('itemCount').choice({ | ||
tag: 'blockType', | ||
choices: (_choices = {}, (0, _defineProperty2.default)(_choices, BIG_WIG_TYPE_FSTEP, new _binaryParser.Parser().array('items', { | ||
length: 'itemCount', | ||
type: new _binaryParser.Parser().float('score') | ||
})), (0, _defineProperty2.default)(_choices, BIG_WIG_TYPE_VSTEP, new _binaryParser.Parser().array('items', { | ||
length: 'itemCount', | ||
type: new _binaryParser.Parser().int32('start').float('score') | ||
})), (0, _defineProperty2.default)(_choices, BIG_WIG_TYPE_GRAPH, new _binaryParser.Parser().array('items', { | ||
length: 'itemCount', | ||
type: new _binaryParser.Parser().int32('start').int32('end').float('score') | ||
})), _choices) | ||
}); | ||
return { | ||
bigWigParser: bigWigParser, | ||
bigBedParser: bigBedParser, | ||
summaryParser: summaryParser, | ||
leafParser: leafParser | ||
}; | ||
var _a; | ||
var le = isBigEndian ? 'big' : 'little'; | ||
var summaryParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.uint32('chromId') | ||
.uint32('start') | ||
.uint32('end') | ||
.uint32('validCnt') | ||
.float('minScore') | ||
.float('maxScore') | ||
.float('sumData') | ||
.float('sumSqData'); | ||
var leafParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.uint8('isLeaf') | ||
.skip(1) | ||
.uint16('cnt') | ||
.choice({ | ||
tag: 'isLeaf', | ||
choices: { | ||
1: new binary_parser_1.Parser().array('blocksToFetch', { | ||
length: 'cnt', | ||
type: new binary_parser_1.Parser() | ||
.uint32('startChrom') | ||
.uint32('startBase') | ||
.uint32('endChrom') | ||
.uint32('endBase') | ||
.uint64('blockOffset') | ||
.uint64('blockSize'), | ||
}), | ||
0: new binary_parser_1.Parser().array('recurOffsets', { | ||
length: 'cnt', | ||
type: new binary_parser_1.Parser() | ||
.uint32('startChrom') | ||
.uint32('startBase') | ||
.uint32('endChrom') | ||
.uint32('endBase') | ||
.uint64('blockOffset'), | ||
}), | ||
}, | ||
}); | ||
var bigBedParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.uint32('chromId') | ||
.int32('start') | ||
.int32('end') | ||
.string('rest', { | ||
zeroTerminated: true, | ||
}); | ||
var bigWigParser = new binary_parser_1.Parser() | ||
.endianess(le) | ||
.skip(4) | ||
.int32('blockStart') | ||
.skip(4) | ||
.uint32('itemStep') | ||
.uint32('itemSpan') | ||
.uint8('blockType') | ||
.skip(1) | ||
.uint16('itemCount') | ||
.choice({ | ||
tag: 'blockType', | ||
choices: (_a = {}, | ||
_a[BIG_WIG_TYPE_FSTEP] = new binary_parser_1.Parser().array('items', { | ||
length: 'itemCount', | ||
type: new binary_parser_1.Parser().float('score'), | ||
}), | ||
_a[BIG_WIG_TYPE_VSTEP] = new binary_parser_1.Parser().array('items', { | ||
length: 'itemCount', | ||
type: new binary_parser_1.Parser().int32('start').float('score'), | ||
}), | ||
_a[BIG_WIG_TYPE_GRAPH] = new binary_parser_1.Parser().array('items', { | ||
length: 'itemCount', | ||
type: new binary_parser_1.Parser().int32('start').int32('end').float('score'), | ||
}), | ||
_a), | ||
}); | ||
return { | ||
bigWigParser: bigWigParser, | ||
bigBedParser: bigBedParser, | ||
summaryParser: summaryParser, | ||
leafParser: leafParser, | ||
}; | ||
} | ||
@@ -88,430 +154,275 @@ /** | ||
*/ | ||
var BlockView = /*#__PURE__*/function () { | ||
function BlockView(bbi, refsByName, cirTreeOffset, cirTreeLength, isBigEndian, isCompressed, blockType) { | ||
var _this = this; | ||
(0, _classCallCheck2.default)(this, BlockView); | ||
(0, _defineProperty2.default)(this, "cirTreeOffset", void 0); | ||
(0, _defineProperty2.default)(this, "cirTreeLength", void 0); | ||
(0, _defineProperty2.default)(this, "bbi", void 0); | ||
(0, _defineProperty2.default)(this, "isCompressed", void 0); | ||
(0, _defineProperty2.default)(this, "isBigEndian", void 0); | ||
(0, _defineProperty2.default)(this, "refsByName", void 0); | ||
(0, _defineProperty2.default)(this, "blockType", void 0); | ||
(0, _defineProperty2.default)(this, "cirTreePromise", void 0); | ||
(0, _defineProperty2.default)(this, "featureCache", new _abortablePromiseCache.default({ | ||
cache: new _quickLru.default({ | ||
maxSize: 1000 | ||
}), | ||
fill: function () { | ||
var _fill = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(requestData, signal) { | ||
var length, offset, _yield$_this$bbi$read, buffer; | ||
return _regenerator.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
length = requestData.length, offset = requestData.offset; | ||
_context.next = 3; | ||
return _this.bbi.read(Buffer.alloc(length), 0, length, offset, { | ||
signal: signal | ||
}); | ||
case 3: | ||
_yield$_this$bbi$read = _context.sent; | ||
buffer = _yield$_this$bbi$read.buffer; | ||
return _context.abrupt("return", buffer); | ||
case 6: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
function fill(_x, _x2) { | ||
return _fill.apply(this, arguments); | ||
var BlockView = /** @class */ (function () { | ||
function BlockView(bbi, refsByName, cirTreeOffset, cirTreeLength, isBigEndian, isCompressed, blockType) { | ||
var _this = this; | ||
this.featureCache = new abortable_promise_cache_1.default({ | ||
cache: new quick_lru_1.default({ maxSize: 1000 }), | ||
fill: function (requestData, signal) { return __awaiter(_this, void 0, void 0, function () { | ||
var length, offset, buffer; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
length = requestData.length, offset = requestData.offset; | ||
return [4 /*yield*/, this.bbi.read(Buffer.alloc(length), 0, length, offset, { signal: signal })]; | ||
case 1: | ||
buffer = (_a.sent()).buffer; | ||
return [2 /*return*/, buffer]; | ||
} | ||
}); | ||
}); }, | ||
}); | ||
if (!(cirTreeOffset >= 0)) { | ||
throw new Error('invalid cirTreeOffset!'); | ||
} | ||
return fill; | ||
}() | ||
})); | ||
(0, _defineProperty2.default)(this, "leafParser", void 0); | ||
(0, _defineProperty2.default)(this, "bigWigParser", void 0); | ||
(0, _defineProperty2.default)(this, "bigBedParser", void 0); | ||
(0, _defineProperty2.default)(this, "summaryParser", void 0); | ||
if (!(cirTreeOffset >= 0)) throw new Error('invalid cirTreeOffset!'); | ||
if (!(cirTreeLength > 0)) throw new Error('invalid cirTreeLength!'); | ||
this.cirTreeOffset = cirTreeOffset; | ||
this.cirTreeLength = cirTreeLength; | ||
this.isCompressed = isCompressed; | ||
this.refsByName = refsByName; | ||
this.isBigEndian = isBigEndian; | ||
this.bbi = bbi; | ||
this.blockType = blockType; | ||
Object.assign(this, getParsers(isBigEndian)); | ||
} | ||
(0, _createClass2.default)(BlockView, [{ | ||
key: "readWigData", | ||
value: function () { | ||
var _readWigData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(chrName, start, end, observer, opts) { | ||
var _this2 = this; | ||
var refsByName, bbi, cirTreeOffset, isBigEndian, signal, chrId, request, _yield$this$cirTreePr, buffer, cirBlockSize, blocksToFetch, outstanding, cirFobRecur2, filterFeats, cirFobStartFetch, cirFobRecur; | ||
return _regenerator.default.wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
_context3.prev = 0; | ||
refsByName = this.refsByName, bbi = this.bbi, cirTreeOffset = this.cirTreeOffset, isBigEndian = this.isBigEndian; | ||
signal = opts.signal; | ||
chrId = refsByName[chrName]; | ||
if (chrId === undefined) { | ||
observer.complete(); | ||
} | ||
request = { | ||
chrId: chrId, | ||
start: start, | ||
end: end | ||
}; | ||
if (!this.cirTreePromise) { | ||
this.cirTreePromise = bbi.read(Buffer.alloc(48), 0, 48, cirTreeOffset, { | ||
signal: signal | ||
}); | ||
} | ||
_context3.next = 9; | ||
return this.cirTreePromise; | ||
case 9: | ||
_yield$this$cirTreePr = _context3.sent; | ||
buffer = _yield$this$cirTreePr.buffer; | ||
cirBlockSize = isBigEndian ? buffer.readUInt32BE(4) : buffer.readUInt32LE(4); | ||
blocksToFetch = []; | ||
outstanding = 0; //eslint-disable-next-line prefer-const | ||
filterFeats = function filterFeats(b) { | ||
return (b.startChrom < chrId || b.startChrom === chrId && b.startBase <= end) && (b.endChrom > chrId || b.endChrom === chrId && b.endBase >= start); | ||
}; | ||
cirFobStartFetch = /*#__PURE__*/function () { | ||
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(off, fr, level) { | ||
var length, offset, resultBuffer, i; | ||
return _regenerator.default.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_context2.prev = 0; | ||
length = fr.max() - fr.min(); | ||
offset = fr.min(); | ||
_context2.next = 5; | ||
return _this2.featureCache.get("".concat(length, "_").concat(offset), { | ||
length: length, | ||
offset: offset | ||
}, signal); | ||
case 5: | ||
resultBuffer = _context2.sent; | ||
for (i = 0; i < off.length; i += 1) { | ||
if (fr.contains(off[i])) { | ||
cirFobRecur2(resultBuffer, off[i] - offset, level, observer, opts); | ||
outstanding -= 1; | ||
if (outstanding === 0) { | ||
_this2.readFeatures(observer, blocksToFetch, _objectSpread(_objectSpread({}, opts), {}, { | ||
request: request | ||
})); | ||
if (!(cirTreeLength > 0)) { | ||
throw new Error('invalid cirTreeLength!'); | ||
} | ||
this.cirTreeOffset = cirTreeOffset; | ||
this.cirTreeLength = cirTreeLength; | ||
this.isCompressed = isCompressed; | ||
this.refsByName = refsByName; | ||
this.isBigEndian = isBigEndian; | ||
this.bbi = bbi; | ||
this.blockType = blockType; | ||
Object.assign(this, getParsers(isBigEndian)); | ||
} | ||
BlockView.prototype.readWigData = function (chrName, start, end, observer, opts) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var _a, refsByName, bbi, cirTreeOffset, isBigEndian, signal_1, chrId_1, request_1, buffer, cirBlockSize_1, blocksToFetch_1, outstanding_1, cirFobRecur2_1, filterFeats_1, cirFobStartFetch_1, cirFobRecur_1, e_1; | ||
var _this = this; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
_b.trys.push([0, 2, , 3]); | ||
_a = this, refsByName = _a.refsByName, bbi = _a.bbi, cirTreeOffset = _a.cirTreeOffset, isBigEndian = _a.isBigEndian; | ||
signal_1 = opts.signal; | ||
chrId_1 = refsByName[chrName]; | ||
if (chrId_1 === undefined) { | ||
observer.complete(); | ||
} | ||
request_1 = { chrId: chrId_1, start: start, end: end }; | ||
if (!this.cirTreePromise) { | ||
this.cirTreePromise = bbi.read(Buffer.alloc(48), 0, 48, cirTreeOffset, { | ||
signal: signal_1, | ||
}); | ||
} | ||
return [4 /*yield*/, this.cirTreePromise]; | ||
case 1: | ||
buffer = (_b.sent()).buffer; | ||
cirBlockSize_1 = isBigEndian | ||
? buffer.readUInt32BE(4) | ||
: buffer.readUInt32LE(4); | ||
blocksToFetch_1 = []; | ||
outstanding_1 = 0; | ||
filterFeats_1 = function (b) { | ||
return (b.startChrom < chrId_1 || | ||
(b.startChrom === chrId_1 && b.startBase <= end)) && | ||
(b.endChrom > chrId_1 || (b.endChrom === chrId_1 && b.endBase >= start)); | ||
}; | ||
cirFobStartFetch_1 = function (off, fr, level) { return __awaiter(_this, void 0, void 0, function () { | ||
var length_1, offset, resultBuffer, i, e_2; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
_a.trys.push([0, 2, , 3]); | ||
length_1 = fr.max() - fr.min(); | ||
offset = fr.min(); | ||
return [4 /*yield*/, this.featureCache.get("".concat(length_1, "_").concat(offset), { length: length_1, offset: offset }, signal_1)]; | ||
case 1: | ||
resultBuffer = _a.sent(); | ||
for (i = 0; i < off.length; i += 1) { | ||
if (fr.contains(off[i])) { | ||
cirFobRecur2_1(resultBuffer, off[i] - offset, level, observer, opts); | ||
outstanding_1 -= 1; | ||
if (outstanding_1 === 0) { | ||
this.readFeatures(observer, blocksToFetch_1, __assign(__assign({}, opts), { request: request_1 })); | ||
} | ||
} | ||
} | ||
return [3 /*break*/, 3]; | ||
case 2: | ||
e_2 = _a.sent(); | ||
observer.error(e_2); | ||
return [3 /*break*/, 3]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
} | ||
}); | ||
}); }; | ||
cirFobRecur_1 = function (offset, level) { | ||
try { | ||
outstanding_1 += offset.length; | ||
var maxCirBlockSpan = 4 + cirBlockSize_1 * 32; // Upper bound on size, based on a completely full leaf node. | ||
var spans = new range_1.default(offset[0], offset[0] + maxCirBlockSpan); | ||
for (var i = 1; i < offset.length; i += 1) { | ||
var blockSpan = new range_1.default(offset[i], offset[i] + maxCirBlockSpan); | ||
spans = spans.union(blockSpan); | ||
} | ||
spans | ||
.getRanges() | ||
.map(function (fr) { return cirFobStartFetch_1(offset, fr, level); }); | ||
} | ||
_context2.next = 12; | ||
break; | ||
case 9: | ||
_context2.prev = 9; | ||
_context2.t0 = _context2["catch"](0); | ||
observer.error(_context2.t0); | ||
case 12: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, null, [[0, 9]]); | ||
})); | ||
return function cirFobStartFetch(_x8, _x9, _x10) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}(); | ||
cirFobRecur = function cirFobRecur(offset, level) { | ||
try { | ||
outstanding += offset.length; | ||
var maxCirBlockSpan = 4 + cirBlockSize * 32; // Upper bound on size, based on a completely full leaf node. | ||
var spans = new _range.default(offset[0], offset[0] + maxCirBlockSpan); | ||
for (var i = 1; i < offset.length; i += 1) { | ||
var blockSpan = new _range.default(offset[i], offset[i] + maxCirBlockSpan); | ||
spans = spans.union(blockSpan); | ||
} | ||
spans.getRanges().map(function (fr) { | ||
return cirFobStartFetch(offset, fr, level); | ||
}); | ||
} catch (e) { | ||
observer.error(e); | ||
} | ||
}; | ||
cirFobRecur2 = function cirFobRecur2(cirBlockData, offset, level) { | ||
try { | ||
var data = cirBlockData.slice(offset); | ||
var p = _this2.leafParser.parse(data).result; | ||
if (p.blocksToFetch) { | ||
blocksToFetch = blocksToFetch.concat(p.blocksToFetch.filter(filterFeats).map(function (l) { | ||
return { | ||
offset: l.blockOffset, | ||
length: l.blockSize | ||
catch (e) { | ||
observer.error(e); | ||
} | ||
}; | ||
})); | ||
} | ||
if (p.recurOffsets) { | ||
var recurOffsets = p.recurOffsets.filter(filterFeats).map(function (l) { | ||
return l.blockOffset; | ||
}); | ||
if (recurOffsets.length > 0) { | ||
cirFobRecur(recurOffsets, level + 1); | ||
} | ||
} | ||
} catch (e) { | ||
observer.error(e); | ||
} | ||
}; | ||
return _context3.abrupt("return", cirFobRecur([cirTreeOffset + 48], 1)); | ||
case 21: | ||
_context3.prev = 21; | ||
_context3.t0 = _context3["catch"](0); | ||
observer.error(_context3.t0); | ||
case 24: | ||
case "end": | ||
return _context3.stop(); | ||
cirFobRecur2_1 = function (cirBlockData, offset, level) { | ||
try { | ||
var data = cirBlockData.slice(offset); | ||
var p = _this.leafParser.parse(data).result; | ||
if (p.blocksToFetch) { | ||
blocksToFetch_1 = blocksToFetch_1.concat(p.blocksToFetch.filter(filterFeats_1).map(function (l) { return ({ | ||
offset: l.blockOffset, | ||
length: l.blockSize, | ||
}); })); | ||
} | ||
if (p.recurOffsets) { | ||
var recurOffsets = p.recurOffsets | ||
.filter(filterFeats_1) | ||
.map(function (l) { return l.blockOffset; }); | ||
if (recurOffsets.length > 0) { | ||
cirFobRecur_1(recurOffsets, level + 1); | ||
} | ||
} | ||
} | ||
catch (e) { | ||
observer.error(e); | ||
} | ||
}; | ||
return [2 /*return*/, cirFobRecur_1([cirTreeOffset + 48], 1)]; | ||
case 2: | ||
e_1 = _b.sent(); | ||
observer.error(e_1); | ||
return [3 /*break*/, 3]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); | ||
}; | ||
BlockView.prototype.parseSummaryBlock = function (data, startOffset, request) { | ||
var features = []; | ||
var currOffset = startOffset; | ||
while (currOffset < data.byteLength) { | ||
var res = this.summaryParser.parse(data.slice(currOffset)); | ||
features.push(res.result); | ||
currOffset += res.offset; | ||
} | ||
var items = features; | ||
if (request) { | ||
items = items.filter(function (elt) { return elt.chromId === request.chrId; }); | ||
} | ||
items = items.map(function (elt) { return ({ | ||
start: elt.start, | ||
end: elt.end, | ||
maxScore: elt.maxScore, | ||
minScore: elt.minScore, | ||
score: elt.sumData / (elt.validCnt || 1), | ||
summary: true, | ||
}); }); | ||
return request | ||
? items.filter(function (f) { return BlockView.coordFilter(f, request); }) | ||
: items; | ||
}; | ||
BlockView.prototype.parseBigBedBlock = function (data, startOffset, offset, request) { | ||
var items = []; | ||
var currOffset = startOffset; | ||
while (currOffset < data.byteLength) { | ||
var res = this.bigBedParser.parse(data.slice(currOffset)); | ||
res.result.uniqueId = "bb-".concat(offset + currOffset); | ||
items.push(res.result); | ||
currOffset += res.offset; | ||
} | ||
return request | ||
? items.filter(function (f) { return BlockView.coordFilter(f, request); }) | ||
: items; | ||
}; | ||
BlockView.prototype.parseBigWigBlock = function (bytes, startOffset, request) { | ||
var data = bytes.slice(startOffset); | ||
var results = this.bigWigParser.parse(data).result; | ||
var items = results.items, itemSpan = results.itemSpan, itemStep = results.itemStep, blockStart = results.blockStart, blockType = results.blockType; | ||
if (blockType === BIG_WIG_TYPE_FSTEP) { | ||
for (var i = 0; i < items.length; i++) { | ||
items[i].start = blockStart + i * itemStep; | ||
items[i].end = blockStart + i * itemStep + itemSpan; | ||
} | ||
} | ||
}, _callee3, this, [[0, 21]]); | ||
})); | ||
function readWigData(_x3, _x4, _x5, _x6, _x7) { | ||
return _readWigData.apply(this, arguments); | ||
} | ||
return readWigData; | ||
}() | ||
}, { | ||
key: "parseSummaryBlock", | ||
value: function parseSummaryBlock(data, startOffset, request) { | ||
var features = []; | ||
var currOffset = startOffset; | ||
while (currOffset < data.byteLength) { | ||
var res = this.summaryParser.parse(data.slice(currOffset)); | ||
features.push(res.result); | ||
currOffset += res.offset; | ||
} | ||
var items = features; | ||
if (request) items = items.filter(function (elt) { | ||
return elt.chromId === request.chrId; | ||
}); | ||
items = items.map(function (elt) { | ||
return { | ||
start: elt.start, | ||
end: elt.end, | ||
maxScore: elt.maxScore, | ||
minScore: elt.minScore, | ||
score: elt.sumData / (elt.validCnt || 1), | ||
summary: true | ||
}; | ||
}); | ||
return request ? items.filter(function (f) { | ||
return BlockView.coordFilter(f, request); | ||
}) : items; | ||
} | ||
}, { | ||
key: "parseBigBedBlock", | ||
value: function parseBigBedBlock(data, startOffset, offset, request) { | ||
var items = []; | ||
var currOffset = startOffset; | ||
while (currOffset < data.byteLength) { | ||
var res = this.bigBedParser.parse(data.slice(currOffset)); | ||
res.result.uniqueId = "bb-".concat(offset + currOffset); | ||
items.push(res.result); | ||
currOffset += res.offset; | ||
} | ||
return request ? items.filter(function (f) { | ||
return BlockView.coordFilter(f, request); | ||
}) : items; | ||
} | ||
}, { | ||
key: "parseBigWigBlock", | ||
value: function parseBigWigBlock(bytes, startOffset, request) { | ||
var data = bytes.slice(startOffset); | ||
var results = this.bigWigParser.parse(data).result; | ||
var items = results.items, | ||
itemSpan = results.itemSpan, | ||
itemStep = results.itemStep, | ||
blockStart = results.blockStart, | ||
blockType = results.blockType; | ||
if (blockType === BIG_WIG_TYPE_FSTEP) { | ||
for (var i = 0; i < items.length; i++) { | ||
items[i].start = blockStart + i * itemStep; | ||
items[i].end = blockStart + i * itemStep + itemSpan; | ||
} | ||
} else if (blockType === BIG_WIG_TYPE_VSTEP) { | ||
for (var _i = 0; _i < items.length; _i++) { | ||
items[_i].end = items[_i].start + itemSpan; | ||
else if (blockType === BIG_WIG_TYPE_VSTEP) { | ||
for (var i = 0; i < items.length; i++) { | ||
items[i].end = items[i].start + itemSpan; | ||
} | ||
} | ||
} | ||
return request ? items.filter(function (f) { | ||
return BlockView.coordFilter(f, request); | ||
}) : items; | ||
} | ||
}, { | ||
key: "readFeatures", | ||
value: function () { | ||
var _readFeatures = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(observer, blocks) { | ||
var _this3 = this; | ||
var opts, | ||
blockType, | ||
isCompressed, | ||
signal, | ||
request, | ||
blockGroupsToFetch, | ||
_args5 = arguments; | ||
return _regenerator.default.wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
opts = _args5.length > 2 && _args5[2] !== undefined ? _args5[2] : {}; | ||
_context5.prev = 1; | ||
blockType = this.blockType, isCompressed = this.isCompressed; | ||
signal = opts.signal, request = opts.request; | ||
blockGroupsToFetch = (0, _util.groupBlocks)(blocks); | ||
(0, _util.checkAbortSignal)(signal); | ||
_context5.next = 8; | ||
return Promise.all(blockGroupsToFetch.map( /*#__PURE__*/function () { | ||
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(blockGroup) { | ||
var length, offset, data; | ||
return _regenerator.default.wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
(0, _util.checkAbortSignal)(signal); | ||
length = blockGroup.length, offset = blockGroup.offset; | ||
_context4.next = 4; | ||
return _this3.featureCache.get("".concat(length, "_").concat(offset), blockGroup, signal); | ||
case 4: | ||
data = _context4.sent; | ||
blockGroup.blocks.forEach(function (block) { | ||
(0, _util.checkAbortSignal)(signal); | ||
var blockOffset = block.offset - blockGroup.offset; | ||
var resultData = data; | ||
if (isCompressed) { | ||
resultData = _zlib.default.inflateSync(data.slice(blockOffset)); | ||
blockOffset = 0; | ||
} | ||
(0, _util.checkAbortSignal)(signal); | ||
switch (blockType) { | ||
case 'summary': | ||
observer.next(_this3.parseSummaryBlock(resultData, blockOffset, request)); | ||
break; | ||
case 'bigwig': | ||
observer.next(_this3.parseBigWigBlock(resultData, blockOffset, request)); | ||
break; | ||
case 'bigbed': | ||
observer.next( // eslint-disable-next-line no-bitwise | ||
_this3.parseBigBedBlock(resultData, blockOffset, block.offset * (1 << 8), request)); | ||
break; | ||
default: | ||
console.warn("Don't know what to do with ".concat(blockType)); | ||
} | ||
}); | ||
case 6: | ||
case "end": | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee4); | ||
})); | ||
return function (_x13) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}())); | ||
case 8: | ||
observer.complete(); | ||
_context5.next = 14; | ||
break; | ||
case 11: | ||
_context5.prev = 11; | ||
_context5.t0 = _context5["catch"](1); | ||
observer.error(_context5.t0); | ||
case 14: | ||
case "end": | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee5, this, [[1, 11]]); | ||
})); | ||
function readFeatures(_x11, _x12) { | ||
return _readFeatures.apply(this, arguments); | ||
} | ||
return readFeatures; | ||
}() | ||
}], [{ | ||
key: "coordFilter", | ||
value: function coordFilter(f, range) { | ||
return f.start < range.end && f.end >= range.start; | ||
} | ||
}]); | ||
return BlockView; | ||
}(); | ||
return request | ||
? items.filter(function (f) { return BlockView.coordFilter(f, request); }) | ||
: items; | ||
}; | ||
BlockView.coordFilter = function (f, range) { | ||
return f.start < range.end && f.end >= range.start; | ||
}; | ||
BlockView.prototype.readFeatures = function (observer, blocks, opts) { | ||
if (opts === void 0) { opts = {}; } | ||
return __awaiter(this, void 0, void 0, function () { | ||
var _a, blockType_1, isCompressed_1, signal_2, request_2, blockGroupsToFetch, e_3; | ||
var _this = this; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
_b.trys.push([0, 2, , 3]); | ||
_a = this, blockType_1 = _a.blockType, isCompressed_1 = _a.isCompressed; | ||
signal_2 = opts.signal, request_2 = opts.request; | ||
blockGroupsToFetch = (0, util_1.groupBlocks)(blocks); | ||
(0, util_1.checkAbortSignal)(signal_2); | ||
return [4 /*yield*/, Promise.all(blockGroupsToFetch.map(function (blockGroup) { return __awaiter(_this, void 0, void 0, function () { | ||
var length, offset, data; | ||
var _this = this; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
(0, util_1.checkAbortSignal)(signal_2); | ||
length = blockGroup.length, offset = blockGroup.offset; | ||
return [4 /*yield*/, this.featureCache.get("".concat(length, "_").concat(offset), blockGroup, signal_2)]; | ||
case 1: | ||
data = _a.sent(); | ||
blockGroup.blocks.forEach(function (block) { | ||
(0, util_1.checkAbortSignal)(signal_2); | ||
var blockOffset = block.offset - blockGroup.offset; | ||
var resultData = data; | ||
if (isCompressed_1) { | ||
resultData = zlib_1.default.inflateSync(data.slice(blockOffset)); | ||
blockOffset = 0; | ||
} | ||
(0, util_1.checkAbortSignal)(signal_2); | ||
switch (blockType_1) { | ||
case 'summary': | ||
observer.next(_this.parseSummaryBlock(resultData, blockOffset, request_2)); | ||
break; | ||
case 'bigwig': | ||
observer.next(_this.parseBigWigBlock(resultData, blockOffset, request_2)); | ||
break; | ||
case 'bigbed': | ||
observer.next(_this.parseBigBedBlock(resultData, blockOffset, | ||
// eslint-disable-next-line no-bitwise | ||
block.offset * (1 << 8), request_2)); | ||
break; | ||
default: | ||
console.warn("Don't know what to do with ".concat(blockType_1)); | ||
} | ||
}); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }))]; | ||
case 1: | ||
_b.sent(); | ||
observer.complete(); | ||
return [3 /*break*/, 3]; | ||
case 2: | ||
e_3 = _b.sent(); | ||
observer.error(e_3); | ||
return [3 /*break*/, 3]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); | ||
}; | ||
return BlockView; | ||
}()); | ||
exports.BlockView = BlockView; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ibG9ja1ZpZXcudHMiXSwibmFtZXMiOlsiQklHX1dJR19UWVBFX0dSQVBIIiwiQklHX1dJR19UWVBFX1ZTVEVQIiwiQklHX1dJR19UWVBFX0ZTVEVQIiwiZ2V0UGFyc2VycyIsImlzQmlnRW5kaWFuIiwibGUiLCJzdW1tYXJ5UGFyc2VyIiwiUGFyc2VyIiwiZW5kaWFuZXNzIiwidWludDMyIiwiZmxvYXQiLCJsZWFmUGFyc2VyIiwidWludDgiLCJza2lwIiwidWludDE2IiwiY2hvaWNlIiwidGFnIiwiY2hvaWNlcyIsImFycmF5IiwibGVuZ3RoIiwidHlwZSIsInVpbnQ2NCIsImJpZ0JlZFBhcnNlciIsImludDMyIiwic3RyaW5nIiwiemVyb1Rlcm1pbmF0ZWQiLCJiaWdXaWdQYXJzZXIiLCJCbG9ja1ZpZXciLCJiYmkiLCJyZWZzQnlOYW1lIiwiY2lyVHJlZU9mZnNldCIsImNpclRyZWVMZW5ndGgiLCJpc0NvbXByZXNzZWQiLCJibG9ja1R5cGUiLCJBYm9ydGFibGVQcm9taXNlQ2FjaGUiLCJjYWNoZSIsIlF1aWNrTFJVIiwibWF4U2l6ZSIsImZpbGwiLCJyZXF1ZXN0RGF0YSIsInNpZ25hbCIsIm9mZnNldCIsInJlYWQiLCJCdWZmZXIiLCJhbGxvYyIsImJ1ZmZlciIsIkVycm9yIiwiT2JqZWN0IiwiYXNzaWduIiwiY2hyTmFtZSIsInN0YXJ0IiwiZW5kIiwib2JzZXJ2ZXIiLCJvcHRzIiwiY2hySWQiLCJ1bmRlZmluZWQiLCJjb21wbGV0ZSIsInJlcXVlc3QiLCJjaXJUcmVlUHJvbWlzZSIsImNpckJsb2NrU2l6ZSIsInJlYWRVSW50MzJCRSIsInJlYWRVSW50MzJMRSIsImJsb2Nrc1RvRmV0Y2giLCJvdXRzdGFuZGluZyIsImZpbHRlckZlYXRzIiwiYiIsInN0YXJ0Q2hyb20iLCJzdGFydEJhc2UiLCJlbmRDaHJvbSIsImVuZEJhc2UiLCJjaXJGb2JTdGFydEZldGNoIiwib2ZmIiwiZnIiLCJsZXZlbCIsIm1heCIsIm1pbiIsImZlYXR1cmVDYWNoZSIsImdldCIsInJlc3VsdEJ1ZmZlciIsImkiLCJjb250YWlucyIsImNpckZvYlJlY3VyMiIsInJlYWRGZWF0dXJlcyIsImVycm9yIiwiY2lyRm9iUmVjdXIiLCJtYXhDaXJCbG9ja1NwYW4iLCJzcGFucyIsIlJhbmdlIiwiYmxvY2tTcGFuIiwidW5pb24iLCJnZXRSYW5nZXMiLCJtYXAiLCJlIiwiY2lyQmxvY2tEYXRhIiwiZGF0YSIsInNsaWNlIiwicCIsInBhcnNlIiwicmVzdWx0IiwiY29uY2F0IiwiZmlsdGVyIiwibCIsImJsb2NrT2Zmc2V0IiwiYmxvY2tTaXplIiwicmVjdXJPZmZzZXRzIiwic3RhcnRPZmZzZXQiLCJmZWF0dXJlcyIsImN1cnJPZmZzZXQiLCJieXRlTGVuZ3RoIiwicmVzIiwicHVzaCIsIml0ZW1zIiwiZWx0IiwiY2hyb21JZCIsIm1heFNjb3JlIiwibWluU2NvcmUiLCJzY29yZSIsInN1bURhdGEiLCJ2YWxpZENudCIsInN1bW1hcnkiLCJmIiwiY29vcmRGaWx0ZXIiLCJ1bmlxdWVJZCIsImJ5dGVzIiwicmVzdWx0cyIsIml0ZW1TcGFuIiwiaXRlbVN0ZXAiLCJibG9ja1N0YXJ0IiwiYmxvY2tzIiwiYmxvY2tHcm91cHNUb0ZldGNoIiwiUHJvbWlzZSIsImFsbCIsImJsb2NrR3JvdXAiLCJmb3JFYWNoIiwiYmxvY2siLCJyZXN1bHREYXRhIiwiemxpYiIsImluZmxhdGVTeW5jIiwibmV4dCIsInBhcnNlU3VtbWFyeUJsb2NrIiwicGFyc2VCaWdXaWdCbG9jayIsInBhcnNlQmlnQmVkQmxvY2siLCJjb25zb2xlIiwid2FybiIsInJhbmdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7OztBQXNDQSxJQUFNQSxrQkFBa0IsR0FBRyxDQUEzQjtBQUNBLElBQU1DLGtCQUFrQixHQUFHLENBQTNCO0FBQ0EsSUFBTUMsa0JBQWtCLEdBQUcsQ0FBM0I7O0FBRUEsU0FBU0MsVUFBVCxDQUFv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InNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJlcnJvclwiLCB7IFwiYWxsb3dcIjogW1wifFwiXSB9XSAqL1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnQGdtb2QvYmluYXJ5LXBhcnNlcidcbmltcG9ydCBBYm9ydGFibGVQcm9taXNlQ2FjaGUgZnJvbSAnYWJvcnRhYmxlLXByb21pc2UtY2FjaGUnXG5pbXBvcnQgeyBHZW5lcmljRmlsZWhhbmRsZSB9IGZyb20gJ2dlbmVyaWMtZmlsZWhhbmRsZSdcbmltcG9ydCB6bGliIGZyb20gJ3psaWInXG5pbXBvcnQgUXVpY2tMUlUgZnJvbSAncXVpY2stbHJ1J1xuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4vYmJpJ1xuaW1wb3J0IFJhbmdlIGZyb20gJy4vcmFuZ2UnXG5pbXBvcnQgeyBncm91cEJsb2NrcywgY2hlY2tBYm9ydFNpZ25hbCB9IGZyb20gJy4vdXRpbCdcblxuaW50ZXJmYWNlIENvb3JkUmVxdWVzdCB7XG4gIGNocklkOiBudW1iZXJcbiAgc3RhcnQ6IG51bWJlclxuICBlbmQ6IG51bWJlclxufVxuaW50ZXJmYWNlIERhdGFCbG9jayB7XG4gIHN0YXJ0Q2hyb206IG51bWJlclxuICBlbmRDaHJvbTogbnVtYmVyXG4gIHN0YXJ0QmFzZTogbnVtYmVyXG4gIGVuZEJhc2U6IG51bWJlclxuICB2YWxpZENudDogbnVtYmVyXG4gIG1pblZhbDogbnVtYmVyXG4gIG1heFZhbDogbnVtYmVyXG4gIHN1bURhdGE6IG51bWJlclxuICBzdW1TcURhdGE6IG51bWJlclxufVxuaW50ZXJmYWNlIFJlYWREYXRhIHtcbiAgb2Zmc2V0OiBudW1iZXJcbiAgbGVuZ3RoOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFN1bW1hcnlCbG9jayB7XG4gIGNocm9tSWQ6IG51bWJlclxuICBzdGFydDogbnVtYmVyXG4gIGVuZDogbnVtYmVyXG4gIHZhbGlkQ250OiBudW1iZXJcbiAgbWluU2NvcmU6IG51bWJlclxuICBtYXhTY29yZTogbnVtYmVyXG4gIHN1bURhdGE6IG51bWJlclxuICBzdW1TcURhdGE6IG51bWJlclxufVxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuICByZXF1ZXN0PzogQ29vcmRSZXF1ZXN0XG59XG5cbmNvbnN0IEJJR19XSUdfVFlQRV9HUkFQSCA9IDFcbmNvbnN0IEJJR19XSUdfVFlQRV9WU1RFUCA9IDJcbmNvbnN0IEJJR19XSUdfVFlQRV9GU1RFUCA9IDNcblxuZnVuY3Rpb24gZ2V0UGFyc2Vycyhpc0JpZ0VuZGlhbjogYm9vbGVhbik6IGFueSB7XG4gIGNvbnN0IGxlID0gaXNCaWdFbmRpYW4gPyAnYmlnJyA6ICdsaXR0bGUnXG4gIGNvbnN0IHN1bW1hcnlQYXJzZXIgPSBuZXcgUGFyc2VyKClcbiAgICAuZW5kaWFuZXNzKGxlKVxuICAgIC51aW50MzIoJ2Nocm9tSWQnKVxuICAgIC51aW50MzIoJ3N0YXJ0JylcbiAgICAudWludDMyKCdlbmQnKVxuICAgIC51aW50MzIoJ3ZhbGlkQ250JylcbiAgICAuZmxvYXQoJ21pblNjb3JlJylcbiAgICAuZmxvYXQoJ21heFNjb3JlJylcbiAgICAuZmxvYXQoJ3N1bURhdGEnKVxuICAgIC5mbG9hdCgnc3VtU3FEYXRhJylcblxuICBjb25zdCBsZWFmUGFyc2VyID0gbmV3IFBhcnNlcigpXG4gICAgLmVuZGlhbmVzcyhsZSlcbiAgICAudWludDgoJ2lzTGVhZicpXG4gICAgLnNraXAoMSlcbiAgICAudWludDE2KCdjbnQnKVxuICAgIC5jaG9pY2Uoe1xuICAgICAgdGFnOiAnaXNMZWFmJyxcbiAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgMTogbmV3IFBhcnNlcigpLmFycmF5KCdibG9ja3NUb0ZldGNoJywge1xuICAgICAgICAgIGxlbmd0aDogJ2NudCcsXG4gICAgICAgICAgdHlwZTogbmV3IFBhcnNlcigpXG4gICAgICAgICAgICAudWludDMyKCdzdGFydENocm9tJylcbiAgICAgICAgICAgIC51aW50MzIoJ3N0YXJ0QmFzZScpXG4gICAgICAgICAgICAudWludDMyKCdlbmRDaHJvbScpXG4gICAgICAgICAgICAudWludDMyKCdlbmRCYXNlJylcbiAgICAgICAgICAgIC51aW50NjQoJ2Jsb2NrT2Zmc2V0JylcbiAgICAgICAgICAgIC51aW50NjQoJ2Jsb2NrU2l6ZScpLFxuICAgICAgICB9KSxcbiAgICAgICAgMDogbmV3IFBhcnNlcigpLmFycmF5KCdyZWN1ck9mZnNldHMnLCB7XG4gICAgICAgICAgbGVuZ3RoOiAnY250JyxcbiAgICAgICAgICB0eXBlOiBuZXcgUGFyc2VyKClcbiAgICAgICAgICAgIC51aW50MzIoJ3N0YXJ0Q2hyb20nKVxuICAgICAgICAgICAgLnVpbnQzMignc3RhcnRCYXNlJylcbiAgICAgICAgICAgIC51aW50MzIoJ2VuZENocm9tJylcbiAgICAgICAgICAgIC51aW50MzIoJ2VuZEJhc2UnKVxuICAgICAgICAgICAgLnVpbnQ2NCgnYmxvY2tPZmZzZXQnKSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pXG4gIGNvbnN0IGJpZ0JlZFBhcnNlciA9IG5ldyBQYXJzZXIoKVxuICAgIC5lbmRpYW5lc3MobGUpXG4gICAgLnVpbnQzMignY2hyb21JZCcpXG4gICAgLmludDMyKCdzdGFydCcpXG4gICAgLmludDMyKCdlbmQnKVxuICAgIC5zdHJpbmcoJ3Jlc3QnLCB7XG4gICAgICB6ZXJvVGVybWluYXRlZDogdHJ1ZSxcbiAgICB9KVxuXG4gIGNvbnN0IGJpZ1dpZ1BhcnNlciA9IG5ldyBQYXJzZXIoKVxuICAgIC5lbmRpYW5lc3MobGUpXG4gICAgLnNraXAoNClcbiAgICAuaW50MzIoJ2Jsb2NrU3RhcnQnKVxuICAgIC5za2lwKDQpXG4gICAgLnVpbnQzMignaXRlbVN0ZXAnKVxuICAgIC51aW50MzIoJ2l0ZW1TcGFuJylcbiAgICAudWludDgoJ2Jsb2NrVHlwZScpXG4gICAgLnNraXAoMSlcbiAgICAudWludDE2KCdpdGVtQ291bnQnKVxuICAgIC5jaG9pY2Uoe1xuICAgICAgdGFnOiAnYmxvY2tUeXBlJyxcbiAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgW0JJR19XSUdfVFlQRV9GU1RFUF06IG5ldyBQYXJzZXIoKS5hcnJheSgnaXRlbXMnLCB7XG4gICAgICAgICAgbGVuZ3RoOiAnaXRlbUNvdW50JyxcbiAgICAgICAgICB0eXBlOiBuZXcgUGFyc2VyKCkuZmxvYXQoJ3Njb3JlJyksXG4gICAgICAgIH0pLFxuICAgICAgICBbQklHX1dJR19UWVBFX1ZTVEVQXTogbmV3IFBhcnNlcigpLmFycmF5KCdpdGVtcycsIHtcbiAgICAgICAgICBsZW5ndGg6ICdpdGVtQ291bnQnLFxuICAgICAgICAgIHR5cGU6IG5ldyBQYXJzZXIoKS5pbnQzMignc3RhcnQnKS5mbG9hdCgnc2NvcmUnKSxcbiAgICAgICAgfSksXG4gICAgICAgIFtCSUdfV0lHX1RZUEVfR1JBUEhdOiBuZXcgUGFyc2VyKCkuYXJyYXkoJ2l0ZW1zJywge1xuICAgICAgICAgIGxlbmd0aDogJ2l0ZW1Db3VudCcsXG4gICAgICAgICAgdHlwZTogbmV3IFBhcnNlcigpXG4gICAgICAgICAgICAuaW50MzIoJ3N0YXJ0JylcbiAgICAgICAgICAgIC5pbnQzMignZW5kJylcbiAgICAgICAgICAgIC5mbG9hdCgnc2NvcmUnKSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pXG4gIHJldHVybiB7XG4gICAgYmlnV2lnUGFyc2VyLFxuICAgIGJpZ0JlZFBhcnNlcixcbiAgICBzdW1tYXJ5UGFyc2VyLFxuICAgIGxlYWZQYXJzZXIsXG4gIH1cbn1cblxuLyoqXG4gKiBWaWV3IGludG8gYSBzdWJzZXQgb2YgdGhlIGRhdGEgaW4gYSBCaWdXaWcgZmlsZS5cbiAqXG4gKiBBZGFwdGVkIGJ5IFJvYmVydCBCdWVscyBhbmQgQ29saW4gRGllc2ggZnJvbSBiaWd3aWcuanMgaW4gdGhlIERhbGxpYW5jZSBHZW5vbWVcbiAqIEV4cGxvcmVyIGJ5IFRob21hcyBEb3duLlxuICogQGNvbnN0cnVjdHNcbiAqL1xuXG5leHBvcnQgY2xhc3MgQmxvY2tWaWV3IHtcbiAgcHJpdmF0ZSBjaXJUcmVlT2Zmc2V0OiBudW1iZXJcblxuICBwcml2YXRlIGNpclRyZWVMZW5ndGg6IG51bWJlclxuXG4gIHByaXZhdGUgYmJpOiBHZW5lcmljRmlsZWhhbmRsZVxuXG4gIHByaXZhdGUgaXNDb21wcmVzc2VkOiBib29sZWFuXG5cbiAgcHJpdmF0ZSBpc0JpZ0VuZGlhbjogYm9vbGVhblxuXG4gIHByaXZhdGUgcmVmc0J5TmFtZTogYW55XG5cbiAgcHJpdmF0ZSBibG9ja1R5cGU6IHN0cmluZ1xuXG4gIHByaXZhdGUgY2lyVHJlZVByb21pc2U/OiBQcm9taXNlPHsgYnl0ZXNSZWFkOiBudW1iZXI7IGJ1ZmZlcjogQnVmZmVyIH0+XG5cbiAgcHJpdmF0ZSBmZWF0dXJlQ2FjaGUgPSBuZXcgQWJvcnRhYmxlUHJvbWlzZUNhY2hlKHtcbiAgICBjYWNoZTogbmV3IFF1aWNrTFJVKHsgbWF4U2l6ZTogMTAwMCB9KSxcblxuICAgIGZpbGw6IGFzeW5jIChyZXF1ZXN0RGF0YTogUmVhZERhdGEsIHNpZ25hbDogQWJvcnRTaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoLCBvZmZzZXQgfSA9IHJlcXVlc3REYXRhXG4gICAgICBjb25zdCB7IGJ1ZmZlciB9ID0gYXdhaXQgdGhpcy5iYmkucmVhZChCdWZmZXIuYWxsb2MobGVuZ3RoKSwgMCwgbGVuZ3RoLCBvZmZzZXQsIHsgc2lnbmFsIH0pXG4gICAgICByZXR1cm4gYnVmZmVyXG4gICAgfSxcbiAgfSlcblxuICBwcml2YXRlIGxlYWZQYXJzZXI6IGFueVxuXG4gIHByaXZhdGUgYmlnV2lnUGFyc2VyOiBhbnlcblxuICBwcml2YXRlIGJpZ0JlZFBhcnNlcjogYW55XG5cbiAgcHJpdmF0ZSBzdW1tYXJ5UGFyc2VyOiBhbnlcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgYmJpOiBHZW5lcmljRmlsZWhhbmRsZSxcbiAgICByZWZzQnlOYW1lOiBhbnksXG4gICAgY2lyVHJlZU9mZnNldDogbnVtYmVyLFxuICAgIGNpclRyZWVMZW5ndGg6IG51bWJlcixcbiAgICBpc0JpZ0VuZGlhbjogYm9vbGVhbixcbiAgICBpc0NvbXByZXNzZWQ6IGJvb2xlYW4sXG4gICAgYmxvY2tUeXBlOiBzdHJpbmcsXG4gICkge1xuICAgIGlmICghKGNpclRyZWVPZmZzZXQgPj0gMCkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaXJUcmVlT2Zmc2V0IScpXG4gICAgaWYgKCEoY2lyVHJlZUxlbmd0aCA+IDApKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2lyVHJlZUxlbmd0aCEnKVxuXG4gICAgdGhpcy5jaXJUcmVlT2Zmc2V0ID0gY2lyVHJlZU9mZnNldFxuICAgIHRoaXMuY2lyVHJlZUxlbmd0aCA9IGNpclRyZWVMZW5ndGhcbiAgICB0aGlzLmlzQ29tcHJlc3NlZCA9IGlzQ29tcHJlc3NlZFxuICAgIHRoaXMucmVmc0J5TmFtZSA9IHJlZnNCeU5hbWVcbiAgICB0aGlzLmlzQmlnRW5kaWFuID0gaXNCaWdFbmRpYW5cbiAgICB0aGlzLmJiaSA9IGJiaVxuICAgIHRoaXMuYmxvY2tUeXBlID0gYmxvY2tUeXBlXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBnZXRQYXJzZXJzKGlzQmlnRW5kaWFuKSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkV2lnRGF0YShcbiAgICBjaHJOYW1lOiBzdHJpbmcsXG4gICAgc3RhcnQ6IG51bWJlcixcbiAgICBlbmQ6IG51bWJlcixcbiAgICBvYnNlcnZlcjogT2JzZXJ2ZXI8RmVhdHVyZVtdPixcbiAgICBvcHRzOiBPcHRpb25zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyByZWZzQnlOYW1lLCBiYmksIGNpclRyZWVPZmZzZXQsIGlzQmlnRW5kaWFuIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0c1xuICAgICAgY29uc3QgY2hySWQgPSByZWZzQnlOYW1lW2Nock5hbWVdXG4gICAgICBpZiAoY2hySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0ID0geyBjaHJJZCwgc3RhcnQsIGVuZCB9XG4gICAgICBpZiAoIXRoaXMuY2lyVHJlZVByb21pc2UpIHtcbiAgICAgICAgdGhpcy5jaXJUcmVlUHJvbWlzZSA9IGJiaS5yZWFkKEJ1ZmZlci5hbGxvYyg0OCksIDAsIDQ4LCBjaXJUcmVlT2Zmc2V0LCB7IHNpZ25hbCB9KVxuICAgICAgfVxuICAgICAgY29uc3QgeyBidWZmZXIgfSA9IGF3YWl0IHRoaXMuY2lyVHJlZVByb21pc2VcbiAgICAgIGNvbnN0IGNpckJsb2NrU2l6ZSA9IGlzQmlnRW5kaWFuID8gYnVmZmVyLnJlYWRVSW50MzJCRSg0KSA6IGJ1ZmZlci5yZWFkVUludDMyTEUoNClcbiAgICAgIGxldCBibG9ja3NUb0ZldGNoOiBhbnlbXSA9IFtdXG4gICAgICBsZXQgb3V0c3RhbmRpbmcgPSAwXG5cbiAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgbGV0IGNpckZvYlJlY3VyMjogRnVuY3Rpb25cblxuICAgICAgY29uc3QgZmlsdGVyRmVhdHMgPSAoYjogRGF0YUJsb2NrKTogYm9vbGVhbiA9PlxuICAgICAgICAoYi5zdGFydENocm9tIDwgY2hySWQgfHwgKGIuc3RhcnRDaHJvbSA9PT0gY2hySWQgJiYgYi5zdGFydEJhc2UgPD0gZW5kKSkgJiZcbiAgICAgICAgKGIuZW5kQ2hyb20gPiBjaHJJZCB8fCAoYi5lbmRDaHJvbSA9PT0gY2hySWQgJiYgYi5lbmRCYXNlID49IHN0YXJ0KSlcblxuICAgICAgY29uc3QgY2lyRm9iU3RhcnRGZXRjaCA9IGFzeW5jIChvZmY6IGFueSwgZnI6IGFueSwgbGV2ZWw6IG51bWJlcik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGZyLm1heCgpIC0gZnIubWluKClcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSBmci5taW4oKVxuICAgICAgICAgIGNvbnN0IHJlc3VsdEJ1ZmZlciA9IGF3YWl0IHRoaXMuZmVhdHVyZUNhY2hlLmdldChcbiAgICAgICAgICAgIGAke2xlbmd0aH1fJHtvZmZzZXR9YCxcbiAgICAgICAgICAgIHsgbGVuZ3RoLCBvZmZzZXQgfSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICApXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmYubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChmci5jb250YWlucyhvZmZbaV0pKSB7XG4gICAgICAgICAgICAgIGNpckZvYlJlY3VyMihyZXN1bHRCdWZmZXIsIG9mZltpXSAtIG9mZnNldCwgbGV2ZWwsIG9ic2VydmVyLCBvcHRzKVxuICAgICAgICAgICAgICBvdXRzdGFuZGluZyAtPSAxXG4gICAgICAgICAgICAgIGlmIChvdXRzdGFuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZEZlYXR1cmVzKG9ic2VydmVyLCBibG9ja3NUb0ZldGNoLCB7IC4uLm9wdHMsIHJlcXVlc3QgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGNpckZvYlJlY3VyID0gKG9mZnNldDogYW55LCBsZXZlbDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3V0c3RhbmRpbmcgKz0gb2Zmc2V0Lmxlbmd0aFxuXG4gICAgICAgICAgY29uc3QgbWF4Q2lyQmxvY2tTcGFuID0gNCArIGNpckJsb2NrU2l6ZSAqIDMyIC8vIFVwcGVyIGJvdW5kIG9uIHNpemUsIGJhc2VkIG9uIGEgY29tcGxldGVseSBmdWxsIGxlYWYgbm9kZS5cbiAgICAgICAgICBsZXQgc3BhbnMgPSBuZXcgUmFuZ2Uob2Zmc2V0WzBdLCBvZmZzZXRbMF0gKyBtYXhDaXJCbG9ja1NwYW4pXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrU3BhbiA9IG5ldyBSYW5nZShvZmZzZXRbaV0sIG9mZnNldFtpXSArIG1heENpckJsb2NrU3BhbilcbiAgICAgICAgICAgIHNwYW5zID0gc3BhbnMudW5pb24oYmxvY2tTcGFuKVxuICAgICAgICAgIH1cbiAgICAgICAgICBzcGFucy5nZXRSYW5nZXMoKS5tYXAoKGZyOiBSYW5nZSkgPT4gY2lyRm9iU3RhcnRGZXRjaChvZmZzZXQsIGZyLCBsZXZlbCkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNpckZvYlJlY3VyMiA9IChjaXJCbG9ja0RhdGE6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGxldmVsOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gY2lyQmxvY2tEYXRhLnNsaWNlKG9mZnNldClcblxuICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLmxlYWZQYXJzZXIucGFyc2UoZGF0YSkucmVzdWx0XG4gICAgICAgICAgaWYgKHAuYmxvY2tzVG9GZXRjaCkge1xuICAgICAgICAgICAgYmxvY2tzVG9GZXRjaCA9IGJsb2Nrc1RvRmV0Y2guY29uY2F0KFxuICAgICAgICAgICAgICBwLmJsb2Nrc1RvRmV0Y2hcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZpbHRlckZlYXRzKVxuICAgICAgICAgICAgICAgIC5tYXAoKGw6IGFueSk6IGFueSA9PiAoeyBvZmZzZXQ6IGwuYmxvY2tPZmZzZXQsIGxlbmd0aDogbC5ibG9ja1NpemUgfSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocC5yZWN1ck9mZnNldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3VyT2Zmc2V0cyA9IHAucmVjdXJPZmZzZXRzXG4gICAgICAgICAgICAgIC5maWx0ZXIoZmlsdGVyRmVhdHMpXG4gICAgICAgICAgICAgIC5tYXAoKGw6IGFueSk6IGFueSA9PiBsLmJsb2NrT2Zmc2V0KVxuICAgICAgICAgICAgaWYgKHJlY3VyT2Zmc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNpckZvYlJlY3VyKHJlY3VyT2Zmc2V0cywgbGV2ZWwgKyAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNpckZvYlJlY3VyKFtjaXJUcmVlT2Zmc2V0ICsgNDhdLCAxKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9ic2VydmVyLmVycm9yKGUpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVN1bW1hcnlCbG9jayhkYXRhOiBCdWZmZXIsIHN0YXJ0T2Zmc2V0OiBudW1iZXIsIHJlcXVlc3Q/OiBDb29yZFJlcXVlc3QpOiBGZWF0dXJlW10ge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gW11cbiAgICBsZXQgY3Vyck9mZnNldCA9IHN0YXJ0T2Zmc2V0XG4gICAgd2hpbGUgKGN1cnJPZmZzZXQgPCBkYXRhLmJ5dGVMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHRoaXMuc3VtbWFyeVBhcnNlci5wYXJzZShkYXRhLnNsaWNlKGN1cnJPZmZzZXQpKVxuICAgICAgZmVhdHVyZXMucHVzaChyZXMucmVzdWx0KVxuICAgICAgY3Vyck9mZnNldCArPSByZXMub2Zmc2V0XG4gICAgfVxuICAgIGxldCBpdGVtcyA9IGZlYXR1cmVzXG4gICAgaWYgKHJlcXVlc3QpIGl0ZW1zID0gaXRlbXMuZmlsdGVyKChlbHQ6IFN1bW1hcnlCbG9jayk6IGJvb2xlYW4gPT4gZWx0LmNocm9tSWQgPT09IHJlcXVlc3QuY2hySWQpXG4gICAgaXRlbXMgPSBpdGVtcy5tYXAoXG4gICAgICAoZWx0OiBTdW1tYXJ5QmxvY2spOiBGZWF0dXJlID0+ICh7XG4gICAgICAgIHN0YXJ0OiBlbHQuc3RhcnQsXG4gICAgICAgIGVuZDogZWx0LmVuZCxcbiAgICAgICAgbWF4U2NvcmU6IGVsdC5tYXhTY29yZSxcbiAgICAgICAgbWluU2NvcmU6IGVsdC5taW5TY29yZSxcbiAgICAgICAgc2NvcmU6IGVsdC5zdW1EYXRhIC8gKGVsdC52YWxpZENudCB8fCAxKSxcbiAgICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIClcbiAgICByZXR1cm4gcmVxdWVzdCA/IGl0ZW1zLmZpbHRlcihmID0+IEJsb2NrVmlldy5jb29yZEZpbHRlcihmLCByZXF1ZXN0KSkgOiBpdGVtc1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUJpZ0JlZEJsb2NrKFxuICAgIGRhdGE6IEJ1ZmZlcixcbiAgICBzdGFydE9mZnNldDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHJlcXVlc3Q/OiBDb29yZFJlcXVlc3QsXG4gICk6IEZlYXR1cmVbXSB7XG4gICAgY29uc3QgaXRlbXMgPSBbXVxuICAgIGxldCBjdXJyT2Zmc2V0ID0gc3RhcnRPZmZzZXRcbiAgICB3aGlsZSAoY3Vyck9mZnNldCA8IGRhdGEuYnl0ZUxlbmd0aCkge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy5iaWdCZWRQYXJzZXIucGFyc2UoZGF0YS5zbGljZShjdXJyT2Zmc2V0KSlcbiAgICAgIHJlcy5yZXN1bHQudW5pcXVlSWQgPSBgYmItJHtvZmZzZXQgKyBjdXJyT2Zmc2V0fWBcbiAgICAgIGl0ZW1zLnB1c2gocmVzLnJlc3VsdClcbiAgICAgIGN1cnJPZmZzZXQgKz0gcmVzLm9mZnNldFxuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0ID8gaXRlbXMuZmlsdGVyKChmOiBhbnkpID0+IEJsb2NrVmlldy5jb29yZEZpbHRlcihmLCByZXF1ZXN0KSkgOiBpdGVtc1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUJpZ1dpZ0Jsb2NrKGJ5dGVzOiBCdWZmZXIsIHN0YXJ0T2Zmc2V0OiBudW1iZXIsIHJlcXVlc3Q/OiBDb29yZFJlcXVlc3QpOiBGZWF0dXJlW10ge1xuICAgIGNvbnN0IGRhdGEgPSBieXRlcy5zbGljZShzdGFydE9mZnNldClcbiAgICBjb25zdCByZXN1bHRzID0gdGhpcy5iaWdXaWdQYXJzZXIucGFyc2UoZGF0YSkucmVzdWx0XG4gICAgY29uc3QgeyBpdGVtcywgaXRlbVNwYW4sIGl0ZW1TdGVwLCBibG9ja1N0YXJ0LCBibG9ja1R5cGUgfSA9IHJlc3VsdHNcbiAgICBpZiAoYmxvY2tUeXBlID09PSBCSUdfV0lHX1RZUEVfRlNURVApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlbXNbaV0uc3RhcnQgPSBibG9ja1N0YXJ0ICsgaSAqIGl0ZW1TdGVwXG4gICAgICAgIGl0ZW1zW2ldLmVuZCA9IGJsb2NrU3RhcnQgKyBpICogaXRlbVN0ZXAgKyBpdGVtU3BhblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYmxvY2tUeXBlID09PSBCSUdfV0lHX1RZUEVfVlNURVApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlbXNbaV0uZW5kID0gaXRlbXNbaV0uc3RhcnQgKyBpdGVtU3BhblxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVxdWVzdCA/IGl0ZW1zLmZpbHRlcigoZjogYW55KSA9PiBCbG9ja1ZpZXcuY29vcmRGaWx0ZXIoZiwgcmVxdWVzdCkpIDogaXRlbXNcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvb3JkRmlsdGVyKGY6IEZlYXR1cmUsIHJhbmdlOiBDb29yZFJlcXVlc3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZi5zdGFydCA8IHJhbmdlLmVuZCAmJiBmLmVuZCA+PSByYW5nZS5zdGFydFxuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRGZWF0dXJlcyhcbiAgICBvYnNlcnZlcjogT2JzZXJ2ZXI8RmVhdHVyZVtdPixcbiAgICBibG9ja3M6IGFueSxcbiAgICBvcHRzOiBPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGJsb2NrVHlwZSwgaXNDb21wcmVzc2VkIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IHNpZ25hbCwgcmVxdWVzdCB9ID0gb3B0c1xuICAgICAgY29uc3QgYmxvY2tHcm91cHNUb0ZldGNoID0gZ3JvdXBCbG9ja3MoYmxvY2tzKVxuICAgICAgY2hlY2tBYm9ydFNpZ25hbChzaWduYWwpXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgYmxvY2tHcm91cHNUb0ZldGNoLm1hcChhc3luYyAoYmxvY2tHcm91cDogYW55KSA9PiB7XG4gICAgICAgICAgY2hlY2tBYm9ydFNpZ25hbChzaWduYWwpXG4gICAgICAgICAgY29uc3QgeyBsZW5ndGgsIG9mZnNldCB9ID0gYmxvY2tHcm91cFxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZlYXR1cmVDYWNoZS5nZXQoYCR7bGVuZ3RofV8ke29mZnNldH1gLCBibG9ja0dyb3VwLCBzaWduYWwpXG4gICAgICAgICAgYmxvY2tHcm91cC5ibG9ja3MuZm9yRWFjaCgoYmxvY2s6IGFueSkgPT4ge1xuICAgICAgICAgICAgY2hlY2tBYm9ydFNpZ25hbChzaWduYWwpXG4gICAgICAgICAgICBsZXQgYmxvY2tPZmZzZXQgPSBibG9jay5vZmZzZXQgLSBibG9ja0dyb3VwLm9mZnNldFxuICAgICAgICAgICAgbGV0IHJlc3VsdERhdGEgPSBkYXRhXG4gICAgICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdERhdGEgPSB6bGliLmluZmxhdGVTeW5jKGRhdGEuc2xpY2UoYmxvY2tPZmZzZXQpKVxuICAgICAgICAgICAgICBibG9ja09mZnNldCA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrQWJvcnRTaWduYWwoc2lnbmFsKVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGJsb2NrVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHRoaXMucGFyc2VTdW1tYXJ5QmxvY2socmVzdWx0RGF0YSwgYmxvY2tPZmZzZXQsIHJlcXVlc3QpKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgJ2JpZ3dpZyc6XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLnBhcnNlQmlnV2lnQmxvY2socmVzdWx0RGF0YSwgYmxvY2tPZmZzZXQsIHJlcXVlc3QpKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgJ2JpZ2JlZCc6XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChcbiAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlQmlnQmVkQmxvY2socmVzdWx0RGF0YSwgYmxvY2tPZmZzZXQsIGJsb2NrLm9mZnNldCAqICgxIDw8IDgpLCByZXF1ZXN0KSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYERvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoICR7YmxvY2tUeXBlfWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSlcbiAgICB9XG4gIH1cbn1cbiJdfQ== |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
Object.defineProperty(exports, "BigWig", { | ||
enumerable: true, | ||
get: function get() { | ||
return _bigwig.BigWig; | ||
} | ||
}); | ||
Object.defineProperty(exports, "BigBed", { | ||
enumerable: true, | ||
get: function get() { | ||
return _bigbed.BigBed; | ||
} | ||
}); | ||
Object.defineProperty(exports, "Feature", { | ||
enumerable: true, | ||
get: function get() { | ||
return _bbi.Feature; | ||
} | ||
}); | ||
Object.defineProperty(exports, "Header", { | ||
enumerable: true, | ||
get: function get() { | ||
return _bbi.Header; | ||
} | ||
}); | ||
Object.defineProperty(exports, "RequestOptions", { | ||
enumerable: true, | ||
get: function get() { | ||
return _bbi.RequestOptions; | ||
} | ||
}); | ||
var _bigwig = require("./bigwig"); | ||
var _bigbed = require("./bigbed"); | ||
var _bbi = require("./bbi"); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEJpZ1dpZyB9IGZyb20gJy4vYmlnd2lnJ1xuZXhwb3J0IHsgQmlnQmVkIH0gZnJvbSAnLi9iaWdiZWQnXG5leHBvcnQgeyBGZWF0dXJlLCBIZWFkZXIsIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi9iYmknXG4iXX0= | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.BigBed = exports.BigWig = void 0; | ||
var bigwig_1 = require("./bigwig"); | ||
Object.defineProperty(exports, "BigWig", { enumerable: true, get: function () { return bigwig_1.BigWig; } }); | ||
var bigbed_1 = require("./bigbed"); | ||
Object.defineProperty(exports, "BigBed", { enumerable: true, get: function () { return bigbed_1.BigBed; } }); |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.default = void 0; | ||
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); | ||
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
/* eslint prefer-rest-params:0, no-nested-ternary:0 */ | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
/** | ||
@@ -22,168 +8,121 @@ * Adapted from a combination of Range and _Compound in the | ||
*/ | ||
var Range = /*#__PURE__*/function () { | ||
function Range(arg1, arg2) { | ||
(0, _classCallCheck2.default)(this, Range); | ||
(0, _defineProperty2.default)(this, "ranges", void 0); | ||
this.ranges = arguments.length === 2 ? [{ | ||
min: arg1, | ||
max: arg2 | ||
}] : 0 in arg1 ? Object.assign({}, arg1) : [arg1]; | ||
} | ||
(0, _createClass2.default)(Range, [{ | ||
key: "min", | ||
value: function min() { | ||
return this.ranges[0].min; | ||
var Range = /** @class */ (function () { | ||
function Range(arg1, arg2) { | ||
this.ranges = | ||
arguments.length === 2 | ||
? [{ min: arg1, max: arg2 }] | ||
: 0 in arg1 | ||
? Object.assign({}, arg1) | ||
: [arg1]; | ||
} | ||
}, { | ||
key: "max", | ||
value: function max() { | ||
return this.ranges[this.ranges.length - 1].max; | ||
} | ||
}, { | ||
key: "contains", | ||
value: function contains(pos) { | ||
for (var s = 0; s < this.ranges.length; s += 1) { | ||
var r = this.ranges[s]; | ||
if (r.min <= pos && r.max >= pos) { | ||
return true; | ||
Range.prototype.min = function () { | ||
return this.ranges[0].min; | ||
}; | ||
Range.prototype.max = function () { | ||
return this.ranges[this.ranges.length - 1].max; | ||
}; | ||
Range.prototype.contains = function (pos) { | ||
for (var s = 0; s < this.ranges.length; s += 1) { | ||
var r = this.ranges[s]; | ||
if (r.min <= pos && r.max >= pos) { | ||
return true; | ||
} | ||
} | ||
} | ||
return false; | ||
} | ||
}, { | ||
key: "isContiguous", | ||
value: function isContiguous() { | ||
return this.ranges.length > 1; | ||
} | ||
}, { | ||
key: "getRanges", | ||
value: function getRanges() { | ||
return this.ranges.map(function (r) { | ||
return new Range(r.min, r.max); | ||
}); | ||
} | ||
}, { | ||
key: "toString", | ||
value: function toString() { | ||
return this.ranges.map(function (r) { | ||
return "[".concat(r.min, "-").concat(r.max, "]"); | ||
}).join(','); | ||
} | ||
}, { | ||
key: "union", | ||
value: function union(s1) { | ||
var ranges = this.getRanges().concat(s1.getRanges()).sort(this.rangeOrder); | ||
var oranges = []; | ||
var current = ranges[0]; | ||
for (var i = 1; i < ranges.length; i += 1) { | ||
var nxt = ranges[i]; | ||
if (nxt.min() > current.max() + 1) { | ||
oranges.push(current); | ||
current = nxt; | ||
} else if (nxt.max() > current.max()) { | ||
current = new Range(current.min(), nxt.max()); | ||
return false; | ||
}; | ||
Range.prototype.isContiguous = function () { | ||
return this.ranges.length > 1; | ||
}; | ||
Range.prototype.getRanges = function () { | ||
return this.ranges.map(function (r) { return new Range(r.min, r.max); }); | ||
}; | ||
Range.prototype.toString = function () { | ||
return this.ranges.map(function (r) { return "[".concat(r.min, "-").concat(r.max, "]"); }).join(','); | ||
}; | ||
Range.prototype.union = function (s1) { | ||
var ranges = this.getRanges().concat(s1.getRanges()).sort(this.rangeOrder); | ||
var oranges = []; | ||
var current = ranges[0]; | ||
for (var i = 1; i < ranges.length; i += 1) { | ||
var nxt = ranges[i]; | ||
if (nxt.min() > current.max() + 1) { | ||
oranges.push(current); | ||
current = nxt; | ||
} | ||
else if (nxt.max() > current.max()) { | ||
current = new Range(current.min(), nxt.max()); | ||
} | ||
} | ||
} | ||
oranges.push(current); | ||
if (oranges.length === 1) { | ||
return oranges[0]; | ||
} | ||
return new Range(oranges); | ||
} | ||
}, { | ||
key: "intersection", | ||
value: function intersection(arg) { | ||
// eslint-disable-next-line @typescript-eslint/no-this-alias | ||
var s0 = this; | ||
var s1 = arg; | ||
var r0 = this.ranges(); | ||
var r1 = s1.ranges(); | ||
var l0 = r0.length; | ||
var l1 = r1.length; | ||
var i0 = 0; | ||
var i1 = 0; | ||
var or = []; | ||
while (i0 < l0 && i1 < l1) { | ||
s0 = r0[i0]; | ||
s1 = r1[i1]; | ||
var lapMin = Math.max(s0.min(), s1.min()); | ||
var lapMax = Math.min(s0.max(), s1.max()); | ||
if (lapMax >= lapMin) { | ||
or.push(new Range(lapMin, lapMax)); | ||
oranges.push(current); | ||
if (oranges.length === 1) { | ||
return oranges[0]; | ||
} | ||
if (s0.max() > s1.max()) { | ||
i1 += 1; | ||
} else { | ||
i0 += 1; | ||
return new Range(oranges); | ||
}; | ||
Range.prototype.intersection = function (arg) { | ||
// eslint-disable-next-line @typescript-eslint/no-this-alias | ||
var s0 = this; | ||
var s1 = arg; | ||
var r0 = this.ranges(); | ||
var r1 = s1.ranges(); | ||
var l0 = r0.length; | ||
var l1 = r1.length; | ||
var i0 = 0; | ||
var i1 = 0; | ||
var or = []; | ||
while (i0 < l0 && i1 < l1) { | ||
s0 = r0[i0]; | ||
s1 = r1[i1]; | ||
var lapMin = Math.max(s0.min(), s1.min()); | ||
var lapMax = Math.min(s0.max(), s1.max()); | ||
if (lapMax >= lapMin) { | ||
or.push(new Range(lapMin, lapMax)); | ||
} | ||
if (s0.max() > s1.max()) { | ||
i1 += 1; | ||
} | ||
else { | ||
i0 += 1; | ||
} | ||
} | ||
} | ||
if (or.length === 0) { | ||
throw new Error('found range of length 0'); | ||
} | ||
if (or.length === 1) { | ||
return or[0]; | ||
} | ||
return new Range(or); | ||
} | ||
}, { | ||
key: "coverage", | ||
value: function coverage() { | ||
var tot = 0; | ||
var rl = this.ranges(); | ||
for (var ri = 0; ri < rl.length; ri += 1) { | ||
var r = rl[ri]; | ||
tot += r.max() - r.min() + 1; | ||
} | ||
return tot; | ||
} | ||
}, { | ||
key: "rangeOrder", | ||
value: function rangeOrder(tmpa, tmpb) { | ||
var a = tmpa; | ||
var b = tmpb; | ||
if (arguments.length < 2) { | ||
b = a; | ||
a = this; | ||
} | ||
if (a.min() < b.min()) { | ||
return -1; | ||
} | ||
if (a.min() > b.min()) { | ||
return 1; | ||
} | ||
if (a.max() < b.max()) { | ||
return -1; | ||
} | ||
if (b.max() > a.max()) { | ||
return 1; | ||
} | ||
return 0; | ||
} | ||
}]); | ||
return Range; | ||
}(); | ||
if (or.length === 0) { | ||
throw new Error('found range of length 0'); | ||
} | ||
if (or.length === 1) { | ||
return or[0]; | ||
} | ||
return new Range(or); | ||
}; | ||
Range.prototype.coverage = function () { | ||
var tot = 0; | ||
var rl = this.ranges(); | ||
for (var ri = 0; ri < rl.length; ri += 1) { | ||
var r = rl[ri]; | ||
tot += r.max() - r.min() + 1; | ||
} | ||
return tot; | ||
}; | ||
Range.prototype.rangeOrder = function (tmpa, tmpb) { | ||
var a = tmpa; | ||
var b = tmpb; | ||
if (arguments.length < 2) { | ||
b = a; | ||
a = this; | ||
} | ||
if (a.min() < b.min()) { | ||
return -1; | ||
} | ||
if (a.min() > b.min()) { | ||
return 1; | ||
} | ||
if (a.max() < b.max()) { | ||
return -1; | ||
} | ||
if (b.max() > a.max()) { | ||
return 1; | ||
} | ||
return 0; | ||
}; | ||
return Range; | ||
}()); | ||
exports.default = Range; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZS50cyJdLCJuYW1lcyI6WyJSYW5nZSIsImFyZzEiLCJhcmcyIiwicmFuZ2VzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwibWluIiwibWF4IiwiT2JqZWN0IiwiYXNzaWduIiwicG9zIiwicyIsInIiLCJtYXAiLCJqb2luIiwiczEiLCJnZXRSYW5nZXMiLCJjb25jYXQiLCJzb3J0IiwicmFuZ2VPcmRlciIsIm9yYW5nZXMiLCJjdXJyZW50IiwiaSIsIm54dCIsInB1c2giLCJhcmciLCJzMCIsInIwIiwicjEiLCJsMCIsImwxIiwiaTAiLCJpMSIsIm9yIiwibGFwTWluIiwiTWF0aCIsImxhcE1heCIsIkVycm9yIiwidG90IiwicmwiLCJyaSIsInRtcGEiLCJ0bXBiIiwiYSIsImIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOzs7O0lBSXFCQSxLO0FBR25CLGlCQUFtQkMsSUFBbkIsRUFBOEJDLElBQTlCLEVBQTBDO0FBQUE7QUFBQTtBQUN4QyxTQUFLQyxNQUFMLEdBQ0VDLFNBQVMsQ0FBQ0MsTUFBVixLQUFxQixDQUFyQixHQUNJLENBQUM7QUFBRUMsTUFBQUEsR0FBRyxFQUFFTCxJQUFQO0FBQWFNLE1BQUFBLEdBQUcsRUFBRUw7QUFBbEIsS0FBRCxDQURKLEdBRUksS0FBS0QsSUFBTCxHQUNBTyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCUixJQUFsQixDQURBLEdBRUEsQ0FBQ0EsSUFBRCxDQUxOO0FBTUQ7Ozs7MEJBRW9CO0FBQ25CLGFBQU8sS0FBS0UsTUFBTCxDQUFZLENBQVosRUFBZUcsR0FBdEI7QUFDRDs7OzBCQUVvQjtBQUNuQixhQUFPLEtBQUtILE1BQUwsQ0FBWSxLQUFLQSxNQUFMLENBQVlFLE1BQVosR0FBcUIsQ0FBakMsRUFBb0NFLEdBQTNDO0FBQ0Q7Ozs2QkFFZUcsRyxFQUFzQjtBQUNwQyxXQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsS0FBS1Is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LE1BQXpCLEVBQWlDbUMsRUFBRSxJQUFJLENBQXZDLEVBQTBDO0FBQ3hDLFlBQU01QixDQUFDLEdBQUcyQixFQUFFLENBQUNDLEVBQUQsQ0FBWjtBQUNBRixRQUFBQSxHQUFHLElBQUkxQixDQUFDLENBQUNMLEdBQUYsS0FBVUssQ0FBQyxDQUFDTixHQUFGLEVBQVYsR0FBb0IsQ0FBM0I7QUFDRDs7QUFDRCxhQUFPZ0MsR0FBUDtBQUNEOzs7K0JBRWlCRyxJLEVBQWFDLEksRUFBcUI7QUFDbEQsVUFBSUMsQ0FBQyxHQUFHRixJQUFSO0FBQ0EsVUFBSUcsQ0FBQyxHQUFHRixJQUFSOztBQUNBLFVBQUl0QyxTQUFTLENBQUNDLE1BQVYsR0FBbUIsQ0FBdkIsRUFBMEI7QUFDeEJ1QyxRQUFBQSxDQUFDLEdBQUdELENBQUo7QUFDQUEsUUFBQUEsQ0FBQyxHQUFHLElBQUo7QUFDRDs7QUFFRCxVQUFJQSxDQUFDLENBQUNyQyxHQUFGLEtBQVVzQyxDQUFDLENBQUN0QyxHQUFGLEVBQWQsRUFBdUI7QUFDckIsZUFBTyxDQUFDLENBQVI7QUFDRDs7QUFDRCxVQUFJcUMsQ0FBQyxDQUFDckMsR0FBRixLQUFVc0MsQ0FBQyxDQUFDdEMsR0FBRixFQUFkLEVBQXVCO0FBQ3JCLGVBQU8sQ0FBUDtBQUNEOztBQUNELFVBQUlxQyxDQUFDLENBQUNwQyxHQUFGLEtBQVVxQyxDQUFDLENBQUNyQyxHQUFGLEVBQWQsRUFBdUI7QUFDckIsZUFBTyxDQUFDLENBQVI7QUFDRDs7QUFDRCxVQUFJcUMsQ0FBQyxDQUFDckMsR0FBRixLQUFVb0MsQ0FBQyxDQUFDcEMsR0FBRixFQUFkLEVBQXVCO0FBQ3JCLGVBQU8sQ0FBUDtBQUNEOztBQUNELGFBQU8sQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IHByZWZlci1yZXN0LXBhcmFtczowLCBuby1uZXN0ZWQtdGVybmFyeTowICovXG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIGEgY29tYmluYXRpb24gb2YgUmFuZ2UgYW5kIF9Db21wb3VuZCBpbiB0aGVcbiAqIERhbGxpYW5jZSBHZW5vbWUgRXhwbG9yZXIsIChjKSBUaG9tYXMgRG93biAyMDA2LTIwMTAuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhbmdlIHtcbiAgcHVibGljIHJhbmdlczogYW55XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFyZzE6IGFueSwgYXJnMj86IGFueSkge1xuICAgIHRoaXMucmFuZ2VzID1cbiAgICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDJcbiAgICAgICAgPyBbeyBtaW46IGFyZzEsIG1heDogYXJnMiB9XVxuICAgICAgICA6IDAgaW4gYXJnMVxuICAgICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGFyZzEpXG4gICAgICAgIDogW2FyZzFdXG4gIH1cblxuICBwdWJsaWMgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VzWzBdLm1pblxuICB9XG5cbiAgcHVibGljIG1heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlcy5sZW5ndGggLSAxXS5tYXhcbiAgfVxuXG4gIHB1YmxpYyBjb250YWlucyhwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IHMgPSAwOyBzIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLnJhbmdlc1tzXVxuICAgICAgaWYgKHIubWluIDw9IHBvcyAmJiByLm1heCA+PSBwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwdWJsaWMgaXNDb250aWd1b3VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJhbmdlcy5sZW5ndGggPiAxXG4gIH1cblxuICBwdWJsaWMgZ2V0UmFuZ2VzKCk6IFJhbmdlW10ge1xuICAgIHJldHVybiB0aGlzLnJhbmdlcy5tYXAoKHI6IFJhbmdlKSA9PiBuZXcgUmFuZ2Uoci5taW4sIHIubWF4KSlcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJhbmdlcy5tYXAoKHI6IFJhbmdlKSA9PiBgWyR7ci5taW59LSR7ci5tYXh9XWApLmpvaW4oJywnKVxuICB9XG5cbiAgcHVibGljIHVuaW9uKHMxOiBSYW5nZSk6IFJhbmdlIHtcbiAgICBjb25zdCByYW5nZXMgPSB0aGlzLmdldFJhbmdlcygpXG4gICAgICAuY29uY2F0KHMxLmdldFJhbmdlcygpKVxuICAgICAgLnNvcnQodGhpcy5yYW5nZU9yZGVyKVxuICAgIGNvbnN0IG9yYW5nZXMgPSBbXVxuICAgIGxldCBjdXJyZW50ID0gcmFuZ2VzWzBdXG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3Qgbnh0ID0gcmFuZ2VzW2ldXG4gICAgICBpZiAobnh0Lm1pbigpID4gY3VycmVudC5tYXgoKSArIDEpIHtcbiAgICAgICAgb3Jhbmdlcy5wdXNoKGN1cnJlbnQpXG4gICAgICAgIGN1cnJlbnQgPSBueHRcbiAgICAgIH0gZWxzZSBpZiAobnh0Lm1heCgpID4gY3VycmVudC5tYXgoKSkge1xuICAgICAgICBjdXJyZW50ID0gbmV3IFJhbmdlKGN1cnJlbnQubWluKCksIG54dC5tYXgoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgb3Jhbmdlcy5wdXNoKGN1cnJlbnQpXG5cbiAgICBpZiAob3Jhbmdlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBvcmFuZ2VzWzBdXG4gICAgfVxuICAgIHJldHVybiBuZXcgUmFuZ2Uob3JhbmdlcylcbiAgfVxuXG4gIHB1YmxpYyBpbnRlcnNlY3Rpb24oYXJnOiBSYW5nZSk6IFJhbmdlIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBsZXQgczAgPSB0aGlzXG4gICAgbGV0IHMxID0gYXJnXG4gICAgY29uc3QgcjAgPSB0aGlzLnJhbmdlcygpXG4gICAgY29uc3QgcjEgPSBzMS5yYW5nZXMoKVxuICAgIGNvbnN0IGwwID0gcjAubGVuZ3RoXG5cbiAgICBjb25zdCBsMSA9IHIxLmxlbmd0aFxuICAgIGxldCBpMCA9IDBcblxuICAgIGxldCBpMSA9IDBcbiAgICBjb25zdCBvciA9IFtdXG5cbiAgICB3aGlsZSAoaTAgPCBsMCAmJiBpMSA8IGwxKSB7XG4gICAgICBzMCA9IHIwW2kwXVxuICAgICAgczEgPSByMVtpMV1cbiAgICAgIGNvbnN0IGxhcE1pbiA9IE1hdGgubWF4KHMwLm1pbigpLCBzMS5taW4oKSlcbiAgICAgIGNvbnN0IGxhcE1heCA9IE1hdGgubWluKHMwLm1heCgpLCBzMS5tYXgoKSlcbiAgICAgIGlmIChsYXBNYXggPj0gbGFwTWluKSB7XG4gICAgICAgIG9yLnB1c2gobmV3IFJhbmdlKGxhcE1pbiwgbGFwTWF4KSlcbiAgICAgIH1cbiAgICAgIGlmIChzMC5tYXgoKSA+IHMxLm1heCgpKSB7XG4gICAgICAgIGkxICs9IDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkwICs9IDFcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3IubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvdW5kIHJhbmdlIG9mIGxlbmd0aCAwJylcbiAgICB9XG4gICAgaWYgKG9yLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG9yWzBdXG4gICAgfVxuICAgIHJldHVybiBuZXcgUmFuZ2Uob3IpXG4gIH1cblxuICBwdWJsaWMgY292ZXJhZ2UoKTogbnVtYmVyIHtcbiAgICBsZXQgdG90ID0gMFxuICAgIGNvbnN0IHJsID0gdGhpcy5yYW5nZXMoKVxuICAgIGZvciAobGV0IHJpID0gMDsgcmkgPCBybC5sZW5ndGg7IHJpICs9IDEpIHtcbiAgICAgIGNvbnN0IHIgPSBybFtyaV1cbiAgICAgIHRvdCArPSByLm1heCgpIC0gci5taW4oKSArIDFcbiAgICB9XG4gICAgcmV0dXJuIHRvdFxuICB9XG5cbiAgcHVibGljIHJhbmdlT3JkZXIodG1wYTogUmFuZ2UsIHRtcGI6IFJhbmdlKTogbnVtYmVyIHtcbiAgICBsZXQgYSA9IHRtcGFcbiAgICBsZXQgYiA9IHRtcGJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGIgPSBhXG4gICAgICBhID0gdGhpc1xuICAgIH1cblxuICAgIGlmIChhLm1pbigpIDwgYi5taW4oKSkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIGlmIChhLm1pbigpID4gYi5taW4oKSkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9XG4gICAgaWYgKGEubWF4KCkgPCBiLm1heCgpKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgaWYgKGIubWF4KCkgPiBhLm1heCgpKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgICByZXR1cm4gMFxuICB9XG59XG4iXX0= |
226
dist/util.js
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.groupBlocks = groupBlocks; | ||
exports.checkAbortSignal = checkAbortSignal; | ||
exports.abortBreakPoint = abortBreakPoint; | ||
exports.AbortError = void 0; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); | ||
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); | ||
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); | ||
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); | ||
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); | ||
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } | ||
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } | ||
var __extends = (this && this.__extends) || (function () { | ||
var extendStatics = function (d, b) { | ||
extendStatics = Object.setPrototypeOf || | ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || | ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; | ||
return extendStatics(d, b); | ||
}; | ||
return function (d, b) { | ||
if (typeof b !== "function" && b !== null) | ||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); | ||
extendStatics(d, b); | ||
function __() { this.constructor = d; } | ||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | ||
}; | ||
})(); | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.abortBreakPoint = exports.checkAbortSignal = exports.groupBlocks = exports.AbortError = void 0; | ||
/* eslint no-bitwise: ["error", { "allow": ["|"] }] */ | ||
var AbortError = /*#__PURE__*/function (_Error) { | ||
(0, _inherits2.default)(AbortError, _Error); | ||
var _super = _createSuper(AbortError); | ||
function AbortError(message) { | ||
var _this; | ||
(0, _classCallCheck2.default)(this, AbortError); | ||
_this = _super.call(this, message); | ||
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "code", void 0); | ||
_this.code = 'ERR_ABORTED'; | ||
return _this; | ||
} | ||
return AbortError; | ||
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error)); // sort blocks by file offset and | ||
var AbortError = /** @class */ (function (_super) { | ||
__extends(AbortError, _super); | ||
function AbortError(message) { | ||
var _this = _super.call(this, message) || this; | ||
_this.code = 'ERR_ABORTED'; | ||
return _this; | ||
} | ||
return AbortError; | ||
}(Error)); | ||
exports.AbortError = AbortError; | ||
// sort blocks by file offset and | ||
// group blocks that are within 2KB of eachother | ||
exports.AbortError = AbortError; | ||
function groupBlocks(blocks) { | ||
blocks.sort(function (b0, b1) { | ||
return (b0.offset | 0) - (b1.offset | 0); | ||
}); | ||
var blockGroups = []; | ||
var lastBlock; | ||
var lastBlockEnd; | ||
for (var i = 0; i < blocks.length; i += 1) { | ||
if (lastBlock && blocks[i].offset - lastBlockEnd <= 2000) { | ||
lastBlock.length += blocks[i].length - lastBlockEnd + blocks[i].offset; | ||
lastBlock.blocks.push(blocks[i]); | ||
} else { | ||
blockGroups.push(lastBlock = { | ||
blocks: [blocks[i]], | ||
length: blocks[i].length, | ||
offset: blocks[i].offset | ||
}); | ||
blocks.sort(function (b0, b1) { return (b0.offset | 0) - (b1.offset | 0); }); | ||
var blockGroups = []; | ||
var lastBlock; | ||
var lastBlockEnd; | ||
for (var i = 0; i < blocks.length; i += 1) { | ||
if (lastBlock && blocks[i].offset - lastBlockEnd <= 2000) { | ||
lastBlock.length += blocks[i].length - lastBlockEnd + blocks[i].offset; | ||
lastBlock.blocks.push(blocks[i]); | ||
} | ||
else { | ||
blockGroups.push((lastBlock = { | ||
blocks: [blocks[i]], | ||
length: blocks[i].length, | ||
offset: blocks[i].offset, | ||
})); | ||
} | ||
lastBlockEnd = lastBlock.offset + lastBlock.length; | ||
} | ||
lastBlockEnd = lastBlock.offset + lastBlock.length; | ||
} | ||
return blockGroups; | ||
return blockGroups; | ||
} | ||
exports.groupBlocks = groupBlocks; | ||
/** | ||
@@ -94,18 +101,19 @@ * Properly check if the given AbortSignal is aborted. | ||
*/ | ||
function checkAbortSignal(signal) { | ||
if (!signal) return; | ||
if (signal.aborted) { | ||
// console.log('bam aborted!') | ||
if (typeof DOMException !== 'undefined') { | ||
throw new DOMException('aborted', 'AbortError'); | ||
} else { | ||
var e = new AbortError('aborted'); | ||
e.code = 'ERR_ABORTED'; | ||
throw e; | ||
if (!signal) { | ||
return; | ||
} | ||
} | ||
if (signal.aborted) { | ||
// console.log('bam aborted!') | ||
if (typeof DOMException !== 'undefined') { | ||
throw new DOMException('aborted', 'AbortError'); | ||
} | ||
else { | ||
var e = new AbortError('aborted'); | ||
e.code = 'ERR_ABORTED'; | ||
throw e; | ||
} | ||
} | ||
} | ||
exports.checkAbortSignal = checkAbortSignal; | ||
/** | ||
@@ -117,29 +125,15 @@ * Skips to the next tick, then runs `checkAbortSignal`. | ||
*/ | ||
function abortBreakPoint(_x) { | ||
return _abortBreakPoint.apply(this, arguments); | ||
function abortBreakPoint(signal) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, Promise.resolve()]; | ||
case 1: | ||
_a.sent(); | ||
checkAbortSignal(signal); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); | ||
} | ||
function _abortBreakPoint() { | ||
_abortBreakPoint = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(signal) { | ||
return _regenerator.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.next = 2; | ||
return Promise.resolve(); | ||
case 2: | ||
checkAbortSignal(signal); | ||
case 3: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
return _abortBreakPoint.apply(this, arguments); | ||
} | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbIkFib3J0RXJyb3IiLCJtZXNzYWdlIiwiY29kZSIsIkVycm9yIiwiZ3JvdXBCbG9ja3MiLCJibG9ja3MiLCJzb3J0IiwiYjAiLCJiMSIsIm9mZnNldCIsImJsb2NrR3JvdXBzIiwibGFzdEJsb2NrIiwibGFzdEJsb2NrRW5kIiwiaSIsImxlbmd0aCIsInB1c2giLCJjaGVja0Fib3J0U2lnbmFsIiwic2lnbmFsIiwiYWJvcnRlZCIsIkRPTUV4Y2VwdGlvbiIsImUiLCJhYm9ydEJyZWFrUG9pbnQiLCJQcm9taXNlIiwicmVzb2x2ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0lBQ2FBLFU7Ozs7O0FBR1gsc0JBQW1CQyxPQUFuQixFQUFvQztBQUFBOztBQUFBO0FBQ2xDLDhCQUFNQSxPQUFOO0FBRGtDO0FBRWxDLFVBQUtDLElBQUwsR0FBWSxhQUFaO0FBRmtDO0FBR25DOzs7K0NBTjZCQyxLLElBUWhDO0FBQ0E7Ozs7O0FBQ08sU0FBU0MsV0FBVCxDQUFxQkMsTUFBckIsRUFBMkM7QUFDaERBLEVBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLFVBQUNDLEVBQUQsRUFBS0MsRUFBTDtBQUFBLFdBQVksQ0FBQ0QsRUFBRSxDQUFDRSxNQUFILEdBQVksQ0FBYixLQUFtQkQsRUFBRSxDQUFDQyxNQUFILEdBQVksQ0FBL0IsQ0FBWjtBQUFBLEdBQVo7QUFFQSxNQUFNQyxXQUFXLEdBQUcsRUFBcEI7QUFDQSxNQUFJQyxTQUFKO0FBQ0EsTUFBSUMsWUFBSjs7QUFDQSxPQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdSLE1BQU0sQ0FBQ1MsTUFBM0IsRUFBbUNELENBQUMsSUFBSSxDQUF4QyxFQUEyQztBQUN6QyxRQUFJRixTQUFTLElBQUlOLE1BQU0sQ0FBQ1EsQ0FBRCxDQUFOLENBQVVKLE1BQVYsR0FBbUJHLFlBQW5CLElBQW1DLElBQXBELEVBQTBEO0FBQ3hERCxNQUFBQSxTQUFTLENBQUNHLE1BQVYsSUFBb0JULE1BQU0sQ0FBQ1EsQ0FBRCxDQUFOLENBQVVDLE1BQVYsR0FBbUJGLFlBQW5CLEdBQWtDUCxNQUFNLENBQUNRLENBQUQsQ0FBTixDQUFVSixNQUFoRTtBQUNBRSxNQUFBQSxTQUFTLENBQUNOLE1BQVYsQ0FBaUJVLElBQWpCLENBQXNCVixNQUFNLENBQUNRLENBQUQsQ0FBNUI7QUFDRCxLQUhELE1BR087QUFDTEgsTUFBQUEsV0FBVyxDQUFDSyxJQUFaLENBQ0dKLFNBQVMsR0FBRztBQUNYTixRQUFBQSxNQUFNLEVBQUUsQ0FBQ0EsTUFBTSxDQUFDUSxDQUFELENBQVAsQ0FERztBQUVYQyxRQUFBQSxNQUFNLEVBQUVULE1BQU0sQ0FBQ1EsQ0FBRCxDQUFOLENBQVVDLE1BRlA7QUFHWEwsUUFBQUEsTUFBTSxFQUFFSixNQUFNLENBQUNRLENBQUQsQ0FBTixDQUFVSjtBQUhQLE9BRGY7QUFPRDs7QUFDREcsSUFBQUEsWUFBWSxHQUFHRCxTQUFTLENBQUNGLE1BQVYsR0FBbUJFLFNBQVMsQ0FBQ0csTUFBNUM7QUFDRDs7QUFFRCxTQUFPSixXQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7OztBQVdPLFNBQVNNLGdCQUFULENBQTBCQyxNQUExQixFQUFzRDtBQUMzRCxNQUFJLENBQUNBLE1BQUwsRUFBYTs7QUFFYixNQUFJQSxNQUFNLENBQUNDLE9BQVgsRUFBb0I7QUFDbEI7QUFDQSxRQUFJLE9BQU9DLFlBQVAsS0FBd0IsV0FBNUIsRUFBeUM7QUFDdkMsWUFBTSxJQUFJQSxZQUFKLENBQWlCLFNBQWpCLEVBQTRCLFlBQTVCLENBQU47QUFDRCxLQUZELE1BRU87QUFDTCxVQUFNQyxDQUFDLEdBQUcsSUFBSXBCLFVBQUosQ0FBZSxTQUFmLENBQVY7QUFDQW9CLE1BQUFBLENBQUMsQ0FBQ2xCLElBQUYsR0FBUyxhQUFUO0FBQ0EsWUFBTWtCLENBQU47QUFDRDtBQUNGO0FBQ0Y7QUFFRDs7Ozs7Ozs7U0FNc0JDLGU7Ozs7OzZGQUFmLGlCQUErQkosTUFBL0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQ0NLLE9BQU8sQ0FBQ0MsT0FBUixFQUREOztBQUFBO0FBRUxQLFlBQUFBLGdCQUFnQixDQUFDQyxNQUFELENBQWhCOztBQUZLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEciLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tYml0d2lzZTogW1wiZXJyb3JcIiwgeyBcImFsbG93XCI6IFtcInxcIl0gfV0gKi9cbmV4cG9ydCBjbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgY29kZTogc3RyaW5nXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5jb2RlID0gJ0VSUl9BQk9SVEVEJ1xuICB9XG59XG4vLyBzb3J0IGJsb2NrcyBieSBmaWxlIG9mZnNldCBhbmRcbi8vIGdyb3VwIGJsb2NrcyB0aGF0IGFyZSB3aXRoaW4gMktCIG9mIGVhY2hvdGhlclxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQmxvY2tzKGJsb2NrczogYW55W10pOiBhbnlbXSB7XG4gIGJsb2Nrcy5zb3J0KChiMCwgYjEpID0+IChiMC5vZmZzZXQgfCAwKSAtIChiMS5vZmZzZXQgfCAwKSlcblxuICBjb25zdCBibG9ja0dyb3VwcyA9IFtdXG4gIGxldCBsYXN0QmxvY2tcbiAgbGV0IGxhc3RCbG9ja0VuZFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChsYXN0QmxvY2sgJiYgYmxvY2tzW2ldLm9mZnNldCAtIGxhc3RCbG9ja0VuZCA8PSAyMDAwKSB7XG4gICAgICBsYXN0QmxvY2subGVuZ3RoICs9IGJsb2Nrc1tpXS5sZW5ndGggLSBsYXN0QmxvY2tFbmQgKyBibG9ja3NbaV0ub2Zmc2V0XG4gICAgICBsYXN0QmxvY2suYmxvY2tzLnB1c2goYmxvY2tzW2ldKVxuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja0dyb3Vwcy5wdXNoKFxuICAgICAgICAobGFzdEJsb2NrID0ge1xuICAgICAgICAgIGJsb2NrczogW2Jsb2Nrc1tpXV0sXG4gICAgICAgICAgbGVuZ3RoOiBibG9ja3NbaV0ubGVuZ3RoLFxuICAgICAgICAgIG9mZnNldDogYmxvY2tzW2ldLm9mZnNldCxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfVxuICAgIGxhc3RCbG9ja0VuZCA9IGxhc3RCbG9jay5vZmZzZXQgKyBsYXN0QmxvY2subGVuZ3RoXG4gIH1cblxuICByZXR1cm4gYmxvY2tHcm91cHNcbn1cblxuLyoqXG4gKiBQcm9wZXJseSBjaGVjayBpZiB0aGUgZ2l2ZW4gQWJvcnRTaWduYWwgaXMgYWJvcnRlZC5cbiAqIFBlciB0aGUgc3RhbmRhcmQsIGlmIHRoZSBzaWduYWwgcmVhZHMgYXMgYWJvcnRlZCxcbiAqIHRoaXMgZnVuY3Rpb24gdGhyb3dzIGVpdGhlciBhIERPTUV4Y2VwdGlvbiBBYm9ydEVycm9yLCBvciBhIHJlZ3VsYXIgZXJyb3JcbiAqIHdpdGggYSBgY29kZWAgYXR0cmlidXRlIHNldCB0byBgRVJSX0FCT1JURURgLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgcGFzc2luZyBgdW5kZWZpbmVkYCBpcyBhIG5vLW9wXG4gKlxuICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gW3NpZ25hbF0gYW4gQWJvcnRTaWduYWwsIG9yIGFueXRoaW5nIHdpdGggYW4gYGFib3J0ZWRgIGF0dHJpYnV0ZVxuICogQHJldHVybnMgbm90aGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBYm9ydFNpZ25hbChzaWduYWw/OiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuXG5cbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2JhbSBhYm9ydGVkIScpXG4gICAgaWYgKHR5cGVvZiBET01FeGNlcHRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdhYm9ydGVkJywgJ0Fib3J0RXJyb3InKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlID0gbmV3IEFib3J0RXJyb3IoJ2Fib3J0ZWQnKVxuICAgICAgZS5jb2RlID0gJ0VSUl9BQk9SVEVEJ1xuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNraXBzIHRvIHRoZSBuZXh0IHRpY2ssIHRoZW4gcnVucyBgY2hlY2tBYm9ydFNpZ25hbGAuXG4gKiBBd2FpdCB0aGlzIHRvIGluc2lkZSBhbiBvdGhlcndpc2Ugc3luY2hyb25vdXMgbG9vcCB0b1xuICogcHJvdmlkZSBhIHBsYWNlIHRvIGJyZWFrIHdoZW4gYW4gYWJvcnQgc2lnbmFsIGlzIHJlY2VpdmVkLlxuICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gc2lnbmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhYm9ydEJyZWFrUG9pbnQoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKClcbiAgY2hlY2tBYm9ydFNpZ25hbChzaWduYWwpXG59XG4iXX0= | ||
exports.abortBreakPoint = abortBreakPoint; |
{ | ||
"name": "@gmod/bbi", | ||
"version": "1.0.30", | ||
"version": "1.0.31", | ||
"description": "Parser for BigWig/BigBed files", | ||
@@ -8,2 +8,3 @@ "license": "MIT", | ||
"main": "dist/index.js", | ||
"module": "esm/index.js", | ||
"author": { | ||
@@ -18,3 +19,4 @@ "name": "Colin Diesh", | ||
"files": [ | ||
"dist" | ||
"dist", | ||
"esm" | ||
], | ||
@@ -25,7 +27,5 @@ "scripts": { | ||
"lint": "eslint --report-unused-disable-directives --max-warnings 0 --ext .js,.ts src", | ||
"clean": "rimraf dist", | ||
"clean": "rimraf dist esm", | ||
"prebuild": "npm run clean", | ||
"build:types": "tsc --emitDeclarationOnly", | ||
"build:js": "babel src --out-dir dist --extensions \".ts,.tsx\" --source-maps inline", | ||
"build": "npm run build:types && npm run build:js", | ||
"build": "tsc --target es2018 --outDir esm && tsc --target es5 --outDir dist", | ||
"preversion": "npm run lint && npm test && npm run build", | ||
@@ -44,5 +44,4 @@ "version": "standard-changelog && git add CHANGELOG.md", | ||
"dependencies": { | ||
"@babel/runtime": "^7.4.4", | ||
"@gmod/binary-parser": "^1.3.5", | ||
"abortable-promise-cache": "^1.0.1", | ||
"@gmod/binary-parser": "^1.4.0", | ||
"abortable-promise-cache": "^1.4.1", | ||
"buffer-crc32": "^0.2.13", | ||
@@ -55,10 +54,4 @@ "es6-promisify": "^6.0.1", | ||
"devDependencies": { | ||
"@babel/cli": "^7.4.4", | ||
"@babel/core": "^7.4.4", | ||
"@babel/plugin-proposal-class-properties": "^7.4.4", | ||
"@babel/plugin-transform-runtime": "^7.4.4", | ||
"@babel/preset-env": "^7.4.4", | ||
"@babel/preset-typescript": "^7.3.3", | ||
"@gmod/bed": "^2.0.0", | ||
"@types/jest": "^24.0.13", | ||
"@types/jest": "^27.0.3", | ||
"@types/long": "^4.0.0", | ||
@@ -68,16 +61,13 @@ "@types/node": "^12.0.2", | ||
"@typescript-eslint/parser": "^2.0.0", | ||
"babel-eslint": "^10.0.1", | ||
"babel-preset-typescript": "^7.0.0-alpha.19", | ||
"cross-fetch": "^3.0.2", | ||
"eslint": "^5.16.0", | ||
"eslint-config-airbnb-base": "^13.1.0", | ||
"eslint-config-prettier": "^4.2.0", | ||
"eslint-plugin-import": "^2.17.2", | ||
"eslint-plugin-jest": "^22.5.1", | ||
"eslint-plugin-prettier": "^3.1.0", | ||
"jest": "^24.8.0", | ||
"prettier": "^1.17.1", | ||
"eslint": "^7.0.0", | ||
"eslint-config-prettier": "^8.3.0", | ||
"eslint-plugin-import": "^2.25.3", | ||
"eslint-plugin-prettier": "^4.0.0", | ||
"jest": "^27.4.3", | ||
"prettier": "^2.5.1", | ||
"rimraf": "^2.6.3", | ||
"standard-changelog": "^2.0.11", | ||
"typescript": "^3.4.5" | ||
"ts-jest": "^27.0.7", | ||
"typescript": "^4.5.2" | ||
}, | ||
@@ -84,0 +74,0 @@ "publishConfig": { |
# bbi-js | ||
[](https://npmjs.org/package/@gmod/bbi) | ||
[](https://travis-ci.org/GMOD/bbi-js) [](https://codecov.io/gh/GMOD/bbi-js/branch/master) | ||
[](https://codecov.io/gh/GMOD/bbi-js/branch/master) | ||
[](https://github.com/GMOD/bbi-js/actions?query=branch%3Amaster+workflow%3APush+) | ||
A parser for bigwig and bigbed file formats | ||
@@ -22,3 +22,2 @@ | ||
If using remotely, you can use it in combination with generic-filehandle or your own implementation of something like generic-filehandle | ||
@@ -47,4 +46,2 @@ https://github.com/GMOD/generic-filehandle/ | ||
## Documentation | ||
@@ -56,7 +53,6 @@ | ||
* path - path to a local file | ||
* url - path to a url | ||
* filehandle - a filehandle instance that you can implement as a custom class yourself. path and url are based on https://www.npmjs.com/package/generic-filehandle but by implementing a class containing the Filehandle interface specified therein, you can pass it to this module | ||
- path - path to a local file | ||
- url - path to a url | ||
- filehandle - a filehandle instance that you can implement as a custom class yourself. path and url are based on https://www.npmjs.com/package/generic-filehandle but by implementing a class containing the Filehandle interface specified therein, you can pass it to this module | ||
### BigWig | ||
@@ -66,10 +62,9 @@ | ||
* refName - a name of a chromosome in the file | ||
* start - a 0-based half open start coordinate | ||
* end - a 0-based half open end coordinate | ||
* opts.scale - indicates zoom level to use, specified as pxPerBp, e.g. being zoomed out, you might have 100bp per pixel so opts.scale would be 1/100. the zoom level that is returned is the one which has reductionLevel<=2/opts.scale (reductionLevel is a property of the zoom level structure in the bigwig file data) | ||
* opts.basesPerScale - optional, inverse of opts.scale e.g. bpPerPx | ||
* opts.signal - optional, an AbortSignal to halt processing | ||
- refName - a name of a chromosome in the file | ||
- start - a 0-based half open start coordinate | ||
- end - a 0-based half open end coordinate | ||
- opts.scale - indicates zoom level to use, specified as pxPerBp, e.g. being zoomed out, you might have 100bp per pixel so opts.scale would be 1/100. the zoom level that is returned is the one which has reductionLevel<=2/opts.scale (reductionLevel is a property of the zoom level structure in the bigwig file data) | ||
- opts.basesPerScale - optional, inverse of opts.scale e.g. bpPerPx | ||
- opts.signal - optional, an AbortSignal to halt processing | ||
Returns a promise to an array of features. If an incorrect refName or no features are found the result is an empty array. | ||
@@ -85,6 +80,5 @@ | ||
### Understanding scale and reductionLevel | ||
Here is what the reductionLevel structure looks like in a file. The zoomLevel that is chosen is the first reductionLevel<2*opts.basesPerScale (or reductionLevel<2/opts.scale) when scanning backwards through this list | ||
Here is what the reductionLevel structure looks like in a file. The zoomLevel that is chosen is the first reductionLevel<2\*opts.basesPerScale (or reductionLevel<2/opts.scale) when scanning backwards through this list | ||
@@ -99,3 +93,2 @@ [ { reductionLevel: 40, ... }, | ||
#### getFeatureStream(refName, start, end, opts) | ||
@@ -118,6 +111,6 @@ | ||
* refName - a name of a chromosome in the file | ||
* start - a 0-based half open start coordinate | ||
* end - a 0-based half open end coordinate | ||
* opts.signal - optional, an AbortSignal to halt processing | ||
- refName - a name of a chromosome in the file | ||
- start - a 0-based half open start coordinate | ||
- end - a 0-based half open end coordinate | ||
- opts.signal - optional, an AbortSignal to halt processing | ||
@@ -143,5 +136,4 @@ returns a promise to an array of features. no concept of zoom levels is used with bigwig data | ||
The BigBed line contents are returned as a raw text line e.g. {start: 0, end:100, rest: "ENST00000456328.2\t1000\t..."} where "rest" contains tab delimited text for the fields from 4 and on in the BED format. Since BED files from BigBed format often come with autoSql (a description of all the columns) it can be useful to parse it with BED parser that can handle autoSql. The rest line can be parsed by the @gmod/bed module, which is not by default integrated with this module, but can be combined with it as follows | ||
The BigBed line contents are returned as a raw text line e.g. {start: 0, end:100, rest: "ENST00000456328.2\t1000\t..."} where "rest" contains tab delimited text for the fields from 4 and on in the BED format. Since BED files from BigBed format often come with autoSql (a description of all the columns) it can be useful to parse it with BED parser that can handle autoSql. The rest line can be parsed by the @gmod/bed module, which is not by default integrated with this module, but can be combined with it as follows | ||
```js | ||
@@ -192,3 +184,2 @@ import {BigBed} from '@gmod/bbi' | ||
## Academic Use | ||
@@ -201,2 +192,1 @@ | ||
MIT © [Colin Diesh](https://github.com/cmdcolin) | ||
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
7
17
32
2900
142583
183
1
- Removed@babel/runtime@^7.4.4
- Removed@babel/runtime@7.26.9(transitive)
- Removedregenerator-runtime@0.14.1(transitive)
Updated@gmod/binary-parser@^1.4.0