UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

508 lines (507 loc) 65 kB
import * as tslib_1 from "tslib"; var PopupComponent_1; /** * 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'; let PopupComponent = PopupComponent_1 = class PopupComponent { constructor(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; } getZ() { return this.zIndex; } /** * Focus trap * Looking for the next element to switch focus. * @param element Элемент, относительно которого нужно найти следующий * @param backward Поиск назад (Shift+Tab) * @param parent Родительский, в котором сейчас ищем * @param found Заданный элемент найден. Берем следующий подходящий * @return Элемент, на который следует перевести фокус */ getNextElement(element, backward = false, parent = null, found = false) { if (element === null) { // Элемент, не задан, ищем первый попавшийся found = true; } if (parent === null) { // Родительский элемент не задан, ищем в хосте parent = this.popup.nativeElement; } for (let i = 0; i < parent.children.length; i++) { const 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 }; } const res = this.getNextElement(element, backward, el, found); found = res.found; if (res.element) { return res; } } return { found: found, element: null }; } popupMouseDown(e) { if (this.zIndex >= PopupComponent_1.z) { e.stopPropagation(); } } popupTouchStart(e) { e.stopPropagation(); } popupKeyDown(e) { if (e.keyCode === Keys.ESCAPE) { this.closePopup(); e.preventDefault(); e.stopPropagation(); } if (e.keyCode === Keys.TAB) { // Ищем элемент, на который мы можем отправить фокус после target let 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(); } } addDocumentListeners() { 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); } removeDocumentListeners() { 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); } maxZIndex(element) { let 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; } documentScroll(e) { this.updatePosition(); } documentResize(e) { this.updatePosition(); } checkClose(target) { const 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; } documentTouchStart(e) { this.checkClose(e.target); } documentMouseDown(e) { this.checkClose(e.target); } documentContextMenu(e) { this.checkClose(e.target); } get visible() { return this._visible; } makeOverlay() { PopupComponent_1.z++; const 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', (e) => { this.closePopup(); e.stopPropagation(); e.preventDefault(); }); this._renderer.listen(this._overlay, 'mousedown', (e) => { this.closePopup(); e.stopPropagation(); e.preventDefault(); }); setTimeout(() => { this._renderer.setStyle(this._overlay, 'opacity', '1.0'); }, 50); return this._overlay; } removeOverlay() { if (this._overlay) { document.body.removeChild(this._overlay); PopupComponent_1.z--; } this._overlay = null; } resetPosition() { this.popup.nativeElement.style.transform = 'scale(1.0)'; this.popup.nativeElement.style.top = '0px'; this.popup.nativeElement.style.left = '0px'; } updatePosition() { 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; } const popupRect = this.popup.nativeElement.getBoundingClientRect(); if (this.position === 'MODAL' || this.position === 'SNACK') { const ww = document.body.clientWidth; let width = popupRect.width; let 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; } let targetRect = this._target.getBoundingClientRect(); let xx = targetRect.left; let 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'; } resetAnimation() { let 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; } startAnimation() { let 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; } display() { 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(() => { 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(() => { this.startAnimation(); if (this.position === 'SNACK') { this.closeSnack(); } }, 50); this.addDocumentListeners(); this.show.emit(); }); } closeSnack() { this._stillVisible = true; setTimeout(() => { if (this._stillVisible) { this.popup.nativeElement.style.opacity = '0'; this.popup.nativeElement.style.transform = this.snackTransform2; setTimeout(() => { this.closePopup(); }, 300); } }, 1000); } showByXY(x, y) { this._x = x; this._y = y; this.display(); } showByTarget(target = null, direction = '') { this._target = target; this._direction = direction; this.display(); } showPopup() { if (this._visible) { this.closePopup(); } this.showByTarget(); } closePopup(result = null, confirmed = false) { if (!this._visible) { return; // Чтобы Z-индекс не обновлялся при ложных закрытиях } this._visible = false; this._stillVisible = false; // можно отменить закрытие const 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); } toggle(target, direction) { if (this._visible) { this.closePopup(); } else { this.showByTarget(target, direction); } } }; // 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: ` <div [style.zIndex]="getZ()" class="true-popup" [class.true-snack]="position==='SNACK'" (mousedown)="popupMouseDown($event)" (touchstart)="popupTouchStart($event)" (keydown)="popupKeyDown($event)" #popup> <ng-content #content></ng-content> </div>`, host: { '(touchend)': '$event.stopPropagation()' }, styles: [` :host > div { position: fixed; display: none; opacity: 0.0; } .true-modal-overlay { position: fixed; left: 0; right: 0; top: 0; bottom: 0; opacity: 0.0; overflow-y: auto; } `] }), tslib_1.__metadata("design:paramtypes", [ElementRef, ChangeDetectorRef, Renderer2]) ], PopupComponent); export { PopupComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvY29udHJvbHMvcG9wdXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWdCLFNBQVMsRUFDNUQsaUJBQWlCLEVBQ2pCLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQWlCLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBa0M5RSxJQUFhLGNBQWMsc0JBQTNCLE1BQWEsY0FBYztJQXdpQnpCLFlBQ1MsVUFBc0IsRUFDbkIsY0FBaUMsRUFDbkMsU0FBb0I7UUFGckIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDbkMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQXppQmIsZUFBVSxHQUFHLGtCQUFrQixDQUFDO1FBQ2hDLGVBQVUsR0FBRyxlQUFlLENBQUM7UUFFN0Isb0JBQWUsR0FBRyxtQkFBbUIsQ0FBQztRQUN0QyxvQkFBZSxHQUFHLGVBQWUsQ0FBQztRQUNsQyxvQkFBZSxHQUFHLGtCQUFrQixDQUFDO1FBRXJDLG9CQUFlLEdBQUcsYUFBYSxDQUFDO1FBQ2hDLG9CQUFlLEdBQUcsWUFBWSxDQUFDO1FBQy9CLG9CQUFlLEdBQUcsWUFBWSxDQUFDO1FBRWhELDRFQUE0RTtRQUNsRSxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBWXRCLFVBQUssR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUdqRSxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHcEQsU0FBSSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBR2xELGFBQVEsR0FBZ0QsVUFBVSxDQUFD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QUFHLENBQUMsQ0FBQztBQUVYLGdCQUFDLEdBQVcsRUFBRSxDQUFDO0FBQ2YsMkJBQVksR0FBRyxJQUFJLENBQUM7QUFHbEM7SUFEQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDOzs2Q0FDeEI7QUFHWDtJQURDLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBQ1QsWUFBWTs2Q0FBOEM7QUFHakU7SUFEQyxNQUFNLENBQUMsUUFBUSxDQUFDO3NDQUNULFlBQVk7OENBQWdDO0FBR3BEO0lBREMsTUFBTSxDQUFDLE1BQU0sQ0FBQztzQ0FDVCxZQUFZOzRDQUFnQztBQUdsRDtJQURDLEtBQUssQ0FBQyxVQUFVLENBQUM7O2dEQUNpRDtBQUduRTtJQURDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQzs7eURBQ0Y7QUF0Q2QsY0FBYztJQWhDMUIsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLFlBQVk7UUFDdEIsUUFBUSxFQUFHOzs7Ozs7O1dBT0Y7UUFtQlAsSUFBSSxFQUFFO1lBQ0osWUFBWSxFQUFFLDBCQUEwQjtTQUN6QztpQkFuQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7S0FnQkM7S0FJSixDQUFDOzZDQTBpQnFCLFVBQVU7UUFDSCxpQkFBaUI7UUFDeEIsU0FBUztHQTNpQm5CLGNBQWMsQ0E0aUIxQjtTQTVpQlksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBBbGVrc2V5IE1lbG5pa292LCBUcnVlIERpcmVjdGl2ZSBDb21wYW55LlxyXG4gKiBAbGluayBodHRwczovL3RydWVkaXJlY3RpdmUuY29tL1xyXG4gKiBAbGljZW5zZSBNSVRcclxuKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIENvbnRlbnRDaGlsZCwgUmVuZGVyZXIyLFxyXG4gICAgICAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBVdGlscywgS2V5cywgUG9wdXBQb3NpdGlvbiwgQ2xvc2VFdmVudCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJ1ZS1wb3B1cCcsXHJcbiAgdGVtcGxhdGU6ICBgXHJcbiAgICA8ZGl2IFtzdHlsZS56SW5kZXhdPVwiZ2V0WigpXCIgY2xhc3M9XCJ0cnVlLXBvcHVwXCJcclxuICAgICAgW2NsYXNzLnRydWUtc25hY2tdPVwicG9zaXRpb249PT0nU05BQ0snXCJcclxuICAgICAgKG1vdXNlZG93bik9XCJwb3B1cE1vdXNlRG93bigkZXZlbnQpXCJcclxuICAgICAgKHRvdWNoc3RhcnQpPVwicG9wdXBUb3VjaFN0YXJ0KCRldmVudClcIlxyXG4gICAgICAoa2V5ZG93bik9XCJwb3B1cEtleURvd24oJGV2ZW50KVwiICNwb3B1cD5cclxuICAgICAgPG5nLWNvbnRlbnQgI2NvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9kaXY+YCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgIDpob3N0ID4gZGl2IHtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgICBvcGFjaXR5OiAwLjA7XHJcbiAgICB9XHJcblxyXG4gICAgLnRydWUtbW9kYWwtb3ZlcmxheSB7XHJcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgbGVmdDogMDtcclxuICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgYm90dG9tOiAwO1xyXG4gICAgICBvcGFjaXR5OiAwLjA7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICB9XHJcbiAgICBgXSxcclxuICAgIGhvc3Q6IHtcclxuICAgICAgJyh0b3VjaGVuZCknOiAnJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpJ1xyXG4gICAgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUG9wdXBDb21wb25lbnQge1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zZm9ybTAgPSAndHJhbnNsYXRlWCgxNXB4KSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2Zvcm0xID0gJ3RyYW5zbGF0ZVgoMCknO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsVHJhbnNmb3JtMCA9ICd0cmFuc2xhdGVZKC0yMHB4KSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RhbFRyYW5zZm9ybTEgPSAndHJhbnNsYXRlWSgwKSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RhbFRyYW5zZm9ybTIgPSAndHJhbnNsYXRlWSgyMHB4KSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc25hY2tUcmFuc2Zvcm0wID0gJ3NjYWxlKDAuODUpJztcclxuICBwcml2YXRlIHJlYWRvbmx5IHNuYWNrVHJhbnNmb3JtMSA9ICdzY2FsZSgxLjApJztcclxuICBwcml2YXRlIHJlYWRvbmx5IHNuYWNrVHJhbnNmb3JtMiA9ICdzY2FsZSgxLjUpJztcclxuXHJcbiAgLy8gTnVtYmVyIG9mIHBpeGVscyBmb3Igc2hpZnRpbmcgdGhlIHBvcHVwIHRvIHJpZ2h0IHdoZW4gcG9zaXRpb24gaXMgW2xlZnRdLlxyXG4gIHByb3RlY3RlZCBzaGlmdER4ID0gNjtcclxuXHJcbiAgLy8gUG9wdXAgd2lsbCBub3QgYmUgY2xvc2VkIGlmIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgbW9yZSB0aGFuIDBcclxuICBwdWJsaWMgc3RhdGljIGZyZWV6ZSA9IDA7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgejogbnVtYmVyID0gMTk7XHJcbiAgcHVibGljIHN0YXRpYyByZW5kZXJUb0JvZHkgPSB0cnVlO1xyXG5cclxuICBAVmlld0NoaWxkKCdwb3B1cCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHBvcHVwOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoJ2Nsb3NlJylcclxuICBjbG9zZTogRXZlbnRFbWl0dGVyPENsb3NlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDbG9zZUV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KCdjbG9zZWQnKVxyXG4gIGNsb3NlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgnc2hvdycpXHJcbiAgc2hvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQElucHV0KCdwb3NpdGlvbicpXHJcbiAgcG9zaXRpb246ICdSRUxBVElWRScgfCAnQUJTT0xVVEUnIHwgJ01PREFMJyB8ICdTTkFDSycgPSAnUkVMQVRJVkUnO1xyXG5cclxuICBASW5wdXQoJ2tlZXBPblRhcmdldENsaWNrJylcclxuICBrZWVwT25UYXJnZXRDbGljayA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgX3ggPSAtMTtcclxuICBwcml2YXRlIF95ID0gLTE7XHJcbiAgcHJpdmF0ZSBfZGlyZWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfdmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3N0aWxsVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2FuaW1hdGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX292ZXJsYXk6IEhUTUxFbGVtZW50ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBkb2N1bWVudENvbnRleHRNZW51Qm91bmQ6IGFueTtcclxuICBwcml2YXRlIGRvY3VtZW50TW91c2VEb3duQm91bmQ6IGFueTtcclxuICBwcml2YXRlIGRvY3VtZW50VG91Y2hTdGFydEJvdW5kOiBhbnk7XHJcbiAgcHJpdmF0ZSBkb2N1bWVudFNjcm9sbEJvdW5kOiBhbnk7XHJcbiAgcHJpdmF0ZSBkb2N1bWVudFJlc2l6ZUJvdW5kOiBhbnk7XHJcblxyXG4gIHByb3RlY3RlZCBfdGFyZ2V0OiBhbnk7XHJcbiAgcHJvdGVjdGVkIHpJbmRleDogbnVtYmVyO1xyXG5cclxuICBnZXRaKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuekluZGV4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9jdXMgdHJhcFxyXG4gICAqIExvb2tpbmcgZm9yIHRoZSBuZXh0IGVsZW1lbnQgdG8gc3dpdGNoIGZvY3VzLlxyXG4gICAqIEBwYXJhbSAgZWxlbWVudCAg0K3Qu9C10LzQtdC90YIsINC+0YLQvdC+0YHQuNGC0LXQu9GM0L3QviDQutC+0YLQvtGA0L7Qs9C+INC90YPQttC90L4g0L3QsNC50YLQuCDRgdC70LXQtNGD0Y7RidC40LlcclxuICAgKiBAcGFyYW0gIGJhY2t3YXJkINCf0L7QuNGB0Log0L3QsNC30LDQtCAoU2hpZnQrVGFiKVxyXG4gICAqIEBwYXJhbSAgcGFyZW50ICAg0KDQvtC00LjRgtC10LvRjNGB0LrQuNC5LCDQsiDQutC+0YLQvtGA0L7QvCDRgdC10LnRh9Cw0YEg0LjRidC10LxcclxuICAgKiBAcGFyYW0gIGZvdW5kICAgINCX0LDQtNCw0L3QvdGL0Lkg0Y3Qu9C10LzQtdC90YIg0L3QsNC50LTQtdC9LiDQkdC10YDQtdC8INGB0LvQtdC00YPRjtGJ0LjQuSDQv9C+0LTRhdC+0LTRj9GJ0LjQuVxyXG4gICAqIEByZXR1cm4gICAgICAgICAg0K3Qu9C10LzQtdC90YIsINC90LAg0LrQvtGC0L7RgNGL0Lkg0YHQu9C10LTRg9C10YIg0L/QtdGA0LXQstC10YHRgtC4INGE0L7QutGD0YFcclxuICAgKi9cclxuICBwcml2YXRlIGdldE5leHRFbGVtZW50KFxyXG4gICAgICBlbGVtZW50OiBhbnksXHJcbiAgICAgIGJhY2t3YXJkOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgIHBhcmVudDogYW55ID0gbnVsbCxcclxuICAgICAgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgKTogYW55IHtcclxuXHJcbiAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkge1xyXG4gICAgICAvLyDQrdC70LXQvNC10L3Rgiwg0L3QtSDQt9Cw0LTQsNC9LCDQuNGJ0LXQvCDQv9C10YDQstGL0Lkg0L/QvtC/0LDQstGI0LjQudGB0Y9cclxuICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgLy8g0KDQvtC00LjRgtC10LvRjNGB0LrQuNC5INGN0LvQtdC80LXQvdGCINC90LUg0LfQsNC00LDQvSwg0LjRidC10Lwg0LIg0YXQvtGB0YLQtVxyXG4gICAgICBwYXJlbnQgPSAgdGhpcy5wb3B1cC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsID0gYmFja3dhcmQgPyBwYXJlbnQuY2hpbGRyZW5bcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIGkgLSAxXSA6IHBhcmVudC5jaGlsZHJlbltpXTtcclxuXHJcbiAgICAgIGlmIChlbC5oaWRkZW4gfHwgZWwuZGlzYWJsZWQpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGVsID09PSBlbGVtZW50KSB7XHJcbiAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZWwub2Zmc2V0UGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmb3VuZCAmJiBlbC50YWJJbmRleCAhPT0gLTEgICYmIChcclxuICAgICAgICAgICAgICAgZWwubm9kZU5hbWUgPT09ICdJTlBVVCdcclxuICAgICAgICAgICAgfHwgZWwubm9kZU5hbWUgPT09ICdCVVRUT04nXHJcbiAgICAgICAgICAgIHx8IGVsLm5vZGVOYW1lID09PSAnU0VMRUNUJ1xyXG4gICAgICAgICAgICB8fCBlbC5ub2RlTmFtZSA9PT0gJ1RFWFRBUkVBJ1xyXG4gICAgICAgICAgICB8fCBlbC50YWJJbmRleCA+IDBcclxuICAgICAgICApKSAge1xyXG4gICAgICAgIHJldHVybiB7IGZvdW5kOiBmb3VuZCwgZWxlbWVudDogZWwgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmVzID0gdGhpcy5nZXROZXh0RWxlbWVudChlbGVtZW50LCBiYWNrd2FyZCwgZWwsIGZvdW5kKTtcclxuICAgICAgZm91bmQgPSByZXMuZm91bmQ7XHJcbiAgICAgIGlmIChyZXMuZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBmb3VuZDogZm91bmQsIGVsZW1lbnQ6IG51bGwgfTtcclxuICB9XHJcblxyXG4gIHBvcHVwTW91c2VEb3duKGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuekluZGV4ID49IFBvcHVwQ29tcG9uZW50LnopIHtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBvcHVwVG91Y2hTdGFydChlOiBhbnkpIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwb3B1cEtleURvd24oZTogYW55KSB7XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5UQUIpIHtcclxuICAgICAgLy8g0JjRidC10Lwg0Y3Qu9C10LzQtdC90YIsINC90LAg0LrQvtGC0L7RgNGL0Lkg0LzRiyDQvNC+0LbQtdC8INC+0YLQv9GA0LDQstC40YLRjCDRhNC+0LrRg9GBINC/0L7RgdC70LUgdGFyZ2V0XHJcbiAgICAgIGxldCByZXMgPSB0aGlzLmdldE5leHRFbGVtZW50KGUudGFyZ2V0LCBlLnNoaWZ0S2V5KTtcclxuICAgICAgLy8g0J3QtSDQvdCw0LnQtNC10L3QviDQv9C+0YHQu9C1INC30LDQtNCw0L3QvdC+0LPQvj8g0JjRidC10Lwg0L/QtdGA0LLRi9C5XHJcbiAgICAgIGlmIChyZXMuZWxlbWVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJlcyA9IHRoaXMuZ2V0TmV4dEVsZW1lbnQobnVsbCwgZS5zaGlmdEtleSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXMuZWxlbWVudCkge1xyXG4gICAgICAgIHJlcy5lbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZERvY3VtZW50TGlzdGVuZXJzKCkge1xyXG5cclxuICAgIGlmICghdGhpcy5kb2N1bWVudENvbnRleHRNZW51Qm91bmQpIHtcclxuICAgICAgdGhpcy5kb2N1bWVudENvbnRleHRNZW51Qm91bmQgPSB0aGlzLmRvY3VtZW50Q29udGV4dE1lbnUuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRNb3VzZURvd25Cb3VuZCkge1xyXG4gICAgICB0aGlzLmRvY3VtZW50TW91c2VEb3duQm91bmQgPSB0aGlzLmRvY3VtZW50TW91c2VEb3duLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmRvY3VtZW50VG91Y2hTdGFydEJvdW5kKSB7XHJcbiAgICAgIHRoaXMuZG9jdW1lbnRUb3VjaFN0YXJ0Qm91bmQgPSB0aGlzLmRvY3VtZW50VG91Y2hTdGFydC5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5kb2N1bWVudFNjcm9sbEJvdW5kKSB7XHJcbiAgICAgIHRoaXMuZG9jdW1lbnRTY3JvbGxCb3VuZCA9IHRoaXMuZG9jdW1lbnRTY3JvbGwuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRSZXNpemVCb3VuZCkge1xyXG4gICAgICB0aGlzLmRvY3VtZW50UmVzaXplQm91bmQgPSB0aGlzLmRvY3VtZW50UmVzaXplLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLmRvY3VtZW50Q29udGV4dE1lbnVCb3VuZCwgZmFsc2UpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kb2N1bWVudE1vdXNlRG93bkJvdW5kLCBmYWxzZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5kb2N1bWVudFRvdWNoU3RhcnRCb3VuZCwgZmFsc2UpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuZG9jdW1lbnRTY3JvbGxCb3VuZCwgZmFsc2UpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuZG9jdW1lbnRSZXNpemVCb3VuZCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcnMoKSB7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMuZG9jdW1lbnRDb250ZXh0TWVudUJvdW5kLCBmYWxzZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmRvY3VtZW50TW91c2VEb3duQm91bmQsIGZhbHNlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmRvY3VtZW50VG91Y