UNPKG

metaapi.cloud-sdk

Version:

SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)

230 lines (229 loc) 18.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return Queue; } }); function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } let _Symbol_iterator = Symbol.iterator; let Queue = class Queue { /** * Creates a queue from array * @param {Array<V>} array Array to create the queue from * @return {Queue<V>} Queue created from the array * @deprecated Use constructor instead */ static fromArray(array) { let queue = new Queue(); array.forEach((item)=>queue.push(item)); return queue; } /** * Returns the queue size * @return {Number} Queue size */ get length() { return this._length; } /** * Iterates by queue items */ *[_Symbol_iterator]() { let current = this._start; while(current){ yield current.value; current = current.next; } } /** * Returns the first element or undefined if the queue is empty * @return {T} The first value */ front() { var _this__start; return (_this__start = this._start) === null || _this__start === void 0 ? void 0 : _this__start.value; } /** * Returns the last element or undefined if the queue is empty * @return {T} The last value */ back() { var _this__end; return (_this__end = this._end) === null || _this__end === void 0 ? void 0 : _this__end.value; } /** * Pushes new elements to the end of the queue * @param {T[]} values Values to push */ push(...values) { for (let value of values){ if (this._end) { this._end.next = { value, prev: this._end }; this._end = this._end.next; } else { this._start = this._end = { value }; } this._length++; } } /** * Removes the last element from the queue * @return {T} The value removed or undefined */ pop() { if (this._end) { let result = this._end; this._remove(this._end); return result.value; } } /** * Inserts new elements to the front of the queue * @param {T} value Values to unshift */ unshift(value) { if (this._start) { this._start = { value, next: this._start }; this._start.next.prev = this._start; } else { this._start = this._end = { value }; } this._length++; } /** * Removes the first element from the queue * @return {T} The value removed or undefined */ shift() { if (this._start) { let result = this._start; this._remove(this._start); return result.value; } } /** * Finds an element in the queue by the predicate * @param {(value: T) => boolean} predicate Predicate to use * @return {T} Element value found or undefined */ find(predicate) { let current = this._start; while(current){ if (predicate(current.value)) { return current.value; } current = current.next; } } /** * Iterates over the queue * @param {(value: T, index: Number) => any} callable Iterator callable */ forEach(callable) { let current = this._start; let index = 0; while(current){ callable(current.value, index++); current = current.next; } } /** * Removes elements iterating them and matching by predicate * @param {(value: T) => boolean|null} predicate Returns true for values to remove. If returns null, iteration stops */ remove(predicate) { let current = this._start; while(current){ let remove = predicate(current.value); if (remove === null) { break; } if (remove === true) { this._remove(current); } current = current.next; } } /** * Removes the first occurence of element matched by predicate * @param predicate returns true for value to removed */ removeOne(predicate) { let removed = false; this.remove((item)=>{ if (removed) { return null; } if (predicate(item)) { removed = true; return true; } }); } /** * Creates a new queue from this one in reversed order * @return {Queue<T>} Reversed queue */ reversed() { let result = new Queue(); let current = this._end; while(current){ result.push(current.value); current = current.prev; } return result; } /** * Creates an array from the queue * @return {Array<T>} Array created */ toArray() { let result = []; this.forEach((value)=>result.push(value)); return result; } /** * Clears the queue */ clear() { delete this._start; delete this._end; this._length = 0; } _remove(node) { if (node.prev) { node.prev.next = node.next; } else { this._start = node.next; } if (node.next) { node.next.prev = node.prev; } else { this._end = node.prev; } this._length--; } /** * Constructs instance * @param {Iterable<T>} [items] Initial items to add to the queue */ constructor(items){ _define_property(this, "_length", void 0); _define_property(this, "_start", void 0); _define_property(this, "_end", void 0); for (let item of items || []){ this.push(item); } this._length = 0; } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIHF1ZXVlIHN0cnVjdHVyZVxuICogQHRlbXBsYXRlIFQgUXVldWUgdmFsdWVzIHR5cGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVldWU8VD4ge1xuICBcbiAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0YXJ0OiBhbnk7XG4gIHByaXZhdGUgX2VuZDogYW55O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcXVldWUgZnJvbSBhcnJheVxuICAgKiBAcGFyYW0ge0FycmF5PFY+fSBhcnJheSBBcnJheSB0byBjcmVhdGUgdGhlIHF1ZXVlIGZyb21cbiAgICogQHJldHVybiB7UXVldWU8Vj59IFF1ZXVlIGNyZWF0ZWQgZnJvbSB0aGUgYXJyYXlcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnN0cnVjdG9yIGluc3RlYWRcbiAgICovXG4gIHN0YXRpYyBmcm9tQXJyYXk8Vj4oYXJyYXk6IFZbXSkge1xuICAgIGxldCBxdWV1ZSA9IG5ldyBRdWV1ZTxWPigpO1xuICAgIGFycmF5LmZvckVhY2goaXRlbSA9PiBxdWV1ZS5wdXNoKGl0ZW0pKTtcbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBbaXRlbXNdIEluaXRpYWwgaXRlbXMgdG8gYWRkIHRvIHRoZSBxdWV1ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoaXRlbXM/OiBJdGVyYWJsZTxUPikge1xuICAgIGZvciAobGV0IGl0ZW0gb2YgaXRlbXMgfHwgW10pIHtcbiAgICAgIHRoaXMucHVzaChpdGVtKTtcbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBxdWV1ZSBzaXplXG4gICAqIEByZXR1cm4ge051bWJlcn0gUXVldWUgc2l6ZVxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIGJ5IHF1ZXVlIGl0ZW1zXG4gICAqL1xuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fc3RhcnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIHlpZWxkIGN1cnJlbnQudmFsdWU7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9yIHVuZGVmaW5lZCBpZiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICogQHJldHVybiB7VH0gVGhlIGZpcnN0IHZhbHVlXG4gICAqL1xuICBmcm9udCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnQ/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvciB1bmRlZmluZWQgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqIEByZXR1cm4ge1R9IFRoZSBsYXN0IHZhbHVlXG4gICAqL1xuICBiYWNrKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbmQ/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBuZXcgZWxlbWVudHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHtUW119IHZhbHVlcyBWYWx1ZXMgdG8gcHVzaFxuICAgKi9cbiAgcHVzaCguLi52YWx1ZXM6IFRbXSkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHRoaXMuX2VuZCkge1xuICAgICAgICB0aGlzLl9lbmQubmV4dCA9IHt2YWx1ZSwgcHJldjogdGhpcy5fZW5kfTtcbiAgICAgICAgdGhpcy5fZW5kID0gdGhpcy5fZW5kLm5leHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZCA9IHt2YWx1ZX07XG4gICAgICB9XG4gICAgICB0aGlzLl9sZW5ndGgrKztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIHF1ZXVlXG4gICAqIEByZXR1cm4ge1R9IFRoZSB2YWx1ZSByZW1vdmVkIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcG9wKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9lbmQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9lbmQ7XG4gICAgICB0aGlzLl9yZW1vdmUodGhpcy5fZW5kKTtcbiAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgbmV3IGVsZW1lbnRzIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHtUfSB2YWx1ZSBWYWx1ZXMgdG8gdW5zaGlmdFxuICAgKi9cbiAgdW5zaGlmdCh2YWx1ZTogVCkge1xuICAgIGlmICh0aGlzLl9zdGFydCkge1xuICAgICAgdGhpcy5fc3RhcnQgPSB7dmFsdWUsIG5leHQ6IHRoaXMuX3N0YXJ0fTtcbiAgICAgIHRoaXMuX3N0YXJ0Lm5leHQucHJldiA9IHRoaXMuX3N0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZCA9IHt2YWx1ZX07XG4gICAgfVxuICAgIHRoaXMuX2xlbmd0aCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgcXVldWVcbiAgICogQHJldHVybiB7VH0gVGhlIHZhbHVlIHJlbW92ZWQgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBzaGlmdCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fc3RhcnQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9zdGFydDtcbiAgICAgIHRoaXMuX3JlbW92ZSh0aGlzLl9zdGFydCk7XG4gICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IGluIHRoZSBxdWV1ZSBieSB0aGUgcHJlZGljYXRlXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkaWNhdGUgUHJlZGljYXRlIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtUfSBFbGVtZW50IHZhbHVlIGZvdW5kIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fc3RhcnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0geyh2YWx1ZTogVCwgaW5kZXg6IE51bWJlcikgPT4gYW55fSBjYWxsYWJsZSBJdGVyYXRvciBjYWxsYWJsZVxuICAgKi9cbiAgZm9yRWFjaChjYWxsYWJsZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBhbnkpIHtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuX3N0YXJ0O1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGNhbGxhYmxlKGN1cnJlbnQudmFsdWUsIGluZGV4KyspO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBlbGVtZW50cyBpdGVyYXRpbmcgdGhlbSBhbmQgbWF0Y2hpbmcgYnkgcHJlZGljYXRlXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufG51bGx9IHByZWRpY2F0ZSBSZXR1cm5zIHRydWUgZm9yIHZhbHVlcyB0byByZW1vdmUuIElmIHJldHVybnMgbnVsbCwgaXRlcmF0aW9uIHN0b3BzXG4gICAqL1xuICByZW1vdmUocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9zdGFydDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgbGV0IHJlbW92ZSA9IHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKTtcbiAgICAgIGlmIChyZW1vdmUgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZShjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBlbGVtZW50IG1hdGNoZWQgYnkgcHJlZGljYXRlXG4gICAqIEBwYXJhbSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciB2YWx1ZSB0byByZW1vdmVkXG4gICAqL1xuICByZW1vdmVPbmUocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pIHtcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlKGl0ZW0gPT4ge1xuICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHF1ZXVlIGZyb20gdGhpcyBvbmUgaW4gcmV2ZXJzZWQgb3JkZXJcbiAgICogQHJldHVybiB7UXVldWU8VD59IFJldmVyc2VkIHF1ZXVlXG4gICAqL1xuICByZXZlcnNlZCgpOiBRdWV1ZTxUPiB7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBRdWV1ZTxUPigpO1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fZW5kO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXY7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhcnJheSBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcmV0dXJuIHtBcnJheTxUPn0gQXJyYXkgY3JlYXRlZFxuICAgKi9cbiAgdG9BcnJheSgpOiBUW10ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICB0aGlzLmZvckVhY2godmFsdWUgPT4gcmVzdWx0LnB1c2godmFsdWUpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcXVldWVcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9zdGFydDtcbiAgICBkZWxldGUgdGhpcy5fZW5kO1xuICAgIHRoaXMuX2xlbmd0aCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmUobm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIHtcbiAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydCA9IG5vZGUubmV4dDtcbiAgICB9XG4gICAgaWYgKG5vZGUubmV4dCkge1xuICAgICAgbm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VuZCA9IG5vZGUucHJldjtcbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoLS07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJRdWV1ZSIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiZnJvbUFycmF5IiwiYXJyYXkiLCJxdWV1ZSIsImZvckVhY2giLCJpdGVtIiwicHVzaCIsImxlbmd0aCIsIl9sZW5ndGgiLCJjdXJyZW50IiwiX3N0YXJ0IiwidmFsdWUiLCJuZXh0IiwiZnJvbnQiLCJiYWNrIiwiX2VuZCIsInZhbHVlcyIsInByZXYiLCJwb3AiLCJyZXN1bHQiLCJfcmVtb3ZlIiwidW5zaGlmdCIsInNoaWZ0IiwiZmluZCIsInByZWRpY2F0ZSIsImNhbGxhYmxlIiwiaW5kZXgiLCJyZW1vdmUiLCJyZW1vdmVPbmUiLCJyZW1vdmVkIiwicmV2ZXJzZWQiLCJ0b0FycmF5IiwiY2xlYXIiLCJub2RlIiwiY29uc3RydWN0b3IiLCJpdGVtcyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7ZUFNcUJBOzs7Ozs7Ozs7Ozs7Ozs7O0lBd0NqQkMsbUJBQUFBLE9BQU9DLFFBQVE7QUF4Q0osSUFBQSxBQUFNRixRQUFOLE1BQU1BO0lBTW5COzs7OztHQUtDLEdBQ0QsT0FBT0csVUFBYUMsS0FBVSxFQUFFO1FBQzlCLElBQUlDLFFBQVEsSUFBSUw7UUFDaEJJLE1BQU1FLE9BQU8sQ0FBQ0MsQ0FBQUEsT0FBUUYsTUFBTUcsSUFBSSxDQUFDRDtRQUNqQyxPQUFPRjtJQUNUO0lBYUE7OztHQUdDLEdBQ0QsSUFBSUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDQyxPQUFPO0lBQ3JCO0lBRUE7O0dBRUMsR0FDRCxDQUFDLENBQUNULGlCQUFnQixHQUFnQjtRQUNoQyxJQUFJVSxVQUFVLElBQUksQ0FBQ0MsTUFBTTtRQUN6QixNQUFPRCxRQUFTO1lBQ2QsTUFBTUEsUUFBUUUsS0FBSztZQUNuQkYsVUFBVUEsUUFBUUcsSUFBSTtRQUN4QjtJQUNGO0lBRUE7OztHQUdDLEdBQ0RDLFFBQXVCO1lBQ2Q7UUFBUCxRQUFPLGVBQUEsSUFBSSxDQUFDSCxNQUFNLGNBQVgsbUNBQUEsYUFBYUMsS0FBSztJQUMzQjtJQUVBOzs7R0FHQyxHQUNERyxPQUFzQjtZQUNiO1FBQVAsUUFBTyxhQUFBLElBQUksQ0FBQ0MsSUFBSSxjQUFULGlDQUFBLFdBQVdKLEtBQUs7SUFDekI7SUFFQTs7O0dBR0MsR0FDREwsS0FBSyxHQUFHVSxNQUFXLEVBQUU7UUFDbkIsS0FBSyxJQUFJTCxTQUFTSyxPQUFRO1lBQ3hCLElBQUksSUFBSSxDQUFDRCxJQUFJLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDQSxJQUFJLENBQUNILElBQUksR0FBRztvQkFBQ0Q7b0JBQU9NLE1BQU0sSUFBSSxDQUFDRixJQUFJO2dCQUFBO2dCQUN4QyxJQUFJLENBQUNBLElBQUksR0FBRyxJQUFJLENBQUNBLElBQUksQ0FBQ0gsSUFBSTtZQUM1QixPQUFPO2dCQUNMLElBQUksQ0FBQ0YsTUFBTSxHQUFHLElBQUksQ0FBQ0ssSUFBSSxHQUFHO29CQUFDSjtnQkFBSztZQUNsQztZQUNBLElBQUksQ0FBQ0gsT0FBTztRQUNkO0lBQ0Y7SUFFQTs7O0dBR0MsR0FDRFUsTUFBcUI7UUFDbkIsSUFBSSxJQUFJLENBQUNILElBQUksRUFBRTtZQUNiLElBQUlJLFNBQVMsSUFBSSxDQUFDSixJQUFJO1lBQ3RCLElBQUksQ0FBQ0ssT0FBTyxDQUFDLElBQUksQ0FBQ0wsSUFBSTtZQUN0QixPQUFPSSxPQUFPUixLQUFLO1FBQ3JCO0lBQ0Y7SUFFQTs7O0dBR0MsR0FDRFUsUUFBUVYsS0FBUSxFQUFFO1FBQ2hCLElBQUksSUFBSSxDQUFDRCxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUNBLE1BQU0sR0FBRztnQkFBQ0M7Z0JBQU9DLE1BQU0sSUFBSSxDQUFDRixNQUFNO1lBQUE7WUFDdkMsSUFBSSxDQUFDQSxNQUFNLENBQUNFLElBQUksQ0FBQ0ssSUFBSSxHQUFHLElBQUksQ0FBQ1AsTUFBTTtRQUNyQyxPQUFPO1lBQ0wsSUFBSSxDQUFDQSxNQUFNLEdBQUcsSUFBSSxDQUFDSyxJQUFJLEdBQUc7Z0JBQUNKO1lBQUs7UUFDbEM7UUFDQSxJQUFJLENBQUNILE9BQU87SUFDZDtJQUVBOzs7R0FHQyxHQUNEYyxRQUF1QjtRQUNyQixJQUFJLElBQUksQ0FBQ1osTUFBTSxFQUFFO1lBQ2YsSUFBSVMsU0FBUyxJQUFJLENBQUNULE1BQU07WUFDeEIsSUFBSSxDQUFDVSxPQUFPLENBQUMsSUFBSSxDQUFDVixNQUFNO1lBQ3hCLE9BQU9TLE9BQU9SLEtBQUs7UUFDckI7SUFDRjtJQUVBOzs7O0dBSUMsR0FDRFksS0FBS0MsU0FBZ0MsRUFBaUI7UUFDcEQsSUFBSWYsVUFBVSxJQUFJLENBQUNDLE1BQU07UUFDekIsTUFBT0QsUUFBUztZQUNkLElBQUllLFVBQVVmLFFBQVFFLEtBQUssR0FBRztnQkFDNUIsT0FBT0YsUUFBUUUsS0FBSztZQUN0QjtZQUNBRixVQUFVQSxRQUFRRyxJQUFJO1FBQ3hCO0lBQ0Y7SUFFQTs7O0dBR0MsR0FDRFIsUUFBUXFCLFFBQTBDLEVBQUU7UUFDbEQsSUFBSWhCLFVBQVUsSUFBSSxDQUFDQyxNQUFNO1FBQ3pCLElBQUlnQixRQUFRO1FBQ1osTUFBT2pCLFFBQVM7WUFDZGdCLFNBQVNoQixRQUFRRSxLQUFLLEVBQUVlO1lBQ3hCakIsVUFBVUEsUUFBUUcsSUFBSTtRQUN4QjtJQUNGO0lBRUE7OztHQUdDLEdBQ0RlLE9BQU9ILFNBQXVDLEVBQUU7UUFDOUMsSUFBSWYsVUFBVSxJQUFJLENBQUNDLE1BQU07UUFDekIsTUFBT0QsUUFBUztZQUNkLElBQUlrQixTQUFTSCxVQUFVZixRQUFRRSxLQUFLO1lBQ3BDLElBQUlnQixXQUFXLE1BQU07Z0JBQ25CO1lBQ0Y7WUFDQSxJQUFJQSxXQUFXLE1BQU07Z0JBQ25CLElBQUksQ0FBQ1AsT0FBTyxDQUFDWDtZQUNmO1lBQ0FBLFVBQVVBLFFBQVFHLElBQUk7UUFDeEI7SUFDRjtJQUVBOzs7R0FHQyxHQUNEZ0IsVUFBVUosU0FBZ0MsRUFBRTtRQUMxQyxJQUFJSyxVQUFVO1FBQ2QsSUFBSSxDQUFDRixNQUFNLENBQUN0QixDQUFBQTtZQUNWLElBQUl3QixTQUFTO2dCQUNYLE9BQU87WUFDVDtZQUNBLElBQUlMLFVBQVVuQixPQUFPO2dCQUNuQndCLFVBQVU7Z0JBQ1YsT0FBTztZQUNUO1FBQ0Y7SUFDRjtJQUVBOzs7R0FHQyxHQUNEQyxXQUFxQjtRQUNuQixJQUFJWCxTQUFTLElBQUlyQjtRQUNqQixJQUFJVyxVQUFVLElBQUksQ0FBQ00sSUFBSTtRQUN2QixNQUFPTixRQUFTO1lBQ2RVLE9BQU9iLElBQUksQ0FBQ0csUUFBUUUsS0FBSztZQUN6QkYsVUFBVUEsUUFBUVEsSUFBSTtRQUN4QjtRQUNBLE9BQU9FO0lBQ1Q7SUFFQTs7O0dBR0MsR0FDRFksVUFBZTtRQUNiLElBQUlaLFNBQVMsRUFBRTtRQUNmLElBQUksQ0FBQ2YsT0FBTyxDQUFDTyxDQUFBQSxRQUFTUSxPQUFPYixJQUFJLENBQUNLO1FBQ2xDLE9BQU9RO0lBQ1Q7SUFFQTs7R0FFQyxHQUNEYSxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUN0QixNQUFNO1FBQ2xCLE9BQU8sSUFBSSxDQUFDSyxJQUFJO1FBQ2hCLElBQUksQ0FBQ1AsT0FBTyxHQUFHO0lBQ2pCO0lBRVFZLFFBQVFhLElBQUksRUFBRTtRQUNwQixJQUFJQSxLQUFLaEIsSUFBSSxFQUFFO1lBQ2JnQixLQUFLaEIsSUFBSSxDQUFDTCxJQUFJLEdBQUdxQixLQUFLckIsSUFBSTtRQUM1QixPQUFPO1lBQ0wsSUFBSSxDQUFDRixNQUFNLEdBQUd1QixLQUFLckIsSUFBSTtRQUN6QjtRQUNBLElBQUlxQixLQUFLckIsSUFBSSxFQUFFO1lBQ2JxQixLQUFLckIsSUFBSSxDQUFDSyxJQUFJLEdBQUdnQixLQUFLaEIsSUFBSTtRQUM1QixPQUFPO1lBQ0wsSUFBSSxDQUFDRixJQUFJLEdBQUdrQixLQUFLaEIsSUFBSTtRQUN2QjtRQUNBLElBQUksQ0FBQ1QsT0FBTztJQUNkO0lBaE5BOzs7R0FHQyxHQUNEMEIsWUFBWUMsS0FBbUIsQ0FBRTtRQXBCakMsdUJBQVEzQixXQUFSLEtBQUE7UUFDQSx1QkFBUUUsVUFBUixLQUFBO1FBQ0EsdUJBQVFLLFFBQVIsS0FBQTtRQW1CRSxLQUFLLElBQUlWLFFBQVE4QixTQUFTLEVBQUUsQ0FBRTtZQUM1QixJQUFJLENBQUM3QixJQUFJLENBQUNEO1FBQ1o7UUFDQSxJQUFJLENBQUNHLE9BQU8sR0FBRztJQUNqQjtBQXdNRiJ9