diff --git a/.gitignore b/.gitignore index a49e4a2..31d760f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,20 @@ -.idea/ +# Compile time directories +node_modules +/temp +/coverage +/dist +/typings + +# Editor configuration +.vscode +.settings +.idea + +# Logs and compressed files +*.log +*.tgz + +# Demos collections.js.map demo/CollectionsDemo/app.js.map demo/packages/ @@ -71,14 +87,3 @@ coverage # node-waf configuration .lock-wscript - -.vscode/ -.settings/ -coverage/ -node_modules -temp/ -/typings -*.log -*.tgz - -./dist \ No newline at end of file diff --git a/dist/lib/BSTree.d.ts b/dist/lib/BSTree.d.ts deleted file mode 100644 index 168977d..0000000 --- a/dist/lib/BSTree.d.ts +++ /dev/null @@ -1,175 +0,0 @@ -import * as util from './util'; -export default class BSTree { - private root; - private compare; - private nElements; - /** - * Creates an empty binary search tree. - * @class

A binary search tree is a binary tree in which each - * internal node stores an element such that the elements stored in the - * left subtree are less than it and the elements - * stored in the right subtree are greater.

- *

Formally, a binary search tree is a node-based binary tree data structure which - * has the following properties:

- * - *

If the inserted elements are custom objects a compare function must - * be provided at construction time, otherwise the <=, === and >= operators are - * used to compare elements. Example:

- *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two elements. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - constructor(compareFunction?: util.ICompareFunction); - /** - * Adds the specified element to this tree if it is not already present. - * @param {Object} element the element to insert. - * @return {boolean} true if this tree did not already contain the specified element. - */ - add(element: T): boolean; - /** - * Removes all of the elements from this tree. - */ - clear(): void; - /** - * Returns true if this tree contains no elements. - * @return {boolean} true if this tree contains no elements. - */ - isEmpty(): boolean; - /** - * Returns the number of elements in this tree. - * @return {number} the number of elements in this tree. - */ - size(): number; - /** - * Returns true if this tree contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this tree contains the specified element, - * false otherwise. - */ - contains(element: T): boolean; - /** - * Removes the specified element from this tree if it is present. - * @return {boolean} true if this tree contained the specified element. - */ - remove(element: T): boolean; - /** - * Executes the provided function once for each element present in this tree in - * in-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - inorderTraversal(callback: util.ILoopFunction): void; - /** - * Executes the provided function once for each element present in this tree in pre-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - preorderTraversal(callback: util.ILoopFunction): void; - /** - * Executes the provided function once for each element present in this tree in post-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - postorderTraversal(callback: util.ILoopFunction): void; - /** - * Executes the provided function once for each element present in this tree in - * level-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - levelTraversal(callback: util.ILoopFunction): void; - /** - * Returns the minimum element of this tree. - * @return {*} the minimum element of this tree or undefined if this tree is - * is empty. - */ - minimum(): T; - /** - * Returns the maximum element of this tree. - * @return {*} the maximum element of this tree or undefined if this tree is - * is empty. - */ - maximum(): T; - /** - * Executes the provided function once for each element present in this tree in inorder. - * Equivalent to inorderTraversal. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - forEach(callback: util.ILoopFunction): void; - /** - * Returns an array containing all of the elements in this tree in in-order. - * @return {Array} an array containing all of the elements in this tree in in-order. - */ - toArray(): T[]; - /** - * Returns the height of this tree. - * @return {number} the height of this tree or -1 if is empty. - */ - height(): number; - /** - * @private - */ - private searchNode(node, element); - /** - * @private - */ - private transplant(n1, n2); - /** - * @private - */ - private removeNode(node); - /** - * @private - */ - private inorderTraversalAux(node, callback, signal); - /** - * @private - */ - private levelTraversalAux(node, callback); - /** - * @private - */ - private preorderTraversalAux(node, callback, signal); - /** - * @private - */ - private postorderTraversalAux(node, callback, signal); - /** - * @private - */ - private minimumAux(node); - /** - * @private - */ - private maximumAux(node); - /** - * @private - */ - private heightAux(node); - private insertNode(node); - /** - * @private - */ - private createNode(element); -} diff --git a/dist/lib/BSTree.js b/dist/lib/BSTree.js deleted file mode 100644 index ff5072d..0000000 --- a/dist/lib/BSTree.js +++ /dev/null @@ -1,400 +0,0 @@ -"use strict"; -var util = require('./util'); -var Queue_1 = require('./Queue'); -var BSTree = (function () { - /** - * Creates an empty binary search tree. - * @class

A binary search tree is a binary tree in which each - * internal node stores an element such that the elements stored in the - * left subtree are less than it and the elements - * stored in the right subtree are greater.

- *

Formally, a binary search tree is a node-based binary tree data structure which - * has the following properties:

- *
    - *
  • The left subtree of a node contains only nodes with elements less - * than the node's element
  • - *
  • The right subtree of a node contains only nodes with elements greater - * than the node's element
  • - *
  • Both the left and right subtrees must also be binary search trees.
  • - *
- *

If the inserted elements are custom objects a compare function must - * be provided at construction time, otherwise the <=, === and >= operators are - * used to compare elements. Example:

- *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two elements. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - function BSTree(compareFunction) { - this.root = null; - this.compare = compareFunction || util.defaultCompare; - this.nElements = 0; - } - /** - * Adds the specified element to this tree if it is not already present. - * @param {Object} element the element to insert. - * @return {boolean} true if this tree did not already contain the specified element. - */ - BSTree.prototype.add = function (element) { - if (util.isUndefined(element)) { - return false; - } - if (this.insertNode(this.createNode(element)) !== null) { - this.nElements++; - return true; - } - return false; - }; - /** - * Removes all of the elements from this tree. - */ - BSTree.prototype.clear = function () { - this.root = null; - this.nElements = 0; - }; - /** - * Returns true if this tree contains no elements. - * @return {boolean} true if this tree contains no elements. - */ - BSTree.prototype.isEmpty = function () { - return this.nElements === 0; - }; - /** - * Returns the number of elements in this tree. - * @return {number} the number of elements in this tree. - */ - BSTree.prototype.size = function () { - return this.nElements; - }; - /** - * Returns true if this tree contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this tree contains the specified element, - * false otherwise. - */ - BSTree.prototype.contains = function (element) { - if (util.isUndefined(element)) { - return false; - } - return this.searchNode(this.root, element) !== null; - }; - /** - * Removes the specified element from this tree if it is present. - * @return {boolean} true if this tree contained the specified element. - */ - BSTree.prototype.remove = function (element) { - var node = this.searchNode(this.root, element); - if (node === null) { - return false; - } - this.removeNode(node); - this.nElements--; - return true; - }; - /** - * Executes the provided function once for each element present in this tree in - * in-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - BSTree.prototype.inorderTraversal = function (callback) { - this.inorderTraversalAux(this.root, callback, { - stop: false - }); - }; - /** - * Executes the provided function once for each element present in this tree in pre-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - BSTree.prototype.preorderTraversal = function (callback) { - this.preorderTraversalAux(this.root, callback, { - stop: false - }); - }; - /** - * Executes the provided function once for each element present in this tree in post-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - BSTree.prototype.postorderTraversal = function (callback) { - this.postorderTraversalAux(this.root, callback, { - stop: false - }); - }; - /** - * Executes the provided function once for each element present in this tree in - * level-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - BSTree.prototype.levelTraversal = function (callback) { - this.levelTraversalAux(this.root, callback); - }; - /** - * Returns the minimum element of this tree. - * @return {*} the minimum element of this tree or undefined if this tree is - * is empty. - */ - BSTree.prototype.minimum = function () { - if (this.isEmpty()) { - return undefined; - } - return this.minimumAux(this.root).element; - }; - /** - * Returns the maximum element of this tree. - * @return {*} the maximum element of this tree or undefined if this tree is - * is empty. - */ - BSTree.prototype.maximum = function () { - if (this.isEmpty()) { - return undefined; - } - return this.maximumAux(this.root).element; - }; - /** - * Executes the provided function once for each element present in this tree in inorder. - * Equivalent to inorderTraversal. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - BSTree.prototype.forEach = function (callback) { - this.inorderTraversal(callback); - }; - /** - * Returns an array containing all of the elements in this tree in in-order. - * @return {Array} an array containing all of the elements in this tree in in-order. - */ - BSTree.prototype.toArray = function () { - var array = []; - this.inorderTraversal(function (element) { - array.push(element); - return true; - }); - return array; - }; - /** - * Returns the height of this tree. - * @return {number} the height of this tree or -1 if is empty. - */ - BSTree.prototype.height = function () { - return this.heightAux(this.root); - }; - /** - * @private - */ - BSTree.prototype.searchNode = function (node, element) { - var cmp = null; - while (node !== null && cmp !== 0) { - cmp = this.compare(element, node.element); - if (cmp < 0) { - node = node.leftCh; - } - else if (cmp > 0) { - node = node.rightCh; - } - } - return node; - }; - /** - * @private - */ - BSTree.prototype.transplant = function (n1, n2) { - if (n1.parent === null) { - this.root = n2; - } - else if (n1 === n1.parent.leftCh) { - n1.parent.leftCh = n2; - } - else { - n1.parent.rightCh = n2; - } - if (n2 !== null) { - n2.parent = n1.parent; - } - }; - /** - * @private - */ - BSTree.prototype.removeNode = function (node) { - if (node.leftCh === null) { - this.transplant(node, node.rightCh); - } - else if (node.rightCh === null) { - this.transplant(node, node.leftCh); - } - else { - var y = this.minimumAux(node.rightCh); - if (y.parent !== node) { - this.transplant(y, y.rightCh); - y.rightCh = node.rightCh; - y.rightCh.parent = y; - } - this.transplant(node, y); - y.leftCh = node.leftCh; - y.leftCh.parent = y; - } - }; - /** - * @private - */ - BSTree.prototype.inorderTraversalAux = function (node, callback, signal) { - if (node === null || signal.stop) { - return; - } - this.inorderTraversalAux(node.leftCh, callback, signal); - if (signal.stop) { - return; - } - signal.stop = callback(node.element) === false; - if (signal.stop) { - return; - } - this.inorderTraversalAux(node.rightCh, callback, signal); - }; - /** - * @private - */ - BSTree.prototype.levelTraversalAux = function (node, callback) { - var queue = new Queue_1.default(); - if (node !== null) { - queue.enqueue(node); - } - while (!queue.isEmpty()) { - node = queue.dequeue(); - if (callback(node.element) === false) { - return; - } - if (node.leftCh !== null) { - queue.enqueue(node.leftCh); - } - if (node.rightCh !== null) { - queue.enqueue(node.rightCh); - } - } - }; - /** - * @private - */ - BSTree.prototype.preorderTraversalAux = function (node, callback, signal) { - if (node === null || signal.stop) { - return; - } - signal.stop = callback(node.element) === false; - if (signal.stop) { - return; - } - this.preorderTraversalAux(node.leftCh, callback, signal); - if (signal.stop) { - return; - } - this.preorderTraversalAux(node.rightCh, callback, signal); - }; - /** - * @private - */ - BSTree.prototype.postorderTraversalAux = function (node, callback, signal) { - if (node === null || signal.stop) { - return; - } - this.postorderTraversalAux(node.leftCh, callback, signal); - if (signal.stop) { - return; - } - this.postorderTraversalAux(node.rightCh, callback, signal); - if (signal.stop) { - return; - } - signal.stop = callback(node.element) === false; - }; - /** - * @private - */ - BSTree.prototype.minimumAux = function (node) { - while (node.leftCh !== null) { - node = node.leftCh; - } - return node; - }; - /** - * @private - */ - BSTree.prototype.maximumAux = function (node) { - while (node.rightCh !== null) { - node = node.rightCh; - } - return node; - }; - /** - * @private - */ - BSTree.prototype.heightAux = function (node) { - if (node === null) { - return -1; - } - return Math.max(this.heightAux(node.leftCh), this.heightAux(node.rightCh)) + 1; - }; - /* - * @private - */ - BSTree.prototype.insertNode = function (node) { - var parent = null; - var position = this.root; - var cmp = null; - while (position !== null) { - cmp = this.compare(node.element, position.element); - if (cmp === 0) { - return null; - } - else if (cmp < 0) { - parent = position; - position = position.leftCh; - } - else { - parent = position; - position = position.rightCh; - } - } - node.parent = parent; - if (parent === null) { - // tree is empty - this.root = node; - } - else if (this.compare(node.element, parent.element) < 0) { - parent.leftCh = node; - } - else { - parent.rightCh = node; - } - return node; - }; - /** - * @private - */ - BSTree.prototype.createNode = function (element) { - return { - element: element, - leftCh: null, - rightCh: null, - parent: null - }; - }; - return BSTree; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = BSTree; -//# sourceMappingURL=BSTree.js.map \ No newline at end of file diff --git a/dist/lib/BSTree.js.map b/dist/lib/BSTree.js.map deleted file mode 100644 index 5897a3b..0000000 --- a/dist/lib/BSTree.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BSTree.js","sourceRoot":"","sources":["../../src/lib/BSTree.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/Bag.d.ts b/dist/lib/Bag.d.ts deleted file mode 100644 index 9229dce..0000000 --- a/dist/lib/Bag.d.ts +++ /dev/null @@ -1,91 +0,0 @@ -import * as util from './util'; -import Set from './Set'; -export default class Bag { - private toStrF; - private dictionary; - private nElements; - /** - * Creates an empty bag. - * @class

A bag is a special kind of set in which members are - * allowed to appear more than once.

- *

If the inserted elements are custom objects a function - * which converts elements to unique strings must be provided. Example:

- * - *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * - * @constructor - * @param {function(Object):string=} toStrFunction optional function used - * to convert elements to strings. If the elements aren't strings or if toString() - * is not appropriate, a custom function which receives an object and returns a - * unique string must be provided. - */ - constructor(toStrFunction?: (item: T) => string); - /** - * Adds nCopies of the specified object to this bag. - * @param {Object} element element to add. - * @param {number=} nCopies the number of copies to add, if this argument is - * undefined 1 copy is added. - * @return {boolean} true unless element is undefined. - */ - add(element: T, nCopies?: number): boolean; - /** - * Counts the number of copies of the specified object in this bag. - * @param {Object} element the object to search for.. - * @return {number} the number of copies of the object, 0 if not found - */ - count(element: T): number; - /** - * Returns true if this bag contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this bag contains the specified element, - * false otherwise. - */ - contains(element: T): boolean; - /** - * Removes nCopies of the specified object to this bag. - * If the number of copies to remove is greater than the actual number - * of copies in the Bag, all copies are removed. - * @param {Object} element element to remove. - * @param {number=} nCopies the number of copies to remove, if this argument is - * undefined 1 copy is removed. - * @return {boolean} true if at least 1 element was removed. - */ - remove(element: T, nCopies?: number): boolean; - /** - * Returns an array containing all of the elements in this big in arbitrary order, - * including multiple copies. - * @return {Array} an array containing all of the elements in this bag. - */ - toArray(): T[]; - /** - * Returns a set of unique elements in this bag. - * @return {collections.Set} a set of unique elements in this bag. - */ - toSet(): Set; - /** - * Executes the provided function once for each element - * present in this bag, including multiple copies. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element. To break the iteration you can - * optionally return false. - */ - forEach(callback: util.ILoopFunction): void; - /** - * Returns the number of elements in this bag. - * @return {number} the number of elements in this bag. - */ - size(): number; - /** - * Returns true if this bag contains no elements. - * @return {boolean} true if this bag contains no elements. - */ - isEmpty(): boolean; - /** - * Removes all of the elements from this bag. - */ - clear(): void; -} diff --git a/dist/lib/Bag.js b/dist/lib/Bag.js deleted file mode 100644 index 2b904b3..0000000 --- a/dist/lib/Bag.js +++ /dev/null @@ -1,185 +0,0 @@ -"use strict"; -var util = require('./util'); -var Dictionary_1 = require('./Dictionary'); -var Set_1 = require('./Set'); -var Bag = (function () { - /** - * Creates an empty bag. - * @class

A bag is a special kind of set in which members are - * allowed to appear more than once.

- *

If the inserted elements are custom objects a function - * which converts elements to unique strings must be provided. Example:

- * - *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * - * @constructor - * @param {function(Object):string=} toStrFunction optional function used - * to convert elements to strings. If the elements aren't strings or if toString() - * is not appropriate, a custom function which receives an object and returns a - * unique string must be provided. - */ - function Bag(toStrFunction) { - this.toStrF = toStrFunction || util.defaultToString; - this.dictionary = new Dictionary_1.default(this.toStrF); - this.nElements = 0; - } - /** - * Adds nCopies of the specified object to this bag. - * @param {Object} element element to add. - * @param {number=} nCopies the number of copies to add, if this argument is - * undefined 1 copy is added. - * @return {boolean} true unless element is undefined. - */ - Bag.prototype.add = function (element, nCopies) { - if (nCopies === void 0) { nCopies = 1; } - if (util.isUndefined(element) || nCopies <= 0) { - return false; - } - if (!this.contains(element)) { - var node = { - value: element, - copies: nCopies - }; - this.dictionary.setValue(element, node); - } - else { - this.dictionary.getValue(element).copies += nCopies; - } - this.nElements += nCopies; - return true; - }; - /** - * Counts the number of copies of the specified object in this bag. - * @param {Object} element the object to search for.. - * @return {number} the number of copies of the object, 0 if not found - */ - Bag.prototype.count = function (element) { - if (!this.contains(element)) { - return 0; - } - else { - return this.dictionary.getValue(element).copies; - } - }; - /** - * Returns true if this bag contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this bag contains the specified element, - * false otherwise. - */ - Bag.prototype.contains = function (element) { - return this.dictionary.containsKey(element); - }; - /** - * Removes nCopies of the specified object to this bag. - * If the number of copies to remove is greater than the actual number - * of copies in the Bag, all copies are removed. - * @param {Object} element element to remove. - * @param {number=} nCopies the number of copies to remove, if this argument is - * undefined 1 copy is removed. - * @return {boolean} true if at least 1 element was removed. - */ - Bag.prototype.remove = function (element, nCopies) { - if (nCopies === void 0) { nCopies = 1; } - if (util.isUndefined(element) || nCopies <= 0) { - return false; - } - if (!this.contains(element)) { - return false; - } - else { - var node = this.dictionary.getValue(element); - if (nCopies > node.copies) { - this.nElements -= node.copies; - } - else { - this.nElements -= nCopies; - } - node.copies -= nCopies; - if (node.copies <= 0) { - this.dictionary.remove(element); - } - return true; - } - }; - /** - * Returns an array containing all of the elements in this big in arbitrary order, - * including multiple copies. - * @return {Array} an array containing all of the elements in this bag. - */ - Bag.prototype.toArray = function () { - var a = []; - var values = this.dictionary.values(); - for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { - var node = values_1[_i]; - var element = node.value; - var copies = node.copies; - for (var j = 0; j < copies; j++) { - a.push(element); - } - } - return a; - }; - /** - * Returns a set of unique elements in this bag. - * @return {collections.Set} a set of unique elements in this bag. - */ - Bag.prototype.toSet = function () { - var toret = new Set_1.default(this.toStrF); - var elements = this.dictionary.values(); - for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) { - var ele = elements_1[_i]; - var value = ele.value; - toret.add(value); - } - return toret; - }; - /** - * Executes the provided function once for each element - * present in this bag, including multiple copies. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element. To break the iteration you can - * optionally return false. - */ - Bag.prototype.forEach = function (callback) { - this.dictionary.forEach(function (k, v) { - var value = v.value; - var copies = v.copies; - for (var i = 0; i < copies; i++) { - if (callback(value) === false) { - return false; - } - } - return true; - }); - }; - /** - * Returns the number of elements in this bag. - * @return {number} the number of elements in this bag. - */ - Bag.prototype.size = function () { - return this.nElements; - }; - /** - * Returns true if this bag contains no elements. - * @return {boolean} true if this bag contains no elements. - */ - Bag.prototype.isEmpty = function () { - return this.nElements === 0; - }; - /** - * Removes all of the elements from this bag. - */ - Bag.prototype.clear = function () { - this.nElements = 0; - this.dictionary.clear(); - }; - return Bag; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Bag; // End of bag -//# sourceMappingURL=Bag.js.map \ No newline at end of file diff --git a/dist/lib/Bag.js.map b/dist/lib/Bag.js.map deleted file mode 100644 index 728157b..0000000 --- a/dist/lib/Bag.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Bag.js","sourceRoot":"","sources":["../../src/lib/Bag.ts"],"names":[],"mappings":";AAAA,IAAY,IAAI,WAAM,QAAQ,CAAC,CAAA;AAC/B,2BAAuB,cAAc,CAAC,CAAA;AACtC,oBAAgB,OAAO,CAAC,CAAA;AAExB;IAMI;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAAY,aAAmC;QAC3C,IAAI,CAAC,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAU,CAAS,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACvB,CAAC;IAGD;;;;;;MAME;IACF,iBAAG,GAAH,UAAI,OAAU,EAAE,OAAmB;QAAnB,uBAAmB,GAAnB,WAAmB;QAE/B,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAM,IAAI,GAAG;gBACT,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,OAAO;aAClB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC;IAChB,CAAC;IAED;;;;MAIE;IACF,mBAAK,GAAL,UAAM,OAAU;QAEZ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC;QACb,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QACpD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,sBAAQ,GAAR,UAAS,OAAU;QACf,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;MAQE;IACF,oBAAM,GAAN,UAAO,OAAU,EAAE,OAAmB;QAAnB,uBAAmB,GAAnB,WAAmB;QAElC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,IAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/C,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;YAClC,CAAC;YAAC,IAAI,CAAC,CAAC;gBACJ,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;YACvB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,qBAAO,GAAP;QACI,IAAM,CAAC,GAAa,EAAE,CAAC;QACvB,IAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACxC,GAAG,CAAC,CAAe,UAAM,EAAN,iBAAM,EAAN,oBAAM,EAAN,IAAM,CAAC;YAArB,IAAM,IAAI,eAAA;YACX,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YAC3B,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;SACJ;QACD,MAAM,CAAC,CAAC,CAAC;IACb,CAAC;IAED;;;OAGG;IACH,mBAAK,GAAL;QACI,IAAM,KAAK,GAAG,IAAI,aAAG,CAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC1C,GAAG,CAAC,CAAc,UAAQ,EAAR,qBAAQ,EAAR,sBAAQ,EAAR,IAAQ,CAAC;YAAtB,IAAM,GAAG,iBAAA;YACV,IAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACpB;QACD,MAAM,CAAC,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,qBAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAS,CAAC,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACtB,IAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACxB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;oBAC5B,MAAM,CAAC,KAAK,CAAC;gBACjB,CAAC;YACL,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IACD;;;OAGG;IACH,kBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,qBAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,mBAAK,GAAL;QACI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEL,UAAC;AAAD,CAAC,AA7LD,IA6LC;AA7LD;qBA6LC,CAAA,CAAA,aAAa"} \ No newline at end of file diff --git a/dist/lib/Dictionary.d.ts b/dist/lib/Dictionary.d.ts deleted file mode 100644 index 84e446e..0000000 --- a/dist/lib/Dictionary.d.ts +++ /dev/null @@ -1,114 +0,0 @@ -export interface IDictionaryPair { - key: K; - value: V; -} -export default class Dictionary { - /** - * Object holding the key-value pairs. - * @type {Object} - * @private - */ - protected table: { - [key: string]: IDictionaryPair; - }; - /** - * Number of elements in the list. - * @type {number} - * @private - */ - protected nElements: number; - /** - * Function used to convert keys to strings. - * @type {function(Object):string} - * @protected - */ - protected toStr: (key: K) => string; - /** - * Creates an empty dictionary. - * @class

Dictionaries map keys to values; each key can map to at most one value. - * This implementation accepts any kind of objects as keys.

- * - *

If the keys are custom objects a function which converts keys to unique - * strings must be provided. Example:

- *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * @constructor - * @param {function(Object):string=} toStrFunction optional function used - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - */ - constructor(toStrFunction?: (key: K) => string); - /** - * Returns the value to which this dictionary maps the specified key. - * Returns undefined if this dictionary contains no mapping for this key. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * undefined if the map contains no mapping for this key. - */ - getValue(key: K): V; - /** - * Associates the specified value with the specified key in this dictionary. - * If the dictionary previously contained a mapping for this key, the old - * value is replaced by the specified value. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or undefined if - * there was no mapping for the key or if the key/value are undefined. - */ - setValue(key: K, value: V): V; - /** - * Removes the mapping for this key from this dictionary if it is present. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @return {*} previous value associated with specified key, or undefined if - * there was no mapping for key. - */ - remove(key: K): V; - /** - * Returns an array containing all of the keys in this dictionary. - * @return {Array} an array containing all of the keys in this dictionary. - */ - keys(): K[]; - /** - * Returns an array containing all of the values in this dictionary. - * @return {Array} an array containing all of the values in this dictionary. - */ - values(): V[]; - /** - * Executes the provided function once for each key-value pair - * present in this dictionary. - * @param {function(Object,Object):*} callback function to execute, it is - * invoked with two arguments: key and value. To break the iteration you can - * optionally return false. - */ - forEach(callback: (key: K, value: V) => any): void; - /** - * Returns true if this dictionary contains a mapping for the specified key. - * @param {Object} key key whose presence in this dictionary is to be - * tested. - * @return {boolean} true if this dictionary contains a mapping for the - * specified key. - */ - containsKey(key: K): boolean; - /** - * Removes all mappings from this dictionary. - * @this {collections.Dictionary} - */ - clear(): void; - /** - * Returns the number of keys in this dictionary. - * @return {number} the number of key-value mappings in this dictionary. - */ - size(): number; - /** - * Returns true if this dictionary contains no mappings. - * @return {boolean} true if this dictionary contains no mappings. - */ - isEmpty(): boolean; - toString(): string; -} diff --git a/dist/lib/Dictionary.js b/dist/lib/Dictionary.js deleted file mode 100644 index 21a0895..0000000 --- a/dist/lib/Dictionary.js +++ /dev/null @@ -1,177 +0,0 @@ -"use strict"; -var util = require('./util'); -var Dictionary = (function () { - /** - * Creates an empty dictionary. - * @class

Dictionaries map keys to values; each key can map to at most one value. - * This implementation accepts any kind of objects as keys.

- * - *

If the keys are custom objects a function which converts keys to unique - * strings must be provided. Example:

- *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * @constructor - * @param {function(Object):string=} toStrFunction optional function used - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - */ - function Dictionary(toStrFunction) { - this.table = {}; - this.nElements = 0; - this.toStr = toStrFunction || util.defaultToString; - } - /** - * Returns the value to which this dictionary maps the specified key. - * Returns undefined if this dictionary contains no mapping for this key. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * undefined if the map contains no mapping for this key. - */ - Dictionary.prototype.getValue = function (key) { - var pair = this.table['$' + this.toStr(key)]; - if (util.isUndefined(pair)) { - return undefined; - } - return pair.value; - }; - /** - * Associates the specified value with the specified key in this dictionary. - * If the dictionary previously contained a mapping for this key, the old - * value is replaced by the specified value. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or undefined if - * there was no mapping for the key or if the key/value are undefined. - */ - Dictionary.prototype.setValue = function (key, value) { - if (util.isUndefined(key) || util.isUndefined(value)) { - return undefined; - } - var ret; - var k = '$' + this.toStr(key); - var previousElement = this.table[k]; - if (util.isUndefined(previousElement)) { - this.nElements++; - ret = undefined; - } - else { - ret = previousElement.value; - } - this.table[k] = { - key: key, - value: value - }; - return ret; - }; - /** - * Removes the mapping for this key from this dictionary if it is present. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @return {*} previous value associated with specified key, or undefined if - * there was no mapping for key. - */ - Dictionary.prototype.remove = function (key) { - var k = '$' + this.toStr(key); - var previousElement = this.table[k]; - if (!util.isUndefined(previousElement)) { - delete this.table[k]; - this.nElements--; - return previousElement.value; - } - return undefined; - }; - /** - * Returns an array containing all of the keys in this dictionary. - * @return {Array} an array containing all of the keys in this dictionary. - */ - Dictionary.prototype.keys = function () { - var array = []; - for (var name_1 in this.table) { - if (util.has(this.table, name_1)) { - var pair = this.table[name_1]; - array.push(pair.key); - } - } - return array; - }; - /** - * Returns an array containing all of the values in this dictionary. - * @return {Array} an array containing all of the values in this dictionary. - */ - Dictionary.prototype.values = function () { - var array = []; - for (var name_2 in this.table) { - if (util.has(this.table, name_2)) { - var pair = this.table[name_2]; - array.push(pair.value); - } - } - return array; - }; - /** - * Executes the provided function once for each key-value pair - * present in this dictionary. - * @param {function(Object,Object):*} callback function to execute, it is - * invoked with two arguments: key and value. To break the iteration you can - * optionally return false. - */ - Dictionary.prototype.forEach = function (callback) { - for (var name_3 in this.table) { - if (util.has(this.table, name_3)) { - var pair = this.table[name_3]; - var ret = callback(pair.key, pair.value); - if (ret === false) { - return; - } - } - } - }; - /** - * Returns true if this dictionary contains a mapping for the specified key. - * @param {Object} key key whose presence in this dictionary is to be - * tested. - * @return {boolean} true if this dictionary contains a mapping for the - * specified key. - */ - Dictionary.prototype.containsKey = function (key) { - return !util.isUndefined(this.getValue(key)); - }; - /** - * Removes all mappings from this dictionary. - * @this {collections.Dictionary} - */ - Dictionary.prototype.clear = function () { - this.table = {}; - this.nElements = 0; - }; - /** - * Returns the number of keys in this dictionary. - * @return {number} the number of key-value mappings in this dictionary. - */ - Dictionary.prototype.size = function () { - return this.nElements; - }; - /** - * Returns true if this dictionary contains no mappings. - * @return {boolean} true if this dictionary contains no mappings. - */ - Dictionary.prototype.isEmpty = function () { - return this.nElements <= 0; - }; - Dictionary.prototype.toString = function () { - var toret = '{'; - this.forEach(function (k, v) { - toret += "\n\t" + k + " : " + v; - }); - return toret + '\n}'; - }; - return Dictionary; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Dictionary; // End of dictionary -//# sourceMappingURL=Dictionary.js.map \ No newline at end of file diff --git a/dist/lib/Dictionary.js.map b/dist/lib/Dictionary.js.map deleted file mode 100644 index 064192d..0000000 --- a/dist/lib/Dictionary.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Dictionary.js","sourceRoot":"","sources":["../../src/lib/Dictionary.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/FactoryDictionary.d.ts b/dist/lib/FactoryDictionary.d.ts deleted file mode 100644 index 9ddeac2..0000000 --- a/dist/lib/FactoryDictionary.d.ts +++ /dev/null @@ -1,58 +0,0 @@ -import Dictionary from './Dictionary'; -export default class FactoryDictionary extends Dictionary { - /** - * Factory to create default values. - * @type {function(Object):string} - * @protected - */ - protected defaultFactoryFunction: () => V; - /** - * Creates an empty dictionary. - * @class

Dictionaries map keys to values; each key can map to at most one value. - * This implementation accepts any kind of objects as keys.

- * - *

The default factory function should return a new object of the provided - * type. Example:

- *
-     * function petFactory() {
-     *  return new Pet();
-     * }
-     * 
- * - *

If the keys are custom objects a function which converts keys to unique - * strings must be provided. Example:

- *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * @constructor - * @param {function():V=} defaultFactoryFunction function used to create a - * default object. - * @param {function(Object):string=} toStrFunction optional function used - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - */ - constructor(defaultFactoryFunction: () => V, toStrFunction?: (key: K) => string); - /** - * Associates the specified default value with the specified key in this dictionary, - * if it didn't contain the key yet. If the key existed, the existing value will be used. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} defaultValue default value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or the default value, - * if the key didn't exist yet. - */ - setDefault(key: K, defaultValue: V): V; - /** - * Returns the value to which this dictionary maps the specified key. - * Returns a default value created by the factory passed in the constructor, - * if this dictionary contains no mapping for this key. The missing key will - * automatically be added to the dictionary. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * a default value if the map contains no mapping for this key. - */ - getValue(key: K): V; -} diff --git a/dist/lib/FactoryDictionary.js b/dist/lib/FactoryDictionary.js deleted file mode 100644 index f78a533..0000000 --- a/dist/lib/FactoryDictionary.js +++ /dev/null @@ -1,76 +0,0 @@ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Dictionary_1 = require('./Dictionary'); -var util = require('./util'); -var FactoryDictionary = (function (_super) { - __extends(FactoryDictionary, _super); - /** - * Creates an empty dictionary. - * @class

Dictionaries map keys to values; each key can map to at most one value. - * This implementation accepts any kind of objects as keys.

- * - *

The default factory function should return a new object of the provided - * type. Example:

- *
-     * function petFactory() {
-     *  return new Pet();
-     * }
-     * 
- * - *

If the keys are custom objects a function which converts keys to unique - * strings must be provided. Example:

- *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * @constructor - * @param {function():V=} defaultFactoryFunction function used to create a - * default object. - * @param {function(Object):string=} toStrFunction optional function used - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - */ - function FactoryDictionary(defaultFactoryFunction, toStrFunction) { - _super.call(this, toStrFunction); - this.defaultFactoryFunction = defaultFactoryFunction; - } - /** - * Associates the specified default value with the specified key in this dictionary, - * if it didn't contain the key yet. If the key existed, the existing value will be used. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} defaultValue default value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or the default value, - * if the key didn't exist yet. - */ - FactoryDictionary.prototype.setDefault = function (key, defaultValue) { - var currentValue = _super.prototype.getValue.call(this, key); - if (util.isUndefined(currentValue)) { - this.setValue(key, defaultValue); - return defaultValue; - } - return currentValue; - }; - /** - * Returns the value to which this dictionary maps the specified key. - * Returns a default value created by the factory passed in the constructor, - * if this dictionary contains no mapping for this key. The missing key will - * automatically be added to the dictionary. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * a default value if the map contains no mapping for this key. - */ - FactoryDictionary.prototype.getValue = function (key) { - return this.setDefault(key, this.defaultFactoryFunction()); - }; - return FactoryDictionary; -}(Dictionary_1.default)); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = FactoryDictionary; -//# sourceMappingURL=FactoryDictionary.js.map \ No newline at end of file diff --git a/dist/lib/FactoryDictionary.js.map b/dist/lib/FactoryDictionary.js.map deleted file mode 100644 index 20ba3f9..0000000 --- a/dist/lib/FactoryDictionary.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"FactoryDictionary.js","sourceRoot":"","sources":["../../src/lib/FactoryDictionary.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAuB,cAAc,CAAC,CAAA;AACtC,IAAY,IAAI,WAAM,QAAQ,CAAC,CAAA;AAE/B;IAAqD,qCAAgB;IASjE;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,2BAAY,sBAA+B,EAAE,aAAkC;QAC3E,kBAAM,aAAa,CAAC,CAAC;QAErB,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACzD,CAAC;IAGD;;;;;;;;OAQG;IACH,sCAAU,GAAV,UAAW,GAAM,EAAE,YAAe;QAC9B,IAAM,YAAY,GAAM,gBAAK,CAAC,QAAQ,YAAC,GAAG,CAAC,CAAC;QAE5C,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAEjC,MAAM,CAAC,YAAY,CAAC;QACxB,CAAC;QAED,MAAM,CAAC,YAAY,CAAC;IACxB,CAAC;IAED;;;;;;;;OAQG;IACH,oCAAQ,GAAR,UAAS,GAAM;QACX,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC/D,CAAC;IACL,wBAAC;AAAD,CAAC,AA7ED,CAAqD,oBAAU,GA6E9D;AA7ED;mCA6EC,CAAA"} \ No newline at end of file diff --git a/dist/lib/Heap.d.ts b/dist/lib/Heap.d.ts deleted file mode 100644 index f2c7632..0000000 --- a/dist/lib/Heap.d.ts +++ /dev/null @@ -1,151 +0,0 @@ -import * as collections from './util'; -export default class Heap { - /** - * Array used to store the elements od the heap. - * @type {Array.} - * @private - */ - private data; - /** - * Function used to compare elements. - * @type {function(Object,Object):number} - * @private - */ - private compare; - /** - * Creates an empty Heap. - * @class - *

A heap is a binary tree, where the nodes maintain the heap property: - * each node is smaller than each of its children and therefore a MinHeap - * This implementation uses an array to store elements.

- *

If the inserted elements are custom objects a compare function must be provided, - * at construction time, otherwise the <=, === and >= operators are - * used to compare elements. Example:

- * - *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * - *

If a Max-Heap is wanted (greater elements on top) you can a provide a - * reverse compare function to accomplish that behavior. Example:

- * - *
-     * function reverseCompare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return 1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return -1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * - * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two elements. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - constructor(compareFunction?: collections.ICompareFunction); - /** - * Returns the index of the left child of the node at the given index. - * @param {number} nodeIndex The index of the node to get the left child - * for. - * @return {number} The index of the left child. - * @private - */ - private leftChildIndex(nodeIndex); - /** - * Returns the index of the right child of the node at the given index. - * @param {number} nodeIndex The index of the node to get the right child - * for. - * @return {number} The index of the right child. - * @private - */ - private rightChildIndex(nodeIndex); - /** - * Returns the index of the parent of the node at the given index. - * @param {number} nodeIndex The index of the node to get the parent for. - * @return {number} The index of the parent. - * @private - */ - private parentIndex(nodeIndex); - /** - * Returns the index of the smaller child node (if it exists). - * @param {number} leftChild left child index. - * @param {number} rightChild right child index. - * @return {number} the index with the minimum value or -1 if it doesn't - * exists. - * @private - */ - private minIndex(leftChild, rightChild); - /** - * Moves the node at the given index up to its proper place in the heap. - * @param {number} index The index of the node to move up. - * @private - */ - private siftUp(index); - /** - * Moves the node at the given index down to its proper place in the heap. - * @param {number} nodeIndex The index of the node to move down. - * @private - */ - private siftDown(nodeIndex); - /** - * Retrieves but does not remove the root element of this heap. - * @return {*} The value at the root of the heap. Returns undefined if the - * heap is empty. - */ - peek(): T; - /** - * Adds the given element into the heap. - * @param {*} element the element. - * @return true if the element was added or fals if it is undefined. - */ - add(element: T): boolean; - /** - * Retrieves and removes the root element of this heap. - * @return {*} The value removed from the root of the heap. Returns - * undefined if the heap is empty. - */ - removeRoot(): T; - /** - * Returns true if this heap contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this Heap contains the specified element, false - * otherwise. - */ - contains(element: T): boolean; - /** - * Returns the number of elements in this heap. - * @return {number} the number of elements in this heap. - */ - size(): number; - /** - * Checks if this heap is empty. - * @return {boolean} true if and only if this heap contains no items; false - * otherwise. - */ - isEmpty(): boolean; - /** - * Removes all of the elements from this heap. - */ - clear(): void; - /** - * Executes the provided function once for each element present in this heap in - * no particular order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - forEach(callback: collections.ILoopFunction): void; -} diff --git a/dist/lib/Heap.js b/dist/lib/Heap.js deleted file mode 100644 index 7202daa..0000000 --- a/dist/lib/Heap.js +++ /dev/null @@ -1,227 +0,0 @@ -"use strict"; -var collections = require('./util'); -var arrays = require('./arrays'); -var Heap = (function () { - /** - * Creates an empty Heap. - * @class - *

A heap is a binary tree, where the nodes maintain the heap property: - * each node is smaller than each of its children and therefore a MinHeap - * This implementation uses an array to store elements.

- *

If the inserted elements are custom objects a compare function must be provided, - * at construction time, otherwise the <=, === and >= operators are - * used to compare elements. Example:

- * - *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * - *

If a Max-Heap is wanted (greater elements on top) you can a provide a - * reverse compare function to accomplish that behavior. Example:

- * - *
-     * function reverseCompare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return 1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return -1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * - * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two elements. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - function Heap(compareFunction) { - /** - * Array used to store the elements od the heap. - * @type {Array.} - * @private - */ - this.data = []; - this.compare = compareFunction || collections.defaultCompare; - } - /** - * Returns the index of the left child of the node at the given index. - * @param {number} nodeIndex The index of the node to get the left child - * for. - * @return {number} The index of the left child. - * @private - */ - Heap.prototype.leftChildIndex = function (nodeIndex) { - return (2 * nodeIndex) + 1; - }; - /** - * Returns the index of the right child of the node at the given index. - * @param {number} nodeIndex The index of the node to get the right child - * for. - * @return {number} The index of the right child. - * @private - */ - Heap.prototype.rightChildIndex = function (nodeIndex) { - return (2 * nodeIndex) + 2; - }; - /** - * Returns the index of the parent of the node at the given index. - * @param {number} nodeIndex The index of the node to get the parent for. - * @return {number} The index of the parent. - * @private - */ - Heap.prototype.parentIndex = function (nodeIndex) { - return Math.floor((nodeIndex - 1) / 2); - }; - /** - * Returns the index of the smaller child node (if it exists). - * @param {number} leftChild left child index. - * @param {number} rightChild right child index. - * @return {number} the index with the minimum value or -1 if it doesn't - * exists. - * @private - */ - Heap.prototype.minIndex = function (leftChild, rightChild) { - if (rightChild >= this.data.length) { - if (leftChild >= this.data.length) { - return -1; - } - else { - return leftChild; - } - } - else { - if (this.compare(this.data[leftChild], this.data[rightChild]) <= 0) { - return leftChild; - } - else { - return rightChild; - } - } - }; - /** - * Moves the node at the given index up to its proper place in the heap. - * @param {number} index The index of the node to move up. - * @private - */ - Heap.prototype.siftUp = function (index) { - var parent = this.parentIndex(index); - while (index > 0 && this.compare(this.data[parent], this.data[index]) > 0) { - arrays.swap(this.data, parent, index); - index = parent; - parent = this.parentIndex(index); - } - }; - /** - * Moves the node at the given index down to its proper place in the heap. - * @param {number} nodeIndex The index of the node to move down. - * @private - */ - Heap.prototype.siftDown = function (nodeIndex) { - //smaller child index - var min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex)); - while (min >= 0 && this.compare(this.data[nodeIndex], this.data[min]) > 0) { - arrays.swap(this.data, min, nodeIndex); - nodeIndex = min; - min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex)); - } - }; - /** - * Retrieves but does not remove the root element of this heap. - * @return {*} The value at the root of the heap. Returns undefined if the - * heap is empty. - */ - Heap.prototype.peek = function () { - if (this.data.length > 0) { - return this.data[0]; - } - else { - return undefined; - } - }; - /** - * Adds the given element into the heap. - * @param {*} element the element. - * @return true if the element was added or fals if it is undefined. - */ - Heap.prototype.add = function (element) { - if (collections.isUndefined(element)) { - return undefined; - } - this.data.push(element); - this.siftUp(this.data.length - 1); - return true; - }; - /** - * Retrieves and removes the root element of this heap. - * @return {*} The value removed from the root of the heap. Returns - * undefined if the heap is empty. - */ - Heap.prototype.removeRoot = function () { - if (this.data.length > 0) { - var obj = this.data[0]; - this.data[0] = this.data[this.data.length - 1]; - this.data.splice(this.data.length - 1, 1); - if (this.data.length > 0) { - this.siftDown(0); - } - return obj; - } - return undefined; - }; - /** - * Returns true if this heap contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this Heap contains the specified element, false - * otherwise. - */ - Heap.prototype.contains = function (element) { - var equF = collections.compareToEquals(this.compare); - return arrays.contains(this.data, element, equF); - }; - /** - * Returns the number of elements in this heap. - * @return {number} the number of elements in this heap. - */ - Heap.prototype.size = function () { - return this.data.length; - }; - /** - * Checks if this heap is empty. - * @return {boolean} true if and only if this heap contains no items; false - * otherwise. - */ - Heap.prototype.isEmpty = function () { - return this.data.length <= 0; - }; - /** - * Removes all of the elements from this heap. - */ - Heap.prototype.clear = function () { - this.data.length = 0; - }; - /** - * Executes the provided function once for each element present in this heap in - * no particular order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - Heap.prototype.forEach = function (callback) { - arrays.forEach(this.data, callback); - }; - return Heap; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Heap; -//# sourceMappingURL=Heap.js.map \ No newline at end of file diff --git a/dist/lib/Heap.js.map b/dist/lib/Heap.js.map deleted file mode 100644 index 3b155e7..0000000 --- a/dist/lib/Heap.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Heap.js","sourceRoot":"","sources":["../../src/lib/Heap.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/LinkedDictionary.d.ts b/dist/lib/LinkedDictionary.d.ts deleted file mode 100644 index 299a571..0000000 --- a/dist/lib/LinkedDictionary.d.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { default as Dictionary } from './Dictionary'; -export default class LinkedDictionary extends Dictionary { - private head; - private tail; - constructor(toStrFunction?: (key: K) => string); - /** - * Inserts the new node to the 'tail' of the list, updating the - * neighbors, and moving 'this.tail' (the End of List indicator) that - * to the end. - */ - private appendToTail(entry); - /** - * Retrieves a linked dictionary from the table internally - */ - private getLinkedDictionaryPair(key); - /** - * Returns the value to which this dictionary maps the specified key. - * Returns undefined if this dictionary contains no mapping for this key. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * undefined if the map contains no mapping for this key. - */ - getValue(key: K): V; - /** - * Removes the mapping for this key from this dictionary if it is present. - * Also, if a value is present for this key, the entry is removed from the - * insertion ordering. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @return {*} previous value associated with specified key, or undefined if - * there was no mapping for key. - */ - remove(key: K): V; - /** - * Removes all mappings from this LinkedDictionary. - * @this {collections.LinkedDictionary} - */ - clear(): void; - /** - * Internal function used when updating an existing KeyValue pair. - * It places the new value indexed by key into the table, but maintains - * its place in the linked ordering. - */ - private replace(oldPair, newPair); - /** - * Associates the specified value with the specified key in this dictionary. - * If the dictionary previously contained a mapping for this key, the old - * value is replaced by the specified value. - * Updating of a key that already exists maintains its place in the - * insertion order into the map. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or undefined if - * there was no mapping for the key or if the key/value are undefined. - */ - setValue(key: K, value: V): V; - /** - * Returns an array containing all of the keys in this LinkedDictionary, ordered - * by insertion order. - * @return {Array} an array containing all of the keys in this LinkedDictionary, - * ordered by insertion order. - */ - keys(): K[]; - /** - * Returns an array containing all of the values in this LinkedDictionary, ordered by - * insertion order. - * @return {Array} an array containing all of the values in this LinkedDictionary, - * ordered by insertion order. - */ - values(): V[]; - /** - * Executes the provided function once for each key-value pair - * present in this LinkedDictionary. It is done in the order of insertion - * into the LinkedDictionary - * @param {function(Object,Object):*} callback function to execute, it is - * invoked with two arguments: key and value. To break the iteration you can - * optionally return false. - */ - forEach(callback: (key: K, value: V) => any): void; -} diff --git a/dist/lib/LinkedDictionary.js b/dist/lib/LinkedDictionary.js deleted file mode 100644 index 29efb5b..0000000 --- a/dist/lib/LinkedDictionary.js +++ /dev/null @@ -1,218 +0,0 @@ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Dictionary_1 = require('./Dictionary'); -var util = require('./util'); -/** - * This class is used by the LinkedDictionary Internally - * Has to be a class, not an interface, because it needs to have - * the 'unlink' function defined. - */ -var LinkedDictionaryPair = (function () { - function LinkedDictionaryPair(key, value) { - this.key = key; - this.value = value; - } - LinkedDictionaryPair.prototype.unlink = function () { - this.prev.next = this.next; - this.next.prev = this.prev; - }; - return LinkedDictionaryPair; -}()); -var LinkedDictionary = (function (_super) { - __extends(LinkedDictionary, _super); - function LinkedDictionary(toStrFunction) { - _super.call(this, toStrFunction); - this.head = new LinkedDictionaryPair(null, null); - this.tail = new LinkedDictionaryPair(null, null); - this.head.next = this.tail; - this.tail.prev = this.head; - } - /** - * Inserts the new node to the 'tail' of the list, updating the - * neighbors, and moving 'this.tail' (the End of List indicator) that - * to the end. - */ - LinkedDictionary.prototype.appendToTail = function (entry) { - var lastNode = this.tail.prev; - lastNode.next = entry; - entry.prev = lastNode; - entry.next = this.tail; - this.tail.prev = entry; - }; - /** - * Retrieves a linked dictionary from the table internally - */ - LinkedDictionary.prototype.getLinkedDictionaryPair = function (key) { - if (util.isUndefined(key)) { - return undefined; - } - var k = '$' + this.toStr(key); - var pair = (this.table[k]); - return pair; - }; - /** - * Returns the value to which this dictionary maps the specified key. - * Returns undefined if this dictionary contains no mapping for this key. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * undefined if the map contains no mapping for this key. - */ - LinkedDictionary.prototype.getValue = function (key) { - var pair = this.getLinkedDictionaryPair(key); - if (!util.isUndefined(pair)) { - return pair.value; - } - return undefined; - }; - /** - * Removes the mapping for this key from this dictionary if it is present. - * Also, if a value is present for this key, the entry is removed from the - * insertion ordering. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @return {*} previous value associated with specified key, or undefined if - * there was no mapping for key. - */ - LinkedDictionary.prototype.remove = function (key) { - var pair = this.getLinkedDictionaryPair(key); - if (!util.isUndefined(pair)) { - _super.prototype.remove.call(this, key); // This will remove it from the table - pair.unlink(); // This will unlink it from the chain - return pair.value; - } - return undefined; - }; - /** - * Removes all mappings from this LinkedDictionary. - * @this {collections.LinkedDictionary} - */ - LinkedDictionary.prototype.clear = function () { - _super.prototype.clear.call(this); - this.head.next = this.tail; - this.tail.prev = this.head; - }; - /** - * Internal function used when updating an existing KeyValue pair. - * It places the new value indexed by key into the table, but maintains - * its place in the linked ordering. - */ - LinkedDictionary.prototype.replace = function (oldPair, newPair) { - var k = '$' + this.toStr(newPair.key); - // set the new Pair's links to existingPair's links - newPair.next = oldPair.next; - newPair.prev = oldPair.prev; - // Delete Existing Pair from the table, unlink it from chain. - // As a result, the nElements gets decremented by this operation - this.remove(oldPair.key); - // Link new Pair in place of where oldPair was, - // by pointing the old pair's neighbors to it. - newPair.prev.next = newPair; - newPair.next.prev = newPair; - this.table[k] = newPair; - // To make up for the fact that the number of elements was decremented, - // We need to increase it by one. - ++this.nElements; - }; - /** - * Associates the specified value with the specified key in this dictionary. - * If the dictionary previously contained a mapping for this key, the old - * value is replaced by the specified value. - * Updating of a key that already exists maintains its place in the - * insertion order into the map. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or undefined if - * there was no mapping for the key or if the key/value are undefined. - */ - LinkedDictionary.prototype.setValue = function (key, value) { - if (util.isUndefined(key) || util.isUndefined(value)) { - return undefined; - } - var existingPair = this.getLinkedDictionaryPair(key); - var newPair = new LinkedDictionaryPair(key, value); - var k = '$' + this.toStr(key); - // If there is already an element for that key, we - // keep it's place in the LinkedList - if (!util.isUndefined(existingPair)) { - this.replace(existingPair, newPair); - return existingPair.value; - } - else { - this.appendToTail(newPair); - this.table[k] = newPair; - ++this.nElements; - return undefined; - } - }; - /** - * Returns an array containing all of the keys in this LinkedDictionary, ordered - * by insertion order. - * @return {Array} an array containing all of the keys in this LinkedDictionary, - * ordered by insertion order. - */ - LinkedDictionary.prototype.keys = function () { - var array = []; - this.forEach(function (key, value) { - array.push(key); - }); - return array; - }; - /** - * Returns an array containing all of the values in this LinkedDictionary, ordered by - * insertion order. - * @return {Array} an array containing all of the values in this LinkedDictionary, - * ordered by insertion order. - */ - LinkedDictionary.prototype.values = function () { - var array = []; - this.forEach(function (key, value) { - array.push(value); - }); - return array; - }; - /** - * Executes the provided function once for each key-value pair - * present in this LinkedDictionary. It is done in the order of insertion - * into the LinkedDictionary - * @param {function(Object,Object):*} callback function to execute, it is - * invoked with two arguments: key and value. To break the iteration you can - * optionally return false. - */ - LinkedDictionary.prototype.forEach = function (callback) { - var crawlNode = this.head.next; - while (crawlNode.next != null) { - var ret = callback(crawlNode.key, crawlNode.value); - if (ret === false) { - return; - } - crawlNode = crawlNode.next; - } - }; - return LinkedDictionary; -}(Dictionary_1.default)); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = LinkedDictionary; // End of LinkedDictionary -// /** -// * Returns true if this dictionary is equal to the given dictionary. -// * Two dictionaries are equal if they contain the same mappings. -// * @param {collections.Dictionary} other the other dictionary. -// * @param {function(Object,Object):boolean=} valuesEqualFunction optional -// * function used to check if two values are equal. -// * @return {boolean} true if this dictionary is equal to the given dictionary. -// */ -// collections.Dictionary.prototype.equals = function(other,valuesEqualFunction) { -// const eqF = valuesEqualFunction || collections.defaultEquals; -// if(!(other instanceof collections.Dictionary)){ -// return false; -// } -// if(this.size() !== other.size()){ -// return false; -// } -// return this.equalsAux(this.firstNode,other.firstNode,eqF); -// } -//# sourceMappingURL=LinkedDictionary.js.map \ No newline at end of file diff --git a/dist/lib/LinkedDictionary.js.map b/dist/lib/LinkedDictionary.js.map deleted file mode 100644 index 004af19..0000000 --- a/dist/lib/LinkedDictionary.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"LinkedDictionary.js","sourceRoot":"","sources":["../../src/lib/LinkedDictionary.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/LinkedList.d.ts b/dist/lib/LinkedList.d.ts deleted file mode 100644 index 6888940..0000000 --- a/dist/lib/LinkedList.d.ts +++ /dev/null @@ -1,179 +0,0 @@ -import * as util from './util'; -export interface ILinkedListNode { - element: T; - next: ILinkedListNode; -} -export default class LinkedList { - /** - * First node in the list - * @type {Object} - * @private - */ - firstNode: ILinkedListNode; - /** - * Last node in the list - * @type {Object} - * @private - */ - private lastNode; - /** - * Number of elements in the list - * @type {number} - * @private - */ - private nElements; - /** - * Creates an empty Linked List. - * @class A linked list is a data structure consisting of a group of nodes - * which together represent a sequence. - * @constructor - */ - constructor(); - /** - * Adds an element to this list. - * @param {Object} item element to be added. - * @param {number=} index optional index to add the element. If no index is specified - * the element is added to the end of this list. - * @return {boolean} true if the element was added or false if the index is invalid - * or if the element is undefined. - */ - add(item: T, index?: number): boolean; - /** - * Returns the first element in this list. - * @return {*} the first element of the list or undefined if the list is - * empty. - */ - first(): T; - /** - * Returns the last element in this list. - * @return {*} the last element in the list or undefined if the list is - * empty. - */ - last(): T; - /** - * Returns the element at the specified position in this list. - * @param {number} index desired index. - * @return {*} the element at the given index or undefined if the index is - * out of bounds. - */ - elementAtIndex(index: number): T; - /** - * Returns the index in this list of the first occurrence of the - * specified element, or -1 if the List does not contain this element. - *

If the elements inside this list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName = function(pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} item element to search for. - * @param {function(Object,Object):boolean=} equalsFunction Optional - * function used to check if two elements are equal. - * @return {number} the index in this list of the first occurrence - * of the specified element, or -1 if this list does not contain the - * element. - */ - indexOf(item: T, equalsFunction?: util.IEqualsFunction): number; - /** - * Returns true if this list contains the specified element. - *

If the elements inside the list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-       * const petsAreEqualByName = function(pet1, pet2) {
-       *  return pet1.name === pet2.name;
-       * }
-       * 
- * @param {Object} item element to search for. - * @param {function(Object,Object):boolean=} equalsFunction Optional - * function used to check if two elements are equal. - * @return {boolean} true if this list contains the specified element, false - * otherwise. - */ - contains(item: T, equalsFunction?: util.IEqualsFunction): boolean; - /** - * Removes the first occurrence of the specified element in this list. - *

If the elements inside the list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName = function(pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} item element to be removed from this list, if present. - * @return {boolean} true if the list contained the specified element. - */ - remove(item: T, equalsFunction?: util.IEqualsFunction): boolean; - /** - * Removes all of the elements from this list. - */ - clear(): void; - /** - * Returns true if this list is equal to the given list. - * Two lists are equal if they have the same elements in the same order. - * @param {LinkedList} other the other list. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function used to check if two elements are equal. If the elements in the lists - * are custom objects you should provide a function, otherwise - * the === operator is used to check equality between elements. - * @return {boolean} true if this list is equal to the given list. - */ - equals(other: LinkedList, equalsFunction?: util.IEqualsFunction): boolean; - /** - * @private - */ - private equalsAux(n1, n2, eqF); - /** - * Removes the element at the specified position in this list. - * @param {number} index given index. - * @return {*} removed element or undefined if the index is out of bounds. - */ - removeElementAtIndex(index: number): T; - /** - * Executes the provided function once for each element present in this list in order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - forEach(callback: util.ILoopFunction): void; - /** - * Reverses the order of the elements in this linked list (makes the last - * element first, and the first element last). - */ - reverse(): void; - /** - * Returns an array containing all of the elements in this list in proper - * sequence. - * @return {Array.<*>} an array containing all of the elements in this list, - * in proper sequence. - */ - toArray(): T[]; - /** - * Returns the number of elements in this list. - * @return {number} the number of elements in this list. - */ - size(): number; - /** - * Returns true if this list contains no elements. - * @return {boolean} true if this list contains no elements. - */ - isEmpty(): boolean; - toString(): string; - /** - * @private - */ - private nodeAtIndex(index); - /** - * @private - */ - private createNode(item); -} diff --git a/dist/lib/LinkedList.js b/dist/lib/LinkedList.js deleted file mode 100644 index 27923df..0000000 --- a/dist/lib/LinkedList.js +++ /dev/null @@ -1,378 +0,0 @@ -"use strict"; -var util = require('./util'); -var arrays = require('./arrays'); -var LinkedList = (function () { - /** - * Creates an empty Linked List. - * @class A linked list is a data structure consisting of a group of nodes - * which together represent a sequence. - * @constructor - */ - function LinkedList() { - /** - * First node in the list - * @type {Object} - * @private - */ - this.firstNode = null; - /** - * Last node in the list - * @type {Object} - * @private - */ - this.lastNode = null; - /** - * Number of elements in the list - * @type {number} - * @private - */ - this.nElements = 0; - } - /** - * Adds an element to this list. - * @param {Object} item element to be added. - * @param {number=} index optional index to add the element. If no index is specified - * the element is added to the end of this list. - * @return {boolean} true if the element was added or false if the index is invalid - * or if the element is undefined. - */ - LinkedList.prototype.add = function (item, index) { - if (util.isUndefined(index)) { - index = this.nElements; - } - if (index < 0 || index > this.nElements || util.isUndefined(item)) { - return false; - } - var newNode = this.createNode(item); - if (this.nElements === 0) { - // First node in the list. - this.firstNode = newNode; - this.lastNode = newNode; - } - else if (index === this.nElements) { - // Insert at the end. - this.lastNode.next = newNode; - this.lastNode = newNode; - } - else if (index === 0) { - // Change first node. - newNode.next = this.firstNode; - this.firstNode = newNode; - } - else { - var prev = this.nodeAtIndex(index - 1); - newNode.next = prev.next; - prev.next = newNode; - } - this.nElements++; - return true; - }; - /** - * Returns the first element in this list. - * @return {*} the first element of the list or undefined if the list is - * empty. - */ - LinkedList.prototype.first = function () { - if (this.firstNode !== null) { - return this.firstNode.element; - } - return undefined; - }; - /** - * Returns the last element in this list. - * @return {*} the last element in the list or undefined if the list is - * empty. - */ - LinkedList.prototype.last = function () { - if (this.lastNode !== null) { - return this.lastNode.element; - } - return undefined; - }; - /** - * Returns the element at the specified position in this list. - * @param {number} index desired index. - * @return {*} the element at the given index or undefined if the index is - * out of bounds. - */ - LinkedList.prototype.elementAtIndex = function (index) { - var node = this.nodeAtIndex(index); - if (node === null) { - return undefined; - } - return node.element; - }; - /** - * Returns the index in this list of the first occurrence of the - * specified element, or -1 if the List does not contain this element. - *

If the elements inside this list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName = function(pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} item element to search for. - * @param {function(Object,Object):boolean=} equalsFunction Optional - * function used to check if two elements are equal. - * @return {number} the index in this list of the first occurrence - * of the specified element, or -1 if this list does not contain the - * element. - */ - LinkedList.prototype.indexOf = function (item, equalsFunction) { - var equalsF = equalsFunction || util.defaultEquals; - if (util.isUndefined(item)) { - return -1; - } - var currentNode = this.firstNode; - var index = 0; - while (currentNode !== null) { - if (equalsF(currentNode.element, item)) { - return index; - } - index++; - currentNode = currentNode.next; - } - return -1; - }; - /** - * Returns true if this list contains the specified element. - *

If the elements inside the list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-       * const petsAreEqualByName = function(pet1, pet2) {
-       *  return pet1.name === pet2.name;
-       * }
-       * 
- * @param {Object} item element to search for. - * @param {function(Object,Object):boolean=} equalsFunction Optional - * function used to check if two elements are equal. - * @return {boolean} true if this list contains the specified element, false - * otherwise. - */ - LinkedList.prototype.contains = function (item, equalsFunction) { - return (this.indexOf(item, equalsFunction) >= 0); - }; - /** - * Removes the first occurrence of the specified element in this list. - *

If the elements inside the list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName = function(pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} item element to be removed from this list, if present. - * @return {boolean} true if the list contained the specified element. - */ - LinkedList.prototype.remove = function (item, equalsFunction) { - var equalsF = equalsFunction || util.defaultEquals; - if (this.nElements < 1 || util.isUndefined(item)) { - return false; - } - var previous = null; - var currentNode = this.firstNode; - while (currentNode !== null) { - if (equalsF(currentNode.element, item)) { - if (currentNode === this.firstNode) { - this.firstNode = this.firstNode.next; - if (currentNode === this.lastNode) { - this.lastNode = null; - } - } - else if (currentNode === this.lastNode) { - this.lastNode = previous; - previous.next = currentNode.next; - currentNode.next = null; - } - else { - previous.next = currentNode.next; - currentNode.next = null; - } - this.nElements--; - return true; - } - previous = currentNode; - currentNode = currentNode.next; - } - return false; - }; - /** - * Removes all of the elements from this list. - */ - LinkedList.prototype.clear = function () { - this.firstNode = null; - this.lastNode = null; - this.nElements = 0; - }; - /** - * Returns true if this list is equal to the given list. - * Two lists are equal if they have the same elements in the same order. - * @param {LinkedList} other the other list. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function used to check if two elements are equal. If the elements in the lists - * are custom objects you should provide a function, otherwise - * the === operator is used to check equality between elements. - * @return {boolean} true if this list is equal to the given list. - */ - LinkedList.prototype.equals = function (other, equalsFunction) { - var eqF = equalsFunction || util.defaultEquals; - if (!(other instanceof LinkedList)) { - return false; - } - if (this.size() !== other.size()) { - return false; - } - return this.equalsAux(this.firstNode, other.firstNode, eqF); - }; - /** - * @private - */ - LinkedList.prototype.equalsAux = function (n1, n2, eqF) { - while (n1 !== null) { - if (!eqF(n1.element, n2.element)) { - return false; - } - n1 = n1.next; - n2 = n2.next; - } - return true; - }; - /** - * Removes the element at the specified position in this list. - * @param {number} index given index. - * @return {*} removed element or undefined if the index is out of bounds. - */ - LinkedList.prototype.removeElementAtIndex = function (index) { - if (index < 0 || index >= this.nElements) { - return undefined; - } - var element; - if (this.nElements === 1) { - //First node in the list. - element = this.firstNode.element; - this.firstNode = null; - this.lastNode = null; - } - else { - var previous = this.nodeAtIndex(index - 1); - if (previous === null) { - element = this.firstNode.element; - this.firstNode = this.firstNode.next; - } - else if (previous.next === this.lastNode) { - element = this.lastNode.element; - this.lastNode = previous; - } - if (previous !== null) { - element = previous.next.element; - previous.next = previous.next.next; - } - } - this.nElements--; - return element; - }; - /** - * Executes the provided function once for each element present in this list in order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - LinkedList.prototype.forEach = function (callback) { - var currentNode = this.firstNode; - while (currentNode !== null) { - if (callback(currentNode.element) === false) { - break; - } - currentNode = currentNode.next; - } - }; - /** - * Reverses the order of the elements in this linked list (makes the last - * element first, and the first element last). - */ - LinkedList.prototype.reverse = function () { - var previous = null; - var current = this.firstNode; - var temp = null; - while (current !== null) { - temp = current.next; - current.next = previous; - previous = current; - current = temp; - } - temp = this.firstNode; - this.firstNode = this.lastNode; - this.lastNode = temp; - }; - /** - * Returns an array containing all of the elements in this list in proper - * sequence. - * @return {Array.<*>} an array containing all of the elements in this list, - * in proper sequence. - */ - LinkedList.prototype.toArray = function () { - var array = []; - var currentNode = this.firstNode; - while (currentNode !== null) { - array.push(currentNode.element); - currentNode = currentNode.next; - } - return array; - }; - /** - * Returns the number of elements in this list. - * @return {number} the number of elements in this list. - */ - LinkedList.prototype.size = function () { - return this.nElements; - }; - /** - * Returns true if this list contains no elements. - * @return {boolean} true if this list contains no elements. - */ - LinkedList.prototype.isEmpty = function () { - return this.nElements <= 0; - }; - LinkedList.prototype.toString = function () { - return arrays.toString(this.toArray()); - }; - /** - * @private - */ - LinkedList.prototype.nodeAtIndex = function (index) { - if (index < 0 || index >= this.nElements) { - return null; - } - if (index === (this.nElements - 1)) { - return this.lastNode; - } - var node = this.firstNode; - for (var i = 0; i < index; i++) { - node = node.next; - } - return node; - }; - /** - * @private - */ - LinkedList.prototype.createNode = function (item) { - return { - element: item, - next: null - }; - }; - return LinkedList; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = LinkedList; // End of linked list -//# sourceMappingURL=LinkedList.js.map \ No newline at end of file diff --git a/dist/lib/LinkedList.js.map b/dist/lib/LinkedList.js.map deleted file mode 100644 index 0a604f3..0000000 --- a/dist/lib/LinkedList.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"LinkedList.js","sourceRoot":"","sources":["../../src/lib/LinkedList.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/MultiDictionary.d.ts b/dist/lib/MultiDictionary.d.ts deleted file mode 100644 index 93f8bb6..0000000 --- a/dist/lib/MultiDictionary.d.ts +++ /dev/null @@ -1,104 +0,0 @@ -import * as util from './util'; -export default class MultiDictionary { - private dict; - private equalsF; - private allowDuplicate; - /** - * Creates an empty multi dictionary. - * @class

A multi dictionary is a special kind of dictionary that holds - * multiple values against each key. Setting a value into the dictionary will - * add the value to an array at that key. Getting a key will return an array, - * holding all the values set to that key. - * You can configure to allow duplicates in the values. - * This implementation accepts any kind of objects as keys.

- * - *

If the keys are custom objects a function which converts keys to strings must be - * provided. Example:

- * - *
-     * function petToString(pet) {
-       *  return pet.name;
-       * }
-     * 
- *

If the values are custom objects a function to check equality between values - * must be provided. Example:

- * - *
-     * function petsAreEqualByAge(pet1,pet2) {
-       *  return pet1.age===pet2.age;
-       * }
-     * 
- * @constructor - * @param {function(Object):string=} toStrFunction optional function - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - * @param {function(Object,Object):boolean=} valuesEqualsFunction optional - * function to check if two values are equal. - * - * @param allowDuplicateValues - */ - constructor(toStrFunction?: (key: K) => string, valuesEqualsFunction?: util.IEqualsFunction, allowDuplicateValues?: boolean); - /** - * Returns an array holding the values to which this dictionary maps - * the specified key. - * Returns an empty array if this dictionary contains no mappings for this key. - * @param {Object} key key whose associated values are to be returned. - * @return {Array} an array holding the values to which this dictionary maps - * the specified key. - */ - getValue(key: K): V[]; - /** - * Adds the value to the array associated with the specified key, if - * it is not already present. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value the value to add to the array at the key - * @return {boolean} true if the value was not already associated with that key. - */ - setValue(key: K, value: V): boolean; - /** - * Removes the specified values from the array of values associated with the - * specified key. If a value isn't given, all values associated with the specified - * key are removed. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @param {Object=} value optional argument to specify the value to remove - * from the array associated with the specified key. - * @return {*} true if the dictionary changed, false if the key doesn't exist or - * if the specified value isn't associated with the specified key. - */ - remove(key: K, value?: V): boolean; - /** - * Returns an array containing all of the keys in this dictionary. - * @return {Array} an array containing all of the keys in this dictionary. - */ - keys(): K[]; - /** - * Returns an array containing all of the values in this dictionary. - * @return {Array} an array containing all of the values in this dictionary. - */ - values(): V[]; - /** - * Returns true if this dictionary at least one value associatted the specified key. - * @param {Object} key key whose presence in this dictionary is to be - * tested. - * @return {boolean} true if this dictionary at least one value associatted - * the specified key. - */ - containsKey(key: K): boolean; - /** - * Removes all mappings from this dictionary. - */ - clear(): void; - /** - * Returns the number of keys in this dictionary. - * @return {number} the number of key-value mappings in this dictionary. - */ - size(): number; - /** - * Returns true if this dictionary contains no mappings. - * @return {boolean} true if this dictionary contains no mappings. - */ - isEmpty(): boolean; -} diff --git a/dist/lib/MultiDictionary.js b/dist/lib/MultiDictionary.js deleted file mode 100644 index 38d16cb..0000000 --- a/dist/lib/MultiDictionary.js +++ /dev/null @@ -1,169 +0,0 @@ -"use strict"; -var util = require('./util'); -var Dictionary_1 = require('./Dictionary'); -var arrays = require('./arrays'); -var MultiDictionary = (function () { - /** - * Creates an empty multi dictionary. - * @class

A multi dictionary is a special kind of dictionary that holds - * multiple values against each key. Setting a value into the dictionary will - * add the value to an array at that key. Getting a key will return an array, - * holding all the values set to that key. - * You can configure to allow duplicates in the values. - * This implementation accepts any kind of objects as keys.

- * - *

If the keys are custom objects a function which converts keys to strings must be - * provided. Example:

- * - *
-     * function petToString(pet) {
-       *  return pet.name;
-       * }
-     * 
- *

If the values are custom objects a function to check equality between values - * must be provided. Example:

- * - *
-     * function petsAreEqualByAge(pet1,pet2) {
-       *  return pet1.age===pet2.age;
-       * }
-     * 
- * @constructor - * @param {function(Object):string=} toStrFunction optional function - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - * @param {function(Object,Object):boolean=} valuesEqualsFunction optional - * function to check if two values are equal. - * - * @param allowDuplicateValues - */ - function MultiDictionary(toStrFunction, valuesEqualsFunction, allowDuplicateValues) { - if (allowDuplicateValues === void 0) { allowDuplicateValues = false; } - this.dict = new Dictionary_1.default(toStrFunction); - this.equalsF = valuesEqualsFunction || util.defaultEquals; - this.allowDuplicate = allowDuplicateValues; - } - /** - * Returns an array holding the values to which this dictionary maps - * the specified key. - * Returns an empty array if this dictionary contains no mappings for this key. - * @param {Object} key key whose associated values are to be returned. - * @return {Array} an array holding the values to which this dictionary maps - * the specified key. - */ - MultiDictionary.prototype.getValue = function (key) { - var values = this.dict.getValue(key); - if (util.isUndefined(values)) { - return []; - } - return arrays.copy(values); - }; - /** - * Adds the value to the array associated with the specified key, if - * it is not already present. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value the value to add to the array at the key - * @return {boolean} true if the value was not already associated with that key. - */ - MultiDictionary.prototype.setValue = function (key, value) { - if (util.isUndefined(key) || util.isUndefined(value)) { - return false; - } - if (!this.containsKey(key)) { - this.dict.setValue(key, [value]); - return true; - } - var array = this.dict.getValue(key); - if (!this.allowDuplicate) { - if (arrays.contains(array, value, this.equalsF)) { - return false; - } - } - array.push(value); - return true; - }; - /** - * Removes the specified values from the array of values associated with the - * specified key. If a value isn't given, all values associated with the specified - * key are removed. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @param {Object=} value optional argument to specify the value to remove - * from the array associated with the specified key. - * @return {*} true if the dictionary changed, false if the key doesn't exist or - * if the specified value isn't associated with the specified key. - */ - MultiDictionary.prototype.remove = function (key, value) { - if (util.isUndefined(value)) { - var v = this.dict.remove(key); - return !util.isUndefined(v); - } - var array = this.dict.getValue(key); - if (arrays.remove(array, value, this.equalsF)) { - if (array.length === 0) { - this.dict.remove(key); - } - return true; - } - return false; - }; - /** - * Returns an array containing all of the keys in this dictionary. - * @return {Array} an array containing all of the keys in this dictionary. - */ - MultiDictionary.prototype.keys = function () { - return this.dict.keys(); - }; - /** - * Returns an array containing all of the values in this dictionary. - * @return {Array} an array containing all of the values in this dictionary. - */ - MultiDictionary.prototype.values = function () { - var values = this.dict.values(); - var array = []; - for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { - var v = values_1[_i]; - for (var _a = 0, v_1 = v; _a < v_1.length; _a++) { - var w = v_1[_a]; - array.push(w); - } - } - return array; - }; - /** - * Returns true if this dictionary at least one value associatted the specified key. - * @param {Object} key key whose presence in this dictionary is to be - * tested. - * @return {boolean} true if this dictionary at least one value associatted - * the specified key. - */ - MultiDictionary.prototype.containsKey = function (key) { - return this.dict.containsKey(key); - }; - /** - * Removes all mappings from this dictionary. - */ - MultiDictionary.prototype.clear = function () { - this.dict.clear(); - }; - /** - * Returns the number of keys in this dictionary. - * @return {number} the number of key-value mappings in this dictionary. - */ - MultiDictionary.prototype.size = function () { - return this.dict.size(); - }; - /** - * Returns true if this dictionary contains no mappings. - * @return {boolean} true if this dictionary contains no mappings. - */ - MultiDictionary.prototype.isEmpty = function () { - return this.dict.isEmpty(); - }; - return MultiDictionary; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MultiDictionary; // end of multi dictionary -//# sourceMappingURL=MultiDictionary.js.map \ No newline at end of file diff --git a/dist/lib/MultiDictionary.js.map b/dist/lib/MultiDictionary.js.map deleted file mode 100644 index b0dbe9f..0000000 --- a/dist/lib/MultiDictionary.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MultiDictionary.js","sourceRoot":"","sources":["../../src/lib/MultiDictionary.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/MultiRootTree.d.ts b/dist/lib/MultiRootTree.d.ts deleted file mode 100644 index 751200e..0000000 --- a/dist/lib/MultiRootTree.d.ts +++ /dev/null @@ -1,49 +0,0 @@ -export declare enum Direction { - BEFORE = 0, - AFTER = 1, - INSIDE_AT_END = 2, - INSIDE_AT_START = 3, -} -export default class MultiRootTree { - rootIds: Array; - nodes: { - [id: string]: Array; - }; - constructor(rootIds?: Array, nodes?: { - [id: string]: Array; - }); - getRootIds(): string[]; - getNodes(): { - [id: string]: string[]; - }; - getObject(): { - rootIds: string[]; - nodes: { - [id: string]: string[]; - }; - }; - moveIdBeforeId(moveId: string, beforeId: string): void; - moveIdAfterId(moveId: string, afterId: string): void; - moveIdIntoId(moveId: string, insideId: string, atStart?: boolean): void; - deleteId(id: string): void; - insertIdBeforeId(beforeId: string, insertId: string): void; - insertIdAfterId(belowId: string, insertId: string): void; - insertIdIntoId(insideId: string, insertId: string): void; - insertIdIntoRoot(id: string, position?: number): void; - insertIdIntoNode(nodeKey: string, id: string, position?: number): void; - private moveId(moveId, beforeId, direction); - private swapArrayElements(arr, indexA, indexB); - private rootDeleteId(id); - private nodeAndSubNodesDelete(nodeKey); - private nodeRefrencesDelete(id); - private nodeDelete(nodeKey); - private findRootId(id); - private findNodeId(nodeKey, id); - private findNode(nodeKey); - private nodeInsertAtStart(nodeKey, id); - private nodeInsertAtEnd(nodeKey, id); - private rootDelete(index); - private nodeDeleteAtIndex(nodeKey, index); - private rootInsertAtStart(id); - private rootInsertAtEnd(id); -} diff --git a/dist/lib/MultiRootTree.js b/dist/lib/MultiRootTree.js deleted file mode 100644 index 806a5ff..0000000 --- a/dist/lib/MultiRootTree.js +++ /dev/null @@ -1,330 +0,0 @@ -"use strict"; -(function (Direction) { - Direction[Direction["BEFORE"] = 0] = "BEFORE"; - Direction[Direction["AFTER"] = 1] = "AFTER"; - Direction[Direction["INSIDE_AT_END"] = 2] = "INSIDE_AT_END"; - Direction[Direction["INSIDE_AT_START"] = 3] = "INSIDE_AT_START"; -})(exports.Direction || (exports.Direction = {})); -var Direction = exports.Direction; -var MultiRootTree = (function () { - function MultiRootTree(rootIds, nodes) { - if (rootIds === void 0) { rootIds = []; } - if (nodes === void 0) { nodes = {}; } - this.rootIds = rootIds; - this.nodes = nodes; - } - MultiRootTree.prototype.getRootIds = function () { - var clone = this.rootIds.slice(); - return clone; - }; - MultiRootTree.prototype.getNodes = function () { - var clone = {}; - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - clone[nodeKey] = this.nodes[nodeKey].slice(); - } - } - return clone; - }; - MultiRootTree.prototype.getObject = function () { - return { - rootIds: this.getRootIds(), - nodes: this.getNodes(), - }; - }; - MultiRootTree.prototype.moveIdBeforeId = function (moveId, beforeId) { - return this.moveId(moveId, beforeId, Direction.BEFORE); - }; - MultiRootTree.prototype.moveIdAfterId = function (moveId, afterId) { - return this.moveId(moveId, afterId, Direction.AFTER); - }; - MultiRootTree.prototype.moveIdIntoId = function (moveId, insideId, atStart) { - if (atStart === void 0) { atStart = true; } - if (atStart) { - return this.moveId(moveId, insideId, Direction.INSIDE_AT_START); - } - else { - return this.moveId(moveId, insideId, Direction.INSIDE_AT_END); - } - }; - MultiRootTree.prototype.deleteId = function (id) { - this.rootDeleteId(id); - this.nodeAndSubNodesDelete(id); - this.nodeRefrencesDelete(id); - }; - MultiRootTree.prototype.insertIdBeforeId = function (beforeId, insertId) { - var foundRootIdIndex = this.findRootId(beforeId); - if (foundRootIdIndex > -1) { - this.insertIdIntoRoot(insertId, foundRootIdIndex); - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var foundNodeIdIndex = this.findNodeId(nodeKey, beforeId); - if (foundNodeIdIndex > -1) { - this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex); - } - } - } - }; - MultiRootTree.prototype.insertIdAfterId = function (belowId, insertId) { - var foundRootIdIndex = this.findRootId(belowId); - if (foundRootIdIndex > -1) { - this.insertIdIntoRoot(insertId, foundRootIdIndex + 1); - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var foundNodeIdIndex = this.findNodeId(nodeKey, belowId); - if (foundNodeIdIndex > -1) { - this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex + 1); - } - } - } - }; - MultiRootTree.prototype.insertIdIntoId = function (insideId, insertId) { - this.nodeInsertAtEnd(insideId, insertId); - this.nodes[insertId] = []; - }; - MultiRootTree.prototype.insertIdIntoRoot = function (id, position) { - if (position === undefined) { - this.rootInsertAtEnd(id); - } - else { - if (position < 0) { - var length_1 = this.rootIds.length; - this.rootIds.splice((position + length_1 + 1), 0, id); - } - else { - this.rootIds.splice(position, 0, id); - } - } - this.nodes[id] = this.nodes[id] || []; - }; - MultiRootTree.prototype.insertIdIntoNode = function (nodeKey, id, position) { - this.nodes[nodeKey] = this.nodes[nodeKey] || []; - this.nodes[id] = this.nodes[id] || []; - if (position === undefined) { - this.nodeInsertAtEnd(nodeKey, id); - } - else { - if (position < 0) { - var length_2 = this.nodes[nodeKey].length; - this.nodes[nodeKey].splice((position + length_2 + 1), 0, id); - } - else { - this.nodes[nodeKey].splice(position, 0, id); - } - } - }; - MultiRootTree.prototype.moveId = function (moveId, beforeId, direction) { - var sourceId = moveId; - var sourceRootIndex = this.findRootId(sourceId); - var sourceNodeKey; - var sourceNodeIdIndex; - if (this.nodes[beforeId]) { - sourceNodeKey = beforeId; - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - sourceNodeIdIndex = this.findNodeId(nodeKey, beforeId); - break; - } - } - // got all - var targetId = beforeId; - var targetRootIndex = this.findRootId(targetId); - var targetNodeKey; - var targetNodeIdIndex; - if (this.nodes[beforeId]) { - targetNodeKey = beforeId; - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - targetNodeIdIndex = this.findNodeId(nodeKey, beforeId); - break; - } - } - // got all - if (sourceRootIndex > -1) { - if (targetRootIndex > -1) { - this.rootDelete(sourceRootIndex); - switch (direction) { - case Direction.BEFORE: - this.insertIdIntoRoot(sourceId, targetRootIndex); - break; - case Direction.AFTER: - this.insertIdIntoRoot(sourceId, targetRootIndex + 1); - break; - case Direction.INSIDE_AT_START: - this.nodeInsertAtStart(targetId, sourceId); - break; - case Direction.INSIDE_AT_END: - this.nodeInsertAtEnd(targetId, sourceId); - break; - } - } - else { - // moving root (source) ABOVE node (target) - // will remove one entry from roots - this.rootDelete(sourceRootIndex); - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var index = this.findNodeId(nodeKey, targetId); - if (index > -1) { - switch (direction) { - case Direction.BEFORE: - this.insertIdIntoNode(nodeKey, sourceId, index); - break; - case Direction.AFTER: - this.insertIdIntoNode(nodeKey, sourceId, index + 1); - break; - case Direction.INSIDE_AT_START: - this.nodeInsertAtStart(targetId, sourceId); - break; - case Direction.INSIDE_AT_END: - this.nodeInsertAtEnd(targetId, sourceId); - break; - } - break; - } - } - } - } - } - else { - if (targetRootIndex > -1) { - // moving node (source) ABOVE root (target) - // delete source id from each node - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var index = this.findNodeId(nodeKey, sourceId); - if (index > -1) { - // this.nodeInsertId(nodeKey, sourceId, index); - this.nodeDeleteAtIndex(nodeKey, index); - break; - } - } - } - switch (direction) { - case Direction.BEFORE: - this.insertIdIntoRoot(sourceId, targetRootIndex); - break; - case Direction.AFTER: - this.insertIdIntoRoot(sourceId, targetRootIndex + 1); - break; - case Direction.INSIDE_AT_START: - this.nodeInsertAtStart(targetId, sourceId); - break; - case Direction.INSIDE_AT_END: - this.nodeInsertAtEnd(targetId, sourceId); - break; - } - } - else { - // moving node (source) ABOVE node (target) - // delete source id from each node - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var index = this.findNodeId(nodeKey, sourceId); - if (index > -1) { - this.nodeDeleteAtIndex(nodeKey, index); - break; - } - } - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var index = this.findNodeId(nodeKey, targetId); - if (index > -1) { - switch (direction) { - case Direction.BEFORE: - this.insertIdIntoNode(nodeKey, sourceId, index); - break; - case Direction.AFTER: - this.insertIdIntoNode(nodeKey, sourceId, index + 1); - break; - case Direction.INSIDE_AT_START: - this.nodeInsertAtStart(targetId, sourceId); - break; - case Direction.INSIDE_AT_END: - this.nodeInsertAtEnd(targetId, sourceId); - break; - } - break; - } - } - } - } - } - }; - MultiRootTree.prototype.swapArrayElements = function (arr, indexA, indexB) { - var temp = arr[indexA]; - arr[indexA] = arr[indexB]; - arr[indexB] = temp; - return arr; - }; - ; - MultiRootTree.prototype.rootDeleteId = function (id) { - var index = this.findRootId(id); - if (index > -1) { - this.rootDelete(index); - } - }; - MultiRootTree.prototype.nodeAndSubNodesDelete = function (nodeKey) { - var toDeleteLater = []; - for (var i = 0; i < this.nodes[nodeKey].length; i++) { - var id = this.nodes[nodeKey][i]; - this.nodeAndSubNodesDelete(id); - toDeleteLater.push(nodeKey); - } - this.nodeDelete(nodeKey); - for (var i = 0; i < toDeleteLater.length; i++) { - this.nodeDelete(toDeleteLater[i]); - } - }; - MultiRootTree.prototype.nodeRefrencesDelete = function (id) { - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - for (var i = 0; i < this.nodes[nodeKey].length; i++) { - var targetId = this.nodes[nodeKey][i]; - if (targetId === id) { - this.nodeDeleteAtIndex(nodeKey, i); - } - } - } - } - }; - MultiRootTree.prototype.nodeDelete = function (nodeKey) { - delete this.nodes[nodeKey]; - }; - MultiRootTree.prototype.findRootId = function (id) { - return this.rootIds.indexOf(id); - }; - MultiRootTree.prototype.findNodeId = function (nodeKey, id) { - return this.nodes[nodeKey].indexOf(id); - }; - MultiRootTree.prototype.findNode = function (nodeKey) { - return this.nodes[nodeKey]; - }; - MultiRootTree.prototype.nodeInsertAtStart = function (nodeKey, id) { - this.nodes[nodeKey].unshift(id); - }; - MultiRootTree.prototype.nodeInsertAtEnd = function (nodeKey, id) { - this.nodes[nodeKey].push(id); - }; - MultiRootTree.prototype.rootDelete = function (index) { - this.rootIds.splice(index, 1); - }; - MultiRootTree.prototype.nodeDeleteAtIndex = function (nodeKey, index) { - this.nodes[nodeKey].splice(index, 1); - }; - MultiRootTree.prototype.rootInsertAtStart = function (id) { - this.rootIds.unshift(id); - }; - MultiRootTree.prototype.rootInsertAtEnd = function (id) { - this.rootIds.push(id); - }; - return MultiRootTree; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MultiRootTree; -//# sourceMappingURL=MultiRootTree.js.map \ No newline at end of file diff --git a/dist/lib/MultiRootTree.js.map b/dist/lib/MultiRootTree.js.map deleted file mode 100644 index 1ed138d..0000000 --- a/dist/lib/MultiRootTree.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MultiRootTree.js","sourceRoot":"","sources":["../../src/lib/MultiRootTree.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/PriorityQueue.d.ts b/dist/lib/PriorityQueue.d.ts deleted file mode 100644 index 5427c52..0000000 --- a/dist/lib/PriorityQueue.d.ts +++ /dev/null @@ -1,82 +0,0 @@ -import * as util from './util'; -export default class PriorityQueue { - private heap; - /** - * Creates an empty priority queue. - * @class

In a priority queue each element is associated with a "priority", - * elements are dequeued in highest-priority-first order (the elements with the - * highest priority are dequeued first). Priority Queues are implemented as heaps. - * If the inserted elements are custom objects a compare function must be provided, - * otherwise the <=, === and >= operators are used to compare object priority.

- *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two element priorities. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - constructor(compareFunction?: util.ICompareFunction); - /** - * Inserts the specified element into this priority queue. - * @param {Object} element the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - enqueue(element: T): boolean; - /** - * Inserts the specified element into this priority queue. - * @param {Object} element the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - add(element: T): boolean; - /** - * Retrieves and removes the highest priority element of this queue. - * @return {*} the the highest priority element of this queue, - * or undefined if this queue is empty. - */ - dequeue(): T; - /** - * Retrieves, but does not remove, the highest priority element of this queue. - * @return {*} the highest priority element of this queue, or undefined if this queue is empty. - */ - peek(): T; - /** - * Returns true if this priority queue contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this priority queue contains the specified element, - * false otherwise. - */ - contains(element: T): boolean; - /** - * Checks if this priority queue is empty. - * @return {boolean} true if and only if this priority queue contains no items; false - * otherwise. - */ - isEmpty(): boolean; - /** - * Returns the number of elements in this priority queue. - * @return {number} the number of elements in this priority queue. - */ - size(): number; - /** - * Removes all of the elements from this priority queue. - */ - clear(): void; - /** - * Executes the provided function once for each element present in this queue in - * no particular order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - forEach(callback: util.ILoopFunction): void; -} diff --git a/dist/lib/PriorityQueue.js b/dist/lib/PriorityQueue.js deleted file mode 100644 index 8dc57a3..0000000 --- a/dist/lib/PriorityQueue.js +++ /dev/null @@ -1,112 +0,0 @@ -"use strict"; -var util = require('./util'); -var Heap_1 = require('./Heap'); -var PriorityQueue = (function () { - /** - * Creates an empty priority queue. - * @class

In a priority queue each element is associated with a "priority", - * elements are dequeued in highest-priority-first order (the elements with the - * highest priority are dequeued first). Priority Queues are implemented as heaps. - * If the inserted elements are custom objects a compare function must be provided, - * otherwise the <=, === and >= operators are used to compare object priority.

- *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two element priorities. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - function PriorityQueue(compareFunction) { - this.heap = new Heap_1.default(util.reverseCompareFunction(compareFunction)); - } - /** - * Inserts the specified element into this priority queue. - * @param {Object} element the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - PriorityQueue.prototype.enqueue = function (element) { - return this.heap.add(element); - }; - /** - * Inserts the specified element into this priority queue. - * @param {Object} element the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - PriorityQueue.prototype.add = function (element) { - return this.heap.add(element); - }; - /** - * Retrieves and removes the highest priority element of this queue. - * @return {*} the the highest priority element of this queue, - * or undefined if this queue is empty. - */ - PriorityQueue.prototype.dequeue = function () { - if (this.heap.size() !== 0) { - var el = this.heap.peek(); - this.heap.removeRoot(); - return el; - } - return undefined; - }; - /** - * Retrieves, but does not remove, the highest priority element of this queue. - * @return {*} the highest priority element of this queue, or undefined if this queue is empty. - */ - PriorityQueue.prototype.peek = function () { - return this.heap.peek(); - }; - /** - * Returns true if this priority queue contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this priority queue contains the specified element, - * false otherwise. - */ - PriorityQueue.prototype.contains = function (element) { - return this.heap.contains(element); - }; - /** - * Checks if this priority queue is empty. - * @return {boolean} true if and only if this priority queue contains no items; false - * otherwise. - */ - PriorityQueue.prototype.isEmpty = function () { - return this.heap.isEmpty(); - }; - /** - * Returns the number of elements in this priority queue. - * @return {number} the number of elements in this priority queue. - */ - PriorityQueue.prototype.size = function () { - return this.heap.size(); - }; - /** - * Removes all of the elements from this priority queue. - */ - PriorityQueue.prototype.clear = function () { - this.heap.clear(); - }; - /** - * Executes the provided function once for each element present in this queue in - * no particular order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - PriorityQueue.prototype.forEach = function (callback) { - this.heap.forEach(callback); - }; - return PriorityQueue; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = PriorityQueue; // end of priority queue -//# sourceMappingURL=PriorityQueue.js.map \ No newline at end of file diff --git a/dist/lib/PriorityQueue.js.map b/dist/lib/PriorityQueue.js.map deleted file mode 100644 index 853d65b..0000000 --- a/dist/lib/PriorityQueue.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PriorityQueue.js","sourceRoot":"","sources":["../../src/lib/PriorityQueue.ts"],"names":[],"mappings":";AAAA,IAAY,IAAI,WAAM,QAAQ,CAAC,CAAA;AAC/B,qBAAiB,QAAQ,CAAC,CAAA;AAE1B;IAGI;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,uBAAY,eAA0C;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,cAAI,CAAI,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,+BAAO,GAAP,UAAQ,OAAU;QACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,2BAAG,GAAH,UAAI,OAAU;QACV,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,+BAAO,GAAP;QACI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,CAAC,EAAE,CAAC;QACd,CAAC;QACD,MAAM,CAAC,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,4BAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;OAKG;IACH,gCAAQ,GAAR,UAAS,OAAU;QACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,+BAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,4BAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,6BAAK,GAAL;QACI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,+BAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEL,oBAAC;AAAD,CAAC,AApHD,IAoHC;AApHD;+BAoHC,CAAA,CAAC,wBAAwB"} \ No newline at end of file diff --git a/dist/lib/Queue.d.ts b/dist/lib/Queue.d.ts deleted file mode 100644 index 827b9f2..0000000 --- a/dist/lib/Queue.d.ts +++ /dev/null @@ -1,81 +0,0 @@ -import * as util from './util'; -export default class Queue { - /** - * List containing the elements. - * @type collections.LinkedList - * @private - */ - private list; - /** - * Creates an empty queue. - * @class A queue is a First-In-First-Out (FIFO) data structure, the first - * element added to the queue will be the first one to be removed. This - * implementation uses a linked list as a container. - * @constructor - */ - constructor(); - /** - * Inserts the specified element into the end of this queue. - * @param {Object} elem the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - enqueue(elem: T): boolean; - /** - * Inserts the specified element into the end of this queue. - * @param {Object} elem the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - add(elem: T): boolean; - /** - * Retrieves and removes the head of this queue. - * @return {*} the head of this queue, or undefined if this queue is empty. - */ - dequeue(): T; - /** - * Retrieves, but does not remove, the head of this queue. - * @return {*} the head of this queue, or undefined if this queue is empty. - */ - peek(): T; - /** - * Returns the number of elements in this queue. - * @return {number} the number of elements in this queue. - */ - size(): number; - /** - * Returns true if this queue contains the specified element. - *

If the elements inside this stack are - * not comparable with the === operator, a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName (pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} elem element to search for. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function to check if two elements are equal. - * @return {boolean} true if this queue contains the specified element, - * false otherwise. - */ - contains(elem: T, equalsFunction?: util.IEqualsFunction): boolean; - /** - * Checks if this queue is empty. - * @return {boolean} true if and only if this queue contains no items; false - * otherwise. - */ - isEmpty(): boolean; - /** - * Removes all of the elements from this queue. - */ - clear(): void; - /** - * Executes the provided function once for each element present in this queue in - * FIFO order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - forEach(callback: util.ILoopFunction): void; -} diff --git a/dist/lib/Queue.js b/dist/lib/Queue.js deleted file mode 100644 index e24d87a..0000000 --- a/dist/lib/Queue.js +++ /dev/null @@ -1,108 +0,0 @@ -"use strict"; -var LinkedList_1 = require('./LinkedList'); -var Queue = (function () { - /** - * Creates an empty queue. - * @class A queue is a First-In-First-Out (FIFO) data structure, the first - * element added to the queue will be the first one to be removed. This - * implementation uses a linked list as a container. - * @constructor - */ - function Queue() { - this.list = new LinkedList_1.default(); - } - /** - * Inserts the specified element into the end of this queue. - * @param {Object} elem the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - Queue.prototype.enqueue = function (elem) { - return this.list.add(elem); - }; - /** - * Inserts the specified element into the end of this queue. - * @param {Object} elem the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - Queue.prototype.add = function (elem) { - return this.list.add(elem); - }; - /** - * Retrieves and removes the head of this queue. - * @return {*} the head of this queue, or undefined if this queue is empty. - */ - Queue.prototype.dequeue = function () { - if (this.list.size() !== 0) { - var el = this.list.first(); - this.list.removeElementAtIndex(0); - return el; - } - return undefined; - }; - /** - * Retrieves, but does not remove, the head of this queue. - * @return {*} the head of this queue, or undefined if this queue is empty. - */ - Queue.prototype.peek = function () { - if (this.list.size() !== 0) { - return this.list.first(); - } - return undefined; - }; - /** - * Returns the number of elements in this queue. - * @return {number} the number of elements in this queue. - */ - Queue.prototype.size = function () { - return this.list.size(); - }; - /** - * Returns true if this queue contains the specified element. - *

If the elements inside this stack are - * not comparable with the === operator, a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName (pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} elem element to search for. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function to check if two elements are equal. - * @return {boolean} true if this queue contains the specified element, - * false otherwise. - */ - Queue.prototype.contains = function (elem, equalsFunction) { - return this.list.contains(elem, equalsFunction); - }; - /** - * Checks if this queue is empty. - * @return {boolean} true if and only if this queue contains no items; false - * otherwise. - */ - Queue.prototype.isEmpty = function () { - return this.list.size() <= 0; - }; - /** - * Removes all of the elements from this queue. - */ - Queue.prototype.clear = function () { - this.list.clear(); - }; - /** - * Executes the provided function once for each element present in this queue in - * FIFO order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - Queue.prototype.forEach = function (callback) { - this.list.forEach(callback); - }; - return Queue; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Queue; // End of queue -//# sourceMappingURL=Queue.js.map \ No newline at end of file diff --git a/dist/lib/Queue.js.map b/dist/lib/Queue.js.map deleted file mode 100644 index 610e9a9..0000000 --- a/dist/lib/Queue.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../src/lib/Queue.ts"],"names":[],"mappings":";AACA,2BAAuB,cAAc,CAAC,CAAA;AAGtC;IASI;;;;;;OAMG;IACH;QACI,IAAI,CAAC,IAAI,GAAG,IAAI,oBAAU,EAAK,CAAC;IACpC,CAAC;IAGD;;;;OAIG;IACH,uBAAO,GAAP,UAAQ,IAAO;QACX,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD;;;;OAIG;IACH,mBAAG,GAAH,UAAI,IAAO;QACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD;;;OAGG;IACH,uBAAO,GAAP;QACI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,EAAE,CAAC;QACd,CAAC;QACD,MAAM,CAAC,SAAS,CAAC;IACrB,CAAC;IACD;;;OAGG;IACH,oBAAI,GAAJ;QAEI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,oBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,wBAAQ,GAAR,UAAS,IAAO,EAAE,cAAwC;QACtD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,uBAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,qBAAK,GAAL;QACI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,uBAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEL,YAAC;AAAD,CAAC,AAtHD,IAsHC;AAtHD;uBAsHC,CAAA,CAAC,eAAe"} \ No newline at end of file diff --git a/dist/lib/Set.d.ts b/dist/lib/Set.d.ts deleted file mode 100644 index c6e87d7..0000000 --- a/dist/lib/Set.d.ts +++ /dev/null @@ -1,93 +0,0 @@ -import * as util from './util'; -export default class Set { - private dictionary; - /** - * Creates an empty set. - * @class

A set is a data structure that contains no duplicate items.

- *

If the inserted elements are custom objects a function - * which converts elements to strings must be provided. Example:

- * - *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * - * @constructor - * @param {function(Object):string=} toStringFunction optional function used - * to convert elements to strings. If the elements aren't strings or if toString() - * is not appropriate, a custom function which receives a onject and returns a - * unique string must be provided. - */ - constructor(toStringFunction?: (item: T) => string); - /** - * Returns true if this set contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this set contains the specified element, - * false otherwise. - */ - contains(element: T): boolean; - /** - * Adds the specified element to this set if it is not already present. - * @param {Object} element the element to insert. - * @return {boolean} true if this set did not already contain the specified element. - */ - add(element: T): boolean; - /** - * Performs an intersecion between this an another set. - * Removes all values that are not present this set and the given set. - * @param {collections.Set} otherSet other set. - */ - intersection(otherSet: Set): void; - /** - * Performs a union between this an another set. - * Adds all values from the given set to this set. - * @param {collections.Set} otherSet other set. - */ - union(otherSet: Set): void; - /** - * Performs a difference between this an another set. - * Removes from this set all the values that are present in the given set. - * @param {collections.Set} otherSet other set. - */ - difference(otherSet: Set): void; - /** - * Checks whether the given set contains all the elements in this set. - * @param {collections.Set} otherSet other set. - * @return {boolean} true if this set is a subset of the given set. - */ - isSubsetOf(otherSet: Set): boolean; - /** - * Removes the specified element from this set if it is present. - * @return {boolean} true if this set contained the specified element. - */ - remove(element: T): boolean; - /** - * Executes the provided function once for each element - * present in this set. - * @param {function(Object):*} callback function to execute, it is - * invoked with one arguments: the element. To break the iteration you can - * optionally return false. - */ - forEach(callback: util.ILoopFunction): void; - /** - * Returns an array containing all of the elements in this set in arbitrary order. - * @return {Array} an array containing all of the elements in this set. - */ - toArray(): T[]; - /** - * Returns true if this set contains no elements. - * @return {boolean} true if this set contains no elements. - */ - isEmpty(): boolean; - /** - * Returns the number of elements in this set. - * @return {number} the number of elements in this set. - */ - size(): number; - /** - * Removes all of the elements from this set. - */ - clear(): void; - toString(): string; -} diff --git a/dist/lib/Set.js b/dist/lib/Set.js deleted file mode 100644 index 1ca81a1..0000000 --- a/dist/lib/Set.js +++ /dev/null @@ -1,169 +0,0 @@ -"use strict"; -var util = require('./util'); -var arrays = require('./arrays'); -var Dictionary_1 = require('./Dictionary'); -var Set = (function () { - /** - * Creates an empty set. - * @class

A set is a data structure that contains no duplicate items.

- *

If the inserted elements are custom objects a function - * which converts elements to strings must be provided. Example:

- * - *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * - * @constructor - * @param {function(Object):string=} toStringFunction optional function used - * to convert elements to strings. If the elements aren't strings or if toString() - * is not appropriate, a custom function which receives a onject and returns a - * unique string must be provided. - */ - function Set(toStringFunction) { - this.dictionary = new Dictionary_1.default(toStringFunction); - } - /** - * Returns true if this set contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this set contains the specified element, - * false otherwise. - */ - Set.prototype.contains = function (element) { - return this.dictionary.containsKey(element); - }; - /** - * Adds the specified element to this set if it is not already present. - * @param {Object} element the element to insert. - * @return {boolean} true if this set did not already contain the specified element. - */ - Set.prototype.add = function (element) { - if (this.contains(element) || util.isUndefined(element)) { - return false; - } - else { - this.dictionary.setValue(element, element); - return true; - } - }; - /** - * Performs an intersecion between this an another set. - * Removes all values that are not present this set and the given set. - * @param {collections.Set} otherSet other set. - */ - Set.prototype.intersection = function (otherSet) { - var set = this; - this.forEach(function (element) { - if (!otherSet.contains(element)) { - set.remove(element); - } - return true; - }); - }; - /** - * Performs a union between this an another set. - * Adds all values from the given set to this set. - * @param {collections.Set} otherSet other set. - */ - Set.prototype.union = function (otherSet) { - var set = this; - otherSet.forEach(function (element) { - set.add(element); - return true; - }); - }; - /** - * Performs a difference between this an another set. - * Removes from this set all the values that are present in the given set. - * @param {collections.Set} otherSet other set. - */ - Set.prototype.difference = function (otherSet) { - var set = this; - otherSet.forEach(function (element) { - set.remove(element); - return true; - }); - }; - /** - * Checks whether the given set contains all the elements in this set. - * @param {collections.Set} otherSet other set. - * @return {boolean} true if this set is a subset of the given set. - */ - Set.prototype.isSubsetOf = function (otherSet) { - if (this.size() > otherSet.size()) { - return false; - } - var isSub = true; - this.forEach(function (element) { - if (!otherSet.contains(element)) { - isSub = false; - return false; - } - return true; - }); - return isSub; - }; - /** - * Removes the specified element from this set if it is present. - * @return {boolean} true if this set contained the specified element. - */ - Set.prototype.remove = function (element) { - if (!this.contains(element)) { - return false; - } - else { - this.dictionary.remove(element); - return true; - } - }; - /** - * Executes the provided function once for each element - * present in this set. - * @param {function(Object):*} callback function to execute, it is - * invoked with one arguments: the element. To break the iteration you can - * optionally return false. - */ - Set.prototype.forEach = function (callback) { - this.dictionary.forEach(function (k, v) { - return callback(v); - }); - }; - /** - * Returns an array containing all of the elements in this set in arbitrary order. - * @return {Array} an array containing all of the elements in this set. - */ - Set.prototype.toArray = function () { - return this.dictionary.values(); - }; - /** - * Returns true if this set contains no elements. - * @return {boolean} true if this set contains no elements. - */ - Set.prototype.isEmpty = function () { - return this.dictionary.isEmpty(); - }; - /** - * Returns the number of elements in this set. - * @return {number} the number of elements in this set. - */ - Set.prototype.size = function () { - return this.dictionary.size(); - }; - /** - * Removes all of the elements from this set. - */ - Set.prototype.clear = function () { - this.dictionary.clear(); - }; - /* - * Provides a string representation for display - */ - Set.prototype.toString = function () { - return arrays.toString(this.toArray()); - }; - return Set; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Set; // end of Set -//# sourceMappingURL=Set.js.map \ No newline at end of file diff --git a/dist/lib/Set.js.map b/dist/lib/Set.js.map deleted file mode 100644 index 4ccceb8..0000000 --- a/dist/lib/Set.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Set.js","sourceRoot":"","sources":["../../src/lib/Set.ts"],"names":[],"mappings":";AAAA,IAAY,IAAI,WAAM,QAAQ,CAAC,CAAA;AAE/B,IAAY,MAAM,WAAM,UAAU,CAAC,CAAA;AAEnC,2BAAuB,cAAc,CAAC,CAAA;AAEtC;IAGI;;;;;;;;;;;;;;;;;OAiBG;IACH,aAAY,gBAAsC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAU,CAAS,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAID;;;;;OAKG;IACH,sBAAQ,GAAR,UAAS,OAAU;QACf,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,iBAAG,GAAH,UAAI,OAAU;QACV,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,0BAAY,GAAZ,UAAa,QAAgB;QACzB,IAAM,GAAG,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,UAAS,OAAU;YAC5B,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC9B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,mBAAK,GAAL,UAAM,QAAgB;QAClB,IAAM,GAAG,GAAG,IAAI,CAAC;QACjB,QAAQ,CAAC,OAAO,CAAC,UAAS,OAAU;YAChC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,wBAAU,GAAV,UAAW,QAAgB;QACvB,IAAM,GAAG,GAAG,IAAI,CAAC;QACjB,QAAQ,CAAC,OAAO,CAAC,UAAS,OAAU;YAChC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,wBAAU,GAAV,UAAW,QAAgB;QAEvB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,UAAS,OAAO;YACzB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC9B,KAAK,GAAG,KAAK,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC;YACjB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,oBAAM,GAAN,UAAO,OAAU;QACb,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,qBAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAS,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,qBAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,qBAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,kBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,mBAAK,GAAL;QACI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;MAEE;IACF,sBAAQ,GAAR;QACI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IACL,UAAC;AAAD,CAAC,AAjLD,IAiLC;AAjLD;qBAiLC,CAAA,CAAA,aAAa"} \ No newline at end of file diff --git a/dist/lib/Stack.d.ts b/dist/lib/Stack.d.ts deleted file mode 100644 index 9e5e0d6..0000000 --- a/dist/lib/Stack.d.ts +++ /dev/null @@ -1,84 +0,0 @@ -import * as util from './util'; -export default class Stack { - /** - * List containing the elements. - * @type collections.LinkedList - * @private - */ - private list; - /** - * Creates an empty Stack. - * @class A Stack is a Last-In-First-Out (LIFO) data structure, the last - * element added to the stack will be the first one to be removed. This - * implementation uses a linked list as a container. - * @constructor - */ - constructor(); - /** - * Pushes an item onto the top of this stack. - * @param {Object} elem the element to be pushed onto this stack. - * @return {boolean} true if the element was pushed or false if it is undefined. - */ - push(elem: T): boolean; - /** - * Pushes an item onto the top of this stack. - * @param {Object} elem the element to be pushed onto this stack. - * @return {boolean} true if the element was pushed or false if it is undefined. - */ - add(elem: T): boolean; - /** - * Removes the object at the top of this stack and returns that object. - * @return {*} the object at the top of this stack or undefined if the - * stack is empty. - */ - pop(): T; - /** - * Looks at the object at the top of this stack without removing it from the - * stack. - * @return {*} the object at the top of this stack or undefined if the - * stack is empty. - */ - peek(): T; - /** - * Returns the number of elements in this stack. - * @return {number} the number of elements in this stack. - */ - size(): number; - /** - * Returns true if this stack contains the specified element. - *

If the elements inside this stack are - * not comparable with the === operator, a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName (pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} elem element to search for. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function to check if two elements are equal. - * @return {boolean} true if this stack contains the specified element, - * false otherwise. - */ - contains(elem: T, equalsFunction?: util.IEqualsFunction): boolean; - /** - * Checks if this stack is empty. - * @return {boolean} true if and only if this stack contains no items; false - * otherwise. - */ - isEmpty(): boolean; - /** - * Removes all of the elements from this stack. - */ - clear(): void; - /** - * Executes the provided function once for each element present in this stack in - * LIFO order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - forEach(callback: util.ILoopFunction): void; -} diff --git a/dist/lib/Stack.js b/dist/lib/Stack.js deleted file mode 100644 index 5dc9772..0000000 --- a/dist/lib/Stack.js +++ /dev/null @@ -1,103 +0,0 @@ -"use strict"; -var LinkedList_1 = require('./LinkedList'); -var Stack = (function () { - /** - * Creates an empty Stack. - * @class A Stack is a Last-In-First-Out (LIFO) data structure, the last - * element added to the stack will be the first one to be removed. This - * implementation uses a linked list as a container. - * @constructor - */ - function Stack() { - this.list = new LinkedList_1.default(); - } - /** - * Pushes an item onto the top of this stack. - * @param {Object} elem the element to be pushed onto this stack. - * @return {boolean} true if the element was pushed or false if it is undefined. - */ - Stack.prototype.push = function (elem) { - return this.list.add(elem, 0); - }; - /** - * Pushes an item onto the top of this stack. - * @param {Object} elem the element to be pushed onto this stack. - * @return {boolean} true if the element was pushed or false if it is undefined. - */ - Stack.prototype.add = function (elem) { - return this.list.add(elem, 0); - }; - /** - * Removes the object at the top of this stack and returns that object. - * @return {*} the object at the top of this stack or undefined if the - * stack is empty. - */ - Stack.prototype.pop = function () { - return this.list.removeElementAtIndex(0); - }; - /** - * Looks at the object at the top of this stack without removing it from the - * stack. - * @return {*} the object at the top of this stack or undefined if the - * stack is empty. - */ - Stack.prototype.peek = function () { - return this.list.first(); - }; - /** - * Returns the number of elements in this stack. - * @return {number} the number of elements in this stack. - */ - Stack.prototype.size = function () { - return this.list.size(); - }; - /** - * Returns true if this stack contains the specified element. - *

If the elements inside this stack are - * not comparable with the === operator, a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName (pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} elem element to search for. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function to check if two elements are equal. - * @return {boolean} true if this stack contains the specified element, - * false otherwise. - */ - Stack.prototype.contains = function (elem, equalsFunction) { - return this.list.contains(elem, equalsFunction); - }; - /** - * Checks if this stack is empty. - * @return {boolean} true if and only if this stack contains no items; false - * otherwise. - */ - Stack.prototype.isEmpty = function () { - return this.list.isEmpty(); - }; - /** - * Removes all of the elements from this stack. - */ - Stack.prototype.clear = function () { - this.list.clear(); - }; - /** - * Executes the provided function once for each element present in this stack in - * LIFO order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - Stack.prototype.forEach = function (callback) { - this.list.forEach(callback); - }; - return Stack; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Stack; // End of stack -//# sourceMappingURL=Stack.js.map \ No newline at end of file diff --git a/dist/lib/Stack.js.map b/dist/lib/Stack.js.map deleted file mode 100644 index 0fc6f22..0000000 --- a/dist/lib/Stack.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Stack.js","sourceRoot":"","sources":["../../src/lib/Stack.ts"],"names":[],"mappings":";AAAA,2BAAuB,cAAc,CAAC,CAAA;AAGtC;IAOI;;;;;;OAMG;IACH;QACI,IAAI,CAAC,IAAI,GAAG,IAAI,oBAAU,EAAK,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,oBAAI,GAAJ,UAAK,IAAO;QACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD;;;;OAIG;IACH,mBAAG,GAAH,UAAI,IAAO;QACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD;;;;OAIG;IACH,mBAAG,GAAH;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD;;;;;OAKG;IACH,oBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD;;;OAGG;IACH,oBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,wBAAQ,GAAR,UAAS,IAAO,EAAE,cAAwC;QACtD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACpD,CAAC;IACD;;;;OAIG;IACH,uBAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IACD;;OAEG;IACH,qBAAK,GAAL;QACI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,uBAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IACL,YAAC;AAAD,CAAC,AAzGD,IAyGC;AAzGD;uBAyGC,CAAA,CAAC,eAAe"} \ No newline at end of file diff --git a/dist/lib/arrays.d.ts b/dist/lib/arrays.d.ts deleted file mode 100644 index 5c402ee..0000000 --- a/dist/lib/arrays.d.ts +++ /dev/null @@ -1,88 +0,0 @@ -import * as util from './util'; -/** - * Returns the position of the first occurrence of the specified item - * within the specified array.4 - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the position of the first occurrence of the specified element - * within the specified array, or -1 if not found. - */ -export declare function indexOf(array: T[], item: T, equalsFunction?: util.IEqualsFunction): number; -/** - * Returns the position of the last occurrence of the specified element - * within the specified array. - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the position of the last occurrence of the specified element - * within the specified array or -1 if not found. - */ -export declare function lastIndexOf(array: T[], item: T, equalsFunction?: util.IEqualsFunction): number; -/** - * Returns true if the specified array contains the specified element. - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function to - * check equality between 2 elements. - * @return {boolean} true if the specified array contains the specified element. - */ -export declare function contains(array: T[], item: T, equalsFunction?: util.IEqualsFunction): boolean; -/** - * Removes the first ocurrence of the specified element from the specified array. - * @param {*} array the array in which to search element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function to - * check equality between 2 elements. - * @return {boolean} true if the array changed after this call. - */ -export declare function remove(array: T[], item: T, equalsFunction?: util.IEqualsFunction): boolean; -/** - * Returns the number of elements in the specified array equal - * to the specified object. - * @param {Array} array the array in which to determine the frequency of the element. - * @param {Object} item the element whose frequency is to be determined. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the number of elements in the specified array - * equal to the specified object. - */ -export declare function frequency(array: T[], item: T, equalsFunction?: util.IEqualsFunction): number; -/** - * Returns true if the two specified arrays are equal to one another. - * Two arrays are considered equal if both arrays contain the same number - * of elements, and all corresponding pairs of elements in the two - * arrays are equal and are in the same order. - * @param {Array} array1 one array to be tested for equality. - * @param {Array} array2 the other array to be tested for equality. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between elemements in the arrays. - * @return {boolean} true if the two arrays are equal - */ -export declare function equals(array1: T[], array2: T[], equalsFunction?: util.IEqualsFunction): boolean; -/** - * Returns shallow a copy of the specified array. - * @param {*} array the array to copy. - * @return {Array} a copy of the specified array - */ -export declare function copy(array: T[]): T[]; -/** - * Swaps the elements at the specified positions in the specified array. - * @param {Array} array The array in which to swap elements. - * @param {number} i the index of one element to be swapped. - * @param {number} j the index of the other element to be swapped. - * @return {boolean} true if the array is defined and the indexes are valid. - */ -export declare function swap(array: T[], i: number, j: number): boolean; -export declare function toString(array: T[]): string; -/** - * Executes the provided function once for each element present in this array - * starting from index 0 to length - 1. - * @param {Array} array The array in which to iterate. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ -export declare function forEach(array: T[], callback: util.ILoopFunction): void; diff --git a/dist/lib/arrays.js b/dist/lib/arrays.js deleted file mode 100644 index 09866ff..0000000 --- a/dist/lib/arrays.js +++ /dev/null @@ -1,168 +0,0 @@ -"use strict"; -var util = require('./util'); -/** - * Returns the position of the first occurrence of the specified item - * within the specified array.4 - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the position of the first occurrence of the specified element - * within the specified array, or -1 if not found. - */ -function indexOf(array, item, equalsFunction) { - var equals = equalsFunction || util.defaultEquals; - var length = array.length; - for (var i = 0; i < length; i++) { - if (equals(array[i], item)) { - return i; - } - } - return -1; -} -exports.indexOf = indexOf; -/** - * Returns the position of the last occurrence of the specified element - * within the specified array. - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the position of the last occurrence of the specified element - * within the specified array or -1 if not found. - */ -function lastIndexOf(array, item, equalsFunction) { - var equals = equalsFunction || util.defaultEquals; - var length = array.length; - for (var i = length - 1; i >= 0; i--) { - if (equals(array[i], item)) { - return i; - } - } - return -1; -} -exports.lastIndexOf = lastIndexOf; -/** - * Returns true if the specified array contains the specified element. - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function to - * check equality between 2 elements. - * @return {boolean} true if the specified array contains the specified element. - */ -function contains(array, item, equalsFunction) { - return indexOf(array, item, equalsFunction) >= 0; -} -exports.contains = contains; -/** - * Removes the first ocurrence of the specified element from the specified array. - * @param {*} array the array in which to search element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function to - * check equality between 2 elements. - * @return {boolean} true if the array changed after this call. - */ -function remove(array, item, equalsFunction) { - var index = indexOf(array, item, equalsFunction); - if (index < 0) { - return false; - } - array.splice(index, 1); - return true; -} -exports.remove = remove; -/** - * Returns the number of elements in the specified array equal - * to the specified object. - * @param {Array} array the array in which to determine the frequency of the element. - * @param {Object} item the element whose frequency is to be determined. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the number of elements in the specified array - * equal to the specified object. - */ -function frequency(array, item, equalsFunction) { - var equals = equalsFunction || util.defaultEquals; - var length = array.length; - var freq = 0; - for (var i = 0; i < length; i++) { - if (equals(array[i], item)) { - freq++; - } - } - return freq; -} -exports.frequency = frequency; -/** - * Returns true if the two specified arrays are equal to one another. - * Two arrays are considered equal if both arrays contain the same number - * of elements, and all corresponding pairs of elements in the two - * arrays are equal and are in the same order. - * @param {Array} array1 one array to be tested for equality. - * @param {Array} array2 the other array to be tested for equality. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between elemements in the arrays. - * @return {boolean} true if the two arrays are equal - */ -function equals(array1, array2, equalsFunction) { - var equals = equalsFunction || util.defaultEquals; - if (array1.length !== array2.length) { - return false; - } - var length = array1.length; - for (var i = 0; i < length; i++) { - if (!equals(array1[i], array2[i])) { - return false; - } - } - return true; -} -exports.equals = equals; -/** - * Returns shallow a copy of the specified array. - * @param {*} array the array to copy. - * @return {Array} a copy of the specified array - */ -function copy(array) { - return array.concat(); -} -exports.copy = copy; -/** - * Swaps the elements at the specified positions in the specified array. - * @param {Array} array The array in which to swap elements. - * @param {number} i the index of one element to be swapped. - * @param {number} j the index of the other element to be swapped. - * @return {boolean} true if the array is defined and the indexes are valid. - */ -function swap(array, i, j) { - if (i < 0 || i >= array.length || j < 0 || j >= array.length) { - return false; - } - var temp = array[i]; - array[i] = array[j]; - array[j] = temp; - return true; -} -exports.swap = swap; -function toString(array) { - return '[' + array.toString() + ']'; -} -exports.toString = toString; -/** - * Executes the provided function once for each element present in this array - * starting from index 0 to length - 1. - * @param {Array} array The array in which to iterate. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ -function forEach(array, callback) { - for (var _i = 0, array_1 = array; _i < array_1.length; _i++) { - var ele = array_1[_i]; - if (callback(ele) === false) { - return; - } - } -} -exports.forEach = forEach; -//# sourceMappingURL=arrays.js.map \ No newline at end of file diff --git a/dist/lib/arrays.js.map b/dist/lib/arrays.js.map deleted file mode 100644 index 6baed1e..0000000 --- a/dist/lib/arrays.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../../src/lib/arrays.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/index.d.ts b/dist/lib/index.d.ts deleted file mode 100644 index f9a7292..0000000 --- a/dist/lib/index.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as _arrays from './arrays'; -export declare var arrays: typeof _arrays; -export { default as Bag } from './Bag'; -export { default as BSTree } from './BSTree'; -export { default as Dictionary } from './Dictionary'; -export { default as Heap } from './Heap'; -export { default as LinkedDictionary } from './LinkedDictionary'; -export { default as LinkedList } from './LinkedList'; -export { default as MultiDictionary } from './MultiDictionary'; -export { default as FactoryDictionary } from './FactoryDictionary'; -export { default as DefaultDictionary } from './FactoryDictionary'; -export { default as Queue } from './Queue'; -export { default as PriorityQueue } from './PriorityQueue'; -export { default as Set } from './Set'; -export { default as Stack } from './Stack'; -export { default as MultiRootTree } from './MultiRootTree'; -import * as _util from './util'; -export declare var util: typeof _util; diff --git a/dist/lib/index.js b/dist/lib/index.js deleted file mode 100644 index cdcee04..0000000 --- a/dist/lib/index.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; -// Copyright 2013 Basarat Ali Syed. All Rights Reserved. -// -// Licensed under MIT open source license http://opensource.org/licenses/MIT -// -// Orginal javascript code was by Mauricio Santos -// -var _arrays = require('./arrays'); -exports.arrays = _arrays; -var Bag_1 = require('./Bag'); -exports.Bag = Bag_1.default; -var BSTree_1 = require('./BSTree'); -exports.BSTree = BSTree_1.default; -var Dictionary_1 = require('./Dictionary'); -exports.Dictionary = Dictionary_1.default; -var Heap_1 = require('./Heap'); -exports.Heap = Heap_1.default; -var LinkedDictionary_1 = require('./LinkedDictionary'); -exports.LinkedDictionary = LinkedDictionary_1.default; -var LinkedList_1 = require('./LinkedList'); -exports.LinkedList = LinkedList_1.default; -var MultiDictionary_1 = require('./MultiDictionary'); -exports.MultiDictionary = MultiDictionary_1.default; -var FactoryDictionary_1 = require('./FactoryDictionary'); -exports.FactoryDictionary = FactoryDictionary_1.default; -var FactoryDictionary_2 = require('./FactoryDictionary'); -exports.DefaultDictionary = FactoryDictionary_2.default; -var Queue_1 = require('./Queue'); -exports.Queue = Queue_1.default; -var PriorityQueue_1 = require('./PriorityQueue'); -exports.PriorityQueue = PriorityQueue_1.default; -var Set_1 = require('./Set'); -exports.Set = Set_1.default; -var Stack_1 = require('./Stack'); -exports.Stack = Stack_1.default; -var MultiRootTree_1 = require('./MultiRootTree'); -exports.MultiRootTree = MultiRootTree_1.default; -var _util = require('./util'); -exports.util = _util; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/lib/index.js.map b/dist/lib/index.js.map deleted file mode 100644 index f083d56..0000000 --- a/dist/lib/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":";AAAA,wDAAwD;AACxD,EAAE;AACF,4EAA4E;AAC5E,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,IAAY,OAAO,WAAM,UAAU,CAAC,CAAA;AACzB,cAAM,GAAG,OAAO,CAAC;AAC5B,oBAA6B,OAAO,CAAC;AAA7B,4BAA6B;AACrC,uBAAgC,UAAU,CAAC;AAAnC,kCAAmC;AAC3C,2BAAoC,cAAc,CAAC;AAA3C,0CAA2C;AACnD,qBAA8B,QAAQ,CAAC;AAA/B,8BAA+B;AACvC,iCAA0C,oBAAoB,CAAC;AAAvD,sDAAuD;AAC/D,2BAAoC,cAAc,CAAC;AAA3C,0CAA2C;AACnD,gCAAyC,mBAAmB,CAAC;AAArD,oDAAqD;AAC7D,kCAA2C,qBAAqB,CAAC;AAAzD,wDAAyD;AACjE,kCAA2C,qBAAqB,CAAC;AAAzD,wDAAyD;AACjE,sBAA+B,SAAS,CAAC;AAAjC,gCAAiC;AACzC,8BAAuC,iBAAiB,CAAC;AAAjD,gDAAiD;AACzD,oBAA6B,OAAO,CAAC;AAA7B,4BAA6B;AACrC,sBAA+B,SAAS,CAAC;AAAjC,gCAAiC;AACzC,8BAAuC,iBAAiB,CAAC;AAAjD,gDAAiD;AACzD,IAAY,KAAK,WAAM,QAAQ,CAAC,CAAA;AACrB,YAAI,GAAG,KAAK,CAAC"} \ No newline at end of file diff --git a/dist/lib/umd.js b/dist/lib/umd.js deleted file mode 100644 index 386521c..0000000 --- a/dist/lib/umd.js +++ /dev/null @@ -1,3040 +0,0 @@ -(function(f) { - if (typeof exports === "object" && typeof module !== "undefined") { - module.exports = f() - } else if (typeof define === "function" && define.amd) { - define([], f) - } else { - var g; - if (typeof window !== "undefined") { - g = window - } else if (typeof global !== "undefined") { - g = global - } else if (typeof self !== "undefined") { - g = self - } else { - g = this - } - g.listComponent = f() - } -})(function() { - var define, module, exports; -require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oA binary search tree is a binary tree in which each - * internal node stores an element such that the elements stored in the - * left subtree are less than it and the elements - * stored in the right subtree are greater.

- *

Formally, a binary search tree is a node-based binary tree data structure which - * has the following properties:

- *
    - *
  • The left subtree of a node contains only nodes with elements less - * than the node's element
  • - *
  • The right subtree of a node contains only nodes with elements greater - * than the node's element
  • - *
  • Both the left and right subtrees must also be binary search trees.
  • - *
- *

If the inserted elements are custom objects a compare function must - * be provided at construction time, otherwise the <=, === and >= operators are - * used to compare elements. Example:

- *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two elements. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - function BSTree(compareFunction) { - this.root = null; - this.compare = compareFunction || util.defaultCompare; - this.nElements = 0; - } - /** - * Adds the specified element to this tree if it is not already present. - * @param {Object} element the element to insert. - * @return {boolean} true if this tree did not already contain the specified element. - */ - BSTree.prototype.add = function (element) { - if (util.isUndefined(element)) { - return false; - } - if (this.insertNode(this.createNode(element)) !== null) { - this.nElements++; - return true; - } - return false; - }; - /** - * Removes all of the elements from this tree. - */ - BSTree.prototype.clear = function () { - this.root = null; - this.nElements = 0; - }; - /** - * Returns true if this tree contains no elements. - * @return {boolean} true if this tree contains no elements. - */ - BSTree.prototype.isEmpty = function () { - return this.nElements === 0; - }; - /** - * Returns the number of elements in this tree. - * @return {number} the number of elements in this tree. - */ - BSTree.prototype.size = function () { - return this.nElements; - }; - /** - * Returns true if this tree contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this tree contains the specified element, - * false otherwise. - */ - BSTree.prototype.contains = function (element) { - if (util.isUndefined(element)) { - return false; - } - return this.searchNode(this.root, element) !== null; - }; - /** - * Removes the specified element from this tree if it is present. - * @return {boolean} true if this tree contained the specified element. - */ - BSTree.prototype.remove = function (element) { - var node = this.searchNode(this.root, element); - if (node === null) { - return false; - } - this.removeNode(node); - this.nElements--; - return true; - }; - /** - * Executes the provided function once for each element present in this tree in - * in-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - BSTree.prototype.inorderTraversal = function (callback) { - this.inorderTraversalAux(this.root, callback, { - stop: false - }); - }; - /** - * Executes the provided function once for each element present in this tree in pre-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - BSTree.prototype.preorderTraversal = function (callback) { - this.preorderTraversalAux(this.root, callback, { - stop: false - }); - }; - /** - * Executes the provided function once for each element present in this tree in post-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - BSTree.prototype.postorderTraversal = function (callback) { - this.postorderTraversalAux(this.root, callback, { - stop: false - }); - }; - /** - * Executes the provided function once for each element present in this tree in - * level-order. - * @param {function(Object):*} callback function to execute, it is invoked with one - * argument: the element value, to break the iteration you can optionally return false. - */ - BSTree.prototype.levelTraversal = function (callback) { - this.levelTraversalAux(this.root, callback); - }; - /** - * Returns the minimum element of this tree. - * @return {*} the minimum element of this tree or undefined if this tree is - * is empty. - */ - BSTree.prototype.minimum = function () { - if (this.isEmpty()) { - return undefined; - } - return this.minimumAux(this.root).element; - }; - /** - * Returns the maximum element of this tree. - * @return {*} the maximum element of this tree or undefined if this tree is - * is empty. - */ - BSTree.prototype.maximum = function () { - if (this.isEmpty()) { - return undefined; - } - return this.maximumAux(this.root).element; - }; - /** - * Executes the provided function once for each element present in this tree in inorder. - * Equivalent to inorderTraversal. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - BSTree.prototype.forEach = function (callback) { - this.inorderTraversal(callback); - }; - /** - * Returns an array containing all of the elements in this tree in in-order. - * @return {Array} an array containing all of the elements in this tree in in-order. - */ - BSTree.prototype.toArray = function () { - var array = []; - this.inorderTraversal(function (element) { - array.push(element); - return true; - }); - return array; - }; - /** - * Returns the height of this tree. - * @return {number} the height of this tree or -1 if is empty. - */ - BSTree.prototype.height = function () { - return this.heightAux(this.root); - }; - /** - * @private - */ - BSTree.prototype.searchNode = function (node, element) { - var cmp = null; - while (node !== null && cmp !== 0) { - cmp = this.compare(element, node.element); - if (cmp < 0) { - node = node.leftCh; - } - else if (cmp > 0) { - node = node.rightCh; - } - } - return node; - }; - /** - * @private - */ - BSTree.prototype.transplant = function (n1, n2) { - if (n1.parent === null) { - this.root = n2; - } - else if (n1 === n1.parent.leftCh) { - n1.parent.leftCh = n2; - } - else { - n1.parent.rightCh = n2; - } - if (n2 !== null) { - n2.parent = n1.parent; - } - }; - /** - * @private - */ - BSTree.prototype.removeNode = function (node) { - if (node.leftCh === null) { - this.transplant(node, node.rightCh); - } - else if (node.rightCh === null) { - this.transplant(node, node.leftCh); - } - else { - var y = this.minimumAux(node.rightCh); - if (y.parent !== node) { - this.transplant(y, y.rightCh); - y.rightCh = node.rightCh; - y.rightCh.parent = y; - } - this.transplant(node, y); - y.leftCh = node.leftCh; - y.leftCh.parent = y; - } - }; - /** - * @private - */ - BSTree.prototype.inorderTraversalAux = function (node, callback, signal) { - if (node === null || signal.stop) { - return; - } - this.inorderTraversalAux(node.leftCh, callback, signal); - if (signal.stop) { - return; - } - signal.stop = callback(node.element) === false; - if (signal.stop) { - return; - } - this.inorderTraversalAux(node.rightCh, callback, signal); - }; - /** - * @private - */ - BSTree.prototype.levelTraversalAux = function (node, callback) { - var queue = new Queue_1.default(); - if (node !== null) { - queue.enqueue(node); - } - while (!queue.isEmpty()) { - node = queue.dequeue(); - if (callback(node.element) === false) { - return; - } - if (node.leftCh !== null) { - queue.enqueue(node.leftCh); - } - if (node.rightCh !== null) { - queue.enqueue(node.rightCh); - } - } - }; - /** - * @private - */ - BSTree.prototype.preorderTraversalAux = function (node, callback, signal) { - if (node === null || signal.stop) { - return; - } - signal.stop = callback(node.element) === false; - if (signal.stop) { - return; - } - this.preorderTraversalAux(node.leftCh, callback, signal); - if (signal.stop) { - return; - } - this.preorderTraversalAux(node.rightCh, callback, signal); - }; - /** - * @private - */ - BSTree.prototype.postorderTraversalAux = function (node, callback, signal) { - if (node === null || signal.stop) { - return; - } - this.postorderTraversalAux(node.leftCh, callback, signal); - if (signal.stop) { - return; - } - this.postorderTraversalAux(node.rightCh, callback, signal); - if (signal.stop) { - return; - } - signal.stop = callback(node.element) === false; - }; - /** - * @private - */ - BSTree.prototype.minimumAux = function (node) { - while (node.leftCh !== null) { - node = node.leftCh; - } - return node; - }; - /** - * @private - */ - BSTree.prototype.maximumAux = function (node) { - while (node.rightCh !== null) { - node = node.rightCh; - } - return node; - }; - /** - * @private - */ - BSTree.prototype.heightAux = function (node) { - if (node === null) { - return -1; - } - return Math.max(this.heightAux(node.leftCh), this.heightAux(node.rightCh)) + 1; - }; - /* - * @private - */ - BSTree.prototype.insertNode = function (node) { - var parent = null; - var position = this.root; - var cmp = null; - while (position !== null) { - cmp = this.compare(node.element, position.element); - if (cmp === 0) { - return null; - } - else if (cmp < 0) { - parent = position; - position = position.leftCh; - } - else { - parent = position; - position = position.rightCh; - } - } - node.parent = parent; - if (parent === null) { - // tree is empty - this.root = node; - } - else if (this.compare(node.element, parent.element) < 0) { - parent.leftCh = node; - } - else { - parent.rightCh = node; - } - return node; - }; - /** - * @private - */ - BSTree.prototype.createNode = function (element) { - return { - element: element, - leftCh: null, - rightCh: null, - parent: null - }; - }; - return BSTree; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = BSTree; - -},{"./Queue":11,"./util":15}],2:[function(require,module,exports){ -"use strict"; -var util = require('./util'); -var Dictionary_1 = require('./Dictionary'); -var Set_1 = require('./Set'); -var Bag = (function () { - /** - * Creates an empty bag. - * @class

A bag is a special kind of set in which members are - * allowed to appear more than once.

- *

If the inserted elements are custom objects a function - * which converts elements to unique strings must be provided. Example:

- * - *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * - * @constructor - * @param {function(Object):string=} toStrFunction optional function used - * to convert elements to strings. If the elements aren't strings or if toString() - * is not appropriate, a custom function which receives an object and returns a - * unique string must be provided. - */ - function Bag(toStrFunction) { - this.toStrF = toStrFunction || util.defaultToString; - this.dictionary = new Dictionary_1.default(this.toStrF); - this.nElements = 0; - } - /** - * Adds nCopies of the specified object to this bag. - * @param {Object} element element to add. - * @param {number=} nCopies the number of copies to add, if this argument is - * undefined 1 copy is added. - * @return {boolean} true unless element is undefined. - */ - Bag.prototype.add = function (element, nCopies) { - if (nCopies === void 0) { nCopies = 1; } - if (util.isUndefined(element) || nCopies <= 0) { - return false; - } - if (!this.contains(element)) { - var node = { - value: element, - copies: nCopies - }; - this.dictionary.setValue(element, node); - } - else { - this.dictionary.getValue(element).copies += nCopies; - } - this.nElements += nCopies; - return true; - }; - /** - * Counts the number of copies of the specified object in this bag. - * @param {Object} element the object to search for.. - * @return {number} the number of copies of the object, 0 if not found - */ - Bag.prototype.count = function (element) { - if (!this.contains(element)) { - return 0; - } - else { - return this.dictionary.getValue(element).copies; - } - }; - /** - * Returns true if this bag contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this bag contains the specified element, - * false otherwise. - */ - Bag.prototype.contains = function (element) { - return this.dictionary.containsKey(element); - }; - /** - * Removes nCopies of the specified object to this bag. - * If the number of copies to remove is greater than the actual number - * of copies in the Bag, all copies are removed. - * @param {Object} element element to remove. - * @param {number=} nCopies the number of copies to remove, if this argument is - * undefined 1 copy is removed. - * @return {boolean} true if at least 1 element was removed. - */ - Bag.prototype.remove = function (element, nCopies) { - if (nCopies === void 0) { nCopies = 1; } - if (util.isUndefined(element) || nCopies <= 0) { - return false; - } - if (!this.contains(element)) { - return false; - } - else { - var node = this.dictionary.getValue(element); - if (nCopies > node.copies) { - this.nElements -= node.copies; - } - else { - this.nElements -= nCopies; - } - node.copies -= nCopies; - if (node.copies <= 0) { - this.dictionary.remove(element); - } - return true; - } - }; - /** - * Returns an array containing all of the elements in this big in arbitrary order, - * including multiple copies. - * @return {Array} an array containing all of the elements in this bag. - */ - Bag.prototype.toArray = function () { - var a = []; - var values = this.dictionary.values(); - for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { - var node = values_1[_i]; - var element = node.value; - var copies = node.copies; - for (var j = 0; j < copies; j++) { - a.push(element); - } - } - return a; - }; - /** - * Returns a set of unique elements in this bag. - * @return {collections.Set} a set of unique elements in this bag. - */ - Bag.prototype.toSet = function () { - var toret = new Set_1.default(this.toStrF); - var elements = this.dictionary.values(); - for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) { - var ele = elements_1[_i]; - var value = ele.value; - toret.add(value); - } - return toret; - }; - /** - * Executes the provided function once for each element - * present in this bag, including multiple copies. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element. To break the iteration you can - * optionally return false. - */ - Bag.prototype.forEach = function (callback) { - this.dictionary.forEach(function (k, v) { - var value = v.value; - var copies = v.copies; - for (var i = 0; i < copies; i++) { - if (callback(value) === false) { - return false; - } - } - return true; - }); - }; - /** - * Returns the number of elements in this bag. - * @return {number} the number of elements in this bag. - */ - Bag.prototype.size = function () { - return this.nElements; - }; - /** - * Returns true if this bag contains no elements. - * @return {boolean} true if this bag contains no elements. - */ - Bag.prototype.isEmpty = function () { - return this.nElements === 0; - }; - /** - * Removes all of the elements from this bag. - */ - Bag.prototype.clear = function () { - this.nElements = 0; - this.dictionary.clear(); - }; - return Bag; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Bag; // End of bag - -},{"./Dictionary":3,"./Set":12,"./util":15}],3:[function(require,module,exports){ -"use strict"; -var util = require('./util'); -var Dictionary = (function () { - /** - * Creates an empty dictionary. - * @class

Dictionaries map keys to values; each key can map to at most one value. - * This implementation accepts any kind of objects as keys.

- * - *

If the keys are custom objects a function which converts keys to unique - * strings must be provided. Example:

- *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * @constructor - * @param {function(Object):string=} toStrFunction optional function used - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - */ - function Dictionary(toStrFunction) { - this.table = {}; - this.nElements = 0; - this.toStr = toStrFunction || util.defaultToString; - } - /** - * Returns the value to which this dictionary maps the specified key. - * Returns undefined if this dictionary contains no mapping for this key. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * undefined if the map contains no mapping for this key. - */ - Dictionary.prototype.getValue = function (key) { - var pair = this.table['$' + this.toStr(key)]; - if (util.isUndefined(pair)) { - return undefined; - } - return pair.value; - }; - /** - * Associates the specified value with the specified key in this dictionary. - * If the dictionary previously contained a mapping for this key, the old - * value is replaced by the specified value. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or undefined if - * there was no mapping for the key or if the key/value are undefined. - */ - Dictionary.prototype.setValue = function (key, value) { - if (util.isUndefined(key) || util.isUndefined(value)) { - return undefined; - } - var ret; - var k = '$' + this.toStr(key); - var previousElement = this.table[k]; - if (util.isUndefined(previousElement)) { - this.nElements++; - ret = undefined; - } - else { - ret = previousElement.value; - } - this.table[k] = { - key: key, - value: value - }; - return ret; - }; - /** - * Removes the mapping for this key from this dictionary if it is present. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @return {*} previous value associated with specified key, or undefined if - * there was no mapping for key. - */ - Dictionary.prototype.remove = function (key) { - var k = '$' + this.toStr(key); - var previousElement = this.table[k]; - if (!util.isUndefined(previousElement)) { - delete this.table[k]; - this.nElements--; - return previousElement.value; - } - return undefined; - }; - /** - * Returns an array containing all of the keys in this dictionary. - * @return {Array} an array containing all of the keys in this dictionary. - */ - Dictionary.prototype.keys = function () { - var array = []; - for (var name_1 in this.table) { - if (util.has(this.table, name_1)) { - var pair = this.table[name_1]; - array.push(pair.key); - } - } - return array; - }; - /** - * Returns an array containing all of the values in this dictionary. - * @return {Array} an array containing all of the values in this dictionary. - */ - Dictionary.prototype.values = function () { - var array = []; - for (var name_2 in this.table) { - if (util.has(this.table, name_2)) { - var pair = this.table[name_2]; - array.push(pair.value); - } - } - return array; - }; - /** - * Executes the provided function once for each key-value pair - * present in this dictionary. - * @param {function(Object,Object):*} callback function to execute, it is - * invoked with two arguments: key and value. To break the iteration you can - * optionally return false. - */ - Dictionary.prototype.forEach = function (callback) { - for (var name_3 in this.table) { - if (util.has(this.table, name_3)) { - var pair = this.table[name_3]; - var ret = callback(pair.key, pair.value); - if (ret === false) { - return; - } - } - } - }; - /** - * Returns true if this dictionary contains a mapping for the specified key. - * @param {Object} key key whose presence in this dictionary is to be - * tested. - * @return {boolean} true if this dictionary contains a mapping for the - * specified key. - */ - Dictionary.prototype.containsKey = function (key) { - return !util.isUndefined(this.getValue(key)); - }; - /** - * Removes all mappings from this dictionary. - * @this {collections.Dictionary} - */ - Dictionary.prototype.clear = function () { - this.table = {}; - this.nElements = 0; - }; - /** - * Returns the number of keys in this dictionary. - * @return {number} the number of key-value mappings in this dictionary. - */ - Dictionary.prototype.size = function () { - return this.nElements; - }; - /** - * Returns true if this dictionary contains no mappings. - * @return {boolean} true if this dictionary contains no mappings. - */ - Dictionary.prototype.isEmpty = function () { - return this.nElements <= 0; - }; - Dictionary.prototype.toString = function () { - var toret = '{'; - this.forEach(function (k, v) { - toret += "\n\t" + k + " : " + v; - }); - return toret + '\n}'; - }; - return Dictionary; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Dictionary; // End of dictionary - -},{"./util":15}],4:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Dictionary_1 = require('./Dictionary'); -var util = require('./util'); -var FactoryDictionary = (function (_super) { - __extends(FactoryDictionary, _super); - /** - * Creates an empty dictionary. - * @class

Dictionaries map keys to values; each key can map to at most one value. - * This implementation accepts any kind of objects as keys.

- * - *

The default factory function should return a new object of the provided - * type. Example:

- *
-     * function petFactory() {
-     *  return new Pet();
-     * }
-     * 
- * - *

If the keys are custom objects a function which converts keys to unique - * strings must be provided. Example:

- *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * @constructor - * @param {function():V=} defaultFactoryFunction function used to create a - * default object. - * @param {function(Object):string=} toStrFunction optional function used - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - */ - function FactoryDictionary(defaultFactoryFunction, toStrFunction) { - _super.call(this, toStrFunction); - this.defaultFactoryFunction = defaultFactoryFunction; - } - /** - * Associates the specified default value with the specified key in this dictionary, - * if it didn't contain the key yet. If the key existed, the existing value will be used. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} defaultValue default value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or the default value, - * if the key didn't exist yet. - */ - FactoryDictionary.prototype.setDefault = function (key, defaultValue) { - var currentValue = _super.prototype.getValue.call(this, key); - if (util.isUndefined(currentValue)) { - this.setValue(key, defaultValue); - return defaultValue; - } - return currentValue; - }; - /** - * Returns the value to which this dictionary maps the specified key. - * Returns a default value created by the factory passed in the constructor, - * if this dictionary contains no mapping for this key. The missing key will - * automatically be added to the dictionary. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * a default value if the map contains no mapping for this key. - */ - FactoryDictionary.prototype.getValue = function (key) { - return this.setDefault(key, this.defaultFactoryFunction()); - }; - return FactoryDictionary; -}(Dictionary_1.default)); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = FactoryDictionary; - -},{"./Dictionary":3,"./util":15}],5:[function(require,module,exports){ -"use strict"; -var collections = require('./util'); -var arrays = require('./arrays'); -var Heap = (function () { - /** - * Creates an empty Heap. - * @class - *

A heap is a binary tree, where the nodes maintain the heap property: - * each node is smaller than each of its children and therefore a MinHeap - * This implementation uses an array to store elements.

- *

If the inserted elements are custom objects a compare function must be provided, - * at construction time, otherwise the <=, === and >= operators are - * used to compare elements. Example:

- * - *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * - *

If a Max-Heap is wanted (greater elements on top) you can a provide a - * reverse compare function to accomplish that behavior. Example:

- * - *
-     * function reverseCompare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return 1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return -1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * - * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two elements. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - function Heap(compareFunction) { - /** - * Array used to store the elements od the heap. - * @type {Array.} - * @private - */ - this.data = []; - this.compare = compareFunction || collections.defaultCompare; - } - /** - * Returns the index of the left child of the node at the given index. - * @param {number} nodeIndex The index of the node to get the left child - * for. - * @return {number} The index of the left child. - * @private - */ - Heap.prototype.leftChildIndex = function (nodeIndex) { - return (2 * nodeIndex) + 1; - }; - /** - * Returns the index of the right child of the node at the given index. - * @param {number} nodeIndex The index of the node to get the right child - * for. - * @return {number} The index of the right child. - * @private - */ - Heap.prototype.rightChildIndex = function (nodeIndex) { - return (2 * nodeIndex) + 2; - }; - /** - * Returns the index of the parent of the node at the given index. - * @param {number} nodeIndex The index of the node to get the parent for. - * @return {number} The index of the parent. - * @private - */ - Heap.prototype.parentIndex = function (nodeIndex) { - return Math.floor((nodeIndex - 1) / 2); - }; - /** - * Returns the index of the smaller child node (if it exists). - * @param {number} leftChild left child index. - * @param {number} rightChild right child index. - * @return {number} the index with the minimum value or -1 if it doesn't - * exists. - * @private - */ - Heap.prototype.minIndex = function (leftChild, rightChild) { - if (rightChild >= this.data.length) { - if (leftChild >= this.data.length) { - return -1; - } - else { - return leftChild; - } - } - else { - if (this.compare(this.data[leftChild], this.data[rightChild]) <= 0) { - return leftChild; - } - else { - return rightChild; - } - } - }; - /** - * Moves the node at the given index up to its proper place in the heap. - * @param {number} index The index of the node to move up. - * @private - */ - Heap.prototype.siftUp = function (index) { - var parent = this.parentIndex(index); - while (index > 0 && this.compare(this.data[parent], this.data[index]) > 0) { - arrays.swap(this.data, parent, index); - index = parent; - parent = this.parentIndex(index); - } - }; - /** - * Moves the node at the given index down to its proper place in the heap. - * @param {number} nodeIndex The index of the node to move down. - * @private - */ - Heap.prototype.siftDown = function (nodeIndex) { - //smaller child index - var min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex)); - while (min >= 0 && this.compare(this.data[nodeIndex], this.data[min]) > 0) { - arrays.swap(this.data, min, nodeIndex); - nodeIndex = min; - min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex)); - } - }; - /** - * Retrieves but does not remove the root element of this heap. - * @return {*} The value at the root of the heap. Returns undefined if the - * heap is empty. - */ - Heap.prototype.peek = function () { - if (this.data.length > 0) { - return this.data[0]; - } - else { - return undefined; - } - }; - /** - * Adds the given element into the heap. - * @param {*} element the element. - * @return true if the element was added or fals if it is undefined. - */ - Heap.prototype.add = function (element) { - if (collections.isUndefined(element)) { - return undefined; - } - this.data.push(element); - this.siftUp(this.data.length - 1); - return true; - }; - /** - * Retrieves and removes the root element of this heap. - * @return {*} The value removed from the root of the heap. Returns - * undefined if the heap is empty. - */ - Heap.prototype.removeRoot = function () { - if (this.data.length > 0) { - var obj = this.data[0]; - this.data[0] = this.data[this.data.length - 1]; - this.data.splice(this.data.length - 1, 1); - if (this.data.length > 0) { - this.siftDown(0); - } - return obj; - } - return undefined; - }; - /** - * Returns true if this heap contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this Heap contains the specified element, false - * otherwise. - */ - Heap.prototype.contains = function (element) { - var equF = collections.compareToEquals(this.compare); - return arrays.contains(this.data, element, equF); - }; - /** - * Returns the number of elements in this heap. - * @return {number} the number of elements in this heap. - */ - Heap.prototype.size = function () { - return this.data.length; - }; - /** - * Checks if this heap is empty. - * @return {boolean} true if and only if this heap contains no items; false - * otherwise. - */ - Heap.prototype.isEmpty = function () { - return this.data.length <= 0; - }; - /** - * Removes all of the elements from this heap. - */ - Heap.prototype.clear = function () { - this.data.length = 0; - }; - /** - * Executes the provided function once for each element present in this heap in - * no particular order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - Heap.prototype.forEach = function (callback) { - arrays.forEach(this.data, callback); - }; - return Heap; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Heap; - -},{"./arrays":14,"./util":15}],6:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Dictionary_1 = require('./Dictionary'); -var util = require('./util'); -/** - * This class is used by the LinkedDictionary Internally - * Has to be a class, not an interface, because it needs to have - * the 'unlink' function defined. - */ -var LinkedDictionaryPair = (function () { - function LinkedDictionaryPair(key, value) { - this.key = key; - this.value = value; - } - LinkedDictionaryPair.prototype.unlink = function () { - this.prev.next = this.next; - this.next.prev = this.prev; - }; - return LinkedDictionaryPair; -}()); -var LinkedDictionary = (function (_super) { - __extends(LinkedDictionary, _super); - function LinkedDictionary(toStrFunction) { - _super.call(this, toStrFunction); - this.head = new LinkedDictionaryPair(null, null); - this.tail = new LinkedDictionaryPair(null, null); - this.head.next = this.tail; - this.tail.prev = this.head; - } - /** - * Inserts the new node to the 'tail' of the list, updating the - * neighbors, and moving 'this.tail' (the End of List indicator) that - * to the end. - */ - LinkedDictionary.prototype.appendToTail = function (entry) { - var lastNode = this.tail.prev; - lastNode.next = entry; - entry.prev = lastNode; - entry.next = this.tail; - this.tail.prev = entry; - }; - /** - * Retrieves a linked dictionary from the table internally - */ - LinkedDictionary.prototype.getLinkedDictionaryPair = function (key) { - if (util.isUndefined(key)) { - return undefined; - } - var k = '$' + this.toStr(key); - var pair = (this.table[k]); - return pair; - }; - /** - * Returns the value to which this dictionary maps the specified key. - * Returns undefined if this dictionary contains no mapping for this key. - * @param {Object} key key whose associated value is to be returned. - * @return {*} the value to which this dictionary maps the specified key or - * undefined if the map contains no mapping for this key. - */ - LinkedDictionary.prototype.getValue = function (key) { - var pair = this.getLinkedDictionaryPair(key); - if (!util.isUndefined(pair)) { - return pair.value; - } - return undefined; - }; - /** - * Removes the mapping for this key from this dictionary if it is present. - * Also, if a value is present for this key, the entry is removed from the - * insertion ordering. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @return {*} previous value associated with specified key, or undefined if - * there was no mapping for key. - */ - LinkedDictionary.prototype.remove = function (key) { - var pair = this.getLinkedDictionaryPair(key); - if (!util.isUndefined(pair)) { - _super.prototype.remove.call(this, key); // This will remove it from the table - pair.unlink(); // This will unlink it from the chain - return pair.value; - } - return undefined; - }; - /** - * Removes all mappings from this LinkedDictionary. - * @this {collections.LinkedDictionary} - */ - LinkedDictionary.prototype.clear = function () { - _super.prototype.clear.call(this); - this.head.next = this.tail; - this.tail.prev = this.head; - }; - /** - * Internal function used when updating an existing KeyValue pair. - * It places the new value indexed by key into the table, but maintains - * its place in the linked ordering. - */ - LinkedDictionary.prototype.replace = function (oldPair, newPair) { - var k = '$' + this.toStr(newPair.key); - // set the new Pair's links to existingPair's links - newPair.next = oldPair.next; - newPair.prev = oldPair.prev; - // Delete Existing Pair from the table, unlink it from chain. - // As a result, the nElements gets decremented by this operation - this.remove(oldPair.key); - // Link new Pair in place of where oldPair was, - // by pointing the old pair's neighbors to it. - newPair.prev.next = newPair; - newPair.next.prev = newPair; - this.table[k] = newPair; - // To make up for the fact that the number of elements was decremented, - // We need to increase it by one. - ++this.nElements; - }; - /** - * Associates the specified value with the specified key in this dictionary. - * If the dictionary previously contained a mapping for this key, the old - * value is replaced by the specified value. - * Updating of a key that already exists maintains its place in the - * insertion order into the map. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value value to be associated with the specified key. - * @return {*} previous value associated with the specified key, or undefined if - * there was no mapping for the key or if the key/value are undefined. - */ - LinkedDictionary.prototype.setValue = function (key, value) { - if (util.isUndefined(key) || util.isUndefined(value)) { - return undefined; - } - var existingPair = this.getLinkedDictionaryPair(key); - var newPair = new LinkedDictionaryPair(key, value); - var k = '$' + this.toStr(key); - // If there is already an element for that key, we - // keep it's place in the LinkedList - if (!util.isUndefined(existingPair)) { - this.replace(existingPair, newPair); - return existingPair.value; - } - else { - this.appendToTail(newPair); - this.table[k] = newPair; - ++this.nElements; - return undefined; - } - }; - /** - * Returns an array containing all of the keys in this LinkedDictionary, ordered - * by insertion order. - * @return {Array} an array containing all of the keys in this LinkedDictionary, - * ordered by insertion order. - */ - LinkedDictionary.prototype.keys = function () { - var array = []; - this.forEach(function (key, value) { - array.push(key); - }); - return array; - }; - /** - * Returns an array containing all of the values in this LinkedDictionary, ordered by - * insertion order. - * @return {Array} an array containing all of the values in this LinkedDictionary, - * ordered by insertion order. - */ - LinkedDictionary.prototype.values = function () { - var array = []; - this.forEach(function (key, value) { - array.push(value); - }); - return array; - }; - /** - * Executes the provided function once for each key-value pair - * present in this LinkedDictionary. It is done in the order of insertion - * into the LinkedDictionary - * @param {function(Object,Object):*} callback function to execute, it is - * invoked with two arguments: key and value. To break the iteration you can - * optionally return false. - */ - LinkedDictionary.prototype.forEach = function (callback) { - var crawlNode = this.head.next; - while (crawlNode.next != null) { - var ret = callback(crawlNode.key, crawlNode.value); - if (ret === false) { - return; - } - crawlNode = crawlNode.next; - } - }; - return LinkedDictionary; -}(Dictionary_1.default)); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = LinkedDictionary; // End of LinkedDictionary -// /** -// * Returns true if this dictionary is equal to the given dictionary. -// * Two dictionaries are equal if they contain the same mappings. -// * @param {collections.Dictionary} other the other dictionary. -// * @param {function(Object,Object):boolean=} valuesEqualFunction optional -// * function used to check if two values are equal. -// * @return {boolean} true if this dictionary is equal to the given dictionary. -// */ -// collections.Dictionary.prototype.equals = function(other,valuesEqualFunction) { -// const eqF = valuesEqualFunction || collections.defaultEquals; -// if(!(other instanceof collections.Dictionary)){ -// return false; -// } -// if(this.size() !== other.size()){ -// return false; -// } -// return this.equalsAux(this.firstNode,other.firstNode,eqF); -// } - -},{"./Dictionary":3,"./util":15}],7:[function(require,module,exports){ -"use strict"; -var util = require('./util'); -var arrays = require('./arrays'); -var LinkedList = (function () { - /** - * Creates an empty Linked List. - * @class A linked list is a data structure consisting of a group of nodes - * which together represent a sequence. - * @constructor - */ - function LinkedList() { - /** - * First node in the list - * @type {Object} - * @private - */ - this.firstNode = null; - /** - * Last node in the list - * @type {Object} - * @private - */ - this.lastNode = null; - /** - * Number of elements in the list - * @type {number} - * @private - */ - this.nElements = 0; - } - /** - * Adds an element to this list. - * @param {Object} item element to be added. - * @param {number=} index optional index to add the element. If no index is specified - * the element is added to the end of this list. - * @return {boolean} true if the element was added or false if the index is invalid - * or if the element is undefined. - */ - LinkedList.prototype.add = function (item, index) { - if (util.isUndefined(index)) { - index = this.nElements; - } - if (index < 0 || index > this.nElements || util.isUndefined(item)) { - return false; - } - var newNode = this.createNode(item); - if (this.nElements === 0) { - // First node in the list. - this.firstNode = newNode; - this.lastNode = newNode; - } - else if (index === this.nElements) { - // Insert at the end. - this.lastNode.next = newNode; - this.lastNode = newNode; - } - else if (index === 0) { - // Change first node. - newNode.next = this.firstNode; - this.firstNode = newNode; - } - else { - var prev = this.nodeAtIndex(index - 1); - newNode.next = prev.next; - prev.next = newNode; - } - this.nElements++; - return true; - }; - /** - * Returns the first element in this list. - * @return {*} the first element of the list or undefined if the list is - * empty. - */ - LinkedList.prototype.first = function () { - if (this.firstNode !== null) { - return this.firstNode.element; - } - return undefined; - }; - /** - * Returns the last element in this list. - * @return {*} the last element in the list or undefined if the list is - * empty. - */ - LinkedList.prototype.last = function () { - if (this.lastNode !== null) { - return this.lastNode.element; - } - return undefined; - }; - /** - * Returns the element at the specified position in this list. - * @param {number} index desired index. - * @return {*} the element at the given index or undefined if the index is - * out of bounds. - */ - LinkedList.prototype.elementAtIndex = function (index) { - var node = this.nodeAtIndex(index); - if (node === null) { - return undefined; - } - return node.element; - }; - /** - * Returns the index in this list of the first occurrence of the - * specified element, or -1 if the List does not contain this element. - *

If the elements inside this list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName = function(pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} item element to search for. - * @param {function(Object,Object):boolean=} equalsFunction Optional - * function used to check if two elements are equal. - * @return {number} the index in this list of the first occurrence - * of the specified element, or -1 if this list does not contain the - * element. - */ - LinkedList.prototype.indexOf = function (item, equalsFunction) { - var equalsF = equalsFunction || util.defaultEquals; - if (util.isUndefined(item)) { - return -1; - } - var currentNode = this.firstNode; - var index = 0; - while (currentNode !== null) { - if (equalsF(currentNode.element, item)) { - return index; - } - index++; - currentNode = currentNode.next; - } - return -1; - }; - /** - * Returns true if this list contains the specified element. - *

If the elements inside the list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-       * const petsAreEqualByName = function(pet1, pet2) {
-       *  return pet1.name === pet2.name;
-       * }
-       * 
- * @param {Object} item element to search for. - * @param {function(Object,Object):boolean=} equalsFunction Optional - * function used to check if two elements are equal. - * @return {boolean} true if this list contains the specified element, false - * otherwise. - */ - LinkedList.prototype.contains = function (item, equalsFunction) { - return (this.indexOf(item, equalsFunction) >= 0); - }; - /** - * Removes the first occurrence of the specified element in this list. - *

If the elements inside the list are - * not comparable with the === operator a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName = function(pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} item element to be removed from this list, if present. - * @return {boolean} true if the list contained the specified element. - */ - LinkedList.prototype.remove = function (item, equalsFunction) { - var equalsF = equalsFunction || util.defaultEquals; - if (this.nElements < 1 || util.isUndefined(item)) { - return false; - } - var previous = null; - var currentNode = this.firstNode; - while (currentNode !== null) { - if (equalsF(currentNode.element, item)) { - if (currentNode === this.firstNode) { - this.firstNode = this.firstNode.next; - if (currentNode === this.lastNode) { - this.lastNode = null; - } - } - else if (currentNode === this.lastNode) { - this.lastNode = previous; - previous.next = currentNode.next; - currentNode.next = null; - } - else { - previous.next = currentNode.next; - currentNode.next = null; - } - this.nElements--; - return true; - } - previous = currentNode; - currentNode = currentNode.next; - } - return false; - }; - /** - * Removes all of the elements from this list. - */ - LinkedList.prototype.clear = function () { - this.firstNode = null; - this.lastNode = null; - this.nElements = 0; - }; - /** - * Returns true if this list is equal to the given list. - * Two lists are equal if they have the same elements in the same order. - * @param {LinkedList} other the other list. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function used to check if two elements are equal. If the elements in the lists - * are custom objects you should provide a function, otherwise - * the === operator is used to check equality between elements. - * @return {boolean} true if this list is equal to the given list. - */ - LinkedList.prototype.equals = function (other, equalsFunction) { - var eqF = equalsFunction || util.defaultEquals; - if (!(other instanceof LinkedList)) { - return false; - } - if (this.size() !== other.size()) { - return false; - } - return this.equalsAux(this.firstNode, other.firstNode, eqF); - }; - /** - * @private - */ - LinkedList.prototype.equalsAux = function (n1, n2, eqF) { - while (n1 !== null) { - if (!eqF(n1.element, n2.element)) { - return false; - } - n1 = n1.next; - n2 = n2.next; - } - return true; - }; - /** - * Removes the element at the specified position in this list. - * @param {number} index given index. - * @return {*} removed element or undefined if the index is out of bounds. - */ - LinkedList.prototype.removeElementAtIndex = function (index) { - if (index < 0 || index >= this.nElements) { - return undefined; - } - var element; - if (this.nElements === 1) { - //First node in the list. - element = this.firstNode.element; - this.firstNode = null; - this.lastNode = null; - } - else { - var previous = this.nodeAtIndex(index - 1); - if (previous === null) { - element = this.firstNode.element; - this.firstNode = this.firstNode.next; - } - else if (previous.next === this.lastNode) { - element = this.lastNode.element; - this.lastNode = previous; - } - if (previous !== null) { - element = previous.next.element; - previous.next = previous.next.next; - } - } - this.nElements--; - return element; - }; - /** - * Executes the provided function once for each element present in this list in order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - LinkedList.prototype.forEach = function (callback) { - var currentNode = this.firstNode; - while (currentNode !== null) { - if (callback(currentNode.element) === false) { - break; - } - currentNode = currentNode.next; - } - }; - /** - * Reverses the order of the elements in this linked list (makes the last - * element first, and the first element last). - */ - LinkedList.prototype.reverse = function () { - var previous = null; - var current = this.firstNode; - var temp = null; - while (current !== null) { - temp = current.next; - current.next = previous; - previous = current; - current = temp; - } - temp = this.firstNode; - this.firstNode = this.lastNode; - this.lastNode = temp; - }; - /** - * Returns an array containing all of the elements in this list in proper - * sequence. - * @return {Array.<*>} an array containing all of the elements in this list, - * in proper sequence. - */ - LinkedList.prototype.toArray = function () { - var array = []; - var currentNode = this.firstNode; - while (currentNode !== null) { - array.push(currentNode.element); - currentNode = currentNode.next; - } - return array; - }; - /** - * Returns the number of elements in this list. - * @return {number} the number of elements in this list. - */ - LinkedList.prototype.size = function () { - return this.nElements; - }; - /** - * Returns true if this list contains no elements. - * @return {boolean} true if this list contains no elements. - */ - LinkedList.prototype.isEmpty = function () { - return this.nElements <= 0; - }; - LinkedList.prototype.toString = function () { - return arrays.toString(this.toArray()); - }; - /** - * @private - */ - LinkedList.prototype.nodeAtIndex = function (index) { - if (index < 0 || index >= this.nElements) { - return null; - } - if (index === (this.nElements - 1)) { - return this.lastNode; - } - var node = this.firstNode; - for (var i = 0; i < index; i++) { - node = node.next; - } - return node; - }; - /** - * @private - */ - LinkedList.prototype.createNode = function (item) { - return { - element: item, - next: null - }; - }; - return LinkedList; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = LinkedList; // End of linked list - -},{"./arrays":14,"./util":15}],8:[function(require,module,exports){ -"use strict"; -var util = require('./util'); -var Dictionary_1 = require('./Dictionary'); -var arrays = require('./arrays'); -var MultiDictionary = (function () { - /** - * Creates an empty multi dictionary. - * @class

A multi dictionary is a special kind of dictionary that holds - * multiple values against each key. Setting a value into the dictionary will - * add the value to an array at that key. Getting a key will return an array, - * holding all the values set to that key. - * You can configure to allow duplicates in the values. - * This implementation accepts any kind of objects as keys.

- * - *

If the keys are custom objects a function which converts keys to strings must be - * provided. Example:

- * - *
-     * function petToString(pet) {
-       *  return pet.name;
-       * }
-     * 
- *

If the values are custom objects a function to check equality between values - * must be provided. Example:

- * - *
-     * function petsAreEqualByAge(pet1,pet2) {
-       *  return pet1.age===pet2.age;
-       * }
-     * 
- * @constructor - * @param {function(Object):string=} toStrFunction optional function - * to convert keys to strings. If the keys aren't strings or if toString() - * is not appropriate, a custom function which receives a key and returns a - * unique string must be provided. - * @param {function(Object,Object):boolean=} valuesEqualsFunction optional - * function to check if two values are equal. - * - * @param allowDuplicateValues - */ - function MultiDictionary(toStrFunction, valuesEqualsFunction, allowDuplicateValues) { - if (allowDuplicateValues === void 0) { allowDuplicateValues = false; } - this.dict = new Dictionary_1.default(toStrFunction); - this.equalsF = valuesEqualsFunction || util.defaultEquals; - this.allowDuplicate = allowDuplicateValues; - } - /** - * Returns an array holding the values to which this dictionary maps - * the specified key. - * Returns an empty array if this dictionary contains no mappings for this key. - * @param {Object} key key whose associated values are to be returned. - * @return {Array} an array holding the values to which this dictionary maps - * the specified key. - */ - MultiDictionary.prototype.getValue = function (key) { - var values = this.dict.getValue(key); - if (util.isUndefined(values)) { - return []; - } - return arrays.copy(values); - }; - /** - * Adds the value to the array associated with the specified key, if - * it is not already present. - * @param {Object} key key with which the specified value is to be - * associated. - * @param {Object} value the value to add to the array at the key - * @return {boolean} true if the value was not already associated with that key. - */ - MultiDictionary.prototype.setValue = function (key, value) { - if (util.isUndefined(key) || util.isUndefined(value)) { - return false; - } - if (!this.containsKey(key)) { - this.dict.setValue(key, [value]); - return true; - } - var array = this.dict.getValue(key); - if (!this.allowDuplicate) { - if (arrays.contains(array, value, this.equalsF)) { - return false; - } - } - array.push(value); - return true; - }; - /** - * Removes the specified values from the array of values associated with the - * specified key. If a value isn't given, all values associated with the specified - * key are removed. - * @param {Object} key key whose mapping is to be removed from the - * dictionary. - * @param {Object=} value optional argument to specify the value to remove - * from the array associated with the specified key. - * @return {*} true if the dictionary changed, false if the key doesn't exist or - * if the specified value isn't associated with the specified key. - */ - MultiDictionary.prototype.remove = function (key, value) { - if (util.isUndefined(value)) { - var v = this.dict.remove(key); - return !util.isUndefined(v); - } - var array = this.dict.getValue(key); - if (arrays.remove(array, value, this.equalsF)) { - if (array.length === 0) { - this.dict.remove(key); - } - return true; - } - return false; - }; - /** - * Returns an array containing all of the keys in this dictionary. - * @return {Array} an array containing all of the keys in this dictionary. - */ - MultiDictionary.prototype.keys = function () { - return this.dict.keys(); - }; - /** - * Returns an array containing all of the values in this dictionary. - * @return {Array} an array containing all of the values in this dictionary. - */ - MultiDictionary.prototype.values = function () { - var values = this.dict.values(); - var array = []; - for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { - var v = values_1[_i]; - for (var _a = 0, v_1 = v; _a < v_1.length; _a++) { - var w = v_1[_a]; - array.push(w); - } - } - return array; - }; - /** - * Returns true if this dictionary at least one value associatted the specified key. - * @param {Object} key key whose presence in this dictionary is to be - * tested. - * @return {boolean} true if this dictionary at least one value associatted - * the specified key. - */ - MultiDictionary.prototype.containsKey = function (key) { - return this.dict.containsKey(key); - }; - /** - * Removes all mappings from this dictionary. - */ - MultiDictionary.prototype.clear = function () { - this.dict.clear(); - }; - /** - * Returns the number of keys in this dictionary. - * @return {number} the number of key-value mappings in this dictionary. - */ - MultiDictionary.prototype.size = function () { - return this.dict.size(); - }; - /** - * Returns true if this dictionary contains no mappings. - * @return {boolean} true if this dictionary contains no mappings. - */ - MultiDictionary.prototype.isEmpty = function () { - return this.dict.isEmpty(); - }; - return MultiDictionary; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MultiDictionary; // end of multi dictionary - -},{"./Dictionary":3,"./arrays":14,"./util":15}],9:[function(require,module,exports){ -"use strict"; -(function (Direction) { - Direction[Direction["BEFORE"] = 0] = "BEFORE"; - Direction[Direction["AFTER"] = 1] = "AFTER"; - Direction[Direction["INSIDE_AT_END"] = 2] = "INSIDE_AT_END"; - Direction[Direction["INSIDE_AT_START"] = 3] = "INSIDE_AT_START"; -})(exports.Direction || (exports.Direction = {})); -var Direction = exports.Direction; -var MultiRootTree = (function () { - function MultiRootTree(rootIds, nodes) { - if (rootIds === void 0) { rootIds = []; } - if (nodes === void 0) { nodes = {}; } - this.rootIds = rootIds; - this.nodes = nodes; - } - MultiRootTree.prototype.getRootIds = function () { - var clone = this.rootIds.slice(); - return clone; - }; - MultiRootTree.prototype.getNodes = function () { - var clone = {}; - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - clone[nodeKey] = this.nodes[nodeKey].slice(); - } - } - return clone; - }; - MultiRootTree.prototype.getObject = function () { - return { - rootIds: this.getRootIds(), - nodes: this.getNodes(), - }; - }; - MultiRootTree.prototype.moveIdBeforeId = function (moveId, beforeId) { - return this.moveId(moveId, beforeId, Direction.BEFORE); - }; - MultiRootTree.prototype.moveIdAfterId = function (moveId, afterId) { - return this.moveId(moveId, afterId, Direction.AFTER); - }; - MultiRootTree.prototype.moveIdIntoId = function (moveId, insideId, atStart) { - if (atStart === void 0) { atStart = true; } - if (atStart) { - return this.moveId(moveId, insideId, Direction.INSIDE_AT_START); - } - else { - return this.moveId(moveId, insideId, Direction.INSIDE_AT_END); - } - }; - MultiRootTree.prototype.deleteId = function (id) { - this.rootDeleteId(id); - this.nodeAndSubNodesDelete(id); - this.nodeRefrencesDelete(id); - }; - MultiRootTree.prototype.insertIdBeforeId = function (beforeId, insertId) { - var foundRootIdIndex = this.findRootId(beforeId); - if (foundRootIdIndex > -1) { - this.insertIdIntoRoot(insertId, foundRootIdIndex); - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var foundNodeIdIndex = this.findNodeId(nodeKey, beforeId); - if (foundNodeIdIndex > -1) { - this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex); - } - } - } - }; - MultiRootTree.prototype.insertIdAfterId = function (belowId, insertId) { - var foundRootIdIndex = this.findRootId(belowId); - if (foundRootIdIndex > -1) { - this.insertIdIntoRoot(insertId, foundRootIdIndex + 1); - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var foundNodeIdIndex = this.findNodeId(nodeKey, belowId); - if (foundNodeIdIndex > -1) { - this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex + 1); - } - } - } - }; - MultiRootTree.prototype.insertIdIntoId = function (insideId, insertId) { - this.nodeInsertAtEnd(insideId, insertId); - this.nodes[insertId] = []; - }; - MultiRootTree.prototype.insertIdIntoRoot = function (id, position) { - if (position === undefined) { - this.rootInsertAtEnd(id); - } - else { - if (position < 0) { - var length_1 = this.rootIds.length; - this.rootIds.splice((position + length_1 + 1), 0, id); - } - else { - this.rootIds.splice(position, 0, id); - } - } - this.nodes[id] = this.nodes[id] || []; - }; - MultiRootTree.prototype.insertIdIntoNode = function (nodeKey, id, position) { - this.nodes[nodeKey] = this.nodes[nodeKey] || []; - this.nodes[id] = this.nodes[id] || []; - if (position === undefined) { - this.nodeInsertAtEnd(nodeKey, id); - } - else { - if (position < 0) { - var length_2 = this.nodes[nodeKey].length; - this.nodes[nodeKey].splice((position + length_2 + 1), 0, id); - } - else { - this.nodes[nodeKey].splice(position, 0, id); - } - } - }; - MultiRootTree.prototype.moveId = function (moveId, beforeId, direction) { - var sourceId = moveId; - var sourceRootIndex = this.findRootId(sourceId); - var sourceNodeKey; - var sourceNodeIdIndex; - if (this.nodes[beforeId]) { - sourceNodeKey = beforeId; - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - sourceNodeIdIndex = this.findNodeId(nodeKey, beforeId); - break; - } - } - // got all - var targetId = beforeId; - var targetRootIndex = this.findRootId(targetId); - var targetNodeKey; - var targetNodeIdIndex; - if (this.nodes[beforeId]) { - targetNodeKey = beforeId; - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - targetNodeIdIndex = this.findNodeId(nodeKey, beforeId); - break; - } - } - // got all - if (sourceRootIndex > -1) { - if (targetRootIndex > -1) { - this.rootDelete(sourceRootIndex); - switch (direction) { - case Direction.BEFORE: - this.insertIdIntoRoot(sourceId, targetRootIndex); - break; - case Direction.AFTER: - this.insertIdIntoRoot(sourceId, targetRootIndex + 1); - break; - case Direction.INSIDE_AT_START: - this.nodeInsertAtStart(targetId, sourceId); - break; - case Direction.INSIDE_AT_END: - this.nodeInsertAtEnd(targetId, sourceId); - break; - } - } - else { - // moving root (source) ABOVE node (target) - // will remove one entry from roots - this.rootDelete(sourceRootIndex); - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var index = this.findNodeId(nodeKey, targetId); - if (index > -1) { - switch (direction) { - case Direction.BEFORE: - this.insertIdIntoNode(nodeKey, sourceId, index); - break; - case Direction.AFTER: - this.insertIdIntoNode(nodeKey, sourceId, index + 1); - break; - case Direction.INSIDE_AT_START: - this.nodeInsertAtStart(targetId, sourceId); - break; - case Direction.INSIDE_AT_END: - this.nodeInsertAtEnd(targetId, sourceId); - break; - } - break; - } - } - } - } - } - else { - if (targetRootIndex > -1) { - // moving node (source) ABOVE root (target) - // delete source id from each node - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var index = this.findNodeId(nodeKey, sourceId); - if (index > -1) { - // this.nodeInsertId(nodeKey, sourceId, index); - this.nodeDeleteAtIndex(nodeKey, index); - break; - } - } - } - switch (direction) { - case Direction.BEFORE: - this.insertIdIntoRoot(sourceId, targetRootIndex); - break; - case Direction.AFTER: - this.insertIdIntoRoot(sourceId, targetRootIndex + 1); - break; - case Direction.INSIDE_AT_START: - this.nodeInsertAtStart(targetId, sourceId); - break; - case Direction.INSIDE_AT_END: - this.nodeInsertAtEnd(targetId, sourceId); - break; - } - } - else { - // moving node (source) ABOVE node (target) - // delete source id from each node - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var index = this.findNodeId(nodeKey, sourceId); - if (index > -1) { - this.nodeDeleteAtIndex(nodeKey, index); - break; - } - } - } - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - var index = this.findNodeId(nodeKey, targetId); - if (index > -1) { - switch (direction) { - case Direction.BEFORE: - this.insertIdIntoNode(nodeKey, sourceId, index); - break; - case Direction.AFTER: - this.insertIdIntoNode(nodeKey, sourceId, index + 1); - break; - case Direction.INSIDE_AT_START: - this.nodeInsertAtStart(targetId, sourceId); - break; - case Direction.INSIDE_AT_END: - this.nodeInsertAtEnd(targetId, sourceId); - break; - } - break; - } - } - } - } - } - }; - MultiRootTree.prototype.swapArrayElements = function (arr, indexA, indexB) { - var temp = arr[indexA]; - arr[indexA] = arr[indexB]; - arr[indexB] = temp; - return arr; - }; - ; - MultiRootTree.prototype.rootDeleteId = function (id) { - var index = this.findRootId(id); - if (index > -1) { - this.rootDelete(index); - } - }; - MultiRootTree.prototype.nodeAndSubNodesDelete = function (nodeKey) { - var toDeleteLater = []; - for (var i = 0; i < this.nodes[nodeKey].length; i++) { - var id = this.nodes[nodeKey][i]; - this.nodeAndSubNodesDelete(id); - toDeleteLater.push(nodeKey); - } - this.nodeDelete(nodeKey); - for (var i = 0; i < toDeleteLater.length; i++) { - this.nodeDelete(toDeleteLater[i]); - } - }; - MultiRootTree.prototype.nodeRefrencesDelete = function (id) { - for (var nodeKey in this.nodes) { - if (this.nodes.hasOwnProperty(nodeKey)) { - for (var i = 0; i < this.nodes[nodeKey].length; i++) { - var targetId = this.nodes[nodeKey][i]; - if (targetId === id) { - this.nodeDeleteAtIndex(nodeKey, i); - } - } - } - } - }; - MultiRootTree.prototype.nodeDelete = function (nodeKey) { - delete this.nodes[nodeKey]; - }; - MultiRootTree.prototype.findRootId = function (id) { - return this.rootIds.indexOf(id); - }; - MultiRootTree.prototype.findNodeId = function (nodeKey, id) { - return this.nodes[nodeKey].indexOf(id); - }; - MultiRootTree.prototype.findNode = function (nodeKey) { - return this.nodes[nodeKey]; - }; - MultiRootTree.prototype.nodeInsertAtStart = function (nodeKey, id) { - this.nodes[nodeKey].unshift(id); - }; - MultiRootTree.prototype.nodeInsertAtEnd = function (nodeKey, id) { - this.nodes[nodeKey].push(id); - }; - MultiRootTree.prototype.rootDelete = function (index) { - this.rootIds.splice(index, 1); - }; - MultiRootTree.prototype.nodeDeleteAtIndex = function (nodeKey, index) { - this.nodes[nodeKey].splice(index, 1); - }; - MultiRootTree.prototype.rootInsertAtStart = function (id) { - this.rootIds.unshift(id); - }; - MultiRootTree.prototype.rootInsertAtEnd = function (id) { - this.rootIds.push(id); - }; - return MultiRootTree; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MultiRootTree; - -},{}],10:[function(require,module,exports){ -"use strict"; -var util = require('./util'); -var Heap_1 = require('./Heap'); -var PriorityQueue = (function () { - /** - * Creates an empty priority queue. - * @class

In a priority queue each element is associated with a "priority", - * elements are dequeued in highest-priority-first order (the elements with the - * highest priority are dequeued first). Priority Queues are implemented as heaps. - * If the inserted elements are custom objects a compare function must be provided, - * otherwise the <=, === and >= operators are used to compare object priority.

- *
-     * function compare(a, b) {
-     *  if (a is less than b by some ordering criterion) {
-     *     return -1;
-     *  } if (a is greater than b by the ordering criterion) {
-     *     return 1;
-     *  }
-     *  // a must be equal to b
-     *  return 0;
-     * }
-     * 
- * @constructor - * @param {function(Object,Object):number=} compareFunction optional - * function used to compare two element priorities. Must return a negative integer, - * zero, or a positive integer as the first argument is less than, equal to, - * or greater than the second. - */ - function PriorityQueue(compareFunction) { - this.heap = new Heap_1.default(util.reverseCompareFunction(compareFunction)); - } - /** - * Inserts the specified element into this priority queue. - * @param {Object} element the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - PriorityQueue.prototype.enqueue = function (element) { - return this.heap.add(element); - }; - /** - * Inserts the specified element into this priority queue. - * @param {Object} element the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - PriorityQueue.prototype.add = function (element) { - return this.heap.add(element); - }; - /** - * Retrieves and removes the highest priority element of this queue. - * @return {*} the the highest priority element of this queue, - * or undefined if this queue is empty. - */ - PriorityQueue.prototype.dequeue = function () { - if (this.heap.size() !== 0) { - var el = this.heap.peek(); - this.heap.removeRoot(); - return el; - } - return undefined; - }; - /** - * Retrieves, but does not remove, the highest priority element of this queue. - * @return {*} the highest priority element of this queue, or undefined if this queue is empty. - */ - PriorityQueue.prototype.peek = function () { - return this.heap.peek(); - }; - /** - * Returns true if this priority queue contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this priority queue contains the specified element, - * false otherwise. - */ - PriorityQueue.prototype.contains = function (element) { - return this.heap.contains(element); - }; - /** - * Checks if this priority queue is empty. - * @return {boolean} true if and only if this priority queue contains no items; false - * otherwise. - */ - PriorityQueue.prototype.isEmpty = function () { - return this.heap.isEmpty(); - }; - /** - * Returns the number of elements in this priority queue. - * @return {number} the number of elements in this priority queue. - */ - PriorityQueue.prototype.size = function () { - return this.heap.size(); - }; - /** - * Removes all of the elements from this priority queue. - */ - PriorityQueue.prototype.clear = function () { - this.heap.clear(); - }; - /** - * Executes the provided function once for each element present in this queue in - * no particular order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - PriorityQueue.prototype.forEach = function (callback) { - this.heap.forEach(callback); - }; - return PriorityQueue; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = PriorityQueue; // end of priority queue - -},{"./Heap":5,"./util":15}],11:[function(require,module,exports){ -"use strict"; -var LinkedList_1 = require('./LinkedList'); -var Queue = (function () { - /** - * Creates an empty queue. - * @class A queue is a First-In-First-Out (FIFO) data structure, the first - * element added to the queue will be the first one to be removed. This - * implementation uses a linked list as a container. - * @constructor - */ - function Queue() { - this.list = new LinkedList_1.default(); - } - /** - * Inserts the specified element into the end of this queue. - * @param {Object} elem the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - Queue.prototype.enqueue = function (elem) { - return this.list.add(elem); - }; - /** - * Inserts the specified element into the end of this queue. - * @param {Object} elem the element to insert. - * @return {boolean} true if the element was inserted, or false if it is undefined. - */ - Queue.prototype.add = function (elem) { - return this.list.add(elem); - }; - /** - * Retrieves and removes the head of this queue. - * @return {*} the head of this queue, or undefined if this queue is empty. - */ - Queue.prototype.dequeue = function () { - if (this.list.size() !== 0) { - var el = this.list.first(); - this.list.removeElementAtIndex(0); - return el; - } - return undefined; - }; - /** - * Retrieves, but does not remove, the head of this queue. - * @return {*} the head of this queue, or undefined if this queue is empty. - */ - Queue.prototype.peek = function () { - if (this.list.size() !== 0) { - return this.list.first(); - } - return undefined; - }; - /** - * Returns the number of elements in this queue. - * @return {number} the number of elements in this queue. - */ - Queue.prototype.size = function () { - return this.list.size(); - }; - /** - * Returns true if this queue contains the specified element. - *

If the elements inside this stack are - * not comparable with the === operator, a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName (pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} elem element to search for. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function to check if two elements are equal. - * @return {boolean} true if this queue contains the specified element, - * false otherwise. - */ - Queue.prototype.contains = function (elem, equalsFunction) { - return this.list.contains(elem, equalsFunction); - }; - /** - * Checks if this queue is empty. - * @return {boolean} true if and only if this queue contains no items; false - * otherwise. - */ - Queue.prototype.isEmpty = function () { - return this.list.size() <= 0; - }; - /** - * Removes all of the elements from this queue. - */ - Queue.prototype.clear = function () { - this.list.clear(); - }; - /** - * Executes the provided function once for each element present in this queue in - * FIFO order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - Queue.prototype.forEach = function (callback) { - this.list.forEach(callback); - }; - return Queue; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Queue; // End of queue - -},{"./LinkedList":7}],12:[function(require,module,exports){ -"use strict"; -var util = require('./util'); -var arrays = require('./arrays'); -var Dictionary_1 = require('./Dictionary'); -var Set = (function () { - /** - * Creates an empty set. - * @class

A set is a data structure that contains no duplicate items.

- *

If the inserted elements are custom objects a function - * which converts elements to strings must be provided. Example:

- * - *
-     * function petToString(pet) {
-     *  return pet.name;
-     * }
-     * 
- * - * @constructor - * @param {function(Object):string=} toStringFunction optional function used - * to convert elements to strings. If the elements aren't strings or if toString() - * is not appropriate, a custom function which receives a onject and returns a - * unique string must be provided. - */ - function Set(toStringFunction) { - this.dictionary = new Dictionary_1.default(toStringFunction); - } - /** - * Returns true if this set contains the specified element. - * @param {Object} element element to search for. - * @return {boolean} true if this set contains the specified element, - * false otherwise. - */ - Set.prototype.contains = function (element) { - return this.dictionary.containsKey(element); - }; - /** - * Adds the specified element to this set if it is not already present. - * @param {Object} element the element to insert. - * @return {boolean} true if this set did not already contain the specified element. - */ - Set.prototype.add = function (element) { - if (this.contains(element) || util.isUndefined(element)) { - return false; - } - else { - this.dictionary.setValue(element, element); - return true; - } - }; - /** - * Performs an intersecion between this an another set. - * Removes all values that are not present this set and the given set. - * @param {collections.Set} otherSet other set. - */ - Set.prototype.intersection = function (otherSet) { - var set = this; - this.forEach(function (element) { - if (!otherSet.contains(element)) { - set.remove(element); - } - return true; - }); - }; - /** - * Performs a union between this an another set. - * Adds all values from the given set to this set. - * @param {collections.Set} otherSet other set. - */ - Set.prototype.union = function (otherSet) { - var set = this; - otherSet.forEach(function (element) { - set.add(element); - return true; - }); - }; - /** - * Performs a difference between this an another set. - * Removes from this set all the values that are present in the given set. - * @param {collections.Set} otherSet other set. - */ - Set.prototype.difference = function (otherSet) { - var set = this; - otherSet.forEach(function (element) { - set.remove(element); - return true; - }); - }; - /** - * Checks whether the given set contains all the elements in this set. - * @param {collections.Set} otherSet other set. - * @return {boolean} true if this set is a subset of the given set. - */ - Set.prototype.isSubsetOf = function (otherSet) { - if (this.size() > otherSet.size()) { - return false; - } - var isSub = true; - this.forEach(function (element) { - if (!otherSet.contains(element)) { - isSub = false; - return false; - } - return true; - }); - return isSub; - }; - /** - * Removes the specified element from this set if it is present. - * @return {boolean} true if this set contained the specified element. - */ - Set.prototype.remove = function (element) { - if (!this.contains(element)) { - return false; - } - else { - this.dictionary.remove(element); - return true; - } - }; - /** - * Executes the provided function once for each element - * present in this set. - * @param {function(Object):*} callback function to execute, it is - * invoked with one arguments: the element. To break the iteration you can - * optionally return false. - */ - Set.prototype.forEach = function (callback) { - this.dictionary.forEach(function (k, v) { - return callback(v); - }); - }; - /** - * Returns an array containing all of the elements in this set in arbitrary order. - * @return {Array} an array containing all of the elements in this set. - */ - Set.prototype.toArray = function () { - return this.dictionary.values(); - }; - /** - * Returns true if this set contains no elements. - * @return {boolean} true if this set contains no elements. - */ - Set.prototype.isEmpty = function () { - return this.dictionary.isEmpty(); - }; - /** - * Returns the number of elements in this set. - * @return {number} the number of elements in this set. - */ - Set.prototype.size = function () { - return this.dictionary.size(); - }; - /** - * Removes all of the elements from this set. - */ - Set.prototype.clear = function () { - this.dictionary.clear(); - }; - /* - * Provides a string representation for display - */ - Set.prototype.toString = function () { - return arrays.toString(this.toArray()); - }; - return Set; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Set; // end of Set - -},{"./Dictionary":3,"./arrays":14,"./util":15}],13:[function(require,module,exports){ -"use strict"; -var LinkedList_1 = require('./LinkedList'); -var Stack = (function () { - /** - * Creates an empty Stack. - * @class A Stack is a Last-In-First-Out (LIFO) data structure, the last - * element added to the stack will be the first one to be removed. This - * implementation uses a linked list as a container. - * @constructor - */ - function Stack() { - this.list = new LinkedList_1.default(); - } - /** - * Pushes an item onto the top of this stack. - * @param {Object} elem the element to be pushed onto this stack. - * @return {boolean} true if the element was pushed or false if it is undefined. - */ - Stack.prototype.push = function (elem) { - return this.list.add(elem, 0); - }; - /** - * Pushes an item onto the top of this stack. - * @param {Object} elem the element to be pushed onto this stack. - * @return {boolean} true if the element was pushed or false if it is undefined. - */ - Stack.prototype.add = function (elem) { - return this.list.add(elem, 0); - }; - /** - * Removes the object at the top of this stack and returns that object. - * @return {*} the object at the top of this stack or undefined if the - * stack is empty. - */ - Stack.prototype.pop = function () { - return this.list.removeElementAtIndex(0); - }; - /** - * Looks at the object at the top of this stack without removing it from the - * stack. - * @return {*} the object at the top of this stack or undefined if the - * stack is empty. - */ - Stack.prototype.peek = function () { - return this.list.first(); - }; - /** - * Returns the number of elements in this stack. - * @return {number} the number of elements in this stack. - */ - Stack.prototype.size = function () { - return this.list.size(); - }; - /** - * Returns true if this stack contains the specified element. - *

If the elements inside this stack are - * not comparable with the === operator, a custom equals function should be - * provided to perform searches, the function must receive two arguments and - * return true if they are equal, false otherwise. Example:

- * - *
-     * const petsAreEqualByName (pet1, pet2) {
-     *  return pet1.name === pet2.name;
-     * }
-     * 
- * @param {Object} elem element to search for. - * @param {function(Object,Object):boolean=} equalsFunction optional - * function to check if two elements are equal. - * @return {boolean} true if this stack contains the specified element, - * false otherwise. - */ - Stack.prototype.contains = function (elem, equalsFunction) { - return this.list.contains(elem, equalsFunction); - }; - /** - * Checks if this stack is empty. - * @return {boolean} true if and only if this stack contains no items; false - * otherwise. - */ - Stack.prototype.isEmpty = function () { - return this.list.isEmpty(); - }; - /** - * Removes all of the elements from this stack. - */ - Stack.prototype.clear = function () { - this.list.clear(); - }; - /** - * Executes the provided function once for each element present in this stack in - * LIFO order. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ - Stack.prototype.forEach = function (callback) { - this.list.forEach(callback); - }; - return Stack; -}()); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Stack; // End of stack - -},{"./LinkedList":7}],14:[function(require,module,exports){ -"use strict"; -var util = require('./util'); -/** - * Returns the position of the first occurrence of the specified item - * within the specified array.4 - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the position of the first occurrence of the specified element - * within the specified array, or -1 if not found. - */ -function indexOf(array, item, equalsFunction) { - var equals = equalsFunction || util.defaultEquals; - var length = array.length; - for (var i = 0; i < length; i++) { - if (equals(array[i], item)) { - return i; - } - } - return -1; -} -exports.indexOf = indexOf; -/** - * Returns the position of the last occurrence of the specified element - * within the specified array. - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the position of the last occurrence of the specified element - * within the specified array or -1 if not found. - */ -function lastIndexOf(array, item, equalsFunction) { - var equals = equalsFunction || util.defaultEquals; - var length = array.length; - for (var i = length - 1; i >= 0; i--) { - if (equals(array[i], item)) { - return i; - } - } - return -1; -} -exports.lastIndexOf = lastIndexOf; -/** - * Returns true if the specified array contains the specified element. - * @param {*} array the array in which to search the element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function to - * check equality between 2 elements. - * @return {boolean} true if the specified array contains the specified element. - */ -function contains(array, item, equalsFunction) { - return indexOf(array, item, equalsFunction) >= 0; -} -exports.contains = contains; -/** - * Removes the first ocurrence of the specified element from the specified array. - * @param {*} array the array in which to search element. - * @param {Object} item the element to search. - * @param {function(Object,Object):boolean=} equalsFunction optional function to - * check equality between 2 elements. - * @return {boolean} true if the array changed after this call. - */ -function remove(array, item, equalsFunction) { - var index = indexOf(array, item, equalsFunction); - if (index < 0) { - return false; - } - array.splice(index, 1); - return true; -} -exports.remove = remove; -/** - * Returns the number of elements in the specified array equal - * to the specified object. - * @param {Array} array the array in which to determine the frequency of the element. - * @param {Object} item the element whose frequency is to be determined. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between 2 elements. - * @return {number} the number of elements in the specified array - * equal to the specified object. - */ -function frequency(array, item, equalsFunction) { - var equals = equalsFunction || util.defaultEquals; - var length = array.length; - var freq = 0; - for (var i = 0; i < length; i++) { - if (equals(array[i], item)) { - freq++; - } - } - return freq; -} -exports.frequency = frequency; -/** - * Returns true if the two specified arrays are equal to one another. - * Two arrays are considered equal if both arrays contain the same number - * of elements, and all corresponding pairs of elements in the two - * arrays are equal and are in the same order. - * @param {Array} array1 one array to be tested for equality. - * @param {Array} array2 the other array to be tested for equality. - * @param {function(Object,Object):boolean=} equalsFunction optional function used to - * check equality between elemements in the arrays. - * @return {boolean} true if the two arrays are equal - */ -function equals(array1, array2, equalsFunction) { - var equals = equalsFunction || util.defaultEquals; - if (array1.length !== array2.length) { - return false; - } - var length = array1.length; - for (var i = 0; i < length; i++) { - if (!equals(array1[i], array2[i])) { - return false; - } - } - return true; -} -exports.equals = equals; -/** - * Returns shallow a copy of the specified array. - * @param {*} array the array to copy. - * @return {Array} a copy of the specified array - */ -function copy(array) { - return array.concat(); -} -exports.copy = copy; -/** - * Swaps the elements at the specified positions in the specified array. - * @param {Array} array The array in which to swap elements. - * @param {number} i the index of one element to be swapped. - * @param {number} j the index of the other element to be swapped. - * @return {boolean} true if the array is defined and the indexes are valid. - */ -function swap(array, i, j) { - if (i < 0 || i >= array.length || j < 0 || j >= array.length) { - return false; - } - var temp = array[i]; - array[i] = array[j]; - array[j] = temp; - return true; -} -exports.swap = swap; -function toString(array) { - return '[' + array.toString() + ']'; -} -exports.toString = toString; -/** - * Executes the provided function once for each element present in this array - * starting from index 0 to length - 1. - * @param {Array} array The array in which to iterate. - * @param {function(Object):*} callback function to execute, it is - * invoked with one argument: the element value, to break the iteration you can - * optionally return false. - */ -function forEach(array, callback) { - for (var _i = 0, array_1 = array; _i < array_1.length; _i++) { - var ele = array_1[_i]; - if (callback(ele) === false) { - return; - } - } -} -exports.forEach = forEach; - -},{"./util":15}],15:[function(require,module,exports){ -"use strict"; -var _hasOwnProperty = Object.prototype.hasOwnProperty; -exports.has = function (obj, prop) { - return _hasOwnProperty.call(obj, prop); -}; -/** - * Default function to compare element order. - * @function - */ -function defaultCompare(a, b) { - if (a < b) { - return -1; - } - else if (a === b) { - return 0; - } - else { - return 1; - } -} -exports.defaultCompare = defaultCompare; -/** - * Default function to test equality. - * @function - */ -function defaultEquals(a, b) { - return a === b; -} -exports.defaultEquals = defaultEquals; -/** - * Default function to convert an object to a string. - * @function - */ -function defaultToString(item) { - if (item === null) { - return 'COLLECTION_NULL'; - } - else if (isUndefined(item)) { - return 'COLLECTION_UNDEFINED'; - } - else if (isString(item)) { - return '$s' + item; - } - else { - return '$o' + item.toString(); - } -} -exports.defaultToString = defaultToString; -/** -* Joins all the properies of the object using the provided join string -*/ -function makeString(item, join) { - if (join === void 0) { join = ','; } - if (item === null) { - return 'COLLECTION_NULL'; - } - else if (isUndefined(item)) { - return 'COLLECTION_UNDEFINED'; - } - else if (isString(item)) { - return item.toString(); - } - else { - var toret = '{'; - var first = true; - for (var prop in item) { - if (exports.has(item, prop)) { - if (first) { - first = false; - } - else { - toret = toret + join; - } - toret = toret + prop + ':' + item[prop]; - } - } - return toret + '}'; - } -} -exports.makeString = makeString; -/** - * Checks if the given argument is a function. - * @function - */ -function isFunction(func) { - return (typeof func) === 'function'; -} -exports.isFunction = isFunction; -/** - * Checks if the given argument is undefined. - * @function - */ -function isUndefined(obj) { - return (typeof obj) === 'undefined'; -} -exports.isUndefined = isUndefined; -/** - * Checks if the given argument is a string. - * @function - */ -function isString(obj) { - return Object.prototype.toString.call(obj) === '[object String]'; -} -exports.isString = isString; -/** - * Reverses a compare function. - * @function - */ -function reverseCompareFunction(compareFunction) { - if (!isFunction(compareFunction)) { - return function (a, b) { - if (a < b) { - return 1; - } - else if (a === b) { - return 0; - } - else { - return -1; - } - }; - } - else { - return function (d, v) { - return compareFunction(d, v) * -1; - }; - } -} -exports.reverseCompareFunction = reverseCompareFunction; -/** - * Returns an equal function given a compare function. - * @function - */ -function compareToEquals(compareFunction) { - return function (a, b) { - return compareFunction(a, b) === 0; - }; -} -exports.compareToEquals = compareToEquals; - -},{}],"typescript-collections":[function(require,module,exports){ -"use strict"; -// Copyright 2013 Basarat Ali Syed. All Rights Reserved. -// -// Licensed under MIT open source license http://opensource.org/licenses/MIT -// -// Orginal javascript code was by Mauricio Santos -// -var _arrays = require('./arrays'); -exports.arrays = _arrays; -var Bag_1 = require('./Bag'); -exports.Bag = Bag_1.default; -var BSTree_1 = require('./BSTree'); -exports.BSTree = BSTree_1.default; -var Dictionary_1 = require('./Dictionary'); -exports.Dictionary = Dictionary_1.default; -var Heap_1 = require('./Heap'); -exports.Heap = Heap_1.default; -var LinkedDictionary_1 = require('./LinkedDictionary'); -exports.LinkedDictionary = LinkedDictionary_1.default; -var LinkedList_1 = require('./LinkedList'); -exports.LinkedList = LinkedList_1.default; -var MultiDictionary_1 = require('./MultiDictionary'); -exports.MultiDictionary = MultiDictionary_1.default; -var FactoryDictionary_1 = require('./FactoryDictionary'); -exports.FactoryDictionary = FactoryDictionary_1.default; -var FactoryDictionary_2 = require('./FactoryDictionary'); -exports.DefaultDictionary = FactoryDictionary_2.default; -var Queue_1 = require('./Queue'); -exports.Queue = Queue_1.default; -var PriorityQueue_1 = require('./PriorityQueue'); -exports.PriorityQueue = PriorityQueue_1.default; -var Set_1 = require('./Set'); -exports.Set = Set_1.default; -var Stack_1 = require('./Stack'); -exports.Stack = Stack_1.default; -var MultiRootTree_1 = require('./MultiRootTree'); -exports.MultiRootTree = MultiRootTree_1.default; -var _util = require('./util'); -exports.util = _util; - -},{"./BSTree":1,"./Bag":2,"./Dictionary":3,"./FactoryDictionary":4,"./Heap":5,"./LinkedDictionary":6,"./LinkedList":7,"./MultiDictionary":8,"./MultiRootTree":9,"./PriorityQueue":10,"./Queue":11,"./Set":12,"./Stack":13,"./arrays":14,"./util":15}]},{},[]) -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L2xpYi9CU1RyZWUuanMiLCJkaXN0L2xpYi9CYWcuanMiLCJkaXN0L2xpYi9EaWN0aW9uYXJ5LmpzIiwiZGlzdC9saWIvRmFjdG9yeURpY3Rpb25hcnkuanMiLCJkaXN0L2xpYi9IZWFwLmpzIiwiZGlzdC9saWIvTGlua2VkRGljdGlvbmFyeS5qcyIsImRpc3QvbGliL0xpbmtlZExpc3QuanMiLCJkaXN0L2xpYi9NdWx0aURpY3Rpb25hcnkuanMiLCJkaXN0L2xpYi9NdWx0aVJvb3RUcmVlLmpzIiwiZGlzdC9saWIvUHJpb3JpdHlRdWV1ZS5qcyIsImRpc3QvbGliL1F1ZXVlLmpzIiwiZGlzdC9saWIvU2V0LmpzIiwiZGlzdC9saWIvU3RhY2suanMiLCJkaXN0L2xpYi9hcnJheXMuanMiLCJkaXN0L2xpYi91dGlsLmpzIiwiZGlzdC9saWIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIFF1ZXVlXzEgPSByZXF1aXJlKCcuL1F1ZXVlJyk7XG52YXIgQlNUcmVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGJpbmFyeSBzZWFyY2ggdHJlZS5cbiAgICAgKiBAY2xhc3MgPHA+QSBiaW5hcnkgc2VhcmNoIHRyZWUgaXMgYSBiaW5hcnkgdHJlZSBpbiB3aGljaCBlYWNoXG4gICAgICogaW50ZXJuYWwgbm9kZSBzdG9yZXMgYW4gZWxlbWVudCBzdWNoIHRoYXQgdGhlIGVsZW1lbnRzIHN0b3JlZCBpbiB0aGVcbiAgICAgKiBsZWZ0IHN1YnRyZWUgYXJlIGxlc3MgdGhhbiBpdCBhbmQgdGhlIGVsZW1lbnRzXG4gICAgICogc3RvcmVkIGluIHRoZSByaWdodCBzdWJ0cmVlIGFyZSBncmVhdGVyLjwvcD5cbiAgICAgKiA8cD5Gb3JtYWxseSwgYSBiaW5hcnkgc2VhcmNoIHRyZWUgaXMgYSBub2RlLWJhc2VkIGJpbmFyeSB0cmVlIGRhdGEgc3RydWN0dXJlIHdoaWNoXG4gICAgICogaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczo8L3A+XG4gICAgICogPHVsPlxuICAgICAqIDxsaT5UaGUgbGVmdCBzdWJ0cmVlIG9mIGEgbm9kZSBjb250YWlucyBvbmx5IG5vZGVzIHdpdGggZWxlbWVudHMgbGVzc1xuICAgICAqIHRoYW4gdGhlIG5vZGUncyBlbGVtZW50PC9saT5cbiAgICAgKiA8bGk+VGhlIHJpZ2h0IHN1YnRyZWUgb2YgYSBub2RlIGNvbnRhaW5zIG9ubHkgbm9kZXMgd2l0aCBlbGVtZW50cyBncmVhdGVyXG4gICAgICogdGhhbiB0aGUgbm9kZSdzIGVsZW1lbnQ8L2xpPlxuICAgICAqIDxsaT5Cb3RoIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlcyBtdXN0IGFsc28gYmUgYmluYXJ5IHNlYXJjaCB0cmVlcy48L2xpPlxuICAgICAqIDwvdWw+XG4gICAgICogPHA+SWYgdGhlIGluc2VydGVkIGVsZW1lbnRzIGFyZSBjdXN0b20gb2JqZWN0cyBhIGNvbXBhcmUgZnVuY3Rpb24gbXVzdFxuICAgICAqIGJlIHByb3ZpZGVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lLCBvdGhlcndpc2UgdGhlIDw9LCA9PT0gYW5kID49IG9wZXJhdG9ycyBhcmVcbiAgICAgKiB1c2VkIHRvIGNvbXBhcmUgZWxlbWVudHMuIEV4YW1wbGU6PC9wPlxuICAgICAqIDxwcmU+XG4gICAgICogZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgICogIGlmIChhIGlzIGxlc3MgdGhhbiBiIGJ5IHNvbWUgb3JkZXJpbmcgY3JpdGVyaW9uKSB7XG4gICAgICogICAgIHJldHVybiAtMTtcbiAgICAgKiAgfSBpZiAoYSBpcyBncmVhdGVyIHRoYW4gYiBieSB0aGUgb3JkZXJpbmcgY3JpdGVyaW9uKSB7XG4gICAgICogICAgIHJldHVybiAxO1xuICAgICAqICB9XG4gICAgICogIC8vIGEgbXVzdCBiZSBlcXVhbCB0byBiXG4gICAgICogIHJldHVybiAwO1xuICAgICAqIH1cbiAgICAgKiA8L3ByZT5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOm51bWJlcj19IGNvbXBhcmVGdW5jdGlvbiBvcHRpb25hbFxuICAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSB0d28gZWxlbWVudHMuIE11c3QgcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlcixcbiAgICAgKiB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sXG4gICAgICogb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gQlNUcmVlKGNvbXBhcmVGdW5jdGlvbikge1xuICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlRnVuY3Rpb24gfHwgdXRpbC5kZWZhdWx0Q29tcGFyZTtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGlzIHRyZWUgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBpbnNlcnQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIHRyZWUgZGlkIG5vdCBhbHJlYWR5IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnNlcnROb2RlKHRoaXMuY3JlYXRlTm9kZShlbGVtZW50KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubkVsZW1lbnRzKys7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHRyZWUuXG4gICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJlZSBjb250YWlucyBubyBlbGVtZW50cy5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgdHJlZSBjb250YWlucyBubyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50cyA9PT0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHRyZWUuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgdHJlZS5cbiAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50cztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyZWUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IGVsZW1lbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgdHJlZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaE5vZGUodGhpcy5yb290LCBlbGVtZW50KSAhPT0gbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhpcyB0cmVlIGlmIGl0IGlzIHByZXNlbnQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIHRyZWUgY29udGFpbmVkIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5zZWFyY2hOb2RlKHRoaXMucm9vdCwgZWxlbWVudCk7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVOb2RlKG5vZGUpO1xuICAgICAgICB0aGlzLm5FbGVtZW50cy0tO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHRyZWUgaW5cbiAgICAgKiBpbi1vcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuaW5vcmRlclRyYXZlcnNhbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmlub3JkZXJUcmF2ZXJzYWxBdXgodGhpcy5yb290LCBjYWxsYmFjaywge1xuICAgICAgICAgICAgc3RvcDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBlbGVtZW50IHByZXNlbnQgaW4gdGhpcyB0cmVlIGluIHByZS1vcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUucHJlb3JkZXJUcmF2ZXJzYWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wcmVvcmRlclRyYXZlcnNhbEF1eCh0aGlzLnJvb3QsIGNhbGxiYWNrLCB7XG4gICAgICAgICAgICBzdG9wOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHRyZWUgaW4gcG9zdC1vcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUucG9zdG9yZGVyVHJhdmVyc2FsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucG9zdG9yZGVyVHJhdmVyc2FsQXV4KHRoaXMucm9vdCwgY2FsbGJhY2ssIHtcbiAgICAgICAgICAgIHN0b3A6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBwcmVzZW50IGluIHRoaXMgdHJlZSBpblxuICAgICAqIGxldmVsLW9yZGVyLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6IHRoZSBlbGVtZW50IHZhbHVlLCB0byBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW4gb3B0aW9uYWxseSByZXR1cm4gZmFsc2UuXG4gICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5sZXZlbFRyYXZlcnNhbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmxldmVsVHJhdmVyc2FsQXV4KHRoaXMucm9vdCwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWluaW11bSBlbGVtZW50IG9mIHRoaXMgdHJlZS5cbiAgICAgKiBAcmV0dXJuIHsqfSB0aGUgbWluaW11bSBlbGVtZW50IG9mIHRoaXMgdHJlZSBvciB1bmRlZmluZWQgaWYgdGhpcyB0cmVlIGlzXG4gICAgICogaXMgZW1wdHkuXG4gICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5taW5pbXVtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWluaW11bUF1eCh0aGlzLnJvb3QpLmVsZW1lbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGVsZW1lbnQgb2YgdGhpcyB0cmVlLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSBtYXhpbXVtIGVsZW1lbnQgb2YgdGhpcyB0cmVlIG9yIHVuZGVmaW5lZCBpZiB0aGlzIHRyZWUgaXNcbiAgICAgKiBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLm1heGltdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tYXhpbXVtQXV4KHRoaXMucm9vdCkuZWxlbWVudDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHRyZWUgaW4gaW5vcmRlci5cbiAgICAgKiBFcXVpdmFsZW50IHRvIGlub3JkZXJUcmF2ZXJzYWwuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogdGhlIGVsZW1lbnQgdmFsdWUsIHRvIGJyZWFrIHRoZSBpdGVyYXRpb24geW91IGNhblxuICAgICAqIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmlub3JkZXJUcmF2ZXJzYWwoY2FsbGJhY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyB0cmVlIGluIGluLW9yZGVyLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyB0cmVlIGluIGluLW9yZGVyLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIHRoaXMuaW5vcmRlclRyYXZlcnNhbChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgYXJyYXkucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoaXMgdHJlZS5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBoZWlnaHQgb2YgdGhpcyB0cmVlIG9yIC0xIGlmIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuaGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWlnaHRBdXgodGhpcy5yb290KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuc2VhcmNoTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBjbXAgPSBudWxsO1xuICAgICAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCAmJiBjbXAgIT09IDApIHtcbiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShlbGVtZW50LCBub2RlLmVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGNtcCA8IDApIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5sZWZ0Q2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucmlnaHRDaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUudHJhbnNwbGFudCA9IGZ1bmN0aW9uIChuMSwgbjIpIHtcbiAgICAgICAgaWYgKG4xLnBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gbjI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobjEgPT09IG4xLnBhcmVudC5sZWZ0Q2gpIHtcbiAgICAgICAgICAgIG4xLnBhcmVudC5sZWZ0Q2ggPSBuMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG4xLnBhcmVudC5yaWdodENoID0gbjI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBuMi5wYXJlbnQgPSBuMS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUucmVtb3ZlTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmxlZnRDaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc3BsYW50KG5vZGUsIG5vZGUucmlnaHRDaCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5yaWdodENoID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcGxhbnQobm9kZSwgbm9kZS5sZWZ0Q2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHkgPSB0aGlzLm1pbmltdW1BdXgobm9kZS5yaWdodENoKTtcbiAgICAgICAgICAgIGlmICh5LnBhcmVudCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwbGFudCh5LCB5LnJpZ2h0Q2gpO1xuICAgICAgICAgICAgICAgIHkucmlnaHRDaCA9IG5vZGUucmlnaHRDaDtcbiAgICAgICAgICAgICAgICB5LnJpZ2h0Q2gucGFyZW50ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJhbnNwbGFudChub2RlLCB5KTtcbiAgICAgICAgICAgIHkubGVmdENoID0gbm9kZS5sZWZ0Q2g7XG4gICAgICAgICAgICB5LmxlZnRDaC5wYXJlbnQgPSB5O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLmlub3JkZXJUcmF2ZXJzYWxBdXggPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2ssIHNpZ25hbCkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBzaWduYWwuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5vcmRlclRyYXZlcnNhbEF1eChub2RlLmxlZnRDaCwgY2FsbGJhY2ssIHNpZ25hbCk7XG4gICAgICAgIGlmIChzaWduYWwuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbC5zdG9wID0gY2FsbGJhY2sobm9kZS5lbGVtZW50KSA9PT0gZmFsc2U7XG4gICAgICAgIGlmIChzaWduYWwuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5vcmRlclRyYXZlcnNhbEF1eChub2RlLnJpZ2h0Q2gsIGNhbGxiYWNrLCBzaWduYWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5sZXZlbFRyYXZlcnNhbEF1eCA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcXVldWUgPSBuZXcgUXVldWVfMS5kZWZhdWx0KCk7XG4gICAgICAgIGlmIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZS5lbnF1ZXVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICBub2RlID0gcXVldWUuZGVxdWV1ZSgpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKG5vZGUuZWxlbWVudCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUubGVmdENoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcXVldWUuZW5xdWV1ZShub2RlLmxlZnRDaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodENoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcXVldWUuZW5xdWV1ZShub2RlLnJpZ2h0Q2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLnByZW9yZGVyVHJhdmVyc2FsQXV4ID0gZnVuY3Rpb24gKG5vZGUsIGNhbGxiYWNrLCBzaWduYWwpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgc2lnbmFsLnN0b3ApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWwuc3RvcCA9IGNhbGxiYWNrKG5vZGUuZWxlbWVudCkgPT09IGZhbHNlO1xuICAgICAgICBpZiAoc2lnbmFsLnN0b3ApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZW9yZGVyVHJhdmVyc2FsQXV4KG5vZGUubGVmdENoLCBjYWxsYmFjaywgc2lnbmFsKTtcbiAgICAgICAgaWYgKHNpZ25hbC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVvcmRlclRyYXZlcnNhbEF1eChub2RlLnJpZ2h0Q2gsIGNhbGxiYWNrLCBzaWduYWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5wb3N0b3JkZXJUcmF2ZXJzYWxBdXggPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2ssIHNpZ25hbCkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBzaWduYWwuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zdG9yZGVyVHJhdmVyc2FsQXV4KG5vZGUubGVmdENoLCBjYWxsYmFjaywgc2lnbmFsKTtcbiAgICAgICAgaWYgKHNpZ25hbC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3N0b3JkZXJUcmF2ZXJzYWxBdXgobm9kZS5yaWdodENoLCBjYWxsYmFjaywgc2lnbmFsKTtcbiAgICAgICAgaWYgKHNpZ25hbC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsLnN0b3AgPSBjYWxsYmFjayhub2RlLmVsZW1lbnQpID09PSBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUubWluaW11bUF1eCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHdoaWxlIChub2RlLmxlZnRDaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubGVmdENoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5tYXhpbXVtQXV4ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgd2hpbGUgKG5vZGUucmlnaHRDaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUucmlnaHRDaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAgKiBAcHJpdmF0ZVxuICAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLmhlaWdodEF1eCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuaGVpZ2h0QXV4KG5vZGUubGVmdENoKSwgdGhpcy5oZWlnaHRBdXgobm9kZS5yaWdodENoKSkgKyAxO1xuICAgIH07XG4gICAgLypcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLmluc2VydE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgcGFyZW50ID0gbnVsbDtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5yb290O1xuICAgICAgICB2YXIgY21wID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUobm9kZS5lbGVtZW50LCBwb3NpdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLmxlZnRDaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24ucmlnaHRDaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdHJlZSBpcyBlbXB0eVxuICAgICAgICAgICAgdGhpcy5yb290ID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbXBhcmUobm9kZS5lbGVtZW50LCBwYXJlbnQuZWxlbWVudCkgPCAwKSB7XG4gICAgICAgICAgICBwYXJlbnQubGVmdENoID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5yaWdodENoID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuY3JlYXRlTm9kZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgbGVmdENoOiBudWxsLFxuICAgICAgICAgICAgcmlnaHRDaDogbnVsbCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbFxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIEJTVHJlZTtcbn0oKSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBCU1RyZWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CU1RyZWUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIERpY3Rpb25hcnlfMSA9IHJlcXVpcmUoJy4vRGljdGlvbmFyeScpO1xudmFyIFNldF8xID0gcmVxdWlyZSgnLi9TZXQnKTtcbnZhciBCYWcgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgYmFnLlxuICAgICAqIEBjbGFzcyA8cD5BIGJhZyBpcyBhIHNwZWNpYWwga2luZCBvZiBzZXQgaW4gd2hpY2ggbWVtYmVycyBhcmVcbiAgICAgKiBhbGxvd2VkIHRvIGFwcGVhciBtb3JlIHRoYW4gb25jZS48L3A+XG4gICAgICogPHA+SWYgdGhlIGluc2VydGVkIGVsZW1lbnRzIGFyZSBjdXN0b20gb2JqZWN0cyBhIGZ1bmN0aW9uXG4gICAgICogd2hpY2ggY29udmVydHMgZWxlbWVudHMgdG8gdW5pcXVlIHN0cmluZ3MgbXVzdCBiZSBwcm92aWRlZC4gRXhhbXBsZTo8L3A+XG4gICAgICpcbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIHBldFRvU3RyaW5nKHBldCkge1xuICAgICAqICByZXR1cm4gcGV0Lm5hbWU7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOnN0cmluZz19IHRvU3RyRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZFxuICAgICAqIHRvIGNvbnZlcnQgZWxlbWVudHMgdG8gc3RyaW5ncy4gSWYgdGhlIGVsZW1lbnRzIGFyZW4ndCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKClcbiAgICAgKiBpcyBub3QgYXBwcm9wcmlhdGUsIGEgY3VzdG9tIGZ1bmN0aW9uIHdoaWNoIHJlY2VpdmVzIGFuIG9iamVjdCBhbmQgcmV0dXJucyBhXG4gICAgICogdW5pcXVlIHN0cmluZyBtdXN0IGJlIHByb3ZpZGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJhZyh0b1N0ckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMudG9TdHJGID0gdG9TdHJGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRUb1N0cmluZztcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnlfMS5kZWZhdWx0KHRoaXMudG9TdHJGKTtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEFkZHMgbkNvcGllcyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIGJhZy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IGVsZW1lbnQgdG8gYWRkLlxuICAgICogQHBhcmFtIHtudW1iZXI9fSBuQ29waWVzIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIGFkZCwgaWYgdGhpcyBhcmd1bWVudCBpc1xuICAgICogdW5kZWZpbmVkIDEgY29weSBpcyBhZGRlZC5cbiAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgdW5sZXNzIGVsZW1lbnQgaXMgdW5kZWZpbmVkLlxuICAgICovXG4gICAgQmFnLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbWVudCwgbkNvcGllcykge1xuICAgICAgICBpZiAobkNvcGllcyA9PT0gdm9pZCAwKSB7IG5Db3BpZXMgPSAxOyB9XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKGVsZW1lbnQpIHx8IG5Db3BpZXMgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250YWlucyhlbGVtZW50KSkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgY29waWVzOiBuQ29waWVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LnNldFZhbHVlKGVsZW1lbnQsIG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmdldFZhbHVlKGVsZW1lbnQpLmNvcGllcyArPSBuQ29waWVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubkVsZW1lbnRzICs9IG5Db3BpZXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgaW4gdGhpcyBiYWcuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IuLlxuICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUgb2JqZWN0LCAwIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgQmFnLnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb250YWlucyhlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LmdldFZhbHVlKGVsZW1lbnQpLmNvcGllcztcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYmFnIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCBlbGVtZW50IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGJhZyBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIEJhZy5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LmNvbnRhaW5zS2V5KGVsZW1lbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBSZW1vdmVzIG5Db3BpZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBiYWcuXG4gICAgKiBJZiB0aGUgbnVtYmVyIG9mIGNvcGllcyB0byByZW1vdmUgaXMgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyXG4gICAgKiBvZiBjb3BpZXMgaW4gdGhlIEJhZywgYWxsIGNvcGllcyBhcmUgcmVtb3ZlZC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IGVsZW1lbnQgdG8gcmVtb3ZlLlxuICAgICogQHBhcmFtIHtudW1iZXI9fSBuQ29waWVzIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIHJlbW92ZSwgaWYgdGhpcyBhcmd1bWVudCBpc1xuICAgICogdW5kZWZpbmVkIDEgY29weSBpcyByZW1vdmVkLlxuICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBhdCBsZWFzdCAxIGVsZW1lbnQgd2FzIHJlbW92ZWQuXG4gICAgKi9cbiAgICBCYWcucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBuQ29waWVzKSB7XG4gICAgICAgIGlmIChuQ29waWVzID09PSB2b2lkIDApIHsgbkNvcGllcyA9IDE7IH1cbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQoZWxlbWVudCkgfHwgbkNvcGllcyA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZGljdGlvbmFyeS5nZXRWYWx1ZShlbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChuQ29waWVzID4gbm9kZS5jb3BpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5FbGVtZW50cyAtPSBub2RlLmNvcGllcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubkVsZW1lbnRzIC09IG5Db3BpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmNvcGllcyAtPSBuQ29waWVzO1xuICAgICAgICAgICAgaWYgKG5vZGUuY29waWVzIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnkucmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgYmlnIGluIGFyYml0cmFyeSBvcmRlcixcbiAgICAgKiBpbmNsdWRpbmcgbXVsdGlwbGUgY29waWVzLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBiYWcuXG4gICAgICovXG4gICAgQmFnLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYSA9IFtdO1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5kaWN0aW9uYXJ5LnZhbHVlcygpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHZhbHVlc18xID0gdmFsdWVzOyBfaSA8IHZhbHVlc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB2YWx1ZXNfMVtfaV07XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICB2YXIgY29waWVzID0gbm9kZS5jb3BpZXM7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvcGllczsgaisrKSB7XG4gICAgICAgICAgICAgICAgYS5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHNldCBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhpcyBiYWcuXG4gICAgICogQHJldHVybiB7Y29sbGVjdGlvbnMuU2V0PFQ+fSBhIHNldCBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhpcyBiYWcuXG4gICAgICovXG4gICAgQmFnLnByb3RvdHlwZS50b1NldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRvcmV0ID0gbmV3IFNldF8xLmRlZmF1bHQodGhpcy50b1N0ckYpO1xuICAgICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmRpY3Rpb25hcnkudmFsdWVzKCk7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgZWxlbWVudHNfMSA9IGVsZW1lbnRzOyBfaSA8IGVsZW1lbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlID0gZWxlbWVudHNfMVtfaV07XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbGUudmFsdWU7XG4gICAgICAgICAgICB0b3JldC5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b3JldDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnRcbiAgICAgKiBwcmVzZW50IGluIHRoaXMgYmFnLCBpbmNsdWRpbmcgbXVsdGlwbGUgY29waWVzLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpc1xuICAgICAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6IHRoZSBlbGVtZW50LiBUbyBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAgICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAgKi9cbiAgICBCYWcucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmZvckVhY2goZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHYudmFsdWU7XG4gICAgICAgICAgICB2YXIgY29waWVzID0gdi5jb3BpZXM7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcGllczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGJhZy5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBiYWcuXG4gICAgICovXG4gICAgQmFnLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uRWxlbWVudHM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBiYWcgY29udGFpbnMgbm8gZWxlbWVudHMuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGJhZyBjb250YWlucyBubyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBCYWcucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50cyA9PT0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgYmFnLlxuICAgICAqL1xuICAgIEJhZy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubkVsZW1lbnRzID0gMDtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmNsZWFyKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFnO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IEJhZzsgLy8gRW5kIG9mIGJhZ1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmFnLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBEaWN0aW9uYXJ5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRpY3Rpb25hcnkuXG4gICAgICogQGNsYXNzIDxwPkRpY3Rpb25hcmllcyBtYXAga2V5cyB0byB2YWx1ZXM7IGVhY2gga2V5IGNhbiBtYXAgdG8gYXQgbW9zdCBvbmUgdmFsdWUuXG4gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhY2NlcHRzIGFueSBraW5kIG9mIG9iamVjdHMgYXMga2V5cy48L3A+XG4gICAgICpcbiAgICAgKiA8cD5JZiB0aGUga2V5cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBrZXlzIHRvIHVuaXF1ZVxuICAgICAqIHN0cmluZ3MgbXVzdCBiZSBwcm92aWRlZC4gRXhhbXBsZTo8L3A+XG4gICAgICogPHByZT5cbiAgICAgKiBmdW5jdGlvbiBwZXRUb1N0cmluZyhwZXQpIHtcbiAgICAgKiAgcmV0dXJuIHBldC5uYW1lO1xuICAgICAqIH1cbiAgICAgKiA8L3ByZT5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6c3RyaW5nPX0gdG9TdHJGdW5jdGlvbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkXG4gICAgICogdG8gY29udmVydCBrZXlzIHRvIHN0cmluZ3MuIElmIHRoZSBrZXlzIGFyZW4ndCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKClcbiAgICAgKiBpcyBub3QgYXBwcm9wcmlhdGUsIGEgY3VzdG9tIGZ1bmN0aW9uIHdoaWNoIHJlY2VpdmVzIGEga2V5IGFuZCByZXR1cm5zIGFcbiAgICAgKiB1bmlxdWUgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gRGljdGlvbmFyeSh0b1N0ckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMudGFibGUgPSB7fTtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgICAgICB0aGlzLnRvU3RyID0gdG9TdHJGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRUb1N0cmluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhpcyBkaWN0aW9uYXJ5IG1hcHMgdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBrZXkga2V5IHdob3NlIGFzc29jaWF0ZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQuXG4gICAgICogQHJldHVybiB7Kn0gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZGljdGlvbmFyeSBtYXBzIHRoZSBzcGVjaWZpZWQga2V5IG9yXG4gICAgICogdW5kZWZpbmVkIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuXG4gICAgICovXG4gICAgRGljdGlvbmFyeS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBwYWlyID0gdGhpcy50YWJsZVsnJCcgKyB0aGlzLnRvU3RyKGtleSldO1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChwYWlyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFpci52YWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFzc29jaWF0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgZGljdGlvbmFyeS5cbiAgICAgKiBJZiB0aGUgZGljdGlvbmFyeSBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yIHRoaXMga2V5LCB0aGUgb2xkXG4gICAgICogdmFsdWUgaXMgcmVwbGFjZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmVcbiAgICAgKiBhc3NvY2lhdGVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogQHJldHVybiB7Kn0gcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3IgdGhlIGtleSBvciBpZiB0aGUga2V5L3ZhbHVlIGFyZSB1bmRlZmluZWQuXG4gICAgICovXG4gICAgRGljdGlvbmFyeS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChrZXkpIHx8IHV0aWwuaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXQ7XG4gICAgICAgIHZhciBrID0gJyQnICsgdGhpcy50b1N0cihrZXkpO1xuICAgICAgICB2YXIgcHJldmlvdXNFbGVtZW50ID0gdGhpcy50YWJsZVtrXTtcbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQocHJldmlvdXNFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5uRWxlbWVudHMrKztcbiAgICAgICAgICAgIHJldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldCA9IHByZXZpb3VzRWxlbWVudC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlW2tdID0ge1xuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgZm9yIHRoaXMga2V5IGZyb20gdGhpcyBkaWN0aW9uYXJ5IGlmIGl0IGlzIHByZXNlbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2hvc2UgbWFwcGluZyBpcyB0byBiZSByZW1vdmVkIGZyb20gdGhlXG4gICAgICogZGljdGlvbmFyeS5cbiAgICAgKiBAcmV0dXJuIHsqfSBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIGtleS5cbiAgICAgKi9cbiAgICBEaWN0aW9uYXJ5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBrID0gJyQnICsgdGhpcy50b1N0cihrZXkpO1xuICAgICAgICB2YXIgcHJldmlvdXNFbGVtZW50ID0gdGhpcy50YWJsZVtrXTtcbiAgICAgICAgaWYgKCF1dGlsLmlzVW5kZWZpbmVkKHByZXZpb3VzRWxlbWVudCkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhYmxlW2tdO1xuICAgICAgICAgICAgdGhpcy5uRWxlbWVudHMtLTtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c0VsZW1lbnQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGtleXMgaW4gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgRGljdGlvbmFyeS5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIG5hbWVfMSBpbiB0aGlzLnRhYmxlKSB7XG4gICAgICAgICAgICBpZiAodXRpbC5oYXModGhpcy50YWJsZSwgbmFtZV8xKSkge1xuICAgICAgICAgICAgICAgIHZhciBwYWlyID0gdGhpcy50YWJsZVtuYW1lXzFdO1xuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gocGFpci5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICAqL1xuICAgIERpY3Rpb25hcnkucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIG5hbWVfMiBpbiB0aGlzLnRhYmxlKSB7XG4gICAgICAgICAgICBpZiAodXRpbC5oYXModGhpcy50YWJsZSwgbmFtZV8yKSkge1xuICAgICAgICAgICAgICAgIHZhciBwYWlyID0gdGhpcy50YWJsZVtuYW1lXzJdO1xuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gocGFpci52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBrZXktdmFsdWUgcGFpclxuICAgICogcHJlc2VudCBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czoga2V5IGFuZCB2YWx1ZS4gVG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuXG4gICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAqL1xuICAgIERpY3Rpb25hcnkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZV8zIGluIHRoaXMudGFibGUpIHtcbiAgICAgICAgICAgIGlmICh1dGlsLmhhcyh0aGlzLnRhYmxlLCBuYW1lXzMpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhaXIgPSB0aGlzLnRhYmxlW25hbWVfM107XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IGNhbGxiYWNrKHBhaXIua2V5LCBwYWlyLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBkaWN0aW9uYXJ5IGlzIHRvIGJlXG4gICAgICogdGVzdGVkLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlXG4gICAgICogc3BlY2lmaWVkIGtleS5cbiAgICAgKi9cbiAgICBEaWN0aW9uYXJ5LnByb3RvdHlwZS5jb250YWluc0tleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuICF1dGlsLmlzVW5kZWZpbmVkKHRoaXMuZ2V0VmFsdWUoa2V5KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICogQHRoaXMge2NvbGxlY3Rpb25zLkRpY3Rpb25hcnl9XG4gICAgKi9cbiAgICBEaWN0aW9uYXJ5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50YWJsZSA9IHt9O1xuICAgICAgICB0aGlzLm5FbGVtZW50cyA9IDA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgRGljdGlvbmFyeS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubkVsZW1lbnRzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGljdGlvbmFyeSBjb250YWlucyBubyBtYXBwaW5ncy5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgZGljdGlvbmFyeSBjb250YWlucyBubyBtYXBwaW5ncy5cbiAgICAgKi9cbiAgICBEaWN0aW9uYXJ5LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uRWxlbWVudHMgPD0gMDtcbiAgICB9O1xuICAgIERpY3Rpb25hcnkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdG9yZXQgPSAneyc7XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoaywgdikge1xuICAgICAgICAgICAgdG9yZXQgKz0gXCJcXG5cXHRcIiArIGsgKyBcIiA6IFwiICsgdjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0b3JldCArICdcXG59JztcbiAgICB9O1xuICAgIHJldHVybiBEaWN0aW9uYXJ5O1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IERpY3Rpb25hcnk7IC8vIEVuZCBvZiBkaWN0aW9uYXJ5XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWN0aW9uYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgRGljdGlvbmFyeV8xID0gcmVxdWlyZSgnLi9EaWN0aW9uYXJ5Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIEZhY3RvcnlEaWN0aW9uYXJ5ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmFjdG9yeURpY3Rpb25hcnksIF9zdXBlcik7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBkaWN0aW9uYXJ5LlxuICAgICAqIEBjbGFzcyA8cD5EaWN0aW9uYXJpZXMgbWFwIGtleXMgdG8gdmFsdWVzOyBlYWNoIGtleSBjYW4gbWFwIHRvIGF0IG1vc3Qgb25lIHZhbHVlLlxuICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWNjZXB0cyBhbnkga2luZCBvZiBvYmplY3RzIGFzIGtleXMuPC9wPlxuICAgICAqXG4gICAgICogPHA+VGhlIGRlZmF1bHQgZmFjdG9yeSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgbmV3IG9iamVjdCBvZiB0aGUgcHJvdmlkZWRcbiAgICAgKiB0eXBlLiBFeGFtcGxlOjwvcD5cbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIHBldEZhY3RvcnkoKSB7XG4gICAgICogIHJldHVybiBuZXcgUGV0KCk7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogPHA+SWYgdGhlIGtleXMgYXJlIGN1c3RvbSBvYmplY3RzIGEgZnVuY3Rpb24gd2hpY2ggY29udmVydHMga2V5cyB0byB1bmlxdWVcbiAgICAgKiBzdHJpbmdzIG11c3QgYmUgcHJvdmlkZWQuIEV4YW1wbGU6PC9wPlxuICAgICAqIDxwcmU+XG4gICAgICogZnVuY3Rpb24gcGV0VG9TdHJpbmcocGV0KSB7XG4gICAgICogIHJldHVybiBwZXQubmFtZTtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOlY9fSBkZWZhdWx0RmFjdG9yeUZ1bmN0aW9uIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGFcbiAgICAgKiBkZWZhdWx0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6c3RyaW5nPX0gdG9TdHJGdW5jdGlvbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkXG4gICAgICogdG8gY29udmVydCBrZXlzIHRvIHN0cmluZ3MuIElmIHRoZSBrZXlzIGFyZW4ndCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKClcbiAgICAgKiBpcyBub3QgYXBwcm9wcmlhdGUsIGEgY3VzdG9tIGZ1bmN0aW9uIHdoaWNoIHJlY2VpdmVzIGEga2V5IGFuZCByZXR1cm5zIGFcbiAgICAgKiB1bmlxdWUgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gRmFjdG9yeURpY3Rpb25hcnkoZGVmYXVsdEZhY3RvcnlGdW5jdGlvbiwgdG9TdHJGdW5jdGlvbikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0b1N0ckZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0RmFjdG9yeUZ1bmN0aW9uID0gZGVmYXVsdEZhY3RvcnlGdW5jdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIGRpY3Rpb25hcnksXG4gICAgICogaWYgaXQgZGlkbid0IGNvbnRhaW4gdGhlIGtleSB5ZXQuIElmIHRoZSBrZXkgZXhpc3RlZCwgdGhlIGV4aXN0aW5nIHZhbHVlIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmVcbiAgICAgKiBhc3NvY2lhdGVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0VmFsdWUgZGVmYXVsdCB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogQHJldHVybiB7Kn0gcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciB0aGUgZGVmYXVsdCB2YWx1ZSxcbiAgICAgKiBpZiB0aGUga2V5IGRpZG4ndCBleGlzdCB5ZXQuXG4gICAgICovXG4gICAgRmFjdG9yeURpY3Rpb25hcnkucHJvdG90eXBlLnNldERlZmF1bHQgPSBmdW5jdGlvbiAoa2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IF9zdXBlci5wcm90b3R5cGUuZ2V0VmFsdWUuY2FsbCh0aGlzLCBrZXkpO1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChjdXJyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZGljdGlvbmFyeSBtYXBzIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqIFJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGNyZWF0ZWQgYnkgdGhlIGZhY3RvcnkgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvcixcbiAgICAgKiBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuIFRoZSBtaXNzaW5nIGtleSB3aWxsXG4gICAgICogYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIGRpY3Rpb25hcnkgbWFwcyB0aGUgc3BlY2lmaWVkIGtleSBvclxuICAgICAqIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LlxuICAgICAqL1xuICAgIEZhY3RvcnlEaWN0aW9uYXJ5LnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RGVmYXVsdChrZXksIHRoaXMuZGVmYXVsdEZhY3RvcnlGdW5jdGlvbigpKTtcbiAgICB9O1xuICAgIHJldHVybiBGYWN0b3J5RGljdGlvbmFyeTtcbn0oRGljdGlvbmFyeV8xLmRlZmF1bHQpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IEZhY3RvcnlEaWN0aW9uYXJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmFjdG9yeURpY3Rpb25hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgY29sbGVjdGlvbnMgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBhcnJheXMgPSByZXF1aXJlKCcuL2FycmF5cycpO1xudmFyIEhlYXAgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgSGVhcC5cbiAgICAgKiBAY2xhc3NcbiAgICAgKiA8cD5BIGhlYXAgaXMgYSBiaW5hcnkgdHJlZSwgd2hlcmUgdGhlIG5vZGVzIG1haW50YWluIHRoZSBoZWFwIHByb3BlcnR5OlxuICAgICAqIGVhY2ggbm9kZSBpcyBzbWFsbGVyIHRoYW4gZWFjaCBvZiBpdHMgY2hpbGRyZW4gYW5kIHRoZXJlZm9yZSBhIE1pbkhlYXBcbiAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gYXJyYXkgdG8gc3RvcmUgZWxlbWVudHMuPC9wPlxuICAgICAqIDxwPklmIHRoZSBpbnNlcnRlZCBlbGVtZW50cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBjb21wYXJlIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQsXG4gICAgICogIGF0IGNvbnN0cnVjdGlvbiB0aW1lLCBvdGhlcndpc2UgdGhlIDw9LCA9PT0gYW5kID49IG9wZXJhdG9ycyBhcmVcbiAgICAgKiB1c2VkIHRvIGNvbXBhcmUgZWxlbWVudHMuIEV4YW1wbGU6PC9wPlxuICAgICAqXG4gICAgICogPHByZT5cbiAgICAgKiBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICAgKiAgaWYgKGEgaXMgbGVzcyB0aGFuIGIgYnkgc29tZSBvcmRlcmluZyBjcml0ZXJpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIC0xO1xuICAgICAqICB9IGlmIChhIGlzIGdyZWF0ZXIgdGhhbiBiIGJ5IHRoZSBvcmRlcmluZyBjcml0ZXJpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIDE7XG4gICAgICogIH1cbiAgICAgKiAgLy8gYSBtdXN0IGJlIGVxdWFsIHRvIGJcbiAgICAgKiAgcmV0dXJuIDA7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogPHA+SWYgYSBNYXgtSGVhcCBpcyB3YW50ZWQgKGdyZWF0ZXIgZWxlbWVudHMgb24gdG9wKSB5b3UgY2FuIGEgcHJvdmlkZSBhXG4gICAgICogcmV2ZXJzZSBjb21wYXJlIGZ1bmN0aW9uIHRvIGFjY29tcGxpc2ggdGhhdCBiZWhhdmlvci4gRXhhbXBsZTo8L3A+XG4gICAgICpcbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIHJldmVyc2VDb21wYXJlKGEsIGIpIHtcbiAgICAgKiAgaWYgKGEgaXMgbGVzcyB0aGFuIGIgYnkgc29tZSBvcmRlcmluZyBjcml0ZXJpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIDE7XG4gICAgICogIH0gaWYgKGEgaXMgZ3JlYXRlciB0aGFuIGIgYnkgdGhlIG9yZGVyaW5nIGNyaXRlcmlvbikge1xuICAgICAqICAgICByZXR1cm4gLTE7XG4gICAgICogIH1cbiAgICAgKiAgLy8gYSBtdXN0IGJlIGVxdWFsIHRvIGJcbiAgICAgKiAgcmV0dXJuIDA7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpudW1iZXI9fSBjb21wYXJlRnVuY3Rpb24gb3B0aW9uYWxcbiAgICAgKiBmdW5jdGlvbiB1c2VkIHRvIGNvbXBhcmUgdHdvIGVsZW1lbnRzLiBNdXN0IHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsXG4gICAgICogemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLFxuICAgICAqIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEhlYXAoY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcnJheSB1c2VkIHRvIHN0b3JlIHRoZSBlbGVtZW50cyBvZCB0aGUgaGVhcC5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxPYmplY3Q+fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmVGdW5jdGlvbiB8fCBjb2xsZWN0aW9ucy5kZWZhdWx0Q29tcGFyZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxlZnQgY2hpbGQgb2YgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSW5kZXggVGhlIGluZGV4IG9mIHRoZSBub2RlIHRvIGdldCB0aGUgbGVmdCBjaGlsZFxuICAgICAqIGZvci5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBjaGlsZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEhlYXAucHJvdG90eXBlLmxlZnRDaGlsZEluZGV4ID0gZnVuY3Rpb24gKG5vZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gKDIgKiBub2RlSW5kZXgpICsgMTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSByaWdodCBjaGlsZCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJbmRleCBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gZ2V0IHRoZSByaWdodCBjaGlsZFxuICAgICAqIGZvci5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgY2hpbGQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5yaWdodENoaWxkSW5kZXggPSBmdW5jdGlvbiAobm9kZUluZGV4KSB7XG4gICAgICAgIHJldHVybiAoMiAqIG5vZGVJbmRleCkgKyAyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHBhcmVudCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJbmRleCBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gZ2V0IHRoZSBwYXJlbnQgZm9yLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBwYXJlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5wYXJlbnRJbmRleCA9IGZ1bmN0aW9uIChub2RlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKG5vZGVJbmRleCAtIDEpIC8gMik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc21hbGxlciBjaGlsZCBub2RlIChpZiBpdCBleGlzdHMpLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0Q2hpbGQgbGVmdCBjaGlsZCBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmlnaHRDaGlsZCByaWdodCBjaGlsZCBpbmRleC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRleCB3aXRoIHRoZSBtaW5pbXVtIHZhbHVlIG9yIC0xIGlmIGl0IGRvZXNuJ3RcbiAgICAgKiBleGlzdHMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5taW5JbmRleCA9IGZ1bmN0aW9uIChsZWZ0Q2hpbGQsIHJpZ2h0Q2hpbGQpIHtcbiAgICAgICAgaWYgKHJpZ2h0Q2hpbGQgPj0gdGhpcy5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGxlZnRDaGlsZCA+PSB0aGlzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRDaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmUodGhpcy5kYXRhW2xlZnRDaGlsZF0sIHRoaXMuZGF0YVtyaWdodENoaWxkXSkgPD0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0Q2hpbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHRDaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4IHVwIHRvIGl0cyBwcm9wZXIgcGxhY2UgaW4gdGhlIGhlYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgbm9kZSB0byBtb3ZlIHVwLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSGVhcC5wcm90b3R5cGUuc2lmdFVwID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudEluZGV4KGluZGV4KTtcbiAgICAgICAgd2hpbGUgKGluZGV4ID4gMCAmJiB0aGlzLmNvbXBhcmUodGhpcy5kYXRhW3BhcmVudF0sIHRoaXMuZGF0YVtpbmRleF0pID4gMCkge1xuICAgICAgICAgICAgYXJyYXlzLnN3YXAodGhpcy5kYXRhLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50O1xuICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnRJbmRleChpbmRleCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCBkb3duIHRvIGl0cyBwcm9wZXIgcGxhY2UgaW4gdGhlIGhlYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJbmRleCBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gbW92ZSBkb3duLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSGVhcC5wcm90b3R5cGUuc2lmdERvd24gPSBmdW5jdGlvbiAobm9kZUluZGV4KSB7XG4gICAgICAgIC8vc21hbGxlciBjaGlsZCBpbmRleFxuICAgICAgICB2YXIgbWluID0gdGhpcy5taW5JbmRleCh0aGlzLmxlZnRDaGlsZEluZGV4KG5vZGVJbmRleCksIHRoaXMucmlnaHRDaGlsZEluZGV4KG5vZGVJbmRleCkpO1xuICAgICAgICB3aGlsZSAobWluID49IDAgJiYgdGhpcy5jb21wYXJlKHRoaXMuZGF0YVtub2RlSW5kZXhdLCB0aGlzLmRhdGFbbWluXSkgPiAwKSB7XG4gICAgICAgICAgICBhcnJheXMuc3dhcCh0aGlzLmRhdGEsIG1pbiwgbm9kZUluZGV4KTtcbiAgICAgICAgICAgIG5vZGVJbmRleCA9IG1pbjtcbiAgICAgICAgICAgIG1pbiA9IHRoaXMubWluSW5kZXgodGhpcy5sZWZ0Q2hpbGRJbmRleChub2RlSW5kZXgpLCB0aGlzLnJpZ2h0Q2hpbGRJbmRleChub2RlSW5kZXgpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGJ1dCBkb2VzIG5vdCByZW1vdmUgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIGhlYXAuXG4gICAgICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGF0IHRoZSByb290IG9mIHRoZSBoZWFwLiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGVcbiAgICAgKiBoZWFwIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEhlYXAucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVswXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgaW50byB0aGUgaGVhcC5cbiAgICAgKiBAcGFyYW0geyp9IGVsZW1lbnQgdGhlIGVsZW1lbnQuXG4gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBhZGRlZCBvciBmYWxzIGlmIGl0IGlzIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbnMuaXNVbmRlZmluZWQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhLnB1c2goZWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2lmdFVwKHRoaXMuZGF0YS5sZW5ndGggLSAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIGhlYXAuXG4gICAgICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIHJlbW92ZWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgaGVhcC4gUmV0dXJuc1xuICAgICAqIHVuZGVmaW5lZCBpZiB0aGUgaGVhcCBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5yZW1vdmVSb290ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLmRhdGFbMF07XG4gICAgICAgICAgICB0aGlzLmRhdGFbMF0gPSB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNwbGljZSh0aGlzLmRhdGEubGVuZ3RoIC0gMSwgMSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZnREb3duKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaGVhcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBIZWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgZmFsc2VcbiAgICAgKiBvdGhlcndpc2UuXG4gICAgICovXG4gICAgSGVhcC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgZXF1RiA9IGNvbGxlY3Rpb25zLmNvbXBhcmVUb0VxdWFscyh0aGlzLmNvbXBhcmUpO1xuICAgICAgICByZXR1cm4gYXJyYXlzLmNvbnRhaW5zKHRoaXMuZGF0YSwgZWxlbWVudCwgZXF1Rik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBoZWFwLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGhlYXAuXG4gICAgICovXG4gICAgSGVhcC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBoZWFwIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBoZWFwIGNvbnRhaW5zIG5vIGl0ZW1zOyBmYWxzZVxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA8PSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBoZWFwLlxuICAgICAqL1xuICAgIEhlYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRhdGEubGVuZ3RoID0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIGhlYXAgaW5cbiAgICAgKiBubyBwYXJ0aWN1bGFyIG9yZGVyLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpc1xuICAgICAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6IHRoZSBlbGVtZW50IHZhbHVlLCB0byBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAgICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGFycmF5cy5mb3JFYWNoKHRoaXMuZGF0YSwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgcmV0dXJuIEhlYXA7XG59KCkpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gSGVhcDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhlYXAuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBEaWN0aW9uYXJ5XzEgPSByZXF1aXJlKCcuL0RpY3Rpb25hcnknKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgTGlua2VkRGljdGlvbmFyeSBJbnRlcm5hbGx5XG4gKiBIYXMgdG8gYmUgYSBjbGFzcywgbm90IGFuIGludGVyZmFjZSwgYmVjYXVzZSBpdCBuZWVkcyB0byBoYXZlXG4gKiB0aGUgJ3VubGluaycgZnVuY3Rpb24gZGVmaW5lZC5cbiAqL1xudmFyIExpbmtlZERpY3Rpb25hcnlQYWlyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMaW5rZWREaWN0aW9uYXJ5UGFpcihrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIExpbmtlZERpY3Rpb25hcnlQYWlyLnByb3RvdHlwZS51bmxpbmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJldi5uZXh0ID0gdGhpcy5uZXh0O1xuICAgICAgICB0aGlzLm5leHQucHJldiA9IHRoaXMucHJldjtcbiAgICB9O1xuICAgIHJldHVybiBMaW5rZWREaWN0aW9uYXJ5UGFpcjtcbn0oKSk7XG52YXIgTGlua2VkRGljdGlvbmFyeSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKExpbmtlZERpY3Rpb25hcnksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGlua2VkRGljdGlvbmFyeSh0b1N0ckZ1bmN0aW9uKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHRvU3RyRnVuY3Rpb24pO1xuICAgICAgICB0aGlzLmhlYWQgPSBuZXcgTGlua2VkRGljdGlvbmFyeVBhaXIobnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMudGFpbCA9IG5ldyBMaW5rZWREaWN0aW9uYXJ5UGFpcihudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5oZWFkLm5leHQgPSB0aGlzLnRhaWw7XG4gICAgICAgIHRoaXMudGFpbC5wcmV2ID0gdGhpcy5oZWFkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSBuZXcgbm9kZSB0byB0aGUgJ3RhaWwnIG9mIHRoZSBsaXN0LCB1cGRhdGluZyB0aGVcbiAgICAgKiBuZWlnaGJvcnMsIGFuZCBtb3ZpbmcgJ3RoaXMudGFpbCcgKHRoZSBFbmQgb2YgTGlzdCBpbmRpY2F0b3IpIHRoYXRcbiAgICAgKiB0byB0aGUgZW5kLlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLmFwcGVuZFRvVGFpbCA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB2YXIgbGFzdE5vZGUgPSB0aGlzLnRhaWwucHJldjtcbiAgICAgICAgbGFzdE5vZGUubmV4dCA9IGVudHJ5O1xuICAgICAgICBlbnRyeS5wcmV2ID0gbGFzdE5vZGU7XG4gICAgICAgIGVudHJ5Lm5leHQgPSB0aGlzLnRhaWw7XG4gICAgICAgIHRoaXMudGFpbC5wcmV2ID0gZW50cnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSBsaW5rZWQgZGljdGlvbmFyeSBmcm9tIHRoZSB0YWJsZSBpbnRlcm5hbGx5XG4gICAgICovXG4gICAgTGlua2VkRGljdGlvbmFyeS5wcm90b3R5cGUuZ2V0TGlua2VkRGljdGlvbmFyeVBhaXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGsgPSAnJCcgKyB0aGlzLnRvU3RyKGtleSk7XG4gICAgICAgIHZhciBwYWlyID0gKHRoaXMudGFibGVba10pO1xuICAgICAgICByZXR1cm4gcGFpcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZGljdGlvbmFyeSBtYXBzIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoaXMgZGljdGlvbmFyeSBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGlzIGtleS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIGRpY3Rpb25hcnkgbWFwcyB0aGUgc3BlY2lmaWVkIGtleSBvclxuICAgICAqIHVuZGVmaW5lZCBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgcGFpciA9IHRoaXMuZ2V0TGlua2VkRGljdGlvbmFyeVBhaXIoa2V5KTtcbiAgICAgICAgaWYgKCF1dGlsLmlzVW5kZWZpbmVkKHBhaXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFpci52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBmb3IgdGhpcyBrZXkgZnJvbSB0aGlzIGRpY3Rpb25hcnkgaWYgaXQgaXMgcHJlc2VudC5cbiAgICAgKiBBbHNvLCBpZiBhIHZhbHVlIGlzIHByZXNlbnQgZm9yIHRoaXMga2V5LCB0aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZVxuICAgICAqIGluc2VydGlvbiBvcmRlcmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBtYXBwaW5nIGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LlxuICAgICAqIEByZXR1cm4geyp9IHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5LCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHBhaXIgPSB0aGlzLmdldExpbmtlZERpY3Rpb25hcnlQYWlyKGtleSk7XG4gICAgICAgIGlmICghdXRpbC5pc1VuZGVmaW5lZChwYWlyKSkge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzLCBrZXkpOyAvLyBUaGlzIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIHRhYmxlXG4gICAgICAgICAgICBwYWlyLnVubGluaygpOyAvLyBUaGlzIHdpbGwgdW5saW5rIGl0IGZyb20gdGhlIGNoYWluXG4gICAgICAgICAgICByZXR1cm4gcGFpci52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgTGlua2VkRGljdGlvbmFyeS5cbiAgICAqIEB0aGlzIHtjb2xsZWN0aW9ucy5MaW5rZWREaWN0aW9uYXJ5fVxuICAgICovXG4gICAgTGlua2VkRGljdGlvbmFyeS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuY2xlYXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5oZWFkLm5leHQgPSB0aGlzLnRhaWw7XG4gICAgICAgIHRoaXMudGFpbC5wcmV2ID0gdGhpcy5oZWFkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIEtleVZhbHVlIHBhaXIuXG4gICAgICogSXQgcGxhY2VzIHRoZSBuZXcgdmFsdWUgaW5kZXhlZCBieSBrZXkgaW50byB0aGUgdGFibGUsIGJ1dCBtYWludGFpbnNcbiAgICAgKiBpdHMgcGxhY2UgaW4gdGhlIGxpbmtlZCBvcmRlcmluZy5cbiAgICAgKi9cbiAgICBMaW5rZWREaWN0aW9uYXJ5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKG9sZFBhaXIsIG5ld1BhaXIpIHtcbiAgICAgICAgdmFyIGsgPSAnJCcgKyB0aGlzLnRvU3RyKG5ld1BhaXIua2V5KTtcbiAgICAgICAgLy8gc2V0IHRoZSBuZXcgUGFpcidzIGxpbmtzIHRvIGV4aXN0aW5nUGFpcidzIGxpbmtzXG4gICAgICAgIG5ld1BhaXIubmV4dCA9IG9sZFBhaXIubmV4dDtcbiAgICAgICAgbmV3UGFpci5wcmV2ID0gb2xkUGFpci5wcmV2O1xuICAgICAgICAvLyBEZWxldGUgRXhpc3RpbmcgUGFpciBmcm9tIHRoZSB0YWJsZSwgdW5saW5rIGl0IGZyb20gY2hhaW4uXG4gICAgICAgIC8vIEFzIGEgcmVzdWx0LCB0aGUgbkVsZW1lbnRzIGdldHMgZGVjcmVtZW50ZWQgYnkgdGhpcyBvcGVyYXRpb25cbiAgICAgICAgdGhpcy5yZW1vdmUob2xkUGFpci5rZXkpO1xuICAgICAgICAvLyBMaW5rIG5ldyBQYWlyIGluIHBsYWNlIG9mIHdoZXJlIG9sZFBhaXIgd2FzLFxuICAgICAgICAvLyBieSBwb2ludGluZyB0aGUgb2xkIHBhaXIncyBuZWlnaGJvcnMgdG8gaXQuXG4gICAgICAgIG5ld1BhaXIucHJldi5uZXh0ID0gbmV3UGFpcjtcbiAgICAgICAgbmV3UGFpci5uZXh0LnByZXYgPSBuZXdQYWlyO1xuICAgICAgICB0aGlzLnRhYmxlW2tdID0gbmV3UGFpcjtcbiAgICAgICAgLy8gVG8gbWFrZSB1cCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdhcyBkZWNyZW1lbnRlZCxcbiAgICAgICAgLy8gV2UgbmVlZCB0byBpbmNyZWFzZSBpdCBieSBvbmUuXG4gICAgICAgICsrdGhpcy5uRWxlbWVudHM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogSWYgdGhlIGRpY3Rpb25hcnkgcHJldmlvdXNseSBjb250YWluZWQgYSBtYXBwaW5nIGZvciB0aGlzIGtleSwgdGhlIG9sZFxuICAgICAqIHZhbHVlIGlzIHJlcGxhY2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gICAgICogVXBkYXRpbmcgb2YgYSBrZXkgdGhhdCBhbHJlYWR5IGV4aXN0cyBtYWludGFpbnMgaXRzIHBsYWNlIGluIHRoZVxuICAgICAqIGluc2VydGlvbiBvcmRlciBpbnRvIHRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlXG4gICAgICogYXNzb2NpYXRlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqIEByZXR1cm4geyp9IHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIHRoZSBrZXkgb3IgaWYgdGhlIGtleS92YWx1ZSBhcmUgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQoa2V5KSB8fCB1dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXhpc3RpbmdQYWlyID0gdGhpcy5nZXRMaW5rZWREaWN0aW9uYXJ5UGFpcihrZXkpO1xuICAgICAgICB2YXIgbmV3UGFpciA9IG5ldyBMaW5rZWREaWN0aW9uYXJ5UGFpcihrZXksIHZhbHVlKTtcbiAgICAgICAgdmFyIGsgPSAnJCcgKyB0aGlzLnRvU3RyKGtleSk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZWxlbWVudCBmb3IgdGhhdCBrZXksIHdlXG4gICAgICAgIC8vIGtlZXAgaXQncyBwbGFjZSBpbiB0aGUgTGlua2VkTGlzdFxuICAgICAgICBpZiAoIXV0aWwuaXNVbmRlZmluZWQoZXhpc3RpbmdQYWlyKSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKGV4aXN0aW5nUGFpciwgbmV3UGFpcik7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdQYWlyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRUb1RhaWwobmV3UGFpcik7XG4gICAgICAgICAgICB0aGlzLnRhYmxlW2tdID0gbmV3UGFpcjtcbiAgICAgICAgICAgICsrdGhpcy5uRWxlbWVudHM7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBrZXlzIGluIHRoaXMgTGlua2VkRGljdGlvbmFyeSwgb3JkZXJlZFxuICAgICAqIGJ5IGluc2VydGlvbiBvcmRlci5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGtleXMgaW4gdGhpcyBMaW5rZWREaWN0aW9uYXJ5LFxuICAgICAqIG9yZGVyZWQgYnkgaW5zZXJ0aW9uIG9yZGVyLlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGlzIExpbmtlZERpY3Rpb25hcnksIG9yZGVyZWQgYnlcbiAgICAgKiBpbnNlcnRpb24gb3JkZXIuXG4gICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gdGhpcyBMaW5rZWREaWN0aW9uYXJ5LFxuICAgICAqIG9yZGVyZWQgYnkgaW5zZXJ0aW9uIG9yZGVyLlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyXG4gICAgKiBwcmVzZW50IGluIHRoaXMgTGlua2VkRGljdGlvbmFyeS4gSXQgaXMgZG9uZSBpbiB0aGUgb3JkZXIgb2YgaW5zZXJ0aW9uXG4gICAgKiBpbnRvIHRoZSBMaW5rZWREaWN0aW9uYXJ5XG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czoga2V5IGFuZCB2YWx1ZS4gVG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuXG4gICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNyYXdsTm9kZSA9IHRoaXMuaGVhZC5uZXh0O1xuICAgICAgICB3aGlsZSAoY3Jhd2xOb2RlLm5leHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHJldCA9IGNhbGxiYWNrKGNyYXdsTm9kZS5rZXksIGNyYXdsTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNyYXdsTm9kZSA9IGNyYXdsTm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTGlua2VkRGljdGlvbmFyeTtcbn0oRGljdGlvbmFyeV8xLmRlZmF1bHQpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IExpbmtlZERpY3Rpb25hcnk7IC8vIEVuZCBvZiBMaW5rZWREaWN0aW9uYXJ5XG4vLyAvKipcbi8vICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIGRpY3Rpb25hcnkuXG4vLyAgKiBUd28gZGljdGlvbmFyaWVzIGFyZSBlcXVhbCBpZiB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgbWFwcGluZ3MuXG4vLyAgKiBAcGFyYW0ge2NvbGxlY3Rpb25zLkRpY3Rpb25hcnl9IG90aGVyIHRoZSBvdGhlciBkaWN0aW9uYXJ5LlxuLy8gICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpib29sZWFuPX0gdmFsdWVzRXF1YWxGdW5jdGlvbiBvcHRpb25hbFxuLy8gICogZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0d28gdmFsdWVzIGFyZSBlcXVhbC5cbi8vICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBkaWN0aW9uYXJ5LlxuLy8gICovXG4vLyBjb2xsZWN0aW9ucy5EaWN0aW9uYXJ5LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcix2YWx1ZXNFcXVhbEZ1bmN0aW9uKSB7XG4vLyBcdGNvbnN0IGVxRiA9IHZhbHVlc0VxdWFsRnVuY3Rpb24gfHwgY29sbGVjdGlvbnMuZGVmYXVsdEVxdWFscztcbi8vIFx0aWYoIShvdGhlciBpbnN0YW5jZW9mIGNvbGxlY3Rpb25zLkRpY3Rpb25hcnkpKXtcbi8vIFx0XHRyZXR1cm4gZmFsc2U7XG4vLyBcdH1cbi8vIFx0aWYodGhpcy5zaXplKCkgIT09IG90aGVyLnNpemUoKSl7XG4vLyBcdFx0cmV0dXJuIGZhbHNlO1xuLy8gXHR9XG4vLyBcdHJldHVybiB0aGlzLmVxdWFsc0F1eCh0aGlzLmZpcnN0Tm9kZSxvdGhlci5maXJzdE5vZGUsZXFGKTtcbi8vIH1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxpbmtlZERpY3Rpb25hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGFycmF5cyA9IHJlcXVpcmUoJy4vYXJyYXlzJyk7XG52YXIgTGlua2VkTGlzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIGFuIGVtcHR5IExpbmtlZCBMaXN0LlxuICAgICogQGNsYXNzIEEgbGlua2VkIGxpc3QgaXMgYSBkYXRhIHN0cnVjdHVyZSBjb25zaXN0aW5nIG9mIGEgZ3JvdXAgb2Ygbm9kZXNcbiAgICAqIHdoaWNoIHRvZ2V0aGVyIHJlcHJlc2VudCBhIHNlcXVlbmNlLlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBmdW5jdGlvbiBMaW5rZWRMaXN0KCkge1xuICAgICAgICAvKipcbiAgICAgICAgKiBGaXJzdCBub2RlIGluIHRoZSBsaXN0XG4gICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpcnN0Tm9kZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAqIExhc3Qgbm9kZSBpbiB0aGUgbGlzdFxuICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICogQHByaXZhdGVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sYXN0Tm9kZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAqIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICogQHByaXZhdGVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEFkZHMgYW4gZWxlbWVudCB0byB0aGlzIGxpc3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbSBlbGVtZW50IHRvIGJlIGFkZGVkLlxuICAgICogQHBhcmFtIHtudW1iZXI9fSBpbmRleCBvcHRpb25hbCBpbmRleCB0byBhZGQgdGhlIGVsZW1lbnQuIElmIG5vIGluZGV4IGlzIHNwZWNpZmllZFxuICAgICogdGhlIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGlzIGxpc3QuXG4gICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBhZGRlZCBvciBmYWxzZSBpZiB0aGUgaW5kZXggaXMgaW52YWxpZFxuICAgICogb3IgaWYgdGhlIGVsZW1lbnQgaXMgdW5kZWZpbmVkLlxuICAgICovXG4gICAgTGlua2VkTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKGluZGV4KSkge1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLm5FbGVtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy5uRWxlbWVudHMgfHwgdXRpbC5pc1VuZGVmaW5lZChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdOb2RlID0gdGhpcy5jcmVhdGVOb2RlKGl0ZW0pO1xuICAgICAgICBpZiAodGhpcy5uRWxlbWVudHMgPT09IDApIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IG5vZGUgaW4gdGhlIGxpc3QuXG4gICAgICAgICAgICB0aGlzLmZpcnN0Tm9kZSA9IG5ld05vZGU7XG4gICAgICAgICAgICB0aGlzLmxhc3ROb2RlID0gbmV3Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gdGhpcy5uRWxlbWVudHMpIHtcbiAgICAgICAgICAgIC8vIEluc2VydCBhdCB0aGUgZW5kLlxuICAgICAgICAgICAgdGhpcy5sYXN0Tm9kZS5uZXh0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIHRoaXMubGFzdE5vZGUgPSBuZXdOb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAvLyBDaGFuZ2UgZmlyc3Qgbm9kZS5cbiAgICAgICAgICAgIG5ld05vZGUubmV4dCA9IHRoaXMuZmlyc3ROb2RlO1xuICAgICAgICAgICAgdGhpcy5maXJzdE5vZGUgPSBuZXdOb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZXYgPSB0aGlzLm5vZGVBdEluZGV4KGluZGV4IC0gMSk7XG4gICAgICAgICAgICBuZXdOb2RlLm5leHQgPSBwcmV2Lm5leHQ7XG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubkVsZW1lbnRzKys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoaXMgbGlzdC5cbiAgICAqIEByZXR1cm4geyp9IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IG9yIHVuZGVmaW5lZCBpZiB0aGUgbGlzdCBpc1xuICAgICogZW1wdHkuXG4gICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5maXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlyc3ROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJzdE5vZGUuZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhpcyBsaXN0LlxuICAgICogQHJldHVybiB7Kn0gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgbGlzdCBvciB1bmRlZmluZWQgaWYgdGhlIGxpc3QgaXNcbiAgICAqIGVtcHR5LlxuICAgICovXG4gICAgTGlua2VkTGlzdC5wcm90b3R5cGUubGFzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhc3ROb2RlLmVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IGRlc2lyZWQgaW5kZXguXG4gICAgICogQHJldHVybiB7Kn0gdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4IG9yIHVuZGVmaW5lZCBpZiB0aGUgaW5kZXggaXNcbiAgICAgKiBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmVsZW1lbnRBdEluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlQXRJbmRleChpbmRleCk7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlLmVsZW1lbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGlzIGxpc3Qgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlXG4gICAgICogc3BlY2lmaWVkIGVsZW1lbnQsIG9yIC0xIGlmIHRoZSBMaXN0IGRvZXMgbm90IGNvbnRhaW4gdGhpcyBlbGVtZW50LlxuICAgICAqIDxwPklmIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhpcyBsaXN0IGFyZVxuICAgICAqIG5vdCBjb21wYXJhYmxlIHdpdGggdGhlID09PSBvcGVyYXRvciBhIGN1c3RvbSBlcXVhbHMgZnVuY3Rpb24gc2hvdWxkIGJlXG4gICAgICogcHJvdmlkZWQgdG8gcGVyZm9ybSBzZWFyY2hlcywgdGhlIGZ1bmN0aW9uIG11c3QgcmVjZWl2ZSB0d28gYXJndW1lbnRzIGFuZFxuICAgICAqIHJldHVybiB0cnVlIGlmIHRoZXkgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuIEV4YW1wbGU6PC9wPlxuICAgICAqXG4gICAgICogPHByZT5cbiAgICAgKiBjb25zdCBwZXRzQXJlRXF1YWxCeU5hbWUgPSBmdW5jdGlvbihwZXQxLCBwZXQyKSB7XG4gICAgICogIHJldHVybiBwZXQxLm5hbWUgPT09IHBldDIubmFtZTtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIE9wdGlvbmFsXG4gICAgICogZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0d28gZWxlbWVudHMgYXJlIGVxdWFsLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGluZGV4IGluIHRoaXMgbGlzdCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZVxuICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgb3IgLTEgaWYgdGhpcyBsaXN0IGRvZXMgbm90IGNvbnRhaW4gdGhlXG4gICAgICogZWxlbWVudC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gKGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgICAgIHZhciBlcXVhbHNGID0gZXF1YWxzRnVuY3Rpb24gfHwgdXRpbC5kZWZhdWx0RXF1YWxzO1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHRoaXMuZmlyc3ROb2RlO1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlcXVhbHNGKGN1cnJlbnROb2RlLmVsZW1lbnQsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxpc3QgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAgICogPHA+SWYgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUgbGlzdCBhcmVcbiAgICAgICAqIG5vdCBjb21wYXJhYmxlIHdpdGggdGhlID09PSBvcGVyYXRvciBhIGN1c3RvbSBlcXVhbHMgZnVuY3Rpb24gc2hvdWxkIGJlXG4gICAgICAgKiBwcm92aWRlZCB0byBwZXJmb3JtIHNlYXJjaGVzLCB0aGUgZnVuY3Rpb24gbXVzdCByZWNlaXZlIHR3byBhcmd1bWVudHMgYW5kXG4gICAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGV5IGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBFeGFtcGxlOjwvcD5cbiAgICAgICAqXG4gICAgICAgKiA8cHJlPlxuICAgICAgICogY29uc3QgcGV0c0FyZUVxdWFsQnlOYW1lID0gZnVuY3Rpb24ocGV0MSwgcGV0Mikge1xuICAgICAgICogIHJldHVybiBwZXQxLm5hbWUgPT09IHBldDIubmFtZTtcbiAgICAgICAqIH1cbiAgICAgICAqIDwvcHJlPlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpib29sZWFuPX0gZXF1YWxzRnVuY3Rpb24gT3B0aW9uYWxcbiAgICAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgaWYgdHdvIGVsZW1lbnRzIGFyZSBlcXVhbC5cbiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBsaXN0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgZmFsc2VcbiAgICAgICAqIG90aGVyd2lzZS5cbiAgICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pbmRleE9mKGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKSA+PSAwKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoaXMgbGlzdC5cbiAgICAgKiA8cD5JZiB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSBsaXN0IGFyZVxuICAgICAqIG5vdCBjb21wYXJhYmxlIHdpdGggdGhlID09PSBvcGVyYXRvciBhIGN1c3RvbSBlcXVhbHMgZnVuY3Rpb24gc2hvdWxkIGJlXG4gICAgICogcHJvdmlkZWQgdG8gcGVyZm9ybSBzZWFyY2hlcywgdGhlIGZ1bmN0aW9uIG11c3QgcmVjZWl2ZSB0d28gYXJndW1lbnRzIGFuZFxuICAgICAqIHJldHVybiB0cnVlIGlmIHRoZXkgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuIEV4YW1wbGU6PC9wPlxuICAgICAqXG4gICAgICogPHByZT5cbiAgICAgKiBjb25zdCBwZXRzQXJlRXF1YWxCeU5hbWUgPSBmdW5jdGlvbihwZXQxLCBwZXQyKSB7XG4gICAgICogIHJldHVybiBwZXQxLm5hbWUgPT09IHBldDIubmFtZTtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gZWxlbWVudCB0byBiZSByZW1vdmVkIGZyb20gdGhpcyBsaXN0LCBpZiBwcmVzZW50LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGxpc3QgY29udGFpbmVkIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSwgZXF1YWxzRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIGVxdWFsc0YgPSBlcXVhbHNGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRFcXVhbHM7XG4gICAgICAgIGlmICh0aGlzLm5FbGVtZW50cyA8IDEgfHwgdXRpbC5pc1VuZGVmaW5lZChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2aW91cyA9IG51bGw7XG4gICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHRoaXMuZmlyc3ROb2RlO1xuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlcXVhbHNGKGN1cnJlbnROb2RlLmVsZW1lbnQsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlID09PSB0aGlzLmZpcnN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0Tm9kZSA9IHRoaXMuZmlyc3ROb2RlLm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PT0gdGhpcy5sYXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0Tm9kZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudE5vZGUgPT09IHRoaXMubGFzdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0Tm9kZSA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubmV4dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubmV4dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubkVsZW1lbnRzLS07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnROb2RlO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgbGlzdC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maXJzdE5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3ROb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlzdCBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gbGlzdC5cbiAgICAgKiBUd28gbGlzdHMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICAgKiBAcGFyYW0ge0xpbmtlZExpc3R9IG90aGVyIHRoZSBvdGhlciBsaXN0LlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsXG4gICAgICogZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0d28gZWxlbWVudHMgYXJlIGVxdWFsLiBJZiB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3RzXG4gICAgICogYXJlIGN1c3RvbSBvYmplY3RzIHlvdSBzaG91bGQgcHJvdmlkZSBhIGZ1bmN0aW9uLCBvdGhlcndpc2VcbiAgICAgKiB0aGUgPT09IG9wZXJhdG9yIGlzIHVzZWQgdG8gY2hlY2sgZXF1YWxpdHkgYmV0d2VlbiBlbGVtZW50cy5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgbGlzdCBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gbGlzdC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAob3RoZXIsIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgICAgIHZhciBlcUYgPSBlcXVhbHNGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRFcXVhbHM7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgTGlua2VkTGlzdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaXplKCkgIT09IG90aGVyLnNpemUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVxdWFsc0F1eCh0aGlzLmZpcnN0Tm9kZSwgb3RoZXIuZmlyc3ROb2RlLCBlcUYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgTGlua2VkTGlzdC5wcm90b3R5cGUuZXF1YWxzQXV4ID0gZnVuY3Rpb24gKG4xLCBuMiwgZXFGKSB7XG4gICAgICAgIHdoaWxlIChuMSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFlcUYobjEuZWxlbWVudCwgbjIuZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuMSA9IG4xLm5leHQ7XG4gICAgICAgICAgICBuMiA9IG4yLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBnaXZlbiBpbmRleC5cbiAgICAgKiBAcmV0dXJuIHsqfSByZW1vdmVkIGVsZW1lbnQgb3IgdW5kZWZpbmVkIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLnJlbW92ZUVsZW1lbnRBdEluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5uRWxlbWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLm5FbGVtZW50cyA9PT0gMSkge1xuICAgICAgICAgICAgLy9GaXJzdCBub2RlIGluIHRoZSBsaXN0LlxuICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZmlyc3ROb2RlLmVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmZpcnN0Tm9kZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxhc3ROb2RlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMubm9kZUF0SW5kZXgoaW5kZXggLSAxKTtcbiAgICAgICAgICAgIGlmIChwcmV2aW91cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmZpcnN0Tm9kZS5lbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3ROb2RlID0gdGhpcy5maXJzdE5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByZXZpb3VzLm5leHQgPT09IHRoaXMubGFzdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5sYXN0Tm9kZS5lbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdE5vZGUgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2aW91cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBwcmV2aW91cy5uZXh0LmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcHJldmlvdXMubmV4dCA9IHByZXZpb3VzLm5leHQubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5FbGVtZW50cy0tO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIGxpc3QgaW4gb3JkZXIuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogdGhlIGVsZW1lbnQgdmFsdWUsIHRvIGJyZWFrIHRoZSBpdGVyYXRpb24geW91IGNhblxuICAgICAqIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5maXJzdE5vZGU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGN1cnJlbnROb2RlLmVsZW1lbnQpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlua2VkIGxpc3QgKG1ha2VzIHRoZSBsYXN0XG4gICAgICogZWxlbWVudCBmaXJzdCwgYW5kIHRoZSBmaXJzdCBlbGVtZW50IGxhc3QpLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcmV2aW91cyA9IG51bGw7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5maXJzdE5vZGU7XG4gICAgICAgIHZhciB0ZW1wID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRlbXAgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICBjdXJyZW50Lm5leHQgPSBwcmV2aW91cztcbiAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICAgICAgICAgIGN1cnJlbnQgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIHRlbXAgPSB0aGlzLmZpcnN0Tm9kZTtcbiAgICAgICAgdGhpcy5maXJzdE5vZGUgPSB0aGlzLmxhc3ROb2RlO1xuICAgICAgICB0aGlzLmxhc3ROb2RlID0gdGVtcDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiBwcm9wZXJcbiAgICAgKiBzZXF1ZW5jZS5cbiAgICAgKiBAcmV0dXJuIHtBcnJheS48Kj59IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIGxpc3QsXG4gICAgICogaW4gcHJvcGVyIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmZpcnN0Tm9kZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhcnJheS5wdXNoKGN1cnJlbnROb2RlLmVsZW1lbnQpO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGxpc3QuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbGlzdC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uRWxlbWVudHM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBsaXN0IGNvbnRhaW5zIG5vIGVsZW1lbnRzLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBsaXN0IGNvbnRhaW5zIG5vIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50cyA8PSAwO1xuICAgIH07XG4gICAgTGlua2VkTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcnJheXMudG9TdHJpbmcodGhpcy50b0FycmF5KCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5ub2RlQXRJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubkVsZW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09ICh0aGlzLm5FbGVtZW50cyAtIDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZmlyc3ROb2RlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZWxlbWVudDogaXRlbSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBMaW5rZWRMaXN0O1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IExpbmtlZExpc3Q7IC8vIEVuZCBvZiBsaW5rZWQgbGlzdFxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGlua2VkTGlzdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG52YXIgRGljdGlvbmFyeV8xID0gcmVxdWlyZSgnLi9EaWN0aW9uYXJ5Jyk7XG52YXIgYXJyYXlzID0gcmVxdWlyZSgnLi9hcnJheXMnKTtcbnZhciBNdWx0aURpY3Rpb25hcnkgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbXVsdGkgZGljdGlvbmFyeS5cbiAgICAgKiBAY2xhc3MgPHA+QSBtdWx0aSBkaWN0aW9uYXJ5IGlzIGEgc3BlY2lhbCBraW5kIG9mIGRpY3Rpb25hcnkgdGhhdCBob2xkc1xuICAgICAqIG11bHRpcGxlIHZhbHVlcyBhZ2FpbnN0IGVhY2gga2V5LiBTZXR0aW5nIGEgdmFsdWUgaW50byB0aGUgZGljdGlvbmFyeSB3aWxsXG4gICAgICogYWRkIHRoZSB2YWx1ZSB0byBhbiBhcnJheSBhdCB0aGF0IGtleS4gR2V0dGluZyBhIGtleSB3aWxsIHJldHVybiBhbiBhcnJheSxcbiAgICAgKiBob2xkaW5nIGFsbCB0aGUgdmFsdWVzIHNldCB0byB0aGF0IGtleS5cbiAgICAgKiBZb3UgY2FuIGNvbmZpZ3VyZSB0byBhbGxvdyBkdXBsaWNhdGVzIGluIHRoZSB2YWx1ZXMuXG4gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhY2NlcHRzIGFueSBraW5kIG9mIG9iamVjdHMgYXMga2V5cy48L3A+XG4gICAgICpcbiAgICAgKiA8cD5JZiB0aGUga2V5cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBrZXlzIHRvIHN0cmluZ3MgbXVzdCBiZVxuICAgICAqIHByb3ZpZGVkLiBFeGFtcGxlOjwvcD5cbiAgICAgKlxuICAgICAqIDxwcmU+XG4gICAgICogZnVuY3Rpb24gcGV0VG9TdHJpbmcocGV0KSB7XG4gICAgICAgKiAgcmV0dXJuIHBldC5uYW1lO1xuICAgICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqIDxwPklmIHRoZSB2YWx1ZXMgYXJlIGN1c3RvbSBvYmplY3RzIGEgZnVuY3Rpb24gdG8gY2hlY2sgZXF1YWxpdHkgYmV0d2VlbiB2YWx1ZXNcbiAgICAgKiBtdXN0IGJlIHByb3ZpZGVkLiBFeGFtcGxlOjwvcD5cbiAgICAgKlxuICAgICAqIDxwcmU+XG4gICAgICogZnVuY3Rpb24gcGV0c0FyZUVxdWFsQnlBZ2UocGV0MSxwZXQyKSB7XG4gICAgICAgKiAgcmV0dXJuIHBldDEuYWdlPT09cGV0Mi5hZ2U7XG4gICAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOnN0cmluZz19IHRvU3RyRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb25cbiAgICAgKiB0byBjb252ZXJ0IGtleXMgdG8gc3RyaW5ncy4gSWYgdGhlIGtleXMgYXJlbid0IHN0cmluZ3Mgb3IgaWYgdG9TdHJpbmcoKVxuICAgICAqIGlzIG5vdCBhcHByb3ByaWF0ZSwgYSBjdXN0b20gZnVuY3Rpb24gd2hpY2ggcmVjZWl2ZXMgYSBrZXkgYW5kIHJldHVybnMgYVxuICAgICAqIHVuaXF1ZSBzdHJpbmcgbXVzdCBiZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOmJvb2xlYW49fSB2YWx1ZXNFcXVhbHNGdW5jdGlvbiBvcHRpb25hbFxuICAgICAqIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFsbG93RHVwbGljYXRlVmFsdWVzXG4gICAgICovXG4gICAgZnVuY3Rpb24gTXVsdGlEaWN0aW9uYXJ5KHRvU3RyRnVuY3Rpb24sIHZhbHVlc0VxdWFsc0Z1bmN0aW9uLCBhbGxvd0R1cGxpY2F0ZVZhbHVlcykge1xuICAgICAgICBpZiAoYWxsb3dEdXBsaWNhdGVWYWx1ZXMgPT09IHZvaWQgMCkgeyBhbGxvd0R1cGxpY2F0ZVZhbHVlcyA9IGZhbHNlOyB9XG4gICAgICAgIHRoaXMuZGljdCA9IG5ldyBEaWN0aW9uYXJ5XzEuZGVmYXVsdCh0b1N0ckZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5lcXVhbHNGID0gdmFsdWVzRXF1YWxzRnVuY3Rpb24gfHwgdXRpbC5kZWZhdWx0RXF1YWxzO1xuICAgICAgICB0aGlzLmFsbG93RHVwbGljYXRlID0gYWxsb3dEdXBsaWNhdGVWYWx1ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICogUmV0dXJucyBhbiBhcnJheSBob2xkaW5nIHRoZSB2YWx1ZXMgdG8gd2hpY2ggdGhpcyBkaWN0aW9uYXJ5IG1hcHNcbiAgICAqIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZ3MgZm9yIHRoaXMga2V5LlxuICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZXMgYXJlIHRvIGJlIHJldHVybmVkLlxuICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGhvbGRpbmcgdGhlIHZhbHVlcyB0byB3aGljaCB0aGlzIGRpY3Rpb25hcnkgbWFwc1xuICAgICogdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgKi9cbiAgICBNdWx0aURpY3Rpb25hcnkucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5kaWN0LmdldFZhbHVlKGtleSk7XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKHZhbHVlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlzLmNvcHkodmFsdWVzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHZhbHVlIHRvIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGlmXG4gICAgICogaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmVcbiAgICAgKiBhc3NvY2lhdGVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBhcnJheSBhdCB0aGUga2V5XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIG5vdCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleS5cbiAgICAgKi9cbiAgICBNdWx0aURpY3Rpb25hcnkucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQoa2V5KSB8fCB1dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250YWluc0tleShrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0VmFsdWUoa2V5LCBbdmFsdWVdKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcnJheSA9IHRoaXMuZGljdC5nZXRWYWx1ZShrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuYWxsb3dEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgIGlmIChhcnJheXMuY29udGFpbnMoYXJyYXksIHZhbHVlLCB0aGlzLmVxdWFsc0YpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZXMgZnJvbSB0aGUgYXJyYXkgb2YgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICAgKiBzcGVjaWZpZWQga2V5LiBJZiBhIHZhbHVlIGlzbid0IGdpdmVuLCBhbGwgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkXG4gICAgICoga2V5IGFyZSByZW1vdmVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBrZXkga2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZVxuICAgICAqIGRpY3Rpb25hcnkuXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZSBvcHRpb25hbCBhcmd1bWVudCB0byBzcGVjaWZ5IHRoZSB2YWx1ZSB0byByZW1vdmVcbiAgICAgKiBmcm9tIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogQHJldHVybiB7Kn0gdHJ1ZSBpZiB0aGUgZGljdGlvbmFyeSBjaGFuZ2VkLCBmYWxzZSBpZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3JcbiAgICAgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzbid0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKi9cbiAgICBNdWx0aURpY3Rpb25hcnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmRpY3QucmVtb3ZlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gIXV0aWwuaXNVbmRlZmluZWQodik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFycmF5ID0gdGhpcy5kaWN0LmdldFZhbHVlKGtleSk7XG4gICAgICAgIGlmIChhcnJheXMucmVtb3ZlKGFycmF5LCB2YWx1ZSwgdGhpcy5lcXVhbHNGKSkge1xuICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGljdC5yZW1vdmUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGtleXMgaW4gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmtleXMoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICAqL1xuICAgIE11bHRpRGljdGlvbmFyeS5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5kaWN0LnZhbHVlcygpO1xuICAgICAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCB2YWx1ZXNfMSA9IHZhbHVlczsgX2kgPCB2YWx1ZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciB2ID0gdmFsdWVzXzFbX2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCB2XzEgPSB2OyBfYSA8IHZfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdyA9IHZfMVtfYV07XG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaCh3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGF0IGxlYXN0IG9uZSB2YWx1ZSBhc3NvY2lhdHRlZCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIGRpY3Rpb25hcnkgaXMgdG8gYmVcbiAgICAgKiB0ZXN0ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgYXQgbGVhc3Qgb25lIHZhbHVlIGFzc29jaWF0dGVkXG4gICAgICogdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5jb250YWluc0tleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250YWluc0tleShrZXkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaWN0LmNsZWFyKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LnNpemUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZ3MuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZ3MuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmlzRW1wdHkoKTtcbiAgICB9O1xuICAgIHJldHVybiBNdWx0aURpY3Rpb25hcnk7XG59KCkpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gTXVsdGlEaWN0aW9uYXJ5OyAvLyBlbmQgb2YgbXVsdGkgZGljdGlvbmFyeVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlEaWN0aW9uYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuKGZ1bmN0aW9uIChEaXJlY3Rpb24pIHtcbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiQkVGT1JFXCJdID0gMF0gPSBcIkJFRk9SRVwiO1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJBRlRFUlwiXSA9IDFdID0gXCJBRlRFUlwiO1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJJTlNJREVfQVRfRU5EXCJdID0gMl0gPSBcIklOU0lERV9BVF9FTkRcIjtcbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiSU5TSURFX0FUX1NUQVJUXCJdID0gM10gPSBcIklOU0lERV9BVF9TVEFSVFwiO1xufSkoZXhwb3J0cy5EaXJlY3Rpb24gfHwgKGV4cG9ydHMuRGlyZWN0aW9uID0ge30pKTtcbnZhciBEaXJlY3Rpb24gPSBleHBvcnRzLkRpcmVjdGlvbjtcbnZhciBNdWx0aVJvb3RUcmVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNdWx0aVJvb3RUcmVlKHJvb3RJZHMsIG5vZGVzKSB7XG4gICAgICAgIGlmIChyb290SWRzID09PSB2b2lkIDApIHsgcm9vdElkcyA9IFtdOyB9XG4gICAgICAgIGlmIChub2RlcyA9PT0gdm9pZCAwKSB7IG5vZGVzID0ge307IH1cbiAgICAgICAgdGhpcy5yb290SWRzID0gcm9vdElkcztcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgIH1cbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5nZXRSb290SWRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB0aGlzLnJvb3RJZHMuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZ2V0Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBub2RlS2V5IGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzLmhhc093blByb3BlcnR5KG5vZGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgY2xvbmVbbm9kZUtleV0gPSB0aGlzLm5vZGVzW25vZGVLZXldLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZ2V0T2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm9vdElkczogdGhpcy5nZXRSb290SWRzKCksXG4gICAgICAgICAgICBub2RlczogdGhpcy5nZXROb2RlcygpLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubW92ZUlkQmVmb3JlSWQgPSBmdW5jdGlvbiAobW92ZUlkLCBiZWZvcmVJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlSWQobW92ZUlkLCBiZWZvcmVJZCwgRGlyZWN0aW9uLkJFRk9SRSk7XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5tb3ZlSWRBZnRlcklkID0gZnVuY3Rpb24gKG1vdmVJZCwgYWZ0ZXJJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlSWQobW92ZUlkLCBhZnRlcklkLCBEaXJlY3Rpb24uQUZURVIpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubW92ZUlkSW50b0lkID0gZnVuY3Rpb24gKG1vdmVJZCwgaW5zaWRlSWQsIGF0U3RhcnQpIHtcbiAgICAgICAgaWYgKGF0U3RhcnQgPT09IHZvaWQgMCkgeyBhdFN0YXJ0ID0gdHJ1ZTsgfVxuICAgICAgICBpZiAoYXRTdGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW92ZUlkKG1vdmVJZCwgaW5zaWRlSWQsIERpcmVjdGlvbi5JTlNJREVfQVRfU1RBUlQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW92ZUlkKG1vdmVJZCwgaW5zaWRlSWQsIERpcmVjdGlvbi5JTlNJREVfQVRfRU5EKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZGVsZXRlSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdGhpcy5yb290RGVsZXRlSWQoaWQpO1xuICAgICAgICB0aGlzLm5vZGVBbmRTdWJOb2Rlc0RlbGV0ZShpZCk7XG4gICAgICAgIHRoaXMubm9kZVJlZnJlbmNlc0RlbGV0ZShpZCk7XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5pbnNlcnRJZEJlZm9yZUlkID0gZnVuY3Rpb24gKGJlZm9yZUlkLCBpbnNlcnRJZCkge1xuICAgICAgICB2YXIgZm91bmRSb290SWRJbmRleCA9IHRoaXMuZmluZFJvb3RJZChiZWZvcmVJZCk7XG4gICAgICAgIGlmIChmb3VuZFJvb3RJZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvUm9vdChpbnNlcnRJZCwgZm91bmRSb290SWRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgbm9kZUtleSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlS2V5KSkge1xuICAgICAgICAgICAgICAgIHZhciBmb3VuZE5vZGVJZEluZGV4ID0gdGhpcy5maW5kTm9kZUlkKG5vZGVLZXksIGJlZm9yZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmROb2RlSWRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvTm9kZShub2RlS2V5LCBpbnNlcnRJZCwgZm91bmROb2RlSWRJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5pbnNlcnRJZEFmdGVySWQgPSBmdW5jdGlvbiAoYmVsb3dJZCwgaW5zZXJ0SWQpIHtcbiAgICAgICAgdmFyIGZvdW5kUm9vdElkSW5kZXggPSB0aGlzLmZpbmRSb290SWQoYmVsb3dJZCk7XG4gICAgICAgIGlmIChmb3VuZFJvb3RJZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvUm9vdChpbnNlcnRJZCwgZm91bmRSb290SWRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIG5vZGVLZXkgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUtleSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmROb2RlSWRJbmRleCA9IHRoaXMuZmluZE5vZGVJZChub2RlS2V5LCBiZWxvd0lkKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmROb2RlSWRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvTm9kZShub2RlS2V5LCBpbnNlcnRJZCwgZm91bmROb2RlSWRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuaW5zZXJ0SWRJbnRvSWQgPSBmdW5jdGlvbiAoaW5zaWRlSWQsIGluc2VydElkKSB7XG4gICAgICAgIHRoaXMubm9kZUluc2VydEF0RW5kKGluc2lkZUlkLCBpbnNlcnRJZCk7XG4gICAgICAgIHRoaXMubm9kZXNbaW5zZXJ0SWRdID0gW107XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5pbnNlcnRJZEludG9Sb290ID0gZnVuY3Rpb24gKGlkLCBwb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yb290SW5zZXJ0QXRFbmQoaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMSA9IHRoaXMucm9vdElkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290SWRzLnNwbGljZSgocG9zaXRpb24gKyBsZW5ndGhfMSArIDEpLCAwLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3RJZHMuc3BsaWNlKHBvc2l0aW9uLCAwLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2Rlc1tpZF0gPSB0aGlzLm5vZGVzW2lkXSB8fCBbXTtcbiAgICB9O1xuICAgIE11bHRpUm9vdFRyZWUucHJvdG90eXBlLmluc2VydElkSW50b05vZGUgPSBmdW5jdGlvbiAobm9kZUtleSwgaWQsIHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZUtleV0gPSB0aGlzLm5vZGVzW25vZGVLZXldIHx8IFtdO1xuICAgICAgICB0aGlzLm5vZGVzW2lkXSA9IHRoaXMubm9kZXNbaWRdIHx8IFtdO1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5ub2RlSW5zZXJ0QXRFbmQobm9kZUtleSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMiA9IHRoaXMubm9kZXNbbm9kZUtleV0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZUtleV0uc3BsaWNlKChwb3NpdGlvbiArIGxlbmd0aF8yICsgMSksIDAsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZUtleV0uc3BsaWNlKHBvc2l0aW9uLCAwLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpUm9vdFRyZWUucHJvdG90eXBlLm1vdmVJZCA9IGZ1bmN0aW9uIChtb3ZlSWQsIGJlZm9yZUlkLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIHNvdXJjZUlkID0gbW92ZUlkO1xuICAgICAgICB2YXIgc291cmNlUm9vdEluZGV4ID0gdGhpcy5maW5kUm9vdElkKHNvdXJjZUlkKTtcbiAgICAgICAgdmFyIHNvdXJjZU5vZGVLZXk7XG4gICAgICAgIHZhciBzb3VyY2VOb2RlSWRJbmRleDtcbiAgICAgICAgaWYgKHRoaXMubm9kZXNbYmVmb3JlSWRdKSB7XG4gICAgICAgICAgICBzb3VyY2VOb2RlS2V5ID0gYmVmb3JlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgbm9kZUtleSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlS2V5KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZU5vZGVJZEluZGV4ID0gdGhpcy5maW5kTm9kZUlkKG5vZGVLZXksIGJlZm9yZUlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBnb3QgYWxsXG4gICAgICAgIHZhciB0YXJnZXRJZCA9IGJlZm9yZUlkO1xuICAgICAgICB2YXIgdGFyZ2V0Um9vdEluZGV4ID0gdGhpcy5maW5kUm9vdElkKHRhcmdldElkKTtcbiAgICAgICAgdmFyIHRhcmdldE5vZGVLZXk7XG4gICAgICAgIHZhciB0YXJnZXROb2RlSWRJbmRleDtcbiAgICAgICAgaWYgKHRoaXMubm9kZXNbYmVmb3JlSWRdKSB7XG4gICAgICAgICAgICB0YXJnZXROb2RlS2V5ID0gYmVmb3JlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgbm9kZUtleSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlS2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVJZEluZGV4ID0gdGhpcy5maW5kTm9kZUlkKG5vZGVLZXksIGJlZm9yZUlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBnb3QgYWxsXG4gICAgICAgIGlmIChzb3VyY2VSb290SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgaWYgKHRhcmdldFJvb3RJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290RGVsZXRlKHNvdXJjZVJvb3RJbmRleCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uQkVGT1JFOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJZEludG9Sb290KHNvdXJjZUlkLCB0YXJnZXRSb290SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLkFGVEVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJZEludG9Sb290KHNvdXJjZUlkLCB0YXJnZXRSb290SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5JTlNJREVfQVRfU1RBUlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVJbnNlcnRBdFN0YXJ0KHRhcmdldElkLCBzb3VyY2VJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uSU5TSURFX0FUX0VORDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZUluc2VydEF0RW5kKHRhcmdldElkLCBzb3VyY2VJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBtb3Zpbmcgcm9vdCAoc291cmNlKSBBQk9WRSBub2RlICh0YXJnZXQpXG4gICAgICAgICAgICAgICAgLy8gd2lsbCByZW1vdmUgb25lIGVudHJ5IGZyb20gcm9vdHNcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3REZWxldGUoc291cmNlUm9vdEluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBub2RlS2V5IGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuZmluZE5vZGVJZChub2RlS2V5LCB0YXJnZXRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLkJFRk9SRTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvTm9kZShub2RlS2V5LCBzb3VyY2VJZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLkFGVEVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJZEludG9Ob2RlKG5vZGVLZXksIHNvdXJjZUlkLCBpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLklOU0lERV9BVF9TVEFSVDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZUluc2VydEF0U3RhcnQodGFyZ2V0SWQsIHNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5JTlNJREVfQVRfRU5EOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlSW5zZXJ0QXRFbmQodGFyZ2V0SWQsIHNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXRSb290SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIC8vIG1vdmluZyBub2RlIChzb3VyY2UpIEFCT1ZFIHJvb3QgKHRhcmdldClcbiAgICAgICAgICAgICAgICAvLyBkZWxldGUgc291cmNlIGlkIGZyb20gZWFjaCBub2RlXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbm9kZUtleSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzLmhhc093blByb3BlcnR5KG5vZGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmZpbmROb2RlSWQobm9kZUtleSwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLm5vZGVJbnNlcnRJZChub2RlS2V5LCBzb3VyY2VJZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZURlbGV0ZUF0SW5kZXgobm9kZUtleSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLkJFRk9SRTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvUm9vdChzb3VyY2VJZCwgdGFyZ2V0Um9vdEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5BRlRFUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvUm9vdChzb3VyY2VJZCwgdGFyZ2V0Um9vdEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uSU5TSURFX0FUX1NUQVJUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlSW5zZXJ0QXRTdGFydCh0YXJnZXRJZCwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLklOU0lERV9BVF9FTkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVJbnNlcnRBdEVuZCh0YXJnZXRJZCwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbW92aW5nIG5vZGUgKHNvdXJjZSkgQUJPVkUgbm9kZSAodGFyZ2V0KVxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBzb3VyY2UgaWQgZnJvbSBlYWNoIG5vZGVcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBub2RlS2V5IGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuZmluZE5vZGVJZChub2RlS2V5LCBzb3VyY2VJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZURlbGV0ZUF0SW5kZXgobm9kZUtleSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG5vZGVLZXkgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5maW5kTm9kZUlkKG5vZGVLZXksIHRhcmdldElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uQkVGT1JFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJZEludG9Ob2RlKG5vZGVLZXksIHNvdXJjZUlkLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uQUZURVI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydElkSW50b05vZGUobm9kZUtleSwgc291cmNlSWQsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uSU5TSURFX0FUX1NUQVJUOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlSW5zZXJ0QXRTdGFydCh0YXJnZXRJZCwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLklOU0lERV9BVF9FTkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVJbnNlcnRBdEVuZCh0YXJnZXRJZCwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5zd2FwQXJyYXlFbGVtZW50cyA9IGZ1bmN0aW9uIChhcnIsIGluZGV4QSwgaW5kZXhCKSB7XG4gICAgICAgIHZhciB0ZW1wID0gYXJyW2luZGV4QV07XG4gICAgICAgIGFycltpbmRleEFdID0gYXJyW2luZGV4Ql07XG4gICAgICAgIGFycltpbmRleEJdID0gdGVtcDtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9O1xuICAgIDtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5yb290RGVsZXRlSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5maW5kUm9vdElkKGlkKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdERlbGV0ZShpbmRleCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpUm9vdFRyZWUucHJvdG90eXBlLm5vZGVBbmRTdWJOb2Rlc0RlbGV0ZSA9IGZ1bmN0aW9uIChub2RlS2V5KSB7XG4gICAgICAgIHZhciB0b0RlbGV0ZUxhdGVyID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ub2Rlc1tub2RlS2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5ub2Rlc1tub2RlS2V5XVtpXTtcbiAgICAgICAgICAgIHRoaXMubm9kZUFuZFN1Yk5vZGVzRGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHRvRGVsZXRlTGF0ZXIucHVzaChub2RlS2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVEZWxldGUobm9kZUtleSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9EZWxldGVMYXRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ub2RlRGVsZXRlKHRvRGVsZXRlTGF0ZXJbaV0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5ub2RlUmVmcmVuY2VzRGVsZXRlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGZvciAodmFyIG5vZGVLZXkgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUtleSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXNbbm9kZUtleV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldElkID0gdGhpcy5ub2Rlc1tub2RlS2V5XVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldElkID09PSBpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlRGVsZXRlQXRJbmRleChub2RlS2V5LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubm9kZURlbGV0ZSA9IGZ1bmN0aW9uIChub2RlS2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzW25vZGVLZXldO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZmluZFJvb3RJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290SWRzLmluZGV4T2YoaWQpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZmluZE5vZGVJZCA9IGZ1bmN0aW9uIChub2RlS2V5LCBpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1tub2RlS2V5XS5pbmRleE9mKGlkKTtcbiAgICB9O1xuICAgIE11bHRpUm9vdFRyZWUucHJvdG90eXBlLmZpbmROb2RlID0gZnVuY3Rpb24gKG5vZGVLZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNbbm9kZUtleV07XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5ub2RlSW5zZXJ0QXRTdGFydCA9IGZ1bmN0aW9uIChub2RlS2V5LCBpZCkge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVLZXldLnVuc2hpZnQoaWQpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubm9kZUluc2VydEF0RW5kID0gZnVuY3Rpb24gKG5vZGVLZXksIGlkKSB7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZUtleV0ucHVzaChpZCk7XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5yb290RGVsZXRlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHRoaXMucm9vdElkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubm9kZURlbGV0ZUF0SW5kZXggPSBmdW5jdGlvbiAobm9kZUtleSwgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlS2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUucm9vdEluc2VydEF0U3RhcnQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdGhpcy5yb290SWRzLnVuc2hpZnQoaWQpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUucm9vdEluc2VydEF0RW5kID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHRoaXMucm9vdElkcy5wdXNoKGlkKTtcbiAgICB9O1xuICAgIHJldHVybiBNdWx0aVJvb3RUcmVlO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IE11bHRpUm9vdFRyZWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdWx0aVJvb3RUcmVlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBIZWFwXzEgPSByZXF1aXJlKCcuL0hlYXAnKTtcbnZhciBQcmlvcml0eVF1ZXVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHByaW9yaXR5IHF1ZXVlLlxuICAgICAqIEBjbGFzcyA8cD5JbiBhIHByaW9yaXR5IHF1ZXVlIGVhY2ggZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSBcInByaW9yaXR5XCIsXG4gICAgICogZWxlbWVudHMgYXJlIGRlcXVldWVkIGluIGhpZ2hlc3QtcHJpb3JpdHktZmlyc3Qgb3JkZXIgKHRoZSBlbGVtZW50cyB3aXRoIHRoZVxuICAgICAqIGhpZ2hlc3QgcHJpb3JpdHkgYXJlIGRlcXVldWVkIGZpcnN0KS4gUHJpb3JpdHkgUXVldWVzIGFyZSBpbXBsZW1lbnRlZCBhcyBoZWFwcy5cbiAgICAgKiBJZiB0aGUgaW5zZXJ0ZWQgZWxlbWVudHMgYXJlIGN1c3RvbSBvYmplY3RzIGEgY29tcGFyZSBmdW5jdGlvbiBtdXN0IGJlIHByb3ZpZGVkLFxuICAgICAqIG90aGVyd2lzZSB0aGUgPD0sID09PSBhbmQgPj0gb3BlcmF0b3JzIGFyZSB1c2VkIHRvIGNvbXBhcmUgb2JqZWN0IHByaW9yaXR5LjwvcD5cbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAgICAqICBpZiAoYSBpcyBsZXNzIHRoYW4gYiBieSBzb21lIG9yZGVyaW5nIGNyaXRlcmlvbikge1xuICAgICAqICAgICByZXR1cm4gLTE7XG4gICAgICogIH0gaWYgKGEgaXMgZ3JlYXRlciB0aGFuIGIgYnkgdGhlIG9yZGVyaW5nIGNyaXRlcmlvbikge1xuICAgICAqICAgICByZXR1cm4gMTtcbiAgICAgKiAgfVxuICAgICAqICAvLyBhIG11c3QgYmUgZXF1YWwgdG8gYlxuICAgICAqICByZXR1cm4gMDtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpudW1iZXI9fSBjb21wYXJlRnVuY3Rpb24gb3B0aW9uYWxcbiAgICAgKiBmdW5jdGlvbiB1c2VkIHRvIGNvbXBhcmUgdHdvIGVsZW1lbnQgcHJpb3JpdGllcy4gTXVzdCByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLFxuICAgICAqIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0byxcbiAgICAgKiBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBQcmlvcml0eVF1ZXVlKGNvbXBhcmVGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmhlYXAgPSBuZXcgSGVhcF8xLmRlZmF1bHQodXRpbC5yZXZlcnNlQ29tcGFyZUZ1bmN0aW9uKGNvbXBhcmVGdW5jdGlvbikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoaXMgcHJpb3JpdHkgcXVldWUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGluc2VydGVkLCBvciBmYWxzZSBpZiBpdCBpcyB1bmRlZmluZWQuXG4gICAgICovXG4gICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXAuYWRkKGVsZW1lbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGlzIHByaW9yaXR5IHF1ZXVlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBpbnNlcnRlZCwgb3IgZmFsc2UgaWYgaXQgaXMgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIFByaW9yaXR5UXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXAuYWRkKGVsZW1lbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFuZCByZW1vdmVzIHRoZSBoaWdoZXN0IHByaW9yaXR5IGVsZW1lbnQgb2YgdGhpcyBxdWV1ZS5cbiAgICAgKiBAcmV0dXJuIHsqfSB0aGUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZWxlbWVudCBvZiB0aGlzIHF1ZXVlLFxuICAgICAqICBvciB1bmRlZmluZWQgaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5kZXF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5oZWFwLnNpemUoKSAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5oZWFwLnBlZWsoKTtcbiAgICAgICAgICAgIHRoaXMuaGVhcC5yZW1vdmVSb290KCk7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcywgYnV0IGRvZXMgbm90IHJlbW92ZSwgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZWxlbWVudCBvZiB0aGlzIHF1ZXVlLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSBoaWdoZXN0IHByaW9yaXR5IGVsZW1lbnQgb2YgdGhpcyBxdWV1ZSwgb3IgdW5kZWZpbmVkIGlmIHRoaXMgcXVldWUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5wZWVrKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcmlvcml0eSBxdWV1ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBwcmlvcml0eSBxdWV1ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIFByaW9yaXR5UXVldWUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5jb250YWlucyhlbGVtZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIHByaW9yaXR5IHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBwcmlvcml0eSBxdWV1ZSBjb250YWlucyBubyBpdGVtczsgZmFsc2VcbiAgICAgKiBvdGhlcndpc2UuXG4gICAgICovXG4gICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5pc0VtcHR5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBwcmlvcml0eSBxdWV1ZS5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBwcmlvcml0eSBxdWV1ZS5cbiAgICAgKi9cbiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFwLnNpemUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgcHJpb3JpdHkgcXVldWUuXG4gICAgICovXG4gICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGVhcC5jbGVhcigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBwcmVzZW50IGluIHRoaXMgcXVldWUgaW5cbiAgICAgKiBubyBwYXJ0aWN1bGFyIG9yZGVyLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpc1xuICAgICAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6IHRoZSBlbGVtZW50IHZhbHVlLCB0byBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAgICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAgKi9cbiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuaGVhcC5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIHJldHVybiBQcmlvcml0eVF1ZXVlO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IFByaW9yaXR5UXVldWU7IC8vIGVuZCBvZiBwcmlvcml0eSBxdWV1ZVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJpb3JpdHlRdWV1ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBMaW5rZWRMaXN0XzEgPSByZXF1aXJlKCcuL0xpbmtlZExpc3QnKTtcbnZhciBRdWV1ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBxdWV1ZS5cbiAgICAgKiBAY2xhc3MgQSBxdWV1ZSBpcyBhIEZpcnN0LUluLUZpcnN0LU91dCAoRklGTykgZGF0YSBzdHJ1Y3R1cmUsIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYWRkZWQgdG8gdGhlIHF1ZXVlIHdpbGwgYmUgdGhlIGZpcnN0IG9uZSB0byBiZSByZW1vdmVkLiBUaGlzXG4gICAgICogaW1wbGVtZW50YXRpb24gdXNlcyBhIGxpbmtlZCBsaXN0IGFzIGEgY29udGFpbmVyLlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFF1ZXVlKCkge1xuICAgICAgICB0aGlzLmxpc3QgPSBuZXcgTGlua2VkTGlzdF8xLmRlZmF1bHQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgZW5kIG9mIHRoaXMgcXVldWUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW0gdGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGluc2VydGVkLCBvciBmYWxzZSBpZiBpdCBpcyB1bmRlZmluZWQuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmFkZChlbGVtKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGVuZCBvZiB0aGlzIHF1ZXVlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtIHRoZSBlbGVtZW50IHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBpbnNlcnRlZCwgb3IgZmFsc2UgaWYgaXQgaXMgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIFF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmFkZChlbGVtKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgaGVhZCBvZiB0aGlzIHF1ZXVlLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSBoZWFkIG9mIHRoaXMgcXVldWUsIG9yIHVuZGVmaW5lZCBpZiB0aGlzIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIFF1ZXVlLnByb3RvdHlwZS5kZXF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5saXN0LnNpemUoKSAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5saXN0LmZpcnN0KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3QucmVtb3ZlRWxlbWVudEF0SW5kZXgoMCk7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcywgYnV0IGRvZXMgbm90IHJlbW92ZSwgdGhlIGhlYWQgb2YgdGhpcyBxdWV1ZS5cbiAgICAgKiBAcmV0dXJuIHsqfSB0aGUgaGVhZCBvZiB0aGlzIHF1ZXVlLCBvciB1bmRlZmluZWQgaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBRdWV1ZS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdC5zaXplKCkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3QuZmlyc3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcXVldWUuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcXVldWUuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3Quc2l6ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcXVldWUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAqIDxwPklmIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhpcyBzdGFjayBhcmVcbiAgICAgKiBub3QgY29tcGFyYWJsZSB3aXRoIHRoZSA9PT0gb3BlcmF0b3IsIGEgY3VzdG9tIGVxdWFscyBmdW5jdGlvbiBzaG91bGQgYmVcbiAgICAgKiBwcm92aWRlZCB0byBwZXJmb3JtIHNlYXJjaGVzLCB0aGUgZnVuY3Rpb24gbXVzdCByZWNlaXZlIHR3byBhcmd1bWVudHMgYW5kXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhleSBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4gRXhhbXBsZTo8L3A+XG4gICAgICpcbiAgICAgKiA8cHJlPlxuICAgICAqIGNvbnN0IHBldHNBcmVFcXVhbEJ5TmFtZSAocGV0MSwgcGV0Mikge1xuICAgICAqICByZXR1cm4gcGV0MS5uYW1lID09PSBwZXQyLm5hbWU7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtIGVsZW1lbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOmJvb2xlYW49fSBlcXVhbHNGdW5jdGlvbiBvcHRpb25hbFxuICAgICAqIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHR3byBlbGVtZW50cyBhcmUgZXF1YWwuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCxcbiAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGVsZW0sIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QuY29udGFpbnMoZWxlbSwgZXF1YWxzRnVuY3Rpb24pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgcXVldWUgaXMgZW1wdHkuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIG5vIGl0ZW1zOyBmYWxzZVxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBRdWV1ZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5zaXplKCkgPD0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgcXVldWUuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxpc3QuY2xlYXIoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHF1ZXVlIGluXG4gICAgICogRklGTyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuXG4gICAgICogb3B0aW9uYWxseSByZXR1cm4gZmFsc2UuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goY2FsbGJhY2spO1xuICAgIH07XG4gICAgcmV0dXJuIFF1ZXVlO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IFF1ZXVlOyAvLyBFbmQgb2YgcXVldWVcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXVlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBhcnJheXMgPSByZXF1aXJlKCcuL2FycmF5cycpO1xudmFyIERpY3Rpb25hcnlfMSA9IHJlcXVpcmUoJy4vRGljdGlvbmFyeScpO1xudmFyIFNldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBzZXQuXG4gICAgICogQGNsYXNzIDxwPkEgc2V0IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBubyBkdXBsaWNhdGUgaXRlbXMuPC9wPlxuICAgICAqIDxwPklmIHRoZSBpbnNlcnRlZCBlbGVtZW50cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBmdW5jdGlvblxuICAgICAqIHdoaWNoIGNvbnZlcnRzIGVsZW1lbnRzIHRvIHN0cmluZ3MgbXVzdCBiZSBwcm92aWRlZC4gRXhhbXBsZTo8L3A+XG4gICAgICpcbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIHBldFRvU3RyaW5nKHBldCkge1xuICAgICAqICByZXR1cm4gcGV0Lm5hbWU7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOnN0cmluZz19IHRvU3RyaW5nRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZFxuICAgICAqIHRvIGNvbnZlcnQgZWxlbWVudHMgdG8gc3RyaW5ncy4gSWYgdGhlIGVsZW1lbnRzIGFyZW4ndCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKClcbiAgICAgKiBpcyBub3QgYXBwcm9wcmlhdGUsIGEgY3VzdG9tIGZ1bmN0aW9uIHdoaWNoIHJlY2VpdmVzIGEgb25qZWN0IGFuZCByZXR1cm5zIGFcbiAgICAgKiB1bmlxdWUgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2V0KHRvU3RyaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnlfMS5kZWZhdWx0KHRvU3RyaW5nRnVuY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IGVsZW1lbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCxcbiAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkuY29udGFpbnNLZXkoZWxlbWVudCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGlzIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgc2V0IGRpZCBub3QgYWxyZWFkeSBjb250YWluIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGVsZW1lbnQpIHx8IHV0aWwuaXNVbmRlZmluZWQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeS5zZXRWYWx1ZShlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbiBpbnRlcnNlY2lvbiBiZXR3ZWVuIHRoaXMgYW4gYW5vdGhlciBzZXQuXG4gICAgICogUmVtb3ZlcyBhbGwgdmFsdWVzIHRoYXQgYXJlIG5vdCBwcmVzZW50IHRoaXMgc2V0IGFuZCB0aGUgZ2l2ZW4gc2V0LlxuICAgICAqIEBwYXJhbSB7Y29sbGVjdGlvbnMuU2V0fSBvdGhlclNldCBvdGhlciBzZXQuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAob3RoZXJTZXQpIHtcbiAgICAgICAgdmFyIHNldCA9IHRoaXM7XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKCFvdGhlclNldC5jb250YWlucyhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHNldC5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHVuaW9uIGJldHdlZW4gdGhpcyBhbiBhbm90aGVyIHNldC5cbiAgICAgKiBBZGRzIGFsbCB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gc2V0IHRvIHRoaXMgc2V0LlxuICAgICAqIEBwYXJhbSB7Y29sbGVjdGlvbnMuU2V0fSBvdGhlclNldCBvdGhlciBzZXQuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS51bmlvbiA9IGZ1bmN0aW9uIChvdGhlclNldCkge1xuICAgICAgICB2YXIgc2V0ID0gdGhpcztcbiAgICAgICAgb3RoZXJTZXQuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgc2V0LmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW4gYW5vdGhlciBzZXQuXG4gICAgICogUmVtb3ZlcyBmcm9tIHRoaXMgc2V0IGFsbCB0aGUgdmFsdWVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGdpdmVuIHNldC5cbiAgICAgKiBAcGFyYW0ge2NvbGxlY3Rpb25zLlNldH0gb3RoZXJTZXQgb3RoZXIgc2V0LlxuICAgICAqL1xuICAgIFNldC5wcm90b3R5cGUuZGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChvdGhlclNldCkge1xuICAgICAgICB2YXIgc2V0ID0gdGhpcztcbiAgICAgICAgb3RoZXJTZXQuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgc2V0LnJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldC5cbiAgICAgKiBAcGFyYW0ge2NvbGxlY3Rpb25zLlNldH0gb3RoZXJTZXQgb3RoZXIgc2V0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBzZXQgaXMgYSBzdWJzZXQgb2YgdGhlIGdpdmVuIHNldC5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLmlzU3Vic2V0T2YgPSBmdW5jdGlvbiAob3RoZXJTZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSgpID4gb3RoZXJTZXQuc2l6ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzU3ViID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoIW90aGVyU2V0LmNvbnRhaW5zKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaXNTdWIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpc1N1YjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhpcyBzZXQgaWYgaXQgaXMgcHJlc2VudC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5lZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeS5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggZWxlbWVudFxuICAgICAqIHByZXNlbnQgaW4gdGhpcyBzZXQuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudHM6IHRoZSBlbGVtZW50LiBUbyBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAgICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmZvckVhY2goZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh2KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldCBpbiBhcmJpdHJhcnkgb3JkZXIuXG4gICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldC5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkudmFsdWVzKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXQgY29udGFpbnMgbm8gZWxlbWVudHMuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIHNldCBjb250YWlucyBubyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkuaXNFbXB0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgc2V0LlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHNldC5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkuc2l6ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmNsZWFyKCk7XG4gICAgfTtcbiAgICAvKlxuICAgICogUHJvdmlkZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIGRpc3BsYXlcbiAgICAqL1xuICAgIFNldC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcnJheXMudG9TdHJpbmcodGhpcy50b0FycmF5KCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFNldDtcbn0oKSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBTZXQ7IC8vIGVuZCBvZiBTZXRcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBMaW5rZWRMaXN0XzEgPSByZXF1aXJlKCcuL0xpbmtlZExpc3QnKTtcbnZhciBTdGFjayA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBTdGFjay5cbiAgICAgKiBAY2xhc3MgQSBTdGFjayBpcyBhIExhc3QtSW4tRmlyc3QtT3V0IChMSUZPKSBkYXRhIHN0cnVjdHVyZSwgdGhlIGxhc3RcbiAgICAgKiBlbGVtZW50IGFkZGVkIHRvIHRoZSBzdGFjayB3aWxsIGJlIHRoZSBmaXJzdCBvbmUgdG8gYmUgcmVtb3ZlZC4gVGhpc1xuICAgICAqIGltcGxlbWVudGF0aW9uIHVzZXMgYSBsaW5rZWQgbGlzdCBhcyBhIGNvbnRhaW5lci5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTdGFjaygpIHtcbiAgICAgICAgdGhpcy5saXN0ID0gbmV3IExpbmtlZExpc3RfMS5kZWZhdWx0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtIHRoZSBlbGVtZW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZWxlbWVudCB3YXMgcHVzaGVkIG9yIGZhbHNlIGlmIGl0IGlzIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBTdGFjay5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QuYWRkKGVsZW0sIDApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW0gdGhlIGVsZW1lbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBwdXNoZWQgb3IgZmFsc2UgaWYgaXQgaXMgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIFN0YWNrLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmFkZChlbGVtLCAwKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgYW5kIHJldHVybnMgdGhhdCBvYmplY3QuXG4gICAgICogQHJldHVybiB7Kn0gdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgb3IgdW5kZWZpbmVkIGlmIHRoZVxuICAgICAqIHN0YWNrIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIFN0YWNrLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QucmVtb3ZlRWxlbWVudEF0SW5kZXgoMCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb29rcyBhdCB0aGUgb2JqZWN0IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlXG4gICAgICogc3RhY2suXG4gICAgICogQHJldHVybiB7Kn0gdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgb3IgdW5kZWZpbmVkIGlmIHRoZVxuICAgICAqIHN0YWNrIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIFN0YWNrLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmZpcnN0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzdGFjay5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzdGFjay5cbiAgICAgKi9cbiAgICBTdGFjay5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdGFjayBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICogPHA+SWYgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGlzIHN0YWNrIGFyZVxuICAgICAqIG5vdCBjb21wYXJhYmxlIHdpdGggdGhlID09PSBvcGVyYXRvciwgYSBjdXN0b20gZXF1YWxzIGZ1bmN0aW9uIHNob3VsZCBiZVxuICAgICAqIHByb3ZpZGVkIHRvIHBlcmZvcm0gc2VhcmNoZXMsIHRoZSBmdW5jdGlvbiBtdXN0IHJlY2VpdmUgdHdvIGFyZ3VtZW50cyBhbmRcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGV5IGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBFeGFtcGxlOjwvcD5cbiAgICAgKlxuICAgICAqIDxwcmU+XG4gICAgICogY29uc3QgcGV0c0FyZUVxdWFsQnlOYW1lIChwZXQxLCBwZXQyKSB7XG4gICAgICogIHJldHVybiBwZXQxLm5hbWUgPT09IHBldDIubmFtZTtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW0gZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsXG4gICAgICogZnVuY3Rpb24gdG8gY2hlY2sgaWYgdHdvIGVsZW1lbnRzIGFyZSBlcXVhbC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgc3RhY2sgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LFxuICAgICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBTdGFjay5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbSwgZXF1YWxzRnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5jb250YWlucyhlbGVtLCBlcXVhbHNGdW5jdGlvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBzdGFjayBpcyBlbXB0eS5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgc3RhY2sgY29udGFpbnMgbm8gaXRlbXM7IGZhbHNlXG4gICAgICogb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIFN0YWNrLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmlzRW1wdHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgc3RhY2suXG4gICAgICovXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxpc3QuY2xlYXIoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHN0YWNrIGluXG4gICAgICogTElGTyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuXG4gICAgICogb3B0aW9uYWxseSByZXR1cm4gZmFsc2UuXG4gICAgICovXG4gICAgU3RhY2sucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goY2FsbGJhY2spO1xuICAgIH07XG4gICAgcmV0dXJuIFN0YWNrO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IFN0YWNrOyAvLyBFbmQgb2Ygc3RhY2tcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YWNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbi8qKlxuICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBpdGVtXG4gKiB3aXRoaW4gdGhlIHNwZWNpZmllZCBhcnJheS40XG4gKiBAcGFyYW0geyp9IGFycmF5IHRoZSBhcnJheSBpbiB3aGljaCB0byBzZWFyY2ggdGhlIGVsZW1lbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSB0aGUgZWxlbWVudCB0byBzZWFyY2guXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOmJvb2xlYW49fSBlcXVhbHNGdW5jdGlvbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvXG4gKiBjaGVjayBlcXVhbGl0eSBiZXR3ZWVuIDIgZWxlbWVudHMuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBvciAtMSBpZiBub3QgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgdmFyIGVxdWFscyA9IGVxdWFsc0Z1bmN0aW9uIHx8IHV0aWwuZGVmYXVsdEVxdWFscztcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGVxdWFscyhhcnJheVtpXSwgaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7XG4vKipcbiAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gKiB3aXRoaW4gdGhlIHNwZWNpZmllZCBhcnJheS5cbiAqIEBwYXJhbSB7Kn0gYXJyYXkgdGhlIGFycmF5IGluIHdoaWNoIHRvIHNlYXJjaCB0aGUgZWxlbWVudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIHRoZSBlbGVtZW50IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsIGZ1bmN0aW9uIHVzZWQgdG9cbiAqIGNoZWNrIGVxdWFsaXR5IGJldHdlZW4gMiBlbGVtZW50cy5cbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gKiB3aXRoaW4gdGhlIHNwZWNpZmllZCBhcnJheSBvciAtMSBpZiBub3QgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikge1xuICAgIHZhciBlcXVhbHMgPSBlcXVhbHNGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRFcXVhbHM7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGVxdWFscyhhcnJheVtpXSwgaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmV4cG9ydHMubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICogQHBhcmFtIHsqfSBhcnJheSB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc2VhcmNoIHRoZSBlbGVtZW50LlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gdGhlIGVsZW1lbnQgdG8gc2VhcmNoLlxuICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpib29sZWFuPX0gZXF1YWxzRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb24gdG9cbiAqIGNoZWNrIGVxdWFsaXR5IGJldHdlZW4gMiBlbGVtZW50cy5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zKGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikge1xuICAgIHJldHVybiBpbmRleE9mKGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikgPj0gMDtcbn1cbmV4cG9ydHMuY29udGFpbnMgPSBjb250YWlucztcbi8qKlxuICogUmVtb3ZlcyB0aGUgZmlyc3Qgb2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkuXG4gKiBAcGFyYW0geyp9IGFycmF5IHRoZSBhcnJheSBpbiB3aGljaCB0byBzZWFyY2ggZWxlbWVudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIHRoZSBlbGVtZW50IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsIGZ1bmN0aW9uIHRvXG4gKiBjaGVjayBlcXVhbGl0eSBiZXR3ZWVuIDIgZWxlbWVudHMuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBhcnJheSBjaGFuZ2VkIGFmdGVyIHRoaXMgY2FsbC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikge1xuICAgIHZhciBpbmRleCA9IGluZGV4T2YoYXJyYXksIGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydHMucmVtb3ZlID0gcmVtb3ZlO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSBlcXVhbFxuICogdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSB0aGUgZWxlbWVudCB3aG9zZSBmcmVxdWVuY3kgaXMgdG8gYmUgZGV0ZXJtaW5lZC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsIGZ1bmN0aW9uIHVzZWQgdG9cbiAqIGNoZWNrIGVxdWFsaXR5IGJldHdlZW4gMiBlbGVtZW50cy5cbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5XG4gKiBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZnJlcXVlbmN5KGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikge1xuICAgIHZhciBlcXVhbHMgPSBlcXVhbHNGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRFcXVhbHM7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICB2YXIgZnJlcSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZXF1YWxzKGFycmF5W2ldLCBpdGVtKSkge1xuICAgICAgICAgICAgZnJlcSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmVxO1xufVxuZXhwb3J0cy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIHNwZWNpZmllZCBhcnJheXMgYXJlIGVxdWFsIHRvIG9uZSBhbm90aGVyLlxuICogVHdvIGFycmF5cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiBib3RoIGFycmF5cyBjb250YWluIHRoZSBzYW1lIG51bWJlclxuICogb2YgZWxlbWVudHMsIGFuZCBhbGwgY29ycmVzcG9uZGluZyBwYWlycyBvZiBlbGVtZW50cyBpbiB0aGUgdHdvXG4gKiBhcnJheXMgYXJlIGVxdWFsIGFuZCBhcmUgaW4gdGhlIHNhbWUgb3JkZXIuXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheTEgb25lIGFycmF5IHRvIGJlIHRlc3RlZCBmb3IgZXF1YWxpdHkuXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheTIgdGhlIG90aGVyIGFycmF5IHRvIGJlIHRlc3RlZCBmb3IgZXF1YWxpdHkuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOmJvb2xlYW49fSBlcXVhbHNGdW5jdGlvbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvXG4gKiBjaGVjayBlcXVhbGl0eSBiZXR3ZWVuIGVsZW1lbWVudHMgaW4gdGhlIGFycmF5cy5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsXG4gKi9cbmZ1bmN0aW9uIGVxdWFscyhhcnJheTEsIGFycmF5MiwgZXF1YWxzRnVuY3Rpb24pIHtcbiAgICB2YXIgZXF1YWxzID0gZXF1YWxzRnVuY3Rpb24gfHwgdXRpbC5kZWZhdWx0RXF1YWxzO1xuICAgIGlmIChhcnJheTEubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5MS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWVxdWFscyhhcnJheTFbaV0sIGFycmF5MltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydHMuZXF1YWxzID0gZXF1YWxzO1xuLyoqXG4gKiBSZXR1cm5zIHNoYWxsb3cgYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuXG4gKiBAcGFyYW0geyp9IGFycmF5IHRoZSBhcnJheSB0byBjb3B5LlxuICogQHJldHVybiB7QXJyYXl9IGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGNvcHkoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuY29uY2F0KCk7XG59XG5leHBvcnRzLmNvcHkgPSBjb3B5O1xuLyoqXG4gKiBTd2FwcyB0aGUgZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBpbiB3aGljaCB0byBzd2FwIGVsZW1lbnRzLlxuICogQHBhcmFtIHtudW1iZXJ9IGkgdGhlIGluZGV4IG9mIG9uZSBlbGVtZW50IHRvIGJlIHN3YXBwZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gaiB0aGUgaW5kZXggb2YgdGhlIG90aGVyIGVsZW1lbnQgdG8gYmUgc3dhcHBlZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGFycmF5IGlzIGRlZmluZWQgYW5kIHRoZSBpbmRleGVzIGFyZSB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikge1xuICAgIGlmIChpIDwgMCB8fCBpID49IGFycmF5Lmxlbmd0aCB8fCBqIDwgMCB8fCBqID49IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB0ZW1wID0gYXJyYXlbaV07XG4gICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICBhcnJheVtqXSA9IHRlbXA7XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnRzLnN3YXAgPSBzd2FwO1xuZnVuY3Rpb24gdG9TdHJpbmcoYXJyYXkpIHtcbiAgICByZXR1cm4gJ1snICsgYXJyYXkudG9TdHJpbmcoKSArICddJztcbn1cbmV4cG9ydHMudG9TdHJpbmcgPSB0b1N0cmluZztcbi8qKlxuICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBwcmVzZW50IGluIHRoaXMgYXJyYXlcbiAqIHN0YXJ0aW5nIGZyb20gaW5kZXggMCB0byBsZW5ndGggLSAxLlxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IGluIHdoaWNoIHRvIGl0ZXJhdGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXNcbiAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6IHRoZSBlbGVtZW50IHZhbHVlLCB0byBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAqIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoKGFycmF5LCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIF9pID0gMCwgYXJyYXlfMSA9IGFycmF5OyBfaSA8IGFycmF5XzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhcnJheV8xW19pXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKGVsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLmZvckVhY2ggPSBmb3JFYWNoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXlzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5leHBvcnRzLmhhcyA9IGZ1bmN0aW9uIChvYmosIHByb3ApIHtcbiAgICByZXR1cm4gX2hhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn07XG4vKipcbiAqIERlZmF1bHQgZnVuY3Rpb24gdG8gY29tcGFyZSBlbGVtZW50IG9yZGVyLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlKGEsIGIpIHtcbiAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0Q29tcGFyZSA9IGRlZmF1bHRDb21wYXJlO1xuLyoqXG4gKiBEZWZhdWx0IGZ1bmN0aW9uIHRvIHRlc3QgZXF1YWxpdHkuXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVxdWFscyhhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG5leHBvcnRzLmRlZmF1bHRFcXVhbHMgPSBkZWZhdWx0RXF1YWxzO1xuLyoqXG4gKiBEZWZhdWx0IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYW4gb2JqZWN0IHRvIGEgc3RyaW5nLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRUb1N0cmluZyhpdGVtKSB7XG4gICAgaWYgKGl0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdDT0xMRUNUSU9OX05VTEwnO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1VuZGVmaW5lZChpdGVtKSkge1xuICAgICAgICByZXR1cm4gJ0NPTExFQ1RJT05fVU5ERUZJTkVEJztcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuICckcycgKyBpdGVtO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuICckbycgKyBpdGVtLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0VG9TdHJpbmcgPSBkZWZhdWx0VG9TdHJpbmc7XG4vKipcbiogSm9pbnMgYWxsIHRoZSBwcm9wZXJpZXMgb2YgdGhlIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgam9pbiBzdHJpbmdcbiovXG5mdW5jdGlvbiBtYWtlU3RyaW5nKGl0ZW0sIGpvaW4pIHtcbiAgICBpZiAoam9pbiA9PT0gdm9pZCAwKSB7IGpvaW4gPSAnLCc7IH1cbiAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ0NPTExFQ1RJT05fTlVMTCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzVW5kZWZpbmVkKGl0ZW0pKSB7XG4gICAgICAgIHJldHVybiAnQ09MTEVDVElPTl9VTkRFRklORUQnO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1N0cmluZyhpdGVtKSkge1xuICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHRvcmV0ID0gJ3snO1xuICAgICAgICB2YXIgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIGl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChleHBvcnRzLmhhcyhpdGVtLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9yZXQgPSB0b3JldCArIGpvaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvcmV0ID0gdG9yZXQgKyBwcm9wICsgJzonICsgaXRlbVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9yZXQgKyAnfSc7XG4gICAgfVxufVxuZXhwb3J0cy5tYWtlU3RyaW5nID0gbWFrZVN0cmluZztcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuYykge1xuICAgIHJldHVybiAodHlwZW9mIGZ1bmMpID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudCBpcyB1bmRlZmluZWQuXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqKSA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYSBzdHJpbmcuXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBTdHJpbmddJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcbi8qKlxuICogUmV2ZXJzZXMgYSBjb21wYXJlIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2VDb21wYXJlRnVuY3Rpb24oY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNvbXBhcmVGdW5jdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCwgdikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVGdW5jdGlvbihkLCB2KSAqIC0xO1xuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMucmV2ZXJzZUNvbXBhcmVGdW5jdGlvbiA9IHJldmVyc2VDb21wYXJlRnVuY3Rpb247XG4vKipcbiAqIFJldHVybnMgYW4gZXF1YWwgZnVuY3Rpb24gZ2l2ZW4gYSBjb21wYXJlIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVUb0VxdWFscyhjb21wYXJlRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVGdW5jdGlvbihhLCBiKSA9PT0gMDtcbiAgICB9O1xufVxuZXhwb3J0cy5jb21wYXJlVG9FcXVhbHMgPSBjb21wYXJlVG9FcXVhbHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IDIwMTMgQmFzYXJhdCBBbGkgU3llZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgb3BlbiBzb3VyY2UgbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4vL1xuLy8gT3JnaW5hbCBqYXZhc2NyaXB0IGNvZGUgd2FzIGJ5IE1hdXJpY2lvIFNhbnRvc1xuLy9cbnZhciBfYXJyYXlzID0gcmVxdWlyZSgnLi9hcnJheXMnKTtcbmV4cG9ydHMuYXJyYXlzID0gX2FycmF5cztcbnZhciBCYWdfMSA9IHJlcXVpcmUoJy4vQmFnJyk7XG5leHBvcnRzLkJhZyA9IEJhZ18xLmRlZmF1bHQ7XG52YXIgQlNUcmVlXzEgPSByZXF1aXJlKCcuL0JTVHJlZScpO1xuZXhwb3J0cy5CU1RyZWUgPSBCU1RyZWVfMS5kZWZhdWx0O1xudmFyIERpY3Rpb25hcnlfMSA9IHJlcXVpcmUoJy4vRGljdGlvbmFyeScpO1xuZXhwb3J0cy5EaWN0aW9uYXJ5ID0gRGljdGlvbmFyeV8xLmRlZmF1bHQ7XG52YXIgSGVhcF8xID0gcmVxdWlyZSgnLi9IZWFwJyk7XG5leHBvcnRzLkhlYXAgPSBIZWFwXzEuZGVmYXVsdDtcbnZhciBMaW5rZWREaWN0aW9uYXJ5XzEgPSByZXF1aXJlKCcuL0xpbmtlZERpY3Rpb25hcnknKTtcbmV4cG9ydHMuTGlua2VkRGljdGlvbmFyeSA9IExpbmtlZERpY3Rpb25hcnlfMS5kZWZhdWx0O1xudmFyIExpbmtlZExpc3RfMSA9IHJlcXVpcmUoJy4vTGlua2VkTGlzdCcpO1xuZXhwb3J0cy5MaW5rZWRMaXN0ID0gTGlua2VkTGlzdF8xLmRlZmF1bHQ7XG52YXIgTXVsdGlEaWN0aW9uYXJ5XzEgPSByZXF1aXJlKCcuL011bHRpRGljdGlvbmFyeScpO1xuZXhwb3J0cy5NdWx0aURpY3Rpb25hcnkgPSBNdWx0aURpY3Rpb25hcnlfMS5kZWZhdWx0O1xudmFyIEZhY3RvcnlEaWN0aW9uYXJ5XzEgPSByZXF1aXJlKCcuL0ZhY3RvcnlEaWN0aW9uYXJ5Jyk7XG5leHBvcnRzLkZhY3RvcnlEaWN0aW9uYXJ5ID0gRmFjdG9yeURpY3Rpb25hcnlfMS5kZWZhdWx0O1xudmFyIEZhY3RvcnlEaWN0aW9uYXJ5XzIgPSByZXF1aXJlKCcuL0ZhY3RvcnlEaWN0aW9uYXJ5Jyk7XG5leHBvcnRzLkRlZmF1bHREaWN0aW9uYXJ5ID0gRmFjdG9yeURpY3Rpb25hcnlfMi5kZWZhdWx0O1xudmFyIFF1ZXVlXzEgPSByZXF1aXJlKCcuL1F1ZXVlJyk7XG5leHBvcnRzLlF1ZXVlID0gUXVldWVfMS5kZWZhdWx0O1xudmFyIFByaW9yaXR5UXVldWVfMSA9IHJlcXVpcmUoJy4vUHJpb3JpdHlRdWV1ZScpO1xuZXhwb3J0cy5Qcmlvcml0eVF1ZXVlID0gUHJpb3JpdHlRdWV1ZV8xLmRlZmF1bHQ7XG52YXIgU2V0XzEgPSByZXF1aXJlKCcuL1NldCcpO1xuZXhwb3J0cy5TZXQgPSBTZXRfMS5kZWZhdWx0O1xudmFyIFN0YWNrXzEgPSByZXF1aXJlKCcuL1N0YWNrJyk7XG5leHBvcnRzLlN0YWNrID0gU3RhY2tfMS5kZWZhdWx0O1xudmFyIE11bHRpUm9vdFRyZWVfMSA9IHJlcXVpcmUoJy4vTXVsdGlSb290VHJlZScpO1xuZXhwb3J0cy5NdWx0aVJvb3RUcmVlID0gTXVsdGlSb290VHJlZV8xLmRlZmF1bHQ7XG52YXIgX3V0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbmV4cG9ydHMudXRpbCA9IF91dGlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl19 -return require('typescript-collections'); -}); \ No newline at end of file diff --git a/dist/lib/umd.min.js b/dist/lib/umd.min.js deleted file mode 100644 index cdb1e48..0000000 --- a/dist/lib/umd.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.listComponent=t()}}(function(){return require=function t(e,n,i){function r(s,u){if(!n[s]){if(!e[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(o)return o(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var l=n[s]={exports:{}};e[s][0].call(l.exports,function(t){var n=e[s][1][t];return r(n?n:t)},l,l.exports,t,e,n,i)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s0&&(t=t.rightCh);return t},t.prototype.transplant=function(t,e){null===t.parent?this.root=e:t===t.parent.leftCh?t.parent.leftCh=e:t.parent.rightCh=e,null!==e&&(e.parent=t.parent)},t.prototype.removeNode=function(t){if(null===t.leftCh)this.transplant(t,t.rightCh);else if(null===t.rightCh)this.transplant(t,t.leftCh);else{var e=this.minimumAux(t.rightCh);e.parent!==t&&(this.transplant(e,e.rightCh),e.rightCh=t.rightCh,e.rightCh.parent=e),this.transplant(t,e),e.leftCh=t.leftCh,e.leftCh.parent=e}},t.prototype.inorderTraversalAux=function(t,e,n){null===t||n.stop||(this.inorderTraversalAux(t.leftCh,e,n),n.stop||(n.stop=e(t.element)===!1,n.stop||this.inorderTraversalAux(t.rightCh,e,n)))},t.prototype.levelTraversalAux=function(t,e){var n=new r.default;for(null!==t&&n.enqueue(t);!n.isEmpty();){if(t=n.dequeue(),e(t.element)===!1)return;null!==t.leftCh&&n.enqueue(t.leftCh),null!==t.rightCh&&n.enqueue(t.rightCh)}},t.prototype.preorderTraversalAux=function(t,e,n){null===t||n.stop||(n.stop=e(t.element)===!1,n.stop||(this.preorderTraversalAux(t.leftCh,e,n),n.stop||this.preorderTraversalAux(t.rightCh,e,n)))},t.prototype.postorderTraversalAux=function(t,e,n){null===t||n.stop||(this.postorderTraversalAux(t.leftCh,e,n),n.stop||(this.postorderTraversalAux(t.rightCh,e,n),n.stop||(n.stop=e(t.element)===!1)))},t.prototype.minimumAux=function(t){for(;null!==t.leftCh;)t=t.leftCh;return t},t.prototype.maximumAux=function(t){for(;null!==t.rightCh;)t=t.rightCh;return t},t.prototype.heightAux=function(t){return null===t?-1:Math.max(this.heightAux(t.leftCh),this.heightAux(t.rightCh))+1},t.prototype.insertNode=function(t){for(var e=null,n=this.root,i=null;null!==n;){if(i=this.compare(t.element,n.element),0===i)return null;i<0?(e=n,n=n.leftCh):(e=n,n=n.rightCh)}return t.parent=e,null===e?this.root=t:this.compare(t.element,e.element)<0?e.leftCh=t:e.rightCh=t,t},t.prototype.createNode=function(t){return{element:t,leftCh:null,rightCh:null,parent:null}},t}();Object.defineProperty(n,"__esModule",{value:!0}),n.default=o},{"./Queue":11,"./util":15}],2:[function(t,e,n){"use strict";var i=t("./util"),r=t("./Dictionary"),o=t("./Set"),s=function(){function t(t){this.toStrF=t||i.defaultToString,this.dictionary=new r.default(this.toStrF),this.nElements=0}return t.prototype.add=function(t,e){if(void 0===e&&(e=1),i.isUndefined(t)||e<=0)return!1;if(this.contains(t))this.dictionary.getValue(t).copies+=e;else{var n={value:t,copies:e};this.dictionary.setValue(t,n)}return this.nElements+=e,!0},t.prototype.count=function(t){return this.contains(t)?this.dictionary.getValue(t).copies:0},t.prototype.contains=function(t){return this.dictionary.containsKey(t)},t.prototype.remove=function(t,e){if(void 0===e&&(e=1),i.isUndefined(t)||e<=0)return!1;if(this.contains(t)){var n=this.dictionary.getValue(t);return e>n.copies?this.nElements-=n.copies:this.nElements-=e,n.copies-=e,n.copies<=0&&this.dictionary.remove(t),!0}return!1},t.prototype.toArray=function(){for(var t=[],e=this.dictionary.values(),n=0,i=e;n=this.data.length?t>=this.data.length?-1:t:this.compare(this.data[t],this.data[e])<=0?t:e},t.prototype.siftUp=function(t){for(var e=this.parentIndex(t);t>0&&this.compare(this.data[e],this.data[t])>0;)r.swap(this.data,e,t),t=e,e=this.parentIndex(t)},t.prototype.siftDown=function(t){for(var e=this.minIndex(this.leftChildIndex(t),this.rightChildIndex(t));e>=0&&this.compare(this.data[t],this.data[e])>0;)r.swap(this.data,e,t),t=e,e=this.minIndex(this.leftChildIndex(t),this.rightChildIndex(t))},t.prototype.peek=function(){return this.data.length>0?this.data[0]:void 0},t.prototype.add=function(t){if(!i.isUndefined(t))return this.data.push(t),this.siftUp(this.data.length-1),!0},t.prototype.removeRoot=function(){if(this.data.length>0){var t=this.data[0];return this.data[0]=this.data[this.data.length-1],this.data.splice(this.data.length-1,1),this.data.length>0&&this.siftDown(0),t}},t.prototype.contains=function(t){var e=i.compareToEquals(this.compare);return r.contains(this.data,t,e)},t.prototype.size=function(){return this.data.length},t.prototype.isEmpty=function(){return this.data.length<=0},t.prototype.clear=function(){this.data.length=0},t.prototype.forEach=function(t){r.forEach(this.data,t)},t}();Object.defineProperty(n,"__esModule",{value:!0}),n.default=o},{"./arrays":14,"./util":15}],6:[function(t,e,n){"use strict";var i=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},r=t("./Dictionary"),o=t("./util"),s=function(){function t(t,e){this.key=t,this.value=e}return t.prototype.unlink=function(){this.prev.next=this.next,this.next.prev=this.prev},t}(),u=function(t){function e(e){t.call(this,e),this.head=new s(null,null),this.tail=new s(null,null),this.head.next=this.tail,this.tail.prev=this.head}return i(e,t),e.prototype.appendToTail=function(t){var e=this.tail.prev;e.next=t,t.prev=e,t.next=this.tail,this.tail.prev=t},e.prototype.getLinkedDictionaryPair=function(t){if(!o.isUndefined(t)){var e="$"+this.toStr(t),n=this.table[e];return n}},e.prototype.getValue=function(t){var e=this.getLinkedDictionaryPair(t);if(!o.isUndefined(e))return e.value},e.prototype.remove=function(e){var n=this.getLinkedDictionaryPair(e);if(!o.isUndefined(n))return t.prototype.remove.call(this,e),n.unlink(),n.value},e.prototype.clear=function(){t.prototype.clear.call(this),this.head.next=this.tail,this.tail.prev=this.head},e.prototype.replace=function(t,e){var n="$"+this.toStr(e.key);e.next=t.next,e.prev=t.prev,this.remove(t.key),e.prev.next=e,e.next.prev=e,this.table[n]=e,++this.nElements},e.prototype.setValue=function(t,e){if(!o.isUndefined(t)&&!o.isUndefined(e)){var n=this.getLinkedDictionaryPair(t),i=new s(t,e),r="$"+this.toStr(t);return o.isUndefined(n)?(this.appendToTail(i),this.table[r]=i,void++this.nElements):(this.replace(n,i),n.value)}},e.prototype.keys=function(){var t=[];return this.forEach(function(e,n){t.push(e)}),t},e.prototype.values=function(){var t=[];return this.forEach(function(e,n){t.push(n)}),t},e.prototype.forEach=function(t){for(var e=this.head.next;null!=e.next;){var n=t(e.key,e.value);if(n===!1)return;e=e.next}},e}(r.default);Object.defineProperty(n,"__esModule",{value:!0}),n.default=u},{"./Dictionary":3,"./util":15}],7:[function(t,e,n){"use strict";var i=t("./util"),r=t("./arrays"),o=function(){function t(){this.firstNode=null,this.lastNode=null,this.nElements=0}return t.prototype.add=function(t,e){if(i.isUndefined(e)&&(e=this.nElements),e<0||e>this.nElements||i.isUndefined(t))return!1;var n=this.createNode(t);if(0===this.nElements)this.firstNode=n,this.lastNode=n;else if(e===this.nElements)this.lastNode.next=n,this.lastNode=n;else if(0===e)n.next=this.firstNode,this.firstNode=n;else{var r=this.nodeAtIndex(e-1);n.next=r.next,r.next=n}return this.nElements++,!0},t.prototype.first=function(){if(null!==this.firstNode)return this.firstNode.element},t.prototype.last=function(){if(null!==this.lastNode)return this.lastNode.element},t.prototype.elementAtIndex=function(t){var e=this.nodeAtIndex(t);if(null!==e)return e.element},t.prototype.indexOf=function(t,e){var n=e||i.defaultEquals;if(i.isUndefined(t))return-1;for(var r=this.firstNode,o=0;null!==r;){if(n(r.element,t))return o;o++,r=r.next}return-1},t.prototype.contains=function(t,e){return this.indexOf(t,e)>=0},t.prototype.remove=function(t,e){var n=e||i.defaultEquals;if(this.nElements<1||i.isUndefined(t))return!1;for(var r=null,o=this.firstNode;null!==o;){if(n(o.element,t))return o===this.firstNode?(this.firstNode=this.firstNode.next,o===this.lastNode&&(this.lastNode=null)):o===this.lastNode?(this.lastNode=r,r.next=o.next,o.next=null):(r.next=o.next,o.next=null),this.nElements--,!0;r=o,o=o.next}return!1},t.prototype.clear=function(){this.firstNode=null,this.lastNode=null,this.nElements=0},t.prototype.equals=function(e,n){var r=n||i.defaultEquals;return e instanceof t&&(this.size()===e.size()&&this.equalsAux(this.firstNode,e.firstNode,r))},t.prototype.equalsAux=function(t,e,n){for(;null!==t;){if(!n(t.element,e.element))return!1;t=t.next,e=e.next}return!0},t.prototype.removeElementAtIndex=function(t){if(!(t<0||t>=this.nElements)){var e;if(1===this.nElements)e=this.firstNode.element,this.firstNode=null,this.lastNode=null;else{var n=this.nodeAtIndex(t-1);null===n?(e=this.firstNode.element,this.firstNode=this.firstNode.next):n.next===this.lastNode&&(e=this.lastNode.element,this.lastNode=n),null!==n&&(e=n.next.element,n.next=n.next.next)}return this.nElements--,e}},t.prototype.forEach=function(t){for(var e=this.firstNode;null!==e&&t(e.element)!==!1;)e=e.next},t.prototype.reverse=function(){for(var t=null,e=this.firstNode,n=null;null!==e;)n=e.next,e.next=t,t=e,e=n;n=this.firstNode,this.firstNode=this.lastNode,this.lastNode=n},t.prototype.toArray=function(){for(var t=[],e=this.firstNode;null!==e;)t.push(e.element),e=e.next;return t},t.prototype.size=function(){return this.nElements},t.prototype.isEmpty=function(){return this.nElements<=0},t.prototype.toString=function(){return r.toString(this.toArray())},t.prototype.nodeAtIndex=function(t){if(t<0||t>=this.nElements)return null;if(t===this.nElements-1)return this.lastNode;for(var e=this.firstNode,n=0;n-1&&this.insertIdIntoRoot(e,n);for(var i in this.nodes)if(this.nodes.hasOwnProperty(i)){var r=this.findNodeId(i,t);r>-1&&this.insertIdIntoNode(i,e,r)}},t.prototype.insertIdAfterId=function(t,e){var n=this.findRootId(t);n>-1&&this.insertIdIntoRoot(e,n+1);for(var i in this.nodes)if(this.nodes.hasOwnProperty(i)){var r=this.findNodeId(i,t);r>-1&&this.insertIdIntoNode(i,e,r+1)}},t.prototype.insertIdIntoId=function(t,e){this.nodeInsertAtEnd(t,e),this.nodes[e]=[]},t.prototype.insertIdIntoRoot=function(t,e){if(void 0===e)this.rootInsertAtEnd(t);else if(e<0){var n=this.rootIds.length;this.rootIds.splice(e+n+1,0,t)}else this.rootIds.splice(e,0,t);this.nodes[t]=this.nodes[t]||[]},t.prototype.insertIdIntoNode=function(t,e,n){if(this.nodes[t]=this.nodes[t]||[],this.nodes[e]=this.nodes[e]||[],void 0===n)this.nodeInsertAtEnd(t,e);else if(n<0){var i=this.nodes[t].length;this.nodes[t].splice(n+i+1,0,e)}else this.nodes[t].splice(n,0,e)},t.prototype.moveId=function(t,e,n){var r,o,s=t,u=this.findRootId(s);this.nodes[e]&&(r=e);for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){o=this.findNodeId(a,e);break}var h,l,f=e,d=this.findRootId(f);this.nodes[e]&&(h=e);for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){l=this.findNodeId(a,e);break}if(u>-1)if(d>-1)switch(this.rootDelete(u),n){case i.BEFORE:this.insertIdIntoRoot(s,d);break;case i.AFTER:this.insertIdIntoRoot(s,d+1);break;case i.INSIDE_AT_START:this.nodeInsertAtStart(f,s);break;case i.INSIDE_AT_END:this.nodeInsertAtEnd(f,s)}else{this.rootDelete(u);for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){var p=this.findNodeId(a,f);if(p>-1){switch(n){case i.BEFORE:this.insertIdIntoNode(a,s,p);break;case i.AFTER:this.insertIdIntoNode(a,s,p+1);break;case i.INSIDE_AT_START:this.nodeInsertAtStart(f,s);break;case i.INSIDE_AT_END:this.nodeInsertAtEnd(f,s)}break}}}else if(d>-1){for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){var p=this.findNodeId(a,s);if(p>-1){this.nodeDeleteAtIndex(a,p);break}}switch(n){case i.BEFORE:this.insertIdIntoRoot(s,d);break;case i.AFTER:this.insertIdIntoRoot(s,d+1);break;case i.INSIDE_AT_START:this.nodeInsertAtStart(f,s);break;case i.INSIDE_AT_END:this.nodeInsertAtEnd(f,s)}}else{for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){var p=this.findNodeId(a,s);if(p>-1){this.nodeDeleteAtIndex(a,p);break}}for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){var p=this.findNodeId(a,f);if(p>-1){switch(n){case i.BEFORE:this.insertIdIntoNode(a,s,p);break;case i.AFTER:this.insertIdIntoNode(a,s,p+1);break;case i.INSIDE_AT_START:this.nodeInsertAtStart(f,s);break;case i.INSIDE_AT_END:this.nodeInsertAtEnd(f,s)}break}}}},t.prototype.swapArrayElements=function(t,e,n){var i=t[e];return t[e]=t[n],t[n]=i,t},t.prototype.rootDeleteId=function(t){var e=this.findRootId(t);e>-1&&this.rootDelete(e)},t.prototype.nodeAndSubNodesDelete=function(t){for(var e=[],n=0;nt.size())return!1;var e=!0;return this.forEach(function(n){return!!t.contains(n)||(e=!1,!1)}),e},t.prototype.remove=function(t){return!!this.contains(t)&&(this.dictionary.remove(t),!0)},t.prototype.forEach=function(t){this.dictionary.forEach(function(e,n){return t(n)})},t.prototype.toArray=function(){return this.dictionary.values()},t.prototype.isEmpty=function(){return this.dictionary.isEmpty()},t.prototype.size=function(){return this.dictionary.size()},t.prototype.clear=function(){this.dictionary.clear()},t.prototype.toString=function(){return r.toString(this.toArray())},t}();Object.defineProperty(n,"__esModule",{value:!0}),n.default=s},{"./Dictionary":3,"./arrays":14,"./util":15}],13:[function(t,e,n){"use strict";var i=t("./LinkedList"),r=function(){function t(){this.list=new i.default}return t.prototype.push=function(t){return this.list.add(t,0)},t.prototype.add=function(t){return this.list.add(t,0)},t.prototype.pop=function(){return this.list.removeElementAtIndex(0)},t.prototype.peek=function(){return this.list.first()},t.prototype.size=function(){return this.list.size()},t.prototype.contains=function(t,e){return this.list.contains(t,e)},t.prototype.isEmpty=function(){return this.list.isEmpty()},t.prototype.clear=function(){this.list.clear()},t.prototype.forEach=function(t){this.list.forEach(t)},t}();Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{"./LinkedList":7}],14:[function(t,e,n){"use strict";function i(t,e,n){for(var i=n||p.defaultEquals,r=t.length,o=0;o=0;o--)if(i(t[o],e))return o;return-1}function o(t,e,n){return i(t,e,n)>=0}function s(t,e,n){var r=i(t,e,n);return!(r<0)&&(t.splice(r,1),!0)}function u(t,e,n){for(var i=n||p.defaultEquals,r=t.length,o=0,s=0;s=t.length||n<0||n>=t.length)return!1;var i=t[e];return t[e]=t[n],t[n]=i,!0}function f(t){return"["+t.toString()+"]"}function d(t,e){for(var n=0,i=t;n any; -/** -* Function signature for comparing -* <0 means a is smaller -* = 0 means they are equal -* >0 means a is larger -*/ -export interface ICompareFunction { - (a: T, b: T): number; -} -/** -* Function signature for checking equality -*/ -export interface IEqualsFunction { - (a: T, b: T): boolean; -} -/** -* Function signature for Iterations. Return false to break from loop -*/ -export interface ILoopFunction { - (a: T): boolean | void; -} -/** - * Default function to compare element order. - * @function - */ -export declare function defaultCompare(a: T, b: T): number; -/** - * Default function to test equality. - * @function - */ -export declare function defaultEquals(a: T, b: T): boolean; -/** - * Default function to convert an object to a string. - * @function - */ -export declare function defaultToString(item: any): string; -/** -* Joins all the properies of the object using the provided join string -*/ -export declare function makeString(item: T, join?: string): string; -/** - * Checks if the given argument is a function. - * @function - */ -export declare function isFunction(func: any): boolean; -/** - * Checks if the given argument is undefined. - * @function - */ -export declare function isUndefined(obj: any): boolean; -/** - * Checks if the given argument is a string. - * @function - */ -export declare function isString(obj: any): boolean; -/** - * Reverses a compare function. - * @function - */ -export declare function reverseCompareFunction(compareFunction: ICompareFunction): ICompareFunction; -/** - * Returns an equal function given a compare function. - * @function - */ -export declare function compareToEquals(compareFunction: ICompareFunction): IEqualsFunction; diff --git a/dist/lib/util.js b/dist/lib/util.js deleted file mode 100644 index 4c17215..0000000 --- a/dist/lib/util.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; -var _hasOwnProperty = Object.prototype.hasOwnProperty; -exports.has = function (obj, prop) { - return _hasOwnProperty.call(obj, prop); -}; -/** - * Default function to compare element order. - * @function - */ -function defaultCompare(a, b) { - if (a < b) { - return -1; - } - else if (a === b) { - return 0; - } - else { - return 1; - } -} -exports.defaultCompare = defaultCompare; -/** - * Default function to test equality. - * @function - */ -function defaultEquals(a, b) { - return a === b; -} -exports.defaultEquals = defaultEquals; -/** - * Default function to convert an object to a string. - * @function - */ -function defaultToString(item) { - if (item === null) { - return 'COLLECTION_NULL'; - } - else if (isUndefined(item)) { - return 'COLLECTION_UNDEFINED'; - } - else if (isString(item)) { - return '$s' + item; - } - else { - return '$o' + item.toString(); - } -} -exports.defaultToString = defaultToString; -/** -* Joins all the properies of the object using the provided join string -*/ -function makeString(item, join) { - if (join === void 0) { join = ','; } - if (item === null) { - return 'COLLECTION_NULL'; - } - else if (isUndefined(item)) { - return 'COLLECTION_UNDEFINED'; - } - else if (isString(item)) { - return item.toString(); - } - else { - var toret = '{'; - var first = true; - for (var prop in item) { - if (exports.has(item, prop)) { - if (first) { - first = false; - } - else { - toret = toret + join; - } - toret = toret + prop + ':' + item[prop]; - } - } - return toret + '}'; - } -} -exports.makeString = makeString; -/** - * Checks if the given argument is a function. - * @function - */ -function isFunction(func) { - return (typeof func) === 'function'; -} -exports.isFunction = isFunction; -/** - * Checks if the given argument is undefined. - * @function - */ -function isUndefined(obj) { - return (typeof obj) === 'undefined'; -} -exports.isUndefined = isUndefined; -/** - * Checks if the given argument is a string. - * @function - */ -function isString(obj) { - return Object.prototype.toString.call(obj) === '[object String]'; -} -exports.isString = isString; -/** - * Reverses a compare function. - * @function - */ -function reverseCompareFunction(compareFunction) { - if (!isFunction(compareFunction)) { - return function (a, b) { - if (a < b) { - return 1; - } - else if (a === b) { - return 0; - } - else { - return -1; - } - }; - } - else { - return function (d, v) { - return compareFunction(d, v) * -1; - }; - } -} -exports.reverseCompareFunction = reverseCompareFunction; -/** - * Returns an equal function given a compare function. - * @function - */ -function compareToEquals(compareFunction) { - return function (a, b) { - return compareFunction(a, b) === 0; - }; -} -exports.compareToEquals = compareToEquals; -//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/dist/lib/util.js.map b/dist/lib/util.js.map deleted file mode 100644 index 92f9206..0000000 --- a/dist/lib/util.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/arraysTest.d.ts b/dist/test/arraysTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/arraysTest.js b/dist/test/arraysTest.js deleted file mode 100644 index e46e458..0000000 --- a/dist/test/arraysTest.js +++ /dev/null @@ -1,253 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Arrays', function () { - it('IndexOf returns the right position', function () { - var a = [1, 8, 10]; - chai_1.expect(collections.arrays.indexOf(a, 1)).equals(0); - chai_1.expect(collections.arrays.indexOf(a, 8)).equals(1); - chai_1.expect(collections.arrays.indexOf(a, 10)).equals(2); - chai_1.expect(collections.arrays.indexOf(a, 11)).equals(-1); - chai_1.expect(collections.arrays.indexOf([], 8)).equals(-1); - }); - it('IndexOf with custom equals function returns the right position', function () { - var b = { - val: 1 - }; - var c = { - val: 8 - }; - var d = { - val: 10 - }; - var e = { - val: 11 - }; - var a = [b, c, d]; - var eq = function (arg1, arg2) { - return arg1.val === arg2.val; - }; - chai_1.expect(collections.arrays.indexOf(a, { - val: 1 - })).equals(-1); - chai_1.expect(collections.arrays.indexOf(a, { - val: 1 - }, eq)).equals(0); - chai_1.expect(collections.arrays.indexOf(a, c, eq)).equals(1); - chai_1.expect(collections.arrays.indexOf(a, { - val: 10 - }, eq)).equals(2); - chai_1.expect(collections.arrays.indexOf(a, e, eq)).equals(-1); - chai_1.expect(collections.arrays.indexOf([], b)).equals(-1); - }); - it('lastIndexOf returns the right position', function () { - var a = [1, 8, 8, 8, 10, 10]; - chai_1.expect(collections.arrays.lastIndexOf(a, 1)).equals(0); - chai_1.expect(collections.arrays.lastIndexOf(a, 8)).equals(3); - chai_1.expect(collections.arrays.lastIndexOf(a, 10)).equals(5); - chai_1.expect(collections.arrays.lastIndexOf(a, 11)).equals(-1); - chai_1.expect(collections.arrays.lastIndexOf([], 8)).equals(-1); - }); - it('lastIndexOf with custom equals function returns the right position', function () { - var b = { - val: 1 - }; - var c = { - val: 8 - }; - var d = { - val: 10 - }; - var e = { - val: 11 - }; - var a = [b, b, c, d]; - var eq = function (arg1, arg2) { - return arg1.val === arg2.val; - }; - chai_1.expect(collections.arrays.lastIndexOf(a, { - val: 1 - })).equals(-1); - chai_1.expect(collections.arrays.lastIndexOf(a, { - val: 1 - }, eq)).equals(1); - }); - it('Contains existing elements', function () { - var a = [1, 8, 8, 8, 10, 10]; - chai_1.expect(collections.arrays.contains(a, 1)).equals(true); - chai_1.expect(collections.arrays.contains(a, 8)).equals(true); - chai_1.expect(collections.arrays.contains(a, 10)).equals(true); - chai_1.expect(collections.arrays.contains(a, 11)).equals(false); - chai_1.expect(collections.arrays.contains([], 8)).equals(false); - }); - it('Contains existing elements with custom equals function', function () { - var b = { - val: 1 - }; - var c = { - val: 8 - }; - var d = { - val: 10 - }; - var e = { - val: 11 - }; - var a = [b, b, c, d]; - var eq = function (arg1, arg2) { - return arg1.val === arg2.val; - }; - chai_1.expect(collections.arrays.contains(a, { - val: 1 - })).equals(false); - chai_1.expect(collections.arrays.contains(a, { - val: 1 - }, eq)).equals(true); - chai_1.expect(collections.arrays.contains(a, { - val: 8 - }, eq)).equals(true); - chai_1.expect(collections.arrays.contains(a, { - val: 10 - }, eq)).equals(true); - chai_1.expect(collections.arrays.contains(a, { - val: 11 - }, eq)).equals(false); - chai_1.expect(collections.arrays.contains([], { - val: 11 - }, eq)).equals(false); - }); - it('Gives the right frequency', function () { - var a = [1, 8, 8, 8, 10, 10]; - chai_1.expect(collections.arrays.frequency(a, 1)).equals(1); - chai_1.expect(collections.arrays.frequency(a, 8)).equals(3); - chai_1.expect(collections.arrays.frequency(a, 10)).equals(2); - chai_1.expect(collections.arrays.frequency(a, 11)).equals(0); - }); - it('Gives the right frequency with custom equals', function () { - var b = { - val: 1 - }; - var c = { - val: 8 - }; - var d = { - val: 10 - }; - var e = { - val: 11 - }; - var a = [b, b, c, d]; - var eq = function (arg1, arg2) { - return arg1.val === arg2.val; - }; - chai_1.expect(collections.arrays.frequency(a, { - val: 1 - })).equals(0); - chai_1.expect(collections.arrays.frequency(a, { - val: 1 - }, eq)).equals(2); - chai_1.expect(collections.arrays.frequency(a, { - val: 8 - }, eq)).equals(1); - }); - it('Equal arrays are equal', function () { - var a = [1, 8, 8, 8, 10, 10]; - var b = [1, 8, 8, 8, 10, 10]; - var c = [1, 8, 5, 8, 10, 10]; - var d = [1, 8, 8, 8, 10]; - chai_1.expect(collections.arrays.equals(a, a)).equals(true); - chai_1.expect(collections.arrays.equals(a, b)).equals(true); - chai_1.expect(collections.arrays.equals(a, [])).equals(false); - chai_1.expect(collections.arrays.equals(a, c)).equals(false); - chai_1.expect(collections.arrays.equals(a, d)).equals(false); - chai_1.expect(collections.arrays.equals(a, [])).equals(false); - }); - it('Equal arrays are equal with custom equals function', function () { - var a = [{ - val: 8 - }]; - var b = [{ - val: 8 - }]; - var eq = function (arg1, arg2) { - return arg1.val === arg2.val; - }; - chai_1.expect(collections.arrays.equals(a, a)).equals(true); - chai_1.expect(collections.arrays.equals(a, a, eq)).equals(true); - chai_1.expect(collections.arrays.equals(a, b, eq)).equals(true); - chai_1.expect(collections.arrays.equals(a, b)).equals(false); - }); - it('Removes elements', function () { - var a = []; - chai_1.expect(collections.arrays.remove(a, 1)).equals(false); - a = [4, 9, 9, 10]; - chai_1.expect(collections.arrays.remove(a, 9)).equals(true); - chai_1.expect(collections.arrays.indexOf(a, 9)).equals(1); - chai_1.expect(collections.arrays.indexOf(a, 10)).equals(2); - chai_1.expect(collections.arrays.remove(a, 9)).equals(true); - chai_1.expect(collections.arrays.remove(a, 9)).equals(false); - chai_1.expect(collections.arrays.remove(a, 9)).equals(false); - }); - it('Removes elements with custom equals function', function () { - var c = { - val: 8 - }; - var d = { - val: 10 - }; - var eq = function (arg1, arg2) { - return arg1.val === arg2.val; - }; - var a = [c, d]; - chai_1.expect(collections.arrays.remove(a, { - val: 10 - })).equals(false); - chai_1.expect(collections.arrays.remove(a, { - val: 10 - }, eq)).equals(true); - }); - it('For each gives the right ordering', function () { - var a = []; - collections.arrays.forEach(a, function (e) { - chai_1.expect(true).equals(false); // should not enter here - }); - for (var i = 0; i < 10; i++) { - a.push(i); - } - var i = 0; - collections.arrays.forEach(a, function (e) { - chai_1.expect(e).equals(i); - i++; - }); - }); - it('For each can be interrupted', function () { - var a = []; - var b = []; - for (var i = 0; i < 5; i++) { - a.push(i); - } - collections.arrays.forEach(a, function (e) { - b.push(e); - if (e === 3) { - return false; - } - }); - chai_1.expect([0, 1, 2, 3]).to.deep.equal(b); - }); - it('Copies existing arrays', function () { - var a = [1, 8, 8, 8, 10, 10]; - var b = collections.arrays.copy(a); - chai_1.expect(collections.arrays.equals(a, b)).equals(true); - chai_1.expect(a === b).equals(false); - }); - it('Swaps elements', function () { - var a = [1, 8, 8, 8, 10, 10]; - chai_1.expect(collections.arrays.swap(a, 0, 5)).equals(true); - chai_1.expect(a[0]).equals(10); - chai_1.expect(a[5]).equals(1); - chai_1.expect(collections.arrays.swap(a, 0, 6)).equals(false); - chai_1.expect(collections.arrays.swap(a, 7, 2)).equals(false); - chai_1.expect(collections.arrays.swap(a, -1, 9)).equals(false); - }); -}); -//# sourceMappingURL=arraysTest.js.map \ No newline at end of file diff --git a/dist/test/arraysTest.js.map b/dist/test/arraysTest.js.map deleted file mode 100644 index 992d4b3..0000000 --- a/dist/test/arraysTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"arraysTest.js","sourceRoot":"","sources":["../../src/test/arraysTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/bagTest.d.ts b/dist/test/bagTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/bagTest.js b/dist/test/bagTest.js deleted file mode 100644 index 71f1432..0000000 --- a/dist/test/bagTest.js +++ /dev/null @@ -1,214 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Bag', function () { - var bag; - beforeEach(function () { - bag = new collections.Bag(); - }); - var toStringF = function (f) { - return f.description; - }; - it('Gives the right size', function () { - bag.add('a'); - bag.add('b'); - bag.add('c'); - chai_1.expect(bag.size()).equals(3); - bag.add('d'); - chai_1.expect(bag.size()).equals(4); - bag.remove('d'); - chai_1.expect(bag.size()).equals(3); - bag.clear(); - bag.add('a'); - bag.add('b'); - bag.add('c'); - chai_1.expect(bag.size()).equals(3); - bag.add('d'); - chai_1.expect(bag.size()).equals(4); - bag.remove('d'); - chai_1.expect(bag.size()).equals(3); - }); - it('Gives the right size with duplicated elements', function () { - bag.add('a'); - bag.add('a'); - bag.add('b'); - bag.add('b'); - bag.add('c'); - chai_1.expect(bag.size()).equals(5); - bag.remove('b'); - bag.remove('a'); - chai_1.expect(bag.size()).equals(3); - bag.remove('a'); - bag.remove('b'); - bag.remove('c'); - chai_1.expect(bag.size()).equals(0); - }); - it('Contains existing elements', function () { - bag.add('a'); - bag.add('b'); - bag.add('c'); - bag.add('c'); - bag.add('d'); - chai_1.expect(bag.contains('a')).equals(true); - chai_1.expect(bag.contains('b')).equals(true); - chai_1.expect(bag.contains('c')).equals(true); - chai_1.expect(bag.contains('d')).equals(true); - chai_1.expect(bag.contains('e')).equals(false); - bag.remove('c'); - chai_1.expect(bag.contains('c')).equals(true); - bag.remove('c'); - chai_1.expect(bag.contains('c')).equals(false); - bag.clear(); - bag.add(1); - bag.add(2); - chai_1.expect(bag.contains(1)).equals(true); - chai_1.expect(bag.contains(2)).equals(true); - chai_1.expect(bag.contains(3)).equals(false); - }); - it('Contains existing elements with custom toString function', function () { - bag = new collections.Bag(toStringF); - var fn1 = function () { }; - fn1.description = 'fn1'; - chai_1.expect(bag.contains(fn1)).equals(false); - bag.add(fn1); - chai_1.expect(bag.contains(fn1)).equals(true); - var fn2 = function () { }; - fn2.description = 'fn2'; - chai_1.expect(bag.contains(fn2)).equals(false); - bag.add(fn2); - bag.add(fn2); - chai_1.expect(bag.contains(fn2)).equals(true); - chai_1.expect(bag.size()).equals(3); - bag.remove(fn2); - chai_1.expect(bag.contains(fn2)).equals(true); - bag.remove(fn2); - chai_1.expect(bag.contains(fn2)).equals(false); - }); - it('An empty bag is empty', function () { - chai_1.expect(bag.isEmpty()).equals(true); - bag.add(1); - bag.add(1); - chai_1.expect(bag.isEmpty()).equals(false); - bag.remove(1); - chai_1.expect(bag.isEmpty()).equals(false); - bag.remove(1); - chai_1.expect(bag.isEmpty()).equals(true); - }); - it('Adds', function () { - chai_1.expect(bag.add('a')).equals(true); - chai_1.expect(bag.add('b')).equals(true); - chai_1.expect(bag.contains('a')).equals(true); - chai_1.expect(bag.contains('b')).equals(true); - chai_1.expect(bag.add('b')).equals(true); - chai_1.expect(bag.contains('b')).equals(true); - chai_1.expect(bag.add(null)).equals(true); - chai_1.expect(bag.contains(null)).equals(true); - chai_1.expect(bag.add(null)).equals(true); - chai_1.expect(bag.contains(undefined)).equals(false); - chai_1.expect(bag.add(undefined)).equals(false); - chai_1.expect(bag.contains(undefined)).equals(false); - }); - it('Adds multiple copies', function () { - chai_1.expect(bag.add('a', 1)).equals(true); - chai_1.expect(bag.add('a')).equals(true); - chai_1.expect(bag.add('b', 3)).equals(true); - chai_1.expect(bag.contains('a')).equals(true); - chai_1.expect(bag.contains('b')).equals(true); - chai_1.expect(bag.add('b')).equals(true); - chai_1.expect(bag.count('a')).equals(2); - chai_1.expect(bag.count('b')).equals(4); - bag.remove('a'); - bag.remove('a'); - chai_1.expect(bag.count('a')).equals(0); - }); - it('Removes', function () { - chai_1.expect(bag.add('a')).equals(true); - chai_1.expect(bag.add('a')).equals(true); - chai_1.expect(bag.add('b')).equals(true); - chai_1.expect(bag.remove('a')).equals(true); - chai_1.expect(bag.remove('a')).equals(true); - chai_1.expect(bag.size()).equals(1); - chai_1.expect(bag.remove('b')).equals(true); - chai_1.expect(bag.size()).equals(0); - }); - it('Removes multiple copies', function () { - chai_1.expect(bag.add('a', 1)).equals(true); - chai_1.expect(bag.add('a')).equals(true); - chai_1.expect(bag.add('b', 3)).equals(true); - chai_1.expect(bag.remove('b', 2)).equals(true); - chai_1.expect(bag.count('b')).equals(1); - chai_1.expect(bag.remove('b', 1)).equals(true); - chai_1.expect(bag.count('b')).equals(0); - chai_1.expect(bag.remove('a', 2)).equals(true); - chai_1.expect(bag.count('a')).equals(0); - chai_1.expect(bag.add('c', 3)).equals(true); - chai_1.expect(bag.remove('c', 5)).equals(true); - chai_1.expect(bag.count('a')).equals(0); - chai_1.expect(bag.size()).equals(0); - }); - it('Clear removes all elements', function () { - chai_1.expect(bag.add('b', 3)).equals(true); - bag.clear(); - chai_1.expect(bag.count('b')).equals(0); - chai_1.expect(bag.size()).equals(0); - }); - it('Converts to an array', function () { - var arr = bag.toArray(); - chai_1.expect(arr.length).equals(0); - chai_1.expect(bag.add('b', 3)).equals(true); - chai_1.expect(bag.add('a', 2)).equals(true); - chai_1.expect(bag.add('c')).equals(true); - arr = bag.toArray(); - chai_1.expect(collections.arrays.frequency(arr, 'b')).equals(3); - chai_1.expect(collections.arrays.frequency(arr, 'a')).equals(2); - chai_1.expect(collections.arrays.frequency(arr, 'c')).equals(1); - }); - it('Converts to a set', function () { - var set = bag.toSet(); - chai_1.expect(set.size()).equals(0); - chai_1.expect(bag.add('b', 3)).equals(true); - chai_1.expect(bag.add('a', 2)).equals(true); - chai_1.expect(bag.add('c')).equals(true); - set = bag.toSet(); - chai_1.expect(set.contains('b')).equals(true); - chai_1.expect(set.contains('a')).equals(true); - chai_1.expect(set.contains('c')).equals(true); - }); - it('For each gives all the elements', function () { - bag.forEach(function (e) { - chai_1.expect(false).equals(true); - }); - var a = [1, 5, 5, 6]; - bag.add(1); - bag.add(5); - bag.add(5); - bag.add(6); - bag.forEach(function (e) { - chai_1.expect(collections.arrays.contains(a, e)).equals(true); - }); - var count = 0; - bag.forEach(function (e) { - chai_1.expect(collections.arrays.contains(a, e)).equals(true); - if (e === 5) { - count++; - bag.remove(e); - } - }); - chai_1.expect(count).equals(2); - chai_1.expect(bag.contains(5)).equals(false); - chai_1.expect(bag.contains(1)).equals(true); - chai_1.expect(bag.contains(6)).equals(true); - }); - it('For each can be interrupted', function () { - for (var i = 0; i < 5; i++) { - bag.add(i); - } - var t = 0; - bag.forEach(function (e) { - t++; - return false; - }); - chai_1.expect(t).equals(1); - }); -}); -//# sourceMappingURL=bagTest.js.map \ No newline at end of file diff --git a/dist/test/bagTest.js.map b/dist/test/bagTest.js.map deleted file mode 100644 index 00d83e5..0000000 --- a/dist/test/bagTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bagTest.js","sourceRoot":"","sources":["../../src/test/bagTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/bsTreeTest.d.ts b/dist/test/bsTreeTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/bsTreeTest.js b/dist/test/bsTreeTest.js deleted file mode 100644 index 35672b0..0000000 --- a/dist/test/bsTreeTest.js +++ /dev/null @@ -1,288 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Binary Search Tree', function () { - var tree = null; - beforeEach(function () { - tree = new collections.BSTree(); - }); - var createTree1 = function () { - tree.add('b'); - tree.add('a'); - tree.add('c'); - }; - var createTree2 = function () { - tree.add('f'); - tree.add('b'); - tree.add('a'); - tree.add('d'); - tree.add('c'); - tree.add('e'); - tree.add('g'); - tree.add('i'); - tree.add('h'); - }; - it('Gives the right size', function () { - createTree1(); - chai_1.expect(tree.size()).equals(3); - tree.add('d'); - chai_1.expect(tree.size()).equals(4); - tree.remove('d'); - tree.remove('d'); - chai_1.expect(tree.size()).equals(3); - tree.remove('b'); - tree.remove('b'); - chai_1.expect(tree.size()).equals(2); - tree.remove('c'); - tree.remove('c'); - chai_1.expect(tree.size()).equals(1); - tree.remove('a'); - tree.remove('a'); - chai_1.expect(tree.size()).equals(0); - tree.clear(); - chai_1.expect(tree.size()).equals(0); - createTree1(); - chai_1.expect(tree.size()).equals(3); - tree.add('d'); - chai_1.expect(tree.size()).equals(4); - tree.remove('d'); - chai_1.expect(tree.size()).equals(3); - tree.add('c'); - chai_1.expect(tree.size()).equals(3); - }); - it('Clears removes all elements', function () { - createTree1(); - tree.clear(); - chai_1.expect(tree.contains('a')).equals(false); - }); - it('Gives the right height', function () { - createTree1(); - chai_1.expect(tree.height()).equals(1); - }); - it('Gives the right height 2', function () { - createTree2(); - chai_1.expect(tree.height()).equals(3); - }); - it('Gives the right height on empty tree', function () { - chai_1.expect(tree.height()).equals(-1); - }); - it('Gives the maximum element 1', function () { - createTree1(); - chai_1.expect(tree.maximum()).equals('c'); - }); - it('Gives the maximum element 2', function () { - createTree2(); - chai_1.expect(tree.maximum()).equals('i'); - }); - it('Gives the maximum element on empty tree', function () { - chai_1.expect(tree.maximum()).equals(undefined); - }); - it('Gives the minimum element 1', function () { - createTree1(); - chai_1.expect(tree.minimum()).equals('a'); - }); - it('Gives the minimum element 2', function () { - createTree2(); - chai_1.expect(tree.minimum()).equals('a'); - }); - it('Gives the minimum element on empty tree', function () { - chai_1.expect(tree.minimum()).equals(undefined); - }); - it('Contains existing elements', function () { - createTree1(); - chai_1.expect(tree.contains('a')).equals(true); - chai_1.expect(tree.contains('b')).equals(true); - chai_1.expect(tree.contains('c')).equals(true); - chai_1.expect(tree.contains('e')).equals(false); - tree.remove('a'); - chai_1.expect(tree.contains('a')).equals(false); - chai_1.expect(tree.contains('b')).equals(true); - chai_1.expect(tree.contains('c')).equals(true); - tree.clear(); - tree.add(3); - tree.add(2); - tree.add(4); - tree.add(1); - chai_1.expect(tree.contains(1)).equals(true); - chai_1.expect(tree.contains(2)).equals(true); - chai_1.expect(tree.contains(3)).equals(true); - chai_1.expect(tree.contains(4)).equals(true); - chai_1.expect(tree.contains(5)).equals(false); - }); - it('An empty tree is empty', function () { - chai_1.expect(tree.isEmpty()).equals(true); - tree.add(1); - chai_1.expect(tree.isEmpty()).equals(false); - tree.remove(1); - chai_1.expect(tree.isEmpty()).equals(true); - }); - it('Adds', function () { - chai_1.expect(tree.add('b')).equals(true); - chai_1.expect(tree.add('a')).equals(true); - chai_1.expect(tree.contains('a')).equals(true); - chai_1.expect(tree.contains('b')).equals(true); - chai_1.expect(tree.add('b')).equals(false); - chai_1.expect(tree.contains('b')).equals(true); - chai_1.expect(tree.add(null)).equals(true); - chai_1.expect(tree.contains(null)).equals(true); - chai_1.expect(tree.add(null)).equals(false); - chai_1.expect(tree.contains(undefined)).equals(false); - chai_1.expect(tree.add(undefined)).equals(false); - chai_1.expect(tree.contains(undefined)).equals(false); - }); - it('Removes a leaf', function () { - createTree2(); - tree.remove('c'); - var array = ['a', 'b', 'd', 'e', 'f', 'g', 'h', 'i']; - var b = []; - tree.inorderTraversal(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Removes a node with one children', function () { - createTree2(); - tree.remove('i'); - var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; - var b = []; - tree.inorderTraversal(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Removes a node with two children', function () { - createTree2(); - tree.remove('b'); - var array = ['a', 'c', 'd', 'e', 'f', 'g', 'h', 'i']; - var b = []; - tree.inorderTraversal(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Removes root', function () { - createTree2(); - tree.remove('f'); - var array = ['a', 'b', 'c', 'd', 'e', 'g', 'h', 'i']; - var b = []; - tree.inorderTraversal(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Inorder traversal gives the right ordering', function () { - createTree2(); - var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']; - var b = []; - tree.inorderTraversal(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Inorder traversal cen be interrupted', function () { - createTree2(); - var array = ['a', 'b', 'c', 'd']; - var b = []; - tree.inorderTraversal(function (element) { - b.push(element); - if (element === 'd') { - return false; - } - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Preorder traversal gives the right ordering', function () { - createTree2(); - var array = ['f', 'b', 'a', 'd', 'c', 'e', 'g', 'i', 'h']; - var b = []; - tree.preorderTraversal(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Preorder traversal can be interrupted', function () { - createTree2(); - var array = ['f', 'b', 'a']; - var b = []; - tree.preorderTraversal(function (element) { - b.push(element); - if (element === 'a') { - return false; - } - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Level traversal gives the right ordering', function () { - createTree2(); - var array = ['f', 'b', 'g', 'a', 'd', 'i', 'c', 'e', 'h']; - var b = []; - tree.levelTraversal(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Level traversal can be interrupted', function () { - createTree2(); - var array = ['f', 'b', 'g', 'a', 'd', 'i']; - var b = []; - tree.levelTraversal(function (element) { - b.push(element); - if (element === 'i') { - return false; - } - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Postorter traversal gives the right ordering', function () { - createTree2(); - var array = ['a', 'c', 'e', 'd', 'b', 'h', 'i', 'g', 'f']; - var b = []; - tree.postorderTraversal(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('Postorter traversal can be interrupted', function () { - createTree2(); - var array = ['a', 'c', 'e', 'd', 'b']; - var b = []; - tree.postorderTraversal(function (element) { - b.push(element); - if (element === 'b') { - return false; - } - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('For each gives the right ordering', function () { - createTree2(); - var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']; - var b = []; - tree.forEach(function (element) { - b.push(element); - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('For each can be interrupted', function () { - createTree2(); - var array = ['a', 'b', 'c', 'd']; - var b = []; - tree.forEach(function (element) { - b.push(element); - if (element === 'd') { - return false; - } - }); - chai_1.expect(array).to.deep.equal(b); - }); - it('toArray gives the right ordering', function () { - createTree2(); - var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']; - var b = tree.toArray(); - chai_1.expect(array).to.deep.equal(b); - }); - it('Empty tree returns an empty array', function () { - chai_1.expect(tree.toArray()).to.deep.equal([]); - }); -}); -//# sourceMappingURL=bsTreeTest.js.map \ No newline at end of file diff --git a/dist/test/bsTreeTest.js.map b/dist/test/bsTreeTest.js.map deleted file mode 100644 index 751341d..0000000 --- a/dist/test/bsTreeTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bsTreeTest.js","sourceRoot":"","sources":["../../src/test/bsTreeTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/dictionaryTest.d.ts b/dist/test/dictionaryTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/dictionaryTest.js b/dist/test/dictionaryTest.js deleted file mode 100644 index 1955259..0000000 --- a/dist/test/dictionaryTest.js +++ /dev/null @@ -1,155 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Dictionary', function () { - var dict = null; - var elems = 100; - var elemKeys = []; - for (var i = 0; i < elems; i++) { - elemKeys[i] = '' + i; - } - // Test with some potentially problematic keys - elemKeys[2] = 'hasOwnProperty'; - elemKeys[4] = '__proto__'; - elemKeys[6] = ''; - beforeEach(function () { - dict = new collections.Dictionary(); - }); - it('Maps keys to values with string keys', function () { - chai_1.expect(dict.getValue('sd')).equals(undefined); - // test with string keys - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.setValue(elemKeys[i], i + 1)).equals(undefined); - } - chai_1.expect(dict.size()).equals(elems); - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.getValue(elemKeys[i])).equals(i + 1); - } - dict.setValue('a', 5); - chai_1.expect(dict.getValue('a')).equals(5); - chai_1.expect(dict.setValue('a', 21)).equals(5); - chai_1.expect(dict.size()).equals(elems + 1); - chai_1.expect(dict.getValue('a')).equals(21); - }); - it('Maps keys to values with number keys', function () { - // test with number keys - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.setValue(i, i + 1)).equals(undefined); - } - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.getValue(i)).equals(i + 1); - } - }); - it('Maps keys to values with custom keys', function () { - var ts = function (obj) { - return obj.s; - }; - dict = new collections.Dictionary(ts); - chai_1.expect(dict.getValue('sd')).equals(undefined); - for (var i = 0; i < elems; i++) { - var o = {}; - o.s = elemKeys[i]; - chai_1.expect(dict.setValue(o, i + 1)).equals(undefined); - } - for (var i = 0; i < elems; i++) { - var d = {}; - d.s = elemKeys[i]; - chai_1.expect(dict.getValue(d)).equals(i + 1); - } - }); - it('Removes existing elements from the dictionary', function () { - chai_1.expect(dict.remove('1')).equals(undefined); - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.setValue(elemKeys[i], i + 1)).equals(undefined); - } - chai_1.expect(dict.size()).equals(elems); - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.remove(elemKeys[i])).equals(i + 1); - chai_1.expect(dict.getValue(elemKeys[i])).equals(undefined); - chai_1.expect(dict.remove(elemKeys[i])).equals(undefined); - } - chai_1.expect(dict.size()).equals(0); - }); - it('An empty dictionary is empty', function () { - chai_1.expect(dict.isEmpty()).equals(true); - dict.setValue('1', 1); - chai_1.expect(dict.isEmpty()).equals(false); - dict.remove('1'); - chai_1.expect(dict.isEmpty()).equals(true); - }); - it('Clear removes all elements', function () { - dict.clear(); - dict.setValue(1, 1); - dict.clear(); - chai_1.expect(dict.isEmpty()).equals(true); - chai_1.expect(dict.getValue(1)).equals(undefined); - }); - it('Contains existing keys', function () { - chai_1.expect(dict.containsKey(0)).equals(false); - for (var i = 0; i < 10; i++) { - dict.setValue(elemKeys[i], i); - chai_1.expect(dict.containsKey(elemKeys[i])).equals(true); - } - ; - for (var i = 0; i < 10; i++) { - dict.remove(elemKeys[i]); - chai_1.expect(dict.containsKey(elemKeys[i])).equals(false); - } - ; - }); - it('Gives the right size', function () { - chai_1.expect(dict.size()).equals(0); - for (var i = 0; i < 10; i++) { - dict.setValue(elemKeys[i], i); - chai_1.expect(dict.size()).equals(i + 1); - } - ; - }); - it('Gives all the stored keys', function () { - var k = []; - for (var i = 0; i < elems; i++) { - var keys = dict.keys(); - k.sort(); - keys.sort(); - chai_1.expect(collections.arrays.equals(k, keys)).equals(true); - dict.setValue(elemKeys[i], i); - k.push(elemKeys[i]); - } - }); - it('Gives all the stored values', function () { - var v = []; - for (var i = 0; i < elems; i++) { - var values = dict.values(); - v.sort(); - values.sort(); - chai_1.expect(collections.arrays.equals(v, values)).equals(true); - dict.setValue(elemKeys[i], i); - v.push(i); - } - }); - it('For each gives all the pairs', function () { - for (var i = 0; i < elems; i++) { - dict.setValue(elemKeys[i], i); - } - var keys = dict.keys(); - var values = dict.values(); - dict.forEach(function (k, v) { - chai_1.expect(collections.arrays.remove(keys, k)).equals(true); - chai_1.expect(collections.arrays.remove(values, v)).equals(true); - }); - chai_1.expect(keys.length).equals(0); - chai_1.expect(values.length).equals(0); - }); - it('For each can be interrupted', function () { - for (var i = 0; i < elems; i++) { - dict.setValue(elemKeys[i], i); - } - var t = 0; - dict.forEach(function (k, v) { - t++; - return false; - }); - chai_1.expect(t).equals(1); - }); -}); -//# sourceMappingURL=dictionaryTest.js.map \ No newline at end of file diff --git a/dist/test/dictionaryTest.js.map b/dist/test/dictionaryTest.js.map deleted file mode 100644 index f6cdecd..0000000 --- a/dist/test/dictionaryTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dictionaryTest.js","sourceRoot":"","sources":["../../src/test/dictionaryTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/factoryDictionaryTest.d.ts b/dist/test/factoryDictionaryTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/factoryDictionaryTest.js b/dist/test/factoryDictionaryTest.js deleted file mode 100644 index 2ff862f..0000000 --- a/dist/test/factoryDictionaryTest.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Factory Dictionary', function () { - var dict = null; - var defaultValue = []; - beforeEach(function () { - dict = new collections.FactoryDictionary(function () { return []; }); - }); - it('Uses the default value only when necessary', function () { - chai_1.expect(dict.setDefault('a', defaultValue)).to.deep.equal(defaultValue); - var key = 'b'; - dict.setValue(key, []); - chai_1.expect(dict.setDefault(key, defaultValue)).to.not.equal(defaultValue); - }); - it('Automatically creates a key with a default value if it doesn\'t exist', function () { - var key = 'a'; - chai_1.expect(dict.getValue(key)).to.deep.equal(defaultValue); - chai_1.expect(dict.containsKey(key)).equals(true); - }); -}); -//# sourceMappingURL=factoryDictionaryTest.js.map \ No newline at end of file diff --git a/dist/test/factoryDictionaryTest.js.map b/dist/test/factoryDictionaryTest.js.map deleted file mode 100644 index e2c9f78..0000000 --- a/dist/test/factoryDictionaryTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"factoryDictionaryTest.js","sourceRoot":"","sources":["../../src/test/factoryDictionaryTest.ts"],"names":[],"mappings":";AAAA,IAAY,WAAW,WAAM,cAAc,CAAC,CAAA;AAG5C,qBAAqB,MAAM,CAAC,CAAA;AAE5B,QAAQ,CAAC,oBAAoB,EACzB;IAEI,IAAI,IAAI,GAAQ,IAAI,CAAC;IACrB,IAAI,YAAY,GAAe,EAAE,CAAC;IAElC,UAAU,CAAC;QACP,IAAI,GAAG,IAAI,WAAW,CAAC,iBAAiB,CAAC,cAAM,OAAA,EAAE,EAAF,CAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAC3C;QACI,aAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEvE,IAAI,GAAG,GAAW,GAAG,CAAC;QAEtB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvB,aAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,uEAAuE,EACtE;QACI,IAAI,GAAG,GAAW,GAAG,CAAC;QAEtB,aAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvD,aAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AAEX,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/test/heapTest.d.ts b/dist/test/heapTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/heapTest.js b/dist/test/heapTest.js deleted file mode 100644 index 860aab1..0000000 --- a/dist/test/heapTest.js +++ /dev/null @@ -1,186 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Heap', function () { - var heap = null; - beforeEach(function () { - heap = new collections.Heap(); - }); - var createHeap1 = function () { - heap.add(0); - heap.add(1); - heap.add(2); - heap.add(3); - }; - var createHeap2 = function () { - heap.add(1); - heap.add(3); - heap.add(0); - heap.add(2); - }; - var createHeap3 = function () { - heap.add('a'); - heap.add('b'); - heap.add('c'); - heap.add('d'); - }; - var createHeap4 = function () { - heap.add('b'); - heap.add('d'); - heap.add('a'); - heap.add('c'); - }; - var createHeap5 = function () { - heap.add({ val: 'b' }); - heap.add({ val: 'd' }); - heap.add({ val: 'a' }); - heap.add({ val: 'c' }); - }; - function customCompare(a, b) { - if (a.val < b.val) { - return -1; - } - else if (a.val === b.val) { - return 0; - } - else { - return 1; - } - } - it('Gives the right size 1', function () { - createHeap1(); - chai_1.expect(heap.size()).equals(4); - heap.removeRoot(); - chai_1.expect(heap.size()).equals(3); - }); - it('Gives the right size 2', function () { - createHeap1(); - heap.removeRoot(); - heap.removeRoot(); - heap.removeRoot(); - heap.removeRoot(); - chai_1.expect(heap.size()).equals(0); - }); - it('Gives the right size with strings', function () { - createHeap3(); - heap.removeRoot(); - heap.removeRoot(); - heap.removeRoot(); - heap.removeRoot(); - chai_1.expect(heap.size()).equals(0); - }); - it('Peeks the lowest element', function () { - createHeap1(); - chai_1.expect(heap.peek()).equals(0); - heap.clear(); - chai_1.expect(heap.peek()).equals(undefined); - }); - it('Peeks the lowest element 2', function () { - createHeap2(); - chai_1.expect(heap.peek()).equals(0); - }); - it('Peeks the lowest element with strings', function () { - createHeap3(); - chai_1.expect(heap.peek()).equals('a'); - }); - it('Peeks the lowest element with strings 2', function () { - createHeap4(); - chai_1.expect(heap.peek()).equals('a'); - }); - it('Peeks the lowest element with custom objects', function () { - heap = new collections.Heap(customCompare); - createHeap5(); - chai_1.expect(heap.peek().val).equals('a'); - }); - it('Removes root', function () { - createHeap1(); - chai_1.expect(heap.removeRoot()).equals(0); - chai_1.expect(heap.removeRoot()).equals(1); - chai_1.expect(heap.removeRoot()).equals(2); - chai_1.expect(heap.removeRoot()).equals(3); - }); - it('Removes root 2', function () { - createHeap2(); - heap.add(1); - chai_1.expect(heap.removeRoot()).equals(0); - chai_1.expect(heap.removeRoot()).equals(1); - chai_1.expect(heap.removeRoot()).equals(1); - chai_1.expect(heap.removeRoot()).equals(2); - chai_1.expect(heap.removeRoot()).equals(3); - }); - it('Removes root with custom objects', function () { - heap = new collections.Heap(customCompare); - createHeap5(); - chai_1.expect(heap.removeRoot().val).equals('a'); - chai_1.expect(heap.removeRoot().val).equals('b'); - chai_1.expect(heap.removeRoot().val).equals('c'); - chai_1.expect(heap.removeRoot().val).equals('d'); - }); - it('Adds and peeks', function () { - heap.add(3); - chai_1.expect(heap.peek()).equals(3); - heap.add(2); - chai_1.expect(heap.peek()).equals(2); - heap.add(1); - chai_1.expect(heap.peek()).equals(1); - heap.add(0); - chai_1.expect(heap.peek()).equals(0); - }); - it('Adds and peeks 2', function () { - heap.add(1); - chai_1.expect(heap.peek()).equals(1); - heap.add(3); - chai_1.expect(heap.peek()).equals(1); - heap.add(0); - chai_1.expect(heap.peek()).equals(0); - heap.add(2); - chai_1.expect(heap.peek()).equals(0); - }); - it('An empty heap is empty', function () { - chai_1.expect(heap.isEmpty()).equals(true); - createHeap1(); - for (var i = 0; i < heap.size(); i++) { - chai_1.expect(heap.isEmpty()).equals(false); - heap.removeRoot(); - } - }); - it('Clear removes all elements', function () { - heap.clear(); - createHeap1(); - heap.clear(); - chai_1.expect(heap.isEmpty()).equals(true); - chai_1.expect(heap.peek()).equals(undefined); - }); - it('Contains inserted elements', function () { - createHeap1(); - for (var i = 0; i < 4; i++) { - chai_1.expect(heap.contains(i)).equals(true); - } - chai_1.expect(heap.contains(i)).equals(false); - }); - it('For each gives the right elements', function () { - heap.forEach(function (e) { - chai_1.expect(true).equals(false); // should not enter here - }); - createHeap1(); - var elements = []; - heap.forEach(function (e) { - elements.push(e); - }); - chai_1.expect(collections.arrays.contains(elements, 0)).equals(true); - chai_1.expect(collections.arrays.contains(elements, 1)).equals(true); - chai_1.expect(collections.arrays.contains(elements, 2)).equals(true); - chai_1.expect(collections.arrays.contains(elements, 3)).equals(true); - chai_1.expect(collections.arrays.contains(elements, 4)).equals(false); - }); - it('For each can be interrupted', function () { - createHeap1(); - var elements = []; - heap.forEach(function (e) { - elements.push(e); - return false; - }); - chai_1.expect(elements.length).equals(1); - }); -}); -//# sourceMappingURL=heapTest.js.map \ No newline at end of file diff --git a/dist/test/heapTest.js.map b/dist/test/heapTest.js.map deleted file mode 100644 index dfcb9b4..0000000 --- a/dist/test/heapTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"heapTest.js","sourceRoot":"","sources":["../../src/test/heapTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/linkedListTest.d.ts b/dist/test/linkedListTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/linkedListTest.js b/dist/test/linkedListTest.js deleted file mode 100644 index b3f8a04..0000000 --- a/dist/test/linkedListTest.js +++ /dev/null @@ -1,328 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Linked List', function () { - var list = null; - var elems = 100; - var equals = function (a, b) { - return a.el === b.el; - }; - beforeEach(function () { - list = new collections.LinkedList(); - }); - it('Inserts elements', function () { - chai_1.expect(list.first()).equals(undefined); - chai_1.expect(list.last()).equals(undefined); - chai_1.expect(list.size()).equals(0); - for (var i = 0; i < elems; i++) { - list.add(i); - chai_1.expect(list.first()).equals(0); - chai_1.expect(list.last()).equals(i); - if (i === 0) { - chai_1.expect(list.first()).equals(list.last()); - } - chai_1.expect(list.size()).equals(i + 1); - } - }); - it('Reverses the list 1', function () { - list.add(1); - list.add(2); - list.add(3); - list.reverse(); - chai_1.expect(list.elementAtIndex(0)).equals(3); - chai_1.expect(list.elementAtIndex(1)).equals(2); - chai_1.expect(list.elementAtIndex(2)).equals(1); - }); - it('Reverses the list 2', function () { - list.add(1); - list.add(2); - list.reverse(); - chai_1.expect(list.elementAtIndex(0)).equals(2); - chai_1.expect(list.elementAtIndex(1)).equals(1); - }); - it('Reverses the list 2', function () { - list.add(1); - list.reverse(); - chai_1.expect(list.elementAtIndex(0)).equals(1); - chai_1.expect(list.elementAtIndex(1)).equals(undefined); - }); - it('Clear removes all elements', function () { - for (var i = 0; i < elems; i++) { - list.add(i); - } - list.clear(); - chai_1.expect(list.first()).equals(undefined); - chai_1.expect(list.last()).equals(undefined); - chai_1.expect(list.size()).equals(0); - }); - it('Gives the right size', function () { - chai_1.expect(list.size()).equals(0); - list.add(1); - chai_1.expect(list.size()).equals(1); - list.add(1); - chai_1.expect(list.size()).equals(2); - }); - it('Inserts an element to specified index', function () { - chai_1.expect(list.elementAtIndex(-1)).equals(undefined); - chai_1.expect(list.elementAtIndex(0)).equals(undefined); - chai_1.expect(list.elementAtIndex(1)).equals(undefined); - for (var i = 0; i < elems; i++) { - list.add(i); - chai_1.expect(list.elementAtIndex(list.size() - 1)).equals(i); - chai_1.expect(list.elementAtIndex(i)).equals(i); - for (var j = 0; j < i; j++) { - chai_1.expect(list.elementAtIndex(j)).equals(j); - } - } - }); - it('Two equal lists are equal', function () { - list.add(1); - list.add(2); - var list2 = new collections.LinkedList(); - list2.add(1); - list2.add(2); - chai_1.expect(list.equals(list2)).equals(true); - list2.clear(); - list2.add(2); - list2.add(1); - chai_1.expect(list.equals(list2)).equals(false); - chai_1.expect(list.equals([1, 2])).equals(false); - }); - it('Doesn\'t insert elements to invalid indexes', function () { - chai_1.expect(list.add(0, 1)).equals(false); - chai_1.expect(list.size() === 0).equals(true); - chai_1.expect(list.first()).equals(undefined); - chai_1.expect(list.last()).equals(undefined); - }); - it('Inserts elements to the last index', function () { - for (var i = 0; i < elems; i++) { - chai_1.expect(list.add(i, i)).equals(true); - chai_1.expect(list.elementAtIndex(i)).equals(i); - chai_1.expect(list.first()).equals(0); - chai_1.expect(list.last()).equals(i); - if (i === 0) { - chai_1.expect(list.first()).equals(list.last()); - } - chai_1.expect(list.size()).equals(i + 1); - } - }); - it('Inserts elements at the first index', function () { - for (var j = 0; j < elems; j++) { - for (var i = 0; i < j; i++) { - list.add(i); - } - list.add(-i, 0); - chai_1.expect(list.elementAtIndex(0)).equals(-i); - chai_1.expect(list.first()).equals(-i); - } - }); - it('Inserts elements to custom index', function () { - for (var j = 0; j < elems; j++) { - list.add(j); - } - list.add(-100, elems / 2); - chai_1.expect(list.elementAtIndex(elems / 2)).equals(-100); - }); - it('Finds elements with indexOf', function () { - chai_1.expect(list.indexOf(0)).equals(-1); - for (var j = 0; j < elems; j++) { - list.add(j + 1); - chai_1.expect(list.indexOf(j + 1)).equals(j); - chai_1.expect(list.indexOf(-100)).equals(-1); - } - for (var j = 0; j < elems; j++) { - chai_1.expect(list.indexOf(j + 1)).equals(j); - chai_1.expect(list.indexOf(-100)).equals(-1); - } - }); - it('Finds elements with indexOf and custom equals function', function () { - chai_1.expect(list.indexOf({ - el: 1 - }, equals)).equals(-1); - for (var j = 0; j < elems; j++) { - list.add({ - el: j + 1 - }); - chai_1.expect(list.indexOf({ - el: j + 1 - }, equals)).equals(j); - chai_1.expect(list.indexOf({ - el: -200 - }, equals)).equals(-1); - } - for (var j = 0; j < elems; j++) { - chai_1.expect(list.indexOf({ - el: j + 1 - }, equals)).equals(j); - chai_1.expect(list.indexOf({ - el: -200 - }, equals)).equals(-1); - } - }); - it('Removes elements', function () { - chai_1.expect(list.remove(1)).equals(false); - chai_1.expect(list.size() === 0).equals(true); - chai_1.expect(list.last()).equals(undefined); - chai_1.expect(list.first()).equals(undefined); - for (var i = 0; i < elems; i++) { - list.add(i); - chai_1.expect(list.remove(i)).equals(true); - chai_1.expect(list.size() === 0).equals(true); - chai_1.expect(list.last()).equals(undefined); - chai_1.expect(list.first()).equals(undefined); - } - list.add(1); - list.add(2); - chai_1.expect(list.remove(1)).equals(true); - chai_1.expect(list.size() === 1).equals(true); - chai_1.expect(list.first()).equals(2); - chai_1.expect(list.last()).equals(2); - list.clear(); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - chai_1.expect(list.remove(2)).equals(true); - chai_1.expect(list.size() === 3).equals(true); - chai_1.expect(list.first()).equals(1); - chai_1.expect(list.last()).equals(4); - chai_1.expect(list.elementAtIndex(0)).equals(1); - chai_1.expect(list.elementAtIndex(1)).equals(3); - chai_1.expect(list.elementAtIndex(2)).equals(4); - chai_1.expect(list.elementAtIndex(3)).equals(undefined); - list.clear(); - for (var i = 0; i < elems; i++) { - list.add(i); - } - var half = elems / 2; - list.remove(elems / 2); - for (var i = 0; i < elems; i++) { - if (i === (half)) { - chai_1.expect(list.indexOf(i)).equals(-1); - } - else if (i < half) { - chai_1.expect(list.indexOf(i)).equals(i); - } - else if (i > half) { - chai_1.expect(list.indexOf(i)).equals(i - 1); - } - } - chai_1.expect(list.size() === (elems - 1)).equals(true); - }); - it('Doesn\'t remove non existing elements', function () { - chai_1.expect(list.remove(5)).equals(false); - chai_1.expect(list.size()).equals(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - chai_1.expect(list.remove(5)).equals(false); - chai_1.expect(list.size()).equals(4); - }); - it('Removes elements with custom equals', function () { - chai_1.expect(list.remove({ el: 1 })).equals(false); - for (var i = 0; i < elems; i++) { - list.add({ el: i }); - } - for (var i = 0; i < elems; i++) { - chai_1.expect(list.remove({ el: i })).equals(false); - chai_1.expect(list.remove({ el: i }, equals)).equals(true); - } - }); - it('Removes elements at specified index', function () { - chai_1.expect(list.removeElementAtIndex(0)).equals(undefined); - chai_1.expect(list.removeElementAtIndex(-1)).equals(undefined); - chai_1.expect(list.removeElementAtIndex(1)).equals(undefined); - chai_1.expect(list.size() === 0).equals(true); - list.add(1); - chai_1.expect(list.removeElementAtIndex(-1)).equals(undefined); - chai_1.expect(list.removeElementAtIndex(1)).equals(undefined); - chai_1.expect(list.size() === 1).equals(true); - chai_1.expect(list.removeElementAtIndex(0)).equals(1); - chai_1.expect(list.size() === 0).equals(true); - chai_1.expect(list.first()).equals(undefined); - chai_1.expect(list.last()).equals(undefined); - chai_1.expect(list.elementAtIndex(0)).equals(undefined); - list.add(1); - list.add(2); - chai_1.expect(list.removeElementAtIndex(0)).equals(1); - chai_1.expect(list.size() === 1).equals(true); - chai_1.expect(list.first()).equals(2); - list.clear(); - list.add(1); - list.add(2); - list.add(3); - chai_1.expect(list.removeElementAtIndex(2)).equals(3); - chai_1.expect(list.size() === 2).equals(true); - chai_1.expect(list.first()).equals(1); - chai_1.expect(list.last()).equals(2); - list.clear(); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - chai_1.expect(list.removeElementAtIndex(2)).equals(3); - chai_1.expect(list.size() === 4).equals(true); - chai_1.expect(list.first()).equals(1); - chai_1.expect(list.last()).equals(5); - chai_1.expect(list.elementAtIndex(0)).equals(1); - chai_1.expect(list.elementAtIndex(1)).equals(2); - chai_1.expect(list.elementAtIndex(2)).equals(4); - chai_1.expect(list.elementAtIndex(3)).equals(5); - }); - it('Converts the list to an array', function () { - chai_1.expect(list.toArray().length).equals(0); - list.add(5); - var arr = list.toArray(); - chai_1.expect(arr[0]).equals(5); - chai_1.expect(arr.length).equals(1); - list.add(8); - arr = list.toArray(); - chai_1.expect(arr[0]).equals(5); - chai_1.expect(arr[1]).equals(8); - chai_1.expect(arr.length).equals(2); - }); - it('Two identical linked lists are equal', function () { - var list2 = new collections.LinkedList(); - chai_1.expect(list.equals(list2)).equals(true); - list.add(1); - list.add(2); - chai_1.expect(list.equals(list2)).equals(false); - list2.add(2); - list2.add(1); - chai_1.expect(list.equals(list2)).equals(false); - list2.clear(); - list2.add(1); - list2.add(2); - chai_1.expect(list.equals(list2)).equals(true); - }); - it('For each gives the right ordering', function () { - list.forEach(function (e) { - chai_1.expect(true).equals(false); // should not enter here - }); - for (var i = 0; i < elems; i++) { - list.add(i); - } - var i = 0; - list.forEach(function (e) { - chai_1.expect(e).equals(i); - i++; - }); - }); - it('For each can be interrupted', function () { - var array = [0, 1, 2, 3, 4]; - var b = []; - for (var i = 0; i < elems; i++) { - list.add(i); - } - list.forEach(function (e) { - b.push(e); - if (e === 4) { - return false; - } - }); - chai_1.expect(array).to.deep.equal(b); - }); -}); -//# sourceMappingURL=linkedListTest.js.map \ No newline at end of file diff --git a/dist/test/linkedListTest.js.map b/dist/test/linkedListTest.js.map deleted file mode 100644 index fb13871..0000000 --- a/dist/test/linkedListTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"linkedListTest.js","sourceRoot":"","sources":["../../src/test/linkedListTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/multiDictionaryTest.d.ts b/dist/test/multiDictionaryTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/multiDictionaryTest.js b/dist/test/multiDictionaryTest.js deleted file mode 100644 index 9221d7e..0000000 --- a/dist/test/multiDictionaryTest.js +++ /dev/null @@ -1,157 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Multi Dictionary', function () { - var dict = null; - var elems = 100; - beforeEach(function () { - dict = new collections.MultiDictionary(); - }); - it('Maps keys to values with string keys', function () { - chai_1.expect(dict.getValue('sd')).to.deep.equal([]); - // test with string keys - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.setValue('' + i, i + 1)).equals(true); - } - chai_1.expect(dict.size()).equals(elems); - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.getValue('' + i)).to.deep.equal([i + 1]); - } - dict.setValue('a', 5); - chai_1.expect(dict.getValue('a')).to.deep.equal([5]); - chai_1.expect(dict.setValue('a', 21)).equals(true); - chai_1.expect(dict.size()).equals(elems + 1); - chai_1.expect(dict.getValue('a')).to.deep.equal([5, 21]); - }); - it('Maps keys to values with number keys', function () { - // test with number keys - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.setValue(i, i + 1)).equals(true); - } - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.getValue(i)).to.deep.equal([i + 1]); - } - }); - it('Maps keys to values with custom keys', function () { - var ts = function (obj) { - return obj.s; - }; - dict = new collections.MultiDictionary(ts); - chai_1.expect(dict.getValue('sd')).to.deep.equal([]); - for (var i = 0; i < elems; i++) { - var o = {}; - o.s = '' + i; - chai_1.expect(dict.setValue(o, i + 1)).equals(true); - } - for (var i = 0; i < elems; i++) { - var d = {}; - d.s = '' + i; - chai_1.expect(dict.getValue(d)).to.deep.equal([i + 1]); - } - }); - it('Maps multiple values', function () { - dict.setValue('a', 5); - chai_1.expect(dict.getValue('a')).to.deep.equal([5]); - chai_1.expect(dict.setValue('a', 21)).equals(true); - chai_1.expect(dict.size()).equals(1); - chai_1.expect(dict.getValue('a')).to.deep.equal([5, 21]); - chai_1.expect(dict.size()).equals(1); - chai_1.expect(dict.setValue('a', 31)).equals(true); - chai_1.expect(dict.size()).equals(1); - chai_1.expect(dict.getValue('a')).to.deep.equal([5, 21, 31]); - chai_1.expect(dict.size()).equals(1); - }); - it('Removes existing elements from the dictionary', function () { - chai_1.expect(dict.remove('1')).equals(false); - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.setValue('' + i, i + 1)).equals(true); - } - chai_1.expect(dict.size()).equals(elems); - for (var i = 0; i < elems; i++) { - chai_1.expect(dict.remove('' + i)).equals(true); - chai_1.expect(dict.getValue('' + i)).to.deep.equal([]); - chai_1.expect(dict.remove('' + i)).equals(false); - } - chai_1.expect(dict.size()).equals(0); - }); - it('Removes all values from a key', function () { - dict.setValue('a', 1); - dict.remove('a'); - chai_1.expect(dict.containsKey('a')).equals(false); - chai_1.expect(dict.getValue('a')).to.deep.equal([]); - dict.setValue('a', 2); - dict.setValue('a', 3); - dict.remove('a'); - chai_1.expect(dict.containsKey('a')).equals(false); - chai_1.expect(dict.getValue('a')).to.deep.equal([]); - }); - it('Removes a single value from a key', function () { - dict.setValue('a', 1); - dict.remove('a', 1); - chai_1.expect(dict.containsKey('a')).equals(false); - chai_1.expect(dict.getValue('a')).to.deep.equal([]); - dict.setValue('a', 2); - dict.setValue('a', 3); - dict.remove('a', 3); - chai_1.expect(dict.containsKey('a')).equals(true); - chai_1.expect(dict.getValue('a')).to.deep.equal([2]); - dict.remove('a', 2); - chai_1.expect(dict.containsKey('a')).equals(false); - chai_1.expect(dict.getValue('a')).to.deep.equal([]); - }); - it('An empty dictionary is empty', function () { - chai_1.expect(dict.isEmpty()).equals(true); - dict.setValue('1', 1); - chai_1.expect(dict.isEmpty()).equals(false); - dict.remove('1'); - chai_1.expect(dict.isEmpty()).equals(true); - }); - it('Clear removes all elements', function () { - dict.clear(); - dict.setValue(1, 1); - dict.clear(); - chai_1.expect(dict.isEmpty()).equals(true); - chai_1.expect(dict.getValue(1)).to.deep.equal([]); - }); - it('Contains existing keys', function () { - chai_1.expect(dict.containsKey(0)).equals(false); - for (var i = 0; i < 10; i++) { - dict.setValue(i, i); - chai_1.expect(dict.containsKey(i)).equals(true); - } - for (var i = 0; i < 10; i++) { - dict.remove(i); - chai_1.expect(dict.containsKey(i)).equals(false); - } - }); - it('Gives the right size', function () { - chai_1.expect(dict.size()).equals(0); - for (var i = 0; i < 10; i++) { - dict.setValue(i, i); - chai_1.expect(dict.size()).equals(i + 1); - } - }); - it('Gives all the stored keys', function () { - var k = []; - for (var i = 0; i < elems; i++) { - var keys = dict.keys(); - k.sort(); - keys.sort(); - chai_1.expect(k).to.deep.equal(keys); - dict.setValue('' + i, i); - k.push('' + i); - } - }); - it('Gives all the stored values', function () { - var v = []; - for (var i = 0; i < elems; i++) { - var values = dict.values(); - v.sort(); - values.sort(); - chai_1.expect(v).to.deep.equal(values); - dict.setValue('' + i, i); - v.push(i); - } - }); -}); -//# sourceMappingURL=multiDictionaryTest.js.map \ No newline at end of file diff --git a/dist/test/multiDictionaryTest.js.map b/dist/test/multiDictionaryTest.js.map deleted file mode 100644 index b2ec484..0000000 --- a/dist/test/multiDictionaryTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"multiDictionaryTest.js","sourceRoot":"","sources":["../../src/test/multiDictionaryTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/multiRootTreeTest.d.ts b/dist/test/multiRootTreeTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/multiRootTreeTest.js b/dist/test/multiRootTreeTest.js deleted file mode 100644 index 15b3b62..0000000 --- a/dist/test/multiRootTreeTest.js +++ /dev/null @@ -1,531 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Multi Root Tree', function () { - var tree; - beforeEach(function () { - tree = new collections.MultiRootTree(); - }); - it('Constructs', function () { - chai_1.expect(tree.getRootIds()).to.deep.equal([]); - chai_1.expect(tree.getNodes()).to.deep.equal({}); - }); - it('Can insert one root key', function () { - tree.insertIdIntoRoot('1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '1': [] }); - }); - it('Can insert 2 root keys', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '1': [], '2': [] }); - }); - it('Can insert root key with +1 position', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoRoot('3'); - tree.insertIdIntoRoot('0', 1); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '0', '2', '3']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '0': [], '1': [], '2': [], '3': [] }); - }); - it('Can insert root key with -1 position', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoRoot('3'); - tree.insertIdIntoRoot('0', -1); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '3', '0']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '0': [], '1': [], '2': [], '3': [] }); - }); - it('Can insert root key with -2 position', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoRoot('3'); - tree.insertIdIntoRoot('0', -2); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '0', '3']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '0': [], '1': [], '2': [], '3': [] }); - }); - it('Can insert a node', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoNode('1', '1.1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '1': ['1.1'], '1.1': [] }); - }); - it('Can insert two nodes', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoNode('1', '1.1'); - tree.insertIdIntoNode('1', '1.2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '1': ['1.1', '1.2'], '1.1': [], '1.2': [] }); - }); - it('Can insert a root key before a root key', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('3'); - tree.insertIdBeforeId('3', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '3']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '1': [], '2': [], '3': [] }); - }); - it('Can insert a node before a node key v1', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoNode('1', '1.1'); - tree.insertIdIntoNode('1', '1.2'); - tree.insertIdBeforeId('1.2', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['1.1', 'A', '1.2'], - '1.1': [], '1.2': [], 'A': [] - }); - }); - it('Can insert a node before a node key v2 ', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoNode('1', '1.1'); - tree.insertIdIntoNode('1', '1.2'); - tree.insertIdIntoNode('1.2', '1.2.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.2'); - tree.insertIdIntoNode('1.2.1', '1.2.1.3'); - tree.insertIdBeforeId('1.2.1.1', 'A'); - tree.insertIdBeforeId('1.2.1.3', 'B'); - tree.insertIdBeforeId('1.2.1.3', 'C'); - tree.insertIdBeforeId('1', 'D'); - tree.insertIdBeforeId('C', 'E'); - tree.insertIdBeforeId('1.2', 'F'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['D', '1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['1.1', 'F', '1.2'], - '1.1': [], '1.2': ['1.2.1'], - '1.2.1': ['A', '1.2.1.1', '1.2.1.2', 'B', 'E', 'C', '1.2.1.3'], - '1.2.1.1': [], '1.2.1.2': [], '1.2.1.3': [], - 'A': [], 'B': [], 'C': [], 'D': [], 'E': [], 'F': [], - }); - }); - it('Can insert a root key after a root key', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('3'); - tree.insertIdAfterId('1', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '3']); - chai_1.expect(tree.getNodes()).to.deep.equal({ '1': [], '2': [], '3': [] }); - }); - it('Can insert a node key after a node key', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoNode('1', '1.1'); - tree.insertIdIntoNode('1', '1.2'); - tree.insertIdIntoNode('1.2', '1.2.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.2'); - tree.insertIdIntoNode('1.2.1', '1.2.1.3'); - tree.insertIdAfterId('1.2.1.1', 'A'); - tree.insertIdAfterId('1.2.1.3', 'B'); - tree.insertIdAfterId('1.2.1.3', 'C'); - tree.insertIdAfterId('1', 'D'); - tree.insertIdAfterId('C', 'E'); - tree.insertIdAfterId('1.2', 'F'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', 'D']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['1.1', '1.2', 'F'], - '1.1': [], '1.2': ['1.2.1'], - '1.2.1': ['1.2.1.1', 'A', '1.2.1.2', '1.2.1.3', 'C', 'E', 'B'], - '1.2.1.1': [], '1.2.1.2': [], '1.2.1.3': [], - 'A': [], 'B': [], 'C': [], 'D': [], 'E': [], 'F': [], - }); - }); - it('Can delete a key from root', function () { - tree.insertIdIntoRoot('1'); - tree.deleteId('1'); - chai_1.expect(tree.getRootIds()).to.deep.equal([]); - chai_1.expect(tree.getNodes()).to.deep.equal({}); - }); - it('Can delete a nested key', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('1', '1.1'); - tree.insertIdIntoNode('1', '1.2'); - tree.insertIdIntoNode('1.2', '1.2.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.2'); - tree.insertIdIntoNode('1.2.1', '1.2.1.3'); - tree.deleteId('1.2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['1.1'], '2': [], - '1.1': [], - }); - }); - it('Can delete a nested key v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('1', '1.1'); - tree.insertIdIntoNode('1.1', '1.1.1'); - tree.insertIdIntoNode('1', '1.2'); - tree.insertIdIntoNode('1.2', '1.2.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.2'); - tree.insertIdIntoNode('1.2.1', '1.2.1.3'); - tree.deleteId('1.2'); - tree.deleteId('1.1.1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['1.1'], '2': [], - '1.1': [], - }); - }); - it('Can delete a nested key v3', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('1', '1.1'); - tree.insertIdIntoNode('1.1', '1.1.1'); - tree.insertIdIntoNode('1', '1.2'); - tree.insertIdIntoNode('1.2', '1.2.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.2'); - tree.insertIdIntoNode('1.2.1', '1.2.1.3'); - tree.deleteId('1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '2': [], - }); - }); - it('Can insert id inside id v1', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoId('1', '1.1'); - tree.insertIdIntoId('1', '1.2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['1.1', '1.2'], - '1.1': [], '1.2': [] - }); - }); - it('Can insert id inside id v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoNode('1', '1.1'); - tree.insertIdIntoNode('1', '1.2'); - tree.insertIdIntoNode('1.2', '1.2.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.1'); - tree.insertIdIntoNode('1.2.1', '1.2.1.2'); - tree.insertIdIntoNode('1.2.1', '1.2.1.3'); - tree.insertIdAfterId('1.2.1.1', 'A'); - tree.insertIdAfterId('1.2.1.3', 'B'); - tree.insertIdAfterId('1.2.1.3', 'C'); - tree.insertIdAfterId('1', 'D'); - tree.insertIdAfterId('C', 'E'); - tree.insertIdAfterId('1.2', 'F'); - tree.insertIdIntoId('C', 'Z'); - tree.insertIdIntoId('Z', 'X'); - tree.insertIdIntoId('1.2', 'Y'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', 'D']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['1.1', '1.2', 'F'], - '1.1': [], '1.2': ['1.2.1', 'Y'], - '1.2.1': ['1.2.1.1', 'A', '1.2.1.2', '1.2.1.3', 'C', 'E', 'B'], - '1.2.1.1': [], '1.2.1.2': [], '1.2.1.3': [], - 'A': [], 'B': [], 'C': ['Z'], 'D': [], 'E': [], 'F': [], 'Z': ['X'], 'X': [], 'Y': [] - }); - }); - it('Can move id before id (root to root)', function () { - tree.insertIdIntoRoot('2'); - tree.insertIdIntoRoot('3'); - tree.insertIdIntoRoot('1'); - tree.moveIdBeforeId('1', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '3']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': [], '2': [], '3': [] - }); - }); - it('Can move id before id (root to node)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('1', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': [], - 'A': [] - }); - tree.moveIdBeforeId('2', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['2', 'A'], '2': [], - 'A': [] - }); - }); - it('Can move id before id (root to node) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdBeforeId('2', 'B'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': ['2.1'], - '2.1': [], - 'A': ['2', 'B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id before id (node to root)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdBeforeId('A', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', 'A', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': [], '2': ['2.1'], - '2.1': [], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id before id (node to root) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdBeforeId('2.1', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2.1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': [], - '2.1': [], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id before id (node to node)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdBeforeId('A', '2.1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': [], '2': ['A', '2.1'], - '2.1': [], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id before id (node to node) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdBeforeId('C', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['C', 'A'], '2': ['2.1'], - '2.1': [], - 'A': ['B'], 'B': [], 'C': [] - }); - }); - // after - it('Can move id after id (root to root)', function () { - tree.insertIdIntoRoot('2'); - tree.insertIdIntoRoot('3'); - tree.insertIdIntoRoot('1'); - tree.moveIdAfterId('2', '1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['3', '1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': [], '2': [], '3': [] - }); - }); - it('Can move id after id (root to node)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('1', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': [], - 'A': [] - }); - tree.moveIdAfterId('2', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A', '2'], '2': [], - 'A': [] - }); - }); - it('Can move id after id (root to node) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdAfterId('2', 'B'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': ['2.1'], - '2.1': [], - 'A': ['B', '2', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id after id (node to root)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdAfterId('A', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', 'A']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': [], '2': ['2.1'], - '2.1': [], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id after id (node to root) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdAfterId('2.1', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '2.1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': [], - '2.1': [], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id after id (node to node)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdAfterId('A', '2.1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': [], '2': ['2.1', 'A'], - '2.1': [], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id after id (node to node) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdAfterId('C', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A', 'C'], '2': ['2.1'], - '2.1': [], - 'A': ['B'], 'B': [], 'C': [] - }); - }); - // inside - it('Can move id inside id (root to root)', function () { - tree.insertIdIntoRoot('2'); - tree.insertIdIntoRoot('3'); - tree.insertIdIntoRoot('1'); - tree.moveIdIntoId('2', '1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['3', '1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['2'], '2': [], '3': [] - }); - }); - // - it('Can move id inside id (root to node)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('1', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': [], - 'A': [] - }); - tree.moveIdIntoId('2', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': [], - 'A': ['2'] - }); - }); - it('Can move id inside id (root to node) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdIntoId('2', 'B'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': ['2.1'], - '2.1': [], - 'A': ['B', 'C'], 'B': ['2'], 'C': [] - }); - }); - it('Can move id inside id (node to root)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdIntoId('A', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': [], '2': ['A', '2.1'], - '2.1': [], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id inside id (node to root) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdIntoId('2.1', '2'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': ['2.1'], - '2.1': [], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id inside id (node to node)', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdIntoId('A', '2.1'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': [], '2': ['2.1'], - '2.1': ['A'], - 'A': ['B', 'C'], 'B': [], 'C': [] - }); - }); - it('Can move id inside id (node to node) v2', function () { - tree.insertIdIntoRoot('1'); - tree.insertIdIntoRoot('2'); - tree.insertIdIntoNode('2', '2.1'); - tree.insertIdIntoNode('1', 'A'); - tree.insertIdIntoNode('A', 'B'); - tree.insertIdIntoNode('A', 'C'); - tree.moveIdIntoId('C', 'A'); - chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']); - chai_1.expect(tree.getNodes()).to.deep.equal({ - '1': ['A'], '2': ['2.1'], - '2.1': [], - 'A': ['C', 'B'], 'B': [], 'C': [] - }); - }); -}); -//# sourceMappingURL=multiRootTreeTest.js.map \ No newline at end of file diff --git a/dist/test/multiRootTreeTest.js.map b/dist/test/multiRootTreeTest.js.map deleted file mode 100644 index 6af6ffb..0000000 --- a/dist/test/multiRootTreeTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"multiRootTreeTest.js","sourceRoot":"","sources":["../../src/test/multiRootTreeTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/priorityQueueTest.d.ts b/dist/test/priorityQueueTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/priorityQueueTest.js b/dist/test/priorityQueueTest.js deleted file mode 100644 index c08f392..0000000 --- a/dist/test/priorityQueueTest.js +++ /dev/null @@ -1,132 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Priority Queue', function () { - var queue = null; - beforeEach(function () { - queue = new collections.PriorityQueue(); - }); - var createPriorityQueue1 = function () { - queue.enqueue(0); - queue.enqueue(1); - queue.enqueue(2); - queue.enqueue(3); - return queue; - }; - var createPriorityQueue2 = function () { - queue.enqueue(1); - queue.enqueue(3); - queue.enqueue(0); - queue.enqueue(2); - return queue; - }; - it('Gives the right size', function () { - createPriorityQueue1(); - chai_1.expect(queue.size()).equals(4); - queue.dequeue(); - chai_1.expect(queue.size()).equals(3); - }); - it('Gives the right size 2', function () { - createPriorityQueue2(); - chai_1.expect(queue.size()).equals(4); - queue.dequeue(); - chai_1.expect(queue.size()).equals(3); - }); - it('Gives the right size 3', function () { - createPriorityQueue1(); - queue.dequeue(); - queue.dequeue(); - queue.dequeue(); - queue.dequeue(); - chai_1.expect(queue.size()).equals(0); - }); - it('Contains inserted elements', function () { - createPriorityQueue1(); - for (var i = 0; i < 4; i++) { - chai_1.expect(queue.contains(i)).equals(true); - } - chai_1.expect(queue.contains(5)).equals(false); - }); - it('An empty queue is empty', function () { - createPriorityQueue1(); - chai_1.expect(queue.isEmpty()).equals(false); - queue.dequeue(); - queue.dequeue(); - queue.dequeue(); - chai_1.expect(queue.isEmpty()).equals(false); - queue.dequeue(); - chai_1.expect(queue.isEmpty()).equals(true); - }); - it('Peeks the highest priority item', function () { - createPriorityQueue1(); - chai_1.expect(queue.peek()).equals(3); - }); - it('Peeks the highest priority item 2', function () { - createPriorityQueue2(); - chai_1.expect(queue.peek()).equals(3); - }); - it('Peeking an empty queue returns undefined', function () { - createPriorityQueue1(); - queue.clear(); - chai_1.expect(queue.peek()).equals(undefined); - }); - it('Dequeues the highest priority item', function () { - createPriorityQueue1(); - chai_1.expect(queue.dequeue()).equals(3); - chai_1.expect(queue.dequeue()).equals(2); - chai_1.expect(queue.dequeue()).equals(1); - chai_1.expect(queue.dequeue()).equals(0); - }); - it('Dequeues the highest priority item 2', function () { - createPriorityQueue2(); - chai_1.expect(queue.dequeue()).equals(3); - chai_1.expect(queue.dequeue()).equals(2); - chai_1.expect(queue.dequeue()).equals(1); - chai_1.expect(queue.dequeue()).equals(0); - }); - it('Peek and enqueue are consistent', function () { - queue.enqueue(0); - chai_1.expect(queue.peek()).equals(0); - queue.enqueue(1); - chai_1.expect(queue.peek()).equals(1); - queue.enqueue(2); - chai_1.expect(queue.peek()).equals(2); - queue.enqueue(3); - chai_1.expect(queue.peek()).equals(3); - }); - it('Peek and enqueue are consistent 2', function () { - queue.enqueue(1); - chai_1.expect(queue.peek()).equals(1); - queue.enqueue(3); - chai_1.expect(queue.peek()).equals(3); - queue.enqueue(0); - chai_1.expect(queue.peek()).equals(3); - queue.enqueue(2); - chai_1.expect(queue.peek()).equals(3); - }); - it('For each gives the right elements', function () { - queue.forEach(function (e) { - chai_1.expect(true).equals(false); // should not enter here - }); - createPriorityQueue1(); - var elements = []; - queue.forEach(function (e) { - elements.push(e); - }); - chai_1.expect(collections.arrays.contains(elements, 0)).equals(true); - chai_1.expect(collections.arrays.contains(elements, 1)).equals(true); - chai_1.expect(collections.arrays.contains(elements, 2)).equals(true); - chai_1.expect(collections.arrays.contains(elements, 3)).equals(true); - chai_1.expect(collections.arrays.contains(elements, 4)).equals(false); - }); - it('For each can be interrupted', function () { - createPriorityQueue1(); - var elements = []; - queue.forEach(function (e) { - elements.push(e); - return false; - }); - chai_1.expect(elements.length).equals(1); - }); -}); -//# sourceMappingURL=priorityQueueTest.js.map \ No newline at end of file diff --git a/dist/test/priorityQueueTest.js.map b/dist/test/priorityQueueTest.js.map deleted file mode 100644 index fa00fa1..0000000 --- a/dist/test/priorityQueueTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"priorityQueueTest.js","sourceRoot":"","sources":["../../src/test/priorityQueueTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/queueTest.d.ts b/dist/test/queueTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/queueTest.js b/dist/test/queueTest.js deleted file mode 100644 index 7f03e87..0000000 --- a/dist/test/queueTest.js +++ /dev/null @@ -1,82 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Queue', function () { - var queue = null; - beforeEach(function () { - queue = new collections.Queue(); - }); - function createQueue() { - queue.enqueue('a'); - queue.enqueue('b'); - queue.enqueue('c'); - } - it('Gives the right size', function () { - chai_1.expect(queue.size()).equals(0); - createQueue(); - chai_1.expect(queue.size()).equals(3); - queue.enqueue('d'); - chai_1.expect(queue.size()).equals(4); - queue.dequeue(); - chai_1.expect(queue.size()).equals(3); - queue.clear(); - chai_1.expect(queue.size()).equals(0); - }); - it('Enqueues', function () { - createQueue(); - var head = queue.dequeue(); - chai_1.expect(head).equals('a'); - queue.dequeue(); - head = queue.dequeue(); - chai_1.expect(head).equals('c'); - chai_1.expect(queue.isEmpty()).equals(true); - head = queue.dequeue(); - chai_1.expect(head).equals(undefined); - }); - it('Peeks', function () { - createQueue(); - var head = queue.peek(); - chai_1.expect(head).equals('a'); - var head2 = queue.dequeue(); - chai_1.expect(head).equals(head2); - head = queue.peek(); - chai_1.expect(head).equals('b'); - queue.clear(); - head = queue.peek(); - chai_1.expect(head).equals(undefined); - }); - it('For each gives the right ordering', function () { - queue.forEach(function (e) { - chai_1.expect(true).equals(false); // should not enter here - }); - for (var i = 0; i < 10; i++) { - queue.add(i); - } - var i = 0; - queue.forEach(function (e) { - chai_1.expect(e).equals(i); - i++; - }); - }); - it('For each can be interrupted', function () { - var array = [0, 1, 2, 3, 4]; - var b = []; - for (var i = 0; i < 5; i++) { - queue.add(i); - } - queue.forEach(function (e) { - b.push(e); - if (e === 3) { - return false; - } - }); - chai_1.expect([0, 1, 2, 3]).to.deep.equal(b); - }); - it('Contains previously added items', function () { - createQueue(); - chai_1.expect(queue.contains('a')).equals(true); - chai_1.expect(queue.contains('z')).equals(false); - chai_1.expect(queue.contains(undefined)).equals(false); - }); -}); -//# sourceMappingURL=queueTest.js.map \ No newline at end of file diff --git a/dist/test/queueTest.js.map b/dist/test/queueTest.js.map deleted file mode 100644 index 7e180e2..0000000 --- a/dist/test/queueTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"queueTest.js","sourceRoot":"","sources":["../../src/test/queueTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/setTest.d.ts b/dist/test/setTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/setTest.js b/dist/test/setTest.js deleted file mode 100644 index dacd008..0000000 --- a/dist/test/setTest.js +++ /dev/null @@ -1,265 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Set', function () { - var set = null; - it('Gives the right size', function () { - set = new collections.Set(); - set.add('a'); - set.add('b'); - set.add('c'); - chai_1.expect(set.size()).equals(3); - set.add('d'); - chai_1.expect(set.size()).equals(4); - set.remove('d'); - chai_1.expect(set.size()).equals(3); - set.clear(); - set.add('a'); - set.add('b'); - set.add('c'); - chai_1.expect(set.size()).equals(3); - set.add('d'); - chai_1.expect(set.size()).equals(4); - set.remove('d'); - chai_1.expect(set.size()).equals(3); - set.add('c'); - chai_1.expect(set.size()).equals(3); - }); - it('Contains existing elements', function () { - set = new collections.Set(); - set.add('a'); - set.add('b'); - set.add('c'); - set.add('d'); - chai_1.expect(set.contains('a')).equals(true); - chai_1.expect(set.contains('b')).equals(true); - chai_1.expect(set.contains('c')).equals(true); - chai_1.expect(set.contains('d')).equals(true); - chai_1.expect(set.contains('e')).equals(false); - set.clear(); - set.add(1); - set.add(2); - set.add(3); - set.add(4); - chai_1.expect(set.contains(1)).equals(true); - chai_1.expect(set.contains(2)).equals(true); - chai_1.expect(set.contains(3)).equals(true); - chai_1.expect(set.contains(4)).equals(true); - chai_1.expect(set.contains(5)).equals(false); - var toStringF = function (f) { - return f.description; - }; - set = new collections.Set(toStringF); - var fn1 = function () { }; - fn1.description = 'fn1'; - chai_1.expect(set.contains(fn1)).equals(false); - set.add(fn1); - chai_1.expect(set.contains(fn1)).equals(true); - var fn2 = function () { }; - fn2.description = 'fn2'; - chai_1.expect(set.contains(fn2)).equals(false); - set.add(fn2); - chai_1.expect(set.contains(fn2)).equals(true); - chai_1.expect(set.size()).equals(2); - }); - it('An empty set is empty', function () { - set = new collections.Set(); - chai_1.expect(set.isEmpty()).equals(true); - set.add(1); - chai_1.expect(set.isEmpty()).equals(false); - }); - it('Intersection is commutative', function () { - //Two empty sets - set = new collections.Set(); - var set2 = new collections.Set(); - set.intersection(set2); - chai_1.expect(set.isEmpty()).equals(true); - set2.intersection(set); - chai_1.expect(set2.isEmpty()).equals(true); - // non empty with empty - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set.add(3); - set.intersection(set2); - chai_1.expect(set.isEmpty()).equals(true); - set2.intersection(set); - chai_1.expect(set2.isEmpty()).equals(true); - // non empty sets with common elements - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set2.add(1); - set2.add(2); - set2.add(3); - set.intersection(set2); - var s1 = set.toArray().sort(); - chai_1.expect(s1).to.deep.equal([1, 2]); - set = new collections.Set(); - set.add(1); - set.add(2); - set2.intersection(set); - var s2 = set2.toArray().sort(); - chai_1.expect(s2).to.deep.equal([1, 2]); - // non empty sets with no common elements - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set2.add(3); - set2.add(4); - set2.add(5); - set.intersection(set2); - chai_1.expect(set.isEmpty()).equals(true); - set.add(1); - set.add(2); - set2.intersection(set); - chai_1.expect(set2.isEmpty()).equals(true); - }); - it('Union is commutative', function () { - set = new collections.Set(); - var set2 = new collections.Set(); - set.add(1); - set.add(2); - set2.add(2); - set2.add(4); - set2.add(5); - set.union(set2); - var s1 = set.toArray().sort(); - chai_1.expect(s1).to.deep.equal([1, 2, 4, 5]); - set.clear(); - set.add(1); - set.add(2); - set2.union(set); - var s2 = set2.toArray().sort(); - chai_1.expect(s2).to.deep.equal([1, 2, 4, 5]); - }); - it('Difference works as expected', function () { - //Two empty sets - set = new collections.Set(); - var set2 = new collections.Set(); - set.difference(set2); - chai_1.expect(set.isEmpty()).equals(true); - //Non empty and empty set - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set.difference(set2); - var s1 = set.toArray().sort(); - chai_1.expect(s1).to.deep.equal([1, 2]); - //Non empty sets with common elements - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set.add(3); - set.add(4); - set2.add(2); - set2.add(3); - set.difference(set2); - s1 = set.toArray().sort(); - chai_1.expect(s1).to.deep.equal([1, 4]); - // Two equal sets - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set.add(3); - set2.add(1); - set2.add(3); - set2.add(2); - set.difference(set2); - chai_1.expect(set.isEmpty()).equals(true); - //Non empty sets with no common elements - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set.add(3); - set.add(4); - set2.add(6); - set2.add(9); - set.difference(set2); - s1 = set.toArray().sort(); - chai_1.expect(s1).to.deep.equal([1, 2, 3, 4]); - }); - it('isSubsetOf works as expected', function () { - //Two empty sets - set = new collections.Set(); - var set2 = new collections.Set(); - chai_1.expect(set.isSubsetOf(set2)).equals(true); - // Two equal sets - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set2.add(2); - set2.add(1); - chai_1.expect(set.isSubsetOf(set2)).equals(true); - chai_1.expect(set2.isSubsetOf(set)).equals(true); - //Non empty sets with common elements - set = new collections.Set(); - set2 = new collections.Set(); - set.add(1); - set.add(2); - set.add(3); - set.add(4); - set2.add(2); - set2.add(3); - chai_1.expect(set2.isSubsetOf(set)).equals(true); - chai_1.expect(set.isSubsetOf(set2)).equals(false); - //Non empty sets with no common elements - set = new collections.Set(); - set2 = new collections.Set(); - set.add(3); - set2.add(4); - chai_1.expect(set.isSubsetOf(set2)).equals(false); - chai_1.expect(set2.isSubsetOf(set)).equals(false); - }); - it('Adds', function () { - set = new collections.Set(); - chai_1.expect(set.add('a')).equals(true); - chai_1.expect(set.add('b')).equals(true); - chai_1.expect(set.contains('a')).equals(true); - chai_1.expect(set.contains('b')).equals(true); - chai_1.expect(set.add('b')).equals(false); - chai_1.expect(set.contains('b')).equals(true); - chai_1.expect(set.add(null)).equals(true); - chai_1.expect(set.contains(null)).equals(true); - chai_1.expect(set.add(null)).equals(false); - chai_1.expect(set.contains(undefined)).equals(false); - chai_1.expect(set.add(undefined)).equals(false); - chai_1.expect(set.contains(undefined)).equals(false); - }); - it('For each gives all the elements', function () { - set = new collections.Set(); - set.forEach(function (e) { - chai_1.expect(false).equals(true); - }); - for (var i = 0; i < 100; i++) { - set.add(i); - } - var values = set.toArray(); - chai_1.expect(values.length).equals(100); - set.forEach(function (e) { - chai_1.expect(collections.arrays.remove(values, e)).equals(true); - }); - chai_1.expect(values.length).equals(0); - }); - it('For each can be interrupted', function () { - set = new collections.Set(); - for (var i = 0; i < 5; i++) { - set.add(i); - } - var t = 0; - set.forEach(function (e) { - t++; - return false; - }); - chai_1.expect(t).equals(1); - }); -}); -//# sourceMappingURL=setTest.js.map \ No newline at end of file diff --git a/dist/test/setTest.js.map b/dist/test/setTest.js.map deleted file mode 100644 index cadf3de..0000000 --- a/dist/test/setTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"setTest.js","sourceRoot":"","sources":["../../src/test/setTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test/stackTest.d.ts b/dist/test/stackTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/stackTest.js b/dist/test/stackTest.js deleted file mode 100644 index 9781559..0000000 --- a/dist/test/stackTest.js +++ /dev/null @@ -1,90 +0,0 @@ -"use strict"; -var collections = require('../lib/index'); -var chai_1 = require('chai'); -describe('Stack', function () { - var stack = null; - beforeEach(function () { - stack = new collections.Stack(); - }); - it('Pops', function () { - chai_1.expect(stack.pop()).equals(undefined); - stack.push(1); - stack.push(2); - stack.push(3); - chai_1.expect(stack.pop()).equals(3); - chai_1.expect(stack.pop()).equals(2); - chai_1.expect(stack.pop()).equals(1); - chai_1.expect(stack.pop()).equals(undefined); - }); - it('Pushes and pops', function () { - stack.push(1); - chai_1.expect(stack.pop()).equals(1); - stack.push(2); - chai_1.expect(stack.pop()).equals(2); - stack.push(3); - chai_1.expect(stack.pop()).equals(3); - chai_1.expect(stack.pop()).equals(undefined); - }); - it('Peeks', function () { - stack.push(1); - stack.push(2); - stack.push(3); - chai_1.expect(stack.peek()).equals(3); - stack.pop(); - chai_1.expect(stack.peek()).equals(2); - stack.pop(); - chai_1.expect(stack.peek()).equals(1); - stack.pop(); - chai_1.expect(stack.peek()).equals(undefined); - }); - it('Pushes and peeks', function () { - chai_1.expect(stack.peek()).equals(undefined); - stack.push(1); - chai_1.expect(stack.peek()).equals(1); - stack.push(2); - chai_1.expect(stack.peek()).equals(2); - stack.push(3); - chai_1.expect(stack.peek()).equals(3); - }); - it('Gives the right size', function () { - chai_1.expect(stack.size()).equals(0); - stack.push(1); - stack.push(2); - stack.push(3); - chai_1.expect(stack.size()).equals(3); - stack.peek(); - chai_1.expect(stack.size()).equals(3); - stack.pop(); - stack.pop(); - stack.pop(); - chai_1.expect(stack.size()).equals(0); - }); - it('For each gives the right ordering', function () { - stack.forEach(function (e) { - chai_1.expect(true).equals(false); // should not enter here - }); - for (var i = 0; i < 10; i++) { - stack.add(i); - } - var i = 10 - 1; - stack.forEach(function (e) { - chai_1.expect(e).equals(i); - i--; - }); - }); - it('For each can be interrupted', function () { - var array = [0, 1, 2, 3, 4]; - var b = []; - for (var i = 0; i < 5; i++) { - stack.add(i); - } - stack.forEach(function (e) { - b.push(e); - if (e === 4) { - return false; - } - }); - chai_1.expect([4]).to.deep.equal(b); - }); -}); -//# sourceMappingURL=stackTest.js.map \ No newline at end of file diff --git a/dist/test/stackTest.js.map b/dist/test/stackTest.js.map deleted file mode 100644 index eb018e0..0000000 --- a/dist/test/stackTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"stackTest.js","sourceRoot":"","sources":["../../src/test/stackTest.ts"],"names":[],"mappings":";AAAA,IAAY,WAAW,WAAM,cAAc,CAAC,CAAA;AAG5C,qBAAqB,MAAM,CAAC,CAAA;AAE5B,QAAQ,CAAC,OAAO,EACZ;IAEI,IAAI,KAAK,GAAQ,IAAI,CAAC;IAEtB,UAAU,CAAC;QACP,KAAK,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,MAAM,EACL;QACI,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE1C,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,iBAAiB,EAChB;QACI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,OAAO,EACN;QACI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,kBAAkB,EACjB;QACI,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,sBAAsB,EACrB;QACI,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,mCAAmC,EAClC;QAEI,KAAK,CAAC,OAAO,CAAC,UAAS,CAAM;YACzB,aAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB;QACxD,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACf,KAAK,CAAC,OAAO,CAAC,UAAS,CAAM;YACzB,aAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC,EAAE,CAAC;QACR,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,6BAA6B,EAC5B;QACI,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAQ,EAAE,CAAC;QAChB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,UAAS,CAAM;YACzB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACV,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC;YACjB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,aAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AAEX,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/test/utilTest.d.ts b/dist/test/utilTest.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/test/utilTest.js b/dist/test/utilTest.js deleted file mode 100644 index 2697193..0000000 --- a/dist/test/utilTest.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -var Collections = require('../lib/index'); -var assert = require('assert'); -describe('util', function () { - var Car = (function () { - function Car(company, type, year) { - this.company = company; - this.type = type; - this.year = year; - } - Car.prototype.toString = function () { - // Short hand. Adds each own property - return Collections.util.makeString(this); - }; - return Car; - }()); - it('makeString function works', function () { - var carStringified = new Car('BMW', 'A', 2016).toString(); - assert.equal(carStringified, '{company:BMW,type:A,year:2016}'); - }); -}); -//# sourceMappingURL=utilTest.js.map \ No newline at end of file diff --git a/dist/test/utilTest.js.map b/dist/test/utilTest.js.map deleted file mode 100644 index 37db05e..0000000 --- a/dist/test/utilTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utilTest.js","sourceRoot":"","sources":["../../src/test/utilTest.ts"],"names":[],"mappings":";AAAA,IAAY,WAAW,WAAM,cAAc,CAAC,CAAA;AAE5C,IAAO,MAAM,WAAW,QAAQ,CAAC,CAAC;AAGlC,QAAQ,CAAC,MAAM,EACX;IAEI;QACI,aAAmB,OAAe,EAAS,IAAY,EAAS,IAAY;YAAzD,YAAO,GAAP,OAAO,CAAQ;YAAS,SAAI,GAAJ,IAAI,CAAQ;YAAS,SAAI,GAAJ,IAAI,CAAQ;QAC5E,CAAC;QACD,sBAAQ,GAAR;YACI,sCAAsC;YACtC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QACL,UAAC;IAAD,CAAC,AAPD,IAOC;IAED,EAAE,CAAC,2BAA2B,EAC1B;QACI,IAAI,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE1D,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACX,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/package.json b/package.json index 55d8f47..ced4105 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typescript-collections", - "version": "1.1.9", + "version": "1.2.0", "description": "A complete, fully tested data structure library written in TypeScript.", "main": "./dist/lib/umd.js", "jsnext:main": "dist/lib/index.js", diff --git a/src/lib/MultiRootTree.ts b/src/lib/MultiRootTree.ts index 7661f9b..5059bb3 100644 --- a/src/lib/MultiRootTree.ts +++ b/src/lib/MultiRootTree.ts @@ -1,11 +1,18 @@ -export enum Direction { +enum Direction { BEFORE, AFTER, INSIDE_AT_END, INSIDE_AT_START, } +export interface FlatTreeNode { + id: string; + level: number; + hasParent: boolean; + childrenCount: number; +} + export default class MultiRootTree { rootIds: Array; @@ -14,8 +21,34 @@ export default class MultiRootTree { constructor(rootIds: Array = [], nodes: { [id: string]: Array } = {}) { this.rootIds = rootIds; this.nodes = nodes; + + this.initRootIds(); + this.initNodes(); + } + + initRootIds() { + for (let rootId of this.rootIds) { + this.createEmptyNodeIfNotExist(rootId); + } } + initNodes() { + for (let nodeKey in this.nodes) { + if (this.nodes.hasOwnProperty(nodeKey)) { + for (let nodeListItem of this.nodes[nodeKey]) { + this.createEmptyNodeIfNotExist(nodeListItem); + } + } + } + } + + createEmptyNodeIfNotExist(nodeKey: string) { + if (!this.nodes[nodeKey]) { + this.nodes[nodeKey] = []; + } + } + + getRootIds() { let clone = this.rootIds.slice(); return clone; @@ -39,6 +72,59 @@ export default class MultiRootTree { }; } + toObject() { + return this.getObject(); + } + + flatten(): Array { + const _this = this; + let extraPropsObject: Array = []; + + for (let i = 0; i < this.rootIds.length; i++) { + const rootId = this.rootIds[i]; + extraPropsObject.push({ + id: rootId, + level: 0, + hasParent: false, + childrenCount: undefined, + }); + + traverse(rootId, this.nodes, extraPropsObject, 0); + } + + for (let o of extraPropsObject) { + o.childrenCount = countChildren(o.id); + } + + return extraPropsObject; + + function countChildren(id: string) { + if (!_this.nodes[id]) { + return 0; + } else { + const childrenCount = _this.nodes[id].length; + return childrenCount; + } + } + + function traverse(startId: string, nodes: { [id: string]: Array }, returnArray: Array, level = 0) { + if (!startId || !nodes || !returnArray || !nodes[startId]) { + return; + } + + level++; + + let idsList = nodes[startId]; + for (let i = 0; i < idsList.length; i++) { + let id = idsList[i]; + returnArray.push({ id, level, hasParent: true }); + traverse(id, nodes, returnArray, level); + } + + level--; + } + } + moveIdBeforeId(moveId: string, beforeId: string) { return this.moveId(moveId, beforeId, Direction.BEFORE); } diff --git a/src/test/multiRootTreeTest.ts b/src/test/multiRootTreeTest.ts index e0e86a9..95484c8 100644 --- a/src/test/multiRootTreeTest.ts +++ b/src/test/multiRootTreeTest.ts @@ -654,6 +654,51 @@ describe('Multi Root Tree', function () { }); }); + + it('Can flatten a tree', function () { + tree.insertIdIntoRoot('1'); + tree.insertIdIntoRoot('2'); + + tree.insertIdIntoNode('1', '1.1'); + tree.insertIdIntoNode('1.1', '1.1.1'); + tree.insertIdIntoNode('1.1', '1.1.2'); + + const nodes = tree.flatten(); + + expect(nodes).to.deep.equal([ + { + id: '1', + level: 0, + hasParent: false, + childrenCount: 1, + }, + { + id: '1.1', + level: 1, + hasParent: true, + childrenCount: 2, + }, + { + id: '1.1.1', + level: 2, + hasParent: true, + childrenCount: 0, + }, { + id: '1.1.2', + level: 2, + hasParent: true, + childrenCount: 0, + }, + { + id: '2', + level: 0, + hasParent: false, + childrenCount: 0, + }, + ]); + }); + + });