truly-ui
Version:
Web Components for Desktop Applications.
195 lines (193 loc) • 29.6 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class TlResizerDirective {
constructor(datatabeHeaderRef, render) {
this.datatabeHeaderRef = datatabeHeaderRef;
this.render = render;
this.isMoving = false;
this.pointOfClick = 0;
this.colLeftWidth = 0;
this.colRightWidth = 0;
this.displacement = 0;
this.listenersList = [];
}
ngAfterContentInit() {
if (this.resizer) {
this.getElementColumnSeparator();
this.getElementTableHeader();
this.getElementTableHeaderRow();
this.getColsOfColGroups();
}
}
async getElementTableHeader() {
await this.datatabeHeaderRef;
this.tableHeaderElement = this.datatabeHeaderRef.nativeElement.getElementsByClassName('ui-datatable-table')[0];
}
async getElementTableHeaderRow() {
await this.datatabeHeaderRef;
this.tableHeaderRowElement = this.datatabeHeaderRef.nativeElement.getElementsByClassName('ui-row')[0];
this.listenersList.push(this.render.listen(this.tableHeaderRowElement, 'mouseover', (event) => {
this.onTableHeaderRowMouseOver(event);
}));
}
async getColsOfColGroups() {
await this.datatabeHeaderRef;
this.headerColgroupCols = this.datatabeHeaderRef.nativeElement.parentElement.parentElement.getElementsByTagName('colgroup')[0];
this.bodyColgroupCols = this.datatabeHeaderRef.nativeElement.parentElement.parentElement.getElementsByTagName('colgroup')[1];
}
async getElementColumnSeparator() {
await this.datatabeHeaderRef;
this.columnSeparator = this.datatabeHeaderRef.nativeElement.getElementsByClassName('ui-datatable-column-separator')[0];
this.listenersList.push(this.render.listen(this.columnSeparator, 'mousedown', (event) => {
this.onColumnSeparatorMouseDown(event);
}));
}
onColumnResize(event) {
event.preventDefault();
this.resizeColumns(event);
}
onColumnSeparatorMouseDown(event) {
this.startResize();
this.pointOfClick = event.clientX;
this.getColsBetweenSeparator();
}
onTableHeaderRowMouseOver(event) {
if (event.relatedTarget && (event.relatedTarget.localName !== 'div')) {
const element = event.movementX >= 0 ? event.fromElement : event.target;
this.moveSeparatorAtCursor(element);
}
}
onColumnSeparatorMouseUp() {
this.stopResize();
}
createHandlerEventListeners() {
this.mouseMoveListener = this.render.listen(document, 'mousemove', (event) => {
this.onColumnResize(event);
});
this.mouseupListener = this.render.listen(document, 'mouseup', () => {
this.onColumnSeparatorMouseUp();
});
}
destroyHandleEventListeners() {
if (this.mouseMoveListener || this.mouseupListener) {
this.mouseMoveListener();
this.mouseupListener();
}
}
moveSeparatorAtCursor(element) {
this.columnSeparator.style.left = this.getPositionSeparetorFromElement(element) + 'px';
}
getPositionSeparetorFromElement(element) {
return ((element.offsetWidth + element.offsetLeft) -
(Math.round(this.columnSeparator.offsetWidth / 2)) -
this.getHeaderWrapScrollLeft());
}
getColsBetweenSeparator() {
for (let element = 0; element < this.tableHeaderRowElement.children.length; element++) {
const columnElement = this.tableHeaderRowElement.children[element];
if (this.itIsBetweenSeparator(columnElement)) {
this.columnLeftHeader = this.headerColgroupCols.children[element];
this.columnRightHeader = this.headerColgroupCols.children[element + 1];
this.columnLeftBody = this.bodyColgroupCols.children[element];
this.columnRightBody = this.bodyColgroupCols.children[element + 1];
this.colLeftWidth = parseInt(this.columnLeftHeader.style.width, 10);
this.colRightWidth = parseInt(this.columnRightHeader.style.width, 10);
return;
}
}
}
itIsBetweenSeparator(column) {
return this.getPositionSeparetorFromElement(column) === this.columnSeparator.offsetLeft;
}
resizeColumns(event) {
if (this.isMoving) {
this.setDisplacement(event);
this.isMovingToRight(event) ? this.resizeColumnsToRight() : this.resizeColumnsToLeft();
}
}
resizeColumnsToRight() {
const leftColumn = this.colLeftWidth + this.displacement;
const rightColumn = this.colRightWidth - this.displacement;
this.setNewPositionsColumns(leftColumn, rightColumn);
}
resizeColumnsToLeft() {
const leftColumn = this.colLeftWidth - this.displacement;
const rightColumn = this.colRightWidth + this.displacement;
this.setNewPositionsColumns(leftColumn, rightColumn);
}
setNewPositionsColumns(leftColumn, rightColumn) {
if ((leftColumn > 40) && (rightColumn > 40)) {
this.render.setStyle(this.columnLeftHeader, 'width', leftColumn + 'px');
this.render.setStyle(this.columnRightHeader, 'width', rightColumn + 'px');
this.render.setStyle(this.columnLeftBody, 'width', leftColumn + 'px');
this.render.setStyle(this.columnRightBody, 'width', rightColumn + 'px');
}
}
isMovingToRight(event) {
return this.pointOfClick - event.clientX < 0;
}
setDisplacement(event) {
this.displacement = this.pointOfClick - event.clientX;
this.displacement = this.displacement < 0 ? this.displacement * -1 : this.displacement;
}
getHeaderWrapScrollLeft() {
return this.datatabeHeaderRef.nativeElement.firstElementChild.scrollLeft;
}
startResize() {
this.isMoving = true;
this.createHandlerEventListeners();
this.changeCursorResize();
}
stopResize() {
this.isMoving = false;
this.destroyHandleEventListeners();
this.changeCursorResize();
}
changeCursorResize() {
const cursor = this.isMoving ? 'col-resize' : 'default';
this.render.setStyle(this.datatabeHeaderRef.nativeElement, 'cursor', cursor);
}
clearListerners() {
if (this.listenersList) {
this.listenersList.forEach((value) => {
value();
});
this.listenersList = [];
}
}
ngOnDestroy() {
this.clearListerners();
}
}
/** @nocollapse */ TlResizerDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlResizerDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
/** @nocollapse */ TlResizerDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: TlResizerDirective, selector: "[resizer][datatable]", inputs: { resizer: "resizer", datatable: "datatable" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlResizerDirective, decorators: [{
type: Directive,
args: [{
selector: '[resizer][datatable]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { resizer: [{
type: Input
}], datatable: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9kYXRhdGFibGUvZGlyZWN0aXZlcy9yZXNpemVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvQkU7QUFFRixPQUFPLEVBQW9CLFNBQVMsRUFBYyxLQUFLLEVBQXdCLE1BQU0sZUFBZSxDQUFDOztBQU1yRyxNQUFNLE9BQU8sa0JBQWtCO0lBd0MzQixZQUFxQixpQkFBNkIsRUFBVSxNQUFpQjtRQUF4RCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBeEJyRSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBVWpCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRWpCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRWpCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO0lBTXNELENBQUM7SUFFbEYsa0JBQWtCO1FBQ2QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQjtRQUN2QixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUM3QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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YUFBYSxHQUFHLEVBQUUsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7O21JQWhPUSxrQkFBa0I7dUhBQWxCLGtCQUFrQjs0RkFBbEIsa0JBQWtCO2tCQUg5QixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxzQkFBc0I7aUJBQ25DO3lIQUdZLE9BQU87c0JBQWYsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgICBNSVQgTGljZW5zZVxuXG4gICAgQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICAgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAgICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAgICBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICAgIFNPRlRXQVJFLlxuKi9cblxuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgVGxEYXRhdGFibGUgfSBmcm9tICcuLi9kYXRhdGFibGUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tyZXNpemVyXVtkYXRhdGFibGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBUbFJlc2l6ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgcmVzaXplcjogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpIGRhdGF0YWJsZTogVGxEYXRhdGFibGU7XG5cbiAgICBwcml2YXRlIGNvbHVtblNlcGFyYXRvcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIHRhYmxlSGVhZGVyUm93RWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIHRhYmxlSGVhZGVyRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIGhlYWRlckNvbGdyb3VwQ29scztcblxuICAgIHByaXZhdGUgYm9keUNvbGdyb3VwQ29scztcblxuICAgIHByaXZhdGUgaXNNb3ZpbmcgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcG9pbnRPZkNsaWNrID0gMDtcblxuICAgIHByaXZhdGUgY29sdW1uTGVmdEhlYWRlcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIGNvbHVtblJpZ2h0SGVhZGVyOiBIVE1MRWxlbWVudDtcblxuICAgIHByaXZhdGUgY29sdW1uTGVmdEJvZHk6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBjb2x1bW5SaWdodEJvZHk6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBjb2xMZWZ0V2lkdGggPSAwO1xuXG4gICAgcHJpdmF0ZSBjb2xSaWdodFdpZHRoID0gMDtcblxuICAgIHByaXZhdGUgZGlzcGxhY2VtZW50ID0gMDtcblxuICAgIHByaXZhdGUgbGlzdGVuZXJzTGlzdCA9IFtdO1xuXG4gICAgcHJpdmF0ZSBtb3VzZU1vdmVMaXN0ZW5lcjogKCkgPT4gdm9pZDtcblxuICAgIHByaXZhdGUgbW91c2V1cExpc3RlbmVyOiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoIHByaXZhdGUgZGF0YXRhYmVIZWFkZXJSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyOiBSZW5kZXJlcjIgKSB7fVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5yZXNpemVyKSB7XG4gICAgICAgICAgICB0aGlzLmdldEVsZW1lbnRDb2x1bW5TZXBhcmF0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudFRhYmxlSGVhZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmdldEVsZW1lbnRUYWJsZUhlYWRlclJvdygpO1xuICAgICAgICAgICAgdGhpcy5nZXRDb2xzT2ZDb2xHcm91cHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEVsZW1lbnRUYWJsZUhlYWRlcigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhdGFiZUhlYWRlclJlZjtcbiAgICAgICAgdGhpcy50YWJsZUhlYWRlckVsZW1lbnQgPSB0aGlzLmRhdGF0YWJlSGVhZGVyUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndWktZGF0YXRhYmxlLXRhYmxlJylbMF07XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RWxlbWVudFRhYmxlSGVhZGVyUm93KCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRhdGF0YWJlSGVhZGVyUmVmO1xuICAgICAgICB0aGlzLnRhYmxlSGVhZGVyUm93RWxlbWVudCA9IHRoaXMuZGF0YXRhYmVIZWFkZXJSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd1aS1yb3cnKVswXTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNMaXN0LnB1c2goXG4gICAgICAgICAgICB0aGlzLnJlbmRlci5saXN0ZW4odGhpcy50YWJsZUhlYWRlclJvd0VsZW1lbnQsICdtb3VzZW92ZXInLCAoIGV2ZW50ICkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25UYWJsZUhlYWRlclJvd01vdXNlT3ZlcihldmVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIGdldENvbHNPZkNvbEdyb3VwcygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhdGFiZUhlYWRlclJlZjtcbiAgICAgICAgdGhpcy5oZWFkZXJDb2xncm91cENvbHMgPSB0aGlzLmRhdGF0YWJlSGVhZGVyUmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjb2xncm91cCcpWzBdO1xuICAgICAgICB0aGlzLmJvZHlDb2xncm91cENvbHMgPSB0aGlzLmRhdGF0YWJlSGVhZGVyUmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjb2xncm91cCcpWzFdO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEVsZW1lbnRDb2x1bW5TZXBhcmF0b3IoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YXRhYmVIZWFkZXJSZWY7XG4gICAgICAgIHRoaXMuY29sdW1uU2VwYXJhdG9yID0gdGhpcy5kYXRhdGFiZUhlYWRlclJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3VpLWRhdGF0YWJsZS1jb2x1bW4tc2VwYXJhdG9yJylbMF0gO1xuICAgICAgICB0aGlzLmxpc3RlbmVyc0xpc3QucHVzaChcbiAgICAgICAgICAgIHRoaXMucmVuZGVyLmxpc3Rlbih0aGlzLmNvbHVtblNlcGFyYXRvciwgJ21vdXNlZG93bicsICggZXZlbnQgKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbHVtblNlcGFyYXRvck1vdXNlRG93bihldmVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uQ29sdW1uUmVzaXplKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucmVzaXplQ29sdW1ucyhldmVudCk7XG4gICAgfVxuXG4gICAgb25Db2x1bW5TZXBhcmF0b3JNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5zdGFydFJlc2l6ZSgpO1xuICAgICAgICB0aGlzLnBvaW50T2ZDbGljayA9IGV2ZW50LmNsaWVudFg7XG4gICAgICAgIHRoaXMuZ2V0Q29sc0JldHdlZW5TZXBhcmF0b3IoKTtcbiAgICB9XG5cbiAgICBvblRhYmxlSGVhZGVyUm93TW91c2VPdmVyKGV2ZW50KSB7XG4gICAgICAgIGlmICggZXZlbnQucmVsYXRlZFRhcmdldCAmJiAoIGV2ZW50LnJlbGF0ZWRUYXJnZXQubG9jYWxOYW1lICE9PSAnZGl2JyApICkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50Lm1vdmVtZW50WCA+PSAwID8gZXZlbnQuZnJvbUVsZW1lbnQgOiBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLm1vdmVTZXBhcmF0b3JBdEN1cnNvcihlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ29sdW1uU2VwYXJhdG9yTW91c2VVcCgpIHtcbiAgICAgICAgdGhpcy5zdG9wUmVzaXplKCk7XG4gICAgfVxuXG4gICAgY3JlYXRlSGFuZGxlckV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLm1vdXNlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW5kZXIubGlzdGVuKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgKCBldmVudCApID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Db2x1bW5SZXNpemUoZXZlbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1vdXNldXBMaXN0ZW5lciA9IHRoaXMucmVuZGVyLmxpc3Rlbihkb2N1bWVudCwgJ21vdXNldXAnLCAoICkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNvbHVtblNlcGFyYXRvck1vdXNlVXAoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzdHJveUhhbmRsZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5tb3VzZU1vdmVMaXN0ZW5lciB8fCB0aGlzLm1vdXNldXBMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5tb3VzZU1vdmVMaXN0ZW5lcigpO1xuICAgICAgICAgICAgdGhpcy5tb3VzZXVwTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1vdmVTZXBhcmF0b3JBdEN1cnNvcihlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLmNvbHVtblNlcGFyYXRvci5zdHlsZS5sZWZ0ID0gdGhpcy5nZXRQb3NpdGlvblNlcGFyZXRvckZyb21FbGVtZW50KGVsZW1lbnQpICsgJ3B4JztcbiAgICB9XG5cbiAgICBnZXRQb3NpdGlvblNlcGFyZXRvckZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICggZWxlbWVudC5vZmZzZXRXaWR0aCArIGVsZW1lbnQub2Zmc2V0TGVmdCApIC1cbiAgICAgICAgICAgICggTWF0aC5yb3VuZCggdGhpcy5jb2x1bW5TZXBhcmF0b3Iub2Zmc2V0V2lkdGggLyAyICkgKSAtXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlcldyYXBTY3JvbGxMZWZ0KClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRDb2xzQmV0d2VlblNlcGFyYXRvcigpIHtcbiAgICAgICAgZm9yICggbGV0IGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgdGhpcy50YWJsZUhlYWRlclJvd0VsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBlbGVtZW50KysgKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5FbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMudGFibGVIZWFkZXJSb3dFbGVtZW50LmNoaWxkcmVuWyBlbGVtZW50IF0gYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmICggdGhpcy5pdElzQmV0d2VlblNlcGFyYXRvciggY29sdW1uRWxlbWVudCApICkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uTGVmdEhlYWRlciA9IHRoaXMuaGVhZGVyQ29sZ3JvdXBDb2xzLmNoaWxkcmVuWyBlbGVtZW50IF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5SaWdodEhlYWRlciA9IHRoaXMuaGVhZGVyQ29sZ3JvdXBDb2xzLmNoaWxkcmVuWyBlbGVtZW50ICsgMSBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5MZWZ0Qm9keSA9IHRoaXMuYm9keUNvbGdyb3VwQ29scy5jaGlsZHJlblsgZWxlbWVudCBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uUmlnaHRCb2R5ID0gdGhpcy5ib2R5Q29sZ3JvdXBDb2xzLmNoaWxkcmVuWyBlbGVtZW50ICsgMSBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb2xMZWZ0V2lkdGggPSBwYXJzZUludCggdGhpcy5jb2x1bW5MZWZ0SGVhZGVyLnN0eWxlLndpZHRoLCAxMCApO1xuICAgICAgICAgICAgICAgIHRoaXMuY29sUmlnaHRXaWR0aCA9IHBhcnNlSW50KCB0aGlzLmNvbHVtblJpZ2h0SGVhZGVyLnN0eWxlLndpZHRoLCAxMCApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGl0SXNCZXR3ZWVuU2VwYXJhdG9yKGNvbHVtbjogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9zaXRpb25TZXBhcmV0b3JGcm9tRWxlbWVudChjb2x1bW4pID09PSB0aGlzLmNvbHVtblNlcGFyYXRvci5vZmZzZXRMZWZ0O1xuICAgIH1cblxuICAgIHJlc2l6ZUNvbHVtbnMoZXZlbnQpIHtcbiAgICAgICAgaWYgKCB0aGlzLmlzTW92aW5nICkge1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGFjZW1lbnQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5pc01vdmluZ1RvUmlnaHQoZXZlbnQpID8gdGhpcy5yZXNpemVDb2x1bW5zVG9SaWdodCgpIDogdGhpcy5yZXNpemVDb2x1bW5zVG9MZWZ0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNpemVDb2x1bW5zVG9SaWdodCgpIHtcbiAgICAgICAgY29uc3QgbGVmdENvbHVtbiA9IHRoaXMuY29sTGVmdFdpZHRoICsgdGhpcy5kaXNwbGFjZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJpZ2h0Q29sdW1uID0gIHRoaXMuY29sUmlnaHRXaWR0aCAtIHRoaXMuZGlzcGxhY2VtZW50O1xuICAgICAgICB0aGlzLnNldE5ld1Bvc2l0aW9uc0NvbHVtbnMobGVmdENvbHVtbiwgcmlnaHRDb2x1bW4pO1xuICAgIH1cblxuICAgIHJlc2l6ZUNvbHVtbnNUb0xlZnQoKSB7XG4gICAgICAgIGNvbnN0IGxlZnRDb2x1bW4gPSB0aGlzLmNvbExlZnRXaWR0aCAtIHRoaXMuZGlzcGxhY2VtZW50O1xuICAgICAgICBjb25zdCByaWdodENvbHVtbiA9IHRoaXMuY29sUmlnaHRXaWR0aCArIHRoaXMuZGlzcGxhY2VtZW50O1xuICAgICAgICB0aGlzLnNldE5ld1Bvc2l0aW9uc0NvbHVtbnMobGVmdENvbHVtbiwgcmlnaHRDb2x1bW4pO1xuICAgIH1cblxuICAgIHNldE5ld1Bvc2l0aW9uc0NvbHVtbnMobGVmdENvbHVtbiwgcmlnaHRDb2x1bW4pIHtcbiAgICAgICAgaWYgKCAoIGxlZnRDb2x1bW4gPiA0MCApICYmICggcmlnaHRDb2x1bW4gPiA0MCApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUodGhpcy5jb2x1bW5MZWZ0SGVhZGVyLCAnd2lkdGgnLCBsZWZ0Q29sdW1uICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUodGhpcy5jb2x1bW5SaWdodEhlYWRlciwgJ3dpZHRoJywgcmlnaHRDb2x1bW4gKyAncHgnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZSh0aGlzLmNvbHVtbkxlZnRCb2R5LCAnd2lkdGgnLCBsZWZ0Q29sdW1uICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUodGhpcy5jb2x1bW5SaWdodEJvZHksICd3aWR0aCcsIHJpZ2h0Q29sdW1uICsgJ3B4Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc01vdmluZ1RvUmlnaHQoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9pbnRPZkNsaWNrIC0gZXZlbnQuY2xpZW50WCA8IDA7XG4gICAgfVxuXG4gICAgc2V0RGlzcGxhY2VtZW50KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGxhY2VtZW50ID0gdGhpcy5wb2ludE9mQ2xpY2sgLSBldmVudC5jbGllbnRYO1xuICAgICAgICB0aGlzLmRpc3BsYWNlbWVudCA9IHRoaXMuZGlzcGxhY2VtZW50IDwgMCA/IHRoaXMuZGlzcGxhY2VtZW50ICogLTEgOiB0aGlzLmRpc3BsYWNlbWVudDtcbiAgICB9XG5cbiAgICBnZXRIZWFkZXJXcmFwU2Nyb2xsTGVmdCgpIHtcbiAgICAgICByZXR1cm4gdGhpcy5kYXRhdGFiZUhlYWRlclJlZi5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLnNjcm9sbExlZnQ7XG4gICAgfVxuXG4gICAgc3RhcnRSZXNpemUoKSB7XG4gICAgICAgIHRoaXMuaXNNb3ZpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmNyZWF0ZUhhbmRsZXJFdmVudExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmNoYW5nZUN1cnNvclJlc2l6ZSgpO1xuICAgIH1cblxuICAgIHN0b3BSZXNpemUoKSB7XG4gICAgICAgIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZXN0cm95SGFuZGxlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3JSZXNpemUoKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VDdXJzb3JSZXNpemUoKSB7XG4gICAgICAgIGNvbnN0IGN1cnNvciA9IHRoaXMuaXNNb3ZpbmcgPyAnY29sLXJlc2l6ZScgOiAnZGVmYXVsdCc7XG4gICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuZGF0YXRhYmVIZWFkZXJSZWYubmF0aXZlRWxlbWVudCwgJ2N1cnNvcicsIGN1cnNvcik7XG4gICAgfVxuXG4gICAgY2xlYXJMaXN0ZXJuZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNMaXN0KSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc0xpc3QuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc0xpc3QgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFyTGlzdGVybmVycygpO1xuICAgIH1cblxufVxuIl19