@angular-package/range
Version:
The range between minimum and maximum.
178 lines • 44.7 kB
JavaScript
var _Range_maximum, _Range_minimum, _Range_step, _Range_value;
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
import { Maximum } from './maximum.class';
import { Minimum } from './minimum.class';
export class Range {
constructor(min, max, value, step = 1) {
_Range_maximum.set(this, void 0);
_Range_minimum.set(this, void 0);
_Range_step.set(this, void 0);
_Range_value.set(this, void 0);
__classPrivateFieldSet(this, _Range_maximum, new Maximum(max), "f");
__classPrivateFieldSet(this, _Range_minimum, new Minimum(min), "f");
__classPrivateFieldSet(this, _Range_step, step, "f");
this.value = value;
Object.defineProperties(this, {
min: {
value: min,
enumerable: true,
writable: false,
},
max: {
value: max,
enumerable: true,
writable: false,
},
});
}
get range() {
return this.getRange();
}
get step() {
return __classPrivateFieldGet(this, _Range_step, "f");
}
get steps() {
return this.getRange().length;
}
get value() {
return __classPrivateFieldGet(this, _Range_value, "f");
}
set value(value) {
typeof value === 'number'
? this.has(value) && (__classPrivateFieldSet(this, _Range_value, value, "f"))
: undefined;
}
get [(_Range_maximum = new WeakMap(), _Range_minimum = new WeakMap(), _Range_step = new WeakMap(), _Range_value = new WeakMap(), Symbol.toStringTag)]() {
return 'Range';
}
static create(min, max, value, step) {
return new this(min, max, value, step);
}
static createFrom(numbers, step = 1) {
return Range.create(Math.min.apply(0, numbers), Math.max.apply(0, numbers), step);
}
static createMaximum(value) {
return Maximum.create(value);
}
static createMinimum(value) {
return Minimum.create(value);
}
static isRange(value, min, max, step) {
return typeof value === 'object' && value instanceof this
? (typeof min === 'number' ? value.min === min : true) &&
(typeof max === 'number' ? value.max === max : true) &&
(typeof step === 'number' ? value.step === step : true)
: false;
}
forEachStep(forEachStep) {
this.range.forEach(forEachStep);
return this;
}
getCurrentRange() {
return typeof this.value === 'number'
? this.getRange(this.value)
: undefined;
}
getCurrentStep() {
return typeof this.value === 'number'
? Math.floor(this.value / __classPrivateFieldGet(this, _Range_step, "f"))
: undefined;
}
getMax() {
return __classPrivateFieldGet(this, _Range_maximum, "f").valueOf();
}
getMin() {
return __classPrivateFieldGet(this, _Range_minimum, "f").valueOf();
}
getRange(value = this.max) {
const range = [];
let current = this.min;
while (current <= value) {
current <= this.max && range.push(current), (current += __classPrivateFieldGet(this, _Range_step, "f"));
}
return range;
}
getRangeOfStep(step) {
const range = [];
if (step > 0 && step <= this.steps) {
for (let value = 0; value < step; value++) {
range.push(this.min + value * __classPrivateFieldGet(this, _Range_step, "f"));
}
}
return range;
}
getValueOfStep(step) {
return step > 0 && step <= this.steps ? this.range[step - 1] : undefined;
}
has(value) {
return ((this.minLessThan(value) && this.maxGreaterThan(value)) ||
value === this.min ||
value === this.max);
}
hasEvery(...values) {
return values.every((value) => this.has(value));
}
hasSome(...values) {
return values.some((value) => this.has(value));
}
isBetween(min, max) {
return min <= max ? this.hasEvery(min, max) : false;
}
isBetweenEvery(...ranges) {
return ranges.every((range) => range[0] <= range[1] ? this.hasEvery(...range) : false);
}
isBetweenSome(...ranges) {
return ranges.some((range) => range[0] <= range[1] ? this.hasEvery(...range) : false);
}
maxGreaterThan(value) {
return __classPrivateFieldGet(this, _Range_maximum, "f").greaterThan(value);
}
maxLessThan(value) {
return __classPrivateFieldGet(this, _Range_maximum, "f").lessThan(value);
}
minGreaterThan(value) {
return __classPrivateFieldGet(this, _Range_minimum, "f").greaterThan(value);
}
minLessThan(value) {
return __classPrivateFieldGet(this, _Range_minimum, "f").lessThan(value);
}
setValue(value) {
this.value = value;
return this;
}
setValueToStep(step) {
step > 0 && (this.value = this.getValueOfStep(step));
return this;
}
stepByStep(callbackFn) {
const t = this;
callbackFn((function* stepByStep(current = t.min - t.step) {
while (current < t.max) {
yield (current += t.step);
}
})(), t.step, t.max);
return this;
}
toArray() {
return [__classPrivateFieldGet(this, _Range_minimum, "f").valueOf(), __classPrivateFieldGet(this, _Range_maximum, "f").valueOf()];
}
valueDown(stepDecrement = 1) {
typeof this.value === 'number' &&
stepDecrement > 0 &&
this.setValue(this.value - stepDecrement * __classPrivateFieldGet(this, _Range_step, "f"));
return this;
}
valueOf() {
return Object.freeze({
min: __classPrivateFieldGet(this, _Range_minimum, "f").valueOf(),
max: __classPrivateFieldGet(this, _Range_maximum, "f").valueOf(),
});
}
valueUp(stepIncrement = 1) {
typeof this.value === 'number' &&
stepIncrement > 0 &&
this.setValue(this.value + stepIncrement * __classPrivateFieldGet(this, _Range_step, "f"));
return this;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9yYW5nZS9zcmMvbGliL3JhbmdlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkxQyxNQUFNLE9BQU8sS0FBSztJQWlOaEIsWUFBWSxHQUFRLEVBQUUsR0FBUSxFQUFFLEtBQWMsRUFBRSxPQUFhLENBQVM7UUE1SHRFLGlDQUF1QjtRQU12QixpQ0FBdUI7UUFNdkIsOEJBQVk7UUFLWiwrQkFBZ0I7UUE0R2QsdUJBQUEsSUFBSSxrQkFBWSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBQSxDQUFDO1FBQ2pDLHVCQUFBLElBQUksa0JBQVksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQUEsQ0FBQztRQUNqQyx1QkFBQSxJQUFJLGVBQVMsSUFBSSxNQUFBLENBQUM7UUFFbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRTtZQUM1QixHQUFHLEVBQUU7Z0JBQ0gsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1lBQ0QsR0FBRyxFQUFFO2dCQUNILEtBQUssRUFBRSxHQUFHO2dCQUNWLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixRQUFRLEVBQUUsS0FBSzthQUNoQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUF6TkQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQVFELElBQVcsSUFBSTtRQUNiLE9BQU8sdUJBQUEsSUFBSSxtQkFBTSxDQUFDO0lBQ3BCLENBQUM7SUFPRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQVFELElBQVcsS0FBSztRQUNkLE9BQU8sdUJBQUEsSUFBSSxvQkFBTyxDQUFDO0lBQ3JCLENBQUM7SUFRRCxJQUFXLEtBQUssQ0FBQyxLQUF5QjtRQUN4QyxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQUEsSUFBSSxnQkFBVSxLQUFLLE1BQUEsQ0FBQztZQUMxQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFRRCxJQUFXLDZIQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUM7UUFDN0IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQXNETSxNQUFNLENBQUMsTUFBTSxDQUlsQixHQUFRLEVBQUUsR0FBUSxFQUFFLEtBQWMsRUFBRSxJQUFXO1FBQy9DLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQVNNLE1BQU0sQ0FBQyxVQUFVLENBQ3RCLE9BQWlCLEVBQ2pCLE9BQWEsQ0FBUztRQUV0QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUMxQixJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFRTSxNQUFNLENBQUMsYUFBYSxDQUN6QixLQUFZO1FBRVosT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFRTSxNQUFNLENBQUMsYUFBYSxDQUN6QixLQUFZO1FBRVosT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFZTSxNQUFNLENBQUMsT0FBTyxDQUtuQixLQUFVLEVBQ1YsR0FBUyxFQUNULEdBQVMsRUFDVCxJQUFXO1FBRVgsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLElBQUk7WUFDdkQsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNsRCxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDcEQsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDM0QsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNaLENBQUM7SUE2Q00sV0FBVyxDQUNoQixXQUE0RTtRQUU1RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFRTSxlQUFlO1FBQ3BCLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUMzQixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFPTSxjQUFjO1FBQ25CLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyx1QkFBQSxJQUFJLG1CQUFNLENBQUM7WUFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDO0lBUU0sTUFBTTtRQUNYLE9BQU8sdUJBQUEsSUFBSSxzQkFBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFRTSxNQUFNO1FBQ1gsT0FBTyx1QkFBQSxJQUFJLHNCQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQVNNLFFBQVEsQ0FBQyxRQUFnQixJQUFJLENBQUMsR0FBRztRQUN0QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUMvQixPQUFPLE9BQU8sSUFBSSxLQUFLLEVBQUU7WUFDdkIsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSx1QkFBQSxJQUFJLG1CQUFNLENBQUMsQ0FBQztTQUNyRTtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQVdNLGNBQWMsQ0FBQyxJQUFZO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbEMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyx1QkFBQSxJQUFJLG1CQUFNLENBQUMsQ0FBQzthQUMzQztTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBUU0sY0FBYyxDQUFDLElBQVk7UUFDaEMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzNFLENBQUM7SUFRTSxHQUFHLENBQUMsS0FBYTtRQUN0QixPQUFPLENBQ0wsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHO1lBQ2xCLEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQVNNLFFBQVEsQ0FBQyxHQUFHLE1BQWdCO1FBQ2pDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFRTSxPQUFPLENBQUMsR0FBRyxNQUFnQjtRQUNoQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBVU0sU0FBUyxDQUFDLEdBQVcsRUFBRSxHQUFXO1FBQ3ZDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN0RCxDQUFDO0lBU00sY0FBYyxDQUFDLEdBQUcsTUFBMEI7UUFDakQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDNUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ3ZELENBQUM7SUFDSixDQUFDO0lBU00sYUFBYSxDQUFDLEdBQUcsTUFBMEI7UUFDaEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDM0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ3ZELENBQUM7SUFDSixDQUFDO0lBU00sY0FBYyxDQUFDLEtBQWE7UUFDakMsT0FBTyx1QkFBQSxJQUFJLHNCQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFTTSxXQUFXLENBQUMsS0FBYTtRQUM5QixPQUFPLHVCQUFBLElBQUksc0JBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQVNNLGNBQWMsQ0FBQyxLQUFhO1FBQ2pDLE9BQU8sdUJBQUEsSUFBSSxzQkFBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBU00sV0FBVyxDQUFDLEtBQWE7UUFDOUIsT0FBTyx1QkFBQSxJQUFJLHNCQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFTTSxRQUFRLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFTTSxjQUFjLENBQUMsSUFBWTtRQUNoQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBU00sVUFBVSxDQUNmLFVBQW9FO1FBRXBFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNmLFVBQVUsQ0FDUixDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSTtZQUM1QyxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFO2dCQUN0QixNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMzQjtRQUNILENBQUMsQ0FBQyxFQUFFLEVBQ0osQ0FBQyxDQUFDLElBQUksRUFDTixDQUFDLENBQUMsR0FBRyxDQUNOLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFRTSxPQUFPO1FBQ1osT0FBTyxDQUFDLHVCQUFBLElBQUksc0JBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSx1QkFBQSxJQUFJLHNCQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBU00sU0FBUyxDQUFDLGFBQWEsR0FBRyxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRO1lBQzVCLGFBQWEsR0FBRyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLEdBQUcsdUJBQUEsSUFBSSxtQkFBTSxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBUU0sT0FBTztRQUNaLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNuQixHQUFHLEVBQUUsdUJBQUEsSUFBSSxzQkFBUyxDQUFDLE9BQU8sRUFBRTtZQUM1QixHQUFHLEVBQUUsdUJBQUEsSUFBSSxzQkFBUyxDQUFDLE9BQU8sRUFBRTtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBU00sT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRO1lBQzVCLGFBQWEsR0FBRyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLEdBQUcsdUJBQUEsSUFBSSxtQkFBTSxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDbGFzcy5cbmltcG9ydCB7IE1heGltdW0gfSBmcm9tICcuL21heGltdW0uY2xhc3MnO1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJy4vbWluaW11bS5jbGFzcyc7XG4vKipcbiAqIFRoZSBgUmFuZ2VgIG9iamVjdCByZXByZXNlbnRzIGEgcmFuZ2UgYmV0d2VlbiBhIG1pbmltdW0gYW5kIG1heGltdW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZTxcbiAgTWluIGV4dGVuZHMgbnVtYmVyLFxuICBNYXggZXh0ZW5kcyBudW1iZXIsXG4gIFN0ZXAgZXh0ZW5kcyBudW1iZXIgPSAxXG4+IHtcbiAgLy8jcmVnaW9uIGluc3RhbmNlIGFjY2Vzc29ycy5cbiAgLyoqXG4gICAqIFRoZSBgZ2V0YCBhY2Nlc3NvciBvYnRhaW5zIHRoZSByYW5nZSBvZiBhbiBgQXJyYXlgIG9mIHRoZSBtaW5pbXVtIHRvIHRoZSBtYXhpbXVtIHdpdGggdGhlIHN0ZXAgb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHJhbmdlIGZyb20gbWluaW11bSB0byB0aGUgbWF4aW11bSBvZiBhIHJlYWQtb25seSBgQXJyYXlgIG9mIG51bWJlci5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhbmdlKCk6IFJlYWRvbmx5PEFycmF5PG51bWJlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRSYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZ2V0YCBhY2Nlc3NvciBvYnRhaW5zIHRoZSBzdGVwIG9mIGEgc3BlY2lmaWVkIGBSYW5nZWAgb2JqZWN0LiBJdCdzIHVzZWQgdG8gcmV0dXJuIHRoZSBlbnRpcmUgcmFuZ2UsIGdldCB0aGUgc3RlcCBvZiB0aGUgcmFuZ2VcbiAgICogdmFsdWUsIGFuZCBjaGFuZ2UgdGhlIHJhbmdlIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzdGVwIG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgU3RlcGAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGdldCBzdGVwKCk6IFN0ZXAge1xuICAgIHJldHVybiB0aGlzLiNzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZ2V0YCBhY2Nlc3NvciByZXRyaWV2ZXMgdGhlIG51bWJlciBvZiBzdGVwcyBvZiB0aGUgc3BlY2lmaWVkIGBSYW5nZWAgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2Ygc3RlcHMgb2YgdGhlIGBudW1iZXJgIHR5cGUuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGdldCBzdGVwcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFJhbmdlKCkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZ2V0YCBhY2Nlc3NvciByZXRyaWV2ZXMgdGhlIGAjdmFsdWVgIHByb3BlcnR5IHRoYXQgaW5kaWNhdGVzIHRoZSByYW5nZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBgbnVtYmVyYCB0eXBlIG9mIGEgc3BlY2lmaWVkIGBSYW5nZWBcbiAgICogb2JqZWN0LiBJdCBjYW4gYmUgc2V0IGJ5IHRoZSBgc2V0VmFsdWUoKWAgbWV0aG9kLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSByYW5nZSBjdXJyZW50IHZhbHVlIG9mIGBudW1iZXJgIHR5cGUgaWYgc2V0LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiN2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYHNldGAgYWNjZXNzb3Igc2V0cyB0aGUgcmFuZ2UgY3VycmVudCB2YWx1ZSBvZiB0aGUgYG51bWJlcmAgdHlwZSBiZXR3ZWVuIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG9mIGEgc3BlY2lmaWVkIGBSYW5nZWBcbiAgICogb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSByYW5nZSBjdXJyZW50IHZhbHVlIG9mIGBudW1iZXJgIHR5cGUgaWYgc2V0LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuICAgICAgPyB0aGlzLmhhcyh2YWx1ZSkgJiYgKHRoaXMuI3ZhbHVlID0gdmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHksIHdpdGggdGhlIGhlbHAgb2YgYHRvU3RyaW5nVGFnYCwgY2hhbmdlcyB0aGUgZGVmYXVsdCB0YWcgdG8gYCdSYW5nZSdgIGZvciBhbiBpbnN0YW5jZSBvZiBgUmFuZ2VgLiBJdCBjYW4gYmUgcmVhZCBieSB0aGVcbiAgICogYHR5cGVPZigpYCBmdW5jdGlvbiBvZiBgQGFuZ3VsYXItcGFja2FnZS90eXBlYC5cbiAgICogQHJldHVybnNUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB3b3JkICdSYW5nZWAgb2YgYSBgc3RyaW5nYC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdSYW5nZSc7XG4gIH1cbiAgLy8jZW5kcmVnaW9uIGluc3RhbmNlIGFjY2Vzc29ycy5cblxuICAvLyNyZWdpb24gaW5zdGFuY2UgcHJvcGVydGllcy5cbiAgLy8jcmVnaW9uIHB1YmxpYyBpbnN0YW5jZSBwcm9wZXJ0aWVzLlxuICAvKipcbiAgICogVGhlIGBtYXhgIHJlYWQtb25seSBwcm9wZXJ0eSBpcyB0aGUgbWF4aW11bSByYW5nZSBvZiBnZW5lcmljIHR5cGUgdmFyaWFibGUgYE1heGAgb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4ITogTWF4O1xuXG4gIC8qKlxuICAgKiBUaGUgYG1pbmAgcmVhZC1vbmx5IHByb3BlcnR5IGlzIHRoZSBtaW5pbXVtIHJhbmdlIG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgTWluYCBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtaW4hOiBNaW47XG4gIC8vI2VuZHJlZ2lvbiBwdWJsaWMgaW5zdGFuY2UgcHJvcGVydGllcy5cblxuICAvLyNyZWdpb24gcHJpdmF0ZSBpbnN0YW5jZSBwcm9wZXJ0aWVzLlxuICAvKipcbiAgICogUHJpdmF0ZSBwcm9wZXJ0eSBvZiB0aGUgYE1heGltdW1gIHByaW1pdGl2ZSB3cmFwcGVyIGBvYmplY3RgIHdpdGggYSBwcmltaXRpdmUgdmFsdWUgZnJvbSBhIGdpdmVuIGBtYXhgIG9mIHRoZSBgUmFuZ2VgIGNvbnN0cnVjdG9yXG4gICAqIGluZGljYXRlcyB0aGUgbWF4aW11bSByYW5nZS5cbiAgICovXG4gICNtYXhpbXVtOiBNYXhpbXVtPE1heD47XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvcGVydHkgb2YgdGhlIGBNaW5pbXVtYCBwcmltaXRpdmUgd3JhcHBlciBgb2JqZWN0YCB3aXRoIGEgcHJpbWl0aXZlIHZhbHVlIGZyb20gYSBnaXZlbiBgbWluYCBvZiB0aGUgYFJhbmdlYCBjb25zdHJ1Y3RvclxuICAgKiBpbmRpY2F0ZXMgdGhlIG1pbmltdW0gcmFuZ2UuXG4gICAqL1xuICAjbWluaW11bTogTWluaW11bTxNaW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpdmF0ZSBwcm9wZXJ0eSBvZiB0aGUgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBTdGVwYCBpbmRpY2F0ZXMgdGhlIHJhbmdlIHN0ZXAuIEl0J3MgdXNlZCB0byByZXR1cm4gdGhlIGVudGlyZSByYW5nZSwgZ2V0IHRoZVxuICAgKiBzdGVwIG9mIHRoZSByYW5nZSB2YWx1ZSwgYW5kIGNoYW5nZSB0aGUgcmFuZ2UgdmFsdWUuXG4gICAqL1xuICAjc3RlcDogU3RlcDtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgcHJvcGVydHkgb2YgdGhlIGBudW1iZXJgIHR5cGUgaW5kaWNhdGVzIHRoZSByYW5nZSB2YWx1ZS4gSXQgY2FuIGJlIHNldCBieSB0aGUgYHNldFZhbHVlKClgIG1ldGhvZCBhbmQgc2V0dGVyIGB2YWx1ZWAuXG4gICAqL1xuICAjdmFsdWU/OiBudW1iZXI7XG4gIC8vI2VuZHJlZ2lvbiBwcml2YXRlIGluc3RhbmNlIHByb3BlcnRpZXMuXG4gIC8vI2VuZHJlZ2lvbiBpbnN0YW5jZSBwcm9wZXJ0aWVzLlxuXG4gIC8vI3JlZ2lvbiBzdGF0aWMgcHVibGljIG1ldGhvZHMuXG4gIC8qKlxuICAgKiBUaGUgc3RhdGljIGBjcmVhdGUoKWAgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgYFJhbmdlYCB3aXRoIGEgcmFuZ2Ugb2YgdGhlIGdpdmVuIHJlcXVpcmVkIGBtaW5gLCBgbWF4YCBhbmQgb3B0aW9uYWwgY3VycmVudFxuICAgKiBgdmFsdWVgLCBgc3RlcGAuXG4gICAqIEBwYXJhbSBtaW4gVGhlICoqbWluaW11bSoqIHJhbmdlIG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgTWluYCB0byBzZXQgd2l0aCBhIG5ldyBgUmFuZ2VgIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gbWF4IFRoZSAqKm1heGltdW0qKiByYW5nZSBvZiBnZW5lcmljIHR5cGUgdmFyaWFibGUgYE1heGAgdG8gc2V0IHdpdGggYSBuZXcgYFJhbmdlYCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBvcHRpb25hbCB2YWx1ZSBvZiB0aGUgYG51bWJlcmAgdHlwZSBiZXR3ZWVuIHRoZSBnaXZlbiBgbWluYCBhbmQgYG1heGAgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgbmV3IGBSYW5nZWBcbiAgICogaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBzdGVwIE9wdGlvbmFsIHN0ZXAgb2YgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBTdGVwYCB0byBzZXQgd2l0aCBhIG5ldyBgUmFuZ2VgIGluc3RhbmNlLCBieSBkZWZhdWx0IGAxYC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYFJhbmdlYCBpbnN0YW5jZSB3aXRoIGEgcmFuZ2Ugb2YgdGhlIGdpdmVuIHJlcXVpcmVkIGBtaW5gLCBgbWF4YCBhbmQgb3B0aW9uYWwgY3VycmVudCBgdmFsdWVgLCBgc3RlcGAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGU8XG4gICAgTWluIGV4dGVuZHMgbnVtYmVyLFxuICAgIE1heCBleHRlbmRzIG51bWJlcixcbiAgICBTdGVwIGV4dGVuZHMgbnVtYmVyID0gMVxuICA+KG1pbjogTWluLCBtYXg6IE1heCwgdmFsdWU/OiBudW1iZXIsIHN0ZXA/OiBTdGVwKTogUmFuZ2U8TWluLCBNYXgsIFN0ZXA+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMobWluLCBtYXgsIHZhbHVlLCBzdGVwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBgUmFuZ2VgIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHJhbmRvbSBudW1iZXJzIGFuZCB0aGUgc3RlcC5cbiAgICogQHBhcmFtIG51bWJlcnMgQW4gYEFycmF5YCBvZiBudW1iZXJzIHRvIGZpbmQgYSByYW5nZSBhbmQgY3JlYXRlIGEgbmV3IGluc3RhbmNlLlxuICAgKiBAcGFyYW0gc3RlcCBPcHRpb25hbCBzdGVwIG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgU3RlcGAgdG8gc2V0IHdpdGggYSBuZXcgYFJhbmdlYCBpbnN0YW5jZSwgYnkgZGVmYXVsdCBgMWAuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGBSYW5nZWAgaW5zdGFuY2UgY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiByZXF1aXJlZCByYW5kb20gbnVtYmVycyBhbmQgdGhlIG9wdGlvbmFsIHN0ZXAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tPFN0ZXAgZXh0ZW5kcyBudW1iZXIgPSAxPihcbiAgICBudW1iZXJzOiBudW1iZXJbXSxcbiAgICBzdGVwOiBTdGVwID0gMSBhcyBTdGVwXG4gICk6IFJhbmdlPG51bWJlciwgbnVtYmVyLCBTdGVwPiB7XG4gICAgcmV0dXJuIFJhbmdlLmNyZWF0ZShcbiAgICAgIE1hdGgubWluLmFwcGx5KDAsIG51bWJlcnMpLFxuICAgICAgTWF0aC5tYXguYXBwbHkoMCwgbnVtYmVycyksXG4gICAgICBzdGVwXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3RhdGljIGBjcmVhdGVNYXhpbXVtKClgIG1ldGhvZCByZXR1cm5zIHRoZSBgTWF4aW11bWAgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIG1heGltdW0gYHZhbHVlYC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBtYXhpbXVtIHJhbmdlIG9mIGEgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBWYWx1ZWAgdG8gc2V0IHdpdGggYSBuZXcgaW5zdGFuY2Ugb2YgYE1heGltdW1gLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBgTWF4aW11bWAgaW5zdGFuY2Ugd2l0aCB0aGUgcHJpbWl0aXZlIHZhbHVlIGZyb20gdGhlIGdpdmVuIGB2YWx1ZWAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVNYXhpbXVtPFZhbHVlIGV4dGVuZHMgbnVtYmVyPihcbiAgICB2YWx1ZTogVmFsdWVcbiAgKTogTWF4aW11bTxWYWx1ZT4ge1xuICAgIHJldHVybiBNYXhpbXVtLmNyZWF0ZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0YXRpYyBgY3JlYXRlTWluaW11bSgpYCBtZXRob2QgcmV0dXJucyB0aGUgYE1pbmltdW1gIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBtaW5pbXVtIGB2YWx1ZWAuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbWluaW11bSByYW5nZSBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgVmFsdWVgIHRvIHNldCB3aXRoIGEgbmV3IGluc3RhbmNlIG9mIGBNaW5pbXVtYC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYE1pbmltdW1gIGluc3RhbmNlIHdpdGggdGhlIHByaW1pdGl2ZSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBgdmFsdWVgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlTWluaW11bTxWYWx1ZSBleHRlbmRzIG51bWJlcj4oXG4gICAgdmFsdWU6IFZhbHVlXG4gICk6IE1pbmltdW08VmFsdWU+IHtcbiAgICByZXR1cm4gTWluaW11bS5jcmVhdGUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0aWMgYGlzUmFuZ2UoKWAgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBgdmFsdWVgIGlzIGFuIGluc3RhbmNlIG9mIGBSYW5nZWAgb2YgYW55IG9yIHRoZSBnaXZlbiBtaW5pbXVtLCBtYXhpbXVtLCBhbmQgc3RlcC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiBhbnkgdHlwZSB0byB0ZXN0IGFnYWluc3QgdGhlIGBSYW5nZWAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBtaW4gVGhlIG9wdGlvbmFsIG1pbmltdW0gcmFuZ2Ugb2YgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBNaW5gIHRvIGNoZWNrIHdoZXRoZXIgaXQncyBlcXVhbCB0byBhIG1pbmltdW0gb2YgdGhlIGdpdmVuIGB2YWx1ZWAuXG4gICAqIEBwYXJhbSBtYXggVGhlIG9wdGlvbmFsIG1heGltdW0gcmFuZ2Ugb2YgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBNYXhgIHRvIGNoZWNrIHdoZXRoZXIgaXQncyBlcXVhbCB0byBhIG1heGltdW0gb2YgdGhlIGdpdmVuIGB2YWx1ZWAuXG4gICAqIEBwYXJhbSBzdGVwIE9wdGlvbmFsIHN0ZXAgb2YgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBTdGVwYCB0byBjaGVjayB3aGV0aGVyIGl0J3MgZXF1YWwgdG8gdGhlIHN0ZXAgb2YgdGhlIGdpdmVuIGB2YWx1ZWAuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvdmlkZWQgYHZhbHVlYCBpcyBhbiBpbnN0YW5jZSBvZiBgUmFuZ2VgIG9mIGFueSBvciB0aGUgZ2l2ZW4gbWluaW11bSxcbiAgICogbWF4aW11bSByYW5nZSBhbmQgc3RlcC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzUmFuZ2U8XG4gICAgTWluIGV4dGVuZHMgbnVtYmVyLFxuICAgIE1heCBleHRlbmRzIG51bWJlcixcbiAgICBTdGVwIGV4dGVuZHMgbnVtYmVyXG4gID4oXG4gICAgdmFsdWU6IGFueSxcbiAgICBtaW4/OiBNaW4sXG4gICAgbWF4PzogTWF4LFxuICAgIHN0ZXA/OiBTdGVwXG4gICk6IHZhbHVlIGlzIFJhbmdlPE1pbiwgTWF4LCBTdGVwPiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgaW5zdGFuY2VvZiB0aGlzXG4gICAgICA/ICh0eXBlb2YgbWluID09PSAnbnVtYmVyJyA/IHZhbHVlLm1pbiA9PT0gbWluIDogdHJ1ZSkgJiZcbiAgICAgICAgICAodHlwZW9mIG1heCA9PT0gJ251bWJlcicgPyB2YWx1ZS5tYXggPT09IG1heCA6IHRydWUpICYmXG4gICAgICAgICAgKHR5cGVvZiBzdGVwID09PSAnbnVtYmVyJyA/IHZhbHVlLnN0ZXAgPT09IHN0ZXAgOiB0cnVlKVxuICAgICAgOiBmYWxzZTtcbiAgfVxuICAvLyNlbmRyZWdpb24gc3RhdGljIHB1YmxpYyBtZXRob2RzLlxuXG4gIC8vI3JlZ2lvbiBjb25zdHJ1Y3Rvci5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGBSYW5nZWAgaW5zdGFuY2Ugd2l0aCBhIHJhbmdlIG9mIHRoZSBnaXZlbiByZXF1aXJlZCBgbWluYCwgYG1heGAgYW5kIG9wdGlvbmFsIGN1cnJlbnQgYHZhbHVlYCwgYHN0ZXBgLlxuICAgKiBAcGFyYW0gbWluIFRoZSBtaW5pbXVtIHJhbmdlIG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgTWluYCB0byBzZXQgd2l0aCBhIG5ldyBgUmFuZ2VgIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gbWF4IFRoZSBtYXhpbXVtIHJhbmdlIG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgTWF4YCB0byBzZXQgd2l0aCBhIG5ldyBgUmFuZ2VgIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBgbnVtYmVyYCB0eXBlIGJldHdlZW4gdGhlIGdpdmVuIGBtaW5gIGFuZCBgbWF4YCBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBuZXcgYFJhbmdlYFxuICAgKiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHN0ZXAgT3B0aW9uYWwgc3RlcCBvZiBnZW5lcmljIHR5cGUgdmFyaWFibGUgYFN0ZXBgIHRvIHNldCB3aXRoIGEgbmV3IGBSYW5nZWAgaW5zdGFuY2UsIGJ5IGRlZmF1bHQgYDFgLiBUaGUgc3RlcCBpcyB1c2VkIGJ5IHRoZVxuICAgKiBgcmFuZ2VgIGFjY2Vzc29yLCBgZ2V0UmFuZ2UoKWAgLCBgZ2V0UmFuZ2VPZlN0ZXAoKWAgYW5kIGBzdGVwQnlTdGVwKClgIG1ldGhvZHMgdG8gcmV0dXJuIHRoZSBlbnRpcmUgcmFuZ2UgYW5kIGFsc28gYnkgdGhlXG4gICAqIGB2YWx1ZURvd24oKWAsIHZhbHVlVXAoKSBtZXRob2RzIHRvIHJlc3BlY3RpdmVseSBkZWNyZW1lbnQsIGluY3JlbWVudCByYW5nZSB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIG5ldyBpbnN0YW5jZSBvZiBgUmFuZ2VgIG9mIHRoZSBnaXZlbiBtaW5pbXVtIGFuZCBtYXhpbXVtLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1pbjogTWluLCBtYXg6IE1heCwgdmFsdWU/OiBudW1iZXIsIHN0ZXA6IFN0ZXAgPSAxIGFzIFN0ZXApIHtcbiAgICB0aGlzLiNtYXhpbXVtID0gbmV3IE1heGltdW0obWF4KTtcbiAgICB0aGlzLiNtaW5pbXVtID0gbmV3IE1pbmltdW0obWluKTtcbiAgICB0aGlzLiNzdGVwID0gc3RlcDtcbiAgICAvLyBTZXRzIHRoZSByYW5nZSB2YWx1ZSBiZXR3ZWVuIHRoZSBnaXZlbiBgbWluYCBhbmQgYG1heGAuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIC8vIERlZmluZSB0aGUgYG1pbmAgYW5kIGBtYXhgIHByb3BlcnR5LlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgIG1pbjoge1xuICAgICAgICB2YWx1ZTogbWluLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgbWF4OiB7XG4gICAgICAgIHZhbHVlOiBtYXgsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uIGNvbnN0cnVjdG9yLlxuXG4gIC8vI3JlZ2lvbiBpbnN0YW5jZSBwdWJsaWMgbWV0aG9kcy5cbiAgLyoqXG4gICAqIFRoZSBgZm9yRWFjaFN0ZXAoKWAgbWV0aG9kIHBlcmZvcm1zIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGZvciBlYWNoIHN0ZXAgaW4gdGhlIG1heGltdW0gcmFuZ2Ugb2YgYW4gYEFycmF5YC5cbiAgICogQHBhcmFtIGZvckVhY2hTdGVwIEEgYGZ1bmN0aW9uYCB0aGF0IGFjY2VwdHMgdXAgdG8gdGhyZWUgYXJndW1lbnRzLiBJdCdzIGNhbGxlZCBvbmUgdGltZSBmb3IgZWFjaCBzdGVwIGluIHRoZSByYW5nZS5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYFJhbmdlYCBpbnN0YW5jZS5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgZm9yRWFjaFN0ZXAoXG4gICAgZm9yRWFjaFN0ZXA6ICh2YWx1ZTogbnVtYmVyLCBzdGVwOiBudW1iZXIsIHJhbmdlOiByZWFkb25seSBudW1iZXJbXSkgPT4gdm9pZFxuICApOiB0aGlzIHtcbiAgICB0aGlzLnJhbmdlLmZvckVhY2goZm9yRWFjaFN0ZXApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZ2V0Q3VycmVudFJhbmdlKClgIG1ldGhvZCByZXR1cm5zIGEgcmFuZ2Ugb2YgbnVtYmVycyBmcm9tIG1pbmltdW0gdG8gdGhlIGN1cnJlbnQgdmFsdWUgYnkgdGhlIHN0ZXAgb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSByYW5nZSBvZiBudW1iZXJzIG9mIGEgcmVhZC1vbmx5IGBBcnJheWAgZnJvbSBtaW5pbXVtIHRvIHRoZSBjdXJyZW50IHZhbHVlLCBpZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBzZXQsXG4gICAqIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VycmVudFJhbmdlKCk6IFJlYWRvbmx5PEFycmF5PG51bWJlcj4+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInXG4gICAgICA/IHRoaXMuZ2V0UmFuZ2UodGhpcy52YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZ2V0Q3VycmVudFN0ZXAoKWAgbWV0aG9kIHJldHVybnMgdGhlIHN0ZXAgb2YgdGhlIHJhbmdlIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzdGVwIG9mIGBudW1iZXJgIHR5cGUsIGlmIHJhbmdlIHZhbHVlIGlzIHNldCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRDdXJyZW50U3RlcCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcidcbiAgICAgID8gTWF0aC5mbG9vcih0aGlzLnZhbHVlIC8gdGhpcy4jc3RlcClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIFRoZSBgZ2V0TWF4KClgIG1ldGhvZCBnZXRzIHRoZSBtYXhpbXVtIHJhbmdlIG9mIGEgc3BlY2lmaWVkIGBSYW5nZWAgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBtYXhpbXVtIHJhbmdlIG9mIGEgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBNYXhgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRNYXgoKTogTWF4IHtcbiAgICByZXR1cm4gdGhpcy4jbWF4aW11bS52YWx1ZU9mKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogVGhlIGBnZXRNaW4oKWAgbWV0aG9kIGdldHMgdGhlIG1pbmltdW0gcmFuZ2Ugb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG1pbmltdW0gcmFuZ2Ugb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYE1pbmAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGdldE1pbigpOiBNaW4ge1xuICAgIHJldHVybiB0aGlzLiNtaW5pbXVtLnZhbHVlT2YoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYGdldFJhbmdlICgpYCBtZXRob2QgcmV0dXJucyBhIHJhbmdlIG9mIG51bWJlcnMgYnkgdGhlIHNwZWNpZmllZCBzdGVwIGZyb20gbWluaW11bSB0byB0aGUgZ2l2ZW4gYHZhbHVlYCBvZiB0aGUgc3BlY2lmaWVkYCBSYW5nZWBcbiAgICogb2JqZWN0LlxuICAgKiBAcGFyYW0gdmFsdWUgT3B0aW9uYWwgbWF4aW11bSByYW5nZSB2YWx1ZSBvZiBgbnVtYmVyYCB0eXBlIG9mIHJldHVybmVkIGBhcnJheWAgYnkgZGVmYXVsdCBpdCdzIHRoZSBtYXhpbXVtIHJhbmdlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcmFuZ2Ugb2YgbnVtYmVycyBvZiBhIHJlYWQtb25seSBgQXJyYXlgIGZyb20gbWluaW11bSB0byB0aGUgZ2l2ZW4gYHZhbHVlYC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0UmFuZ2UodmFsdWU6IG51bWJlciA9IHRoaXMubWF4KTogUmVhZG9ubHk8QXJyYXk8bnVtYmVyPj4ge1xuICAgIGNvbnN0IHJhbmdlID0gW107XG4gICAgbGV0IGN1cnJlbnQ6IG51bWJlciA9IHRoaXMubWluO1xuICAgIHdoaWxlIChjdXJyZW50IDw9IHZhbHVlKSB7XG4gICAgICBjdXJyZW50IDw9IHRoaXMubWF4ICYmIHJhbmdlLnB1c2goY3VycmVudCksIChjdXJyZW50ICs9IHRoaXMuI3N0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGBnZXRSYW5nZU9mU3RlcCgpYCBtZXRob2QgcmV0dXJucyBhIHJhbmdlIG9mIG51bWJlcnMgYnkgdGhlIHNwZWNpZmllZCBzdGVwIGZyb20gdGhlIG1pbmltdW0gdG8gdGhlIGdpdmVuIGBzdGVwYCBvZiBhIHNwZWNpZmllZFxuICAgKiBgUmFuZ2VgIG9iamVjdC5cbiAgICogQHBhcmFtIHN0ZXAgU3RlcCBvZiBgbnVtYmVyYCB0eXBlIGlzIHRoZSBtYXhpbXVtIHJhbmdlIG9mIHRoZSByZXR1cm5lZCBgYXJyYXlgLiBUaGUgdmFsdWUgbXVzdCBiZSBsZXNzIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcmFuZ2VcbiAgICogc3RlcHMuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSByYW5nZSBvZiBudW1iZXJzIG9mIGEgcmVhZC1vbmx5IGBBcnJheWAgZnJvbSBtaW5pbXVtIHRvIHN0ZXAgb2YgdGhlIGdpdmVuIGBzdGVwYCBpZiB0aGUgZ2l2ZW4gYHN0ZXBgXG4gICAqIGlzIHdpdGhpbiBhIHJhbmdlLCBvdGhlcndpc2UgYW4gZW1wdHkgYEFycmF5YC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0UmFuZ2VPZlN0ZXAoc3RlcDogbnVtYmVyKTogUmVhZG9ubHk8QXJyYXk8bnVtYmVyPj4ge1xuICAgIGNvbnN0IHJhbmdlID0gW107XG4gICAgaWYgKHN0ZXAgPiAwICYmIHN0ZXAgPD0gdGhpcy5zdGVwcykge1xuICAgICAgZm9yIChsZXQgdmFsdWUgPSAwOyB2YWx1ZSA8IHN0ZXA7IHZhbHVlKyspIHtcbiAgICAgICAgcmFuZ2UucHVzaCh0aGlzLm1pbiArIHZhbHVlICogdGhpcy4jc3RlcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYGdldFZhbHVlT2ZTdGVwKClgIG1ldGhvZCByZXR1cm5zIHRoZSByYW5nZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYHN0ZXBgLiBJZiB0aGUgZ2l2ZW4gYHN0ZXBgIGlzIG5vdCB3aXRoaW4gcmFuZ2UgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICogQHBhcmFtIHN0ZXAgU3RlcCBwYXJhbWV0ZXIgb2YgYG51bWJlcmAgdHlwZSB0byByZXRyaWV2ZSB0aGUgcmFuZ2UgdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHJhbmdlIHZhbHVlIG9mIHRoZSBnaXZlbiBgc3RlcGAgd2l0aGluIGEgcmFuZ2Ugb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRWYWx1ZU9mU3RlcChzdGVwOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdGVwID4gMCAmJiBzdGVwIDw9IHRoaXMuc3RlcHMgPyB0aGlzLnJhbmdlW3N0ZXAgLSAxXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYGhhcygpYCBtZXRob2QgY2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGluIHRoZSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiBgbnVtYmVyYCB0eXBlIHRvIHRlc3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBgdmFsdWVgIGlzIGluIHRoZSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgaGFzKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMubWluTGVzc1RoYW4odmFsdWUpICYmIHRoaXMubWF4R3JlYXRlclRoYW4odmFsdWUpKSB8fFxuICAgICAgdmFsdWUgPT09IHRoaXMubWluIHx8XG4gICAgICB2YWx1ZSA9PT0gdGhpcy5tYXhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgaGFzRXZlcnkoKWAgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGV2ZXJ5IHZhbHVlIG9mIHRoZSBnaXZlbiBgdmFsdWVzYCBpcyBpbiB0aGUgcmFuZ2Ugb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QuXG4gICAqIEBwYXJhbSB2YWx1ZSBBIHJlc3QgcGFyYW1ldGVyIG9mIG51bWJlcnMgdG8gdGVzdC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGBib29sZWFuYCBpbmRpY2F0aW5nIHdoZXRoZXIgZXZlcnkgdmFsdWUgb2YgdGhlIGdpdmVuIGB2YWx1ZXNgIGlzIGluIHRoZSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgXG4gICAqIG9iamVjdC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgaGFzRXZlcnkoLi4udmFsdWVzOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiB0aGlzLmhhcyh2YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHNvbWUgYHZhbHVlc2AgYXJlIGluIHRoZSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdC5cbiAgICogQHBhcmFtIHZhbHVlIEEgcmVzdCBwYXJhbWV0ZXIgb2YgbnVtYmVycyB0byB0ZXN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYGJvb2xlYW5gIGluZGljYXRpbmcgd2hldGhlciBzb21lIGB2YWx1ZXNgIGFyZSBpbiB0aGUgcmFuZ2Ugb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGhhc1NvbWUoLi4udmFsdWVzOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZXMuc29tZSgodmFsdWUpID0+IHRoaXMuaGFzKHZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGBpc0JldHdlZW4oKWAgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHJhbmdlIG9mIHRoZSBnaXZlbiBgbWluYCBhbmQgYG1heGAgaXMgYmV0d2VlbiB0aGUgcmFuZ2Ugb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QuXG4gICAqIEBwYXJhbSBtaW4gVGhlICoqbWluaW11bSoqIHJhbmdlIG9mIGBudW1iZXJgIHR5cGUgdG8gdGVzdC5cbiAgICogQHBhcmFtIG1heCBUaGUgKiptYXhpbXVtKiogcmFuZ2Ugb2YgYG51bWJlcmAgdHlwZSB0byB0ZXN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYGJvb2xlYW5gIHR5cGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdCBpcyBiZXR3ZWVuIGEgcmFuZ2Ugb2YgdGhlXG4gICAqIGdpdmVuIGBtaW5gIGFuZCBgbWF4YC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgaXNCZXR3ZWVuKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtaW4gPD0gbWF4ID8gdGhpcy5oYXNFdmVyeShtaW4sIG1heCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcmFuZ2Ugb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QgaXMgYmV0d2VlbiBldmVyeSByYW5nZSBvZiB0aGUgZ2l2ZW4gYHJhbmdlc2AuXG4gICAqIEBwYXJhbSByYW5nZXMgQSByZXN0IHBhcmFtZXRlciBvZiByYW5nZXMgb2YgYW4gYGFycmF5YCB0eXBlIHRvIHRlc3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgdHlwZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJhbmdlIG9mIGEgc3BlY2lmaWVkIGBSYW5nZWAgb2JqZWN0IGlzIGJldHdlZW4gZXZlcnkgcmFuZ2Ugb2YgdGhlXG4gICAqIGdpdmVuIGByYW5nZXNgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBpc0JldHdlZW5FdmVyeSguLi5yYW5nZXM6IFtudW1iZXIsIG51bWJlcl1bXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByYW5nZXMuZXZlcnkoKHJhbmdlKSA9PlxuICAgICAgcmFuZ2VbMF0gPD0gcmFuZ2VbMV0gPyB0aGlzLmhhc0V2ZXJ5KC4uLnJhbmdlKSA6IGZhbHNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcmFuZ2Ugb2YgYSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QgaXMgYmV0d2VlbiBzb21lIGdpdmVuIGByYW5nZXNgLlxuICAgKiBAcGFyYW0gcmFuZ2VzIEEgcmVzdCBwYXJhbWV0ZXIgb2YgYW4gYGFycmF5YCB0eXBlIHJhbmdlcyB0byB0ZXN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYGJvb2xlYW5gIHR5cGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdCBpcyBiZXR3ZWVuIHNvbWUgZ2l2ZW5cbiAgICogYHJhbmdlc2AuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGlzQmV0d2VlblNvbWUoLi4ucmFuZ2VzOiBbbnVtYmVyLCBudW1iZXJdW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmFuZ2VzLnNvbWUoKHJhbmdlKSA9PlxuICAgICAgcmFuZ2VbMF0gPD0gcmFuZ2VbMV0gPyB0aGlzLmhhc0V2ZXJ5KC4uLnJhbmdlKSA6IGZhbHNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYG1heEdyZWF0ZXJUaGFuKClgIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHJhbmdlIG9mIGEgc3BlY2lmaWVkIGBSYW5nZWAgb2JqZWN0LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIGBudW1iZXJgIHR5cGUgdG8gdGVzdC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGBib29sZWFuYCB0eXBlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gYHZhbHVlYCBpcyBsZXNzIHRoYW4gbWF4aW11bSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgXG4gICAqIG9iamVjdC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgbWF4R3JlYXRlclRoYW4odmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNtYXhpbXVtLmdyZWF0ZXJUaGFuKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYG1heExlc3NUaGFuKClgIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJhbmdlIG9mIGEgc3BlY2lmaWVkIGBSYW5nZWAgb2JqZWN0LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIGBudW1iZXJgIHR5cGUgdG8gdGVzdC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGBib29sZWFuYCB0eXBlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgXG4gICAqIG9iamVjdC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgbWF4TGVzc1RoYW4odmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNtYXhpbXVtLmxlc3NUaGFuKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYG1pbkdyZWF0ZXJUaGFuKClgIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIGEgbWluaW11bSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiBgbnVtYmVyYCB0eXBlIHRvIHRlc3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgdHlwZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG1pbmltdW0gcmFuZ2Ugb2YgYSBzcGVjaWZpZWQgYFJhbmdlYFxuICAgKiBvYmplY3QuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIG1pbkdyZWF0ZXJUaGFuKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jbWluaW11bS5ncmVhdGVyVGhhbih2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGhvZCBgbWluTGVzc1RoYW4oKWAgY2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSByYW5nZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiBgbnVtYmVyYCB0eXBlIHRvIHRlc3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgdHlwZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG1pbmltdW0gcmFuZ2Ugb2YgYSBzcGVjaWZpZWQgYFJhbmdlYFxuICAgKiBvYmplY3QuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIG1pbkxlc3NUaGFuKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jbWluaW11bS5sZXNzVGhhbih2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGhvZCBgc2V0VmFsdWUoKWAgc2V0cyB0aGUgcmFuZ2UgdmFsdWUgYmV0d2VlbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdC4gSWYgdGhlIGdpdmVuIGB2YWx1ZWAgaXMgbm90XG4gICAqIHdpdGhpbiByYW5nZSwgaXQncyBub3Qgc2V0LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIGBudW1iZXJgIHR5cGUgdG8gc2V0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBgUmFuZ2VgIGluc3RhbmNlLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgYHNldFZhbHVlVG9TdGVwKClgIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYFJhbmdlYCBvYmplY3QgdG8gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBgc3RlcGAuIElmIHRoZSBnaXZlbiBgc3RlcGAgaXNcbiAgICogbm90IHdpdGhpbiByYW5nZSB0aGUgdmFsdWUgaXMgbm90IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBzdGVwIFN0ZXAgb2YgYG51bWJlcmAgdHlwZSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSB0aGUgcmFuZ2UgYW5kIHNldCBpdCBhcyB0aGUgcmFuZ2UgY3VycmVudCBgdmFsdWVgLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBgUmFuZ2VgIGluc3RhbmNlLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBzZXRWYWx1ZVRvU3RlcChzdGVwOiBudW1iZXIpOiB0aGlzIHtcbiAgICBzdGVwID4gMCAmJiAodGhpcy52YWx1ZSA9IHRoaXMuZ2V0VmFsdWVPZlN0ZXAoc3RlcCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgc3RlcEJ5U3RlcCgpYCBtZXRob2QgcGVyZm9ybXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBhYmlsaXR5IHRvIGRlY2lkZSB3aGVuIHRvIG1vdmUgdG8gdGhlIG5leHQgc3RlcCBvZiB0aGUgcmFuZ2UuXG4gICAqIEBwYXJhbSBjYWxsYmFja0ZuIEEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIHRocmVlIGFyZ3VtZW50cy4gVGhlIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiBnZW5lcmF0b3IgdGhhdCBhbGxvd3MgZGVjaWRpbmcgd2hlbiB0byBtb3ZlXG4gICAqIHRvIHRoZSBuZXh0IHN0ZXAsIGBzdGVwYCBpcyB0aGUgc3RlcCwgYW5kIGBtYXhgIGlzIHRoZSBtYXhpbXVtIG9mIGEgc3BlY2lmaWVkIGBSYW5nZWAgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBgUmFuZ2VgIGluc3RhbmNlLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBzdGVwQnlTdGVwKFxuICAgIGNhbGxiYWNrRm46ICh2YWx1ZTogR2VuZXJhdG9yPG51bWJlcj4sIHN0ZXA6IFN0ZXAsIG1heDogTWF4KSA9PiB2b2lkXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHQgPSB0aGlzO1xuICAgIGNhbGxiYWNrRm4oXG4gICAgICAoZnVuY3Rpb24qIHN0ZXBCeVN0ZXAoY3VycmVudCA9IHQubWluIC0gdC5zdGVwKTogR2VuZXJhdG9yPG51bWJlcj4ge1xuICAgICAgICB3aGlsZSAoY3VycmVudCA8IHQubWF4KSB7XG4gICAgICAgICAgeWllbGQgKGN1cnJlbnQgKz0gdC5zdGVwKTtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIHQuc3RlcCxcbiAgICAgIHQubWF4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBUaGUgYHRvQXJyYXkoKWAgbWV0aG9kIHJldHVybnMgYSByZWFkLW9ubHkgYXJyYXkgb2YgdGhlIHJhbmdlIGluIG9yZGVyIG1pbmltdW0gYW5kIG1heGltdW0uXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSByZWFkLW9ubHkgYXJyYXkgb2YgdGhlIHJhbmdlIGluIG9yZGVyIG1pbmltdW0gYW5kIG1heGltdW0uXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKTogcmVhZG9ubHkgW01pbiwgTWF4XSB7XG4gICAgcmV0dXJuIFt0aGlzLiNtaW5pbXVtLnZhbHVlT2YoKSwgdGhpcy4jbWF4aW11bS52YWx1ZU9mKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgdmFsdWVEb3duKClgIG1ldGhvZCBkZWNyZW1lbnRzIHRoZSByYW5nZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdCBieSB0aGUgcmFuZ2Ugc3RlcCBvciBnaXZlbiBgc3RlcERlY3JlbWVudGAuXG4gICAqIEBwYXJhbSBzdGVwSW5jcmVtZW50IFRoZSBvcHRpb25hbCBgc3RlcERlY3JlbWVudGAgcGFyYW1ldGVyIG9mIHRoZSBgbnVtYmVyYCB0eXBlIGRlY3JlbWVudHMgdGhlIHJhbmdlIHZhbHVlLiBJZiBubyBwYXJhbWV0ZXIgaXMgcGFzc2VkLFxuICAgKiBgc3RlcERlY3JlbWVudGAgZGVmYXVsdHMgdG8gYDFgLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBgUmFuZ2VgIGluc3RhbmNlLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyB2YWx1ZURvd24oc3RlcERlY3JlbWVudCA9IDEpOiB0aGlzIHtcbiAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgIHN0ZXBEZWNyZW1lbnQgPiAwICYmXG4gICAgICB0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUgLSBzdGVwRGVjcmVtZW50ICogdGhpcy4jc3RlcCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogVGhlIGB2YWx1ZU9mKClgIG1ldGhvZCByZXR1cm5zIGEgcmVhZC1vbmx5IG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBwcmltaXRpdmUgdmFsdWVzIG9mIGBNaW5pbXVtYCBhbmQgYE1heGltdW1gIGluc3RhbmNlcy5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGZyb3plbiBgb2JqZWN0YCBjb25zaXN0aW5nIG9mIHRoZSBwcmltaXRpdmUgdmFsdWVzIG9mIGBNaW5pbXVtYCBhbmQgYE1heGltdW1gIGluc3RhbmNlcy5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgdmFsdWVPZigpOiBSZWFkb25seTx7IG1pbjogTWluOyBtYXg6IE1heCB9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgbWluOiB0aGlzLiNtaW5pbXVtLnZhbHVlT2YoKSxcbiAgICAgIG1heDogdGhpcy4jbWF4aW11bS52YWx1ZU9mKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGB2YWx1ZVVwKClgIG1ldGhvZCBpbmNyZW1lbnRzIHRoZSByYW5nZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBgUmFuZ2VgIG9iamVjdCBieSB0aGUgcmFuZ2Ugc3RlcCBvciBnaXZlbiBgc3RlcEluY3JlbWVudGAuXG4gICAqIEBwYXJhbSBzdGVwSW5jcmVtZW50IFRoZSBvcHRpb25hbCBgc3RlcEluY3JlbWVudGAgcGFyYW1ldGVyIG9mIHRoZSBgbnVtYmVyYCB0eXBlIGluY3JlbWVudHMgdGhlIHJhbmdlIHZhbHVlLiBJZiBubyBwYXJhbWV0ZXIgaXMgcGFzc2VkLFxuICAgKiBgc3RlcEluY3JlbWVudGAgZGVmYXVsdHMgdG8gYDFgLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBgUmFuZ2VgIGluc3RhbmNlLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyB2YWx1ZVVwKHN0ZXBJbmNyZW1lbnQgPSAxKTogdGhpcyB7XG4gICAgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICBzdGVwSW5jcmVtZW50ID4gMCAmJlxuICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlICsgc3RlcEluY3JlbWVudCAqIHRoaXMuI3N0ZXApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vI2VuZHJlZ2lvbiBpbnN0YW5jZSBwdWJsaWMgbWV0aG9kcy5cbn1cbiJdfQ==