@gmod/tabix 1.4.4 → 1.5.1

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/csi.js CHANGED
@@ -1,577 +1,345 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
4
-
5
- var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property");
6
-
7
- _Object$defineProperty2(exports, "__esModule", {
8
- value: true
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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
31
+ }) : (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ o[k2] = m[k];
34
+ }));
35
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37
+ }) : function(o, v) {
38
+ o["default"] = v;
9
39
  });
10
-
11
- exports.default = void 0;
12
-
13
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property"));
14
-
15
- var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-properties"));
16
-
17
- var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors"));
18
-
19
- var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"));
20
-
21
- var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols"));
22
-
23
- var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
24
-
25
- var _construct = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/construct"));
26
-
27
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
28
-
29
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
30
-
31
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
32
-
33
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
34
-
35
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
36
-
37
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
38
-
39
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
40
-
41
- var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
42
-
43
- var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
44
-
45
- var _long = _interopRequireDefault(require("long"));
46
-
47
- var _bgzfFilehandle = require("@gmod/bgzf-filehandle");
48
-
49
- var _virtualOffset = require("./virtualOffset");
50
-
51
- var _chunk = _interopRequireDefault(require("./chunk"));
52
-
53
- var _util = require("./util");
54
-
55
- var _indexFile = _interopRequireDefault(require("./indexFile"));
56
-
57
- function ownKeys(object, enumerableOnly) { var keys = (0, _keys.default)(object); if (_getOwnPropertySymbols.default) { var symbols = (0, _getOwnPropertySymbols.default)(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return (0, _getOwnPropertyDescriptor.default)(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
58
-
59
- 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, _defineProperty3.default)(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors.default) { (0, _defineProperties.default)(target, (0, _getOwnPropertyDescriptors.default)(source)); } else { ownKeys(Object(source)).forEach(function (key) { (0, _defineProperty2.default)(target, key, (0, _getOwnPropertyDescriptor.default)(source, key)); }); } } return target; }
60
-
61
- function _createSuper(Derived) { return function () { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = (0, _construct.default)(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
62
-
63
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_construct.default) return false; if (_construct.default.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call((0, _construct.default)(Date, [], function () {})); return true; } catch (e) { return false; } }
64
-
40
+ var __importStar = (this && this.__importStar) || function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
48
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
49
+ return new (P || (P = Promise))(function (resolve, reject) {
50
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
51
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
52
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
53
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
54
+ });
55
+ };
56
+ var __generator = (this && this.__generator) || function (thisArg, body) {
57
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
58
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
59
+ function verb(n) { return function (v) { return step([n, v]); }; }
60
+ function step(op) {
61
+ if (f) throw new TypeError("Generator is already executing.");
62
+ while (_) try {
63
+ 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;
64
+ if (y = 0, t) op = [op[0] & 2, t.value];
65
+ switch (op[0]) {
66
+ case 0: case 1: t = op; break;
67
+ case 4: _.label++; return { value: op[1], done: false };
68
+ case 5: _.label++; y = op[1]; op = [0]; continue;
69
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
70
+ default:
71
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
72
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
73
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
74
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
75
+ if (t[2]) _.ops.pop();
76
+ _.trys.pop(); continue;
77
+ }
78
+ op = body.call(thisArg, _);
79
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
80
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
81
+ }
82
+ };
83
+ var __importDefault = (this && this.__importDefault) || function (mod) {
84
+ return (mod && mod.__esModule) ? mod : { "default": mod };
85
+ };
86
+ Object.defineProperty(exports, "__esModule", { value: true });
87
+ var long_1 = __importDefault(require("long"));
88
+ var bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
89
+ var virtualOffset_1 = __importStar(require("./virtualOffset"));
90
+ var chunk_1 = __importDefault(require("./chunk"));
91
+ var util_1 = require("./util");
92
+ var indexFile_1 = __importDefault(require("./indexFile"));
65
93
  var CSI1_MAGIC = 21582659; // CSI\1
66
-
67
94
  var CSI2_MAGIC = 38359875; // CSI\2
68
-
69
95
  function lshift(num, bits) {
70
- return num * Math.pow(2, bits);
96
+ return num * Math.pow(2, bits);
71
97
  }
72
-
73
98
  function rshift(num, bits) {
74
- return Math.floor(num / Math.pow(2, bits));
99
+ return Math.floor(num / Math.pow(2, bits));
75
100
  }
76
-
77
- var CSI = /*#__PURE__*/function (_IndexFile) {
78
- (0, _inherits2.default)(CSI, _IndexFile);
79
-
80
- var _super = _createSuper(CSI);
81
-
82
- function CSI(args) {
83
- var _this;
84
-
85
- (0, _classCallCheck2.default)(this, CSI);
86
- _this = _super.call(this, args);
87
- (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "maxBinNumber", void 0);
88
- (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "depth", void 0);
89
- (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "minShift", void 0);
90
- _this.maxBinNumber = 0;
91
- _this.depth = 0;
92
- _this.minShift = 0;
93
- return _this;
94
- }
95
-
96
- (0, _createClass2.default)(CSI, [{
97
- key: "lineCount",
98
- value: function () {
99
- var _lineCount = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(refName) {
100
- var opts,
101
- indexData,
102
- refId,
103
- idx,
104
- stats,
105
- _args = arguments;
106
- return _regenerator.default.wrap(function _callee$(_context) {
107
- while (1) {
108
- switch (_context.prev = _context.next) {
109
- case 0:
110
- opts = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};
111
- _context.next = 3;
112
- return this.parse(opts);
113
-
114
- case 3:
115
- indexData = _context.sent;
116
-
117
- if (indexData) {
118
- _context.next = 6;
119
- break;
120
- }
121
-
122
- return _context.abrupt("return", -1);
123
-
124
- case 6:
125
- refId = indexData.refNameToId[refName];
126
- idx = indexData.indices[refId];
127
-
128
- if (idx) {
129
- _context.next = 10;
130
- break;
131
- }
132
-
133
- return _context.abrupt("return", -1);
134
-
135
- case 10:
136
- stats = indexData.indices[refId].stats;
137
-
138
- if (!stats) {
139
- _context.next = 13;
140
- break;
101
+ var CSI = /** @class */ (function (_super) {
102
+ __extends(CSI, _super);
103
+ function CSI(args) {
104
+ var _this = _super.call(this, args) || this;
105
+ _this.maxBinNumber = 0;
106
+ _this.depth = 0;
107
+ _this.minShift = 0;
108
+ return _this;
109
+ }
110
+ CSI.prototype.lineCount = function (refName, opts) {
111
+ if (opts === void 0) { opts = {}; }
112
+ return __awaiter(this, void 0, void 0, function () {
113
+ var indexData, refId, idx, stats;
114
+ return __generator(this, function (_a) {
115
+ switch (_a.label) {
116
+ case 0: return [4 /*yield*/, this.parse(opts)];
117
+ case 1:
118
+ indexData = _a.sent();
119
+ if (!indexData) {
120
+ return [2 /*return*/, -1];
121
+ }
122
+ refId = indexData.refNameToId[refName];
123
+ idx = indexData.indices[refId];
124
+ if (!idx) {
125
+ return [2 /*return*/, -1];
126
+ }
127
+ stats = indexData.indices[refId].stats;
128
+ if (stats) {
129
+ return [2 /*return*/, stats.lineCount];
130
+ }
131
+ return [2 /*return*/, -1];
141
132
  }
142
-
143
- return _context.abrupt("return", stats.lineCount);
144
-
145
- case 13:
146
- return _context.abrupt("return", -1);
147
-
148
- case 14:
149
- case "end":
150
- return _context.stop();
151
- }
152
- }
153
- }, _callee, this);
154
- }));
155
-
156
- function lineCount(_x) {
157
- return _lineCount.apply(this, arguments);
158
- }
159
-
160
- return lineCount;
161
- }()
162
- }, {
163
- key: "indexCov",
164
- value: function () {
165
- var _indexCov = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
166
- return _regenerator.default.wrap(function _callee2$(_context2) {
167
- while (1) {
168
- switch (_context2.prev = _context2.next) {
169
- case 0:
133
+ });
134
+ });
135
+ };
136
+ CSI.prototype.indexCov = function () {
137
+ return __awaiter(this, void 0, void 0, function () {
138
+ return __generator(this, function (_a) {
170
139
  throw new Error('CSI indexes do not support indexcov');
171
-
172
- case 2:
173
- case "end":
174
- return _context2.stop();
175
- }
176
- }
177
- }, _callee2);
178
- }));
179
-
180
- function indexCov() {
181
- return _indexCov.apply(this, arguments);
182
- }
183
-
184
- return indexCov;
185
- }()
186
- }, {
187
- key: "parseAuxData",
188
- value: function parseAuxData(bytes, offset, auxLength) {
189
- if (auxLength < 30) {
140
+ });
141
+ });
142
+ };
143
+ CSI.prototype.parseAuxData = function (bytes, offset, auxLength) {
144
+ if (auxLength < 30) {
145
+ return {
146
+ refIdToName: [],
147
+ refNameToId: {},
148
+ };
149
+ }
150
+ var formatFlags = bytes.readInt32LE(offset);
151
+ var coordinateType = formatFlags & 0x10000 ? 'zero-based-half-open' : '1-based-closed';
152
+ var format = { 0: 'generic', 1: 'SAM', 2: 'VCF' }[formatFlags & 0xf];
153
+ if (!format) {
154
+ throw new Error("invalid Tabix preset format flags ".concat(formatFlags));
155
+ }
156
+ var columnNumbers = {
157
+ ref: bytes.readInt32LE(offset + 4),
158
+ start: bytes.readInt32LE(offset + 8),
159
+ end: bytes.readInt32LE(offset + 12),
160
+ };
161
+ var metaValue = bytes.readInt32LE(offset + 16);
162
+ var metaChar = metaValue ? String.fromCharCode(metaValue) : '';
163
+ var skipLines = bytes.readInt32LE(offset + 20);
164
+ var nameSectionLength = bytes.readInt32LE(offset + 24);
165
+ var _a = this._parseNameBytes(bytes.slice(offset + 28, offset + 28 + nameSectionLength)), refIdToName = _a.refIdToName, refNameToId = _a.refNameToId;
190
166
  return {
191
- refIdToName: [],
192
- refNameToId: {}
167
+ refIdToName: refIdToName,
168
+ refNameToId: refNameToId,
169
+ skipLines: skipLines,
170
+ metaChar: metaChar,
171
+ columnNumbers: columnNumbers,
172
+ format: format,
173
+ coordinateType: coordinateType,
193
174
  };
194
- }
195
-
196
- var formatFlags = bytes.readInt32LE(offset);
197
- var coordinateType = formatFlags & 0x10000 ? 'zero-based-half-open' : '1-based-closed';
198
- var format = {
199
- 0: 'generic',
200
- 1: 'SAM',
201
- 2: 'VCF'
202
- }[formatFlags & 0xf];
203
- if (!format) throw new Error("invalid Tabix preset format flags ".concat(formatFlags));
204
- var columnNumbers = {
205
- ref: bytes.readInt32LE(offset + 4),
206
- start: bytes.readInt32LE(offset + 8),
207
- end: bytes.readInt32LE(offset + 12)
208
- };
209
- var metaValue = bytes.readInt32LE(offset + 16);
210
- var metaChar = metaValue ? String.fromCharCode(metaValue) : '';
211
- var skipLines = bytes.readInt32LE(offset + 20);
212
- var nameSectionLength = bytes.readInt32LE(offset + 24);
213
-
214
- var _this$_parseNameBytes = this._parseNameBytes(bytes.slice(offset + 28, offset + 28 + nameSectionLength)),
215
- refIdToName = _this$_parseNameBytes.refIdToName,
216
- refNameToId = _this$_parseNameBytes.refNameToId;
217
-
218
- return {
219
- refIdToName: refIdToName,
220
- refNameToId: refNameToId,
221
- skipLines: skipLines,
222
- metaChar: metaChar,
223
- columnNumbers: columnNumbers,
224
- format: format,
225
- coordinateType: coordinateType
226
- };
227
- }
228
- }, {
229
- key: "_parseNameBytes",
230
- value: function _parseNameBytes(namesBytes) {
231
- var currRefId = 0;
232
- var currNameStart = 0;
233
- var refIdToName = [];
234
- var refNameToId = {};
235
-
236
- for (var i = 0; i < namesBytes.length; i += 1) {
237
- if (!namesBytes[i]) {
238
- if (currNameStart < i) {
239
- var refName = namesBytes.toString('utf8', currNameStart, i);
240
- refName = this.renameRefSeq(refName);
241
- refIdToName[currRefId] = refName;
242
- refNameToId[refName] = currRefId;
243
- }
244
-
245
- currNameStart = i + 1;
246
- currRefId += 1;
247
- }
248
- }
249
-
250
- return {
251
- refNameToId: refNameToId,
252
- refIdToName: refIdToName
253
- };
254
- } // fetch and parse the index
255
-
256
- }, {
257
- key: "_parse",
258
- value: function () {
259
- var _parse2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
260
- var _this2 = this;
261
-
262
- var opts,
263
- bytes,
264
- csiVersion,
265
- maxRefLength,
266
- auxLength,
267
- aux,
268
- refCount,
269
- firstDataLine,
270
- currOffset,
271
- indices,
272
- _args3 = arguments;
273
- return _regenerator.default.wrap(function _callee3$(_context3) {
274
- while (1) {
275
- switch (_context3.prev = _context3.next) {
276
- case 0:
277
- opts = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
278
- _context3.t0 = _bgzfFilehandle.unzip;
279
- _context3.next = 4;
280
- return this.filehandle.readFile(opts);
281
-
282
- case 4:
283
- _context3.t1 = _context3.sent;
284
- _context3.next = 7;
285
- return (0, _context3.t0)(_context3.t1);
286
-
287
- case 7:
288
- bytes = _context3.sent;
289
-
290
- if (!(bytes.readUInt32LE(0) === CSI1_MAGIC)) {
291
- _context3.next = 12;
292
- break;
293
- }
294
-
295
- csiVersion = 1;
296
- _context3.next = 17;
297
- break;
298
-
299
- case 12:
300
- if (!(bytes.readUInt32LE(0) === CSI2_MAGIC)) {
301
- _context3.next = 16;
302
- break;
175
+ };
176
+ CSI.prototype._parseNameBytes = function (namesBytes) {
177
+ var currRefId = 0;
178
+ var currNameStart = 0;
179
+ var refIdToName = [];
180
+ var refNameToId = {};
181
+ for (var i = 0; i < namesBytes.length; i += 1) {
182
+ if (!namesBytes[i]) {
183
+ if (currNameStart < i) {
184
+ var refName = namesBytes.toString('utf8', currNameStart, i);
185
+ refName = this.renameRefSeq(refName);
186
+ refIdToName[currRefId] = refName;
187
+ refNameToId[refName] = currRefId;
303
188
  }
304
-
305
- csiVersion = 2;
306
- _context3.next = 17;
307
- break;
308
-
309
- case 16:
310
- throw new Error('Not a CSI file');
311
-
312
- case 17:
313
- this.minShift = bytes.readInt32LE(4);
314
- this.depth = bytes.readInt32LE(8);
315
- this.maxBinNumber = ((1 << (this.depth + 1) * 3) - 1) / 7;
316
- maxRefLength = Math.pow(2, this.minShift + this.depth * 3);
317
- auxLength = bytes.readInt32LE(12);
318
- aux = {
319
- refIdToName: [],
320
- refNameToId: {}
321
- };
322
-
323
- if (auxLength) {
324
- aux = this.parseAuxData(bytes, 16, auxLength);
325
- }
326
-
327
- refCount = bytes.readInt32LE(16 + auxLength); // read the indexes for each reference sequence
328
-
329
- currOffset = 16 + auxLength + 4;
330
- indices = new Array(refCount).fill(0).map(function () {
331
- // the binning index
332
- var binCount = bytes.readInt32LE(currOffset);
333
- currOffset += 4;
334
- var binIndex = {};
335
- var stats; // < provided by parsing a pseudo-bin, if present
336
-
337
- for (var j = 0; j < binCount; j += 1) {
338
- var bin = bytes.readUInt32LE(currOffset);
339
-
340
- if (bin > _this2.maxBinNumber) {
341
- // this is a fake bin that actually has stats information
342
- // about the reference sequence in it
343
- stats = _this2.parsePseudoBin(bytes, currOffset + 4);
344
- currOffset += 4 + 8 + 4 + 16 + 16;
345
- } else {
346
- var loffset = (0, _virtualOffset.fromBytes)(bytes, currOffset + 4);
347
- firstDataLine = _this2._findFirstData(firstDataLine, loffset);
348
- var chunkCount = bytes.readInt32LE(currOffset + 12);
349
- currOffset += 16;
350
- var chunks = new Array(chunkCount);
351
-
352
- for (var k = 0; k < chunkCount; k += 1) {
353
- var u = (0, _virtualOffset.fromBytes)(bytes, currOffset);
354
- var v = (0, _virtualOffset.fromBytes)(bytes, currOffset + 8);
355
- currOffset += 16; // this._findFirstData(data, u)
356
-
357
- chunks[k] = new _chunk.default(u, v, bin);
358
- }
359
-
360
- binIndex[bin] = chunks;
361
- }
362
- }
363
-
364
- return {
365
- binIndex: binIndex,
366
- stats: stats
367
- };
368
- });
369
- return _context3.abrupt("return", _objectSpread({}, aux, {
370
- csi: true,
371
- refCount: refCount,
372
- maxBlockSize: 1 << 16,
373
- firstDataLine: firstDataLine,
374
- csiVersion: csiVersion,
375
- indices: indices,
376
- depth: this.depth,
377
- maxBinNumber: this.maxBinNumber,
378
- maxRefLength: maxRefLength
379
- }));
380
-
381
- case 28:
382
- case "end":
383
- return _context3.stop();
189
+ currNameStart = i + 1;
190
+ currRefId += 1;
384
191
  }
385
- }
386
- }, _callee3, this);
387
- }));
388
-
389
- function _parse() {
390
- return _parse2.apply(this, arguments);
391
- }
392
-
393
- return _parse;
394
- }()
395
- }, {
396
- key: "parsePseudoBin",
397
- value: function parsePseudoBin(bytes, offset) {
398
- var lineCount = (0, _util.longToNumber)(_long.default.fromBytesLE(Array.prototype.slice.call(bytes, offset + 28, offset + 36), true));
399
- return {
400
- lineCount: lineCount
401
- };
402
- }
403
- }, {
404
- key: "blocksForRange",
405
- value: function () {
406
- var _blocksForRange = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(refName, beg, end) {
407
- var opts,
408
- indexData,
409
- refId,
410
- indexes,
411
- binIndex,
412
- bins,
413
- l,
414
- numOffsets,
415
- i,
416
- off,
417
- _i,
418
- chunks,
419
- j,
420
- _i2,
421
- _i3,
422
- _i4,
423
- _args4 = arguments;
424
-
425
- return _regenerator.default.wrap(function _callee4$(_context4) {
426
- while (1) {
427
- switch (_context4.prev = _context4.next) {
428
- case 0:
429
- opts = _args4.length > 3 && _args4[3] !== undefined ? _args4[3] : {};
430
- if (beg < 0) beg = 0;
431
- _context4.next = 4;
432
- return this.parse(opts);
433
-
434
- case 4:
435
- indexData = _context4.sent;
436
-
437
- if (indexData) {
438
- _context4.next = 7;
439
- break;
440
- }
441
-
442
- return _context4.abrupt("return", []);
443
-
444
- case 7:
445
- refId = indexData.refNameToId[refName];
446
- indexes = indexData.indices[refId];
447
-
448
- if (indexes) {
449
- _context4.next = 11;
450
- break;
451
- }
452
-
453
- return _context4.abrupt("return", []);
454
-
455
- case 11:
456
- binIndex = indexes.binIndex;
457
- bins = this.reg2bins(beg, end);
458
- numOffsets = 0;
459
-
460
- for (i = 0; i < bins.length; i += 1) {
461
- if (binIndex[bins[i]]) numOffsets += binIndex[bins[i]].length;
462
- }
463
-
464
- if (!(numOffsets === 0)) {
465
- _context4.next = 17;
466
- break;
467
- }
468
-
469
- return _context4.abrupt("return", []);
470
-
471
- case 17:
472
- off = [];
473
- numOffsets = 0;
474
-
475
- for (_i = 0; _i < bins.length; _i += 1) {
476
- chunks = binIndex[bins[_i]];
477
- if (chunks) for (j = 0; j < chunks.length; j += 1) {
478
- off[numOffsets] = new _chunk.default(chunks[j].minv, chunks[j].maxv, chunks[j].bin);
479
- numOffsets += 1;
480
- }
481
- }
482
-
483
- if (off.length) {
484
- _context4.next = 22;
485
- break;
486
- }
487
-
488
- return _context4.abrupt("return", []);
489
-
490
- case 22:
491
- off = off.sort(function (a, b) {
492
- return a.compareTo(b);
493
- }); // resolve completely contained adjacent blocks
494
-
495
- l = 0;
496
-
497
- for (_i2 = 1; _i2 < numOffsets; _i2 += 1) {
498
- if (off[l].maxv.compareTo(off[_i2].maxv) < 0) {
499
- l += 1;
500
- off[l].minv = off[_i2].minv;
501
- off[l].maxv = off[_i2].maxv;
502
- }
192
+ }
193
+ return { refNameToId: refNameToId, refIdToName: refIdToName };
194
+ };
195
+ // fetch and parse the index
196
+ CSI.prototype._parse = function (opts) {
197
+ if (opts === void 0) { opts = {}; }
198
+ return __awaiter(this, void 0, void 0, function () {
199
+ var bytes, _a, csiVersion, maxRefLength, auxLength, aux, refCount, firstDataLine, currOffset, indices;
200
+ var _this = this;
201
+ return __generator(this, function (_b) {
202
+ switch (_b.label) {
203
+ case 0:
204
+ _a = bgzf_filehandle_1.unzip;
205
+ return [4 /*yield*/, this.filehandle.readFile(opts)];
206
+ case 1: return [4 /*yield*/, _a.apply(void 0, [(_b.sent())])
207
+ // check TBI magic numbers
208
+ ];
209
+ case 2:
210
+ bytes = _b.sent();
211
+ if (bytes.readUInt32LE(0) === CSI1_MAGIC) {
212
+ csiVersion = 1;
213
+ }
214
+ else if (bytes.readUInt32LE(0) === CSI2_MAGIC) {
215
+ csiVersion = 2;
216
+ }
217
+ else {
218
+ throw new Error('Not a CSI file');
219
+ // TODO: do we need to support big-endian CSI files?
220
+ }
221
+ this.minShift = bytes.readInt32LE(4);
222
+ this.depth = bytes.readInt32LE(8);
223
+ this.maxBinNumber = ((1 << ((this.depth + 1) * 3)) - 1) / 7;
224
+ maxRefLength = Math.pow(2, (this.minShift + this.depth * 3));
225
+ auxLength = bytes.readInt32LE(12);
226
+ aux = {
227
+ refIdToName: [],
228
+ refNameToId: {},
229
+ };
230
+ if (auxLength) {
231
+ aux = this.parseAuxData(bytes, 16, auxLength);
232
+ }
233
+ refCount = bytes.readInt32LE(16 + auxLength);
234
+ currOffset = 16 + auxLength + 4;
235
+ indices = new Array(refCount).fill(0).map(function () {
236
+ // the binning index
237
+ var binCount = bytes.readInt32LE(currOffset);
238
+ currOffset += 4;
239
+ var binIndex = {};
240
+ var stats; // < provided by parsing a pseudo-bin, if present
241
+ for (var j = 0; j < binCount; j += 1) {
242
+ var bin = bytes.readUInt32LE(currOffset);
243
+ if (bin > _this.maxBinNumber) {
244
+ // this is a fake bin that actually has stats information
245
+ // about the reference sequence in it
246
+ stats = _this.parsePseudoBin(bytes, currOffset + 4);
247
+ currOffset += 4 + 8 + 4 + 16 + 16;
248
+ }
249
+ else {
250
+ var loffset = (0, virtualOffset_1.fromBytes)(bytes, currOffset + 4);
251
+ firstDataLine = _this._findFirstData(firstDataLine, loffset);
252
+ var chunkCount = bytes.readInt32LE(currOffset + 12);
253
+ currOffset += 16;
254
+ var chunks = new Array(chunkCount);
255
+ for (var k = 0; k < chunkCount; k += 1) {
256
+ var u = (0, virtualOffset_1.fromBytes)(bytes, currOffset);
257
+ var v = (0, virtualOffset_1.fromBytes)(bytes, currOffset + 8);
258
+ currOffset += 16;
259
+ // this._findFirstData(data, u)
260
+ chunks[k] = new chunk_1.default(u, v, bin);
261
+ }
262
+ binIndex[bin] = chunks;
263
+ }
264
+ }
265
+ return { binIndex: binIndex, stats: stats };
266
+ });
267
+ return [2 /*return*/, __assign(__assign({}, aux), { csi: true, refCount: refCount, maxBlockSize: 1 << 16, firstDataLine: firstDataLine, csiVersion: csiVersion, indices: indices, depth: this.depth, maxBinNumber: this.maxBinNumber, maxRefLength: maxRefLength })];
503
268
  }
504
-
505
- numOffsets = l + 1; // resolve overlaps between adjacent blocks; this may happen due to the merge in indexing
506
-
507
- for (_i3 = 1; _i3 < numOffsets; _i3 += 1) {
508
- if (off[_i3 - 1].maxv.compareTo(off[_i3].minv) >= 0) {
509
- off[_i3 - 1].maxv = off[_i3].minv;
510
- }
511
- } // merge adjacent blocks
512
-
513
-
514
- l = 0;
515
-
516
- for (_i4 = 1; _i4 < numOffsets; _i4 += 1) {
517
- if (off[l].maxv.blockPosition === off[_i4].minv.blockPosition) off[l].maxv = off[_i4].maxv;else {
518
- l += 1;
519
- off[l].minv = off[_i4].minv;
520
- off[l].maxv = off[_i4].maxv;
521
- }
269
+ });
270
+ });
271
+ };
272
+ CSI.prototype.parsePseudoBin = function (bytes, offset) {
273
+ var lineCount = (0, util_1.longToNumber)(long_1.default.fromBytesLE(Array.prototype.slice.call(bytes, offset + 28, offset + 36), true));
274
+ return { lineCount: lineCount };
275
+ };
276
+ CSI.prototype.blocksForRange = function (refName, min, max, opts) {
277
+ if (opts === void 0) { opts = {}; }
278
+ return __awaiter(this, void 0, void 0, function () {
279
+ var indexData, refId, ba, overlappingBins, chunks, _i, overlappingBins_1, _a, start, end, bin, binChunks, c;
280
+ return __generator(this, function (_b) {
281
+ switch (_b.label) {
282
+ case 0:
283
+ if (min < 0) {
284
+ min = 0;
285
+ }
286
+ return [4 /*yield*/, this.parse(opts)];
287
+ case 1:
288
+ indexData = _b.sent();
289
+ if (!indexData) {
290
+ return [2 /*return*/, []];
291
+ }
292
+ refId = indexData.refNameToId[refName];
293
+ ba = indexData.indices[refId];
294
+ if (!ba) {
295
+ return [2 /*return*/, []];
296
+ }
297
+ overlappingBins = this.reg2bins(min, max) // List of bin #s that overlap min, max
298
+ ;
299
+ chunks = [];
300
+ // Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned
301
+ for (_i = 0, overlappingBins_1 = overlappingBins; _i < overlappingBins_1.length; _i++) {
302
+ _a = overlappingBins_1[_i], start = _a[0], end = _a[1];
303
+ for (bin = start; bin <= end; bin++) {
304
+ if (ba.binIndex[bin]) {
305
+ binChunks = ba.binIndex[bin];
306
+ for (c = 0; c < binChunks.length; ++c) {
307
+ chunks.push(new chunk_1.default(binChunks[c].minv, binChunks[c].maxv, bin));
308
+ }
309
+ }
310
+ }
311
+ }
312
+ return [2 /*return*/, (0, util_1.optimizeChunks)(chunks, new virtualOffset_1.default(0, 0))];
522
313
  }
523
-
524
- numOffsets = l + 1;
525
- return _context4.abrupt("return", off.slice(0, numOffsets));
526
-
527
- case 31:
528
- case "end":
529
- return _context4.stop();
530
- }
531
- }
532
- }, _callee4, this);
533
- }));
534
-
535
- function blocksForRange(_x2, _x3, _x4) {
536
- return _blocksForRange.apply(this, arguments);
537
- }
538
-
539
- return blocksForRange;
540
- }()
314
+ });
315
+ });
316
+ };
541
317
  /**
542
318
  * calculate the list of bins that may overlap with region [beg,end) (zero-based half-open)
543
- * @returns {Array[number]}
544
319
  */
545
-
546
- }, {
547
- key: "reg2bins",
548
- value: function reg2bins(beg, end) {
549
- beg -= 1; // < convert to 1-based closed
550
-
551
- if (beg < 1) beg = 1;
552
- if (end > Math.pow(2, 50)) end = Math.pow(2, 34); // 17 GiB ought to be enough for anybody
553
-
554
- end -= 1;
555
- var l = 0;
556
- var t = 0;
557
- var s = this.minShift + this.depth * 3;
558
- var bins = [];
559
-
560
- for (; l <= this.depth; s -= 3, t += lshift(1, l * 3), l += 1) {
561
- var b = t + rshift(beg, s);
562
- var e = t + rshift(end, s);
563
- if (e - b + bins.length > this.maxBinNumber) throw new Error("query ".concat(beg, "-").concat(end, " is too large for current binning scheme (shift ").concat(this.minShift, ", depth ").concat(this.depth, "), try a smaller query or a coarser index binning scheme"));
564
-
565
- for (var i = b; i <= e; i += 1) {
566
- bins.push(i);
320
+ CSI.prototype.reg2bins = function (beg, end) {
321
+ beg -= 1; // < convert to 1-based closed
322
+ if (beg < 1) {
323
+ beg = 1;
567
324
  }
568
- }
569
-
570
- return bins;
571
- }
572
- }]);
573
- return CSI;
574
- }(_indexFile.default);
575
-
325
+ if (end > Math.pow(2, 50)) {
326
+ end = Math.pow(2, 34);
327
+ } // 17 GiB ought to be enough for anybody
328
+ end -= 1;
329
+ var l = 0;
330
+ var t = 0;
331
+ var s = this.minShift + this.depth * 3;
332
+ var bins = [];
333
+ for (; l <= this.depth; s -= 3, t += lshift(1, l * 3), l += 1) {
334
+ var b = t + rshift(beg, s);
335
+ var e = t + rshift(end, s);
336
+ if (e - b + bins.length > this.maxBinNumber) {
337
+ throw new Error("query ".concat(beg, "-").concat(end, " is too large for current binning scheme (shift ").concat(this.minShift, ", depth ").concat(this.depth, "), try a smaller query or a coarser index binning scheme"));
338
+ }
339
+ bins.push([b, e]);
340
+ }
341
+ return bins;
342
+ };
343
+ return CSI;
344
+ }(indexFile_1.default));
576
345
  exports.default = CSI;
