@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
310 lines • 26.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: dropdown.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, Input, Output, HostBinding, EventEmitter, ElementRef, Optional, SkipSelf, ContentChildren, QueryList } from '@angular/core';
import { CdkOverlayOrigin } from '@angular/cdk/overlay';
import { Subject, merge, fromEvent } from 'rxjs';
import { debounceTime, mapTo, filter, tap } from 'rxjs/operators';
import { DropDownService } from './dropdown.service';
export class DropDownDirective {
/**
* @param {?} dropdownService
* @param {?} el
* @param {?} parentDropdown
*/
constructor(dropdownService, el, parentDropdown) {
this.dropdownService = dropdownService;
this.el = el;
this.parentDropdown = parentDropdown;
this.addClass = true;
this.disabled = false;
/**
* dropdown触发方式
*/
this.trigger = 'click';
/**
* 关闭区域,默认点击菜单链接也会关闭,blank点击其他空白区域才关闭
*/
this.closeScope = 'all';
this.closeOnMouseLeaveMenu = false;
this.toggleEvent = new EventEmitter();
this.visibleSubject = new Subject();
this._isOpen = false;
}
/**
* 控制是否打开dropdown,绑定一个devui-dropdown-open class
* @return {?}
*/
get isOpen() {
return this._isOpen;
}
/**
* @param {?} value
* @return {?}
*/
set isOpen(value) {
this._isOpen = !!value;
if (this.disabled) {
return;
}
if (this.isOpen) {
this.visibleSubject.next(true);
this.focusToggleElement();
this.dropdownService.open(this);
}
else {
this.visibleSubject.next(false);
this.dropdownService.close(this);
}
this.toggleEvent.emit(this.isOpen);
}
/**
* @param {?} bool
* @return {?}
*/
set appendToBody(bool) {
this._appendToBody = (bool === true);
this.updateCdkConnectedOverlayOrigin();
}
/**
* @return {?}
*/
get appendToBody() {
return this._appendToBody;
}
/**
* @param {?} dropdownMenu
* @return {?}
*/
set dropDownMenu(dropdownMenu) {
// init drop down menu
this.menuEl = dropdownMenu.el;
}
/**
* @param {?} dropdownToggle
* @return {?}
*/
set dropDownToggle(dropdownToggle) {
// init toggle element
this.toggleEl = dropdownToggle.el;
this.updateCdkConnectedOverlayOrigin();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.hasOwnProperty('trigger')) {
this.handleHoverSubscriptionIfTriggerIsHover();
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.dropdownService.close(this);
this.unsubscribeHoverAction();
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.handleHoverSubscriptionIfTriggerIsHover();
}
/**
* @return {?}
*/
toggle() {
return this.isOpen = !this.isOpen;
}
/**
* @return {?}
*/
focusToggleElement() {
if (this.toggleEl) {
this.toggleEl.nativeElement.focus();
}
}
/**
* @return {?}
*/
updateCdkConnectedOverlayOrigin() {
if (this.toggleEl && this.appendToBody === true) {
this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(this.toggleEl);
}
else {
this.cdkConnectedOverlayOrigin = undefined;
}
}
/**
* @param {?} observable
* @return {?}
*/
subscribeHoverAction(observable) {
if (!!!this.hoverSubscription) {
this.hoverSubscription = observable.pipe(debounceTime(50)).subscribe((/**
* @param {?} isOpen
* @return {?}
*/
isOpen => {
if (!this.disabled && this.isOpen !== isOpen) {
this.isOpen = isOpen;
}
}));
}
}
/**
* @private
* @return {?}
*/
unsubscribeHoverAction() {
if (this.hoverSubscription) {
this.hoverSubscription.unsubscribe();
this.hoverSubscription = null;
}
}
/**
* @return {?}
*/
handleHoverSubscriptionIfTriggerIsHover() {
if (this.trigger === 'hover') {
/** @type {?} */
const states = merge(fromEvent(this.el.nativeElement, 'mouseenter').pipe(mapTo(true)), fromEvent(this.el.nativeElement, 'mouseleave').pipe(filter((/**
* @param {?} event
* @return {?}
*/
(event) => {
if (this.isOpen && this.appendToBody === true) {
// 冒泡模拟的relatedTarget, 和作用于dropdown本身event.relatedTarget
// menu(子) -> toggle(父) 冒泡模拟的用于离开菜单的时候判断不判断overlay的div层,即只判断menuEl.nativeElement
// toggle(父) -> menu(子) 离开元素本身的需要判断是否落入了overlay的div层,即只判断menuEl.nativeElement.parentElement
/** @type {?} */
const relatedTarget = event.relatedTarget || (event['originEvent'] && event['originEvent'].relatedTarget);
return !(this.menuEl.nativeElement && relatedTarget &&
(this.menuEl.nativeElement.parentElement.contains(event.relatedTarget)
|| this.menuEl.nativeElement.parentElement.parentElement.contains(event.relatedTarget) // 套了两层div增加判断
|| this.menuEl.nativeElement.contains(relatedTarget)
|| this.dropdownChildren.some((/**
* @param {?} children
* @return {?}
*/
children => children !== this
// appendToBody的时候可能会没有实例化不在document上需要做判断有没有parentElement
&& (children.menuEl.nativeElement.parentElement
&& children.menuEl.nativeElement.parentElement.contains(event.relatedTarget)
|| children.menuEl.nativeElement.contains(relatedTarget))))));
}
else {
return true;
}
})), tap((/**
* @param {?} event
* @return {?}
*/
event => {
if (this.parentDropdown) {
this.simulateEventDispatch(event, this.parentDropdown.el.nativeElement);
}
})), mapTo(false)));
this.subscribeHoverAction(states);
}
else {
this.unsubscribeHoverAction();
}
}
/**
* @param {?} $event
* @param {?=} target
* @return {?}
*/
simulateEventDispatch($event, target) {
/** @type {?} */
const event = document.createEvent('MouseEvents');
event.initEvent($event.type, true, true);
event['originEvent'] = $event['originEvent'] || $event;
if (!target) {
target = this.el.nativeElement;
}
target.dispatchEvent(event);
}
}
DropDownDirective.decorators = [
{ type: Directive, args: [{
selector: '[dDropDown]',
exportAs: 'd-dropdown',
providers: [DropDownService]
},] }
];
/** @nocollapse */
DropDownDirective.ctorParameters = () => [
{ type: DropDownService },
{ type: ElementRef },
{ type: DropDownDirective, decorators: [{ type: Optional }, { type: SkipSelf }] }
];
DropDownDirective.propDecorators = {
dropdownChildren: [{ type: ContentChildren, args: [DropDownDirective, { descendants: true },] }],
isOpen: [{ type: HostBinding, args: ['class.devui-dropdown-open',] }, { type: Input }],
addClass: [{ type: HostBinding, args: ['class.devui-dropdown',] }],
disabled: [{ type: Input }],
trigger: [{ type: Input }],
closeScope: [{ type: Input }],
closeOnMouseLeaveMenu: [{ type: Input }],
toggleEvent: [{ type: Output }]
};
if (false) {
/** @type {?} */
DropDownDirective.prototype.dropdownChildren;
/**
* @type {?}
* @private
*/
DropDownDirective.prototype.hoverSubscription;
/** @type {?} */
DropDownDirective.prototype.addClass;
/** @type {?} */
DropDownDirective.prototype.disabled;
/**
* dropdown触发方式
* @type {?}
*/
DropDownDirective.prototype.trigger;
/**
* 关闭区域,默认点击菜单链接也会关闭,blank点击其他空白区域才关闭
* @type {?}
*/
DropDownDirective.prototype.closeScope;
/** @type {?} */
DropDownDirective.prototype.closeOnMouseLeaveMenu;
/** @type {?} */
DropDownDirective.prototype.toggleEvent;
/** @type {?} */
DropDownDirective.prototype.visibleSubject;
/**
* @type {?}
* @private
*/
DropDownDirective.prototype._isOpen;
/** @type {?} */
DropDownDirective.prototype.menuEl;
/** @type {?} */
DropDownDirective.prototype.toggleEl;
/** @type {?} */
DropDownDirective.prototype.cdkConnectedOverlayOrigin;
/**
* @type {?}
* @private
*/
DropDownDirective.prototype._appendToBody;
/**
* @type {?}
* @private
*/
DropDownDirective.prototype.dropdownService;
/** @type {?} */
DropDownDirective.prototype.el;
/** @type {?} */
DropDownDirective.prototype.parentDropdown;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvZHJvcGRvd24vIiwic291cmNlcyI6WyJkcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFhLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQ3JDLFFBQVEsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUMvRSxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBYyxLQUFLLEVBQUUsU0FBUyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBT3JELE1BQU0sT0FBTyxpQkFBaUI7Ozs7OztJQXdFNUIsWUFBb0IsZUFBZ0MsRUFBUyxFQUFjLEVBQzFDLGNBQWlDO1FBRDlDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFTLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBaEQ3QixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQzVDLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFLakIsWUFBTyxHQUFzQixPQUFPLENBQUM7Ozs7UUFJckMsZUFBVSxHQUE2QixLQUFLLENBQUM7UUFDN0MsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGdCQUFXLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEUsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRWhDLFlBQU8sR0FBRyxLQUFLLENBQUM7SUFnQ3hC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ZWN0aXZlLCBPbkRlc3Ryb3ksIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsXHJcbiAgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPcHRpb25hbCwgU2tpcFNlbGYsIENvbnRlbnRDaGlsZHJlbixcclxuICBRdWVyeUxpc3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2RrT3ZlcmxheU9yaWdpbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBtZXJnZSwgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBtYXBUbywgZmlsdGVyLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERyb3BEb3duU2VydmljZSB9IGZyb20gJy4vZHJvcGRvd24uc2VydmljZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRHJvcERvd25dJyxcclxuICBleHBvcnRBczogJ2QtZHJvcGRvd24nLFxyXG4gIHByb3ZpZGVyczogW0Ryb3BEb3duU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3BEb3duRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oRHJvcERvd25EaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIGRyb3Bkb3duQ2hpbGRyZW46IFF1ZXJ5TGlzdDxEcm9wRG93bkRpcmVjdGl2ZT47XHJcbiAgcHJpdmF0ZSBob3ZlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIC8qKlxyXG4gICAqIOaOp+WItuaYr+WQpuaJk+W8gGRyb3Bkb3du77yM57uR5a6a5LiA5LiqZGV2dWktZHJvcGRvd24tb3BlbiBjbGFzc1xyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGV2dWktZHJvcGRvd24tb3BlbicpXHJcbiAgQElucHV0KCkgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcclxuICB9XHJcbiAgc2V0IGlzT3Blbih2YWx1ZSkge1xyXG4gICAgdGhpcy5faXNPcGVuID0gISF2YWx1ZTtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLnZpc2libGVTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9jdXNUb2dnbGVFbGVtZW50KCk7XHJcbiAgICAgIHRoaXMuZHJvcGRvd25TZXJ2aWNlLm9wZW4odGhpcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZpc2libGVTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duU2VydmljZS5jbG9zZSh0aGlzKTtcclxuICAgIH1cclxuICAgIHRoaXMudG9nZ2xlRXZlbnQuZW1pdCh0aGlzLmlzT3Blbik7XHJcbiAgfVxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGV2dWktZHJvcGRvd24nKSBhZGRDbGFzcyA9IHRydWU7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogZHJvcGRvd27op6blj5HmlrnlvI9cclxuICAgKi9cclxuICBASW5wdXQoKSB0cmlnZ2VyOiAnY2xpY2snIHwgJ2hvdmVyJyA9ICdjbGljayc7XHJcbiAgLyoqXHJcbiAgICog5YWz6Zet5Yy65Z+f77yM6buY6K6k54K55Ye76I+c5Y2V6ZO+5o6l5Lmf5Lya5YWz6Zet77yMYmxhbmvngrnlh7vlhbbku5bnqbrnmb3ljLrln5/miY3lhbPpl61cclxuICAgKi9cclxuICBASW5wdXQoKSBjbG9zZVNjb3BlOiAnYWxsJyB8ICdibGFuaycgfCAnbm9uZScgPSAnYWxsJztcclxuICBASW5wdXQoKSBjbG9zZU9uTW91c2VMZWF2ZU1lbnUgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIHRvZ2dsZUV2ZW50OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHZpc2libGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XHJcblxyXG4gIC8vIGRyb3AgbWVudSBodG1sXHJcbiAgcHVibGljIG1lbnVFbDogRWxlbWVudFJlZjtcclxuICAvLyBkcm9wIGRvd24gdG9nZ2xlIGVsZW1lbnRcclxuICBwdWJsaWMgdG9nZ2xlRWw6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHB1YmxpYyBjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luOiBDZGtPdmVybGF5T3JpZ2luO1xyXG5cclxuICBwcml2YXRlIF9hcHBlbmRUb0JvZHk6IGJvb2xlYW47XHJcblxyXG4gIHB1YmxpYyBzZXQgYXBwZW5kVG9Cb2R5KGJvb2w6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FwcGVuZFRvQm9keSA9IChib29sID09PSB0cnVlKTtcclxuICAgIHRoaXMudXBkYXRlQ2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbigpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGFwcGVuZFRvQm9keSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9hcHBlbmRUb0JvZHk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRyb3BEb3duTWVudShkcm9wZG93bk1lbnUpIHtcclxuICAgIC8vIGluaXQgZHJvcCBkb3duIG1lbnVcclxuICAgIHRoaXMubWVudUVsID0gZHJvcGRvd25NZW51LmVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkcm9wRG93blRvZ2dsZShkcm9wZG93blRvZ2dsZSkge1xyXG4gICAgLy8gaW5pdCB0b2dnbGUgZWxlbWVudFxyXG4gICAgdGhpcy50b2dnbGVFbCA9IGRyb3Bkb3duVG9nZ2xlLmVsO1xyXG4gICAgdGhpcy51cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRyb3Bkb3duU2VydmljZTogRHJvcERvd25TZXJ2aWNlLCBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwdWJsaWMgcGFyZW50RHJvcGRvd246IERyb3BEb3duRGlyZWN0aXZlKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgndHJpZ2dlcicpKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlSG92ZXJTdWJzY3JpcHRpb25JZlRyaWdnZXJJc0hvdmVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZHJvcGRvd25TZXJ2aWNlLmNsb3NlKHRoaXMpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZUhvdmVyQWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLmhhbmRsZUhvdmVyU3Vic2NyaXB0aW9uSWZUcmlnZ2VySXNIb3ZlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1c1RvZ2dsZUVsZW1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy50b2dnbGVFbCkge1xyXG4gICAgICB0aGlzLnRvZ2dsZUVsLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKSB7XHJcbiAgICBpZiAodGhpcy50b2dnbGVFbCAmJiB0aGlzLmFwcGVuZFRvQm9keSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4gPSBuZXcgQ2RrT3ZlcmxheU9yaWdpbih0aGlzLnRvZ2dsZUVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1YnNjcmliZUhvdmVyQWN0aW9uKG9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB2b2lkIHtcclxuICAgIGlmICghISF0aGlzLmhvdmVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaG92ZXJTdWJzY3JpcHRpb24gPSBvYnNlcnZhYmxlLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKSxcclxuICAgICAgKS5zdWJzY3JpYmUoaXNPcGVuID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5pc09wZW4gIT09IGlzT3Blbikge1xyXG4gICAgICAgICAgdGhpcy5pc09wZW4gPSBpc09wZW47XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVIb3ZlckFjdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmhvdmVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaG92ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5ob3ZlclN1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVIb3ZlclN1YnNjcmlwdGlvbklmVHJpZ2dlcklzSG92ZXIgKCkge1xyXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2hvdmVyJykge1xyXG4gICAgICBjb25zdCBzdGF0ZXM6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBtZXJnZShcclxuICAgICAgICBmcm9tRXZlbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicpLnBpcGUobWFwVG8odHJ1ZSkpLFxyXG4gICAgICAgIGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJykucGlwZShcclxuICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMuYXBwZW5kVG9Cb2R5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgLy8g5YaS5rOh5qih5ouf55qEcmVsYXRlZFRhcmdldO+8jCDlkozkvZznlKjkuo5kcm9wZG93buacrOi6q2V2ZW50LnJlbGF0ZWRUYXJnZXRcclxuICAgICAgICAgICAgICAvLyBtZW5177yI5a2Q77yJIC0+IHRvZ2dsZe+8iOeItu+8iSDlhpLms6HmqKHmi5/nmoTnlKjkuo7nprvlvIDoj5zljZXnmoTml7blgJnliKTmlq3kuI3liKTmlq1vdmVybGF555qEZGl25bGC77yM5Y2z5Y+q5Yik5patbWVudUVsLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgICAvLyB0b2dnbGXvvIjniLbvvIkgLT4gbWVude+8iOWtkO+8iSDnprvlvIDlhYPntKDmnKzouqvnmoTpnIDopoHliKTmlq3mmK/lkKbokL3lhaXkuoZvdmVybGF555qEZGl25bGC77yM5Y2z5Y+q5Yik5patbWVudUVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudFxyXG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudFsnb3JpZ2luRXZlbnQnXSAmJiBldmVudFsnb3JpZ2luRXZlbnQnXS5yZWxhdGVkVGFyZ2V0KTtcclxuICAgICAgICAgICAgICByZXR1cm4gICEodGhpcy5tZW51RWwubmF0aXZlRWxlbWVudCAmJiByZWxhdGVkVGFyZ2V0ICYmXHJcbiAgICAgICAgICAgICAgICAgICh0aGlzLm1lbnVFbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgICAgICAgfHwgdGhpcy5tZW51RWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkgLy8g5aWX5LqG5Lik5bGCZGl25aKe5Yqg5Yik5patXHJcbiAgICAgICAgICAgICAgICAgIHx8IHRoaXMubWVudUVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgICAgICAgfHwgdGhpcy5kcm9wZG93bkNoaWxkcmVuLnNvbWUoXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPT5cclxuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuICE9PSB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmRUb0JvZHnnmoTml7blgJnlj6/og73kvJrmsqHmnInlrp7kvovljJbkuI3lnKhkb2N1bWVudOS4iumcgOimgeWBmuWIpOaWreacieayoeaciXBhcmVudEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICYmICggY2hpbGRyZW4ubWVudUVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgJiYgY2hpbGRyZW4ubWVudUVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgfHwgY2hpbGRyZW4ubWVudUVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCkpXHJcbiAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0YXAoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnREcm9wZG93bikge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2ltdWxhdGVFdmVudERpc3BhdGNoKGV2ZW50LCB0aGlzLnBhcmVudERyb3Bkb3duLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcFRvKGZhbHNlKSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVIb3ZlckFjdGlvbihzdGF0ZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51bnN1YnNjcmliZUhvdmVyQWN0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaW11bGF0ZUV2ZW50RGlzcGF0Y2goJGV2ZW50LCB0YXJnZXQ/ICkge1xyXG4gICAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcclxuICAgIGV2ZW50LmluaXRFdmVudCgkZXZlbnQudHlwZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICBldmVudFsnb3JpZ2luRXZlbnQnXSA9ICRldmVudFsnb3JpZ2luRXZlbnQnXSB8fCAkZXZlbnQ7XHJcblxyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgdGFyZ2V0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==