@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
270 lines • 25.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: modal.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { animate, state, style, transition, trigger } from '@angular/animations';
import { Component, ElementRef, Input, Renderer2, ViewChild } from '@angular/core';
import { DocumentRef } from '@duoduo-oba/ng-devui/window-ref';
import { isUndefined } from 'lodash-es';
import { fromEvent, Subscription } from 'rxjs';
import { ModalContainerDirective } from './modal.directive';
export class ModalComponent {
/**
* @param {?} documentRef
* @param {?} renderer
*/
constructor(documentRef, renderer) {
this.documentRef = documentRef;
this.renderer = renderer;
this.placement = 'center';
this.animateState = this.showAnimate ? 'void' : '';
this.ignoreBackDropClick = false;
this.pressEscToClose = new Subscription();
this.onModalClick = (/**
* @param {?} $event
* @return {?}
*/
($event) => {
// 一定要document.contains($event.target),因为$event.target可能已经不在document里了,这个时候就不能进hide了,使用document.body兼容IE
if (this.backdropCloseable && !this.ignoreBackDropClick &&
(!this.dialogElement.nativeElement.contains($event.target) && document.body.contains($event.target))) {
this.hide();
}
this.ignoreBackDropClick = false;
});
this.modalMouseDown = (/**
* @param {?} $event
* @return {?}
*/
($event) => {
this.mouseDwonEl = $event.target;
});
this.modalMouseUp = (/**
* @param {?} $event
* @return {?}
*/
($event) => {
if ($event.target !== this.mouseDwonEl) {
this.ignoreBackDropClick = true;
}
});
this.backdropCloseable = isUndefined(this.backdropCloseable)
? true
: this.backdropCloseable;
}
/**
* @return {?}
*/
ngOnInit() {
this.pressEscToClose.add(fromEvent(window, 'keydown').subscribe((/**
* @param {?} event
* @return {?}
*/
(event) => {
if (event['keyCode'] === 27) {
this.hide();
}
})));
/** @type {?} */
const handle = document.getElementById('d-modal-header');
if (handle) {
this.draggableHandleEl = handle;
}
}
/**
* @param {?} event
* @return {?}
*/
onAnimationDone(event) {
if (event.toState === 'void') {
this.onHidden();
}
}
// Will overwrite this method in modal service
/**
* @return {?}
*/
onHidden() {
}
/**
* @return {?}
*/
canHideModel() {
/** @type {?} */
let hiddenResult = Promise.resolve(true);
if (this.beforeHidden) {
/** @type {?} */
const result = this.beforeHidden();
if (typeof result !== 'undefined') {
if (result.then) {
hiddenResult = result;
}
else if (result.subscribe) {
hiddenResult = ((/** @type {?} */ (result))).toPromise();
}
else {
hiddenResult = Promise.resolve(result);
}
}
}
return hiddenResult;
}
/**
* @return {?}
*/
hide() {
this.canHideModel().then((/**
* @param {?} canHide
* @return {?}
*/
(canHide) => {
if (!canHide) {
return;
}
if (!this.bodyScrollable) {
this.renderer.removeClass(this.documentRef.body, 'modal-open');
}
if (!this.showAnimate) {
this.onHidden();
return;
}
this.animateState = 'void';
}));
}
/**
* @return {?}
*/
show() {
if (!this.bodyScrollable) {
this.renderer.addClass(this.documentRef.body, 'modal-open');
}
this.dialogElement.nativeElement.focus();
if (this.showAnimate) {
this.animateState = 'in';
}
}
/**
* @return {?}
*/
resolveTransformTranslate() {
/** @type {?} */
let autoOffsetYByPlacement;
switch (this.placement) {
case 'top':
autoOffsetYByPlacement = '40px';
break;
case 'bottom':
autoOffsetYByPlacement = '-40px';
break;
case 'center':
default:
autoOffsetYByPlacement = '0';
break;
}
/** @type {?} */
const offsetX = !!this.offsetX ? this.offsetX : '0';
/** @type {?} */
const offsetY = !!this.offsetY ? this.offsetY : autoOffsetYByPlacement;
return 'translate(' + offsetX + ',' + offsetY + ')';
}
/**
* @return {?}
*/
ngOnDestroy() {
this.pressEscToClose.unsubscribe();
}
}
ModalComponent.decorators = [
{ type: Component, args: [{
selector: 'd-modal',
template: "<div class=\"modal-backdrop\" [@backdropAnimation]=\"animateState\"></div>\r\n<div class=\"modal in\" [attr.id]=\"id\" (mousedown)=\"modalMouseDown($event)\" (mouseup)=\"modalMouseUp($event)\" (click)=\"onModalClick($event)\">\r\n <div\r\n class=\"modal-dialog\"\r\n [ngClass]=\"{\r\n 'place-at-top': placement === 'top',\r\n 'place-at-bottom': placement === 'bottom',\r\n 'place-at-center': placement === 'center'\r\n }\"\r\n [ngStyle]=\"{ width: width }\"\r\n [@modalAnimation]=\"animateState\"\r\n (@modalAnimation.done)=\"onAnimationDone($event)\"\r\n tabindex=\"1\"\r\n #dialog\r\n >\r\n <div class=\"modal-content\" [dMovable]=\"draggable\" [handle]=\"draggableHandleEl\" [ngStyle]=\"{ transform: resolveTransformTranslate() }\">\r\n <ng-template dModalContainerHost></ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n",
animations: [
trigger('backdropAnimation', [
state('void', style({ opacity: 0 })),
state('in', style({ opacity: 0.2 })),
transition('void => in', animate('400ms cubic-bezier(0.23, 1, 0.32, 1)')),
transition('in => void', animate('300ms cubic-bezier(0.755, 0.05, 0.855, 0.06)')),
]),
trigger('modalAnimation', [
state('void', style({ opacity: 0, transform: 'scale(0.9)' })),
state('in', style({ opacity: 1, transform: 'scale(1)' })),
transition('void => in', animate('400ms cubic-bezier(0.23, 1, 0.32, 1)')),
transition('in => void', animate('300ms cubic-bezier(0.755, 0.05, 0.855, 0.06)')),
])
],
styles: [".modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;outline:0;overflow-y:auto;display:block;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:0 auto}.modal-dialog.place-at-center{margin:auto}.modal-dialog.place-at-top{margin-bottom:auto}.modal-dialog.place-at-bottom{margin-top:auto}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;opacity:.2;background-color:#000}:host ::ng-deep .modal-content{position:relative;border-radius:2px;border:none;background-color:#fff;background-clip:padding-box;outline:0;box-shadow:5px 5px 20px 0 rgba(41,48,64,.2)}:host ::ng-deep .modal-content .modal-body{padding:24px 24px 16px}:host ::ng-deep .modal-content .modal-footer{border-top:none;padding:7px;text-align:center}:host ::ng-deep .modal-content .modal-footer button{margin:5px;padding:5px 20px;width:auto}:host ::ng-deep .modal-content .modal-footer button.pull-left{padding-left:5px;padding-right:5px;position:relative;left:-5px}:host ::ng-deep .modal-content .modal-footer button+button{margin-bottom:16px}:host ::ng-deep .d-btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;white-space:nowrap;font-size:14px;line-height:1.42857143;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}:focus{outline:0}"]
}] }
];
/** @nocollapse */
ModalComponent.ctorParameters = () => [
{ type: DocumentRef },
{ type: Renderer2 }
];
ModalComponent.propDecorators = {
id: [{ type: Input }],
showAnimate: [{ type: Input }],
width: [{ type: Input }],
backdropCloseable: [{ type: Input }],
beforeHidden: [{ type: Input }],
draggable: [{ type: Input }],
placement: [{ type: Input }],
offsetX: [{ type: Input }],
offsetY: [{ type: Input }],
bodyScrollable: [{ type: Input }],
modalContainerHost: [{ type: ViewChild, args: [ModalContainerDirective, { static: true },] }],
dialogElement: [{ type: ViewChild, args: ['dialog', { static: true },] }]
};
if (false) {
/** @type {?} */
ModalComponent.prototype.id;
/** @type {?} */
ModalComponent.prototype.showAnimate;
/** @type {?} */
ModalComponent.prototype.width;
/** @type {?} */
ModalComponent.prototype.backdropCloseable;
/** @type {?} */
ModalComponent.prototype.beforeHidden;
/** @type {?} */
ModalComponent.prototype.draggable;
/** @type {?} */
ModalComponent.prototype.placement;
/** @type {?} */
ModalComponent.prototype.offsetX;
/** @type {?} */
ModalComponent.prototype.offsetY;
/** @type {?} */
ModalComponent.prototype.bodyScrollable;
/** @type {?} */
ModalComponent.prototype.modalContainerHost;
/** @type {?} */
ModalComponent.prototype.dialogElement;
/** @type {?} */
ModalComponent.prototype.animateState;
/** @type {?} */
ModalComponent.prototype.draggableHandleEl;
/** @type {?} */
ModalComponent.prototype.mouseDwonEl;
/** @type {?} */
ModalComponent.prototype.ignoreBackDropClick;
/** @type {?} */
ModalComponent.prototype.pressEscToClose;
/** @type {?} */
ModalComponent.prototype.onModalClick;
/** @type {?} */
ModalComponent.prototype.modalMouseDown;
/** @type {?} */
ModalComponent.prototype.modalMouseUp;
/**
* @type {?}
* @private
*/
ModalComponent.prototype.documentRef;
/**
* @type {?}
* @private
*/
ModalComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvbW9kYWwvIiwic291cmNlcyI6WyJtb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQXFCNUQsTUFBTSxPQUFPLGNBQWM7Ozs7O0lBcUJ6QixZQUFvQixXQUF3QixFQUFVLFFBQW1CO1FBQXJELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWJoRSxjQUFTLEdBQWdDLFFBQVEsQ0FBQztRQU8zRCxpQkFBWSxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBSXRELHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixvQkFBZSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBaURuRCxpQkFBWTs7OztRQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDeEIsd0dBQXdHO1lBQ3hHLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtnQkFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFh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QUFNLEVBQUUsSUFBSSxFQUFFOzRCQUNuRCxTQUFTLFNBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7OztJQVpyQyw0QkFBb0I7O0lBQ3BCLHFDQUE4Qjs7SUFDOUIsK0JBQXVCOztJQUN2QiwyQ0FBb0M7O0lBQ3BDLHNDQUE4RTs7SUFDOUUsbUNBQTRCOztJQUM1QixtQ0FBMkQ7O0lBQzNELGlDQUF5Qjs7SUFDekIsaUNBQXlCOztJQUN6Qix3Q0FBaUM7O0lBRWpDLDRDQUFrRzs7SUFDbEcsdUNBQWlFOztJQUNqRSxzQ0FBc0Q7O0lBQ3RELDJDQUErQjs7SUFFL0IscUNBQXdCOztJQUN4Qiw2Q0FBNEI7O0lBQzVCLHlDQUFtRDs7SUFpRG5ELHNDQU9DOztJQUVELHdDQUVDOztJQUVELHNDQUlDOzs7OztJQWpFVyxxQ0FBZ0M7Ozs7O0lBQUUsa0NBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb2N1bWVudFJlZiB9IGZyb20gJ25nLWRldnVpL3dpbmRvdy1yZWYnO1xyXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1vZGFsQ29udGFpbmVyRGlyZWN0aXZlIH0gZnJvbSAnLi9tb2RhbC5kaXJlY3RpdmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLW1vZGFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL21vZGFsLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignYmFja2Ryb3BBbmltYXRpb24nLCBbXHJcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKSxcclxuICAgICAgc3RhdGUoJ2luJywgc3R5bGUoeyBvcGFjaXR5OiAwLjIgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IGluJywgYW5pbWF0ZSgnNDAwbXMgIGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKScpKSxcclxuICAgICAgdHJhbnNpdGlvbignaW4gPT4gdm9pZCcsIGFuaW1hdGUoJzMwMG1zIGN1YmljLWJlemllcigwLjc1NSwgMC4wNSwgMC44NTUsIDAuMDYpJykpLFxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdtb2RhbEFuaW1hdGlvbicsIFtcclxuICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuOSknIH0pKSxcclxuICAgICAgc3RhdGUoJ2luJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICdzY2FsZSgxKScgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IGluJywgYW5pbWF0ZSgnNDAwbXMgIGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKScpKSxcclxuICAgICAgdHJhbnNpdGlvbignaW4gPT4gdm9pZCcsIGFuaW1hdGUoJzMwMG1zIGN1YmljLWJlemllcigwLjc1NSwgMC4wNSwgMC44NTUsIDAuMDYpJykpLFxyXG4gICAgXSlcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuICBASW5wdXQoKSBzaG93QW5pbWF0ZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJhY2tkcm9wQ2xvc2VhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGJlZm9yZUhpZGRlbjogKCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIEBJbnB1dCgpIGRyYWdnYWJsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBwbGFjZW1lbnQ6ICdjZW50ZXInIHwgJ3RvcCcgfCAnYm90dG9tJyA9ICdjZW50ZXInO1xyXG4gIEBJbnB1dCgpIG9mZnNldFg6IHN0cmluZztcclxuICBASW5wdXQoKSBvZmZzZXRZOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYm9keVNjcm9sbGFibGU6IGJvb2xlYW47IC8vIOaJk+W8gOW8ueeql2JvZHnmmK/lkKblj6/mu5rliqhcclxuXHJcbiAgQFZpZXdDaGlsZChNb2RhbENvbnRhaW5lckRpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgbW9kYWxDb250YWluZXJIb3N0OiBNb2RhbENvbnRhaW5lckRpcmVjdGl2ZTtcclxuICBAVmlld0NoaWxkKCdkaWFsb2cnLCB7IHN0YXRpYzogdHJ1ZSB9KSBkaWFsb2dFbGVtZW50OiBFbGVtZW50UmVmO1xyXG4gIGFuaW1hdGVTdGF0ZTogc3RyaW5nID0gdGhpcy5zaG93QW5pbWF0ZSA/ICd2b2lkJyA6ICcnO1xyXG4gIGRyYWdnYWJsZUhhbmRsZUVsOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgbW91c2VEd29uRWw6IEVsZW1lbnRSZWY7XHJcbiAgaWdub3JlQmFja0Ryb3BDbGljayA9IGZhbHNlO1xyXG4gIHByZXNzRXNjVG9DbG9zZTogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZG9jdW1lbnRSZWY6IERvY3VtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgIHRoaXMuYmFja2Ryb3BDbG9zZWFibGUgPSBpc1VuZGVmaW5lZCh0aGlzLmJhY2tkcm9wQ2xvc2VhYmxlKVxyXG4gICAgICA/IHRydWVcclxuICAgICAgOiB0aGlzLmJhY2tkcm9wQ2xvc2VhYmxlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnByZXNzRXNjVG9DbG9zZS5hZGQoZnJvbUV2ZW50KHdpbmRvdywgJ2tleWRvd24nKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudFsna2V5Q29kZSddID09PSAyNykge1xyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZC1tb2RhbC1oZWFkZXInKTtcclxuICAgIGlmIChoYW5kbGUpIHtcclxuICAgICAgdGhpcy5kcmFnZ2FibGVIYW5kbGVFbCA9IGhhbmRsZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQW5pbWF0aW9uRG9uZShldmVudCkge1xyXG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICd2b2lkJykge1xyXG4gICAgICB0aGlzLm9uSGlkZGVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBXaWxsIG92ZXJ3cml0ZSB0aGlzIG1ldGhvZCBpbiBtb2RhbCBzZXJ2aWNlXHJcbiAgb25IaWRkZW4oKSB7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FuSGlkZU1vZGVsKCkge1xyXG4gICAgbGV0IGhpZGRlblJlc3VsdCA9IFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5iZWZvcmVIaWRkZW4pIHtcclxuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmJlZm9yZUhpZGRlbigpO1xyXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBpZiAocmVzdWx0LnRoZW4pIHtcclxuICAgICAgICAgIGhpZGRlblJlc3VsdCA9IHJlc3VsdDtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdWJzY3JpYmUpIHtcclxuICAgICAgICAgIGhpZGRlblJlc3VsdCA9IChyZXN1bHQgYXMgT2JzZXJ2YWJsZTxib29sZWFuPikudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGhpZGRlblJlc3VsdCA9IFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoaWRkZW5SZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBvbk1vZGFsQ2xpY2sgPSAoJGV2ZW50KSA9PiB7XHJcbiAgICAvLyDkuIDlrpropoFkb2N1bWVudC5jb250YWlucygkZXZlbnQudGFyZ2V0Ke+8jOWboOS4uiRldmVudC50YXJnZXTlj6/og73lt7Lnu4/kuI3lnKhkb2N1bWVudOmHjOS6hu+8jOi/meS4quaXtuWAmeWwseS4jeiDvei/m2hpZGXkuoYs5L2/55SoZG9jdW1lbnQuYm9keeWFvOWuuUlFXHJcbiAgICBpZiAodGhpcy5iYWNrZHJvcENsb3NlYWJsZSAmJiAhdGhpcy5pZ25vcmVCYWNrRHJvcENsaWNrICYmXHJcbiAgICAgICghdGhpcy5kaWFsb2dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoJGV2ZW50LnRhcmdldCkgJiYgZG9jdW1lbnQuYm9keS5jb250YWlucygkZXZlbnQudGFyZ2V0KSkpIHtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlnbm9yZUJhY2tEcm9wQ2xpY2sgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG1vZGFsTW91c2VEb3duID0gKCRldmVudCkgPT4ge1xyXG4gICAgdGhpcy5tb3VzZUR3b25FbCA9ICRldmVudC50YXJnZXQ7XHJcbiAgfVxyXG5cclxuICBtb2RhbE1vdXNlVXAgPSAoJGV2ZW50KSA9PiB7XHJcbiAgICBpZiAoJGV2ZW50LnRhcmdldCAhPT0gdGhpcy5tb3VzZUR3b25FbCkge1xyXG4gICAgICB0aGlzLmlnbm9yZUJhY2tEcm9wQ2xpY2sgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMuY2FuSGlkZU1vZGVsKCkudGhlbigoY2FuSGlkZSkgPT4ge1xyXG4gICAgICBpZiAoIWNhbkhpZGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmJvZHlTY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmRvY3VtZW50UmVmLmJvZHksICdtb2RhbC1vcGVuJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5zaG93QW5pbWF0ZSkge1xyXG4gICAgICAgIHRoaXMub25IaWRkZW4oKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hbmltYXRlU3RhdGUgPSAndm9pZCc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICBpZiAoIXRoaXMuYm9keVNjcm9sbGFibGUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRvY3VtZW50UmVmLmJvZHksICdtb2RhbC1vcGVuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kaWFsb2dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIGlmICh0aGlzLnNob3dBbmltYXRlKSB7XHJcbiAgICAgIHRoaXMuYW5pbWF0ZVN0YXRlID0gJ2luJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc29sdmVUcmFuc2Zvcm1UcmFuc2xhdGUoKSB7XHJcbiAgICBsZXQgYXV0b09mZnNldFlCeVBsYWNlbWVudDtcclxuICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcclxuICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICBhdXRvT2Zmc2V0WUJ5UGxhY2VtZW50ID0gJzQwcHgnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgIGF1dG9PZmZzZXRZQnlQbGFjZW1lbnQgPSAnLTQwcHgnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjZW50ZXInOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGF1dG9PZmZzZXRZQnlQbGFjZW1lbnQgPSAnMCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvZmZzZXRYID0gISF0aGlzLm9mZnNldFggPyB0aGlzLm9mZnNldFggOiAnMCc7XHJcbiAgICBjb25zdCBvZmZzZXRZID0gISF0aGlzLm9mZnNldFkgPyB0aGlzLm9mZnNldFkgOiBhdXRvT2Zmc2V0WUJ5UGxhY2VtZW50O1xyXG4gICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIG9mZnNldFggKyAnLCcgKyBvZmZzZXRZICsgJyknO1xyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMucHJlc3NFc2NUb0Nsb3NlLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==