@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
205 lines (204 loc) • 21.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ElementRef, ViewChild, HostListener, Inject, Input, Renderer2 } from '@angular/core';
import { Subject } from 'rxjs';
import { DOCUMENT } from '@angular/platform-browser';
export class AsiDropdownContainer {
/**
* @param {?} document
* @param {?} renderer
* @param {?} elementRef
*/
constructor(document, renderer, elementRef) {
this.document = document;
this.renderer = renderer;
this.elementRef = elementRef;
this.calculWidth = true;
this.subjectContainer = new Subject();
}
/**
* @param {?} event
* @return {?}
*/
documentClick(event) {
if (!this.drop.nativeElement.contains(event.target)) {
this.asiDropDownService.canClose(this.index, this.canClose).subscribe(close => {
if (close) {
setTimeout(() => {
this.close();
});
}
});
}
}
/**
* @return {?}
*/
close() {
this.subjectContainer.next(this);
this.subjectContainer.complete();
}
/**
* @return {?}
*/
onClose() {
return this.subjectContainer.asObservable();
}
/**
* Move the container under htmlElement
* @param {?} elementRef
* @return {?}
*/
forElement(elementRef) {
this.referenceElement = elementRef;
/** @type {?} */
const rectPos = elementRef.getBoundingClientRect();
/** @type {?} */
const bodyComputedStyle = getComputedStyle(this.document.body);
/** @type {?} */
const bodyMarginTop = parseInt(bodyComputedStyle.marginTop.slice(0, -2), 10);
/** @type {?} */
const bodyMarginLeft = parseInt(bodyComputedStyle.marginLeft.slice(0, -2), 10);
/** @type {?} */
const topVerticalPosition = rectPos.top + this.getScrollTopValue() - bodyMarginTop;
if (topVerticalPosition > this.document.body.clientHeight / 2) {
// show over the element
this.drop.nativeElement.style.bottom = (this.document.body.clientHeight - topVerticalPosition) + 'px';
this.drop.nativeElement.style.marginBottom = '5px';
}
else {
// show under the element
this.drop.nativeElement.style.top = (topVerticalPosition + elementRef.offsetHeight) + 'px';
this.drop.nativeElement.style.marginTop = '5px';
}
/** @type {?} */
const screenVerticalPosition = rectPos.top - bodyMarginTop;
/** @type {?} */
let bodyVerticalPosition;
if (screenVerticalPosition > this.document.body.clientHeight / 2) {
// show over the element
bodyVerticalPosition = this.document.body.clientHeight - (this.getScrollTopValue() + screenVerticalPosition);
this.drop.nativeElement.style.bottom = bodyVerticalPosition + 'px';
this.drop.nativeElement.style.marginBottom = '2px';
}
else {
// show under the element
bodyVerticalPosition = this.getScrollTopValue() + screenVerticalPosition + elementRef.offsetHeight;
this.drop.nativeElement.style.top = bodyVerticalPosition + 'px';
this.drop.nativeElement.style.marginTop = '2px';
}
this.drop.nativeElement.style.left = rectPos.left + this.getScrollLeftValue() - bodyMarginLeft + 'px';
this.drop.nativeElement.style.width = elementRef.offsetWidth + 'px';
}
/**
* @return {?}
*/
getScrollTopValue() {
return this.document.body.scrollTop + this.document.documentElement.scrollTop;
}
/**
* @return {?}
*/
getScrollLeftValue() {
return this.document.body.scrollLeft + this.document.documentElement.scrollLeft;
}
/**
* @param {?} asiDrownDown
* @return {?}
*/
show(asiDrownDown) {
setTimeout(() => {
this.template = asiDrownDown.contentTemplate;
/** @type {?} */
let visibility = this.drop.nativeElement.style.visibility;
this.drop.nativeElement.style.visibility = 'hidden';
if (asiDrownDown.dropDownClass) {
this.renderer.addClass(this.elementRef.nativeElement, asiDrownDown.dropDownClass);
}
setTimeout(() => {
/** @type {?} */
let dropRight = this.drop.nativeElement.offsetLeft + this.drop.nativeElement.offsetWidth;
if (dropRight > this.document.documentElement.clientWidth) {
this.drop.nativeElement.style.left = this.drop.nativeElement.offsetLeft
+ this.document.documentElement.scrollLeft - (dropRight - this.document.documentElement.clientWidth) + 'px';
}
this.drop.nativeElement.style.visibility = visibility;
});
});
}
/**
* @param {?} service
* @return {?}
*/
injectService(service) {
this.asiDropDownService = service;
}
/**
* @param {?} index
* @return {?}
*/
setIndex(index) {
this.index = index;
this.elementRef.nativeElement.style.zIndex = AsiDropdownContainer.BASE_INDEX + index;
}
/**
* @param {?} calculWidth
* @return {?}
*/
setCalculWidth(calculWidth) {
if (calculWidth) {
this.drop.nativeElement.style.width = this.referenceElement.offsetWidth + 'px';
}
else {
this.drop.nativeElement.style.width = '';
}
}
}
AsiDropdownContainer.BASE_INDEX = 125;
AsiDropdownContainer.decorators = [
{ type: Component, args: [{
selector: 'asi-dropdown-container',
host: { 'class': 'asi-component asi-dropdown-container' },
template: "<div #drop class=\"dropdown-container\">\r\n <ng-template [ngTemplateOutlet]=\"template\"></ng-template>\r\n</div>"
}] }
];
/** @nocollapse */
AsiDropdownContainer.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: Renderer2 },
{ type: ElementRef }
];
AsiDropdownContainer.propDecorators = {
calculWidth: [{ type: Input }],
drop: [{ type: ViewChild, args: ['drop', { read: ElementRef },] }],
documentClick: [{ type: HostListener, args: ['document:mouseup', ['$event'],] }]
};
if (false) {
/** @type {?} */
AsiDropdownContainer.BASE_INDEX;
/** @type {?} */
AsiDropdownContainer.prototype.index;
/** @type {?} */
AsiDropdownContainer.prototype.canClose;
/** @type {?} */
AsiDropdownContainer.prototype.calculWidth;
/** @type {?} */
AsiDropdownContainer.prototype.drop;
/** @type {?} */
AsiDropdownContainer.prototype.subjectContainer;
/** @type {?} */
AsiDropdownContainer.prototype.asiDropDownService;
/** @type {?} */
AsiDropdownContainer.prototype.template;
/** @type {?} */
AsiDropdownContainer.prototype.referenceElement;
/** @type {?} */
AsiDropdownContainer.prototype.document;
/** @type {?} */
AsiDropdownContainer.prototype.renderer;
/** @type {?} */
AsiDropdownContainer.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWRyb3Bkb3duLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWRyb3Bkb3duL2NvbnRhaW5lci9hc2ktZHJvcGRvd24tY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFlLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU9yRCxNQUFNOzs7Ozs7SUFrQkosWUFBc0MsUUFBYSxFQUFVLFFBQW1CLEVBQVUsVUFBc0I7UUFBMUUsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZOzJCQVh6RixJQUFJO2dDQUkrQixJQUFJLE9BQU8sRUFBRTtLQVF0RTs7Ozs7SUFHRCxhQUFhLENBQUMsS0FBaUI7UUFDN0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDNUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDVixVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztx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LElBQUksQ0FBQztTQUNoRjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDMUM7OztrQ0F2SXlCLEdBQUc7O1lBUGhDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUU7Z0JBQ3pELGlJQUFvRDthQUNyRDs7Ozs0Q0FtQmMsTUFBTSxTQUFDLFFBQVE7WUE1QnVELFNBQVM7WUFBN0QsVUFBVTs7OzBCQWlCeEMsS0FBSzttQkFFTCxTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTs0QkFZdEMsWUFBWSxTQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNpRHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi8uLi9hc2ktZHJvcGRvd24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBc2lEcm9wRG93biB9IGZyb20gJy4vLi4vYXNpLWRyb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FzaS1kcm9wZG93bi1jb250YWluZXInLFxyXG4gIGhvc3Q6IHsgJ2NsYXNzJzogJ2FzaS1jb21wb25lbnQgYXNpLWRyb3Bkb3duLWNvbnRhaW5lcicgfSxcclxuICB0ZW1wbGF0ZVVybDogJ2FzaS1kcm9wZG93bi1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lEcm9wZG93bkNvbnRhaW5lciB7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEJBU0VfSU5ERVggPSAxMjU7XHJcblxyXG4gIGluZGV4OiBudW1iZXI7XHJcbiAgY2FuQ2xvc2U6IEZ1bmN0aW9uO1xyXG5cclxuICBASW5wdXQoKSBjYWxjdWxXaWR0aCA9IHRydWU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3AnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgZHJvcDogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSBzdWJqZWN0Q29udGFpbmVyOiBTdWJqZWN0PEFzaURyb3Bkb3duQ29udGFpbmVyPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHByaXZhdGUgYXNpRHJvcERvd25TZXJ2aWNlOiBBc2lEcm9wZG93blNlcnZpY2U7XHJcblxyXG4gIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIHJlZmVyZW5jZUVsZW1lbnQ6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55LCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgZG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuYXNpRHJvcERvd25TZXJ2aWNlLmNhbkNsb3NlKHRoaXMuaW5kZXgsIHRoaXMuY2FuQ2xvc2UpLnN1YnNjcmliZShjbG9zZSA9PiB7XHJcbiAgICAgICAgaWYgKGNsb3NlKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLnN1YmplY3RDb250YWluZXIubmV4dCh0aGlzKTtcclxuICAgIHRoaXMuc3ViamVjdENvbnRhaW5lci5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2UgZXZlbnQgd2hlbiBjbGljayBvdXRzaWRlXHJcbiAgb25DbG9zZSgpOiBPYnNlcnZhYmxlPEFzaURyb3Bkb3duQ29udGFpbmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbmVyLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZSB0aGUgY29udGFpbmVyIHVuZGVyIGh0bWxFbGVtZW50XHJcbiAgICogQHBhcmFtIGh0bWxFbGVtZW50IFRoZSBwYXJlbnQgSFRNTEVsZW1lbnQgb2YgdGhlIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgZm9yRWxlbWVudChlbGVtZW50UmVmOiBhbnkpIHtcclxuICAgIHRoaXMucmVmZXJlbmNlRWxlbWVudCA9IGVsZW1lbnRSZWY7XHJcblxyXG4gICAgY29uc3QgcmVjdFBvcyA9IGVsZW1lbnRSZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgLy8gR2V0IHRoZSBjb21wdXRlZCBjbGFzcyBtYXJnaW4gKGZyb20gYm90aCBzdHlsZSArIGNzcyBjbGFzcylcclxuICAgIGNvbnN0IGJvZHlDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvY3VtZW50LmJvZHkpO1xyXG5cclxuICAgIGNvbnN0IGJvZHlNYXJnaW5Ub3AgPSBwYXJzZUludChib2R5Q29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3Auc2xpY2UoMCwgLTIpLCAxMCk7XHJcbiAgICBjb25zdCBib2R5TWFyZ2luTGVmdCA9IHBhcnNlSW50KGJvZHlDb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQuc2xpY2UoMCwgLTIpLCAxMCk7XHJcblxyXG4gICAgY29uc3QgdG9wVmVydGljYWxQb3NpdGlvbiA9IHJlY3RQb3MudG9wICsgdGhpcy5nZXRTY3JvbGxUb3BWYWx1ZSgpIC0gYm9keU1hcmdpblRvcDtcclxuXHJcbiAgICBpZiAodG9wVmVydGljYWxQb3NpdGlvbiA+IHRoaXMuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgLyAyKSB7XHJcbiAgICAgIC8vIHNob3cgb3ZlciB0aGUgZWxlbWVudFxyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5ib3R0b20gPSAodGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAtIHRvcFZlcnRpY2FsUG9zaXRpb24pICsgJ3B4JztcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luQm90dG9tID0gJzVweCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBzaG93IHVuZGVyIHRoZSBlbGVtZW50XHJcbiAgICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9ICh0b3BWZXJ0aWNhbFBvc2l0aW9uICsgZWxlbWVudFJlZi5vZmZzZXRIZWlnaHQpICsgJ3B4JztcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gJzVweCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2NyZWVuVmVydGljYWxQb3NpdGlvbiA9IHJlY3RQb3MudG9wIC0gYm9keU1hcmdpblRvcDtcclxuICAgIGxldCBib2R5VmVydGljYWxQb3NpdGlvbjtcclxuICAgIGlmIChzY3JlZW5WZXJ0aWNhbFBvc2l0aW9uID4gdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAvIDIpIHtcclxuICAgICAgLy8gc2hvdyBvdmVyIHRoZSBlbGVtZW50XHJcbiAgICAgIGJvZHlWZXJ0aWNhbFBvc2l0aW9uID0gdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAtICh0aGlzLmdldFNjcm9sbFRvcFZhbHVlKCkgKyBzY3JlZW5WZXJ0aWNhbFBvc2l0aW9uKTtcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYm90dG9tID0gYm9keVZlcnRpY2FsUG9zaXRpb24gKyAncHgnO1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnMnB4JztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHNob3cgdW5kZXIgdGhlIGVsZW1lbnRcclxuICAgICAgYm9keVZlcnRpY2FsUG9zaXRpb24gPSB0aGlzLmdldFNjcm9sbFRvcFZhbHVlKCkgKyBzY3JlZW5WZXJ0aWNhbFBvc2l0aW9uICsgZWxlbWVudFJlZi5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IGJvZHlWZXJ0aWNhbFBvc2l0aW9uICsgJ3B4JztcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gJzJweCc7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IHJlY3RQb3MubGVmdCArIHRoaXMuZ2V0U2Nyb2xsTGVmdFZhbHVlKCkgLSBib2R5TWFyZ2luTGVmdCArICdweCc7XHJcblxyXG4gICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSBlbGVtZW50UmVmLm9mZnNldFdpZHRoICsgJ3B4JztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Nyb2xsVG9wVmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5ib2R5LnNjcm9sbFRvcCArIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Nyb2xsTGVmdFZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBjb250ZW50IHRvIGRpc3BsYXkgaW4gdGhlIGNvbnRhaW5lclxyXG4gICAqL1xyXG4gIHNob3coYXNpRHJvd25Eb3duOiBBc2lEcm9wRG93bikge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudGVtcGxhdGUgPSBhc2lEcm93bkRvd24uY29udGVudFRlbXBsYXRlO1xyXG4gICAgICBsZXQgdmlzaWJpbGl0eSA9IHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk7XHJcbiAgICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgaWYgKGFzaURyb3duRG93bi5kcm9wRG93bkNsYXNzKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgYXNpRHJvd25Eb3duLmRyb3BEb3duQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCBkcm9wUmlnaHQgPSB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgaWYgKGRyb3BSaWdodCA+IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdFxyXG4gICAgICAgICAgICArIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgLSAoZHJvcFJpZ2h0IC0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5qZWN0U2VydmljZShzZXJ2aWNlOiBBc2lEcm9wZG93blNlcnZpY2UpIHtcclxuICAgIHRoaXMuYXNpRHJvcERvd25TZXJ2aWNlID0gc2VydmljZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS56SW5kZXggPSBBc2lEcm9wZG93bkNvbnRhaW5lci5CQVNFX0lOREVYICsgaW5kZXg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2FsY3VsV2lkdGgoY2FsY3VsV2lkdGg6IGJvb2xlYW4pIHtcclxuICAgIGlmIChjYWxjdWxXaWR0aCkge1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IHRoaXMucmVmZXJlbmNlRWxlbWVudC5vZmZzZXRXaWR0aCArICdweCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=