UNPKG

delphirtl

Version:
415 lines 18.4 kB
"use strict"; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Queue_store, _Stack_store; Object.defineProperty(exports, "__esModule", { value: true }); exports.SEmptyIterables = exports.List = exports.Stack = exports.TreeNode = exports.Tree = exports.Dictionary = exports.Queue = void 0; const node_assert_1 = require("node:assert"); /** * A first in, first out class * @category Collections */ class Queue { constructor() { _Queue_store.set(this, []); } /** * * @param val Puts the given value into the class */ push(val) { __classPrivateFieldGet(this, _Queue_store, "f").push(val); } /** * * @returns The first value in the store */ pop() { return this.next(); } /** * * @returns The first value in the store */ next() { const result = __classPrivateFieldGet(this, _Queue_store, "f").shift(); return result; } /** * The number of values in the store * * @readonly * @type {number} */ get length() { return __classPrivateFieldGet(this, _Queue_store, "f").length; } } exports.Queue = Queue; _Queue_store = new WeakMap(); /** * A last in, first out class * * @class Stack * @typedef {Stack} * @template T * @category Collections */ class Stack { constructor() { _Stack_store.set(this, []); } /** * * @param v Puts the given value into the store */ push(v) { __classPrivateFieldGet(this, _Stack_store, "f").push(v); } /** * * @returns The last value that was pushed into the store */ pop() { const result = __classPrivateFieldGet(this, _Stack_store, "f").pop(); return result; } /** * The number of items in the store * * @readonly * @type {number} */ get length() { return __classPrivateFieldGet(this, _Stack_store, "f").length; } } exports.Stack = Stack; _Stack_store = new WeakMap(); /** * Dictionary * * @class Dictionary * @typedef {Dictionary} * @template K * @template V * @extends {Map<K, V>} * @category Collections */ class Dictionary extends Map { /** * Sets the specified value for the given key. * @param key * @param value */ AddOrSetValue(key, value) { this.Add(key, value); } /** * Sets the specified value for the given key. * @param key * @param value */ Add(key, value) { this.set(key, value); } /** * Clears the dictionary of all data */ Clear() { this.clear(); } /** * Gets the number of keys and values stored. * * @public * @readonly * @type {number} */ get Count() { const result = this.size; return result; } /** * Gets the number of keys and values stored. * * @public * @readonly * @type {number} */ get count() { return this.Count; } /** * Gets the keys and values stored in the Dictionary * * @public * @readonly * @type {{ [key: string]: V }} */ get Items() { const items = {}; this.forEach((value, key) => { items[key] = value; }); // in-place of returning items // the following will intercept non-existent indices and // throw an Error // Unfortunately, can't declare a class within a class // so, there's the repeated definition of { [key...]: V } return new Proxy(items, { // Intercept 'get' operation get: (map, key) => { let k = key.toString(); if (!this.has(k)) { throw new Error(`Key "${key}" not found.`); } return this.get(k); }, // Intercept 'set' operation set: (map, key, value) => { let k = key.toString(); this.set(k, value); return true; } }); } /** * Gets all items * * @public * @readonly * @type {{ [key: string]: V }} */ get items() { const result = this.Items; return result; } /** * Returns a boolean, which, if true, means value has valid information. * * @param {K} key * @returns {{ * found: boolean, * value: V | undefined * }} */ TryGetValue(key) { const value = this.get(key); const found = value !== undefined; const result = { found, value }; return result; } /** * Returns true if the dictionary has the specified key, false if not. * * @param {K} key * @returns {boolean} */ Contains(key) { const result = this.has(key); return result; } /** * Returns true if the dictionary contains the given value. * * @param {V} value * @returns {boolean} */ ContainsValue(value) { for (const v of this.values()) { if (value === v) { return true; } } return false; } /** * Adds the given key and value * * @param {K} key * @param {V} value * @returns {boolean} */ TryAdd(key, value) { this.set(key, value); return true; } /** * Removes the given key and its value. * * @param {K} key */ Remove(key) { this.delete(key); } } exports.Dictionary = Dictionary; ; /** * TreeNode * * @class TreeNode * @typedef {TreeNode} * @template T * @category Collections */ class TreeNode { constructor(value) { this.data = value; this.left = null; this.right = null; } static createTree(nodeValues) { let root = null; // ensure iterables have at least 1 value let count = 0; for (const nodeValue of nodeValues) { count++; break; } (0, node_assert_1.strict)(count > 0, SEmptyIterables); for (const nodeValue of nodeValues) { root = insertNode(root, nodeValue); } return root; } // should only be called when this is the root, otherwise, it'll return the wrong values /** * Returns the height of the tree. Call only when this is the root. * * @public * @readonly * @type {number} height of the tree */ get height() { return height(this); } } exports.Tree = TreeNode; exports.TreeNode = TreeNode; function insertNode(node, data) { if (node === null) return new TreeNode(data); if (data < node.data) { node.left = insertNode(node.left, data); } else { node.right = insertNode(node.right, data); } return node; } const SEmptyIterables = "Iterable do not have any elements!"; exports.SEmptyIterables = SEmptyIterables; function createTree(nodeValues) { let root = null; // ensure iterables have at least 1 value let count = 0; for (const nodeValue of nodeValues) { count++; break; } (0, node_assert_1.strict)(count > 0, SEmptyIterables); for (const nodeValue of nodeValues) { root = insertNode(root, nodeValue); } return root; } // see https://www.baeldung.com/cs/binary-tree-height function height(root) { if (root === null) { return -1; } const result = 1 + Math.max(height(root.left), height(root.right)); return result; } /** * List * * @class List * @typedef {List} * @template T * @category Collections */ class List { find(callback) { const result = this.items.find((value, index, obj) => { const result = (value == callback); return result; }); return result !== undefined; } constructor() { this.items = []; } /** * * @returns Size of the List */ size() { return this.items.length; } /** * Returns the length of this list * * @public * @readonly * @type {number} */ get length() { return this.items.length; } /** * Adds a value to the list * @param value The value to add to the list */ add(value) { this.items.push(value); } indexOf(value) { const result = this.items.indexOf(value); return result; } get(index) { return this.items[index]; } /** * Delete a specified value * * @type {*} */ delete(value) { const index = this.items.indexOf(value); if (index !== -1) { this.items.splice(index, 1); return true; } return false; } /** * Removes the specified value * @param value * @returns */ remove(value) { return this.delete(value); } // Implementing the iterator [Symbol.iterator]() { let index = 0; const items = this.items; return { next() { if (index < items.length) { return { value: items[index++], done: false }; } else { return { value: undefined, done: true }; } } }; } } exports.List = List; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsNkNBQStDO0FBRS9DOzs7R0FHRztBQUNILE1BQU0sS0FBSztJQUFYO1FBQ0ksdUJBQWMsRUFBRSxFQUFDO0lBcUNyQixDQUFDO0lBbkNHOzs7T0FHRztJQUNILElBQUksQ0FBQyxHQUFNO1FBQ1AsdUJBQUEsSUFBSSxvQkFBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRztRQUNDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJO1FBQ0EsTUFBTSxNQUFNLEdBQUcsdUJBQUEsSUFBSSxvQkFBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25DLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFHRDs7Ozs7T0FLRztJQUNILElBQUksTUFBTTtRQUNOLE9BQU8sdUJBQUEsSUFBSSxvQkFBTyxDQUFDLE1BQU0sQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUF5Wkcsc0JBQUs7O0FBdFpUOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLEtBQUs7SUFBWDtRQUNJLHVCQUFjLEVBQUUsRUFBQztJQTZCckIsQ0FBQztJQTNCRzs7O09BR0c7SUFDSCxJQUFJLENBQUMsQ0FBSTtRQUNMLHVCQUFBLElBQUksb0JBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUc7UUFDQyxNQUFNLE1BQU0sR0FBRyx1QkFBQSxJQUFJLG9CQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUdEOzs7OztPQUtHO0lBQ0gsSUFBSSxNQUFNO1FBQ04sT0FBTyx1QkFBQSxJQUFJLG9CQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLENBQUM7Q0FDSjtBQWdYa0Qsc0JBQUs7O0FBOVd4RDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQWlCLFNBQVEsR0FBUztJQUVwQzs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLEdBQU0sRUFBRSxLQUFRO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFHRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLEdBQU0sRUFBRSxLQUFRO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILElBQVcsS0FBSztRQUNaLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQVcsS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFHakQ7Ozs7OztPQU1HO0lBQ0gsSUFBVyxLQUFLO1FBQ1osTUFBTSxLQUFLLEdBQU8sRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFRLEVBQUUsR0FBTSxFQUFFLEVBQUU7WUFDN0IsS0FBYSxDQUFDLEdBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztRQUVILDhCQUE4QjtRQUM5Qix3REFBd0Q7UUFDeEQsaUJBQWlCO1FBQ2pCLHNEQUFzRDtRQUN0RCx5REFBeUQ7UUFDekQsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDcEIsNEJBQTRCO1lBQzVCLEdBQUcsRUFBRSxDQUFDLEdBQTJDLEVBQUUsR0FBUSxFQUFFLEVBQUU7Z0JBQzNELElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsQ0FBQztnQkFDL0MsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUNELDRCQUE0QjtZQUM1QixHQUFHLEVBQUUsQ0FBQyxHQUEyQyxFQUFFLEdBQVEsRUFBRSxLQUFRLEVBQVcsRUFBRTtnQkFDOUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUVQLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFXLEtBQUs7UUFDWixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFdBQVcsQ0FBQyxHQUFNO1FBSWQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFFBQVEsQ0FBQyxHQUFNO1FBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsS0FBUTtRQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQzVCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNkLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxHQUFNLEVBQUUsS0FBUTtRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxHQUFNO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0NBQ0o7QUErTFUsZ0NBQVU7QUEvTHBCLENBQUM7QUFJRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxRQUFRO0lBS1YsWUFBWSxLQUFRO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFDTSxNQUFNLENBQUMsVUFBVSxDQUFJLFVBQXVCO1FBQy9DLElBQUksSUFBSSxHQUFpQixJQUFJLENBQUM7UUFFOUIseUNBQXlDO1FBQ3pDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDakMsS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNO1FBQ1YsQ0FBQztRQUNELElBQUEsb0JBQU0sRUFBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRW5DLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDakMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sSUFBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx3RkFBd0Y7SUFDeEY7Ozs7OztPQU1HO0lBQ0gsSUFBVyxNQUFNO1FBQ2IsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNKO0FBNklrQyx3QkFBSTtBQUFFLDRCQUFRO0FBM0lqRCxTQUFTLFVBQVUsQ0FBSSxJQUFrQixFQUFFLElBQU87SUFDOUMsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztTQUFNLENBQUM7UUFDSixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxlQUFlLEdBQUcsb0NBQW9DLENBQUM7QUFrSXpELDBDQUFlO0FBakluQixTQUFTLFVBQVUsQ0FBSSxVQUF1QjtJQUMxQyxJQUFJLElBQUksR0FBaUIsSUFBSSxDQUFDO0lBRTlCLHlDQUF5QztJQUN6QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLEtBQUssRUFBRSxDQUFDO1FBQ1IsTUFBTTtJQUNWLENBQUM7SUFDRCxJQUFBLG9CQUFNLEVBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVuQyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLElBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQscURBQXFEO0FBQ3JELFNBQVMsTUFBTSxDQUFJLElBQWtCO0lBQ2pDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkUsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7O0VBT0U7QUFDRixNQUFNLElBQUk7SUFDTixJQUFJLENBQUMsUUFBVztRQUNaLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTtZQUN0RCxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQztZQUNuQyxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQztJQUNoQyxDQUFDO0lBSUQ7UUFDSSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSTtRQUNBLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxLQUFRO1FBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFRO1FBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQVE7UUFDWCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFRO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUV6QixPQUFPO1lBQ0gsSUFBSTtnQkFDQSxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUNsRCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUM1QyxDQUFDO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0NBRUo7QUFHeUQsb0JBQUkifQ==