UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

169 lines • 28.5 kB
import { sortBy } from 'lodash-es'; import { pipe } from 'rxjs'; import { distinctUntilChanged, expand, filter, map, tap } from 'rxjs/operators'; export class DashboardChildChange { constructor(childToChange) { this.MIN_WIDTH = 2; this.MIN_HEIGHT = 1; this.PIXEL_SIZE_THRESHOLD = 10; this.diffX = 0; this.diffY = 0; this.dashboard = childToChange.dashboard; this.children = childToChange.dashboard.children ? childToChange.dashboard.children.filter(child => childToChange !== child) : []; this.child = childToChange; } get resize$() { return this.child.dragSource.moved.pipe(map(move => this.getPixelSize(move)), tap(resizeDimension => this.setPixelSize(resizeDimension)), map(resizeDimension => this.getDimensionSize(resizeDimension)), distinctUntilChanged((prev, next) => prev.width === next.width && prev.height === next.height), map(dimension => this.setDimension(dimension)), this.arrangePipe()); } get drag$() { return this.child.dragSource.moved.pipe(map(move => this.getDimensionPosition(move)), filter(dimension => dimension.x >= 0 && dimension.x <= this.dashboard.columns - this.child.width && dimension.y >= 0), distinctUntilChanged((prev, next) => prev.x === next.x && prev.y === next.y), this.arrangePipe()); } findFreeDimension() { let y = -1; let x = 0; let found = false; const { width, height } = this.child; if (width > this.dashboard.columns) { throw new Error('The child does not fit on the current dashboard.'); } do { x = 0; y++; while (x + width <= this.dashboard.columns) { if (this.getCollided({ x, y, width, height }).length === 0) { found = true; break; } x++; } } while (!found); return { x, y, width, height }; } collapseUpAll() { return sortBy([this.child, ...this.children], ['y']).forEach(w => { const ds = new DashboardChildChange(w); const newPosition = ds.collapseUp(w); ds.setDimension(newPosition); }); } arrangeAll(arrange) { const { current, scan, spacing, origin } = arrange; const collided = this.getCollided(current, sortBy(scan, ['y'])); return collided.map(child => { const ds = new DashboardChildChange(child); ds.setDimension({ ...child, y: spacing }); return { current: child, scan: scan.filter(w => w !== child), spacing: child.y + child.height, origin }; }); } arrangePipe() { return pipe(map((dimension) => ({ current: dimension, scan: this.children, spacing: dimension.y + dimension.height, origin: { ...dimension } })), expand((dimensions) => this.arrangeAll(dimensions)), map(({ origin }) => origin), map(dimension => this.setDimension(dimension, true)), tap(() => this.collapseUpAll())); } collapseUp(dimension) { let { y } = dimension; while (y > 0) { if (this.getCollided({ ...dimension, y: y - 1 }).length !== 0) { break; } y--; } return { ...dimension, y }; } setDimension(dimension, notIfColliding = false) { if (notIfColliding && this.getCollided(dimension).length > 0) { return; } this.child.x = dimension.x; this.child.y = dimension.y; if (dimension.width >= this.MIN_WIDTH && dimension.x + dimension.width <= this.dashboard.columns) { this.child.width = dimension.width; } else if (dimension.width < this.MIN_WIDTH) { dimension.width = this.MIN_WIDTH; } else { dimension.width = this.dashboard.columns - dimension.x; } if (dimension.height >= this.MIN_HEIGHT) { this.child.height = dimension.height; } else { dimension.height = this.MIN_WIDTH; } return dimension; } setPixelSize({ width, height }) { if (width >= this.dashboard.columnSize * this.MIN_WIDTH - this.dashboard.gap) { this.child.pxWidth = width + this.PIXEL_SIZE_THRESHOLD; } if (height >= this.dashboard.rowSize * this.MIN_HEIGHT - this.dashboard.gap) { this.child.pxHeight = height + this.PIXEL_SIZE_THRESHOLD; } } getPixelSize(moveEvent) { const draggedElement = this.child.element.nativeElement; if (!this.diffX) { const rect = draggedElement.getBoundingClientRect(); this.diffX = rect.left; this.diffY = rect.top; } const { x, y } = moveEvent.pointerPosition; const width = Math.round(x - this.diffX); const height = Math.round(y - this.diffY); return { width, height, pointer: { x, y } }; } getDimensionSize(resizePosition) { const { x, y } = this.child; const ds = this.dashboard.dashboardRect; const column = this.dashboard.columnSize; const row = this.dashboard.rowSize + this.dashboard.gap; const width = Math.round((resizePosition.pointer.x - ds.left + this.dashboard.gap) / column) - x; const height = Math.round((resizePosition.pointer.y - ds.top + this.dashboard.gap) / row) - y; return { x, y, width, height }; } getDimensionPosition(moveEvent) { const draggedElement = moveEvent.source.element.nativeElement.previousElementSibling; if (!this.diffX) { const rect = draggedElement.getBoundingClientRect(); this.diffX = moveEvent.pointerPosition.x - rect.left; this.diffY = moveEvent.pointerPosition.y - rect.top; } const left = moveEvent.pointerPosition.x - this.diffX; const top = moveEvent.pointerPosition.y - this.diffY; const { width, height } = this.child; const ds = this.dashboard.dashboardRect; const column = this.dashboard.columnSize; const row = this.dashboard.rowSize + this.dashboard.gap / 2; const x = Math.round((left - ds.left) / column); const y = Math.round((top - ds.top) / row); return { x, y, width, height }; } doesCollide(a, b) { if (b.x === undefined) { return false; } return !(a.y + a.height - 1 < b.y || a.y > b.y + b.height - 1 || a.x + a.width - 1 < b.x || a.x > b.x + b.width - 1); } getCollided(currentDimension, dimensions = this.children) { const collided = dimensions.filter(dimension => this.doesCollide(currentDimension, dimension)); return collided; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLWNoaWxkLWNoYW5nZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGFzaGJvYXJkL2Rhc2hib2FyZC1jaGlsZC1jaGFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVNoRixNQUFNLE9BQU8sb0JBQW9CO0lBWS9CLFlBQVksYUFBc0M7UUFQakMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUN2QixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ04seUJBQW9CLEdBQUcsRUFBRSxDQUFDO1FBRW5DLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBR2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUTtZQUM5QyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxLQUFLLEtBQUssQ0FBQztZQUMzRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNwQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQzFELEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUM5RCxvQkFBb0IsQ0FDbEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUN6RSxFQUNELEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsRUFDOUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzVDLE1BQU0sQ0FDSixTQUFTLENBQUMsRUFBRSxDQUNWLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNoQixTQUFTLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUN4RCxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDbkIsRUFDRCxvQkFBb0IsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDNUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsR0FBRyxDQUFDO1lBQ0YsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLENBQUMsRUFBRSxDQUFDO1lBQ0osT0FBTyxDQUFDLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzNDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMzRCxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUNiLE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxDQUFDLEVBQUUsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7UUFDakIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBNkIsQ0FBQztJQUM1RCxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9ELE1BQU0sRUFBRSxHQUFHLElBQUksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFrQztRQUMzQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ25ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLE1BQU0sRUFBRSxHQUFHLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO2dCQUNuQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTTtnQkFDL0IsTUFBTTthQUNQLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUNULEdBQUcsQ0FDRCxDQUFDLFNBQWtDLEVBQUUsRUFBRSxDQUNyQyxDQUFDO1lBQ0MsT0FBTyxFQUFFLFNBQVM7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ25CLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNO1lBQ3ZDLE1BQU0sRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFO1NBQ3pCLENBQThCLENBQ2xDLEVBQ0QsTUFBTSxDQUFDLENBQUMsVUFBcUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUM5RSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFDM0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFDcEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVPLFVBQVUsQ0FBQyxTQUFrQztRQUNuRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsTUFBTTtZQUNSLENBQUM7WUFDRCxDQUFDLEVBQUUsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLFlBQVksQ0FBQyxTQUFrQyxFQUFFLGNBQWMsR0FBRyxLQUFLO1FBQzdFLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQ0UsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUztZQUNqQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQ3ZELENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtRQUNwQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzVFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsU0FBc0I7UUFDekMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFtQyxDQUFDO0lBQy9FLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxjQUE2QztRQUNwRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUYsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBNkIsQ0FBQztJQUM1RCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBc0I7UUFDakQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDO1FBQ3JGLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN0RCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN0RCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JELE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDM0MsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBNkIsQ0FBQztJQUM1RCxDQUFDO0lBRU8sV0FBVyxDQUFDLENBQTBCLEVBQUUsQ0FBMEI7UUFDeEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUNOLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyxXQUFXLENBQUMsZ0JBQXlDLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRO1FBQ3ZGLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrRHJhZ01vdmUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IHNvcnRCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZXhwYW5kLCBmaWx0ZXIsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ29tcG9uZW50IH0gZnJvbSAnLi9kYXNoYm9hcmQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIERhc2hib2FyZENoaWxkRGltZW5zaW9uLFxuICBEYXNoYm9hcmRDaGlsZFJlc2l6ZURpbWVuc2lvbixcbiAgRGFzaGJvYXJkQ2hpbGRBcnJhbmdlbWVudFxufSBmcm9tICcuL2Rhc2hib2FyZC5tb2RlbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRDaGlsZENvbXBvbmVudCB9IGZyb20gJy4vZGFzaGJvYXJkLWNoaWxkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDaGlsZENoYW5nZSB7XG4gIGNoaWxkOiBEYXNoYm9hcmRDaGlsZENvbXBvbmVudDtcbiAgY2hpbGRyZW46IERhc2hib2FyZENoaWxkQ29tcG9uZW50W107XG4gIHByaXZhdGUgZGFzaGJvYXJkOiBEYXNoYm9hcmRDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fV0lEVEggPSAyO1xuICBwcml2YXRlIE1JTl9IRUlHSFQgPSAxO1xuICBwcml2YXRlIHJlYWRvbmx5IFBJWEVMX1NJWkVfVEhSRVNIT0xEID0gMTA7XG5cbiAgcHJpdmF0ZSBkaWZmWCA9IDA7XG4gIHByaXZhdGUgZGlmZlkgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGNoaWxkVG9DaGFuZ2U6IERhc2hib2FyZENoaWxkQ29tcG9uZW50KSB7XG4gICAgdGhpcy5kYXNoYm9hcmQgPSBjaGlsZFRvQ2hhbmdlLmRhc2hib2FyZDtcbiAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRUb0NoYW5nZS5kYXNoYm9hcmQuY2hpbGRyZW5cbiAgICAgID8gY2hpbGRUb0NoYW5nZS5kYXNoYm9hcmQuY2hpbGRyZW4uZmlsdGVyKGNoaWxkID0+IGNoaWxkVG9DaGFuZ2UgIT09IGNoaWxkKVxuICAgICAgOiBbXTtcbiAgICB0aGlzLmNoaWxkID0gY2hpbGRUb0NoYW5nZTtcbiAgfVxuXG4gIGdldCByZXNpemUkKCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkLmRyYWdTb3VyY2UubW92ZWQucGlwZShcbiAgICAgIG1hcChtb3ZlID0+IHRoaXMuZ2V0UGl4ZWxTaXplKG1vdmUpKSxcbiAgICAgIHRhcChyZXNpemVEaW1lbnNpb24gPT4gdGhpcy5zZXRQaXhlbFNpemUocmVzaXplRGltZW5zaW9uKSksXG4gICAgICBtYXAocmVzaXplRGltZW5zaW9uID0+IHRoaXMuZ2V0RGltZW5zaW9uU2l6ZShyZXNpemVEaW1lbnNpb24pKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKFxuICAgICAgICAocHJldiwgbmV4dCkgPT4gcHJldi53aWR0aCA9PT0gbmV4dC53aWR0aCAmJiBwcmV2LmhlaWdodCA9PT0gbmV4dC5oZWlnaHRcbiAgICAgICksXG4gICAgICBtYXAoZGltZW5zaW9uID0+IHRoaXMuc2V0RGltZW5zaW9uKGRpbWVuc2lvbikpLFxuICAgICAgdGhpcy5hcnJhbmdlUGlwZSgpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBkcmFnJCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZC5kcmFnU291cmNlLm1vdmVkLnBpcGUoXG4gICAgICBtYXAobW92ZSA9PiB0aGlzLmdldERpbWVuc2lvblBvc2l0aW9uKG1vdmUpKSxcbiAgICAgIGZpbHRlcihcbiAgICAgICAgZGltZW5zaW9uID0+XG4gICAgICAgICAgZGltZW5zaW9uLnggPj0gMCAmJlxuICAgICAgICAgIGRpbWVuc2lvbi54IDw9IHRoaXMuZGFzaGJvYXJkLmNvbHVtbnMgLSB0aGlzLmNoaWxkLndpZHRoICYmXG4gICAgICAgICAgZGltZW5zaW9uLnkgPj0gMFxuICAgICAgKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBuZXh0KSA9PiBwcmV2LnggPT09IG5leHQueCAmJiBwcmV2LnkgPT09IG5leHQueSksXG4gICAgICB0aGlzLmFycmFuZ2VQaXBlKClcbiAgICApO1xuICB9XG5cbiAgZmluZEZyZWVEaW1lbnNpb24oKSB7XG4gICAgbGV0IHkgPSAtMTtcbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLmNoaWxkO1xuICAgIGlmICh3aWR0aCA+IHRoaXMuZGFzaGJvYXJkLmNvbHVtbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNoaWxkIGRvZXMgbm90IGZpdCBvbiB0aGUgY3VycmVudCBkYXNoYm9hcmQuJyk7XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIHggPSAwO1xuICAgICAgeSsrO1xuICAgICAgd2hpbGUgKHggKyB3aWR0aCA8PSB0aGlzLmRhc2hib2FyZC5jb2x1bW5zKSB7XG4gICAgICAgIGlmICh0aGlzLmdldENvbGxpZGVkKHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgeCsrO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKCFmb3VuZCk7XG4gICAgcmV0dXJuIHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9IGFzIERhc2hib2FyZENoaWxkRGltZW5zaW9uO1xuICB9XG5cbiAgY29sbGFwc2VVcEFsbCgpOiB2b2lkIHtcbiAgICByZXR1cm4gc29ydEJ5KFt0aGlzLmNoaWxkLCAuLi50aGlzLmNoaWxkcmVuXSwgWyd5J10pLmZvckVhY2godyA9PiB7XG4gICAgICBjb25zdCBkcyA9IG5ldyBEYXNoYm9hcmRDaGlsZENoYW5nZSh3KTtcbiAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZHMuY29sbGFwc2VVcCh3KTtcbiAgICAgIGRzLnNldERpbWVuc2lvbihuZXdQb3NpdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhcnJhbmdlQWxsKGFycmFuZ2U6IERhc2hib2FyZENoaWxkQXJyYW5nZW1lbnQpIHtcbiAgICBjb25zdCB7IGN1cnJlbnQsIHNjYW4sIHNwYWNpbmcsIG9yaWdpbiB9ID0gYXJyYW5nZTtcbiAgICBjb25zdCBjb2xsaWRlZCA9IHRoaXMuZ2V0Q29sbGlkZWQoY3VycmVudCwgc29ydEJ5KHNjYW4sIFsneSddKSk7XG4gICAgcmV0dXJuIGNvbGxpZGVkLm1hcChjaGlsZCA9PiB7XG4gICAgICBjb25zdCBkcyA9IG5ldyBEYXNoYm9hcmRDaGlsZENoYW5nZShjaGlsZCk7XG4gICAgICBkcy5zZXREaW1lbnNpb24oeyAuLi5jaGlsZCwgeTogc3BhY2luZyB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnQ6IGNoaWxkLFxuICAgICAgICBzY2FuOiBzY2FuLmZpbHRlcih3ID0+IHcgIT09IGNoaWxkKSxcbiAgICAgICAgc3BhY2luZzogY2hpbGQueSArIGNoaWxkLmhlaWdodCxcbiAgICAgICAgb3JpZ2luXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcnJhbmdlUGlwZSgpIHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKGRpbWVuc2lvbjogRGFzaGJvYXJkQ2hpbGREaW1lbnNpb24pID0+XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IGRpbWVuc2lvbixcbiAgICAgICAgICAgIHNjYW46IHRoaXMuY2hpbGRyZW4sXG4gICAgICAgICAgICBzcGFjaW5nOiBkaW1lbnNpb24ueSArIGRpbWVuc2lvbi5oZWlnaHQsXG4gICAgICAgICAgICBvcmlnaW46IHsgLi4uZGltZW5zaW9uIH1cbiAgICAgICAgICB9KSBhcyBEYXNoYm9hcmRDaGlsZEFycmFuZ2VtZW50XG4gICAgICApLFxuICAgICAgZXhwYW5kKChkaW1lbnNpb25zOiBEYXNoYm9hcmRDaGlsZEFycmFuZ2VtZW50KSA9PiB0aGlzLmFycmFuZ2VBbGwoZGltZW5zaW9ucykpLFxuICAgICAgbWFwKCh7IG9yaWdpbiB9KSA9PiBvcmlnaW4pLFxuICAgICAgbWFwKGRpbWVuc2lvbiA9PiB0aGlzLnNldERpbWVuc2lvbihkaW1lbnNpb24sIHRydWUpKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmNvbGxhcHNlVXBBbGwoKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsYXBzZVVwKGRpbWVuc2lvbjogRGFzaGJvYXJkQ2hpbGREaW1lbnNpb24pIHtcbiAgICBsZXQgeyB5IH0gPSBkaW1lbnNpb247XG4gICAgd2hpbGUgKHkgPiAwKSB7XG4gICAgICBpZiAodGhpcy5nZXRDb2xsaWRlZCh7IC4uLmRpbWVuc2lvbiwgeTogeSAtIDEgfSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgeS0tO1xuICAgIH1cbiAgICByZXR1cm4geyAuLi5kaW1lbnNpb24sIHkgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGltZW5zaW9uKGRpbWVuc2lvbjogRGFzaGJvYXJkQ2hpbGREaW1lbnNpb24sIG5vdElmQ29sbGlkaW5nID0gZmFsc2UpIHtcbiAgICBpZiAobm90SWZDb2xsaWRpbmcgJiYgdGhpcy5nZXRDb2xsaWRlZChkaW1lbnNpb24pLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoaWxkLnggPSBkaW1lbnNpb24ueDtcbiAgICB0aGlzLmNoaWxkLnkgPSBkaW1lbnNpb24ueTtcbiAgICBpZiAoXG4gICAgICBkaW1lbnNpb24ud2lkdGggPj0gdGhpcy5NSU5fV0lEVEggJiZcbiAgICAgIGRpbWVuc2lvbi54ICsgZGltZW5zaW9uLndpZHRoIDw9IHRoaXMuZGFzaGJvYXJkLmNvbHVtbnNcbiAgICApIHtcbiAgICAgIHRoaXMuY2hpbGQud2lkdGggPSBkaW1lbnNpb24ud2lkdGg7XG4gICAgfSBlbHNlIGlmIChkaW1lbnNpb24ud2lkdGggPCB0aGlzLk1JTl9XSURUSCkge1xuICAgICAgZGltZW5zaW9uLndpZHRoID0gdGhpcy5NSU5fV0lEVEg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpbWVuc2lvbi53aWR0aCA9IHRoaXMuZGFzaGJvYXJkLmNvbHVtbnMgLSBkaW1lbnNpb24ueDtcbiAgICB9XG4gICAgaWYgKGRpbWVuc2lvbi5oZWlnaHQgPj0gdGhpcy5NSU5fSEVJR0hUKSB7XG4gICAgICB0aGlzLmNoaWxkLmhlaWdodCA9IGRpbWVuc2lvbi5oZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpbWVuc2lvbi5oZWlnaHQgPSB0aGlzLk1JTl9XSURUSDtcbiAgICB9XG4gICAgcmV0dXJuIGRpbWVuc2lvbjtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGl4ZWxTaXplKHsgd2lkdGgsIGhlaWdodCB9KSB7XG4gICAgaWYgKHdpZHRoID49IHRoaXMuZGFzaGJvYXJkLmNvbHVtblNpemUgKiB0aGlzLk1JTl9XSURUSCAtIHRoaXMuZGFzaGJvYXJkLmdhcCkge1xuICAgICAgdGhpcy5jaGlsZC5weFdpZHRoID0gd2lkdGggKyB0aGlzLlBJWEVMX1NJWkVfVEhSRVNIT0xEO1xuICAgIH1cbiAgICBpZiAoaGVpZ2h0ID49IHRoaXMuZGFzaGJvYXJkLnJvd1NpemUgKiB0aGlzLk1JTl9IRUlHSFQgLSB0aGlzLmRhc2hib2FyZC5nYXApIHtcbiAgICAgIHRoaXMuY2hpbGQucHhIZWlnaHQgPSBoZWlnaHQgKyB0aGlzLlBJWEVMX1NJWkVfVEhSRVNIT0xEO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGl4ZWxTaXplKG1vdmVFdmVudDogQ2RrRHJhZ01vdmUpIHtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IHRoaXMuY2hpbGQuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdGhpcy5kaWZmWCkge1xuICAgICAgY29uc3QgcmVjdCA9IGRyYWdnZWRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5kaWZmWCA9IHJlY3QubGVmdDtcbiAgICAgIHRoaXMuZGlmZlkgPSByZWN0LnRvcDtcbiAgICB9XG4gICAgY29uc3QgeyB4LCB5IH0gPSBtb3ZlRXZlbnQucG9pbnRlclBvc2l0aW9uO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5yb3VuZCh4IC0gdGhpcy5kaWZmWCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5yb3VuZCh5IC0gdGhpcy5kaWZmWSk7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgcG9pbnRlcjogeyB4LCB5IH0gfSBhcyBEYXNoYm9hcmRDaGlsZFJlc2l6ZURpbWVuc2lvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGltZW5zaW9uU2l6ZShyZXNpemVQb3NpdGlvbjogRGFzaGJvYXJkQ2hpbGRSZXNpemVEaW1lbnNpb24pIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuY2hpbGQ7XG4gICAgY29uc3QgZHMgPSB0aGlzLmRhc2hib2FyZC5kYXNoYm9hcmRSZWN0O1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZGFzaGJvYXJkLmNvbHVtblNpemU7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXNoYm9hcmQucm93U2l6ZSArIHRoaXMuZGFzaGJvYXJkLmdhcDtcbiAgICBjb25zdCB3aWR0aCA9XG4gICAgICBNYXRoLnJvdW5kKChyZXNpemVQb3NpdGlvbi5wb2ludGVyLnggLSBkcy5sZWZ0ICsgdGhpcy5kYXNoYm9hcmQuZ2FwKSAvIGNvbHVtbikgLSB4O1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgucm91bmQoKHJlc2l6ZVBvc2l0aW9uLnBvaW50ZXIueSAtIGRzLnRvcCArIHRoaXMuZGFzaGJvYXJkLmdhcCkgLyByb3cpIC0geTtcbiAgICByZXR1cm4geyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gYXMgRGFzaGJvYXJkQ2hpbGREaW1lbnNpb247XG4gIH1cblxuICBwcml2YXRlIGdldERpbWVuc2lvblBvc2l0aW9uKG1vdmVFdmVudDogQ2RrRHJhZ01vdmUpIHtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IG1vdmVFdmVudC5zb3VyY2UuZWxlbWVudC5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgaWYgKCF0aGlzLmRpZmZYKSB7XG4gICAgICBjb25zdCByZWN0ID0gZHJhZ2dlZEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmRpZmZYID0gbW92ZUV2ZW50LnBvaW50ZXJQb3NpdGlvbi54IC0gcmVjdC5sZWZ0O1xuICAgICAgdGhpcy5kaWZmWSA9IG1vdmVFdmVudC5wb2ludGVyUG9zaXRpb24ueSAtIHJlY3QudG9wO1xuICAgIH1cblxuICAgIGNvbnN0IGxlZnQgPSBtb3ZlRXZlbnQucG9pbnRlclBvc2l0aW9uLnggLSB0aGlzLmRpZmZYO1xuICAgIGNvbnN0IHRvcCA9IG1vdmVFdmVudC5wb2ludGVyUG9zaXRpb24ueSAtIHRoaXMuZGlmZlk7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLmNoaWxkO1xuICAgIGNvbnN0IGRzID0gdGhpcy5kYXNoYm9hcmQuZGFzaGJvYXJkUmVjdDtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmRhc2hib2FyZC5jb2x1bW5TaXplO1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuZGFzaGJvYXJkLnJvd1NpemUgKyB0aGlzLmRhc2hib2FyZC5nYXAgLyAyO1xuICAgIGNvbnN0IHggPSBNYXRoLnJvdW5kKChsZWZ0IC0gZHMubGVmdCkgLyBjb2x1bW4pO1xuICAgIGNvbnN0IHkgPSBNYXRoLnJvdW5kKCh0b3AgLSBkcy50b3ApIC8gcm93KTtcbiAgICByZXR1cm4geyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gYXMgRGFzaGJvYXJkQ2hpbGREaW1lbnNpb247XG4gIH1cblxuICBwcml2YXRlIGRvZXNDb2xsaWRlKGE6IERhc2hib2FyZENoaWxkRGltZW5zaW9uLCBiOiBEYXNoYm9hcmRDaGlsZERpbWVuc2lvbikge1xuICAgIGlmIChiLnggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIShcbiAgICAgIGEueSArIGEuaGVpZ2h0IC0gMSA8IGIueSB8fFxuICAgICAgYS55ID4gYi55ICsgYi5oZWlnaHQgLSAxIHx8XG4gICAgICBhLnggKyBhLndpZHRoIC0gMSA8IGIueCB8fFxuICAgICAgYS54ID4gYi54ICsgYi53aWR0aCAtIDFcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2xsaWRlZChjdXJyZW50RGltZW5zaW9uOiBEYXNoYm9hcmRDaGlsZERpbWVuc2lvbiwgZGltZW5zaW9ucyA9IHRoaXMuY2hpbGRyZW4pIHtcbiAgICBjb25zdCBjb2xsaWRlZCA9IGRpbWVuc2lvbnMuZmlsdGVyKGRpbWVuc2lvbiA9PiB0aGlzLmRvZXNDb2xsaWRlKGN1cnJlbnREaW1lbnNpb24sIGRpbWVuc2lvbikpO1xuICAgIHJldHVybiBjb2xsaWRlZDtcbiAgfVxufVxuIl19