UNPKG

@hsaadawy/ngx-chat

Version:
84 lines 18.6 kB
import { animate, state, style, transition, trigger } from '@angular/animations'; import { Component, EventEmitter, Inject, Input, Output } from '@angular/core'; import { combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { MultiUserChatPlugin } from '../../services/adapters/xmpp/plugins/multi-user-chat.plugin'; import { ChatListStateService } from '../../services/chat-list-state.service'; import { CHAT_SERVICE_TOKEN } from '../../services/chat-service'; export class RosterListComponent { constructor(chatService, chatListService) { this.chatService = chatService; this.chatListService = chatListService; this.rosterStateChanged = new EventEmitter(); this.multiUserChatPlugin = this.chatService.getPlugin(MultiUserChatPlugin); } ngOnInit() { if (!this.contacts) { this.contacts = this.chatService.contactsSubscribed$; } if (!this.contactRequestsReceived$) { this.contactRequestsReceived$ = this.chatService.contactRequestsReceived$; } if (!this.contactRequestsSent$) { this.contactRequestsSent$ = this.chatService.contactRequestsSent$; } if (!this.contactsUnaffiliated$) { this.contactsUnaffiliated$ = this.chatService.contactsUnaffiliated$; } this.hasNoContacts$ = combineLatest([ this.contacts, this.contactRequestsReceived$, this.contactRequestsSent$, this.contactsUnaffiliated$, ]).pipe(map(([contacts, received, sent, unaffiliated]) => contacts.length + received.length + sent.length + unaffiliated.length === 0)); } onClickRecipient(recipient) { this.chatListService.openChat(recipient); } toggleVisibility() { const newState = this.rosterState === 'shown' ? 'hidden' : 'shown'; this.rosterStateChanged.emit(newState); } } RosterListComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-chat-roster-list', template: "<div class=\"roster-drawer\" (click)=\"toggleVisibility()\" [@drawerVisibility]=\"rosterState\">\r\n <div class=\"roster-drawer__button\" *ngIf=\"rosterState === 'shown'\">&raquo;</div>\r\n <div class=\"roster-drawer__button\" *ngIf=\"rosterState === 'hidden'\">&laquo;</div>\r\n</div>\r\n\r\n<div class=\"roster-list\" [@rosterVisibility]=\"rosterState\" [attr.data-ngx-chat-state]=\"chatService.state$ | async\">\r\n\r\n <div class=\"roster-header\">\r\n {{ chatService.translations.chat }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"(multiUserChatPlugin.rooms$ | async) as rooms\">\r\n <ng-container *ngIf=\"rooms.length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.rooms}}</div>\r\n\r\n <div class=\"contact-list-wrapper\">\r\n <ngx-chat-roster-recipient\r\n *ngFor=\"let room of rooms\"\r\n [recipient]=\"room\"\r\n (click)=\"onClickRecipient(room)\">\r\n </ngx-chat-roster-recipient>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(contacts | async).length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.contacts}}</div>\r\n\r\n <div class=\"contact-list-wrapper\">\r\n\r\n <ngx-chat-roster-recipient\r\n *ngFor=\"let contact of (contacts | async)\"\r\n [recipient]=\"contact\"\r\n (click)=\"onClickRecipient(contact)\">\r\n </ngx-chat-roster-recipient>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(contactRequestsReceived$ | async).length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.contactRequestIn}}</div>\r\n <div class=\"contact-list-wrapper\">\r\n\r\n <ngx-chat-roster-recipient\r\n *ngFor=\"let contact of (contactRequestsReceived$ | async)\"\r\n [recipient]=\"contact\"\r\n (click)=\"onClickRecipient(contact)\">\r\n </ngx-chat-roster-recipient>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(contactRequestsSent$ | async).length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.contactRequestOut}}</div>\r\n <div class=\"contact-list-wrapper\">\r\n\r\n <ngx-chat-roster-recipient\r\n *ngFor=\"let contact of (contactRequestsSent$ | async)\"\r\n [recipient]=\"contact\"\r\n (click)=\"onClickRecipient(contact)\">\r\n </ngx-chat-roster-recipient>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(contactsUnaffiliated$ | async).length > 0\">\r\n <div class=\"roster-group-header\">{{chatService.translations.contactsUnaffiliated}}</div>\r\n <div class=\"contact-list-wrapper\">\r\n\r\n <ng-container *ngFor=\"let contact of (contactsUnaffiliated$ | async)\">\r\n <ngx-chat-roster-recipient\r\n *ngIf=\"contact.messages.length > 0\"\r\n [recipient]=\"contact\"\r\n (click)=\"onClickRecipient(contact)\">\r\n </ngx-chat-roster-recipient>\r\n </ng-container>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"roster-list__empty\" *ngIf=\"hasNoContacts$ | async\">\r\n {{chatService.translations.noContacts}}\r\n </div>\r\n\r\n <ng-container *ngIf=\"chatService.enableDebugging\">\r\n <hr/>\r\n\r\n <div class=\"contact-pending-request-received-wrapper\">\r\n debug contact requests in:\r\n <div class=\"contact-pending-request-received\" *ngFor=\"let request of (chatService.contactRequestsReceived$ | async)\">\r\n {{request.name}}\r\n </div>\r\n </div>\r\n\r\n <hr/>\r\n\r\n <div class=\"contact-pending-request-sent-wrapper\">\r\n debug contact requests out:\r\n <div class=\"contact-pending-request-sent\" *ngFor=\"let request of (chatService.contactRequestsSent$ | async)\">\r\n {{request.name}}\r\n </div>\r\n </div>\r\n\r\n <hr/>\r\n\r\n <p>\r\n debug contacts (count: {{ (chatService.contacts$ | async).length }})<br/>\r\n </p>\r\n <p *ngFor=\"let contact of (chatService.contacts$|async)\" style=\"margin-bottom: 1em\">\r\n <em>{{contact.name}}:</em><br/>\r\n subscription={{contact.subscription$ | async}}<br/>\r\n presence={{contact.presence$ | async}}<br/>\r\n pendingIn={{contact.pendingIn$ | async}}<br/>\r\n pendingOut={{contact.pendingOut$ | async}}\r\n </p>\r\n <p class=\"roster-debug-state\">state: {{chatService.state$ | async}}</p>\r\n </ng-container>\r\n\r\n <!--\r\n <div class=\"roster-footer\">\r\n </div>\r\n -->\r\n</div>\r\n", animations: [ trigger('rosterVisibility', [ state('hidden', style({ right: '-14em', })), state('shown', style({ right: '0em', })), transition('hidden => shown', animate('400ms ease')), transition('shown => hidden', animate('400ms ease')) ]), trigger('drawerVisibility', [ state('hidden', style({ right: '0em', })), state('shown', style({ right: '14em', })), transition('hidden => shown', animate('400ms ease')), transition('shown => hidden', animate('400ms ease')) ]) ], styles: ["@keyframes ngx-chat-message-in{0%{transform:translate(50px);opacity:0}to{transform:none;opacity:1}}@keyframes ngx-chat-message-out{0%{transform:translate(-50px);opacity:0}to{transform:none;opacity:1}}.messageItem{background-color:red;width:100%;border-radius:2px}*{box-sizing:border-box;margin:0;padding:0;font-family:\"Helvetica\",\"Arial\",serif}.roster-list{position:fixed;top:0;bottom:0;right:0;width:14em;overflow-y:auto;border-left:1px solid #e1e1e1;z-index:80;margin-left:10px;background-color:#f5f5f5;text-align:left;padding:.5em .5em 0;display:flex;flex-direction:column}.roster-list .roster-header{text-align:center;margin-bottom:1em}.roster-list .roster-group-header{border-bottom:1px solid #e1e1e1;padding-bottom:.5em}.roster-list .roster-footer{border-top:1px solid #e1e1e1;width:14em;padding-top:.5em}.roster-list .contact-list-wrapper{margin-bottom:1em}.roster-list ngx-chat-roster-recipient{display:block;padding:.5em}.roster-list ngx-chat-roster-recipient:hover{background-color:#e8e8e8;cursor:pointer}.roster-list__empty{color:#999;text-align:center;margin-top:.5em;font-size:1.5em}.roster-drawer{top:0;bottom:0;right:14em;width:1em;position:fixed;z-index:80;cursor:pointer}.roster-drawer:hover{background-color:#1e1e1e33}.roster-drawer__button{top:50%;color:transparent;background-color:transparent;position:fixed;margin-left:.4rem}.roster-drawer:hover .roster-drawer__button{color:#fff}\n"] },] } ]; RosterListComponent.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [CHAT_SERVICE_TOKEN,] }] }, { type: ChatListStateService } ]; RosterListComponent.propDecorators = { rosterState: [{ type: Input }], contacts: [{ type: Input }], contactRequestsReceived$: [{ type: Input }], contactRequestsSent$: [{ type: Input }], contactsUnaffiliated$: [{ type: Input }], rosterStateChanged: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9zdGVyLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF6em5ldHdvcmsvbmd4LWNoYXQvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1saXN0L3Jvc3Rlci1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxhQUFhLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBZSxNQUFNLDZCQUE2QixDQUFDO0FBNkI5RSxNQUFNLE9BQU8sbUJBQW1CO0lBd0I1QixZQUErQyxXQUF3QixFQUNuRCxlQUFxQztRQURWLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ25ELG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUx6RCx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQU14RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQztTQUN4RDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDaEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUM7U0FDN0U7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM3QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQztTQUN2RTtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRO1lBQ2IsSUFBSSxDQUFDLHdCQUF3QjtZQUM3QixJQUFJLENBQUMsb0JBQW9CO1lBQ3pCLElBQUksQ0FBQyxxQkFBcUI7U0FDN0IsQ0FBQyxDQUFDLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUNqSSxDQUFDO0lBQ04sQ0FBQztJQUVELGdCQUFnQixDQUFDLFNBQW9CO1FBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxnQkFBZ0I7UUFDWixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbkUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxDQUFDOzs7WUF0RkosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLGkrSkFBMkM7Z0JBRTNDLFVBQVUsRUFBRTtvQkFDUixPQUFPLENBQUMsa0JBQWtCLEVBQUU7d0JBQ3hCLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDOzRCQUNsQixLQUFLLEVBQUUsT0FBTzt5QkFDakIsQ0FBQyxDQUFDO3dCQUNILEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDOzRCQUNqQixLQUFLLEVBQUUsS0FBSzt5QkFDZixDQUFDLENBQUM7d0JBQ0gsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDcEQsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDdkQsQ0FBQztvQkFDRixPQUFPLENBQUMsa0JBQWtCLEVBQUU7d0JBQ3hCLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDOzRCQUNsQixLQUFLLEVBQUUsS0FBSzt5QkFDZixDQUFDLENBQUM7d0JBQ0gsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7NEJBQ2pCLEtBQUssRUFBRSxNQUFNO3lCQUNoQixDQUFDLENBQUM7d0JBQ0gsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDcEQsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDdkQsQ0FBQztpQkFDTDs7YUFDSjs7OzRDQXlCZ0IsTUFBTSxTQUFDLGtCQUFrQjtZQXREakMsb0JBQW9COzs7MEJBZ0N4QixLQUFLO3VCQUdMLEtBQUs7dUNBR0wsS0FBSzttQ0FHTCxLQUFLO29DQUdMLEtBQUs7aUNBS0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbnRhY3QgfSBmcm9tICcuLi8uLi9jb3JlL2NvbnRhY3QnO1xyXG5pbXBvcnQgeyBSZWNpcGllbnQgfSBmcm9tICcuLi8uLi9jb3JlL3JlY2lwaWVudCc7XHJcbmltcG9ydCB7IE11bHRpVXNlckNoYXRQbHVnaW4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hZGFwdGVycy94bXBwL3BsdWdpbnMvbXVsdGktdXNlci1jaGF0LnBsdWdpbic7XHJcbmltcG9ydCB7IENoYXRMaXN0U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhdC1saXN0LXN0YXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDSEFUX1NFUlZJQ0VfVE9LRU4sIENoYXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhdC1zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICduZ3gtY2hhdC1yb3N0ZXItbGlzdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcm9zdGVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vcm9zdGVyLWxpc3QuY29tcG9uZW50Lmxlc3MnXSxcclxuICAgIGFuaW1hdGlvbnM6IFtcclxuICAgICAgICB0cmlnZ2VyKCdyb3N0ZXJWaXNpYmlsaXR5JywgW1xyXG4gICAgICAgICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoe1xyXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICctMTRlbScsXHJcbiAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgc3RhdGUoJ3Nob3duJywgc3R5bGUoe1xyXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcwZW0nLFxyXG4gICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiBzaG93bicsIGFuaW1hdGUoJzQwMG1zIGVhc2UnKSksXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3Nob3duID0+IGhpZGRlbicsIGFuaW1hdGUoJzQwMG1zIGVhc2UnKSlcclxuICAgICAgICBdKSxcclxuICAgICAgICB0cmlnZ2VyKCdkcmF3ZXJWaXNpYmlsaXR5JywgW1xyXG4gICAgICAgICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoe1xyXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcwZW0nLFxyXG4gICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgIHN0YXRlKCdzaG93bicsIHN0eWxlKHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnMTRlbScsXHJcbiAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHNob3duJywgYW5pbWF0ZSgnNDAwbXMgZWFzZScpKSxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignc2hvd24gPT4gaGlkZGVuJywgYW5pbWF0ZSgnNDAwbXMgZWFzZScpKVxyXG4gICAgICAgIF0pXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSb3N0ZXJMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcm9zdGVyU3RhdGU6ICdoaWRkZW4nIHwgJ3Nob3duJztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY29udGFjdHM6IE9ic2VydmFibGU8Q29udGFjdFtdPjtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY29udGFjdFJlcXVlc3RzUmVjZWl2ZWQkOiBPYnNlcnZhYmxlPENvbnRhY3RbXT47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGNvbnRhY3RSZXF1ZXN0c1NlbnQkOiBPYnNlcnZhYmxlPENvbnRhY3RbXT47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGNvbnRhY3RzVW5hZmZpbGlhdGVkJDogT2JzZXJ2YWJsZTxDb250YWN0W10+O1xyXG5cclxuICAgIGhhc05vQ29udGFjdHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcm9zdGVyU3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjwnaGlkZGVuJyB8ICdzaG93bic+KCk7XHJcblxyXG4gICAgbXVsdGlVc2VyQ2hhdFBsdWdpbjogTXVsdGlVc2VyQ2hhdFBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KENIQVRfU0VSVklDRV9UT0tFTikgcHVibGljIGNoYXRTZXJ2aWNlOiBDaGF0U2VydmljZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgY2hhdExpc3RTZXJ2aWNlOiBDaGF0TGlzdFN0YXRlU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMubXVsdGlVc2VyQ2hhdFBsdWdpbiA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0UGx1Z2luKE11bHRpVXNlckNoYXRQbHVnaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWN0cykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gdGhpcy5jaGF0U2VydmljZS5jb250YWN0c1N1YnNjcmliZWQkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuY29udGFjdFJlcXVlc3RzUmVjZWl2ZWQkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFjdFJlcXVlc3RzUmVjZWl2ZWQkID0gdGhpcy5jaGF0U2VydmljZS5jb250YWN0UmVxdWVzdHNSZWNlaXZlZCQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5jb250YWN0UmVxdWVzdHNTZW50JCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RSZXF1ZXN0c1NlbnQkID0gdGhpcy5jaGF0U2VydmljZS5jb250YWN0UmVxdWVzdHNTZW50JDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhY3RzVW5hZmZpbGlhdGVkJCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzVW5hZmZpbGlhdGVkJCA9IHRoaXMuY2hhdFNlcnZpY2UuY29udGFjdHNVbmFmZmlsaWF0ZWQkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhc05vQ29udGFjdHMkID0gY29tYmluZUxhdGVzdChbXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFjdHMsXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFjdFJlcXVlc3RzUmVjZWl2ZWQkLFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RSZXF1ZXN0c1NlbnQkLFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzVW5hZmZpbGlhdGVkJCxcclxuICAgICAgICBdKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKFtjb250YWN0cywgcmVjZWl2ZWQsIHNlbnQsIHVuYWZmaWxpYXRlZF0pID0+IGNvbnRhY3RzLmxlbmd0aCArIHJlY2VpdmVkLmxlbmd0aCArIHNlbnQubGVuZ3RoICsgdW5hZmZpbGlhdGVkLmxlbmd0aCA9PT0gMClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2tSZWNpcGllbnQocmVjaXBpZW50OiBSZWNpcGllbnQpIHtcclxuICAgICAgICB0aGlzLmNoYXRMaXN0U2VydmljZS5vcGVuQ2hhdChyZWNpcGllbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZVZpc2liaWxpdHkoKSB7XHJcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnJvc3RlclN0YXRlID09PSAnc2hvd24nID8gJ2hpZGRlbicgOiAnc2hvd24nO1xyXG4gICAgICAgIHRoaXMucm9zdGVyU3RhdGVDaGFuZ2VkLmVtaXQobmV3U3RhdGUpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=