UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

513 lines 67.6 kB
/* * Copyright (c) 2014, Metron, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import { isString, getObjectId, copyArray, hasval } from './util'; import { Notification2, Notification3 } from './notification'; function requireString(s) { if (isString(s)) { return s; } else { throw new Error('Expected a string, but value is ' + s); } } export class OrderedSet { constructor(values = [], idFn = getObjectId, useNotifications = true) { this._idOf = idFn; this._valuesArray = copyArray(values); this._ids = []; this._indexes = {}; this._valuesMap = {}; for (let n = 0; n < this._valuesArray.length; n++) { const value = this._valuesArray[n]; const id = requireString(this._idOf(value)); this._ids[n] = id; this._indexes[id] = n; this._valuesMap[id] = value; } if (useNotifications) { this._valueAdded = new Notification2(); this._valueMoved = new Notification3(); this._valueRemoved = new Notification2(); } } get valueAdded() { return this._valueAdded; } get valueMoved() { return this._valueMoved; } get valueRemoved() { return this._valueRemoved; } get length() { return this._valuesArray.length; } get isEmpty() { return (this._valuesArray.length === 0); } toArray() { return copyArray(this._valuesArray); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedSet is undefined. */ every(callbackFn, thisArg) { return this._valuesArray.every(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedSet is undefined. */ some(callbackFn, thisArg) { return this._valuesArray.some(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedSet is undefined. */ forEach(callbackFn, thisArg) { this._valuesArray.forEach(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedSet is undefined. */ map(callbackFn, thisArg) { return this._valuesArray.map(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedSet is undefined. */ filter(callbackFn, thisArg) { return this._valuesArray.filter(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedSet is undefined. */ reduce(callbackFn, initialValue) { return this._valuesArray.reduce(callbackFn, initialValue); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedSet is undefined. */ reduceRight(callbackFn, initialValue) { return this._valuesArray.reduceRight(callbackFn, initialValue); } idAt(index) { return this._ids[index]; } valueAt(index) { return this._valuesArray[index]; } indexFor(id) { return (isString(id) ? this._indexes[id] : undefined); } valueFor(id) { return (isString(id) ? this._valuesMap[id] : undefined); } idOf(value) { return requireString(this._idOf(value)); } indexOf(value) { return this._indexes[requireString(this._idOf(value))]; } hasValue(value) { return this.hasId(requireString(this._idOf(value))); } hasValues(values) { for (let n = 0; n < values.length; n++) { if (!this.hasValue(values[n])) { return false; } } return true; } hasId(id) { return (isString(id) && hasval(this._valuesMap[id])); } hasIds(ids) { for (let n = 0; n < ids.length; n++) { if (!this.hasId(ids[n])) { return false; } } return true; } add(value, index, moveIfExists) { index = (hasval(index) ? index : this._valuesArray.length); if (!hasval(moveIfExists)) { moveIfExists = false; } this._add(value, index, moveIfExists); } addAll(values, index, moveIfExists) { index = (hasval(index) ? index : this._valuesArray.length); if (!hasval(moveIfExists)) { moveIfExists = false; } for (let n = 0; n < values.length; n++) { const actualIndex = this._add(values[n], index, moveIfExists); index = actualIndex + 1; } } _add(value, newIndex, moveIfExists) { const id = requireString(this._idOf(value)); const oldIndex = this._indexes[id]; if (!hasval(oldIndex)) { this._ids.splice(newIndex, 0, id); this._valuesArray.splice(newIndex, 0, value); this._valuesMap[id] = value; for (let n = newIndex; n < this._ids.length; n++) { this._indexes[this._ids[n]] = n; } if (this._valueAdded) { this._valueAdded.fire(value, newIndex); } } else if (newIndex !== oldIndex && moveIfExists) { this._ids.splice(oldIndex, 1); this._valuesArray.splice(oldIndex, 1); if (newIndex > oldIndex) { this._ids.splice(newIndex, 0, id); this._valuesArray.splice(newIndex, 0, value); for (let n = oldIndex; n <= newIndex; n++) { this._indexes[this._ids[n]] = n; } } else { this._ids.splice(newIndex, 0, id); this._valuesArray.splice(newIndex, 0, value); for (let n = newIndex; n <= oldIndex; n++) { this._indexes[this._ids[n]] = n; } } if (this._valueMoved) { this._valueMoved.fire(value, oldIndex, newIndex); } } else { newIndex = oldIndex; } // Return the actual insertion index -- may differ from the originally // requested index if an existing value had to be moved return newIndex; } removeValue(value) { this.removeId(requireString(this._idOf(value))); } removeId(id) { if (isString(id)) { const index = this._indexes[id]; if (hasval(index)) { this._remove(id, index); } } } removeIndex(index) { const id = this._ids[index]; if (isString(id)) { this._remove(id, index); } } removeAll() { // Remove from last to first, to minimize index shifting for (let n = this._valuesArray.length - 1; n >= 0; n--) { const id = this._ids[n]; this._remove(id, n); } } retainValues(values) { const idsToRetain = {}; for (let n = 0; n < values.length; n++) { const id = this._idOf(values[n]); if (isString(id)) { idsToRetain[id] = true; } } this._retain(idsToRetain); } retainIds(ids) { const idsToRetain = {}; for (let n = 0; n < ids.length; n++) { const id = ids[n]; if (isString(id)) { idsToRetain[id] = true; } } this._retain(idsToRetain); } retainIndices(indices) { const idsToRetain = {}; for (let n = 0; n < indices.length; n++) { const id = this._ids[indices[n]]; idsToRetain[id] = true; } this._retain(idsToRetain); } _retain(ids) { // Remove from last to first, to minimize index shifting for (let n = this._valuesArray.length - 1; n >= 0; n--) { const id = this._ids[n]; if (!ids.hasOwnProperty(id)) { this._remove(id, n); } } } _remove(id, index) { const value = this._valuesArray[index]; this._ids.splice(index, 1); this._valuesArray.splice(index, 1); delete this._indexes[id]; delete this._valuesMap[id]; for (let n = index; n < this._ids.length; n++) { this._indexes[this._ids[n]] = n; } if (this._valueRemoved) { this._valueRemoved.fire(value, index); } } } export class OrderedStringSet { constructor(values = [], useNotifications = true) { this._valuesArray = []; this._indexes = {}; for (let n = 0; n < values.length; n++) { const value = requireString(values[n]); this._valuesArray[n] = value; this._indexes[value] = n; } if (useNotifications) { this._valueAdded = new Notification2(); this._valueMoved = new Notification3(); this._valueRemoved = new Notification2(); } } get valueAdded() { return this._valueAdded; } get valueMoved() { return this._valueMoved; } get valueRemoved() { return this._valueRemoved; } get length() { return this._valuesArray.length; } get isEmpty() { return (this._valuesArray.length === 0); } toArray() { return copyArray(this._valuesArray); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedStringSet is undefined. */ every(callbackFn, thisArg) { return this._valuesArray.every(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedStringSet is undefined. */ some(callbackFn, thisArg) { return this._valuesArray.some(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedStringSet is undefined. */ forEach(callbackFn, thisArg) { this._valuesArray.forEach(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedStringSet is undefined. */ map(callbackFn, thisArg) { return this._valuesArray.map(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedStringSet is undefined. */ filter(callbackFn, thisArg) { return this._valuesArray.filter(callbackFn, thisArg); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedStringSet is undefined. */ reduce(callbackFn, initialValue) { return this._valuesArray.reduce(callbackFn, initialValue); } /** * The callback should not modify its array arg; if it does, the subsequent behavior * of this OrderedStringSet is undefined. */ reduceRight(callbackFn, initialValue) { return this._valuesArray.reduceRight(callbackFn, initialValue); } valueAt(index) { return this._valuesArray[index]; } indexOf(value) { return (isString(value) ? this._indexes[value] : undefined); } hasValue(value) { return (isString(value) && hasval(this._indexes[value])); } hasValues(values) { for (let n = 0; n < values.length; n++) { if (!this.hasValue(values[n])) { return false; } } return true; } add(value, index, moveIfExists) { index = (hasval(index) ? index : this._valuesArray.length); if (!hasval(moveIfExists)) { moveIfExists = false; } this._add(value, index, moveIfExists); } addAll(values, index, moveIfExists) { index = (hasval(index) ? index : this._valuesArray.length); if (!hasval(moveIfExists)) { moveIfExists = false; } for (let n = 0; n < values.length; n++) { const actualIndex = this._add(values[n], index, moveIfExists); index = actualIndex + 1; } } _add(value, newIndex, moveIfExists) { requireString(value); const oldIndex = this._indexes[value]; if (!hasval(oldIndex)) { this._valuesArray.splice(newIndex, 0, value); for (let n = newIndex; n < this._valuesArray.length; n++) { this._indexes[this._valuesArray[n]] = n; } if (this._valueAdded) { this._valueAdded.fire(value, newIndex); } } else if (newIndex !== oldIndex && moveIfExists) { this._valuesArray.splice(oldIndex, 1); if (newIndex > oldIndex) { this._valuesArray.splice(newIndex, 0, value); for (let n = oldIndex; n <= newIndex; n++) { this._indexes[this._valuesArray[n]] = n; } } else { this._valuesArray.splice(newIndex, 0, value); for (let n = newIndex; n <= oldIndex; n++) { this._indexes[this._valuesArray[n]] = n; } } if (this._valueMoved) { this._valueMoved.fire(value, oldIndex, newIndex); } } else { newIndex = oldIndex; } // Return the actual insertion index -- may differ from the originally // requested index if an existing value had to be moved return newIndex; } removeValue(value) { if (isString(value)) { const index = this._indexes[value]; if (hasval(index)) { this._remove(value, index); } } } removeIndex(index) { const value = this._valuesArray[index]; if (isString(value)) { this._remove(value, index); } } removeAll() { // Remove from last to first, to minimize index shifting for (let n = this._valuesArray.length - 1; n >= 0; n--) { const value = this._valuesArray[n]; this._remove(value, n); } } retainValues(values) { const valuesToRetain = {}; for (let n = 0; n < values.length; n++) { const value = values[n]; if (isString(value)) { valuesToRetain[value] = true; } } this._retain(valuesToRetain); } retainIndices(indices) { const valuesToRetain = {}; for (let n = 0; n < indices.length; n++) { const value = this._valuesArray[indices[n]]; valuesToRetain[value] = true; } this._retain(valuesToRetain); } _retain(values) { // Remove from last to first, to minimize index shifting for (let n = this._valuesArray.length - 1; n >= 0; n--) { const value = this._valuesArray[n]; if (!values.hasOwnProperty(value)) { this._remove(value, n); } } } _remove(value, index) { this._valuesArray.splice(index, 1); delete this._indexes[value]; for (let n = index; n < this._valuesArray.length; n++) { this._indexes[this._valuesArray[n]] = n; } if (this._valueRemoved) { this._valueRemoved.fire(value, index); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJlZF9zZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd2ViZ2xpbXBzZS91dGlsL29yZGVyZWRfc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsT0FBTyxFQUF5QixRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5RCxTQUFTLGFBQWEsQ0FBQyxDQUFTO0lBQzVCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2IsT0FBTyxDQUFDLENBQUM7S0FDWjtTQUNJO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUMzRDtBQUNMLENBQUM7QUFHRCxNQUFNLE9BQU8sVUFBVTtJQVVuQixZQUFZLFNBQWMsRUFBRSxFQUFFLE9BQXNCLFdBQVcsRUFBRSxtQkFBNEIsSUFBSTtRQUM3RixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sRUFBRSxHQUFHLGFBQWEs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LEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDekM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE1ldHJvbiwgSW5jLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xyXG4gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxyXG4gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcbmltcG9ydCB7IElkRnVuY3Rpb24sIFN0cmluZ01hcCwgaXNTdHJpbmcsIGdldE9iamVjdElkLCBjb3B5QXJyYXksIGhhc3ZhbCB9IGZyb20gJy4vdXRpbCc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbjIsIE5vdGlmaWNhdGlvbjMgfSBmcm9tICcuL25vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IGluZGV4T2YgfSBmcm9tICcuL3NvcnRlZF9hcnJheXMnO1xyXG5cclxuZnVuY3Rpb24gcmVxdWlyZVN0cmluZyhzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzU3RyaW5nKHMpKSB7XHJcbiAgICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nLCBidXQgdmFsdWUgaXMgJyArIHMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE9yZGVyZWRTZXQ8Vj4ge1xyXG4gICAgcHJpdmF0ZSBfaWRPZjogSWRGdW5jdGlvbjxWPjtcclxuICAgIHByaXZhdGUgX2lkczogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIF9pbmRleGVzOiBTdHJpbmdNYXA8bnVtYmVyPjtcclxuICAgIHByaXZhdGUgX3ZhbHVlc0FycmF5OiBWW107XHJcbiAgICBwcml2YXRlIF92YWx1ZXNNYXA6IFN0cmluZ01hcDxWPjtcclxuICAgIHByaXZhdGUgX3ZhbHVlQWRkZWQ6IE5vdGlmaWNhdGlvbjI8ViwgbnVtYmVyPjtcclxuICAgIHByaXZhdGUgX3ZhbHVlTW92ZWQ6IE5vdGlmaWNhdGlvbjM8ViwgbnVtYmVyLCBudW1iZXI+O1xyXG4gICAgcHJpdmF0ZSBfdmFsdWVSZW1vdmVkOiBOb3RpZmljYXRpb24yPFYsIG51bWJlcj47XHJcblxyXG4gICAgY29uc3RydWN0b3IodmFsdWVzOiBWW10gPSBbXSwgaWRGbjogSWRGdW5jdGlvbjxWPiA9IGdldE9iamVjdElkLCB1c2VOb3RpZmljYXRpb25zOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuX2lkT2YgPSBpZEZuO1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlc0FycmF5ID0gY29weUFycmF5KHZhbHVlcyk7XHJcbiAgICAgICAgdGhpcy5faWRzID0gW107XHJcbiAgICAgICAgdGhpcy5faW5kZXhlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlc01hcCA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5fdmFsdWVzQXJyYXkubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXNBcnJheVtuXTtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSByZXF1aXJlU3RyaW5nKHRoaXMuX2lkT2YodmFsdWUpKTtcclxuICAgICAgICAgICAgdGhpcy5faWRzW25dID0gaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2luZGV4ZXNbaWRdID0gbjtcclxuICAgICAgICAgICAgdGhpcy5fdmFsdWVzTWFwW2lkXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXNlTm90aWZpY2F0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZUFkZGVkID0gbmV3IE5vdGlmaWNhdGlvbjI8ViwgbnVtYmVyPigpO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1vdmVkID0gbmV3IE5vdGlmaWNhdGlvbjM8ViwgbnVtYmVyLCBudW1iZXI+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlUmVtb3ZlZCA9IG5ldyBOb3RpZmljYXRpb24yPFYsIG51bWJlcj4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlQWRkZWQoKTogTm90aWZpY2F0aW9uMjxWLCBudW1iZXI+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVBZGRlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmFsdWVNb3ZlZCgpOiBOb3RpZmljYXRpb24zPFYsIG51bWJlciwgbnVtYmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlTW92ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlUmVtb3ZlZCgpOiBOb3RpZmljYXRpb24yPFYsIG51bWJlcj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZVJlbW92ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNBcnJheS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLl92YWx1ZXNBcnJheS5sZW5ndGggPT09IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQXJyYXkoKTogVltdIHtcclxuICAgICAgICByZXR1cm4gY29weUFycmF5KHRoaXMuX3ZhbHVlc0FycmF5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgbm90IG1vZGlmeSBpdHMgYXJyYXkgYXJnOyBpZiBpdCBkb2VzLCB0aGUgc3Vic2VxdWVudCBiZWhhdmlvclxyXG4gICAgICogb2YgdGhpcyBPcmRlcmVkU2V0IGlzIHVuZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgZXZlcnkoY2FsbGJhY2tGbjogKHZhbHVlOiBWLCBpbmRleDogbnVtYmVyLCBhcnJheTogVltdKSA9PiBib29sZWFuLCB0aGlzQXJnPzogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc0FycmF5LmV2ZXJ5KGNhbGxiYWNrRm4sIHRoaXNBcmcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBub3QgbW9kaWZ5IGl0cyBhcnJheSBhcmc7IGlmIGl0IGRvZXMsIHRoZSBzdWJzZXF1ZW50IGJlaGF2aW9yXHJcbiAgICAgKiBvZiB0aGlzIE9yZGVyZWRTZXQgaXMgdW5kZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBzb21lKGNhbGxiYWNrRm46ICh2YWx1ZTogViwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFZbXSkgPT4gYm9vbGVhbiwgdGhpc0FyZz86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNBcnJheS5zb21lKGNhbGxiYWNrRm4sIHRoaXNBcmcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBub3QgbW9kaWZ5IGl0cyBhcnJheSBhcmc7IGlmIGl0IGRvZXMsIHRoZSBzdWJzZXF1ZW50IGJlaGF2aW9yXHJcbiAgICAgKiBvZiB0aGlzIE9yZGVyZWRTZXQgaXMgdW5kZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBmb3JFYWNoKGNhbGxiYWNrRm46ICh2YWx1ZTogViwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFZbXSkgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlc0FycmF5LmZvckVhY2goY2FsbGJhY2tGbiwgdGhpc0FyZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIGFycmF5IGFyZzsgaWYgaXQgZG9lcywgdGhlIHN1YnNlcXVlbnQgYmVoYXZpb3JcclxuICAgICAqIG9mIHRoaXMgT3JkZXJlZFNldCBpcyB1bmRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIG1hcDxVPihjYWxsYmFja0ZuOiAodmFsdWU6IFYsIGluZGV4OiBudW1iZXIsIGFycmF5OiBWW10pID0+IFUsIHRoaXNBcmc/OiBhbnkpOiBVW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNBcnJheS5tYXAoY2FsbGJhY2tGbiwgdGhpc0FyZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIGFycmF5IGFyZzsgaWYgaXQgZG9lcywgdGhlIHN1YnNlcXVlbnQgYmVoYXZpb3JcclxuICAgICAqIG9mIHRoaXMgT3JkZXJlZFNldCBpcyB1bmRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIGZpbHRlcihjYWxsYmFja0ZuOiAodmFsdWU6IFYsIGluZGV4OiBudW1iZXIsIGFycmF5OiBWW10pID0+IGJvb2xlYW4sIHRoaXNBcmc/OiBhbnkpOiBWW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNBcnJheS5maWx0ZXIoY2FsbGJhY2tGbiwgdGhpc0FyZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIGFycmF5IGFyZzsgaWYgaXQgZG9lcywgdGhlIHN1YnNlcXVlbnQgYmVoYXZpb3JcclxuICAgICAqIG9mIHRoaXMgT3JkZXJlZFNldCBpcyB1bmRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIHJlZHVjZTxVPihjYWxsYmFja0ZuOiAocHJldmlvdXNWYWx1ZTogVSwgY3VycmVudFZhbHVlOiBWLCBjdXJyZW50SW5kZXg6IG51bWJlciwgYXJyYXk6IFZbXSkgPT4gVSwgaW5pdGlhbFZhbHVlOiBVKTogVSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc0FycmF5LnJlZHVjZShjYWxsYmFja0ZuLCBpbml0aWFsVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBub3QgbW9kaWZ5IGl0cyBhcnJheSBhcmc7IGlmIGl0IGRvZXMsIHRoZSBzdWJzZXF1ZW50IGJlaGF2aW9yXHJcbiAgICAgKiBvZiB0aGlzIE9yZGVyZWRTZXQgaXMgdW5kZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICByZWR1Y2VSaWdodDxVPihjYWxsYmFja0ZuOiAocHJldmlvdXNWYWx1ZTogVSwgY3VycmVudFZhbHVlOiBWLCBjdXJyZW50SW5kZXg6IG51bWJlciwgYXJyYXk6IFZbXSkgPT4gVSwgaW5pdGlhbFZhbHVlOiBVKTogVSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc0FycmF5LnJlZHVjZVJpZ2h0KGNhbGxiYWNrRm4sIGluaXRpYWxWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWRBdChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faWRzW2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICB2YWx1ZUF0KGluZGV4OiBudW1iZXIpOiBWIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzQXJyYXlbaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIGluZGV4Rm9yKGlkOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiAoaXNTdHJpbmcoaWQpID8gdGhpcy5faW5kZXhlc1tpZF0gOiB1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbHVlRm9yKGlkOiBzdHJpbmcpOiBWIHtcclxuICAgICAgICByZXR1cm4gKGlzU3RyaW5nKGlkKSA/IHRoaXMuX3ZhbHVlc01hcFtpZF0gOiB1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlkT2YodmFsdWU6IFYpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiByZXF1aXJlU3RyaW5nKHRoaXMuX2lkT2YodmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICBpbmRleE9mKHZhbHVlOiBWKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXhlc1tyZXF1aXJlU3RyaW5nKHRoaXMuX2lkT2YodmFsdWUpKV07XHJcbiAgICB9XHJcblxyXG4gICAgaGFzVmFsdWUodmFsdWU6IFYpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oYXNJZChyZXF1aXJlU3RyaW5nKHRoaXMuX2lkT2YodmFsdWUpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzVmFsdWVzKHZhbHVlczogVltdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB2YWx1ZXMubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1ZhbHVlKHZhbHVlc1tuXSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpZCkgJiYgaGFzdmFsKHRoaXMuX3ZhbHVlc01hcFtpZF0pKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNJZHMoaWRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgaWRzLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNJZChpZHNbbl0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkKHZhbHVlOiBWLCBpbmRleD86IG51bWJlciwgbW92ZUlmRXhpc3RzPzogYm9vbGVhbikge1xyXG4gICAgICAgIGluZGV4ID0gKGhhc3ZhbChpbmRleCkgPyBpbmRleCA6IHRoaXMuX3ZhbHVlc0FycmF5Lmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKCFoYXN2YWwobW92ZUlmRXhpc3RzKSkge1xyXG4gICAgICAgICAgICBtb3ZlSWZFeGlzdHMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYWRkKHZhbHVlLCBpbmRleCwgbW92ZUlmRXhpc3RzKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBbGwodmFsdWVzOiBWW10sIGluZGV4PzogbnVtYmVyLCBtb3ZlSWZFeGlzdHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgaW5kZXggPSAoaGFzdmFsKGluZGV4KSA/IGluZGV4IDogdGhpcy5fdmFsdWVzQXJyYXkubGVuZ3RoKTtcclxuICAgICAgICBpZiAoIWhhc3ZhbChtb3ZlSWZFeGlzdHMpKSB7XHJcbiAgICAgICAgICAgIG1vdmVJZkV4aXN0cyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHZhbHVlcy5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxJbmRleCA9IHRoaXMuX2FkZCh2YWx1ZXNbbl0sIGluZGV4LCBtb3ZlSWZFeGlzdHMpO1xyXG4gICAgICAgICAgICBpbmRleCA9IGFjdHVhbEluZGV4ICsgMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYWRkKHZhbHVlOiBWLCBuZXdJbmRleDogbnVtYmVyLCBtb3ZlSWZFeGlzdHM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGlkID0gcmVxdWlyZVN0cmluZyh0aGlzLl9pZE9mKHZhbHVlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5faW5kZXhlc1tpZF07XHJcbiAgICAgICAgaWYgKCFoYXN2YWwob2xkSW5kZXgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lkcy5zcGxpY2UobmV3SW5kZXgsIDAsIGlkKTtcclxuICAgICAgICAgICAgdGhpcy5fdmFsdWVzQXJyYXkuc3BsaWNlKG5ld0luZGV4LCAwLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc01hcFtpZF0gPSB2YWx1ZTtcclxuICAgICAgICA