@gmod/bbi 1.0.30 → 1.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bigbed.js CHANGED
@@ -1,213 +1,162 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.filterUndef = filterUndef;
9
- exports.BigBed = void 0;
10
-
11
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
12
-
13
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
14
-
15
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
16
-
17
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
18
-
19
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
20
-
21
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
22
-
23
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
24
-
25
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
26
-
27
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
28
-
29
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
30
-
31
- var _binaryParser = require("@gmod/binary-parser");
32
-
33
- var _rxjs = require("rxjs");
34
-
35
- var _operators = require("rxjs/operators");
36
-
37
- var _abortablePromiseCache = _interopRequireDefault(require("abortable-promise-cache"));
38
-
39
- var _quickLru = _interopRequireDefault(require("quick-lru"));
40
-
41
- var _bbi = require("./bbi");
42
-
43
- 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; }
44
-
45
- 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; }
46
-
47
- 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); }; }
48
-
49
- 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; } }
50
-
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (_) try {
44
+ 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;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ var __importDefault = (this && this.__importDefault) || function (mod) {
65
+ return (mod && mod.__esModule) ? mod : { "default": mod };
66
+ };
67
+ Object.defineProperty(exports, "__esModule", { value: true });
68
+ exports.BigBed = exports.filterUndef = void 0;
69
+ var binary_parser_1 = require("@gmod/binary-parser");
70
+ var rxjs_1 = require("rxjs");
71
+ var operators_1 = require("rxjs/operators");
72
+ var abortable_promise_cache_1 = __importDefault(require("abortable-promise-cache"));
73
+ var quick_lru_1 = __importDefault(require("quick-lru"));
74
+ var bbi_1 = require("./bbi");
51
75
  function filterUndef(ts) {
52
- return ts.filter(function (t) {
53
- return !!t;
54
- });
76
+ return ts.filter(function (t) { return !!t; });
55
77
  }
56
-
57
- var BigBed = /*#__PURE__*/function (_BBI) {
58
- (0, _inherits2.default)(BigBed, _BBI);
59
-
60
- var _super = _createSuper(BigBed);
61
-
62
- function BigBed(opts) {
63
- var _this;
64
-
65
- (0, _classCallCheck2.default)(this, BigBed);
66
- _this = _super.call(this, opts);
67
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "readIndicesCache", new _abortablePromiseCache.default({
68
- cache: new _quickLru.default({
69
- maxSize: 1
70
- }),
71
- fill: function () {
72
- var _fill = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(args, signal) {
73
- return _regenerator.default.wrap(function _callee$(_context) {
74
- while (1) {
75
- switch (_context.prev = _context.next) {
76
- case 0:
77
- return _context.abrupt("return", _this._readIndices(_objectSpread(_objectSpread({}, args), {}, {
78
- signal: signal
79
- })));
80
-
81
- case 1:
82
- case "end":
83
- return _context.stop();
84
- }
85
- }
86
- }, _callee);
87
- }));
88
-
89
- function fill(_x, _x2) {
90
- return _fill.apply(this, arguments);
91
- }
92
-
93
- return fill;
94
- }()
95
- }));
96
- return _this;
97
- }
98
-
99
- (0, _createClass2.default)(BigBed, [{
100
- key: "readIndices",
101
- value: function readIndices() {
102
- var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
103
- var options = 'aborted' in opts ? {
104
- signal: opts
105
- } : opts;
106
- return this.readIndicesCache.get(JSON.stringify(options), options, options.signal);
78
+ exports.filterUndef = filterUndef;
79
+ var BigBed = /** @class */ (function (_super) {
80
+ __extends(BigBed, _super);
81
+ function BigBed(opts) {
82
+ var _this = _super.call(this, opts) || this;
83
+ _this.readIndicesCache = new abortable_promise_cache_1.default({
84
+ cache: new quick_lru_1.default({ maxSize: 1 }),
85
+ fill: function (args, signal) { return __awaiter(_this, void 0, void 0, function () {
86
+ return __generator(this, function (_a) {
87
+ return [2 /*return*/, this._readIndices(__assign(__assign({}, args), { signal: signal }))];
88
+ });
89
+ }); },
90
+ });
91
+ return _this;
107
92
  }
93
+ BigBed.prototype.readIndices = function (opts) {
94
+ if (opts === void 0) { opts = {}; }
95
+ var options = 'aborted' in opts ? { signal: opts } : opts;
96
+ return this.readIndicesCache.get(JSON.stringify(options), options, options.signal);
97
+ };
108
98
  /*
109
99
  * retrieve unzoomed view for any scale
110
100
  * @param scale - unused
111
101
  * @param abortSignal - an optional AbortSignal to kill operation
112
102
  * @return promise for a BlockView
113
103
  */
114
-
115
- }, {
116
- key: "getView",
117
- value: function () {
118
- var _getView = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(scale, opts) {
119
- return _regenerator.default.wrap(function _callee2$(_context2) {
120
- while (1) {
121
- switch (_context2.prev = _context2.next) {
122
- case 0:
123
- return _context2.abrupt("return", this.getUnzoomedView(opts));
124
-
125
- case 1:
126
- case "end":
127
- return _context2.stop();
128
- }
129
- }
130
- }, _callee2, this);
131
- }));
132
-
133
- function getView(_x3, _x4) {
134
- return _getView.apply(this, arguments);
135
- }
136
-
137
- return getView;
138
- }()
104
+ BigBed.prototype.getView = function (scale, opts) {
105
+ return __awaiter(this, void 0, void 0, function () {
106
+ return __generator(this, function (_a) {
107
+ return [2 /*return*/, this.getUnzoomedView(opts)];
108
+ });
109
+ });
110
+ };
139
111
  /*
140
112
  * parse the bigbed extraIndex fields
141
113
  * @param abortSignal to abort operation
142
114
  * @return a Promise for an array of Index data structure since there can be multiple extraIndexes in a bigbed, see bedToBigBed documentation
143
115
  */
144
-
145
- }, {
146
- key: "_readIndices",
147
- value: function () {
148
- var _readIndices2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(opts) {
149
- 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;
150
-
151
- return _regenerator.default.wrap(function _callee3$(_context3) {
152
- while (1) {
153
- switch (_context3.prev = _context3.next) {
154
- case 0:
155
- _context3.next = 2;
156
- return this.getHeader(opts);
157
-
158
- case 2:
159
- _yield$this$getHeader = _context3.sent;
160
- extHeaderOffset = _yield$this$getHeader.extHeaderOffset;
161
- isBigEndian = _yield$this$getHeader.isBigEndian;
162
- _context3.next = 7;
163
- return this.bbi.read(Buffer.alloc(64), 0, 64, extHeaderOffset);
164
-
165
- case 7:
166
- _yield$this$bbi$read = _context3.sent;
167
- data = _yield$this$bbi$read.buffer;
168
- le = isBigEndian ? 'big' : 'little';
169
- ret = new _binaryParser.Parser().endianess(le).uint16('size').uint16('count').uint64('offset').parse(data).result;
170
- count = ret.count, offset = ret.offset; // no extra index is defined if count==0
171
-
172
- if (!(count === 0)) {
173
- _context3.next = 14;
174
- break;
175
- }
176
-
177
- return _context3.abrupt("return", []);
178
-
179
- case 14:
180
- blocklen = 20;
181
- len = blocklen * count;
182
- _context3.next = 18;
183
- return this.bbi.read(Buffer.alloc(len), 0, len, offset);
184
-
185
- case 18:
186
- _yield$this$bbi$read2 = _context3.sent;
187
- buffer = _yield$this$bbi$read2.buffer;
188
- extParser = new _binaryParser.Parser().endianess(le).int16('type').int16('fieldcount').uint64('offset').skip(4).int16('field');
189
- indices = [];
190
-
191
- for (i = 0; i < count; i += 1) {
192
- indices.push(extParser.parse(buffer.slice(i * blocklen)).result);
116
+ BigBed.prototype._readIndices = function (opts) {
117
+ return __awaiter(this, void 0, void 0, function () {
118
+ var _a, extHeaderOffset, isBigEndian, data, le, ret, count, offset, blocklen, len, buffer, extParser, indices, i;
119
+ return __generator(this, function (_b) {
120
+ switch (_b.label) {
121
+ case 0: return [4 /*yield*/, this.getHeader(opts)];
122
+ case 1:
123
+ _a = _b.sent(), extHeaderOffset = _a.extHeaderOffset, isBigEndian = _a.isBigEndian;
124
+ return [4 /*yield*/, this.bbi.read(Buffer.alloc(64), 0, 64, extHeaderOffset)];
125
+ case 2:
126
+ data = (_b.sent()).buffer;
127
+ le = isBigEndian ? 'big' : 'little';
128
+ ret = new binary_parser_1.Parser()
129
+ .endianess(le)
130
+ .uint16('size')
131
+ .uint16('count')
132
+ .uint64('offset')
133
+ .parse(data).result;
134
+ count = ret.count, offset = ret.offset;
135
+ // no extra index is defined if count==0
136
+ if (count === 0) {
137
+ return [2 /*return*/, []];
138
+ }
139
+ blocklen = 20;
140
+ len = blocklen * count;
141
+ return [4 /*yield*/, this.bbi.read(Buffer.alloc(len), 0, len, offset)];
142
+ case 3:
143
+ buffer = (_b.sent()).buffer;
144
+ extParser = new binary_parser_1.Parser()
145
+ .endianess(le)
146
+ .int16('type')
147
+ .int16('fieldcount')
148
+ .uint64('offset')
149
+ .skip(4)
150
+ .int16('field');
151
+ indices = [];
152
+ for (i = 0; i < count; i += 1) {
153
+ indices.push(extParser.parse(buffer.subarray(i * blocklen)).result);
154
+ }
155
+ return [2 /*return*/, indices];
193
156
  }
194
-
195
- return _context3.abrupt("return", indices);
196
-
197
- case 24:
198
- case "end":
199
- return _context3.stop();
200
- }
201
- }
202
- }, _callee3, this);
203
- }));
204
-
205
- function _readIndices(_x5) {
206
- return _readIndices2.apply(this, arguments);
207
- }
208
-
209
- return _readIndices;
210
- }()
157
+ });
158
+ });
159
+ };
211
160
  /*
212
161
  * perform a search in the bigbed extraIndex to find which blocks in the bigbed data to look for the
213
162
  * actual feature data
@@ -216,208 +165,106 @@ var BigBed = /*#__PURE__*/function (_BBI) {
216
165
  * @param opts - a SearchOptions argument with optional signal
217
166
  * @return a Promise for an array of bigbed block Loc entries
218
167
  */
219
-
220
- }, {
221
- key: "searchExtraIndexBlocks",
222
- value: function () {
223
- var _searchExtraIndexBlocks = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(name) {
224
- var _this2 = this;
225
-
226
- var opts,
227
- _yield$this$getHeader2,
228
- isBigEndian,
229
- indices,
230
- locs,
231
- _args6 = arguments;
232
-
233
- return _regenerator.default.wrap(function _callee6$(_context6) {
234
- while (1) {
235
- switch (_context6.prev = _context6.next) {
236
- case 0:
237
- opts = _args6.length > 1 && _args6[1] !== undefined ? _args6[1] : {};
238
- _context6.next = 3;
239
- return this.getHeader(opts);
240
-
241
- case 3:
242
- _yield$this$getHeader2 = _context6.sent;
243
- isBigEndian = _yield$this$getHeader2.isBigEndian;
244
- _context6.next = 7;
245
- return this.readIndices(opts);
246
-
247
- case 7:
248
- indices = _context6.sent;
249
-
250
- if (indices.length) {
251
- _context6.next = 10;
252
- break;
253
- }
254
-
255
- return _context6.abrupt("return", []);
256
-
257
- case 10:
258
- locs = indices.map( /*#__PURE__*/function () {
259
- var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(index) {
260
- var offset, field, _yield$_this2$bbi$rea, data, p, _p$parse$result, blockSize, keySize, valSize, bpt, bptReadNode, rootNodeOffset;
261
-
262
- return _regenerator.default.wrap(function _callee5$(_context5) {
263
- while (1) {
264
- switch (_context5.prev = _context5.next) {
265
- case 0:
266
- offset = index.offset, field = index.field;
267
- _context5.next = 3;
268
- return _this2.bbi.read(Buffer.alloc(32), 0, 32, offset, opts);
269
-
270
- case 3:
271
- _yield$_this2$bbi$rea = _context5.sent;
272
- data = _yield$_this2$bbi$rea.buffer;
273
- p = new _binaryParser.Parser().endianess(isBigEndian ? 'big' : 'little').int32('magic').int32('blockSize').int32('keySize').int32('valSize').uint64('itemCount');
274
- _p$parse$result = p.parse(data).result, blockSize = _p$parse$result.blockSize, keySize = _p$parse$result.keySize, valSize = _p$parse$result.valSize;
275
- bpt = new _binaryParser.Parser().endianess(isBigEndian ? 'big' : 'little').int8('nodeType').skip(1).int16('cnt').choice({
276
- tag: 'nodeType',
277
- choices: {
278
- 0: new _binaryParser.Parser().array('leafkeys', {
279
- length: 'cnt',
280
- type: new _binaryParser.Parser().string('key', {
281
- length: keySize,
282
- stripNull: true
283
- }).uint64('offset')
284
- }),
285
- 1: new _binaryParser.Parser().array('keys', {
286
- length: 'cnt',
287
- type: new _binaryParser.Parser().string('key', {
288
- length: keySize,
289
- stripNull: true
290
- }).uint64('offset').uint32('length').uint32('reserved')
291
- })
292
- }
293
- });
294
-
295
- bptReadNode = /*#__PURE__*/function () {
296
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(nodeOffset) {
297
- var len, _yield$_this2$bbi$rea2, buffer, node, lastOffset, i, key, _i;
298
-
299
- return _regenerator.default.wrap(function _callee4$(_context4) {
300
- while (1) {
301
- switch (_context4.prev = _context4.next) {
302
- case 0:
303
- len = 4 + blockSize * (keySize + valSize);
304
- _context4.next = 3;
305
- return _this2.bbi.read(Buffer.alloc(len), 0, len, nodeOffset, opts);
306
-
307
- case 3:
308
- _yield$_this2$bbi$rea2 = _context4.sent;
309
- buffer = _yield$_this2$bbi$rea2.buffer;
310
- node = bpt.parse(buffer).result;
311
-
312
- if (!node.leafkeys) {
313
- _context4.next = 17;
314
- break;
315
- }
316
-
317
- i = 0;
318
-
319
- case 8:
320
- if (!(i < node.leafkeys.length)) {
321
- _context4.next = 16;
322
- break;
323
- }
324
-
325
- key = node.leafkeys[i].key;
326
-
327
- if (!(name.localeCompare(key) < 0 && lastOffset)) {
328
- _context4.next = 12;
329
- break;
330
- }
331
-
332
- return _context4.abrupt("return", bptReadNode(lastOffset));
333
-
334
- case 12:
335
- lastOffset = node.leafkeys[i].offset;
336
-
337
- case 13:
338
- i += 1;
339
- _context4.next = 8;
340
- break;
341
-
342
- case 16:
343
- return _context4.abrupt("return", bptReadNode(lastOffset));
344
-
345
- case 17:
346
- _i = 0;
347
-
348
- case 18:
349
- if (!(_i < node.keys.length)) {
350
- _context4.next = 24;
351
- break;
352
- }
353
-
354
- if (!(node.keys[_i].key === name)) {
355
- _context4.next = 21;
356
- break;
357
- }
358
-
359
- return _context4.abrupt("return", _objectSpread(_objectSpread({}, node.keys[_i]), {}, {
360
- field: field
361
- }));
362
-
363
- case 21:
364
- _i += 1;
365
- _context4.next = 18;
366
- break;
367
-
368
- case 24:
369
- return _context4.abrupt("return", undefined);
370
-
371
- case 25:
372
- case "end":
373
- return _context4.stop();
374
- }
375
- }
376
- }, _callee4);
377
- }));
378
-
379
- return function bptReadNode(_x8) {
380
- return _ref2.apply(this, arguments);
381
- };
382
- }();
383
-
384
- rootNodeOffset = 32;
385
- return _context5.abrupt("return", bptReadNode(offset + rootNodeOffset));
386
-
387
- case 11:
388
- case "end":
389
- return _context5.stop();
168
+ BigBed.prototype.searchExtraIndexBlocks = function (name, opts) {
169
+ if (opts === void 0) { opts = {}; }
170
+ return __awaiter(this, void 0, void 0, function () {
171
+ var isBigEndian, indices, locs, _a;
172
+ var _this = this;
173
+ return __generator(this, function (_b) {
174
+ switch (_b.label) {
175
+ case 0: return [4 /*yield*/, this.getHeader(opts)];
176
+ case 1:
177
+ isBigEndian = (_b.sent()).isBigEndian;
178
+ return [4 /*yield*/, this.readIndices(opts)];
179
+ case 2:
180
+ indices = _b.sent();
181
+ if (!indices.length) {
182
+ return [2 /*return*/, []];
390
183
  }
391
- }
392
- }, _callee5);
393
- }));
394
-
395
- return function (_x7) {
396
- return _ref.apply(this, arguments);
397
- };
398
- }());
399
- _context6.t0 = filterUndef;
400
- _context6.next = 14;
401
- return Promise.all(locs);
402
-
403
- case 14:
404
- _context6.t1 = _context6.sent;
405
- return _context6.abrupt("return", (0, _context6.t0)(_context6.t1));
406
-
407
- case 16:
408
- case "end":
409
- return _context6.stop();
410
- }
411
- }
412
- }, _callee6, this);
413
- }));
414
-
415
- function searchExtraIndexBlocks(_x6) {
416
- return _searchExtraIndexBlocks.apply(this, arguments);
417
- }
418
-
419
- return searchExtraIndexBlocks;
420
- }()
184
+ locs = indices.map(function (index) { return __awaiter(_this, void 0, void 0, function () {
185
+ var offset, field, data, p, _a, blockSize, keySize, valSize, bpt, bptReadNode, rootNodeOffset;
186
+ var _this = this;
187
+ return __generator(this, function (_b) {
188
+ switch (_b.label) {
189
+ case 0:
190
+ offset = index.offset, field = index.field;
191
+ return [4 /*yield*/, this.bbi.read(Buffer.alloc(32), 0, 32, offset, opts)];
192
+ case 1:
193
+ data = (_b.sent()).buffer;
194
+ p = new binary_parser_1.Parser()
195
+ .endianess(isBigEndian ? 'big' : 'little')
196
+ .int32('magic')
197
+ .int32('blockSize')
198
+ .int32('keySize')
199
+ .int32('valSize')
200
+ .uint64('itemCount');
201
+ _a = p.parse(data).result, blockSize = _a.blockSize, keySize = _a.keySize, valSize = _a.valSize;
202
+ bpt = new binary_parser_1.Parser()
203
+ .endianess(isBigEndian ? 'big' : 'little')
204
+ .int8('nodeType')
205
+ .skip(1)
206
+ .int16('cnt')
207
+ .choice({
208
+ tag: 'nodeType',
209
+ choices: {
210
+ 0: new binary_parser_1.Parser().array('leafkeys', {
211
+ length: 'cnt',
212
+ type: new binary_parser_1.Parser()
213
+ .string('key', { length: keySize, stripNull: true })
214
+ .uint64('offset'),
215
+ }),
216
+ 1: new binary_parser_1.Parser().array('keys', {
217
+ length: 'cnt',
218
+ type: new binary_parser_1.Parser()
219
+ .string('key', { length: keySize, stripNull: true })
220
+ .uint64('offset')
221
+ .uint32('length')
222
+ .uint32('reserved'),
223
+ }),
224
+ },
225
+ });
226
+ bptReadNode = function (nodeOffset) { return __awaiter(_this, void 0, void 0, function () {
227
+ var len, buffer, node, lastOffset, i, key, i;
228
+ return __generator(this, function (_a) {
229
+ switch (_a.label) {
230
+ case 0:
231
+ len = 4 + blockSize * (keySize + valSize);
232
+ return [4 /*yield*/, this.bbi.read(Buffer.alloc(len), 0, len, nodeOffset, opts)];
233
+ case 1:
234
+ buffer = (_a.sent()).buffer;
235
+ node = bpt.parse(buffer).result;
236
+ if (node.leafkeys) {
237
+ lastOffset = void 0;
238
+ for (i = 0; i < node.leafkeys.length; i += 1) {
239
+ key = node.leafkeys[i].key;
240
+ if (name.localeCompare(key) < 0 && lastOffset) {
241
+ return [2 /*return*/, bptReadNode(lastOffset)];
242
+ }
243
+ lastOffset = node.leafkeys[i].offset;
244
+ }
245
+ return [2 /*return*/, bptReadNode(lastOffset)];
246
+ }
247
+ for (i = 0; i < node.keys.length; i += 1) {
248
+ if (node.keys[i].key === name) {
249
+ return [2 /*return*/, __assign(__assign({}, node.keys[i]), { field: field })];
250
+ }
251
+ }
252
+ return [2 /*return*/, undefined];
253
+ }
254
+ });
255
+ }); };
256
+ rootNodeOffset = 32;
257
+ return [2 /*return*/, bptReadNode(offset + rootNodeOffset)];
258
+ }
259
+ });
260
+ }); });
261
+ _a = filterUndef;
262
+ return [4 /*yield*/, Promise.all(locs)];
263
+ case 3: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];
264
+ }
265
+ });
266
+ });
267
+ };
421
268
  /*
422
269
  * retrieve the features from the bigbed data that were found through the lookup of the extraIndex
423
270
  * note that there can be multiple extraIndex, see the BigBed specification and the -extraIndex argument to bedToBigBed
@@ -426,80 +273,41 @@ var BigBed = /*#__PURE__*/function (_BBI) {
426
273
  * @param opts - a SearchOptions argument with optional signal
427
274
  * @return a Promise for an array of Feature
428
275
  */
429
-
430
- }, {
431
- key: "searchExtraIndex",
432
- value: function () {
433
- var _searchExtraIndex = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(name) {
434
- var opts,
435
- blocks,
436
- view,
437
- res,
438
- ret,
439
- _args7 = arguments;
440
- return _regenerator.default.wrap(function _callee7$(_context7) {
441
- while (1) {
442
- switch (_context7.prev = _context7.next) {
443
- case 0:
444
- opts = _args7.length > 1 && _args7[1] !== undefined ? _args7[1] : {};
445
- _context7.next = 3;
446
- return this.searchExtraIndexBlocks(name, opts);
447
-
448
- case 3:
449
- blocks = _context7.sent;
450
-
451
- if (blocks.length) {
452
- _context7.next = 6;
453
- break;
276
+ BigBed.prototype.searchExtraIndex = function (name, opts) {
277
+ if (opts === void 0) { opts = {}; }
278
+ return __awaiter(this, void 0, void 0, function () {
279
+ var blocks, view, res, ret;
280
+ return __generator(this, function (_a) {
281
+ switch (_a.label) {
282
+ case 0: return [4 /*yield*/, this.searchExtraIndexBlocks(name, opts)];
283
+ case 1:
284
+ blocks = _a.sent();
285
+ if (!blocks.length) {
286
+ return [2 /*return*/, []];
287
+ }
288
+ return [4 /*yield*/, this.getUnzoomedView(opts)];
289
+ case 2:
290
+ view = _a.sent();
291
+ res = blocks.map(function (block) {
292
+ return new rxjs_1.Observable(function (observer) {
293
+ view.readFeatures(observer, [block], opts);
294
+ }).pipe((0, operators_1.reduce)(function (acc, curr) { return acc.concat(curr); }), (0, operators_1.map)(function (x) {
295
+ for (var i = 0; i < x.length; i += 1) {
296
+ x[i].field = block.field;
297
+ }
298
+ return x;
299
+ }));
300
+ });
301
+ return [4 /*yield*/, rxjs_1.merge.apply(void 0, res).toPromise()];
302
+ case 3:
303
+ ret = _a.sent();
304
+ return [2 /*return*/, ret.filter(function (f) {
305
+ return f.rest.split('\t')[f.field - 3] === name;
306
+ })];
454
307
  }
455
-
456
- return _context7.abrupt("return", []);
457
-
458
- case 6:
459
- _context7.next = 8;
460
- return this.getUnzoomedView(opts);
461
-
462
- case 8:
463
- view = _context7.sent;
464
- res = blocks.map(function (block) {
465
- return new _rxjs.Observable(function (observer) {
466
- view.readFeatures(observer, [block], opts);
467
- }).pipe((0, _operators.reduce)(function (acc, curr) {
468
- return acc.concat(curr);
469
- }), (0, _operators.map)(function (x) {
470
- for (var i = 0; i < x.length; i += 1) {
471
- x[i].field = block.field; // eslint-disable-line
472
- }
473
-
474
- return x;
475
- }));
476
- });
477
- _context7.next = 12;
478
- return _rxjs.merge.apply(void 0, (0, _toConsumableArray2.default)(res)).toPromise();
479
-
480
- case 12:
481
- ret = _context7.sent;
482
- return _context7.abrupt("return", ret.filter(function (f) {
483
- return f.rest.split('\t')[f.field - 3] === name;
484
- }));
485
-
486
- case 14:
487
- case "end":
488
- return _context7.stop();
489
- }
490
- }
491
- }, _callee7, this);
492
- }));
493
-
494
- function searchExtraIndex(_x9) {
495
- return _searchExtraIndex.apply(this, arguments);
496
- }
497
-
498
- return searchExtraIndex;
499
- }()
500
- }]);
501
- return BigBed;
502
- }(_bbi.BBI);
503
-
308
+ });
309
+ });
310
+ };
311
+ return BigBed;
312
+ }(bbi_1.BBI));
504
313
  exports.BigBed = BigBed;
