@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
501 lines • 67.3 kB
JavaScript
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