1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.default = void 0;
|
7 | exports.readCollation = readCollation;
|
8 | exports.readMetadata = readMetadata;
|
9 | var _collation = require("./collation");
|
10 | var _dataType = require("./data-type");
|
11 | var _sprintfJs = require("sprintf-js");
|
12 | var _helpers = require("./token/helpers");
|
13 | function readCollation(buf, offset) {
|
14 | offset = +offset;
|
15 | if (buf.length < offset + 5) {
|
16 | throw new _helpers.NotEnoughDataError(offset + 5);
|
17 | }
|
18 | const collation = _collation.Collation.fromBuffer(buf.slice(offset, offset + 5));
|
19 | return new _helpers.Result(collation, offset + 5);
|
20 | }
|
21 | function readSchema(buf, offset) {
|
22 | offset = +offset;
|
23 | let schemaPresent;
|
24 | ({
|
25 | offset,
|
26 | value: schemaPresent
|
27 | } = (0, _helpers.readUInt8)(buf, offset));
|
28 | if (schemaPresent !== 0x01) {
|
29 | return new _helpers.Result(undefined, offset);
|
30 | }
|
31 | let dbname;
|
32 | ({
|
33 | offset,
|
34 | value: dbname
|
35 | } = (0, _helpers.readBVarChar)(buf, offset));
|
36 | let owningSchema;
|
37 | ({
|
38 | offset,
|
39 | value: owningSchema
|
40 | } = (0, _helpers.readBVarChar)(buf, offset));
|
41 | let xmlSchemaCollection;
|
42 | ({
|
43 | offset,
|
44 | value: xmlSchemaCollection
|
45 | } = (0, _helpers.readUsVarChar)(buf, offset));
|
46 | return new _helpers.Result({
|
47 | dbname,
|
48 | owningSchema,
|
49 | xmlSchemaCollection
|
50 | }, offset);
|
51 | }
|
52 | function readUDTInfo(buf, offset) {
|
53 | let maxByteSize;
|
54 | ({
|
55 | offset,
|
56 | value: maxByteSize
|
57 | } = (0, _helpers.readUInt16LE)(buf, offset));
|
58 | let dbname;
|
59 | ({
|
60 | offset,
|
61 | value: dbname
|
62 | } = (0, _helpers.readBVarChar)(buf, offset));
|
63 | let owningSchema;
|
64 | ({
|
65 | offset,
|
66 | value: owningSchema
|
67 | } = (0, _helpers.readBVarChar)(buf, offset));
|
68 | let typeName;
|
69 | ({
|
70 | offset,
|
71 | value: typeName
|
72 | } = (0, _helpers.readBVarChar)(buf, offset));
|
73 | let assemblyName;
|
74 | ({
|
75 | offset,
|
76 | value: assemblyName
|
77 | } = (0, _helpers.readUsVarChar)(buf, offset));
|
78 | return new _helpers.Result({
|
79 | maxByteSize: maxByteSize,
|
80 | dbname: dbname,
|
81 | owningSchema: owningSchema,
|
82 | typeName: typeName,
|
83 | assemblyName: assemblyName
|
84 | }, offset);
|
85 | }
|
86 | function readMetadata(buf, offset, options) {
|
87 | let userType;
|
88 | ({
|
89 | offset,
|
90 | value: userType
|
91 | } = (options.tdsVersion < '7_2' ? _helpers.readUInt16LE : _helpers.readUInt32LE)(buf, offset));
|
92 | let flags;
|
93 | ({
|
94 | offset,
|
95 | value: flags
|
96 | } = (0, _helpers.readUInt16LE)(buf, offset));
|
97 | let typeNumber;
|
98 | ({
|
99 | offset,
|
100 | value: typeNumber
|
101 | } = (0, _helpers.readUInt8)(buf, offset));
|
102 | const type = _dataType.TYPE[typeNumber];
|
103 | if (!type) {
|
104 | throw new Error((0, _sprintfJs.sprintf)('Unrecognised data type 0x%02X', typeNumber));
|
105 | }
|
106 | switch (type.name) {
|
107 | case 'Null':
|
108 | case 'TinyInt':
|
109 | case 'SmallInt':
|
110 | case 'Int':
|
111 | case 'BigInt':
|
112 | case 'Real':
|
113 | case 'Float':
|
114 | case 'SmallMoney':
|
115 | case 'Money':
|
116 | case 'Bit':
|
117 | case 'SmallDateTime':
|
118 | case 'DateTime':
|
119 | case 'Date':
|
120 | return new _helpers.Result({
|
121 | userType: userType,
|
122 | flags: flags,
|
123 | type: type,
|
124 | collation: undefined,
|
125 | precision: undefined,
|
126 | scale: undefined,
|
127 | dataLength: undefined,
|
128 | schema: undefined,
|
129 | udtInfo: undefined
|
130 | }, offset);
|
131 | case 'IntN':
|
132 | case 'FloatN':
|
133 | case 'MoneyN':
|
134 | case 'BitN':
|
135 | case 'UniqueIdentifier':
|
136 | case 'DateTimeN':
|
137 | {
|
138 | let dataLength;
|
139 | ({
|
140 | offset,
|
141 | value: dataLength
|
142 | } = (0, _helpers.readUInt8)(buf, offset));
|
143 | return new _helpers.Result({
|
144 | userType: userType,
|
145 | flags: flags,
|
146 | type: type,
|
147 | collation: undefined,
|
148 | precision: undefined,
|
149 | scale: undefined,
|
150 | dataLength: dataLength,
|
151 | schema: undefined,
|
152 | udtInfo: undefined
|
153 | }, offset);
|
154 | }
|
155 | case 'Variant':
|
156 | {
|
157 | let dataLength;
|
158 | ({
|
159 | offset,
|
160 | value: dataLength
|
161 | } = (0, _helpers.readUInt32LE)(buf, offset));
|
162 | return new _helpers.Result({
|
163 | userType: userType,
|
164 | flags: flags,
|
165 | type: type,
|
166 | collation: undefined,
|
167 | precision: undefined,
|
168 | scale: undefined,
|
169 | dataLength: dataLength,
|
170 | schema: undefined,
|
171 | udtInfo: undefined
|
172 | }, offset);
|
173 | }
|
174 | case 'VarChar':
|
175 | case 'Char':
|
176 | case 'NVarChar':
|
177 | case 'NChar':
|
178 | {
|
179 | let dataLength;
|
180 | ({
|
181 | offset,
|
182 | value: dataLength
|
183 | } = (0, _helpers.readUInt16LE)(buf, offset));
|
184 | let collation;
|
185 | ({
|
186 | offset,
|
187 | value: collation
|
188 | } = readCollation(buf, offset));
|
189 | return new _helpers.Result({
|
190 | userType: userType,
|
191 | flags: flags,
|
192 | type: type,
|
193 | collation: collation,
|
194 | precision: undefined,
|
195 | scale: undefined,
|
196 | dataLength: dataLength,
|
197 | schema: undefined,
|
198 | udtInfo: undefined
|
199 | }, offset);
|
200 | }
|
201 | case 'Text':
|
202 | case 'NText':
|
203 | {
|
204 | let dataLength;
|
205 | ({
|
206 | offset,
|
207 | value: dataLength
|
208 | } = (0, _helpers.readUInt32LE)(buf, offset));
|
209 | let collation;
|
210 | ({
|
211 | offset,
|
212 | value: collation
|
213 | } = readCollation(buf, offset));
|
214 | return new _helpers.Result({
|
215 | userType: userType,
|
216 | flags: flags,
|
217 | type: type,
|
218 | collation: collation,
|
219 | precision: undefined,
|
220 | scale: undefined,
|
221 | dataLength: dataLength,
|
222 | schema: undefined,
|
223 | udtInfo: undefined
|
224 | }, offset);
|
225 | }
|
226 | case 'VarBinary':
|
227 | case 'Binary':
|
228 | {
|
229 | let dataLength;
|
230 | ({
|
231 | offset,
|
232 | value: dataLength
|
233 | } = (0, _helpers.readUInt16LE)(buf, offset));
|
234 | return new _helpers.Result({
|
235 | userType: userType,
|
236 | flags: flags,
|
237 | type: type,
|
238 | collation: undefined,
|
239 | precision: undefined,
|
240 | scale: undefined,
|
241 | dataLength: dataLength,
|
242 | schema: undefined,
|
243 | udtInfo: undefined
|
244 | }, offset);
|
245 | }
|
246 | case 'Image':
|
247 | {
|
248 | let dataLength;
|
249 | ({
|
250 | offset,
|
251 | value: dataLength
|
252 | } = (0, _helpers.readUInt32LE)(buf, offset));
|
253 | return new _helpers.Result({
|
254 | userType: userType,
|
255 | flags: flags,
|
256 | type: type,
|
257 | collation: undefined,
|
258 | precision: undefined,
|
259 | scale: undefined,
|
260 | dataLength: dataLength,
|
261 | schema: undefined,
|
262 | udtInfo: undefined
|
263 | }, offset);
|
264 | }
|
265 | case 'Xml':
|
266 | {
|
267 | let schema;
|
268 | ({
|
269 | offset,
|
270 | value: schema
|
271 | } = readSchema(buf, offset));
|
272 | return new _helpers.Result({
|
273 | userType: userType,
|
274 | flags: flags,
|
275 | type: type,
|
276 | collation: undefined,
|
277 | precision: undefined,
|
278 | scale: undefined,
|
279 | dataLength: undefined,
|
280 | schema: schema,
|
281 | udtInfo: undefined
|
282 | }, offset);
|
283 | }
|
284 | case 'Time':
|
285 | case 'DateTime2':
|
286 | case 'DateTimeOffset':
|
287 | {
|
288 | let scale;
|
289 | ({
|
290 | offset,
|
291 | value: scale
|
292 | } = (0, _helpers.readUInt8)(buf, offset));
|
293 | return new _helpers.Result({
|
294 | userType: userType,
|
295 | flags: flags,
|
296 | type: type,
|
297 | collation: undefined,
|
298 | precision: undefined,
|
299 | scale: scale,
|
300 | dataLength: undefined,
|
301 | schema: undefined,
|
302 | udtInfo: undefined
|
303 | }, offset);
|
304 | }
|
305 | case 'NumericN':
|
306 | case 'DecimalN':
|
307 | {
|
308 | let dataLength;
|
309 | ({
|
310 | offset,
|
311 | value: dataLength
|
312 | } = (0, _helpers.readUInt8)(buf, offset));
|
313 | let precision;
|
314 | ({
|
315 | offset,
|
316 | value: precision
|
317 | } = (0, _helpers.readUInt8)(buf, offset));
|
318 | let scale;
|
319 | ({
|
320 | offset,
|
321 | value: scale
|
322 | } = (0, _helpers.readUInt8)(buf, offset));
|
323 | return new _helpers.Result({
|
324 | userType: userType,
|
325 | flags: flags,
|
326 | type: type,
|
327 | collation: undefined,
|
328 | precision: precision,
|
329 | scale: scale,
|
330 | dataLength: dataLength,
|
331 | schema: undefined,
|
332 | udtInfo: undefined
|
333 | }, offset);
|
334 | }
|
335 | case 'UDT':
|
336 | {
|
337 | let udtInfo;
|
338 | ({
|
339 | offset,
|
340 | value: udtInfo
|
341 | } = readUDTInfo(buf, offset));
|
342 | return new _helpers.Result({
|
343 | userType: userType,
|
344 | flags: flags,
|
345 | type: type,
|
346 | collation: undefined,
|
347 | precision: undefined,
|
348 | scale: undefined,
|
349 | dataLength: undefined,
|
350 | schema: undefined,
|
351 | udtInfo: udtInfo
|
352 | }, offset);
|
353 | }
|
354 | default:
|
355 | throw new Error((0, _sprintfJs.sprintf)('Unrecognised type %s', type.name));
|
356 | }
|
357 | }
|
358 | function metadataParse(parser, options, callback) {
|
359 | (async () => {
|
360 | while (true) {
|
361 | let result;
|
362 | try {
|
363 | result = readMetadata(parser.buffer, parser.position, options);
|
364 | } catch (err) {
|
365 | if (err instanceof _helpers.NotEnoughDataError) {
|
366 | await parser.waitForChunk();
|
367 | continue;
|
368 | }
|
369 | throw err;
|
370 | }
|
371 | parser.position = result.offset;
|
372 | return callback(result.value);
|
373 | }
|
374 | })();
|
375 | }
|
376 | var _default = exports.default = metadataParse;
|
377 | module.exports = metadataParse;
|
378 | module.exports.readCollation = readCollation;
|
379 | module.exports.readMetadata = readMetadata;
|
380 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29sbGF0aW9uIiwicmVxdWlyZSIsIl9kYXRhVHlwZSIsIl9zcHJpbnRmSnMiLCJfaGVscGVycyIsInJlYWRDb2xsYXRpb24iLCJidWYiLCJvZmZzZXQiLCJsZW5ndGgiLCJOb3RFbm91Z2hEYXRhRXJyb3IiLCJjb2xsYXRpb24iLCJDb2xsYXRpb24iLCJmcm9tQnVmZmVyIiwic2xpY2UiLCJSZXN1bHQiLCJyZWFkU2NoZW1hIiwic2NoZW1hUHJlc2VudCIsInZhbHVlIiwicmVhZFVJbnQ4IiwidW5kZWZpbmVkIiwiZGJuYW1lIiwicmVhZEJWYXJDaGFyIiwib3duaW5nU2NoZW1hIiwieG1sU2NoZW1hQ29sbGVjdGlvbiIsInJlYWRVc1ZhckNoYXIiLCJyZWFkVURUSW5mbyIsIm1heEJ5dGVTaXplIiwicmVhZFVJbnQxNkxFIiwidHlwZU5hbWUiLCJhc3NlbWJseU5hbWUiLCJyZWFkTWV0YWRhdGEiLCJvcHRpb25zIiwidXNlclR5cGUiLCJ0ZHNWZXJzaW9uIiwicmVhZFVJbnQzMkxFIiwiZmxhZ3MiLCJ0eXBlTnVtYmVyIiwidHlwZSIsIlRZUEUiLCJFcnJvciIsInNwcmludGYiLCJuYW1lIiwicHJlY2lzaW9uIiwic2NhbGUiLCJkYXRhTGVuZ3RoIiwic2NoZW1hIiwidWR0SW5mbyIsIm1ldGFkYXRhUGFyc2UiLCJwYXJzZXIiLCJjYWxsYmFjayIsInJlc3VsdCIsImJ1ZmZlciIsInBvc2l0aW9uIiwiZXJyIiwid2FpdEZvckNodW5rIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwiZGVmYXVsdCIsIm1vZHVsZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRhZGF0YS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuaW1wb3J0IFBhcnNlciwgeyB0eXBlIFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL3Rva2VuL3N0cmVhbS1wYXJzZXInO1xuaW1wb3J0IHsgVFlQRSwgdHlwZSBEYXRhVHlwZSB9IGZyb20gJy4vZGF0YS10eXBlJztcbmltcG9ydCB7IHR5cGUgQ3J5cHRvTWV0YWRhdGEgfSBmcm9tICcuL2Fsd2F5cy1lbmNyeXB0ZWQvdHlwZXMnO1xuXG5pbXBvcnQgeyBzcHJpbnRmIH0gZnJvbSAnc3ByaW50Zi1qcyc7XG5cbmltcG9ydCB7IFJlc3VsdCwgTm90RW5vdWdoRGF0YUVycm9yLCByZWFkVUludDgsIHJlYWRCVmFyQ2hhciwgcmVhZFVzVmFyQ2hhciwgcmVhZFVJbnQxNkxFLCByZWFkVUludDMyTEUgfSBmcm9tICcuL3Rva2VuL2hlbHBlcnMnO1xuXG5pbnRlcmZhY2UgWG1sU2NoZW1hIHtcbiAgZGJuYW1lOiBzdHJpbmc7XG4gIG93bmluZ1NjaGVtYTogc3RyaW5nO1xuICB4bWxTY2hlbWFDb2xsZWN0aW9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBVZHRJbmZvIHtcbiAgbWF4Qnl0ZVNpemU6IG51bWJlcjtcbiAgZGJuYW1lOiBzdHJpbmc7XG4gIG93bmluZ1NjaGVtYTogc3RyaW5nO1xuICB0eXBlTmFtZTogc3RyaW5nO1xuICBhc3NlbWJseU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQmFzZU1ldGFkYXRhID0ge1xuICB1c2VyVHlwZTogbnVtYmVyO1xuXG4gIGZsYWdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uJ3MgdHlwZSwgc3VjaCBhcyBWYXJDaGFyLCBJbnQgb3IgQmluYXJ5LlxuICAgKi9cbiAgdHlwZTogRGF0YVR5cGU7XG5cbiAgY29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgcHJlY2lzaW9uLiBPbmx5IGFwcGxpY2FibGUgdG8gbnVtZXJpYyBhbmQgZGVjaW1hbC5cbiAgICovXG4gIHByZWNpc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NhbGUuIE9ubHkgYXBwbGljYWJsZSB0byBudW1lcmljLCBkZWNpbWFsLCB0aW1lLCBkYXRldGltZTIgYW5kIGRhdGV0aW1lb2Zmc2V0LlxuICAgKi9cbiAgc2NhbGU6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGxlbmd0aCwgZm9yIGNoYXIsIHZhcmNoYXIsIG52YXJjaGFyIGFuZCB2YXJiaW5hcnkuXG4gICAqL1xuICBkYXRhTGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgc2NoZW1hOiBYbWxTY2hlbWEgfCB1bmRlZmluZWQ7XG5cbiAgdWR0SW5mbzogVWR0SW5mbyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IHR5cGUgTWV0YWRhdGEgPSB7XG4gIGNyeXB0b01ldGFkYXRhPzogQ3J5cHRvTWV0YWRhdGE7XG59ICYgQmFzZU1ldGFkYXRhO1xuXG5mdW5jdGlvbiByZWFkQ29sbGF0aW9uKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxDb2xsYXRpb24+IHtcbiAgb2Zmc2V0ID0gK29mZnNldDtcblxuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIDUpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIDUpO1xuICB9XG5cbiAgY29uc3QgY29sbGF0aW9uID0gQ29sbGF0aW9uLmZyb21CdWZmZXIoYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgNSkpO1xuICByZXR1cm4gbmV3IFJlc3VsdChjb2xsYXRpb24sIG9mZnNldCArIDUpO1xufVxuXG5mdW5jdGlvbiByZWFkU2NoZW1hKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxYbWxTY2hlbWEgfCB1bmRlZmluZWQ+IHtcbiAgb2Zmc2V0ID0gK29mZnNldDtcblxuICBsZXQgc2NoZW1hUHJlc2VudDtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogc2NoZW1hUHJlc2VudCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgaWYgKHNjaGVtYVByZXNlbnQgIT09IDB4MDEpIHtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh1bmRlZmluZWQsIG9mZnNldCk7XG4gIH1cblxuICBsZXQgZGJuYW1lO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYm5hbWUgfSA9IHJlYWRCVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIGxldCBvd25pbmdTY2hlbWE7XG4gICh7IG9mZnNldCwgdmFsdWU6IG93bmluZ1NjaGVtYSB9ID0gcmVhZEJWYXJDaGFyKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IHhtbFNjaGVtYUNvbGxlY3Rpb247XG4gICh7IG9mZnNldCwgdmFsdWU6IHhtbFNjaGVtYUNvbGxlY3Rpb24gfSA9IHJlYWRVc1ZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdCh7IGRibmFtZSwgb3duaW5nU2NoZW1hLCB4bWxTY2hlbWFDb2xsZWN0aW9uIH0sIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRVRFRJbmZvKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxVZHRJbmZvPiB7XG4gIGxldCBtYXhCeXRlU2l6ZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogbWF4Qnl0ZVNpemUgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCBkYm5hbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRibmFtZSB9ID0gcmVhZEJWYXJDaGFyKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IG93bmluZ1NjaGVtYTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogb3duaW5nU2NoZW1hIH0gPSByZWFkQlZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgdHlwZU5hbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IHR5cGVOYW1lIH0gPSByZWFkQlZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgYXNzZW1ibHlOYW1lO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBhc3NlbWJseU5hbWUgfSA9IHJlYWRVc1ZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgbWF4Qnl0ZVNpemU6IG1heEJ5dGVTaXplLFxuICAgIGRibmFtZTogZGJuYW1lLFxuICAgIG93bmluZ1NjaGVtYTogb3duaW5nU2NoZW1hLFxuICAgIHR5cGVOYW1lOiB0eXBlTmFtZSxcbiAgICBhc3NlbWJseU5hbWU6IGFzc2VtYmx5TmFtZVxuICB9LCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkTWV0YWRhdGEoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKTogUmVzdWx0PE1ldGFkYXRhPiB7XG4gIGxldCB1c2VyVHlwZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdXNlclR5cGUgfSA9IChvcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJyA/IHJlYWRVSW50MTZMRSA6IHJlYWRVSW50MzJMRSkoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgZmxhZ3M7XG4gICh7IG9mZnNldCwgdmFsdWU6IGZsYWdzIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgdHlwZU51bWJlcjtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdHlwZU51bWJlciB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgY29uc3QgdHlwZTogRGF0YVR5cGUgPSBUWVBFW3R5cGVOdW1iZXJdO1xuICBpZiAoIXR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignVW5yZWNvZ25pc2VkIGRhdGEgdHlwZSAweCUwMlgnLCB0eXBlTnVtYmVyKSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgIGNhc2UgJ051bGwnOlxuICAgIGNhc2UgJ1RpbnlJbnQnOlxuICAgIGNhc2UgJ1NtYWxsSW50JzpcbiAgICBjYXNlICdJbnQnOlxuICAgIGNhc2UgJ0JpZ0ludCc6XG4gICAgY2FzZSAnUmVhbCc6XG4gICAgY2FzZSAnRmxvYXQnOlxuICAgIGNhc2UgJ1NtYWxsTW9uZXknOlxuICAgIGNhc2UgJ01vbmV5JzpcbiAgICBjYXNlICdCaXQnOlxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YUxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnSW50Tic6XG4gICAgY2FzZSAnRmxvYXROJzpcbiAgICBjYXNlICdNb25leU4nOlxuICAgIGNhc2UgJ0JpdE4nOlxuICAgIGNhc2UgJ1VuaXF1ZUlkZW50aWZpZXInOlxuICAgIGNhc2UgJ0RhdGVUaW1lTic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YUxlbmd0aDogZGF0YUxlbmd0aCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJpYW50Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ1ZhckNoYXInOlxuICAgIGNhc2UgJ0NoYXInOlxuICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICBjYXNlICdOQ2hhcic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGxldCBjb2xsYXRpb247XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBjb2xsYXRpb24gfSA9IHJlYWRDb2xsYXRpb24oYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiBjb2xsYXRpb24sXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ1RleHQnOlxuICAgIGNhc2UgJ05UZXh0Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgbGV0IGNvbGxhdGlvbjtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGNvbGxhdGlvbiB9ID0gcmVhZENvbGxhdGlvbihidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IGNvbGxhdGlvbixcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFMZW5ndGg6IGRhdGFMZW5ndGgsXG4gICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgIH0sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyQmluYXJ5JzpcbiAgICBjYXNlICdCaW5hcnknOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFMZW5ndGg6IGRhdGFMZW5ndGgsXG4gICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgIH0sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnSW1hZ2UnOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFMZW5ndGg6IGRhdGFMZW5ndGgsXG4gICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgIH0sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnWG1sJzoge1xuICAgICAgbGV0IHNjaGVtYTtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IHNjaGVtYSB9ID0gcmVhZFNjaGVtYShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFMZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdUaW1lJzpcbiAgICBjYXNlICdEYXRlVGltZTInOlxuICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0Jzoge1xuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogc2NhbGUgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgICAgZGF0YUxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ051bWVyaWNOJzpcbiAgICBjYXNlICdEZWNpbWFsTic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGxldCBwcmVjaXNpb247XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBwcmVjaXNpb24gfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBzY2FsZSB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBwcmVjaXNpb246IHByZWNpc2lvbixcbiAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ1VEVCc6IHtcbiAgICAgIGxldCB1ZHRJbmZvO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdWR0SW5mbyB9ID0gcmVhZFVEVEluZm8oYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICB1ZHRJbmZvOiB1ZHRJbmZvXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignVW5yZWNvZ25pc2VkIHR5cGUgJXMnLCB0eXBlLm5hbWUpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXRhZGF0YVBhcnNlKHBhcnNlcjogUGFyc2VyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjYWxsYmFjazogKG1ldGFkYXRhOiBNZXRhZGF0YSkgPT4gdm9pZCkge1xuICAoYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gcmVhZE1ldGFkYXRhKHBhcnNlci5idWZmZXIsIHBhcnNlci5wb3NpdGlvbiwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgICAgYXdhaXQgcGFyc2VyLndhaXRGb3JDaHVuaygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICBwYXJzZXIucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHJlc3VsdC52YWx1ZSk7XG4gICAgfVxuICB9KSgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZXRhZGF0YVBhcnNlO1xuZXhwb3J0IHsgcmVhZENvbGxhdGlvbiwgcmVhZE1ldGFkYXRhIH07XG5cbm1vZHVsZS5leHBvcnRzID0gbWV0YWRhdGFQYXJzZTtcbm1vZHVsZS5leHBvcnRzLnJlYWRDb2xsYXRpb24gPSByZWFkQ29sbGF0aW9uO1xubW9kdWxlLmV4cG9ydHMucmVhZE1ldGFkYXRhID0gcmVhZE1ldGFkYXRhO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUdBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQWtEQSxTQUFTSSxhQUFhQSxDQUFDQyxHQUFXLEVBQUVDLE1BQWMsRUFBcUI7RUFDckVBLE1BQU0sR0FBRyxDQUFDQSxNQUFNO0VBRWhCLElBQUlELEdBQUcsQ0FBQ0UsTUFBTSxHQUFHRCxNQUFNLEdBQUcsQ0FBQyxFQUFFO0lBQzNCLE1BQU0sSUFBSUUsMkJBQWtCLENBQUNGLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDMUM7RUFFQSxNQUFNRyxTQUFTLEdBQUdDLG9C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 |
\ | No newline at end of file |