505
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iaWdiZWQudHMiXSwibmFtZXMiOlsiZmlsdGVyVW5kZWYiLCJ0cyIsImZpbHRlciIsInQiLCJCaWdCZWQiLCJvcHRzIiwiQWJvcnRhYmxlUHJvbWlzZUNhY2hlIiwiY2FjaGUiLCJRdWlja0xSVSIsIm1heFNpemUiLCJmaWxsIiwiYXJncyIsInNpZ25hbCIsIl9yZWFkSW5kaWNlcyIsIm9wdGlvbnMiLCJyZWFkSW5kaWNlc0NhY2hlIiwiZ2V0IiwiSlNPTiIsInN0cmluZ2lmeSIsInNjYWxlIiwiZ2V0VW56b29tZWRWaWV3IiwiZ2V0SGVhZGVyIiwiZXh0SGVhZGVyT2Zmc2V0IiwiaXNCaWdFbmRpYW4iLCJiYmkiLCJyZWFkIiwiQnVmZmVyIiwiYWxsb2MiLCJkYXRhIiwiYnVmZmVyIiwibGUiLCJyZXQiLCJQYXJzZXIiLCJlbmRpYW5lc3MiLCJ1aW50MTYiLCJ1aW50NjQiLCJwYXJzZSIsInJlc3VsdCIsImNvdW50Iiwib2Zmc2V0IiwiYmxvY2tsZW4iLCJsZW4iLCJleHRQYXJzZXIiLCJpbnQxNiIsInNraXAiLCJpbmRpY2VzIiwiaSIsInB1c2giLCJzbGljZSIsIm5hbWUiLCJyZWFkSW5kaWNlcyIsImxlbmd0aCIsImxvY3MiLCJtYXAiLCJpbmRleCIsImZpZWxkIiwicCIsImludDMyIiwiYmxvY2tTaXplIiwia2V5U2l6ZSIsInZhbFNpemUiLCJicHQiLCJpbnQ4IiwiY2hvaWNlIiwidGFnIiwiY2hvaWNlcyIsImFycmF5IiwidHlwZSIsInN0cmluZyIsInN0cmlwTnVsbCIsInVpbnQzMiIsImJwdFJlYWROb2RlIiwibm9kZU9mZnNldCIsIm5vZGUiLCJsZWFma2V5cyIsImtleSIsImxvY2FsZUNvbXBhcmUiLCJsYXN0T2Zmc2V0Iiwia2V5cyIsInVuZGVmaW5lZCIsInJvb3ROb2RlT2Zmc2V0IiwiUHJvbWlzZSIsImFsbCIsInNlYXJjaEV4dHJhSW5kZXhCbG9ja3MiLCJibG9ja3MiLCJ2aWV3IiwicmVzIiwiYmxvY2siLCJPYnNlcnZhYmxlIiwib2JzZXJ2ZXIiLCJyZWFkRmVhdHVyZXMiLCJwaXBlIiwiYWNjIiwiY3VyciIsImNvbmNhdCIsIngiLCJtZXJnZSIsInRvUHJvbWlzZSIsImYiLCJyZXN0Iiwic3BsaXQiLCJCQkkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7O0FBaUJPLFNBQVNBLFdBQVQsQ0FBd0JDLEVBQXhCLEVBQW9EO0FBQ3pELFNBQU9BLEVBQUUsQ0FBQ0MsTUFBSCxDQUFVLFVBQUNDLENBQUQ7QUFBQSxXQUE4QixDQUFDLENBQUNBLENBQWhDO0FBQUEsR0FBVixDQUFQO0FBQ0Q7O0lBRVlDLE07Ozs7O0FBUVgsa0JBQW1CQyxJQUFuQixFQUE4QjtBQUFBOztBQUFBO0FBQzVCLDhCQUFNQSxJQUFOO0FBRDRCLG1HQVBKLElBQUlDLDhCQUFKLENBQTBCO0FBQ2xEQyxNQUFBQSxLQUFLLEVBQUUsSUFBSUMsaUJBQUosQ0FBYTtBQUFFQyxRQUFBQSxPQUFPLEVBQUU7QUFBWCxPQUFiLENBRDJDO0FBRWxEQyxNQUFBQSxJQUFJO0FBQUEsNEZBQUUsaUJBQU9DLElBQVAsRUFBa0JDLE1BQWxCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtREFDRyxNQUFLQyxZQUFMLGlDQUF1QkYsSUFBdkI7QUFBNkJDLG9CQUFBQSxNQUFNLEVBQU5BO0FBQTdCLHFCQURIOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQUY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFGOEMsS0FBMUIsQ0FPSTtBQUFBO0FBRTdCOzs7O2tDQUUyRDtBQUFBLFVBQXpDUCxJQUF5Qyx1RUFBSixFQUFJO0FBQzFELFVBQU1TLE9BQU8sR0FBRyxhQUFhVCxJQUFiLEdBQW9CO0FBQUVPLFFBQUFBLE1BQU0sRUFBRVA7QUFBVixPQUFwQixHQUF1Q0EsSUFBdkQ7QUFDQSxhQUFPLEtBQUtVLGdCQUFMLENBQXNCQyxHQUF0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QU9BLENBQUMsQ0FBQ0MsSUFBRixDQUFPQyxLQUFQLENBQWEsSUFBYixFQUFtQkYsQ0FBQyxDQUFDM0MsS0FBRixHQUFVLENBQTdCLE1BQW9DTixJQUEzQztBQUNELGlCQUZNLEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQS9LaUJvRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnQGdtb2QvYmluYXJ5LXBhcnNlcidcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAsIHJlZHVjZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IEFib3J0YWJsZVByb21pc2VDYWNoZSBmcm9tICdhYm9ydGFibGUtcHJvbWlzZS1jYWNoZSdcbmltcG9ydCBRdWlja0xSVSBmcm9tICdxdWljay1scnUnXG5cbmltcG9ydCB7IEJCSSwgRmVhdHVyZSwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2JiaSdcbmltcG9ydCB7IEJsb2NrVmlldyB9IGZyb20gJy4vYmxvY2tWaWV3J1xuXG5pbnRlcmZhY2UgTG9jIHtcbiAga2V5OiBzdHJpbmdcbiAgb2Zmc2V0OiBudW1iZXJcbiAgbGVuZ3RoOiBudW1iZXJcbiAgZmllbGQ/OiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIEluZGV4IHtcbiAgdHlwZTogbnVtYmVyXG4gIGZpZWxkY291bnQ6IG51bWJlclxuICBvZmZzZXQ6IG51bWJlclxuICBmaWVsZDogbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJVbmRlZjxUPih0czogKFQgfCB1bmRlZmluZWQpW10pOiBUW10ge1xuICByZXR1cm4gdHMuZmlsdGVyKCh0OiBUIHwgdW5kZWZpbmVkKTogdCBpcyBUID0+ICEhdClcbn1cblxuZXhwb3J0IGNsYXNzIEJpZ0JlZCBleHRlbmRzIEJCSSB7XG4gIHB1YmxpYyByZWFkSW5kaWNlc0NhY2hlID0gbmV3IEFib3J0YWJsZVByb21pc2VDYWNoZSh7XG4gICAgY2FjaGU6IG5ldyBRdWlja0xSVSh7IG1heFNpemU6IDEgfSksXG4gICAgZmlsbDogYXN5bmMgKGFyZ3M6IGFueSwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkSW5kaWNlcyh7IC4uLmFyZ3MsIHNpZ25hbCB9KVxuICAgIH0sXG4gIH0pXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdHM6IGFueSkge1xuICAgIHN1cGVyKG9wdHMpXG4gIH1cblxuICBwdWJsaWMgcmVhZEluZGljZXMob3B0czogQWJvcnRTaWduYWwgfCBSZXF1ZXN0T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICdhYm9ydGVkJyBpbiBvcHRzID8geyBzaWduYWw6IG9wdHMgfSA6IG9wdHNcbiAgICByZXR1cm4gdGhpcy5yZWFkSW5kaWNlc0NhY2hlLmdldChKU09OLnN0cmluZ2lmeShvcHRpb25zKSwgb3B0aW9ucywgb3B0aW9ucy5zaWduYWwpXG4gIH1cblxuICAvKlxuICAgKiByZXRyaWV2ZSB1bnpvb21lZCB2aWV3IGZvciBhbnkgc2NhbGVcbiAgICogQHBhcmFtIHNjYWxlIC0gdW51c2VkXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIGFuIG9wdGlvbmFsIEFib3J0U2lnbmFsIHRvIGtpbGwgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gcHJvbWlzZSBmb3IgYSBCbG9ja1ZpZXdcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRWaWV3KHNjYWxlOiBudW1iZXIsIG9wdHM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxCbG9ja1ZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRVbnpvb21lZFZpZXcob3B0cylcbiAgfVxuXG4gIC8qXG4gICAqIHBhcnNlIHRoZSBiaWdiZWQgZXh0cmFJbmRleCBmaWVsZHNcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIHRvIGFib3J0IG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIGEgUHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgSW5kZXggZGF0YSBzdHJ1Y3R1cmUgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGV4dHJhSW5kZXhlcyBpbiBhIGJpZ2JlZCwgc2VlIGJlZFRvQmlnQmVkIGRvY3VtZW50YXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3JlYWRJbmRpY2VzKG9wdHM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxJbmRleFtdPiB7XG4gICAgY29uc3QgeyBleHRIZWFkZXJPZmZzZXQsIGlzQmlnRW5kaWFuIH0gPSBhd2FpdCB0aGlzLmdldEhlYWRlcihvcHRzKVxuICAgIGNvbnN0IHsgYnVmZmVyOiBkYXRhIH0gPSBhd2FpdCB0aGlzLmJiaS5yZWFkKEJ1ZmZlci5hbGxvYyg2NCksIDAsIDY0LCBleHRIZWFkZXJPZmZzZXQpXG4gICAgY29uc3QgbGUgPSBpc0JpZ0VuZGlhbiA/ICdiaWcnIDogJ2xpdHRsZSdcbiAgICBjb25zdCByZXQgPSBuZXcgUGFyc2VyKClcbiAgICAgIC5lbmRpYW5lc3MobGUpXG4gICAgICAudWludDE2KCdzaXplJylcbiAgICAgIC51aW50MTYoJ2NvdW50JylcbiAgICAgIC51aW50NjQoJ29mZnNldCcpXG4gICAgICAucGFyc2UoZGF0YSkucmVzdWx0XG4gICAgY29uc3QgeyBjb3VudCwgb2Zmc2V0IH0gPSByZXRcblxuICAgIC8vIG5vIGV4dHJhIGluZGV4IGlzIGRlZmluZWQgaWYgY291bnQ9PTBcbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IGJsb2NrbGVuID0gMjBcbiAgICBjb25zdCBsZW4gPSBibG9ja2xlbiAqIGNvdW50XG4gICAgY29uc3QgeyBidWZmZXIgfSA9IGF3YWl0IHRoaXMuYmJpLnJlYWQoQnVmZmVyLmFsbG9jKGxlbiksIDAsIGxlbiwgb2Zmc2V0KVxuICAgIGNvbnN0IGV4dFBhcnNlciA9IG5ldyBQYXJzZXIoKVxuICAgICAgLmVuZGlhbmVzcyhsZSlcbiAgICAgIC5pbnQxNigndHlwZScpXG4gICAgICAuaW50MTYoJ2ZpZWxkY291bnQnKVxuICAgICAgLnVpbnQ2NCgnb2Zmc2V0JylcbiAgICAgIC5za2lwKDQpXG4gICAgICAuaW50MTYoJ2ZpZWxkJylcbiAgICBjb25zdCBpbmRpY2VzID0gW11cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMSkge1xuICAgICAgaW5kaWNlcy5wdXNoKGV4dFBhcnNlci5wYXJzZShidWZmZXIuc2xpY2UoaSAqIGJsb2NrbGVuKSkucmVzdWx0KVxuICAgIH1cbiAgICByZXR1cm4gaW5kaWNlc1xuICB9XG5cbiAgLypcbiAgICogcGVyZm9ybSBhIHNlYXJjaCBpbiB0aGUgYmlnYmVkIGV4dHJhSW5kZXggdG8gZmluZCB3aGljaCBibG9ja3MgaW4gdGhlIGJpZ2JlZCBkYXRhIHRvIGxvb2sgZm9yIHRoZVxuICAgKiBhY3R1YWwgZmVhdHVyZSBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcGFyYW0gb3B0cyAtIGEgU2VhcmNoT3B0aW9ucyBhcmd1bWVudCB3aXRoIG9wdGlvbmFsIHNpZ25hbFxuICAgKiBAcmV0dXJuIGEgUHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgYmlnYmVkIGJsb2NrIExvYyBlbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlYXJjaEV4dHJhSW5kZXhCbG9ja3MobmFtZTogc3RyaW5nLCBvcHRzOiBSZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxMb2NbXT4ge1xuICAgIGNvbnN0IHsgaXNCaWdFbmRpYW4gfSA9IGF3YWl0IHRoaXMuZ2V0SGVhZGVyKG9wdHMpXG4gICAgY29uc3QgaW5kaWNlcyA9IGF3YWl0IHRoaXMucmVhZEluZGljZXMob3B0cylcbiAgICBpZiAoIWluZGljZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgY29uc3QgbG9jcyA9IGluZGljZXMubWFwKFxuICAgICAgYXN5bmMgKGluZGV4OiBhbnkpOiBQcm9taXNlPExvYyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCB7IG9mZnNldCwgZmllbGQgfSA9IGluZGV4XG4gICAgICAgIGNvbnN0IHsgYnVmZmVyOiBkYXRhIH0gPSBhd2FpdCB0aGlzLmJiaS5yZWFkKEJ1ZmZlci5hbGxvYygzMiksIDAsIDMyLCBvZmZzZXQsIG9wdHMpXG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUGFyc2VyKClcbiAgICAgICAgICAuZW5kaWFuZXNzKGlzQmlnRW5kaWFuID8gJ2JpZycgOiAnbGl0dGxlJylcbiAgICAgICAgICAuaW50MzIoJ21hZ2ljJylcbiAgICAgICAgICAuaW50MzIoJ2Jsb2NrU2l6ZScpXG4gICAgICAgICAgLmludDMyKCdrZXlTaXplJylcbiAgICAgICAgICAuaW50MzIoJ3ZhbFNpemUnKVxuICAgICAgICAgIC51aW50NjQoJ2l0ZW1Db3VudCcpXG5cbiAgICAgICAgY29uc3QgeyBibG9ja1NpemUsIGtleVNpemUsIHZhbFNpemUgfSA9IHAucGFyc2UoZGF0YSkucmVzdWx0XG4gICAgICAgIGNvbnN0IGJwdCA9IG5ldyBQYXJzZXIoKVxuICAgICAgICAgIC5lbmRpYW5lc3MoaXNCaWdFbmRpYW4gPyAnYmlnJyA6ICdsaXR0bGUnKVxuICAgICAgICAgIC5pbnQ4KCdub2RlVHlwZScpXG4gICAgICAgICAgLnNraXAoMSlcbiAgICAgICAgICAuaW50MTYoJ2NudCcpXG4gICAgICAgICAgLmNob2ljZSh7XG4gICAgICAgICAgICB0YWc6ICdub2RlVHlwZScsXG4gICAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAgIDA6IG5ldyBQYXJzZXIoKS5hcnJheSgnbGVhZmtleXMnLCB7XG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAnY250JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBuZXcgUGFyc2VyKClcbiAgICAgICAgICAgICAgICAgIC5zdHJpbmcoJ2tleScsIHsgbGVuZ3RoOiBrZXlTaXplLCBzdHJpcE51bGw6IHRydWUgfSlcbiAgICAgICAgICAgICAgICAgIC51aW50NjQoJ29mZnNldCcpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgMTogbmV3IFBhcnNlcigpLmFycmF5KCdrZXlzJywge1xuICAgICAgICAgICAgICAgIGxlbmd0aDogJ2NudCcsXG4gICAgICAgICAgICAgICAgdHlwZTogbmV3IFBhcnNlcigpXG4gICAgICAgICAgICAgICAgICAuc3RyaW5nKCdrZXknLCB7IGxlbmd0aDoga2V5U2l6ZSwgc3RyaXBOdWxsOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAudWludDY0KCdvZmZzZXQnKVxuICAgICAgICAgICAgICAgICAgLnVpbnQzMignbGVuZ3RoJylcbiAgICAgICAgICAgICAgICAgIC51aW50MzIoJ3Jlc2VydmVkJyksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGJwdFJlYWROb2RlID0gYXN5bmMgKG5vZGVPZmZzZXQ6IG51bWJlcik6IFByb21pc2U8TG9jIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgICAgY29uc3QgbGVuID0gNCArIGJsb2NrU2l6ZSAqIChrZXlTaXplICsgdmFsU2l6ZSlcbiAgICAgICAgICBjb25zdCB7IGJ1ZmZlciB9ID0gYXdhaXQgdGhpcy5iYmkucmVhZChCdWZmZXIuYWxsb2MobGVuKSwgMCwgbGVuLCBub2RlT2Zmc2V0LCBvcHRzKVxuICAgICAgICAgIGNvbnN0IG5vZGUgPSBicHQucGFyc2UoYnVmZmVyKS5yZXN1bHRcbiAgICAgICAgICBpZiAobm9kZS5sZWFma2V5cykge1xuICAgICAgICAgICAgbGV0IGxhc3RPZmZzZXRcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5sZWFma2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICBjb25zdCB7IGtleSB9ID0gbm9kZS5sZWFma2V5c1tpXVxuICAgICAgICAgICAgICBpZiAobmFtZS5sb2NhbGVDb21wYXJlKGtleSkgPCAwICYmIGxhc3RPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnB0UmVhZE5vZGUobGFzdE9mZnNldClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gbm9kZS5sZWFma2V5c1tpXS5vZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBicHRSZWFkTm9kZShsYXN0T2Zmc2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUua2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUua2V5c1tpXS5rZXkgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ubm9kZS5rZXlzW2ldLCBmaWVsZCB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvb3ROb2RlT2Zmc2V0ID0gMzJcbiAgICAgICAgcmV0dXJuIGJwdFJlYWROb2RlKG9mZnNldCArIHJvb3ROb2RlT2Zmc2V0KVxuICAgICAgfSxcbiAgICApXG4gICAgcmV0dXJuIGZpbHRlclVuZGVmKGF3YWl0IFByb21pc2UuYWxsKGxvY3MpKVxuICB9XG5cbiAgLypcbiAgICogcmV0cmlldmUgdGhlIGZlYXR1cmVzIGZyb20gdGhlIGJpZ2JlZCBkYXRhIHRoYXQgd2VyZSBmb3VuZCB0aHJvdWdoIHRoZSBsb29rdXAgb2YgdGhlIGV4dHJhSW5kZXhcbiAgICogbm90ZSB0aGF0IHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBleHRyYUluZGV4LCBzZWUgdGhlIEJpZ0JlZCBzcGVjaWZpY2F0aW9uIGFuZCB0aGUgLWV4dHJhSW5kZXggYXJndW1lbnQgdG8gYmVkVG9CaWdCZWRcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEBwYXJhbSBvcHRzIC0gYSBTZWFyY2hPcHRpb25zIGFyZ3VtZW50IHdpdGggb3B0aW9uYWwgc2lnbmFsXG4gICAqIEByZXR1cm4gYSBQcm9taXNlIGZvciBhbiBhcnJheSBvZiBGZWF0dXJlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VhcmNoRXh0cmFJbmRleChuYW1lOiBzdHJpbmcsIG9wdHM6IFJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPEZlYXR1cmVbXT4ge1xuICAgIGNvbnN0IGJsb2NrcyA9IGF3YWl0IHRoaXMuc2VhcmNoRXh0cmFJbmRleEJsb2NrcyhuYW1lLCBvcHRzKVxuICAgIGlmICghYmxvY2tzLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgY29uc3QgdmlldyA9IGF3YWl0IHRoaXMuZ2V0VW56b29tZWRWaWV3KG9wdHMpXG4gICAgY29uc3QgcmVzID0gYmxvY2tzLm1hcChibG9jayA9PiB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxGZWF0dXJlW10+KSA9PiB7XG4gICAgICAgIHZpZXcucmVhZEZlYXR1cmVzKG9ic2VydmVyLCBbYmxvY2tdLCBvcHRzKVxuICAgICAgfSkucGlwZShcbiAgICAgICAgcmVkdWNlKChhY2MsIGN1cnIpID0+IGFjYy5jb25jYXQoY3VycikpLFxuICAgICAgICBtYXAoeCA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgeFtpXS5maWVsZCA9IGJsb2NrLmZpZWxkIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHhcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSlcbiAgICBjb25zdCByZXQgPSBhd2FpdCBtZXJnZSguLi5yZXMpLnRvUHJvbWlzZSgpXG4gICAgcmV0dXJuIHJldC5maWx0ZXIoKGY6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGYucmVzdC5zcGxpdCgnXFx0JylbZi5maWVsZCAtIDNdID09PSBuYW1lXG4gICAgfSlcbiAgfVxufVxuIl19