tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
266 lines (256 loc) • 28.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
const SHIFT_LEFT_32 = (1 << 16) * (1 << 16);
const SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
// The first chunk starts small and doubles up to `CHUNK_SIZE`: most payloads
// built through this class are a few dozen bytes.
const MIN_CHUNK_SIZE = 64;
/**
* A write-side buffer list.
*
* Bytes are appended through the `write*` methods, and taken out again
* either as a single buffer (`data`, `slice`) or as a list of chunks
* (`getBuffers`, `consume`). Small pieces are coalesced into chunks of at
* most `CHUNK_SIZE` bytes. Buffers of at least `CHUNK_SIZE` bytes written
* through `writeBuffer` are referenced rather than copied, so that large
* values cost no extra memory. (The caller must therefore not modify such
* buffers until they have been consumed.)
*
* The consumer side (`length`, `getBuffers`, `consume`, `slice`) mirrors
* that of `bl`'s `BufferList`.
*/
class WritableTrackingBuffer {
/**
* The size of the chunks a `WritableTrackingBuffer` produces, and the size
* from which written buffers are referenced rather than copied.
*/
static CHUNK_SIZE = 8 * 1024;
/**
* The number of bytes appended and not yet consumed.
*/
constructor() {
this.length = 0;
this._bufs = [];
this._open = Buffer.allocUnsafe(MIN_CHUNK_SIZE);
this._pos = 0;
}
/**
* All appended and not yet consumed bytes as a single buffer.
*
* When everything fits into a single chunk this is a view of that chunk
* rather than a copy. The returned buffer must not be modified.
*/
get data() {
if (this._bufs.length === 0) {
return this._open.subarray(0, this._pos);
}
return this.slice();
}
_seal() {
if (this._pos > 0) {
this._bufs.push(this._open.subarray(0, this._pos));
this._open = Buffer.allocUnsafe(Math.min(this._open.length * 2, WritableTrackingBuffer.CHUNK_SIZE));
this._pos = 0;
}
}
_ensure(size) {
if (this._open.length - this._pos < size) {
this._seal();
if (this._open.length < size) {
this._open = Buffer.allocUnsafe(size);
}
}
}
/**
* The chunks holding all appended and not yet consumed bytes.
*
* The returned array is the list's own: later appends can add chunks to
* it. `consume` does not modify it, so taking the chunks and consuming
* them right away yields a stable snapshot.
*/
getBuffers() {
this._seal();
return this._bufs;
}
/**
* Discards the given number of bytes from the front of the list.
*/
consume(bytes) {
this._seal();
const bufs = this._bufs;
let i = 0;
while (i < bufs.length && bytes >= bufs[i].length) {
bytes -= bufs[i].length;
this.length -= bufs[i].length;
i++;
}
// A fresh array, so that a previously returned `getBuffers()` result
// stays intact.
this._bufs = bufs.slice(i);
if (bytes > 0 && this._bufs.length) {
this._bufs[0] = this._bufs[0].subarray(bytes);
this.length -= bytes;
}
return this;
}
/**
* Copies all appended and not yet consumed bytes into a new buffer.
*/
slice() {
this._seal();
const result = Buffer.allocUnsafe(this.length);
let position = 0;
for (const buffer of this._bufs) {
position += buffer.copy(result, position);
}
return result;
}
writeUInt8(value) {
this._ensure(1);
this._open.writeUInt8(value, this._pos);
this._pos += 1;
this.length += 1;
}
writeUInt16LE(value) {
this._ensure(2);
this._open.writeUInt16LE(value, this._pos);
this._pos += 2;
this.length += 2;
}
writeUShort(value) {
this.writeUInt16LE(value);
}
writeUInt16BE(value) {
this._ensure(2);
this._open.writeUInt16BE(value, this._pos);
this._pos += 2;
this.length += 2;
}
writeUInt24LE(value) {
this._ensure(3);
this._open[this._pos + 2] = value >>> 16 & 0xff;
this._open[this._pos + 1] = value >>> 8 & 0xff;
this._open[this._pos] = value & 0xff;
this._pos += 3;
this.length += 3;
}
writeUInt32LE(value) {
this._ensure(4);
this._open.writeUInt32LE(value, this._pos);
this._pos += 4;
this.length += 4;
}
writeBigInt64LE(value) {
this._ensure(8);
this._open.writeBigInt64LE(value, this._pos);
this._pos += 8;
this.length += 8;
}
writeInt64LE(value) {
this.writeBigInt64LE(BigInt(value));
}
writeUInt64LE(value) {
this.writeBigUInt64LE(BigInt(value));
}
writeBigUInt64LE(value) {
this._ensure(8);
this._open.writeBigUInt64LE(value, this._pos);
this._pos += 8;
this.length += 8;
}
writeUInt32BE(value) {
this._ensure(4);
this._open.writeUInt32BE(value, this._pos);
this._pos += 4;
this.length += 4;
}
writeUInt40LE(value) {
// inspired by https://github.com/dpw/node-buffer-more-ints
this.writeInt32LE(value & -1);
this.writeUInt8(Math.floor(value * SHIFT_RIGHT_32));
}
writeInt8(value) {
this._ensure(1);
this._open.writeInt8(value, this._pos);
this._pos += 1;
this.length += 1;
}
writeInt16LE(value) {
this._ensure(2);
this._open.writeInt16LE(value, this._pos);
this._pos += 2;
this.length += 2;
}
writeInt16BE(value) {
this._ensure(2);
this._open.writeInt16BE(value, this._pos);
this._pos += 2;
this.length += 2;
}
writeInt32LE(value) {
this._ensure(4);
this._open.writeInt32LE(value, this._pos);
this._pos += 4;
this.length += 4;
}
writeInt32BE(value) {
this._ensure(4);
this._open.writeInt32BE(value, this._pos);
this._pos += 4;
this.length += 4;
}
writeFloatLE(value) {
this._ensure(4);
this._open.writeFloatLE(value, this._pos);
this._pos += 4;
this.length += 4;
}
writeDoubleLE(value) {
this._ensure(8);
this._open.writeDoubleLE(value, this._pos);
this._pos += 8;
this.length += 8;
}
writeString(value, encoding) {
// UCS-2 is two bytes per UTF-16 code unit.
const length = encoding === 'ucs2' ? value.length * 2 : Buffer.byteLength(value, encoding);
this._ensure(length);
this._open.write(value, this._pos, encoding);
this._pos += length;
this.length += length;
}
writeBVarchar(value, encoding) {
this.writeUInt8(value.length);
this.writeString(value, encoding);
}
writeUsVarchar(value, encoding) {
this.writeUInt16LE(value.length);
this.writeString(value, encoding);
}
writeUsVarbyte(value) {
this.writeUInt16LE(value.length);
this.writeBuffer(value);
}
/**
* Appends a buffer. Buffers of at least `CHUNK_SIZE` bytes are referenced
* rather than copied, and must not be modified until consumed.
*/
writeBuffer(value) {
const length = value.length;
if (length >= WritableTrackingBuffer.CHUNK_SIZE) {
this._seal();
this._bufs.push(value);
} else {
this._ensure(length);
value.copy(this._open, this._pos);
this._pos += length;
}
this.length += length;
}
}
var _default = exports.default = WritableTrackingBuffer;
module.exports = WritableTrackingBuffer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTSElGVF9MRUZUXzMyIiwiU0hJRlRfUklHSFRfMzIiLCJNSU5fQ0hVTktfU0laRSIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJDSFVOS19TSVpFIiwiY29uc3RydWN0b3IiLCJsZW5ndGgiLCJfYnVmcyIsIl9vcGVuIiwiQnVmZmVyIiwiYWxsb2NVbnNhZmUiLCJfcG9zIiwiZGF0YSIsInN1YmFycmF5Iiwic2xpY2UiLCJfc2VhbCIsInB1c2giLCJNYXRoIiwibWluIiwiX2Vuc3VyZSIsInNpemUiLCJnZXRCdWZmZXJzIiwiY29uc3VtZSIsImJ5dGVzIiwiYnVmcyIsImkiLCJyZXN1bHQiLCJwb3NpdGlvbiIsImJ1ZmZlciIsImNvcHkiLCJ3cml0ZVVJbnQ4IiwidmFsdWUiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVU2hvcnQiLCJ3cml0ZVVJbnQxNkJFIiwid3JpdGVVSW50MjRMRSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZUJpZ0ludDY0TEUiLCJ3cml0ZUludDY0TEUiLCJCaWdJbnQiLCJ3cml0ZVVJbnQ2NExFIiwid3JpdGVCaWdVSW50NjRMRSIsIndyaXRlVUludDMyQkUiLCJ3cml0ZVVJbnQ0MExFIiwid3JpdGVJbnQzMkxFIiwiZmxvb3IiLCJ3cml0ZUludDgiLCJ3cml0ZUludDE2TEUiLCJ3cml0ZUludDE2QkUiLCJ3cml0ZUludDMyQkUiLCJ3cml0ZUZsb2F0TEUiLCJ3cml0ZURvdWJsZUxFIiwid3JpdGVTdHJpbmciLCJlbmNvZGluZyIsImJ5dGVMZW5ndGgiLCJ3cml0ZSIsIndyaXRlQlZhcmNoYXIiLCJ3cml0ZVVzVmFyY2hhciIsIndyaXRlVXNWYXJieXRlIiwid3JpdGVCdWZmZXIiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0IiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KTtcbmNvbnN0IFNISUZUX1JJR0hUXzMyID0gMSAvIFNISUZUX0xFRlRfMzI7XG5cbi8vIFRoZSBmaXJzdCBjaHVuayBzdGFydHMgc21hbGwgYW5kIGRvdWJsZXMgdXAgdG8gYENIVU5LX1NJWkVgOiBtb3N0IHBheWxvYWRzXG4vLyBidWlsdCB0aHJvdWdoIHRoaXMgY2xhc3MgYXJlIGEgZmV3IGRvemVuIGJ5dGVzLlxuY29uc3QgTUlOX0NIVU5LX1NJWkUgPSA2NDtcblxuZXhwb3J0IHR5cGUgRW5jb2RpbmcgPSAndXRmOCcgfCAndWNzMicgfCAnYXNjaWknO1xuXG4vKipcbiAqIEEgd3JpdGUtc2lkZSBidWZmZXIgbGlzdC5cbiAqXG4gKiBCeXRlcyBhcmUgYXBwZW5kZWQgdGhyb3VnaCB0aGUgYHdyaXRlKmAgbWV0aG9kcywgYW5kIHRha2VuIG91dCBhZ2FpblxuICogZWl0aGVyIGFzIGEgc2luZ2xlIGJ1ZmZlciAoYGRhdGFgLCBgc2xpY2VgKSBvciBhcyBhIGxpc3Qgb2YgY2h1bmtzXG4gKiAoYGdldEJ1ZmZlcnNgLCBgY29uc3VtZWApLiBTbWFsbCBwaWVjZXMgYXJlIGNvYWxlc2NlZCBpbnRvIGNodW5rcyBvZiBhdFxuICogbW9zdCBgQ0hVTktfU0laRWAgYnl0ZXMuIEJ1ZmZlcnMgb2YgYXQgbGVhc3QgYENIVU5LX1NJWkVgIGJ5dGVzIHdyaXR0ZW5cbiAqIHRocm91Z2ggYHdyaXRlQnVmZmVyYCBhcmUgcmVmZXJlbmNlZCByYXRoZXIgdGhhbiBjb3BpZWQsIHNvIHRoYXQgbGFyZ2VcbiAqIHZhbHVlcyBjb3N0IG5vIGV4dHJhIG1lbW9yeS4gKFRoZSBjYWxsZXIgbXVzdCB0aGVyZWZvcmUgbm90IG1vZGlmeSBzdWNoXG4gKiBidWZmZXJzIHVudGlsIHRoZXkgaGF2ZSBiZWVuIGNvbnN1bWVkLilcbiAqXG4gKiBUaGUgY29uc3VtZXIgc2lkZSAoYGxlbmd0aGAsIGBnZXRCdWZmZXJzYCwgYGNvbnN1bWVgLCBgc2xpY2VgKSBtaXJyb3JzXG4gKiB0aGF0IG9mIGBibGAncyBgQnVmZmVyTGlzdGAuXG4gKi9cbmNsYXNzIFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIge1xuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGNodW5rcyBhIGBXcml0YWJsZVRyYWNraW5nQnVmZmVyYCBwcm9kdWNlcywgYW5kIHRoZSBzaXplXG4gICAqIGZyb20gd2hpY2ggd3JpdHRlbiBidWZmZXJzIGFyZSByZWZlcmVuY2VkIHJhdGhlciB0aGFuIGNvcGllZC5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBDSFVOS19TSVpFID0gOCAqIDEwMjQ7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXBwZW5kZWQgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gICAqL1xuICBkZWNsYXJlIGxlbmd0aDogbnVtYmVyO1xuXG4gIGRlY2xhcmUgcHJpdmF0ZSBfYnVmczogQnVmZmVyW107XG4gIGRlY2xhcmUgcHJpdmF0ZSBfb3BlbjogQnVmZmVyO1xuICBkZWNsYXJlIHByaXZhdGUgX3BvczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9idWZzID0gW107XG4gICAgdGhpcy5fb3BlbiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShNSU5fQ0hVTktfU0laRSk7XG4gICAgdGhpcy5fcG9zID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgYXBwZW5kZWQgYW5kIG5vdCB5ZXQgY29uc3VtZWQgYnl0ZXMgYXMgYSBzaW5nbGUgYnVmZmVyLlxuICAgKlxuICAgKiBXaGVuIGV2ZXJ5dGhpbmcgZml0cyBpbnRvIGEgc2luZ2xlIGNodW5rIHRoaXMgaXMgYSB2aWV3IG9mIHRoYXQgY2h1bmtcbiAgICogcmF0aGVyIHRoYW4gYSBjb3B5LiBUaGUgcmV0dXJuZWQgYnVmZmVyIG11c3Qgbm90IGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgZ2V0IGRhdGEoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fYnVmcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcGVuLnN1YmFycmF5KDAsIHRoaXMuX3Bvcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2xpY2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlYWwoKSB7XG4gICAgaWYgKHRoaXMuX3BvcyA+IDApIHtcbiAgICAgIHRoaXMuX2J1ZnMucHVzaCh0aGlzLl9vcGVuLnN1YmFycmF5KDAsIHRoaXMuX3BvcykpO1xuICAgICAgdGhpcy5fb3BlbiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShNYXRoLm1pbih0aGlzLl9vcGVuLmxlbmd0aCAqIDIsIFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIuQ0hVTktfU0laRSkpO1xuICAgICAgdGhpcy5fcG9zID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9lbnN1cmUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX29wZW4ubGVuZ3RoIC0gdGhpcy5fcG9zIDwgc2l6ZSkge1xuICAgICAgdGhpcy5fc2VhbCgpO1xuXG4gICAgICBpZiAodGhpcy5fb3Blbi5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgIHRoaXMuX29wZW4gPSBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjaHVua3MgaG9sZGluZyBhbGwgYXBwZW5kZWQgYW5kIG5vdCB5ZXQgY29uc3VtZWQgYnl0ZXMuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGUgbGlzdCdzIG93bjogbGF0ZXIgYXBwZW5kcyBjYW4gYWRkIGNodW5rcyB0b1xuICAgKiBpdC4gYGNvbnN1bWVgIGRvZXMgbm90IG1vZGlmeSBpdCwgc28gdGFraW5nIHRoZSBjaHVua3MgYW5kIGNvbnN1bWluZ1xuICAgKiB0aGVtIHJpZ2h0IGF3YXkgeWllbGRzIGEgc3RhYmxlIHNuYXBzaG90LlxuICAgKi9cbiAgZ2V0QnVmZmVycygpOiBCdWZmZXJbXSB7XG4gICAgdGhpcy5fc2VhbCgpO1xuICAgIHJldHVybiB0aGlzLl9idWZzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NhcmRzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuXG4gICAqL1xuICBjb25zdW1lKGJ5dGVzOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9zZWFsKCk7XG5cbiAgICBjb25zdCBidWZzID0gdGhpcy5fYnVmcztcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBidWZzLmxlbmd0aCAmJiBieXRlcyA+PSBidWZzW2ldLmxlbmd0aCkge1xuICAgICAgYnl0ZXMgLT0gYnVmc1tpXS5sZW5ndGg7XG4gICAgICB0aGlzLmxlbmd0aCAtPSBidWZzW2ldLmxlbmd0aDtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICAvLyBBIGZyZXNoIGFycmF5LCBzbyB0aGF0IGEgcHJldmlvdXNseSByZXR1cm5lZCBgZ2V0QnVmZmVycygpYCByZXN1bHRcbiAgICAvLyBzdGF5cyBpbnRhY3QuXG4gICAgdGhpcy5fYnVmcyA9IGJ1ZnMuc2xpY2UoaSk7XG5cbiAgICBpZiAoYnl0ZXMgPiAwICYmIHRoaXMuX2J1ZnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9idWZzWzBdID0gdGhpcy5fYnVmc1swXS5zdWJhcnJheShieXRlcyk7XG4gICAgICB0aGlzLmxlbmd0aCAtPSBieXRlcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgYWxsIGFwcGVuZGVkIGFuZCBub3QgeWV0IGNvbnN1bWVkIGJ5dGVzIGludG8gYSBuZXcgYnVmZmVyLlxuICAgKi9cbiAgc2xpY2UoKTogQnVmZmVyIHtcbiAgICB0aGlzLl9zZWFsKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBCdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5sZW5ndGgpO1xuICAgIGxldCBwb3NpdGlvbiA9IDA7XG4gICAgZm9yIChjb25zdCBidWZmZXIgb2YgdGhpcy5fYnVmcykge1xuICAgICAgcG9zaXRpb24gKz0gYnVmZmVyLmNvcHkocmVzdWx0LCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHdyaXRlVUludDgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSgxKTtcbiAgICB0aGlzLl9vcGVuLndyaXRlVUludDgodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDE7XG4gICAgdGhpcy5sZW5ndGggKz0gMTtcbiAgfVxuXG4gIHdyaXRlVUludDE2TEUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSgyKTtcbiAgICB0aGlzLl9vcGVuLndyaXRlVUludDE2TEUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDI7XG4gICAgdGhpcy5sZW5ndGggKz0gMjtcbiAgfVxuXG4gIHdyaXRlVVNob3J0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLndyaXRlVUludDE2TEUodmFsdWUpO1xuICB9XG5cbiAgd3JpdGVVSW50MTZCRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDIpO1xuICAgIHRoaXMuX29wZW4ud3JpdGVVSW50MTZCRSh2YWx1ZSwgdGhpcy5fcG9zKTtcbiAgICB0aGlzLl9wb3MgKz0gMjtcbiAgICB0aGlzLmxlbmd0aCArPSAyO1xuICB9XG5cbiAgd3JpdGVVSW50MjRMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDMpO1xuICAgIHRoaXMuX29wZW5bdGhpcy5fcG9zICsgMl0gPSAodmFsdWUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgdGhpcy5fb3Blblt0aGlzLl9wb3MgKyAxXSA9ICh2YWx1ZSA+Pj4gOCkgJiAweGZmO1xuICAgIHRoaXMuX29wZW5bdGhpcy5fcG9zXSA9IHZhbHVlICYgMHhmZjtcbiAgICB0aGlzLl9wb3MgKz0gMztcbiAgICB0aGlzLmxlbmd0aCArPSAzO1xuICB9XG5cbiAgd3JpdGVVSW50MzJMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDQpO1xuICAgIHRoaXMuX29wZW4ud3JpdGVVSW50MzJMRSh2YWx1ZSwgdGhpcy5fcG9zKTtcbiAgICB0aGlzLl9wb3MgKz0gNDtcbiAgICB0aGlzLmxlbmd0aCArPSA0O1xuICB9XG5cbiAgd3JpdGVCaWdJbnQ2NExFKHZhbHVlOiBiaWdpbnQpIHtcbiAgICB0aGlzLl9lbnN1cmUoOCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZUJpZ0ludDY0TEUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDg7XG4gICAgdGhpcy5sZW5ndGggKz0gODtcbiAgfVxuXG4gIHdyaXRlSW50NjRMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy53cml0ZUJpZ0ludDY0TEUoQmlnSW50KHZhbHVlKSk7XG4gIH1cblxuICB3cml0ZVVJbnQ2NExFKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLndyaXRlQmlnVUludDY0TEUoQmlnSW50KHZhbHVlKSk7XG4gIH1cblxuICB3cml0ZUJpZ1VJbnQ2NExFKHZhbHVlOiBiaWdpbnQpIHtcbiAgICB0aGlzLl9lbnN1cmUoOCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZUJpZ1VJbnQ2NExFKHZhbHVlLCB0aGlzLl9wb3MpO1xuICAgIHRoaXMuX3BvcyArPSA4O1xuICAgIHRoaXMubGVuZ3RoICs9IDg7XG4gIH1cblxuICB3cml0ZVVJbnQzMkJFKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lbnN1cmUoNCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZVVJbnQzMkJFKHZhbHVlLCB0aGlzLl9wb3MpO1xuICAgIHRoaXMuX3BvcyArPSA0O1xuICAgIHRoaXMubGVuZ3RoICs9IDQ7XG4gIH1cblxuICB3cml0ZVVJbnQ0MExFKHZhbHVlOiBudW1iZXIpIHtcbiAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZHB3L25vZGUtYnVmZmVyLW1vcmUtaW50c1xuICAgIHRoaXMud3JpdGVJbnQzMkxFKHZhbHVlICYgLTEpO1xuICAgIHRoaXMud3JpdGVVSW50OChNYXRoLmZsb29yKHZhbHVlICogU0hJRlRfUklHSFRfMzIpKTtcbiAgfVxuXG4gIHdyaXRlSW50OCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDEpO1xuICAgIHRoaXMuX29wZW4ud3JpdGVJbnQ4KHZhbHVlLCB0aGlzLl9wb3MpO1xuICAgIHRoaXMuX3BvcyArPSAxO1xuICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gIH1cblxuICB3cml0ZUludDE2TEUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSgyKTtcbiAgICB0aGlzLl9vcGVuLndyaXRlSW50MTZMRSh2YWx1ZSwgdGhpcy5fcG9zKTtcbiAgICB0aGlzLl9wb3MgKz0gMjtcbiAgICB0aGlzLmxlbmd0aCArPSAyO1xuICB9XG5cbiAgd3JpdGVJbnQxNkJFKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lbnN1cmUoMik7XG4gICAgdGhpcy5fb3Blbi53cml0ZUludDE2QkUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDI7XG4gICAgdGhpcy5sZW5ndGggKz0gMjtcbiAgfVxuXG4gIHdyaXRlSW50MzJMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDQpO1xuICAgIHRoaXMuX29wZW4ud3JpdGVJbnQzMkxFKHZhbHVlLCB0aGlzLl9wb3MpO1xuICAgIHRoaXMuX3BvcyArPSA0O1xuICAgIHRoaXMubGVuZ3RoICs9IDQ7XG4gIH1cblxuICB3cml0ZUludDMyQkUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSg0KTtcbiAgICB0aGlzLl9vcGVuLndyaXRlSW50MzJCRSh2YWx1ZSwgdGhpcy5fcG9zKTtcbiAgICB0aGlzLl9wb3MgKz0gNDtcbiAgICB0aGlzLmxlbmd0aCArPSA0O1xuICB9XG5cbiAgd3JpdGVGbG9hdExFKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lbnN1cmUoNCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZUZsb2F0TEUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDQ7XG4gICAgdGhpcy5sZW5ndGggKz0gNDtcbiAgfVxuXG4gIHdyaXRlRG91YmxlTEUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSg4KTtcbiAgICB0aGlzLl9vcGVuLndyaXRlRG91YmxlTEUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDg7XG4gICAgdGhpcy5sZW5ndGggKz0gODtcbiAgfVxuXG4gIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZykge1xuICAgIC8vIFVDUy0yIGlzIHR3byBieXRlcyBwZXIgVVRGLTE2IGNvZGUgdW5pdC5cbiAgICBjb25zdCBsZW5ndGggPSBlbmNvZGluZyA9PT0gJ3VjczInID8gdmFsdWUubGVuZ3RoICogMiA6IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlLCBlbmNvZGluZyk7XG4gICAgdGhpcy5fZW5zdXJlKGxlbmd0aCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZSh2YWx1ZSwgdGhpcy5fcG9zLCBlbmNvZGluZyk7XG4gICAgdGhpcy5fcG9zICs9IGxlbmd0aDtcbiAgICB0aGlzLmxlbmd0aCArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZUJWYXJjaGFyKHZhbHVlOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZykge1xuICAgIHRoaXMud3JpdGVVSW50OCh2YWx1ZS5sZW5ndGgpO1xuICAgIHRoaXMud3JpdGVTdHJpbmcodmFsdWUsIGVuY29kaW5nKTtcbiAgfVxuXG4gIHdyaXRlVXNWYXJjaGFyKHZhbHVlOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZykge1xuICAgIHRoaXMud3JpdGVVSW50MTZMRSh2YWx1ZS5sZW5ndGgpO1xuICAgIHRoaXMud3JpdGVTdHJpbmcodmFsdWUsIGVuY29kaW5nKTtcbiAgfVxuXG4gIHdyaXRlVXNWYXJieXRlKHZhbHVlOiBCdWZmZXIpIHtcbiAgICB0aGlzLndyaXRlVUludDE2TEUodmFsdWUubGVuZ3RoKTtcbiAgICB0aGlzLndyaXRlQnVmZmVyKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgYnVmZmVyLiBCdWZmZXJzIG9mIGF0IGxlYXN0IGBDSFVOS19TSVpFYCBieXRlcyBhcmUgcmVmZXJlbmNlZFxuICAgKiByYXRoZXIgdGhhbiBjb3BpZWQsIGFuZCBtdXN0IG5vdCBiZSBtb2RpZmllZCB1bnRpbCBjb25zdW1lZC5cbiAgICovXG4gIHdyaXRlQnVmZmVyKHZhbHVlOiBCdWZmZXIpIHtcbiAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA+PSBXcml0YWJsZVRyYWNraW5nQnVmZmVyLkNIVU5LX1NJWkUpIHtcbiAgICAgIHRoaXMuX3NlYWwoKTtcbiAgICAgIHRoaXMuX2J1ZnMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Vuc3VyZShsZW5ndGgpO1xuICAgICAgdmFsdWUuY29weSh0aGlzLl9vcGVuLCB0aGlzLl9wb3MpO1xuICAgICAgdGhpcy5fcG9zICs9IGxlbmd0aDtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCArPSBsZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV3JpdGFibGVUcmFja2luZ0J1ZmZlcjtcbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGVUcmFja2luZ0J1ZmZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTUEsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzNDLE1BQU1DLGNBQWMsR0FBRyxDQUFDLEdBQUdELGFBQWE7O0FBRXhDO0FBQ0E7QUFDQSxNQUFNRSxjQUFjLEdBQUcsRUFBRTtBQUl6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsc0JBQXNCLENBQUM7RUFDM0I7QUFDRjtBQUNBO0FBQ0E7RUFDRSxPQUFnQkMsVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJOztFQUVyQztBQUNGO0FBQ0E7O0VBT0VDLFdBQVdBLENBQUEsRUFBRztJQUNaLElBQUksQ0FBQ0MsTUFBTSxHQUFHLENBQUM7SUFDZixJQUFJLENBQUNDLEtBQUssR0FBRyxFQUFFO0lBQ2YsSUFBSSxDQUFDQyxLQUFLLEdBQUdDLE1BQU0sQ0FBQ0MsV0FBVyxDQUFDUixjQUFjLENBQUM7SUFDL0MsSUFBSSxDQUFDUyxJQUFJLEdBQUcsQ0FBQztFQUNmOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFLElBQUlDLElBQUlBLENBQUEsRUFBVztJQUNqQixJQUFJLElBQUksQ0FBQ0wsS0FBSyxDQUFDRCxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzNCLE9BQU8sSUFBSSxDQUFDRSxLQUFLLENBQUNLLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDRixJQUFJLENBQUM7SUFDMUM7SUFFQSxPQUFPLElBQUksQ0FBQ0csS0FBSyxDQUFDLENBQUM7RUFDckI7RUFFUUMsS0FBS0EsQ0FBQSxFQUFHO0lBQ2QsSUFBSSxJQUFJLENBQUNKLElBQUksR0FBRyxDQUFDLEVBQUU7TUFDakIsSUFBSSxDQUFDSixLQUFLLENBQUNTLElBQUksQ0FBQyxJQUFJLENBQUNSLEtBQUssQ0FBQ0ssUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNGLElBQUksQ0FBQyxDQUFDO01BQ2xELElBQUksQ0FBQ0gsS0FBSyxHQUFHQyxNQUFNLENBQUNDLFdBQVcsQ0FBQ08sSUFBSSxDQUFDQyxHQUFHLENBQUMsSUFBSSxDQUFDVixLQUFLLENBQUNGLE1BQU0sR0FBRyxDQUFDLEVBQUVILHNCQUFzQixDQUFDQyxVQUFVLENBQUMsQ0FBQztNQUNuRyxJQUFJLENBQUNPLElBQUksR0FBRyxDQUFDO0lBQ2Y7RUFDRjtFQUVRUSxPQUFPQSxDQUFDQyxJQUFZLEVBQUU7SUFDNUIsSUFBSSxJQUFJLENBQUNaLEtBQUssQ0FBQ0YsTUFBTSxHQUFHLElBQUksQ0FBQ0ssSUFBSSxHQUFHUyxJQUFJLEVBQUU7TUFDeEMsSUFBSSxDQUFDTCxLQUFLLENBQUMsQ0FBQztNQUVaLElBQUksSUFBSSxDQUFDUCxLQUFLLENBQUNGLE1BQU0sR0FBR2MsSUFBSSxFQUFFO1FBQzVCLElBQUksQ0FBQ1osS0FBSyxHQUFHQyxNQUFNLENBQUNDLFdBQVcsQ0FBQ1UsSUFBSSxDQUFDO01BQ3ZDO0lBQ0Y7RUFDRjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxVQUFVQSxDQUFBLEVBQWE7SUFDckIsSUFBSSxDQUFDTixLQUFLLENBQUMsQ0FBQztJQUNaLE9BQU8sSUFBSSxDQUFDUixLQUFLO0VBQ25COztFQUVBO0FBQ0Y7QUFDQTtFQUNFZSxPQUFPQSxDQUFDQyxLQUFhLEVBQVE7SUFDM0IsSUFBSSxDQUFDUixLQUFLLENBQUMsQ0FBQztJQUVaLE1BQU1TLElBQUksR0FBRyxJQUFJLENBQUNqQixLQUFLO0lBQ3ZCLElBQUlrQixDQUFDLEdBQUcsQ0FBQztJQUNULE9BQU9BLENBQUMsR0FBR0QsSUFBSSxDQUFDbEIsTUFBTSxJQUFJaUIsS0FBSyxJQUFJQyxJQUFJLENBQUNDLENBQUMsQ0FBQyxDQUFDbkIsTUFBTSxFQUFFO01BQ2pEaUIsS0FBSyxJQUFJQyxJQUFJLENBQUNDLENBQUMsQ0FBQyxDQUFDbkIsTUFBTTtNQUN2QixJQUFJLENBQUNBLE1BQU0sSUFBSWtCLElBQUksQ0FBQ0MsQ0FBQyxDQUFDLENBQUNuQixNQUFNO01BQzdCbUIsQ0FBQyxFQUFFO0lBQ0w7O0lBRUE7SUFDQTtJQUNBLElBQUksQ0FBQ2xCLEtBQUssR0FBR2lCLElBQUksQ0FBQ1YsS0FBSyxDQUFDVyxDQUFDLENBQUM7SUFFMUIsSUFBSUYsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUNoQixLQUFLLENBQUNELE1BQU0sRUFBRTtNQUNsQyxJQUFJLENBQUNDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUNBLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQ00sUUFBUSxDQUFDVSxLQUFLLENBQUM7TUFDN0MsSUFBSSxDQUFDakIsTUFBTSxJQUFJaUIsS0FBSztJQUN0QjtJQUVBLE9BQU8sSUFBSTtFQUNiOztFQUVBO0FBQ0Y7QUFDQTtFQUNFVCxLQUFLQSxDQUFBLEVBQVc7SUFDZCxJQUFJLENBQUNDLEtBQUssQ0FBQyxDQUFDO0lBRVosTUFBTVcsTUFBTSxHQUFHakIsTUFBTSxDQUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDSixNQUFNLENBQUM7SUFDOUMsSUFBSXFCLFFBQVEsR0FBRyxDQUFDO0lBQ2hCLEtBQUssTUFBTUMsTUFBTSxJQUFJLElBQUksQ0FBQ3JCLEtBQUssRUFBRTtNQUMvQm9CLFFBQVEsSUFBSUMsTUFBTSxDQUFDQyxJQUFJLENBQUNILE1BQU0sRUFBRUMsUUFBUSxDQUFDO0lBQzNDO0lBRUEsT0FBT0QsTUFBTTtFQUNmO0VBRUFJLFVBQVVBLENBQUNDLEtBQWEsRUFBRTtJQUN4QixJQUFJLENBQUNaLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZixJQUFJLENBQUNYLEtBQUssQ0FBQ3NCLFVBQVUsQ0FBQ0MsS0FBSyxFQUFFLElBQUksQ0FBQ3BCLElBQUksQ0FBQztJQUN2QyxJQUFJLENBQUNBLElBQUksSUFBSSxDQUFDO0lBQ2QsSUFBSSxDQUFDTCxNQUFNLElBQUksQ0FBQztFQUNsQjtFQUVBMEIsYUFBYUEsQ0FBQ0QsS0FBYSxFQUFFO0lBQzNCLElBQUksQ0FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksQ0FBQ1gsS0FBSyxDQUFDd0IsYUFBYSxDQUFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDcEIsSUFBSSxDQUFDO0lBQzFDLElBQUksQ0FBQ0EsSUFBSSxJQUFJLENBQUM7SUFDZCxJQUFJLENBQUNMLE1BQU0sSUFBSSxDQUFDO0VBQ2xCO0VBRUEyQixXQUFXQSxDQUFDRixLQUFhLEVBQUU7SUFDekIsSUFBSSxDQUFDQyxhQUFhLENBQUNELEtBQUssQ0FBQztFQUMzQjtFQUVBRyxhQUFhQSxDQUFDSCxLQUFhLEVBQUU7SUFDM0IsSUFBSSxDQUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxDQUFDWCxLQUFLLENBQUMwQixhQUFhLENBQUNILEtBQUssRUFBRSxJQUFJLENBQUNwQixJQUFJLENBQUM7SUFDMUMsSUFBSSxDQUFDQSxJQUFJLElBQUksQ0FBQztJQUNkLElBQUksQ0FBQ0wsTUFBTSxJQUFJLENBQUM7RUFDbEI7RUFFQTZCLGFBQWFBLENBQUNKLEtBQWEsRUFBRTtJQUMzQixJQUFJLENBQUNaLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZixJQUFJLENBQUNYLEtBQUssQ0FBQyxJQUFJLENBQUNHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBSW9CLEtBQUssS0FBSyxFQUFFLEdBQUksSUFBSTtJQUNqRCxJQUFJLENBQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUlvQixLQUFLLEtBQUssQ0FBQyxHQUFJLElBQUk7SUFDaEQsSUFBSSxDQUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQ0csSUFBSSxDQUFDLEdBQUdvQixLQUFLLEdBQUcsSUFBSTtJQUNwQyxJQUFJLENBQUNwQixJQUFJLElBQUksQ0FBQztJQUNkLElBQUksQ0FBQ0wsTUFBTSxJQUFJLENBQUM7RUFDbEI7RUFFQThCLGFBQWFBLENBQUNMLEtBQWEsRUFBRTtJQUMzQixJQUFJLENBQUNaLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZixJQUFJLENBQUNYLEtBQUssQ0FBQzRCLGFBQWEsQ0FBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQ3BCLElBQUksQ0FBQztJQUMxQyxJQUFJLENBQUNBLElBQUksSUFBSSxDQUFDO0lBQ2QsSUFBSSxDQUFDTCxNQUFNLElBQUksQ0FBQztFQUNsQjtFQUVBK0IsZUFBZUEsQ0FBQ04sS0FBYSxFQUFFO0lBQzdCLElBQUksQ0FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksQ0FBQ1gsS0FBSyxDQUFDNkIsZUFBZSxDQUFDTixLQUFLLEVBQUUsSUFBSSxDQUFDcEIsSUFBSSxDQUFDO0lBQzVDLElBQUksQ0FBQ0EsSUFBSSxJQUFJLENBQUM7SUFDZCxJQUFJLENBQUNMLE1BQU0sSUFBSSxDQUFDO0VBQ2xCO0VBRUFnQyxZQUFZQSxDQUFDUCxLQUFhLEVBQUU7SUFDMUIsSUFBSSxDQUFDTSxlQUFlLENBQUNFLE1BQU0sQ0FBQ1IsS0FBSyxDQUFDLENBQUM7RUFDckM7RUFFQVMsYUFBYUEsQ0FBQ1QsS0FBYSxFQUFFO0lBQzNCLElBQUksQ0FBQ1UsZ0JBQWdCLENBQUNGLE1BQU0sQ0FBQ1IsS0FBSyxDQUFDLENBQUM7RUFDdEM7RUFFQVUsZ0JBQWdCQSxDQUFDVixLQUFhLEVBQUU7SUFDOUIsSUFBSSxDQUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxDQUFDWCxLQUFLLENBQUNpQyxnQkFBZ0IsQ0FBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQ3BCLElBQUksQ0FBQztJQUM3QyxJQUFJLENBQUNBLElBQUksSUFBSSxDQUFDO0lBQ2QsSUFBSSxDQUFDTCxNQUFNLElBQUksQ0FBQztFQUNsQjtFQUVBb0MsYUFBYUEsQ0FBQ1gsS0FBYSxFQUFFO0lBQzNCLElBQUksQ0FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksQ0FBQ1gsS0FBSyxDQUFDa0MsYUFBYSxDQUFDWCxLQUFLLEVBQUUsSUFBSSxDQUFDcEIsSUFBSSxDQUFDO0lBQzFDLElBQUksQ0FBQ0EsSUFBSSxJQUFJLENBQUM7SUFDZCxJQUFJLENBQUNMLE1BQU0sSUFBSSxDQUFDO0VBQ2xCO0VBRUFxQyxhQUFhQSxDQUFDWixLQUFhLEVBQUU7SUFDM0I7SUFDQSxJQUFJLENBQUNhLFlBQVksQ0FBQ2IsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQ0QsVUFBVSxDQUFDYixJQUFJLENBQUM0QixLQUFLLENBQUNkLEtBQUssR0FBRzlCLGNBQWMsQ0FBQyxDQUFDO0VBQ3JEO0VBRUE2QyxTQUFTQSxDQUFDZixLQUFhLEVBQUU7SUFDdkIsSUFBSSxDQUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxDQUFDWCxLQUFLLENBQUNzQyxTQUFTLENBQUNmLEtBQUssRUFBRSxJQUFJLENBQUNwQixJQUFJLENBQUM7SUFDdEMsSUFBSSxDQUFDQSxJQUFJLElBQUksQ0FBQztJQUNkLElBQUksQ0FBQ0wsTUFBTSxJQUFJLENBQUM7RUFDbEI7RUFFQXlDLFlBQVlBLENBQUNoQixLQUFhLEVBQUU7SUFDMUIsSUFBSSxDQUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxDQUFDWCxLQUFLLENBQUN1QyxZQUFZLENBQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDcEIsSUFBSSxDQUFDO0lBQ3pDLElBQUksQ0FBQ0EsSUFBSSxJQUFJLENBQUM7SUFDZCxJQUFJLENBQUNMLE1BQU0sSUFBSSxDQUFDO0VBQ2xCO0VBRUEwQyxZQUFZQSxDQUFDakIsS0FBYSxFQUFFO0lBQzFCLElBQUksQ0FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksQ0FBQ1gsS0FBSyxDQUFDd0MsWUFBWSxDQUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQ3BCLElBQUksQ0FBQztJQUN6QyxJQUFJLENBQUNBLElBQUksSUFBSSxDQUFDO0lBQ2QsSUFBSSxDQUFDTCxNQUFNLElBQUksQ0FBQztFQUNsQjtFQUVBc0MsWUFBWUEsQ0FBQ2IsS0FBYSxFQUFFO0lBQzFCLElBQUksQ0FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksQ0FBQ1gsS0FBSyxDQUFDb0MsWUFBWSxDQUFDYixLQUFLLEVBQUUsSUFBSSxDQUFDcEIsSUFBSSxDQUFDO0lBQ3pDLElBQUksQ0FBQ0EsSUFBSSxJQUFJLENBQUM7SUFDZCxJQUFJLENBQUNMLE1BQU0sSUFBSSxDQUFDO0VBQ2xCO0VBRUEyQyxZQUFZQSxDQUFDbEIsS0FBYSxFQUFFO0lBQzFCLElBQUksQ0FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksQ0FBQ1gsS0FBSyxDQUFDeUMsWUFBWSxDQUFDbEIsS0FBSyxFQUFFLElBQUksQ0FBQ3BCLElBQUksQ0FBQztJQUN6QyxJQUFJLENBQUNBLElBQUksSUFBSSxDQUFDO0lBQ2QsSUFBSSxDQUFDTCxNQUFNLElBQUksQ0FBQztFQUNsQjtFQUVBNEMsWUFBWUEsQ0FBQ25CLEtBQWEsRUFBRTtJQUMxQixJQUFJLENBQUNaLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZixJQUFJLENBQUNYLEtBQUssQ0FBQzBDLFlBQVksQ0FBQ25CLEtBQUssRUFBRSxJQUFJLENBQUNwQixJQUFJLENBQUM7SUFDekMsSUFBSSxDQUFDQSxJQUFJLElBQUksQ0FBQztJQUNkLElBQUksQ0FBQ0wsTUFBTSxJQUFJLENBQUM7RUFDbEI7RUFFQTZDLGFBQWFBLENBQUNwQixLQUFhLEVBQUU7SUFDM0IsSUFBSSxDQUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxDQUFDWCxLQUFLLENBQUMyQyxhQUFhLENBQUNwQixLQUFLLEVBQUUsSUFBSSxDQUFDcEIsSUFBSSxDQUFDO0lBQzFDLElBQUksQ0FBQ0EsSUFBSSxJQUFJLENBQUM7SUFDZCxJQUFJLENBQUNMLE1BQU0sSUFBSSxDQUFDO0VBQ2xCO0VBRUE4QyxXQUFXQSxDQUFDckIsS0FBYSxFQUFFc0IsUUFBa0IsRUFBRTtJQUM3QztJQUNBLE1BQU0vQyxNQUFNLEdBQUcrQyxRQUFRLEtBQUssTUFBTSxHQUFHdEIsS0FBSyxDQUFDekIsTUFBTSxHQUFHLENBQUMsR0FBR0csTUFBTSxDQUFDNkMsVUFBVSxDQUFDdkIsS0FBSyxFQUFFc0IsUUFBUSxDQUFDO0lBQzFGLElBQUksQ0FBQ2xDLE9BQU8sQ0FBQ2IsTUFBTSxDQUFDO0lBQ3BCLElBQUksQ0FBQ0UsS0FBSyxDQUFDK0MsS0FBSyxDQUFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQ3BCLElBQUksRUFBRTBDLFFBQVEsQ0FBQztJQUM1QyxJQUFJLENBQUMxQyxJQUFJLElBQUlMLE1BQU07SUFDbkIsSUFBSSxDQUFDQSxNQUFNLElBQUlBLE1BQU07RUFDdkI7RUFFQWtELGFBQWFBLENBQUN6QixLQUFhLEVBQUVzQixRQUFrQixFQUFFO0lBQy9DLElBQUksQ0FBQ3ZCLFVBQVUsQ0FBQ0MsS0FBSyxDQUFDekIsTUFBTSxDQUFDO0lBQzdCLElBQUksQ0FBQzhDLFdBQVcsQ0FBQ3JCLEtBQUssRUFBRXNCLFFBQVEsQ0FBQztFQUNuQztFQUVBSSxjQUFjQSxDQUFDMUIsS0FBYSxFQUFFc0IsUUFBa0IsRUFBRTtJQUNoRCxJQUFJLENBQUNyQixhQUFhLENBQUNELEtBQUssQ0FBQ3pCLE1BQU0sQ0FBQztJQUNoQyxJQUFJLENBQUM4QyxXQUFXLENBQUNyQixLQUFLLEVBQUVzQixRQUFRLENBQUM7RUFDbkM7RUFFQUssY0FBY0EsQ0FBQzNCLEtBQWEsRUFBRTtJQUM1QixJQUFJLENBQUNDLGFBQWEsQ0FBQ0QsS0FBSyxDQUFDekIsTUFBTSxDQUFDO0lBQ2hDLElBQUksQ0FBQ3FELFdBQVcsQ0FBQzVCLEtBQUssQ0FBQztFQUN6Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtFQUNFNEIsV0FBV0EsQ0FBQzVCLEtBQWEsRUFBRTtJQUN6QixNQUFNekIsTUFBTSxHQUFHeUIsS0FBSyxDQUFDekIsTUFBTTtJQUMzQixJQUFJQSxNQUFNLElBQUlILHNCQUFzQixDQUFDQyxVQUFVLEVBQUU7TUFDL0MsSUFBSSxDQUFDVyxLQUFLLENBQUMsQ0FBQztNQUNaLElBQUksQ0FBQ1IsS0FBSyxDQUFDUyxJQUFJLENBQUNlLEtBQUssQ0FBQztJQUN4QixDQUFDLE1BQU07TUFDTCxJQUFJLENBQUNaLE9BQU8sQ0FBQ2IsTUFBTSxDQUFDO01BQ3BCeUIsS0FBSyxDQUFDRixJQUFJLENBQUMsSUFBSSxDQUFDckIsS0FBSyxFQUFFLElBQUksQ0FBQ0csSUFBSSxDQUFDO01BQ2pDLElBQUksQ0FBQ0EsSUFBSSxJQUFJTCxNQUFNO0lBQ3JCO0lBRUEsSUFBSSxDQUFDQSxNQUFNLElBQUlBLE1BQU07RUFDdkI7QUFDRjtBQUFDLElBQUFzRCxRQUFBLEdBQUFDLE9BQUEsQ0FBQUMsT0FBQSxHQUVjM0Qsc0JBQXNCO0FBQ3JDNEQsTUFBTSxDQUFDRixPQUFPLEdBQUcxRCxzQkFBc0IiLCJpZ25vcmVMaXN0IjpbXX0=