@cute-dw/core
Version:
This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need
270 lines • 27 kB
JavaScript
var _a;
import { Subject } from "rxjs";
import { AvlTree } from "./tree/AvlTree";
import { AbstractMap } from "./AbstractMap";
import { IllegalArgumentException } from "../util/exception/IllegalArgumentException";
/**
* An AVL-tree based `NavigableMap` implementation. The map is sorted according to the natural ordering of its keys, or by a `Comparator` provided at map creation time, depending on which constructor is used.
*/
export class TreeMap extends AbstractMap {
constructor(comparator) {
super();
this._size = 0;
this.contentChanged$ = new Subject();
/**
* @override
*/
this[_a] = "TreeMap";
this._tree = new AvlTree(comparator);
}
get comparator() { return this._tree.keyComparator; }
get contentChanged() { return this.contentChanged$.asObservable(); }
get size() { return this._size; }
clear() {
if (!this.isEmpty()) {
this._tree.clear();
this._size = this._tree.count();
this.contentChanged$.next();
}
}
clone() {
const tMap = new TreeMap(this._tree.keyComparator);
tMap.putAll(this);
return tMap;
}
/** Returns the first (lowest) key currently in this map */
firstKey() {
return this._tree.firstKey();
}
/**
* @override
*/
firstEntry() {
const key = this.firstKey();
if (key !== undefined) {
return [key, this.get(key)];
}
return undefined;
}
/** Returns the last (highest) key currently in this map */
lastKey() {
return this._tree.lastKey();
}
/**
* @override
*/
lastEntry() {
const key = this.lastKey();
if (key !== undefined) {
return [key, this.get(key)];
}
return undefined;
}
/**
* @override
*/
pollLastEntry() {
const entry = this.lastEntry();
if (entry) {
this.delete(entry[0]);
}
return entry;
}
/**
* @override
*/
pollFirstEntry() {
const entry = this.firstEntry();
if (entry) {
this.delete(entry[0]);
}
return entry;
}
/** Returns the maximal level of the tree */
height() {
return this._tree.height();
}
/**
* Gets the keys of this tree as a `Set` collection
* @returns Set
*/
keySet() {
return this._tree.keySet();
}
/**
* @override
*/
ceilingKey(key) {
let findKey = undefined;
for (let currKey of this.keys()) {
if (this._tree.keyComparator.greaterThanOrEqual(currKey, key)) {
findKey = currKey;
break;
}
}
return findKey;
}
/**
* @override
*/
floorKey(key) {
let findKey = undefined;
for (let currKey of this.keys()) {
if (this._tree.keyComparator.lessThanOrEqual(currKey, key)) {
findKey = currKey;
}
else {
break;
}
}
return findKey;
}
/**
* @override
*/
lowerKey(key) {
let findKey = undefined;
for (let currKey of this.keys()) {
if (this._tree.keyComparator.lessThan(currKey, key)) {
findKey = currKey;
}
else {
break;
}
}
return findKey;
}
/**
* @override
*/
higherKey(key) {
let findKey = undefined;
for (let currKey of this.keys()) {
if (this._tree.keyComparator.greaterThan(currKey, key)) {
findKey = currKey;
break;
}
}
return findKey;
}
/**
* Gets array of the keys
* @returns Array
*/
*keys() {
for (let key of this._tree.keys()) {
yield key;
}
}
/**
* Gets array of the values
* @returns Array
*/
*values() {
for (let val of this._tree.values()) {
yield val;
}
}
/**
* Gets array of the tree entries
* @returns Array
*/
*entries() {
yield* this[Symbol.iterator]();
}
/**
* Returns _true_ if this tree contains a mapping for the specified `key`
* @see {@link has}
*/
containsKey(key) {
return this._tree.contains(key);
}
/** Returns _true_ if this tree contains a value, _false_ otherwise */
containsValue(value) {
return [...this.values()].indexOf(value) >= 0;
}
/** Returns the value to which the `key` is mapped in this tree */
get(key) {
return this._tree.get(key);
}
/** Returns the value to which the `key` is mapped in this tree, or `defaultValue` if this tree contains no mapping for the key */
getOrDefault(key, defaultValue) {
return this._tree.get(key) ?? defaultValue;
}
/**
* Tests the tree for the `key` existence
* @param key A key value to test
* @returns _true_ if this tree contains a mapping for the specified `key`, _false_ otherwise
* @see {@link containsKey}
*/
has(key) {
return this._tree.contains(key);
}
/**
* Maps the specified `key` to the specified `value` in this tree and returns previous value of the mapping
* @param key A key value of the mapping
* @param value New value to assign for the `key`
* @returns Old value of the `key` or _undefined_ if it was not set before
* @throws IllegalArgumentException
*/
put(key, value) {
if (key === undefined || value === undefined) {
throw new IllegalArgumentException("Undefined key/value is not allowed in 'put()' operation");
}
const oldElem = this._tree.get(key);
this._tree.add(key, value);
if (oldElem === undefined) {
this._size++;
}
this.contentChanged$.next();
return oldElem;
}
/** Copies all of the mappings from the specified map to this tree */
putAll(map) {
const aKeys = map.keys();
aKeys.forEach(key => this.put(key, this.get(key)));
}
/** Removes the `key` (and its corresponding value) from this tree */
remove(key) {
const elem = this._tree.remove(key);
if (elem !== undefined) {
this._size--;
this.contentChanged$.next();
}
return elem;
}
/**
* @override
* @throws IllegalArgumentException
*/
set(key, value) {
this.put(key, value);
return this;
}
/**
* Performs the specified action for each element in the tree.
* @param callBack Function to call on each tree item
* @param thisArg An object to which the `this` keyword can refer in the `callBack` function. If `thisArg` is omitted, undefined is used as the `this` value
*/
forEach(callBack, thisArg) {
this._tree.forEach((value, key) => callBack(value, key, this), thisArg);
}
/**
* @override
*/
*[(_a = Symbol.toStringTag, Symbol.iterator)]() {
for (let node of this._tree) {
yield [node.key, node.value];
}
}
/**
* @override
*/
toString() {
return this._tree.toString();
}
print() {
return this._tree.print();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJlZU1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL2NvbGxlY3Rpb25zL1RyZWVNYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFdEY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sT0FBYSxTQUFRLFdBQWdCO0lBS2hELFlBQVksVUFBMEI7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFKRixVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ1Ysb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBaVB0RDs7V0FFRztRQUNILFFBQW9CLEdBQVcsU0FBUyxDQUFDO1FBaFB2QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksT0FBTyxDQUFNLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLFVBQVUsS0FBbUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBLENBQUM7SUFFbEUsSUFBYSxjQUFjLEtBQXVCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFFOUYsSUFBYSxJQUFJLEtBQWEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUV6QyxLQUFLO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FB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QUFXLEVBSVIsTUFBTSxDQUFDLFFBQVEsRUFBQztRQUN6QixLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQU0sQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUNEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gXCIuL0RpY3Rpb25hcnlcIjtcclxuaW1wb3J0IHsgQXZsVHJlZSB9IGZyb20gXCIuL3RyZWUvQXZsVHJlZVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50IH0gZnJvbSBcIi4vQ29sbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBCaW5hcnlTZWFyY2hUcmVlIH0gZnJvbSBcIi4vdHJlZS9CaW5hcnlTZWFyY2hUcmVlXCI7XHJcbmltcG9ydCB7IENvbXBhcmF0b3IgfSBmcm9tIFwiLi4vdXRpbC9Db21wYXJhdG9yXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0TWFwIH0gZnJvbSBcIi4vQWJzdHJhY3RNYXBcIjtcclxuaW1wb3J0IHsgTmF2aWdhYmxlTWFwIH0gZnJvbSBcIi4vTmF2aWdhYmxlTWFwXCI7XHJcbmltcG9ydCB7IENsb25lYWJsZSB9IGZyb20gXCIuLi91dGlsL2ludGVyZmFjZS9DbG9uZWFibGVcIjtcclxuaW1wb3J0IHsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIH0gZnJvbSBcIi4uL3V0aWwvZXhjZXB0aW9uL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIEFWTC10cmVlIGJhc2VkIGBOYXZpZ2FibGVNYXBgIGltcGxlbWVudGF0aW9uLiBUaGUgbWFwIGlzIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG5hdHVyYWwgb3JkZXJpbmcgb2YgaXRzIGtleXMsIG9yIGJ5IGEgYENvbXBhcmF0b3JgIHByb3ZpZGVkIGF0IG1hcCBjcmVhdGlvbiB0aW1lLCBkZXBlbmRpbmcgb24gd2hpY2ggY29uc3RydWN0b3IgaXMgdXNlZC5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBUcmVlTWFwPEssVj4gZXh0ZW5kcyBBYnN0cmFjdE1hcDxLLFY+IGltcGxlbWVudHMgTmF2aWdhYmxlTWFwPEssVj4sIENsb25lYWJsZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfdHJlZTogQmluYXJ5U2VhcmNoVHJlZTxLLFY+O1xyXG4gIHByaXZhdGUgX3NpemU6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRlbnRDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbXBhcmF0b3I/OiBDb21wYXJhdG9yPEs+KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5fdHJlZSA9IG5ldyBBdmxUcmVlPEssVj4oY29tcGFyYXRvcik7XHJcbiAgfVxyXG5cclxuICBnZXQgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yPEs+IHtyZXR1cm4gdGhpcy5fdHJlZS5rZXlDb21wYXJhdG9yO31cclxuXHJcbiAgb3ZlcnJpZGUgZ2V0IGNvbnRlbnRDaGFuZ2VkKCk6IE9ic2VydmFibGU8dm9pZD4geyByZXR1cm4gdGhpcy5jb250ZW50Q2hhbmdlZCQuYXNPYnNlcnZhYmxlKCkgfVxyXG5cclxuICBvdmVycmlkZSBnZXQgc2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc2l6ZTsgfVxyXG5cclxuICBvdmVycmlkZSBjbGVhcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHtcclxuICAgICAgdGhpcy5fdHJlZS5jbGVhcigpO1xyXG4gICAgICB0aGlzLl9zaXplID0gdGhpcy5fdHJlZS5jb3VudCgpO1xyXG4gICAgICB0aGlzLmNvbnRlbnRDaGFuZ2VkJC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9uZSgpOiBUcmVlTWFwPEssVj4ge1xyXG4gICAgY29uc3QgdE1hcCA9IG5ldyBUcmVlTWFwPEssVj4odGhpcy5fdHJlZS5rZXlDb21wYXJhdG9yKTtcclxuICAgIHRNYXAucHV0QWxsKHRoaXMpO1xyXG4gICAgcmV0dXJuIHRNYXA7XHJcbiAgfVxyXG4gIC8qKiBSZXR1cm5zIHRoZSBmaXJzdCAobG93ZXN0KSBrZXkgY3VycmVudGx5IGluIHRoaXMgbWFwICovXHJcbiAgZmlyc3RLZXkoKTogSyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS5maXJzdEtleSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBmaXJzdEVudHJ5KCk6IFtLLFZdIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuZmlyc3RLZXkoKTtcclxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gW2tleSwgdGhpcy5nZXQoa2V5KSFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcbiAgLyoqIFJldHVybnMgdGhlIGxhc3QgKGhpZ2hlc3QpIGtleSBjdXJyZW50bHkgaW4gdGhpcyBtYXAgKi9cclxuICBsYXN0S2V5KCk6IEsgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUubGFzdEtleSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBsYXN0RW50cnkoKTogW0ssVl0gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5sYXN0S2V5KCk7XHJcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIFtrZXksIHRoaXMuZ2V0KGtleSkhXTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIHBvbGxMYXN0RW50cnkoKTogW0ssVl0gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmxhc3RFbnRyeSgpO1xyXG4gICAgaWYgKGVudHJ5KSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlKGVudHJ5WzBdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbnRyeTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgcG9sbEZpcnN0RW50cnkoKTogW0ssVl0gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmZpcnN0RW50cnkoKTtcclxuICAgIGlmIChlbnRyeSkge1xyXG4gICAgICB0aGlzLmRlbGV0ZShlbnRyeVswXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50cnk7XHJcbiAgfVxyXG4gIC8qKiBSZXR1cm5zIHRoZSBtYXhpbWFsIGxldmVsIG9mIHRoZSB0cmVlICovXHJcbiAgaGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS5oZWlnaHQoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUga2V5cyBvZiB0aGlzIHRyZWUgYXMgYSBgU2V0YCBjb2xsZWN0aW9uXHJcbiAgICogQHJldHVybnMgU2V0XHJcbiAgICovXHJcbiAgb3ZlcnJpZGUga2V5U2V0KCk6IFNldDxLPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS5rZXlTZXQoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgY2VpbGluZ0tleShrZXk6IEspOiBLIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBmaW5kS2V5OiAgSyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIGZvciAobGV0IGN1cnJLZXkgb2YgdGhpcy5rZXlzKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX3RyZWUua2V5Q29tcGFyYXRvci5ncmVhdGVyVGhhbk9yRXF1YWwoY3VycktleSwga2V5KSkge1xyXG4gICAgICAgIGZpbmRLZXkgPSBjdXJyS2V5O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmluZEtleTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgZmxvb3JLZXkoa2V5OiBLKTogSyB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgZmluZEtleTogIEsgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBmb3IobGV0IGN1cnJLZXkgb2YgdGhpcy5rZXlzKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX3RyZWUua2V5Q29tcGFyYXRvci5sZXNzVGhhbk9yRXF1YWwoY3VycktleSwga2V5KSkge1xyXG4gICAgICAgIGZpbmRLZXkgPSBjdXJyS2V5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmluZEtleTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgbG93ZXJLZXkoa2V5OiBLKTogSyB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgZmluZEtleTogIEsgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBmb3IgKGxldCBjdXJyS2V5IG9mIHRoaXMua2V5cygpKSB7XHJcbiAgICAgIGlmICh0aGlzLl90cmVlLmtleUNvbXBhcmF0b3IubGVzc1RoYW4oY3VycktleSwga2V5KSkge1xyXG4gICAgICAgIGZpbmRLZXkgPSBjdXJyS2V5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmluZEtleTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgaGlnaGVyS2V5KGtleTogSyk6IEsgfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IGZpbmRLZXk6ICBLIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgZm9yIChsZXQgY3VycktleSBvZiB0aGlzLmtleXMoKSkge1xyXG4gICAgICBpZiAodGhpcy5fdHJlZS5rZXlDb21wYXJhdG9yLmdyZWF0ZXJUaGFuKGN1cnJLZXksIGtleSkpIHtcclxuICAgICAgICBmaW5kS2V5ID0gY3VycktleTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpbmRLZXk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgYXJyYXkgb2YgdGhlIGtleXNcclxuICAgKiBAcmV0dXJucyBBcnJheVxyXG4gICAqL1xyXG4gIG92ZXJyaWRlICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Sz4ge1xyXG4gICAgZm9yIChsZXQga2V5IG9mIHRoaXMuX3RyZWUua2V5cygpKSB7XHJcbiAgICAgIHlpZWxkIGtleTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBhcnJheSBvZiB0aGUgdmFsdWVzXHJcbiAgICogQHJldHVybnMgQXJyYXlcclxuICAgKi9cclxuICBvdmVycmlkZSAqdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xyXG4gICAgZm9yIChsZXQgdmFsIG9mIHRoaXMuX3RyZWUudmFsdWVzKCkpIHtcclxuICAgICAgeWllbGQgdmFsITtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBhcnJheSBvZiB0aGUgdHJlZSBlbnRyaWVzXHJcbiAgICogQHJldHVybnMgQXJyYXlcclxuICAgKi9cclxuICBvdmVycmlkZSAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtLLCBWXT4ge1xyXG4gICAgeWllbGQqIHRoaXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIF90cnVlXyBpZiB0aGlzIHRyZWUgY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGBrZXlgXHJcbiAgICogQHNlZSB7QGxpbmsgaGFzfVxyXG4gICAqL1xyXG4gIGNvbnRhaW5zS2V5KGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUuY29udGFpbnMoa2V5KTtcclxuICB9XHJcbiAgLyoqIFJldHVybnMgX3RydWVfIGlmIHRoaXMgdHJlZSBjb250YWlucyBhIHZhbHVlLCBfZmFsc2VfIG90aGVyd2lzZSAqL1xyXG4gIGNvbnRhaW5zVmFsdWUodmFsdWU6IFYpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBbLi4udGhpcy52YWx1ZXMoKV0uaW5kZXhPZih2YWx1ZSkgPj0gMDtcclxuICB9XHJcbiAgLyoqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBga2V5YCBpcyBtYXBwZWQgaW4gdGhpcyB0cmVlICovXHJcbiAgb3ZlcnJpZGUgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUuZ2V0KGtleSkhO1xyXG4gIH1cclxuICAvKiogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIGBrZXlgIGlzIG1hcHBlZCBpbiB0aGlzIHRyZWUsIG9yIGBkZWZhdWx0VmFsdWVgIGlmIHRoaXMgdHJlZSBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGUga2V5ICovXHJcbiAgZ2V0T3JEZWZhdWx0KGtleTogSywgZGVmYXVsdFZhbHVlOiBFbGVtZW50PFY+KTogRWxlbWVudDxWPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS5nZXQoa2V5KSA/PyBkZWZhdWx0VmFsdWU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRlc3RzIHRoZSB0cmVlIGZvciB0aGUgYGtleWAgZXhpc3RlbmNlXHJcbiAgICogQHBhcmFtIGtleSBBIGtleSB2YWx1ZSB0byB0ZXN0XHJcbiAgICogQHJldHVybnMgX3RydWVfIGlmIHRoaXMgdHJlZSBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgYGtleWAsIF9mYWxzZV8gb3RoZXJ3aXNlXHJcbiAgICogQHNlZSB7QGxpbmsgY29udGFpbnNLZXl9XHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgaGFzKGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUuY29udGFpbnMoa2V5KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTWFwcyB0aGUgc3BlY2lmaWVkIGBrZXlgIHRvIHRoZSBzcGVjaWZpZWQgYHZhbHVlYCBpbiB0aGlzIHRyZWUgYW5kIHJldHVybnMgcHJldmlvdXMgdmFsdWUgb2YgdGhlIG1hcHBpbmdcclxuICAgKiBAcGFyYW0ga2V5IEEga2V5IHZhbHVlIG9mIHRoZSBtYXBwaW5nXHJcbiAgICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSB0byBhc3NpZ24gZm9yIHRoZSBga2V5YFxyXG4gICAqIEByZXR1cm5zIE9sZCB2YWx1ZSBvZiB0aGUgYGtleWAgb3IgX3VuZGVmaW5lZF8gaWYgaXQgd2FzIG5vdCBzZXQgYmVmb3JlXHJcbiAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cclxuICAgKi9cclxuICBwdXQoa2V5OiBLLCB2YWx1ZTogVik6IFYgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVuZGVmaW5lZCBrZXkvdmFsdWUgaXMgbm90IGFsbG93ZWQgaW4gJ3B1dCgpJyBvcGVyYXRpb25cIik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvbGRFbGVtID0gdGhpcy5fdHJlZS5nZXQoa2V5KSE7XHJcbiAgICB0aGlzLl90cmVlLmFkZChrZXksIHZhbHVlKTtcclxuICAgIGlmIChvbGRFbGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fc2l6ZSsrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250ZW50Q2hhbmdlZCQubmV4dCgpO1xyXG4gICAgcmV0dXJuIG9sZEVsZW07XHJcbiAgfVxyXG4gIC8qKiBDb3BpZXMgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgdHJlZSAqL1xyXG4gIHB1dEFsbDxLZXkgZXh0ZW5kcyBLLCBWYWx1ZSBleHRlbmRzIFY+KG1hcDogRGljdGlvbmFyeTxLZXksIFZhbHVlPiB8IE1hcDxLZXksIFZhbHVlPik6IHZvaWQge1xyXG4gICAgY29uc3QgYUtleXMgPSBtYXAua2V5cygpIGFzIEtbXTtcclxuICAgIGFLZXlzLmZvckVhY2goa2V5ID0+IHRoaXMucHV0KGtleSwgdGhpcy5nZXQoa2V5KSEpKTtcclxuICB9XHJcbiAgLyoqIFJlbW92ZXMgdGhlIGBrZXlgIChhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUpIGZyb20gdGhpcyB0cmVlICovXHJcbiAgcmVtb3ZlKGtleTogSyk6IEVsZW1lbnQ8Vj4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZWxlbSA9IHRoaXMuX3RyZWUucmVtb3ZlKGtleSk7XHJcbiAgICBpZiAoIGVsZW0gIT09IHVuZGVmaW5lZCApIHtcclxuICAgICAgdGhpcy5fc2l6ZS0tO1xyXG4gICAgICB0aGlzLmNvbnRlbnRDaGFuZ2VkJC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWxlbTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cclxuICAgKi9cclxuICBvdmVycmlkZSBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHRoaXMge1xyXG4gICAgdGhpcy5wdXQoa2V5LCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybXMgdGhlIHNwZWNpZmllZCBhY3Rpb24gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgdHJlZS5cclxuICAgKiBAcGFyYW0gY2FsbEJhY2sgIEZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCB0cmVlIGl0ZW1cclxuICAgKiBAcGFyYW0gdGhpc0FyZyAgIEFuIG9iamVjdCB0byB3aGljaCB0aGUgYHRoaXNgIGtleXdvcmQgY2FuIHJlZmVyIGluIHRoZSBgY2FsbEJhY2tgIGZ1bmN0aW9uLiBJZiBgdGhpc0FyZ2AgaXMgb21pdHRlZCwgdW5kZWZpbmVkIGlzIHVzZWQgYXMgdGhlIGB0aGlzYCB2YWx1ZVxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGZvckVhY2goY2FsbEJhY2s6ICh2YWx1ZTogViwga2V5OiBLLCBtYXA6IE1hcDxLLCBWPikgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJlZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiBjYWxsQmFjayh2YWx1ZSBhcyBWLCBrZXksIHRoaXMpLCB0aGlzQXJnKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9IFwiVHJlZU1hcFwiO1xyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIG92ZXJyaWRlICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFtLLFZdPiB7XHJcbiAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMuX3RyZWUpIHtcclxuICAgICAgeWllbGQgW25vZGUua2V5LCBub2RlLnZhbHVlIV07XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpbnQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90cmVlLnByaW50KCk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=