@gmod/bbi 2.0.3 → 2.0.5
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/CHANGELOG.md +11 -1
- package/README.md +1 -1
- package/dist/bbi.js +160 -268
- package/dist/bbi.js.map +1 -1
- package/dist/bigbed.js +146 -259
- package/dist/bigbed.js.map +1 -1
- package/dist/bigint-polyfill/polyfill.js +1 -1
- package/dist/bigint-polyfill/polyfill.js.map +1 -1
- package/dist/bigint-polyfill/pure.js +11 -11
- package/dist/bigint-polyfill/pure.js.map +1 -1
- package/dist/bigwig.js +21 -75
- package/dist/bigwig.js.map +1 -1
- package/dist/blockView.js +207 -303
- package/dist/blockView.js.map +1 -1
- package/dist/range.js +49 -50
- package/dist/range.js.map +1 -1
- package/dist/unzip-pako.js +1 -1
- package/dist/unzip-pako.js.map +1 -1
- package/dist/unzip.js +1 -1
- package/dist/unzip.js.map +1 -1
- package/dist/util.js +14 -66
- package/dist/util.js.map +1 -1
- package/esm/bbi.js +4 -3
- package/esm/bbi.js.map +1 -1
- package/esm/blockView.js +2 -3
- package/esm/blockView.js.map +1 -1
- package/package.json +13 -13
- package/src/bbi.ts +5 -3
- package/src/blockView.ts +14 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
## [2.0.
|
|
1
|
+
## [2.0.5](https://github.com/GMOD/bbi-js/compare/v2.0.4...v2.0.5) (2022-12-17)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
- Cleanup package.json and README
|
|
2
6
|
|
|
7
|
+
## [2.0.4](https://github.com/GMOD/bbi-js/compare/v2.0.3...v2.0.4) (2022-10-15)
|
|
3
8
|
|
|
4
9
|
|
|
10
|
+
|
|
11
|
+
- Use plain TextDecoder for decoding autoSql
|
|
12
|
+
|
|
13
|
+
## [2.0.3](https://github.com/GMOD/bbi-js/compare/v2.0.2...v2.0.3) (2022-10-10)
|
|
14
|
+
|
|
5
15
|
- Add BigInt64 polyfill for older safari
|
|
6
16
|
|
|
7
17
|
## [2.0.2](https://github.com/GMOD/bbi-js/compare/v2.0.1...v2.0.2) (2022-07-18)
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://npmjs.org/package/@gmod/bbi)
|
|
4
4
|
[](https://codecov.io/gh/GMOD/bbi-js/branch/master)
|
|
5
|
-
[](https://github.com/GMOD/bbi-js/actions?query=branch%3Amaster+workflow%3APush+)
|
|
6
6
|
|
|
7
7
|
A parser for bigwig and bigbed file formats
|
|
8
8
|
|
package/dist/bbi.js
CHANGED
|
@@ -1,15 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -19,50 +8,26 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
19
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
9
|
});
|
|
21
10
|
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (_) try {
|
|
29
|
-
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;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
12
|
exports.BBI = void 0;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
13
|
+
const binary_parser_1 = require("binary-parser");
|
|
14
|
+
const generic_filehandle_1 = require("generic-filehandle");
|
|
15
|
+
const rxjs_1 = require("rxjs");
|
|
16
|
+
const operators_1 = require("rxjs/operators");
|
|
17
|
+
const blockView_1 = require("./blockView");
|
|
18
|
+
const BIG_WIG_MAGIC = -2003829722;
|
|
19
|
+
const BIG_BED_MAGIC = -2021002517;
|
|
20
|
+
function toString(arr) {
|
|
21
|
+
return new TextDecoder().decode(arr);
|
|
22
|
+
}
|
|
58
23
|
/* get the compiled parsers for different sections of the bigwig file
|
|
59
24
|
*
|
|
60
25
|
* @param isBE - is big endian, typically false
|
|
61
26
|
* @return an object with compiled parsers
|
|
62
27
|
*/
|
|
63
28
|
function getParsers(isBE) {
|
|
64
|
-
|
|
65
|
-
|
|
29
|
+
const le = isBE ? 'big' : 'little';
|
|
30
|
+
const headerParser = new binary_parser_1.Parser()
|
|
66
31
|
.endianess(le)
|
|
67
32
|
.int32('magic')
|
|
68
33
|
.uint16('version')
|
|
@@ -85,43 +50,42 @@ function getParsers(isBE) {
|
|
|
85
50
|
.uint64('dataOffset')
|
|
86
51
|
.uint64('indexOffset'),
|
|
87
52
|
});
|
|
88
|
-
|
|
53
|
+
const totalSummaryParser = new binary_parser_1.Parser()
|
|
89
54
|
.endianess(le)
|
|
90
55
|
.uint64('basesCovered')
|
|
91
56
|
.doublele('scoreMin')
|
|
92
57
|
.doublele('scoreMax')
|
|
93
58
|
.doublele('scoreSum')
|
|
94
59
|
.doublele('scoreSumSquares');
|
|
95
|
-
|
|
60
|
+
const chromTreeParser = new binary_parser_1.Parser()
|
|
96
61
|
.endianess(le)
|
|
97
62
|
.uint32('magic')
|
|
98
63
|
.uint32('blockSize')
|
|
99
64
|
.uint32('keySize')
|
|
100
65
|
.uint32('valSize')
|
|
101
66
|
.uint64('itemCount');
|
|
102
|
-
|
|
67
|
+
const isLeafNode = new binary_parser_1.Parser()
|
|
103
68
|
.endianess(le)
|
|
104
69
|
.uint8('isLeafNode')
|
|
105
70
|
.skip(1)
|
|
106
71
|
.uint16('cnt')
|
|
107
72
|
.saveOffset('offset');
|
|
108
73
|
return {
|
|
109
|
-
chromTreeParser
|
|
110
|
-
totalSummaryParser
|
|
111
|
-
headerParser
|
|
112
|
-
isLeafNode
|
|
74
|
+
chromTreeParser,
|
|
75
|
+
totalSummaryParser,
|
|
76
|
+
headerParser,
|
|
77
|
+
isLeafNode,
|
|
113
78
|
};
|
|
114
79
|
}
|
|
115
|
-
|
|
80
|
+
class BBI {
|
|
116
81
|
/*
|
|
117
82
|
* @param filehandle - a filehandle from generic-filehandle or implementing something similar to the node10 fs.promises API
|
|
118
83
|
* @param path - a Local file path as a string
|
|
119
84
|
* @param url - a URL string
|
|
120
85
|
* @param renameRefSeqs - an optional method to rename the internal reference sequences using a mapping function
|
|
121
86
|
*/
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
var filehandle = options.filehandle, _a = options.renameRefSeqs, renameRefSeqs = _a === void 0 ? function (s) { return s; } : _a, path = options.path, url = options.url;
|
|
87
|
+
constructor(options = {}) {
|
|
88
|
+
const { filehandle, renameRefSeqs = s => s, path, url } = options;
|
|
125
89
|
this.renameRefSeqs = renameRefSeqs;
|
|
126
90
|
if (filehandle) {
|
|
127
91
|
this.bbi = filehandle;
|
|
@@ -140,72 +104,51 @@ var BBI = /** @class */ (function () {
|
|
|
140
104
|
* @param abortSignal - abort the operation, can be null
|
|
141
105
|
* @return a Header object
|
|
142
106
|
*/
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (opts === void 0) { opts = {}; }
|
|
146
|
-
var options = 'aborted' in opts ? { signal: opts } : opts;
|
|
107
|
+
getHeader(opts = {}) {
|
|
108
|
+
const options = 'aborted' in opts ? { signal: opts } : opts;
|
|
147
109
|
if (!this.headerP) {
|
|
148
|
-
this.headerP = this._getHeader(options).catch(
|
|
149
|
-
|
|
110
|
+
this.headerP = this._getHeader(options).catch(e => {
|
|
111
|
+
this.headerP = undefined;
|
|
150
112
|
throw e;
|
|
151
113
|
});
|
|
152
114
|
}
|
|
153
115
|
return this.headerP;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
case 0: return [4 /*yield*/, this._getMainHeader(opts)];
|
|
161
|
-
case 1:
|
|
162
|
-
header = _a.sent();
|
|
163
|
-
return [4 /*yield*/, this._readChromTree(header, opts)];
|
|
164
|
-
case 2:
|
|
165
|
-
chroms = _a.sent();
|
|
166
|
-
return [2 /*return*/, __assign(__assign({}, header), chroms)];
|
|
167
|
-
}
|
|
168
|
-
});
|
|
116
|
+
}
|
|
117
|
+
_getHeader(opts) {
|
|
118
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
+
const header = yield this._getMainHeader(opts);
|
|
120
|
+
const chroms = yield this._readChromTree(header, opts);
|
|
121
|
+
return Object.assign(Object.assign({}, header), chroms);
|
|
169
122
|
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
return [2 /*return*/, this._getMainHeader(opts, requestSize * 2)];
|
|
196
|
-
}
|
|
197
|
-
if (header.totalSummaryOffset) {
|
|
198
|
-
tail = buffer.subarray(Number(header.totalSummaryOffset));
|
|
199
|
-
sum = ret.totalSummaryParser.parse(tail);
|
|
200
|
-
header.totalSummary = __assign(__assign({}, sum), { basesCovered: Number(sum.basesCovered) });
|
|
201
|
-
}
|
|
202
|
-
return [2 /*return*/, __assign(__assign({}, header), { isBigEndian: isBigEndian })];
|
|
203
|
-
}
|
|
204
|
-
});
|
|
123
|
+
}
|
|
124
|
+
_getMainHeader(opts, requestSize = 2000) {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
const { buffer } = yield this.bbi.read(Buffer.alloc(requestSize), 0, requestSize, 0, opts);
|
|
127
|
+
const isBigEndian = this._isBigEndian(buffer);
|
|
128
|
+
const ret = getParsers(isBigEndian);
|
|
129
|
+
const header = ret.headerParser.parse(buffer);
|
|
130
|
+
const { magic, asOffset, totalSummaryOffset } = header;
|
|
131
|
+
header.fileType = magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig';
|
|
132
|
+
if (asOffset > requestSize || totalSummaryOffset > requestSize) {
|
|
133
|
+
return this._getMainHeader(opts, requestSize * 2);
|
|
134
|
+
}
|
|
135
|
+
if (asOffset) {
|
|
136
|
+
const off = Number(header.asOffset);
|
|
137
|
+
header.autoSql = toString(buffer.subarray(off, buffer.indexOf(0, off)));
|
|
138
|
+
}
|
|
139
|
+
if (header.totalSummaryOffset > requestSize) {
|
|
140
|
+
return this._getMainHeader(opts, requestSize * 2);
|
|
141
|
+
}
|
|
142
|
+
if (header.totalSummaryOffset) {
|
|
143
|
+
const tail = buffer.subarray(Number(header.totalSummaryOffset));
|
|
144
|
+
const sum = ret.totalSummaryParser.parse(tail);
|
|
145
|
+
header.totalSummary = Object.assign(Object.assign({}, sum), { basesCovered: Number(sum.basesCovered) });
|
|
146
|
+
}
|
|
147
|
+
return Object.assign(Object.assign({}, header), { isBigEndian });
|
|
205
148
|
});
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
149
|
+
}
|
|
150
|
+
_isBigEndian(buffer) {
|
|
151
|
+
let ret = buffer.readInt32LE(0);
|
|
209
152
|
if (ret === BIG_WIG_MAGIC || ret === BIG_BED_MAGIC) {
|
|
210
153
|
return false;
|
|
211
154
|
}
|
|
@@ -214,108 +157,82 @@ var BBI = /** @class */ (function () {
|
|
|
214
157
|
return true;
|
|
215
158
|
}
|
|
216
159
|
throw new Error('not a BigWig/BigBed file');
|
|
217
|
-
}
|
|
160
|
+
}
|
|
218
161
|
// todo: add progress if long running
|
|
219
|
-
|
|
220
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
return [3 /*break*/, 3];
|
|
275
|
-
case 1:
|
|
276
|
-
nextNodes = [];
|
|
277
|
-
for (n = 0; n < cnt; n += 1) {
|
|
278
|
-
nonleafRet = nonleafNodeParser.parse(buffer.subarray(offset));
|
|
279
|
-
childOffset = nonleafRet.childOffset;
|
|
280
|
-
offset += nonleafRet.offset;
|
|
281
|
-
nextNodes.push(bptReadNode(Number(childOffset) - Number(chromTreeOffset)));
|
|
282
|
-
}
|
|
283
|
-
return [4 /*yield*/, Promise.all(nextNodes)];
|
|
284
|
-
case 2:
|
|
285
|
-
_a.sent();
|
|
286
|
-
_a.label = 3;
|
|
287
|
-
case 3: return [2 /*return*/];
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
}); };
|
|
291
|
-
return [4 /*yield*/, bptReadNode(rootNodeOffset)];
|
|
292
|
-
case 2:
|
|
293
|
-
_a.sent();
|
|
294
|
-
return [2 /*return*/, {
|
|
295
|
-
refsByName: refsByName,
|
|
296
|
-
refsByNumber: refsByNumber,
|
|
297
|
-
}];
|
|
162
|
+
_readChromTree(header, opts) {
|
|
163
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
164
|
+
const isBE = header.isBigEndian;
|
|
165
|
+
const le = isBE ? 'big' : 'little';
|
|
166
|
+
const refsByNumber = [];
|
|
167
|
+
const refsByName = {};
|
|
168
|
+
let unzoomedDataOffset = Number(header.unzoomedDataOffset);
|
|
169
|
+
const chromTreeOffset = Number(header.chromTreeOffset);
|
|
170
|
+
while (unzoomedDataOffset % 4 !== 0) {
|
|
171
|
+
unzoomedDataOffset += 1;
|
|
172
|
+
}
|
|
173
|
+
const off = unzoomedDataOffset - chromTreeOffset;
|
|
174
|
+
const { buffer } = yield this.bbi.read(Buffer.alloc(off), 0, off, Number(chromTreeOffset), opts);
|
|
175
|
+
const p = getParsers(isBE);
|
|
176
|
+
const { keySize } = p.chromTreeParser.parse(buffer);
|
|
177
|
+
const leafNodeParser = new binary_parser_1.Parser()
|
|
178
|
+
.endianess(le)
|
|
179
|
+
.string('key', { stripNull: true, length: keySize })
|
|
180
|
+
.uint32('refId')
|
|
181
|
+
.uint32('refSize')
|
|
182
|
+
.saveOffset('offset');
|
|
183
|
+
const nonleafNodeParser = new binary_parser_1.Parser()
|
|
184
|
+
.endianess(le)
|
|
185
|
+
.skip(keySize)
|
|
186
|
+
.uint64('childOffset')
|
|
187
|
+
.saveOffset('offset');
|
|
188
|
+
const rootNodeOffset = 32;
|
|
189
|
+
const bptReadNode = (currentOffset) => __awaiter(this, void 0, void 0, function* () {
|
|
190
|
+
let offset = currentOffset;
|
|
191
|
+
if (offset >= buffer.length) {
|
|
192
|
+
throw new Error('reading beyond end of buffer');
|
|
193
|
+
}
|
|
194
|
+
const ret = p.isLeafNode.parse(buffer.subarray(offset));
|
|
195
|
+
const { isLeafNode, cnt } = ret;
|
|
196
|
+
offset += ret.offset;
|
|
197
|
+
if (isLeafNode) {
|
|
198
|
+
for (let n = 0; n < cnt; n += 1) {
|
|
199
|
+
const leafRet = leafNodeParser.parse(buffer.subarray(offset));
|
|
200
|
+
offset += leafRet.offset;
|
|
201
|
+
const { key, refId, refSize } = leafRet;
|
|
202
|
+
const refRec = { name: key, id: refId, length: refSize };
|
|
203
|
+
refsByName[this.renameRefSeqs(key)] = refId;
|
|
204
|
+
refsByNumber[refId] = refRec;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
// parse index node
|
|
209
|
+
const nextNodes = [];
|
|
210
|
+
for (let n = 0; n < cnt; n += 1) {
|
|
211
|
+
const nonleafRet = nonleafNodeParser.parse(buffer.subarray(offset));
|
|
212
|
+
const { childOffset } = nonleafRet;
|
|
213
|
+
offset += nonleafRet.offset;
|
|
214
|
+
nextNodes.push(bptReadNode(Number(childOffset) - Number(chromTreeOffset)));
|
|
215
|
+
}
|
|
216
|
+
yield Promise.all(nextNodes);
|
|
298
217
|
}
|
|
299
218
|
});
|
|
219
|
+
yield bptReadNode(rootNodeOffset);
|
|
220
|
+
return {
|
|
221
|
+
refsByName,
|
|
222
|
+
refsByNumber,
|
|
223
|
+
};
|
|
300
224
|
});
|
|
301
|
-
}
|
|
225
|
+
}
|
|
302
226
|
/*
|
|
303
227
|
* fetches the "unzoomed" view of the bigwig data. this is the default for bigbed
|
|
304
228
|
* @param abortSignal - a signal to optionally abort this operation
|
|
305
229
|
*/
|
|
306
|
-
|
|
307
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
308
|
-
|
|
309
|
-
return
|
|
310
|
-
switch (_b.label) {
|
|
311
|
-
case 0: return [4 /*yield*/, this.getHeader(opts)];
|
|
312
|
-
case 1:
|
|
313
|
-
_a = _b.sent(), unzoomedIndexOffset = _a.unzoomedIndexOffset, refsByName = _a.refsByName, uncompressBufSize = _a.uncompressBufSize, isBigEndian = _a.isBigEndian, fileType = _a.fileType;
|
|
314
|
-
return [2 /*return*/, new blockView_1.BlockView(this.bbi, refsByName, unzoomedIndexOffset, isBigEndian, uncompressBufSize > 0, fileType)];
|
|
315
|
-
}
|
|
316
|
-
});
|
|
230
|
+
getUnzoomedView(opts) {
|
|
231
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
232
|
+
const { unzoomedIndexOffset, refsByName, uncompressBufSize, isBigEndian, fileType, } = yield this.getHeader(opts);
|
|
233
|
+
return new blockView_1.BlockView(this.bbi, refsByName, unzoomedIndexOffset, isBigEndian, uncompressBufSize > 0, fileType);
|
|
317
234
|
});
|
|
318
|
-
}
|
|
235
|
+
}
|
|
319
236
|
/**
|
|
320
237
|
* Gets features from a BigWig file
|
|
321
238
|
*
|
|
@@ -324,66 +241,41 @@ var BBI = /** @class */ (function () {
|
|
|
324
241
|
* @param end - The end of a region
|
|
325
242
|
* @param opts - An object containing basesPerSpan (e.g. pixels per basepair) or scale used to infer the zoomLevel to use
|
|
326
243
|
*/
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
view = _a.sent();
|
|
349
|
-
return [3 /*break*/, 7];
|
|
350
|
-
case 5: return [4 /*yield*/, this.getView(1, opts)];
|
|
351
|
-
case 6:
|
|
352
|
-
view = _a.sent();
|
|
353
|
-
_a.label = 7;
|
|
354
|
-
case 7:
|
|
355
|
-
if (!view) {
|
|
356
|
-
throw new Error('unable to get block view for data');
|
|
357
|
-
}
|
|
358
|
-
return [2 /*return*/, new rxjs_1.Observable(function (observer) {
|
|
359
|
-
view.readWigData(chrName, start, end, observer, opts);
|
|
360
|
-
})];
|
|
361
|
-
}
|
|
244
|
+
getFeatureStream(refName, start, end, opts = {
|
|
245
|
+
scale: 1,
|
|
246
|
+
}) {
|
|
247
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
+
yield this.getHeader(opts);
|
|
249
|
+
const chrName = this.renameRefSeqs(refName);
|
|
250
|
+
let view;
|
|
251
|
+
if (opts.basesPerSpan) {
|
|
252
|
+
view = yield this.getView(1 / opts.basesPerSpan, opts);
|
|
253
|
+
}
|
|
254
|
+
else if (opts.scale) {
|
|
255
|
+
view = yield this.getView(opts.scale, opts);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
view = yield this.getView(1, opts);
|
|
259
|
+
}
|
|
260
|
+
if (!view) {
|
|
261
|
+
throw new Error('unable to get block view for data');
|
|
262
|
+
}
|
|
263
|
+
return new rxjs_1.Observable((observer) => {
|
|
264
|
+
view.readWigData(chrName, start, end, observer, opts);
|
|
362
265
|
});
|
|
363
266
|
});
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
case 1:
|
|
375
|
-
ob = _a.sent();
|
|
376
|
-
return [4 /*yield*/, ob
|
|
377
|
-
.pipe((0, operators_1.reduce)(function (acc, curr) { return acc.concat(curr); }))
|
|
378
|
-
.toPromise()];
|
|
379
|
-
case 2:
|
|
380
|
-
ret = _a.sent();
|
|
381
|
-
return [2 /*return*/, ret || []];
|
|
382
|
-
}
|
|
383
|
-
});
|
|
267
|
+
}
|
|
268
|
+
getFeatures(refName, start, end, opts = {
|
|
269
|
+
scale: 1,
|
|
270
|
+
}) {
|
|
271
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
272
|
+
const ob = yield this.getFeatureStream(refName, start, end, opts);
|
|
273
|
+
const ret = yield ob
|
|
274
|
+
.pipe((0, operators_1.reduce)((acc, curr) => acc.concat(curr)))
|
|
275
|
+
.toPromise();
|
|
276
|
+
return ret || [];
|
|
384
277
|
});
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
}());
|
|
278
|
+
}
|
|
279
|
+
}
|
|
388
280
|
exports.BBI = BBI;
|
|
389
281
|
//# sourceMappingURL=bbi.js.map
|
package/dist/bbi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAsC;AACtC,2DAA6E;AAC7E,+BAA2C;AAC3C,8CAAuC;AACvC,2CAAuC;AAEvC,MAAM,aAAa,GAAG,CAAC,UAAU,CAAA;AACjC,MAAM,aAAa,GAAG,CAAC,UAAU,CAAA;AAEjC,SAAS,QAAQ,CAAC,GAAe;IAC/B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACtC,CAAC;AAyCD;;;;GAIG;AACH,SAAS,UAAU,CAAC,IAAa;IAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;IAClC,MAAM,YAAY,GAAG,IAAI,sBAAM,EAAE;SAC9B,SAAS,CAAC,EAAE,CAAC;SACb,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,SAAS,CAAC;SACjB,MAAM,CAAC,eAAe,CAAC;SACvB,MAAM,CAAC,iBAAiB,CAAC;SACzB,MAAM,CAAC,oBAAoB,CAAC;SAC5B,MAAM,CAAC,qBAAqB,CAAC;SAC7B,MAAM,CAAC,YAAY,CAAC;SACpB,MAAM,CAAC,mBAAmB,CAAC;SAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,iCAAiC;SACpD,MAAM,CAAC,oBAAoB,CAAC;SAC5B,MAAM,CAAC,mBAAmB,CAAC;SAC3B,MAAM,CAAC,iBAAiB,CAAC,CAAC,oCAAoC;SAC9D,KAAK,CAAC,YAAY,EAAE;QACnB,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE,IAAI,sBAAM,EAAE;aACf,SAAS,CAAC,EAAE,CAAC;aACb,MAAM,CAAC,gBAAgB,CAAC;aACxB,MAAM,CAAC,UAAU,CAAC;aAClB,MAAM,CAAC,YAAY,CAAC;aACpB,MAAM,CAAC,aAAa,CAAC;KACzB,CAAC,CAAA;IAEJ,MAAM,kBAAkB,GAAG,IAAI,sBAAM,EAAE;SACpC,SAAS,CAAC,EAAE,CAAC;SACb,MAAM,CAAC,cAAc,CAAC;SACtB,QAAQ,CAAC,UAAU,CAAC;SACpB,QAAQ,CAAC,UAAU,CAAC;SACpB,QAAQ,CAAC,UAAU,CAAC;SACpB,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IAE9B,MAAM,eAAe,GAAG,IAAI,sBAAM,EAAE;SACjC,SAAS,CAAC,EAAE,CAAC;SACb,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,WAAW,CAAC;SACnB,MAAM,CAAC,SAAS,CAAC;SACjB,MAAM,CAAC,SAAS,CAAC;SACjB,MAAM,CAAC,WAAW,CAAC,CAAA;IAEtB,MAAM,UAAU,GAAG,IAAI,sBAAM,EAAE;SAC5B,SAAS,CAAC,EAAE,CAAC;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,IAAI,CAAC,CAAC,CAAC;SACP,MAAM,CAAC,KAAK,CAAC;SACb,UAAU,CAAC,QAAQ,CAAC,CAAA;IAEvB,OAAO;QACL,eAAe;QACf,kBAAkB;QAClB,YAAY;QACZ,UAAU;KACX,CAAA;AACH,CAAC;AAQD,MAAsB,GAAG;IAsBvB;;;;;OAKG;IACH,YACE,UAKI,EAAE;QAEN,MAAM,EAAE,UAAU,EAAE,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;QACjE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,UAAU,EAAE;YACd,IAAI,CAAC,GAAG,GAAG,UAAU,CAAA;SACtB;aAAM,IAAI,GAAG,EAAE;YACd,IAAI,CAAC,GAAG,GAAG,IAAI,+BAAU,CAAC,GAAG,CAAC,CAAA;SAC/B;aAAM,IAAI,IAAI,EAAE;YACf,IAAI,CAAC,GAAG,GAAG,IAAI,8BAAS,CAAC,IAAI,CAAC,CAAA;SAC/B;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;SACjC;IACH,CAAC;IAxCD;;;OAGG;IACI,SAAS,CAAC,OAAqC,EAAE;QACtD,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAC1E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBAChD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;gBACxB,MAAM,CAAC,CAAA;YACT,CAAC,CAAC,CAAA;SACH;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IA6Ba,UAAU,CAAC,IAAoB;;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACtD,uCAAY,MAAM,GAAK,MAAM,EAAE;QACjC,CAAC;KAAA;IAEa,cAAc,CAC1B,IAAoB,EACpB,WAAW,GAAG,IAAI;;YAElB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EACzB,CAAC,EACD,WAAW,EACX,CAAC,EACD,IAAI,CACL,CAAA;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;YACnC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAC7C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAA;YACtD,MAAM,CAAC,QAAQ,GAAG,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;YAC/D,IAAI,QAAQ,GAAG,WAAW,IAAI,kBAAkB,GAAG,WAAW,EAAE;gBAC9D,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;aAClD;YACD,IAAI,QAAQ,EAAE;gBACZ,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBACnC,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;aACxE;YACD,IAAI,MAAM,CAAC,kBAAkB,GAAG,WAAW,EAAE;gBAC3C,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;aAClD;YACD,IAAI,MAAM,CAAC,kBAAkB,EAAE;gBAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAA;gBAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC9C,MAAM,CAAC,YAAY,mCAAQ,GAAG,KAAE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAE,CAAA;aACzE;YACD,uCAAY,MAAM,KAAE,WAAW,IAAE;QACnC,CAAC;KAAA;IAEO,YAAY,CAAC,MAAc;QACjC,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,aAAa,EAAE;YAClD,OAAO,KAAK,CAAA;SACb;QACD,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAC3B,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,aAAa,EAAE;YAClD,OAAO,IAAI,CAAA;SACZ;QACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IAED,qCAAqC;IACvB,cAAc,CAAC,MAAc,EAAE,IAA8B;;YACzE,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAA;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;YAClC,MAAM,YAAY,GAEd,EAAE,CAAA;YACN,MAAM,UAAU,GAA8B,EAAE,CAAA;YAEhD,IAAI,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;YAC1D,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;YACtD,OAAO,kBAAkB,GAAG,CAAC,KAAK,CAAC,EAAE;gBACnC,kBAAkB,IAAI,CAAC,CAAA;aACxB;YACD,MAAM,GAAG,GAAG,kBAAkB,GAAG,eAAe,CAAA;YAChD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CACpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EACjB,CAAC,EACD,GAAG,EACH,MAAM,CAAC,eAAe,CAAC,EACvB,IAAI,CACL,CAAA;YAED,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;YAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACnD,MAAM,cAAc,GAAG,IAAI,sBAAM,EAAE;iBAChC,SAAS,CAAC,EAAE,CAAC;iBACb,MAAM,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;iBACnD,MAAM,CAAC,OAAO,CAAC;iBACf,MAAM,CAAC,SAAS,CAAC;iBACjB,UAAU,CAAC,QAAQ,CAAC,CAAA;YACvB,MAAM,iBAAiB,GAAG,IAAI,sBAAM,EAAE;iBACnC,SAAS,CAAC,EAAE,CAAC;iBACb,IAAI,CAAC,OAAO,CAAC;iBACb,MAAM,CAAC,aAAa,CAAC;iBACrB,UAAU,CAAC,QAAQ,CAAC,CAAA;YACvB,MAAM,cAAc,GAAG,EAAE,CAAA;YACzB,MAAM,WAAW,GAAG,CAAO,aAAqB,EAAE,EAAE;gBAClD,IAAI,MAAM,GAAG,aAAa,CAAA;gBAC1B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;oBAC3B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;iBAChD;gBACD,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;gBACvD,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;gBAC/B,MAAM,IAAI,GAAG,CAAC,MAAM,CAAA;gBACpB,IAAI,UAAU,EAAE;oBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;wBAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;wBAC7D,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;wBACxB,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;wBACvC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;wBACxD,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;wBAC3C,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,CAAA;qBAC7B;iBACF;qBAAM;oBACL,mBAAmB;oBACnB,MAAM,SAAS,GAAG,EAAE,CAAA;oBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;wBAC/B,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;wBACnE,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAAA;wBAClC,MAAM,IAAI,UAAU,CAAC,MAAM,CAAA;wBAC3B,SAAS,CAAC,IAAI,CACZ,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAC3D,CAAA;qBACF;oBACD,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;iBAC7B;YACH,CAAC,CAAA,CAAA;YACD,MAAM,WAAW,CAAC,cAAc,CAAC,CAAA;YACjC,OAAO;gBACL,UAAU;gBACV,YAAY;aACb,CAAA;QACH,CAAC;KAAA;IAED;;;OAGG;IACa,eAAe,CAAC,IAAoB;;YAClD,MAAM,EACJ,mBAAmB,EACnB,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,QAAQ,GACT,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAC9B,OAAO,IAAI,qBAAS,CAClB,IAAI,CAAC,GAAG,EACR,UAAU,EACV,mBAAmB,EACnB,WAAW,EACX,iBAAiB,GAAG,CAAC,EACrB,QAAQ,CACT,CAAA;QACH,CAAC;KAAA;IAUD;;;;;;;OAOG;IACU,gBAAgB,CAC3B,OAAe,EACf,KAAa,EACb,GAAW,EACX,OAAmE;QACjE,KAAK,EAAE,CAAC;KACT;;YAED,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YAC3C,IAAI,IAAe,CAAA;YAEnB,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;aACvD;iBAAM,IAAI,IAAI,CAAC,KAAK,EAAE;gBACrB,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;aAC5C;iBAAM;gBACL,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;aACnC;YAED,IAAI,CAAC,IAAI,EAAE;gBACT,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;aACrD;YACD,OAAO,IAAI,iBAAU,CAAC,CAAC,QAA6B,EAAQ,EAAE;gBAC5D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;YACvD,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEY,WAAW,CACtB,OAAe,EACf,KAAa,EACb,GAAW,EACX,OAAmE;QACjE,KAAK,EAAE,CAAC;KACT;;YAED,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAEjE,MAAM,GAAG,GAAG,MAAM,EAAE;iBACjB,IAAI,CAAC,IAAA,kBAAM,EAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;iBAC7C,SAAS,EAAE,CAAA;YACd,OAAO,GAAG,IAAI,EAAE,CAAA;QAClB,CAAC;KAAA;CACF;AAjQD,kBAiQC"}
|