@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
508 lines (507 loc) • 65 kB
JavaScript
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