UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

501 lines 67.3 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Input, Output, ViewChild, Renderer2, ChangeDetectorRef, EventEmitter, ElementRef } from '@angular/core'; import { Utils, Keys, CloseEvent } from '@true-directive/base'; var PopupComponent = /** @class */ (function () { function PopupComponent(elementRef, changeDetector, _renderer) { this.elementRef = elementRef; this.changeDetector = changeDetector; this._renderer = _renderer; this.transform0 = 'translateX(15px)'; this.transform1 = 'translateX(0)'; this.modalTransform0 = 'translateY(-20px)'; this.modalTransform1 = 'translateY(0)'; this.modalTransform2 = 'translateY(20px)'; this.snackTransform0 = 'scale(0.85)'; this.snackTransform1 = 'scale(1.0)'; this.snackTransform2 = 'scale(1.5)'; // Number of pixels for shifting the popup to right when position is [left]. this.shiftDx = 6; this.close = new EventEmitter(); this.closed = new EventEmitter(); this.show = new EventEmitter(); this.position = 'RELATIVE'; this.keepOnTargetClick = true; this._x = -1; this._y = -1; this._visible = false; this._stillVisible = false; this._animating = false; this._overlay = null; } PopupComponent_1 = PopupComponent; PopupComponent.prototype.getZ = function () { return this.zIndex; }; /** * Focus trap * Looking for the next element to switch focus. * @param element Элемент, относительно которого нужно найти следующий * @param backward Поиск назад (Shift+Tab) * @param parent Родительский, в котором сейчас ищем * @param found Заданный элемент найден. Берем следующий подходящий * @return Элемент, на который следует перевести фокус */ PopupComponent.prototype.getNextElement = function (element, backward, parent, found) { if (backward === void 0) { backward = false; } if (parent === void 0) { parent = null; } if (found === void 0) { found = false; } if (element === null) { // Элемент, не задан, ищем первый попавшийся found = true; } if (parent === null) { // Родительский элемент не задан, ищем в хосте parent = this.popup.nativeElement; } for (var i = 0; i < parent.children.length; i++) { var el = backward ? parent.children[parent.children.length - i - 1] : parent.children[i]; if (el.hidden || el.disabled) { continue; } if (el === element) { found = true; continue; } if (el.offsetParent === null) { continue; } if (found && el.tabIndex !== -1 && (el.nodeName === 'INPUT' || el.nodeName === 'BUTTON' || el.nodeName === 'SELECT' || el.nodeName === 'TEXTAREA' || el.tabIndex > 0)) { return { found: found, element: el }; } var res = this.getNextElement(element, backward, el, found); found = res.found; if (res.element) { return res; } } return { found: found, element: null }; }; PopupComponent.prototype.popupMouseDown = function (e) { if (this.zIndex >= PopupComponent_1.z) { e.stopPropagation(); } }; PopupComponent.prototype.popupTouchStart = function (e) { e.stopPropagation(); }; PopupComponent.prototype.popupKeyDown = function (e) { if (e.keyCode === Keys.ESCAPE) { this.closePopup(); e.preventDefault(); e.stopPropagation(); } if (e.keyCode === Keys.TAB) { // Ищем элемент, на который мы можем отправить фокус после target var res = this.getNextElement(e.target, e.shiftKey); // Не найдено после заданного? Ищем первый if (res.element === null) { res = this.getNextElement(null, e.shiftKey); } if (res.element) { res.element.focus(); } e.preventDefault(); e.stopPropagation(); } }; PopupComponent.prototype.addDocumentListeners = function () { if (!this.documentContextMenuBound) { this.documentContextMenuBound = this.documentContextMenu.bind(this); } if (!this.documentMouseDownBound) { this.documentMouseDownBound = this.documentMouseDown.bind(this); } if (!this.documentTouchStartBound) { this.documentTouchStartBound = this.documentTouchStart.bind(this); } if (!this.documentScrollBound) { this.documentScrollBound = this.documentScroll.bind(this); } if (!this.documentResizeBound) { this.documentResizeBound = this.documentResize.bind(this); } document.addEventListener('contextmenu', this.documentContextMenuBound, false); document.addEventListener('mousedown', this.documentMouseDownBound, false); document.addEventListener('touchstart', this.documentTouchStartBound, false); window.addEventListener('scroll', this.documentScrollBound, false); window.addEventListener('resize', this.documentResizeBound, false); }; PopupComponent.prototype.removeDocumentListeners = function () { document.removeEventListener('contextmenu', this.documentContextMenuBound, false); document.removeEventListener('mousedown', this.documentMouseDownBound, false); document.removeEventListener('touchstart', this.documentTouchStartBound, false); window.removeEventListener('scroll', this.documentScrollBound, false); window.removeEventListener('resize', this.documentResizeBound, false); }; PopupComponent.prototype.maxZIndex = function (element) { var z = 0; var parent = element.parentNode; while (parent && parent.style) { if (!isNaN(parent.style.zIndex) && parent.style.zIndex > z) { z = parent.style.zIndex; } parent = parent.parentNode; } return +z; }; PopupComponent.prototype.documentScroll = function (e) { this.updatePosition(); }; PopupComponent.prototype.documentResize = function (e) { this.updatePosition(); }; PopupComponent.prototype.checkClose = function (target) { var l = target; if (this._target === l && this.keepOnTargetClick) { return false; } if (this._target && Utils.isAncestor(this._target, l) && this.keepOnTargetClick) { return false; } if (Utils.isAncestor(this.popup.nativeElement, l)) { return false; } else { if (this.zIndex < this.maxZIndex(l)) { // Мы кликнули на более высокий уровень return false; } } if (PopupComponent_1.freeze > 0) { PopupComponent_1.freeze--; return false; } this.closePopup(); return true; }; PopupComponent.prototype.documentTouchStart = function (e) { this.checkClose(e.target); }; PopupComponent.prototype.documentMouseDown = function (e) { this.checkClose(e.target); }; PopupComponent.prototype.documentContextMenu = function (e) { this.checkClose(e.target); }; Object.defineProperty(PopupComponent.prototype, "visible", { get: function () { return this._visible; }, enumerable: true, configurable: true }); PopupComponent.prototype.makeOverlay = function () { var _this = this; PopupComponent_1.z++; var zIndex = PopupComponent_1.z; this._overlay = this._renderer.createElement('div'); this._renderer.setStyle(this._overlay, 'z-index', zIndex); this._renderer.addClass(this._overlay, 'true-modal-overlay'); this._renderer.appendChild(document.body, this._overlay); this._renderer.listen(this._overlay, 'touchstart', function (e) { _this.closePopup(); e.stopPropagation(); e.preventDefault(); }); this._renderer.listen(this._overlay, 'mousedown', function (e) { _this.closePopup(); e.stopPropagation(); e.preventDefault(); }); setTimeout(function () { _this._renderer.setStyle(_this._overlay, 'opacity', '1.0'); }, 50); return this._overlay; }; PopupComponent.prototype.removeOverlay = function () { if (this._overlay) { document.body.removeChild(this._overlay); PopupComponent_1.z--; } this._overlay = null; }; PopupComponent.prototype.resetPosition = function () { this.popup.nativeElement.style.transform = 'scale(1.0)'; this.popup.nativeElement.style.top = '0px'; this.popup.nativeElement.style.left = '0px'; }; PopupComponent.prototype.updatePosition = function () { if (this._x !== -1 || this._y !== -1) { if (PopupComponent_1.renderToBody) { this.popup.nativeElement.style.position = 'fixed'; } this.popup.nativeElement.style.left = this._x + 'px'; this.popup.nativeElement.style.top = this._y + 'px'; return; } if (this.position === 'ABSOLUTE') { this.popup.nativeElement.style.position = 'absolute'; this.popup.nativeElement.style.top = 'unset'; this.popup.nativeElement.style.left = 'unset'; return; } var popupRect = this.popup.nativeElement.getBoundingClientRect(); if (this.position === 'MODAL' || this.position === 'SNACK') { var ww = document.body.clientWidth; var width = popupRect.width; var modalX = (ww - width) / 2; if (modalX <= 10) { modalX = 10; width = ww - 20; } this.popup.nativeElement.style.left = modalX + 'px'; this.popup.nativeElement.style.top = '35px'; return; } var targetRect = this._target.getBoundingClientRect(); var xx = targetRect.left; var yy = targetRect.bottom; if (this._direction.toLowerCase() === 'left') { xx = targetRect.right - popupRect.width + this.shiftDx; } if (this._direction.toLowerCase() === 'right') { xx = targetRect.right; yy = targetRect.top - this.shiftDx; } if (yy + popupRect.height > window.innerHeight && this._direction !== 'right') { yy = targetRect.top - popupRect.height; } if (yy + popupRect.height > window.innerHeight && this._direction === 'right') { yy = targetRect.bottom - popupRect.height + 4; } if (this._direction === 'AboveLeft') { xx = targetRect.right - popupRect.width + 6; yy = targetRect.top - popupRect.height; } if (this._direction === 'AboveRight') { xx = targetRect.left - 6; yy = targetRect.top - popupRect.height; } if (xx + popupRect.width > window.innerWidth) { xx = window.innerWidth - popupRect.width - 4; } else { xx = xx < 0 ? 4 : xx; } yy = yy < 0 ? 4 : yy; this.popup.nativeElement.style.position = 'fixed'; this.popup.nativeElement.style.left = xx + 'px'; this.popup.nativeElement.style.top = yy + 'px'; }; PopupComponent.prototype.resetAnimation = function () { var t0 = this.transform0; if (this.position === 'MODAL') { t0 = this.modalTransform0; } if (this.position === 'SNACK') { t0 = this.snackTransform0; } this.popup.nativeElement.style.opacity = '0'; this.popup.nativeElement.style.transform = t0; }; PopupComponent.prototype.startAnimation = function () { var t1 = this.transform1; if (this.position === 'MODAL') { t1 = this.modalTransform1; } if (this.position === 'SNACK') { t1 = this.snackTransform1; } this.popup.nativeElement.style.opacity = '1.0'; this.popup.nativeElement.style.transform = t1; }; PopupComponent.prototype.display = function () { var _this = this; if (this._visible) { // To prevent the Z-index from being updated during false closures. return; } this._visible = true; this.popup.nativeElement.style.display = 'none'; this.resetAnimation(); this.resetPosition(); setTimeout(function () { if (_this.position === 'MODAL' || _this.position === 'SNACK') { _this.popup.nativeElement.style.position = 'fixed'; _this.popup.nativeElement.style.display = 'block'; if (_this.position === 'MODAL') { _this.makeOverlay(); _this._overlay.appendChild(_this.popup.nativeElement); _this.resetAnimation(); } else { _this._renderer.removeChild(_this.elementRef.nativeElement, _this.popup.nativeElement); _this.changeDetector.detectChanges(); document.body.appendChild(_this.popup.nativeElement); _this.resetAnimation(); } _this.updatePosition(); } else { _this.popup.nativeElement.style.display = 'block'; _this.updatePosition(); if (_this.position === 'RELATIVE' && PopupComponent_1.renderToBody) { _this.popup.nativeElement.style.opacity = '0'; _this._renderer.removeChild(_this.elementRef.nativeElement, _this.popup.nativeElement); _this.changeDetector.detectChanges(); document.body.appendChild(_this.popup.nativeElement); } } PopupComponent_1.z++; _this.zIndex = PopupComponent_1.z; _this.popup.nativeElement.style.zIndex = _this.zIndex; _this.resetAnimation(); setTimeout(function () { _this.startAnimation(); if (_this.position === 'SNACK') { _this.closeSnack(); } }, 50); _this.addDocumentListeners(); _this.show.emit(); }); }; PopupComponent.prototype.closeSnack = function () { var _this = this; this._stillVisible = true; setTimeout(function () { if (_this._stillVisible) { _this.popup.nativeElement.style.opacity = '0'; _this.popup.nativeElement.style.transform = _this.snackTransform2; setTimeout(function () { _this.closePopup(); }, 300); } }, 1000); }; PopupComponent.prototype.showByXY = function (x, y) { this._x = x; this._y = y; this.display(); }; PopupComponent.prototype.showByTarget = function (target, direction) { if (target === void 0) { target = null; } if (direction === void 0) { direction = ''; } this._target = target; this._direction = direction; this.display(); }; PopupComponent.prototype.showPopup = function () { if (this._visible) { this.closePopup(); } this.showByTarget(); }; PopupComponent.prototype.closePopup = function (result, confirmed) { if (result === void 0) { result = null; } if (confirmed === void 0) { confirmed = false; } if (!this._visible) { return; // Чтобы Z-индекс не обновлялся при ложных закрытиях } this._visible = false; this._stillVisible = false; // можно отменить закрытие var event = new CloseEvent(result); event.confirmed = confirmed; this.close.emit(event); if (event.isCanceled) { return; } PopupComponent_1.z--; if (PopupComponent_1.z <= 9) { PopupComponent_1.z = 9; } if (this.position === 'MODAL') { this._overlay.removeChild(this.popup.nativeElement); this.removeOverlay(); this.elementRef.nativeElement.appendChild(this.popup.nativeElement); } if (this.position === 'SNACK') { document.body.removeChild(this.popup.nativeElement); this.elementRef.nativeElement.appendChild(this.popup.nativeElement); } this._target = null; this._x = -1; this._y = -1; this.popup.nativeElement.style.display = 'none'; this.resetAnimation(); if (this.position === 'RELATIVE' && PopupComponent_1.renderToBody) { this._renderer.removeChild(document.body, this.popup.nativeElement); this.changeDetector.detectChanges(); this.elementRef.nativeElement.appendChild(this.popup.nativeElement); } else { this.changeDetector.detectChanges(); } this.removeDocumentListeners(); this.closed.emit(result); }; PopupComponent.prototype.toggle = function (target, direction) { if (this._visible) { this.closePopup(); } else { this.showByTarget(target, direction); } }; var PopupComponent_1; // Popup will not be closed if value of this property more than 0 PopupComponent.freeze = 0; PopupComponent.z = 19; PopupComponent.renderToBody = true; tslib_1.__decorate([ ViewChild('popup', { static: true }), tslib_1.__metadata("design:type", Object) ], PopupComponent.prototype, "popup", void 0); tslib_1.__decorate([ Output('close'), tslib_1.__metadata("design:type", EventEmitter) ], PopupComponent.prototype, "close", void 0); tslib_1.__decorate([ Output('closed'), tslib_1.__metadata("design:type", EventEmitter) ], PopupComponent.prototype, "closed", void 0); tslib_1.__decorate([ Output('show'), tslib_1.__metadata("design:type", EventEmitter) ], PopupComponent.prototype, "show", void 0); tslib_1.__decorate([ Input('position'), tslib_1.__metadata("design:type", String) ], PopupComponent.prototype, "position", void 0); tslib_1.__decorate([ Input('keepOnTargetClick'), tslib_1.__metadata("design:type", Object) ], PopupComponent.prototype, "keepOnTargetClick", void 0); PopupComponent = PopupComponent_1 = tslib_1.__decorate([ Component({ selector: 'true-popup', template: "\n <div [style.zIndex]=\"getZ()\" class=\"true-popup\"\n [class.true-snack]=\"position==='SNACK'\"\n (mousedown)=\"popupMouseDown($event)\"\n (touchstart)=\"popupTouchStart($event)\"\n (keydown)=\"popupKeyDown($event)\" #popup>\n <ng-content #content></ng-content>\n </div>", host: { '(touchend)': '$event.stopPropagation()' }, styles: ["\n :host > div {\n position: fixed;\n display: none;\n opacity: 0.0;\n }\n\n .true-modal-overlay {\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n opacity: 0.0;\n overflow-y: auto;\n }\n "] }), tslib_1.__metadata("design:paramtypes", [ElementRef, ChangeDetectorRef, Renderer2]) ], PopupComponent); return PopupComponent; }()); export { PopupComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvY29udHJvbHMvcG9wdXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztFQUlFO0FBQ0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBZ0IsU0FBUyxFQUM1RCxpQkFBaUIsRUFDakIsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBaUIsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFrQzlFO0lBd2lCRSx3QkFDUyxVQUFzQixFQUNuQixjQUFpQyxFQUNuQyxTQUFvQjtRQUZyQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ25CLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNuQyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBemlCYixlQUFVLEdBQUcsa0JBQWtCLENBQUM7UUFDaEMsZUFBVSxHQUFHLGVBQWUsQ0FBQztRQUU3QixvQkFBZSxHQUFHLG1CQUFtQixDQUFDO1FBQ3RDLG9CQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ2xDLG9CQUFlLEdBQUcsa0JBQWtCLENBQUM7UUFFckMsb0JBQWUsR0FBRyxhQUFhLENBQUM7UUFDaEMsb0JBQWUsR0FBRyxZQUFZLENBQUM7UUFDL0Isb0JBQWUsR0FBRyxZQUFZLENBQUM7UUFFaEQsNEVBQTRFO1FBQ2xFLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFZdEIsVUFBSyxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBR2pFLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUdwRCxTQUFJLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHbEQsYUFBUSxHQUFnRCxVQUFVLENBQUM7UUFHbkUsc0JBQWlCLEdBQUcsSUFBSSxDQUFD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IDIwMTgtMjAxOSBBbGVrc2V5IE1lbG5pa292LCBUcnVlIERpcmVjdGl2ZSBDb21wYW55LlxyXG4gKiBAbGluayBodHRwczovL3RydWVkaXJlY3RpdmUuY29tL1xyXG4gKiBAbGljZW5zZSBNSVRcclxuKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIENvbnRlbnRDaGlsZCwgUmVuZGVyZXIyLFxyXG4gICAgICAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBVdGlscywgS2V5cywgUG9wdXBQb3NpdGlvbiwgQ2xvc2VFdmVudCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJ1ZS1wb3B1cCcsXHJcbiAgdGVtcGxhdGU6ICBgXHJcbiAgICA8ZGl2IFtzdHlsZS56SW5kZXhdPVwiZ2V0WigpXCIgY2xhc3M9XCJ0cnVlLXBvcHVwXCJcclxuICAgICAgW2NsYXNzLnRydWUtc25hY2tdPVwicG9zaXRpb249PT0nU05BQ0snXCJcclxuICAgICAgKG1vdXNlZG93bik9XCJwb3B1cE1vdXNlRG93bigkZXZlbnQpXCJcclxuICAgICAgKHRvdWNoc3RhcnQpPVwicG9wdXBUb3VjaFN0YXJ0KCRldmVudClcIlxyXG4gICAgICAoa2V5ZG93bik9XCJwb3B1cEtleURvd24oJGV2ZW50KVwiICNwb3B1cD5cclxuICAgICAgPG5nLWNvbnRlbnQgI2NvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9kaXY+YCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgIDpob3N0ID4gZGl2IHtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgICBvcGFjaXR5OiAwLjA7XHJcbiAgICB9XHJcblxyXG4gICAgLnRydWUtbW9kYWwtb3ZlcmxheSB7XHJcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgbGVmdDogMDtcclxuICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgYm90dG9tOiAwO1xyXG4gICAgICBvcGFjaXR5OiAwLjA7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICB9XHJcbiAgICBgXSxcclxuICAgIGhvc3Q6IHtcclxuICAgICAgJyh0b3VjaGVuZCknOiAnJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpJ1xyXG4gICAgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUG9wdXBDb21wb25lbnQge1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zZm9ybTAgPSAndHJhbnNsYXRlWCgxNXB4KSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2Zvcm0xID0gJ3RyYW5zbGF0ZVgoMCknO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsVHJhbnNmb3JtMCA9ICd0cmFuc2xhdGVZKC0yMHB4KSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RhbFRyYW5zZm9ybTEgPSAndHJhbnNsYXRlWSgwKSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RhbFRyYW5zZm9ybTIgPSAndHJhbnNsYXRlWSgyMHB4KSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc25hY2tUcmFuc2Zvcm0wID0gJ3NjYWxlKDAuODUpJztcclxuICBwcml2YXRlIHJlYWRvbmx5IHNuYWNrVHJhbnNmb3JtMSA9ICdzY2FsZSgxLjApJztcclxuICBwcml2YXRlIHJlYWRvbmx5IHNuYWNrVHJhbnNmb3JtMiA9ICdzY2FsZSgxLjUpJztcclxuXHJcbiAgLy8gTnVtYmVyIG9mIHBpeGVscyBmb3Igc2hpZnRpbmcgdGhlIHBvcHVwIHRvIHJpZ2h0IHdoZW4gcG9zaXRpb24gaXMgW2xlZnRdLlxyXG4gIHByb3RlY3RlZCBzaGlmdER4ID0gNjtcclxuXHJcbiAgLy8gUG9wdXAgd2lsbCBub3QgYmUgY2xvc2VkIGlmIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgbW9yZSB0aGFuIDBcclxuICBwdWJsaWMgc3RhdGljIGZyZWV6ZSA9IDA7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgejogbnVtYmVyID0gMTk7XHJcbiAgcHVibGljIHN0YXRpYyByZW5kZXJUb0JvZHkgPSB0cnVlO1xyXG5cclxuICBAVmlld0NoaWxkKCdwb3B1cCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHBvcHVwOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoJ2Nsb3NlJylcclxuICBjbG9zZTogRXZlbnRFbWl0dGVyPENsb3NlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDbG9zZUV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KCdjbG9zZWQnKVxyXG4gIGNsb3NlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgnc2hvdycpXHJcbiAgc2hvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQElucHV0KCdwb3NpdGlvbicpXHJcbiAgcG9zaXRpb246ICdSRUxBVElWRScgfCAnQUJTT0xVVEUnIHwgJ01PREFMJyB8ICdTTkFDSycgPSAnUkVMQVRJVkUnO1xyXG5cclxuICBASW5wdXQoJ2tlZXBPblRhcmdldENsaWNrJylcclxuICBrZWVwT25UYXJnZXRDbGljayA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgX3ggPSAtMTtcclxuICBwcml2YXRlIF95ID0gLTE7XHJcbiAgcHJpdmF0ZSBfZGlyZWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfdmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3N0aWxsVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2FuaW1hdGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX292ZXJsYXk6IEhUTUxFbGVtZW50ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBkb2N1bWVudENvbnRleHRNZW51Qm91bmQ6IGFueTtcclxuICBwcml2YXRlIGRvY3VtZW50TW91c2VEb3duQm91bmQ6IGFueTtcclxuICBwcml2YXRlIGRvY3VtZW50VG91Y2hTdGFydEJvdW5kOiBhbnk7XHJcbiAgcHJpdmF0ZSBkb2N1bWVudFNjcm9sbEJvdW5kOiBhbnk7XHJcbiAgcHJpdmF0ZSBkb2N1bWVudFJlc2l6ZUJvdW5kOiBhbnk7XHJcblxyXG4gIHByb3RlY3RlZCBfdGFyZ2V0OiBhbnk7XHJcbiAgcHJvdGVjdGVkIHpJbmRleDogbnVtYmVyO1xyXG5cclxuICBnZXRaKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuekluZGV4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9jdXMgdHJhcFxyXG4gICAqIExvb2tpbmcgZm9yIHRoZSBuZXh0IGVsZW1lbnQgdG8gc3dpdGNoIGZvY3VzLlxyXG4gICAqIEBwYXJhbSAgZWxlbWVudCAg0K3Qu9C10LzQtdC90YIsINC+0YLQvdC+0YHQuNGC0LXQu9GM0L3QviDQutC+0YLQvtGA0L7Qs9C+INC90YPQttC90L4g0L3QsNC50YLQuCDRgdC70LXQtNGD0Y7RidC40LlcclxuICAgKiBAcGFyYW0gIGJhY2t3YXJkINCf0L7QuNGB0Log0L3QsNC30LDQtCAoU2hpZnQrVGFiKVxyXG4gICAqIEBwYXJhbSAgcGFyZW50ICAg0KDQvtC00LjRgtC10LvRjNGB0LrQuNC5LCDQsiDQutC+0YLQvtGA0L7QvCDRgdC10LnRh9Cw0YEg0LjRidC10LxcclxuICAgKiBAcGFyYW0gIGZvdW5kICAgINCX0LDQtNCw0L3QvdGL0Lkg0Y3Qu9C10LzQtdC90YIg0L3QsNC50LTQtdC9LiDQkdC10YDQtdC8INGB0LvQtdC00YPRjtGJ0LjQuSDQv9C+0LTRhdC+0LTRj9GJ0LjQuVxyXG4gICAqIEByZXR1cm4gICAgICAgICAg0K3Qu9C10LzQtdC90YIsINC90LAg0LrQvtGC0L7RgNGL0Lkg0YHQu9C10LTRg9C10YIg0L/QtdGA0LXQstC10YHRgtC4INGE0L7QutGD0YFcclxuICAgKi9cclxuICBwcml2YXRlIGdldE5leHRFbGVtZW50KFxyXG4gICAgICBlbGVtZW50OiBhbnksXHJcbiAgICAgIGJhY2t3YXJkOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgIHBhcmVudDogYW55ID0gbnVsbCxcclxuICAgICAgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgKTogYW55IHtcclxuXHJcbiAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkge1xyXG4gICAgICAvLyDQrdC70LXQvNC10L3Rgiwg0L3QtSDQt9Cw0LTQsNC9LCDQuNGJ0LXQvCDQv9C10YDQstGL0Lkg0L/QvtC/0LDQstGI0LjQudGB0Y9cclxuICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgLy8g0KDQvtC00LjRgtC10LvRjNGB0LrQuNC5INGN0LvQtdC80LXQvdGCINC90LUg0LfQsNC00LDQvSwg0LjRidC10Lwg0LIg0YXQvtGB0YLQtVxyXG4gICAgICBwYXJlbnQgPSAgdGhpcy5wb3B1cC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsID0gYmFja3dhcmQgPyBwYXJlbnQuY2hpbGRyZW5bcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIGkgLSAxXSA6IHBhcmVudC5jaGlsZHJlbltpXTtcclxuXHJcbiAgICAgIGlmIChlbC5oaWRkZW4gfHwgZWwuZGlzYWJsZWQpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGVsID09PSBlbGVtZW50KSB7XHJcbiAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZWwub2Zmc2V0UGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmb3VuZCAmJiBlbC50YWJJbmRleCAhPT0gLTEgICYmIChcclxuICAgICAgICAgICAgICAgZWwubm9kZU5hbWUgPT09ICdJTlBVVCdcclxuICAgICAgICAgICAgfHwgZWwubm9kZU5hbWUgPT09ICdCVVRUT04nXHJcbiAgICAgICAgICAgIHx8IGVsLm5vZGVOYW1lID09PSAnU0VMRUNUJ1xyXG4gICAgICAgICAgICB8fCBlbC5ub2RlTmFtZSA9PT0gJ1RFWFRBUkVBJ1xyXG4gICAgICAgICAgICB8fCBlbC50YWJJbmRleCA+IDBcclxuICAgICAgICApKSAge1xyXG4gICAgICAgIHJldHVybiB7IGZvdW5kOiBmb3VuZCwgZWxlbWVudDogZWwgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmVzID0gdGhpcy5nZXROZXh0RWxlbWVudChlbGVtZW50LCBiYWNrd2FyZCwgZWwsIGZvdW5kKTtcclxuICAgICAgZm91bmQgPSByZXMuZm91bmQ7XHJcbiAgICAgIGlmIChyZXMuZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBmb3VuZDogZm91bmQsIGVsZW1lbnQ6IG51bGwgfTtcclxuICB9XHJcblxyXG4gIHBvcHVwTW91c2VEb3duKGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuekluZGV4ID49IFBvcHVwQ29tcG9uZW50LnopIHtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBvcHVwVG91Y2hTdGFydChlOiBhbnkpIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwb3B1cEtleURvd24oZTogYW55KSB7XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5UQUIpIHtcclxuICAgICAgLy8g0JjRidC10Lwg0Y3Qu9C10LzQtdC90YIsINC90LAg0LrQvtGC0L7RgNGL0Lkg0LzRiyDQvNC+0LbQtdC8INC+0YLQv9GA0LDQstC40YLRjCDRhNC+0LrRg9GBINC/0L7RgdC70LUgdGFyZ2V0XHJcbiAgICAgIGxldCByZXMgPSB0aGlzLmdldE5leHRFbGVtZW50KGUudGFyZ2V0LCBlLnNoaWZ0S2V5KTtcclxuICAgICAgLy8g0J3QtSDQvdCw0