577
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jc2kudHMiXSwibmFtZXMiOlsiQ1NJMV9NQUdJQyIsIkNTSTJfTUFHSUMiLCJsc2hpZnQiLCJudW0iLCJiaXRzIiwicnNoaWZ0IiwiTWF0aCIsImZsb29yIiwiQ1NJIiwiYXJncyIsIm1heEJpbk51bWJlciIsImRlcHRoIiwibWluU2hpZnQiLCJyZWZOYW1lIiwib3B0cyIsInBhcnNlIiwiaW5kZXhEYXRhIiwicmVmSWQiLCJyZWZOYW1lVG9JZCIsImlkeCIsImluZGljZXMiLCJzdGF0cyIsImxpbmVDb3VudCIsIkVycm9yIiwiYnl0ZXMiLCJvZmZzZXQiLCJhdXhMZW5ndGgiLCJyZWZJZFRvTmFtZSIsImZvcm1hdEZsYWdzIiwicmVhZEludDMyTEUiLCJjb29yZGluYXRlVHlwZSIsImZvcm1hdCIsImNvbHVtbk51bWJlcnMiLCJyZWYiLCJzdGFydCIsImVuZCIsIm1ldGFWYWx1ZSIsIm1ldGFDaGFyIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic2tpcExpbmVzIiwibmFtZVNlY3Rpb25MZW5ndGgiLCJfcGFyc2VOYW1lQnl0ZXMiLCJzbGljZSIsIm5hbWVzQnl0ZXMiLCJjdXJyUmVmSWQiLCJjdXJyTmFtZVN0YXJ0IiwiaSIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVuYW1lUmVmU2VxIiwidW56aXAiLCJmaWxlaGFuZGxlIiwicmVhZEZpbGUiLCJyZWFkVUludDMyTEUiLCJjc2lWZXJzaW9uIiwibWF4UmVmTGVuZ3RoIiwiYXV4IiwicGFyc2VBdXhEYXRhIiwicmVmQ291bnQiLCJjdXJyT2Zmc2V0IiwiQXJyYXkiLCJmaWxsIiwibWFwIiwiYmluQ291bnQiLCJiaW5JbmRleCIsImoiLCJiaW4iLCJwYXJzZVBzZXVkb0JpbiIsImxvZmZzZXQiLCJmaXJzdERhdGFMaW5lIiwiX2ZpbmRGaXJzdERhdGEiLCJjaHVua0NvdW50IiwiY2h1bmtzIiwiayIsInUiLCJ2IiwiQ2h1bmsiLCJjc2kiLCJtYXhCbG9ja1NpemUiLCJMb25nIiwiZnJvbUJ5dGVzTEUiLCJwcm90b3R5cGUiLCJjYWxsIiwiYmVnIiwiaW5kZXhlcyIsImJpbnMiLCJyZWcyYmlucyIsIm51bU9mZnNldHMiLCJvZmYiLCJtaW52IiwibWF4diIsInNvcnQiLCJhIiwiYiIsImNvbXBhcmVUbyIsImwiLCJibG9ja1Bvc2l0aW9uIiwidCIsInMiLCJlIiwicHVzaCIsIkluZGV4RmlsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7OztBQUVBLElBQU1BLFVBQVUsR0FBRyxRQUFuQixDLENBQTRCOztBQUM1QixJQUFNQyxVQUFVLEdBQUcsUUFBbkIsQyxDQUE0Qjs7QUFFNUIsU0FBU0MsTUFBVCxDQUFnQkMsR0FBaEIsRUFBNkJDLElBQTdCLEVBQTJDO0FBQ3pDLFNBQU9ELEdBQUcsWUFBRyxDQUFILEVBQVFDLElBQVIsQ0FBVjtBQUNEOztBQUNELFNBQVNDLE1BQVQsQ0FBZ0JGLEdBQWhCLEVBQTZCQyxJQUE3QixFQUEyQztBQUN6QyxTQUFPRSxJQUFJLENBQUNDLEtBQUwsQ0FBV0osR0FBRyxZQUFHLENBQUgsRUFBUUMsSUFBUixDQUFkLENBQVA7QUFDRDs7SUFFb0JJLEc7Ozs7O0FBSW5CLGVBQVlDLElBQVosRUFBdUI7QUFBQTs7QUFBQTtBQUNyQiw4QkFBTUEsSUFBTjtBQURxQjtBQUFBO0FBQUE7QUFFckIsVUFBS0MsWUFBTCxHQUFvQixDQUFwQjtBQUNBLFVBQUtDLEtBQUwsR0FBYSxDQUFiO0FBQ0EsVUFBS0MsUUFBTCxHQUFnQixDQUFoQjtBQUpxQjtBQUt0Qjs7Ozs7Z0hBQ2VDLE87Ozs7Ozs7Ozs7O0FBQWlCQyxnQkFBQUEsSSwyREFBZ0IsRTs7dUJBQ3ZCLEtBQUtDLEtBQUwsQ0FBV0QsSUFBWCxDOzs7QUFBbEJFLGdCQUFBQSxTOztvQkFDREEsUzs7Ozs7aURBQWtCLENBQUMsQzs7O0FBQ2xCQyxnQkFBQUEsSyxHQUFRRCxTQUFTLENB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ckQsQ0FBQyxJQUFJLENBQTdCO0FBQWdDdUMsVUFBQUEsSUFBSSxDQUFDZSxJQUFMLENBQVV0RCxDQUFWO0FBQWhDO0FBQ0Q7O0FBQ0QsYUFBT3VDLElBQVA7QUFDRDs7O0VBMVI4QmdCLGtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvbmcgZnJvbSAnbG9uZydcbmltcG9ydCB7IHVuemlwIH0gZnJvbSAnQGdtb2QvYmd6Zi1maWxlaGFuZGxlJ1xuXG5pbXBvcnQgVmlydHVhbE9mZnNldCwgeyBmcm9tQnl0ZXMgfSBmcm9tICcuL3ZpcnR1YWxPZmZzZXQnXG5pbXBvcnQgQ2h1bmsgZnJvbSAnLi9jaHVuaydcbmltcG9ydCB7IGxvbmdUb051bWJlciB9IGZyb20gJy4vdXRpbCdcblxuaW1wb3J0IEluZGV4RmlsZSwgeyBPcHRpb25zIH0gZnJvbSAnLi9pbmRleEZpbGUnXG5cbmNvbnN0IENTSTFfTUFHSUMgPSAyMTU4MjY1OSAvLyBDU0lcXDFcbmNvbnN0IENTSTJfTUFHSUMgPSAzODM1OTg3NSAvLyBDU0lcXDJcblxuZnVuY3Rpb24gbHNoaWZ0KG51bTogbnVtYmVyLCBiaXRzOiBudW1iZXIpIHtcbiAgcmV0dXJuIG51bSAqIDIgKiogYml0c1xufVxuZnVuY3Rpb24gcnNoaWZ0KG51bTogbnVtYmVyLCBiaXRzOiBudW1iZXIpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IobnVtIC8gMiAqKiBiaXRzKVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDU0kgZXh0ZW5kcyBJbmRleEZpbGUge1xuICBwcml2YXRlIG1heEJpbk51bWJlcjogbnVtYmVyXG4gIHByaXZhdGUgZGVwdGg6IG51bWJlclxuICBwcml2YXRlIG1pblNoaWZ0OiBudW1iZXJcbiAgY29uc3RydWN0b3IoYXJnczogYW55KSB7XG4gICAgc3VwZXIoYXJncylcbiAgICB0aGlzLm1heEJpbk51bWJlciA9IDBcbiAgICB0aGlzLmRlcHRoID0gMFxuICAgIHRoaXMubWluU2hpZnQgPSAwXG4gIH1cbiAgYXN5bmMgbGluZUNvdW50KHJlZk5hbWU6IHN0cmluZywgb3B0czogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBpbmRleERhdGEgPSBhd2FpdCB0aGlzLnBhcnNlKG9wdHMpXG4gICAgaWYgKCFpbmRleERhdGEpIHJldHVybiAtMVxuICAgIGNvbnN0IHJlZklkID0gaW5kZXhEYXRhLnJlZk5hbWVUb0lkW3JlZk5hbWVdXG4gICAgY29uc3QgaWR4ID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdXG4gICAgaWYgKCFpZHgpIHJldHVybiAtMVxuICAgIGNvbnN0IHsgc3RhdHMgfSA9IGluZGV4RGF0YS5pbmRpY2VzW3JlZklkXVxuICAgIGlmIChzdGF0cykgcmV0dXJuIHN0YXRzLmxpbmVDb3VudFxuICAgIHJldHVybiAtMVxuICB9XG4gIGFzeW5jIGluZGV4Q292KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ1NJIGluZGV4ZXMgZG8gbm90IHN1cHBvcnQgaW5kZXhjb3YnKVxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcGFyc2VBdXhEYXRhKGJ5dGVzOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBhdXhMZW5ndGg6IG51bWJlcikge1xuICAgIGlmIChhdXhMZW5ndGggPCAzMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVmSWRUb05hbWU6IFtdLFxuICAgICAgICByZWZOYW1lVG9JZDoge30sXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0RmxhZ3MgPSBieXRlcy5yZWFkSW50MzJMRShvZmZzZXQpXG4gICAgY29uc3QgY29vcmRpbmF0ZVR5cGUgPVxuICAgICAgZm9ybWF0RmxhZ3MgJiAweDEwMDAwID8gJ3plcm8tYmFzZWQtaGFsZi1vcGVuJyA6ICcxLWJhc2VkLWNsb3NlZCdcbiAgICBjb25zdCBmb3JtYXQgPSAoeyAwOiAnZ2VuZXJpYycsIDE6ICdTQU0nLCAyOiAnVkNGJyB9IGFzIHtcbiAgICAgIFtrZXk6IG51bWJlcl06IHN0cmluZ1xuICAgIH0pW2Zvcm1hdEZsYWdzICYgMHhmXVxuICAgIGlmICghZm9ybWF0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIFRhYml4IHByZXNldCBmb3JtYXQgZmxhZ3MgJHtmb3JtYXRGbGFnc31gKVxuICAgIGNvbnN0IGNvbHVtbk51bWJlcnMgPSB7XG4gICAgICByZWY6IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDQpLFxuICAgICAgc3RhcnQ6IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDgpLFxuICAgICAgZW5kOiBieXRlcy5yZWFkSW50MzJMRShvZmZzZXQgKyAxMiksXG4gICAgfVxuICAgIGNvbnN0IG1ldGFWYWx1ZSA9IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDE2KVxuICAgIGNvbnN0IG1ldGFDaGFyID0gbWV0YVZhbHVlID8gU3RyaW5nLmZyb21DaGFyQ29kZShtZXRhVmFsdWUpIDogJydcbiAgICBjb25zdCBza2lwTGluZXMgPSBieXRlcy5yZWFkSW50MzJMRShvZmZzZXQgKyAyMClcbiAgICBjb25zdCBuYW1lU2VjdGlvbkxlbmd0aCA9IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDI0KVxuXG4gICAgY29uc3QgeyByZWZJZFRvTmFtZSwgcmVmTmFtZVRvSWQgfSA9IHRoaXMuX3BhcnNlTmFtZUJ5dGVzKFxuICAgICAgYnl0ZXMuc2xpY2Uob2Zmc2V0ICsgMjgsIG9mZnNldCArIDI4ICsgbmFtZVNlY3Rpb25MZW5ndGgpLFxuICAgIClcblxuICAgIHJldHVybiB7XG4gICAgICByZWZJZFRvTmFtZSxcbiAgICAgIHJlZk5hbWVUb0lkLFxuICAgICAgc2tpcExpbmVzLFxuICAgICAgbWV0YUNoYXIsXG4gICAgICBjb2x1bW5OdW1iZXJzLFxuICAgICAgZm9ybWF0LFxuICAgICAgY29vcmRpbmF0ZVR5cGUsXG4gICAgfVxuICB9XG5cbiAgX3BhcnNlTmFtZUJ5dGVzKG5hbWVzQnl0ZXM6IEJ1ZmZlcikge1xuICAgIGxldCBjdXJyUmVmSWQgPSAwXG4gICAgbGV0IGN1cnJOYW1lU3RhcnQgPSAwXG4gICAgY29uc3QgcmVmSWRUb05hbWUgPSBbXVxuICAgIGNvbnN0IHJlZk5hbWVUb0lkOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzQnl0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICghbmFtZXNCeXRlc1tpXSkge1xuICAgICAgICBpZiAoY3Vyck5hbWVTdGFydCA8IGkpIHtcbiAgICAgICAgICBsZXQgcmVmTmFtZSA9IG5hbWVzQnl0ZXMudG9TdHJpbmcoJ3V0ZjgnLCBjdXJyTmFtZVN0YXJ0LCBpKVxuICAgICAgICAgIHJlZk5hbWUgPSB0aGlzLnJlbmFtZVJlZlNlcShyZWZOYW1lKVxuICAgICAgICAgIHJlZklkVG9OYW1lW2N1cnJSZWZJZF0gPSByZWZOYW1lXG4gICAgICAgICAgcmVmTmFtZVRvSWRbcmVmTmFtZV0gPSBjdXJyUmVmSWRcbiAgICAgICAgfVxuICAgICAgICBjdXJyTmFtZVN0YXJ0ID0gaSArIDFcbiAgICAgICAgY3VyclJlZklkICs9IDFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgcmVmTmFtZVRvSWQsIHJlZklkVG9OYW1lIH1cbiAgfVxuXG4gIC8vIGZldGNoIGFuZCBwYXJzZSB0aGUgaW5kZXhcblxuICBhc3luYyBfcGFyc2Uob3B0czogT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgYnl0ZXMgPSBhd2FpdCB1bnppcCgoYXdhaXQgdGhpcy5maWxlaGFuZGxlLnJlYWRGaWxlKG9wdHMpKSBhcyBCdWZmZXIpXG5cbiAgICAvLyBjaGVjayBUQkkgbWFnaWMgbnVtYmVyc1xuICAgIGxldCBjc2lWZXJzaW9uXG4gICAgaWYgKGJ5dGVzLnJlYWRVSW50MzJMRSgwKSA9PT0gQ1NJMV9NQUdJQykge1xuICAgICAgY3NpVmVyc2lvbiA9IDFcbiAgICB9IGVsc2UgaWYgKGJ5dGVzLnJlYWRVSW50MzJMRSgwKSA9PT0gQ1NJMl9NQUdJQykge1xuICAgICAgY3NpVmVyc2lvbiA9IDJcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSBDU0kgZmlsZScpXG4gICAgICAvLyBUT0RPOiBkbyB3ZSBuZWVkIHRvIHN1cHBvcnQgYmlnLWVuZGlhbiBDU0kgZmlsZXM/XG4gICAgfVxuXG4gICAgdGhpcy5taW5TaGlmdCA9IGJ5dGVzLnJlYWRJbnQzMkxFKDQpXG4gICAgdGhpcy5kZXB0aCA9IGJ5dGVzLnJlYWRJbnQzMkxFKDgpXG4gICAgdGhpcy5tYXhCaW5OdW1iZXIgPSAoKDEgPDwgKCh0aGlzLmRlcHRoICsgMSkgKiAzKSkgLSAxKSAvIDdcbiAgICBjb25zdCBtYXhSZWZMZW5ndGggPSAyICoqICh0aGlzLm1pblNoaWZ0ICsgdGhpcy5kZXB0aCAqIDMpXG5cbiAgICBjb25zdCBhdXhMZW5ndGggPSBieXRlcy5yZWFkSW50MzJMRSgxMilcbiAgICBsZXQgYXV4OiB7XG4gICAgICByZWZJZFRvTmFtZTogc3RyaW5nW11cbiAgICAgIHJlZk5hbWVUb0lkOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9XG4gICAgfSA9IHtcbiAgICAgIHJlZklkVG9OYW1lOiBbXSxcbiAgICAgIHJlZk5hbWVUb0lkOiB7fSxcbiAgICB9XG4gICAgaWYgKGF1eExlbmd0aCkge1xuICAgICAgYXV4ID0gdGhpcy5wYXJzZUF1eERhdGEoYnl0ZXMsIDE2LCBhdXhMZW5ndGgpXG4gICAgfVxuICAgIGNvbnN0IHJlZkNvdW50ID0gYnl0ZXMucmVhZEludDMyTEUoMTYgKyBhdXhMZW5ndGgpXG5cbiAgICAvLyByZWFkIHRoZSBpbmRleGVzIGZvciBlYWNoIHJlZmVyZW5jZSBzZXF1ZW5jZVxuICAgIGxldCBmaXJzdERhdGFMaW5lOiBWaXJ0dWFsT2Zmc2V0IHwgdW5kZWZpbmVkXG4gICAgbGV0IGN1cnJPZmZzZXQgPSAxNiArIGF1eExlbmd0aCArIDRcbiAgICBjb25zdCBpbmRpY2VzID0gbmV3IEFycmF5KHJlZkNvdW50KS5maWxsKDApLm1hcCgoKSA9PiB7XG4gICAgICAvLyB0aGUgYmlubmluZyBpbmRleFxuICAgICAgY29uc3QgYmluQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRShjdXJyT2Zmc2V0KVxuICAgICAgY3Vyck9mZnNldCArPSA0XG4gICAgICBjb25zdCBiaW5JbmRleDogeyBba2V5OiBzdHJpbmddOiBDaHVua1tdIH0gPSB7fVxuICAgICAgbGV0IHN0YXRzIC8vIDwgcHJvdmlkZWQgYnkgcGFyc2luZyBhIHBzZXVkby1iaW4sIGlmIHByZXNlbnRcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYmluQ291bnQ7IGogKz0gMSkge1xuICAgICAgICBjb25zdCBiaW4gPSBieXRlcy5yZWFkVUludDMyTEUoY3Vyck9mZnNldClcbiAgICAgICAgaWYgKGJpbiA+IHRoaXMubWF4QmluTnVtYmVyKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyBhIGZha2UgYmluIHRoYXQgYWN0dWFsbHkgaGFzIHN0YXRzIGluZm9ybWF0aW9uXG4gICAgICAgICAgLy8gYWJvdXQgdGhlIHJlZmVyZW5jZSBzZXF1ZW5jZSBpbiBpdFxuICAgICAgICAgIHN0YXRzID0gdGhpcy5wYXJzZVBzZXVkb0JpbihieXRlcywgY3Vyck9mZnNldCArIDQpXG4gICAgICAgICAgY3Vyck9mZnNldCArPSA0ICsgOCArIDQgKyAxNiArIDE2XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbG9mZnNldCA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldCArIDQpXG4gICAgICAgICAgZmlyc3REYXRhTGluZSA9IHRoaXMuX2ZpbmRGaXJzdERhdGEoZmlyc3REYXRhTGluZSwgbG9mZnNldClcbiAgICAgICAgICBjb25zdCBjaHVua0NvdW50ID0gYnl0ZXMucmVhZEludDMyTEUoY3Vyck9mZnNldCArIDEyKVxuICAgICAgICAgIGN1cnJPZmZzZXQgKz0gMTZcbiAgICAgICAgICBjb25zdCBjaHVua3MgPSBuZXcgQXJyYXkoY2h1bmtDb3VudClcbiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNodW5rQ291bnQ7IGsgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgdSA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldClcbiAgICAgICAgICAgIGNvbnN0IHYgPSBmcm9tQnl0ZXMoYnl0ZXMsIGN1cnJPZmZzZXQgKyA4KVxuICAgICAgICAgICAgY3Vyck9mZnNldCArPSAxNlxuICAgICAgICAgICAgLy8gdGhpcy5fZmluZEZpcnN0RGF0YShkYXRhLCB1KVxuICAgICAgICAgICAgY2h1bmtzW2tdID0gbmV3IENodW5rKHUsIHYsIGJpbilcbiAgICAgICAgICB9XG4gICAgICAgICAgYmluSW5kZXhbYmluXSA9IGNodW5rc1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGJpbkluZGV4LCBzdGF0cyB9XG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hdXgsXG4gICAgICBjc2k6IHRydWUsXG4gICAgICByZWZDb3VudCxcbiAgICAgIG1heEJsb2NrU2l6ZTogMSA8PCAxNixcbiAgICAgIGZpcnN0RGF0YUxpbmUsXG4gICAgICBjc2lWZXJzaW9uLFxuICAgICAgaW5kaWNlcyxcbiAgICAgIGRlcHRoOiB0aGlzLmRlcHRoLFxuICAgICAgbWF4QmluTnVtYmVyOiB0aGlzLm1heEJpbk51bWJlcixcbiAgICAgIG1heFJlZkxlbmd0aCxcbiAgICB9XG4gIH1cblxuICBwYXJzZVBzZXVkb0JpbihieXRlczogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcikge1xuICAgIGNvbnN0IGxpbmVDb3VudCA9IGxvbmdUb051bWJlcihcbiAgICAgIExvbmcuZnJvbUJ5dGVzTEUoXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzLCBvZmZzZXQgKyAyOCwgb2Zmc2V0ICsgMzYpLFxuICAgICAgICB0cnVlLFxuICAgICAgKSxcbiAgICApXG4gICAgcmV0dXJuIHsgbGluZUNvdW50IH1cbiAgfVxuXG4gIGFzeW5jIGJsb2Nrc0ZvclJhbmdlKFxuICAgIHJlZk5hbWU6IHN0cmluZyxcbiAgICBiZWc6IG51bWJlcixcbiAgICBlbmQ6IG51bWJlcixcbiAgICBvcHRzOiBPcHRpb25zID0ge30sXG4gICkge1xuICAgIGlmIChiZWcgPCAwKSBiZWcgPSAwXG5cbiAgICBjb25zdCBpbmRleERhdGEgPSBhd2FpdCB0aGlzLnBhcnNlKG9wdHMpXG4gICAgaWYgKCFpbmRleERhdGEpIHJldHVybiBbXVxuICAgIGNvbnN0IHJlZklkID0gaW5kZXhEYXRhLnJlZk5hbWVUb0lkW3JlZk5hbWVdXG4gICAgY29uc3QgaW5kZXhlcyA9IGluZGV4RGF0YS5pbmRpY2VzW3JlZklkXVxuICAgIGlmICghaW5kZXhlcykgcmV0dXJuIFtdXG5cbiAgICBjb25zdCB7IGJpbkluZGV4IH0gPSBpbmRleGVzXG5cbiAgICBjb25zdCBiaW5zID0gdGhpcy5yZWcyYmlucyhiZWcsIGVuZClcblxuICAgIGxldCBsXG4gICAgbGV0IG51bU9mZnNldHMgPSAwXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoYmluSW5kZXhbYmluc1tpXV0pIG51bU9mZnNldHMgKz0gYmluSW5kZXhbYmluc1tpXV0ubGVuZ3RoXG4gICAgfVxuXG4gICAgaWYgKG51bU9mZnNldHMgPT09IDApIHJldHVybiBbXVxuXG4gICAgbGV0IG9mZiA9IFtdXG4gICAgbnVtT2Zmc2V0cyA9IDBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGNodW5rcyA9IGJpbkluZGV4W2JpbnNbaV1dXG4gICAgICBpZiAoY2h1bmtzKVxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNodW5rcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgIG9mZltudW1PZmZzZXRzXSA9IG5ldyBDaHVuayhcbiAgICAgICAgICAgIGNodW5rc1tqXS5taW52LFxuICAgICAgICAgICAgY2h1bmtzW2pdLm1heHYsXG4gICAgICAgICAgICBjaHVua3Nbal0uYmluLFxuICAgICAgICAgIClcbiAgICAgICAgICBudW1PZmZzZXRzICs9IDFcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghb2ZmLmxlbmd0aCkgcmV0dXJuIFtdXG5cbiAgICBvZmYgPSBvZmYuc29ydCgoYSwgYikgPT4gYS5jb21wYXJlVG8oYikpXG5cbiAgICAvLyByZXNvbHZlIGNvbXBsZXRlbHkgY29udGFpbmVkIGFkamFjZW50IGJsb2Nrc1xuICAgIGwgPSAwXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBudW1PZmZzZXRzOyBpICs9IDEpIHtcbiAgICAgIGlmIChvZmZbbF0ubWF4di5jb21wYXJlVG8ob2ZmW2ldLm1heHYpIDwgMCkge1xuICAgICAgICBsICs9IDFcbiAgICAgICAgb2ZmW2xdLm1pbnYgPSBvZmZbaV0ubWludlxuICAgICAgICBvZmZbbF0ubWF4diA9IG9mZltpXS5tYXh2XG4gICAgICB9XG4gICAgfVxuICAgIG51bU9mZnNldHMgPSBsICsgMVxuXG4gICAgLy8gcmVzb2x2ZSBvdmVybGFwcyBiZXR3ZWVuIGFkamFjZW50IGJsb2NrczsgdGhpcyBtYXkgaGFwcGVuIGR1ZSB0byB0aGUgbWVyZ2UgaW4gaW5kZXhpbmdcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG51bU9mZnNldHM7IGkgKz0gMSkge1xuICAgICAgaWYgKG9mZltpIC0gMV0ubWF4di5jb21wYXJlVG8ob2ZmW2ldLm1pbnYpID49IDApIHtcbiAgICAgICAgb2ZmW2kgLSAxXS5tYXh2ID0gb2ZmW2ldLm1pbnZcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBtZXJnZSBhZGphY2VudCBibG9ja3NcbiAgICBsID0gMFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnVtT2Zmc2V0czsgaSArPSAxKSB7XG4gICAgICBpZiAob2ZmW2xdLm1heHYuYmxvY2tQb3NpdGlvbiA9PT0gb2ZmW2ldLm1pbnYuYmxvY2tQb3NpdGlvbilcbiAgICAgICAgb2ZmW2xdLm1heHYgPSBvZmZbaV0ubWF4dlxuICAgICAgZWxzZSB7XG4gICAgICAgIGwgKz0gMVxuICAgICAgICBvZmZbbF0ubWludiA9IG9mZltpXS5taW52XG4gICAgICAgIG9mZltsXS5tYXh2ID0gb2ZmW2ldLm1heHZcbiAgICAgIH1cbiAgICB9XG4gICAgbnVtT2Zmc2V0cyA9IGwgKyAxXG5cbiAgICByZXR1cm4gb2ZmLnNsaWNlKDAsIG51bU9mZnNldHMpXG4gIH1cblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBsaXN0IG9mIGJpbnMgdGhhdCBtYXkgb3ZlcmxhcCB3aXRoIHJlZ2lvbiBbYmVnLGVuZCkgKHplcm8tYmFzZWQgaGFsZi1vcGVuKVxuICAgKiBAcmV0dXJucyB7QXJyYXlbbnVtYmVyXX1cbiAgICovXG4gIHJlZzJiaW5zKGJlZzogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgIGJlZyAtPSAxIC8vIDwgY29udmVydCB0byAxLWJhc2VkIGNsb3NlZFxuICAgIGlmIChiZWcgPCAxKSBiZWcgPSAxXG4gICAgaWYgKGVuZCA+IDIgKiogNTApIGVuZCA9IDIgKiogMzQgLy8gMTcgR2lCIG91Z2h0IHRvIGJlIGVub3VnaCBmb3IgYW55Ym9keVxuICAgIGVuZCAtPSAxXG4gICAgbGV0IGwgPSAwXG4gICAgbGV0IHQgPSAwXG4gICAgbGV0IHMgPSB0aGlzLm1pblNoaWZ0ICsgdGhpcy5kZXB0aCAqIDNcbiAgICBjb25zdCBiaW5zID0gW11cbiAgICBmb3IgKDsgbCA8PSB0aGlzLmRlcHRoOyBzIC09IDMsIHQgKz0gbHNoaWZ0KDEsIGwgKiAzKSwgbCArPSAxKSB7XG4gICAgICBjb25zdCBiID0gdCArIHJzaGlmdChiZWcsIHMpXG4gICAgICBjb25zdCBlID0gdCArIHJzaGlmdChlbmQsIHMpXG4gICAgICBpZiAoZSAtIGIgKyBiaW5zLmxlbmd0aCA+IHRoaXMubWF4QmluTnVtYmVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHF1ZXJ5ICR7YmVnfS0ke2VuZH0gaXMgdG9vIGxhcmdlIGZvciBjdXJyZW50IGJpbm5pbmcgc2NoZW1lIChzaGlmdCAke3RoaXMubWluU2hpZnR9LCBkZXB0aCAke3RoaXMuZGVwdGh9KSwgdHJ5IGEgc21hbGxlciBxdWVyeSBvciBhIGNvYXJzZXIgaW5kZXggYmlubmluZyBzY2hlbWVgLFxuICAgICAgICApXG4gICAgICBmb3IgKGxldCBpID0gYjsgaSA8PSBlOyBpICs9IDEpIGJpbnMucHVzaChpKVxuICAgIH1cbiAgICByZXR1cm4gYmluc1xuICB9XG59XG4iXX0=