@muraai/mnl-chat 0.0.1-alpha-82b7eb9 → 0.0.1-alpha-51e7ded
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/lib/chat.module.mjs +19 -19
- package/esm2022/lib/components/ng-chat/ng-chat.component.mjs +588 -0
- package/esm2022/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.mjs +128 -0
- package/esm2022/lib/components/ng-chat-options/ng-chat-options.component.mjs +29 -0
- package/esm2022/lib/components/ng-chat-window/ng-chat-window.component.mjs +247 -0
- package/esm2022/lib/core/message-counter.mjs +25 -0
- package/{esm2020 → esm2022}/lib/firstLetter.pipe.mjs +5 -5
- package/esm2022/lib/material.module.mjs +60 -0
- package/{esm2020 → esm2022}/lib/pipes/emojify.pipe.mjs +4 -4
- package/esm2022/lib/pipes/group-message-display-name.pipe.mjs +24 -0
- package/esm2022/lib/pipes/linkfy.pipe.mjs +34 -0
- package/{esm2020 → esm2022}/lib/pipes/sanitize.pipe.mjs +5 -5
- package/{esm2020 → esm2022}/lib/services/chat.service.mjs +5 -5
- package/{fesm2020 → fesm2022}/muraai-mnl-chat.mjs +85 -85
- package/fesm2022/muraai-mnl-chat.mjs.map +1 -0
- package/lib/components/ng-chat/ng-chat.component.d.ts +1 -1
- package/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.d.ts +1 -1
- package/lib/components/ng-chat-options/ng-chat-options.component.d.ts +1 -1
- package/lib/components/ng-chat-window/ng-chat-window.component.d.ts +1 -1
- package/lib/material.module.d.ts +2 -2
- package/package.json +7 -13
- package/esm2020/lib/components/ng-chat/ng-chat.component.mjs +0 -588
- package/esm2020/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.mjs +0 -128
- package/esm2020/lib/components/ng-chat-options/ng-chat-options.component.mjs +0 -29
- package/esm2020/lib/components/ng-chat-window/ng-chat-window.component.mjs +0 -247
- package/esm2020/lib/core/message-counter.mjs +0 -25
- package/esm2020/lib/material.module.mjs +0 -60
- package/esm2020/lib/pipes/group-message-display-name.pipe.mjs +0 -24
- package/esm2020/lib/pipes/linkfy.pipe.mjs +0 -34
- package/fesm2015/muraai-mnl-chat.mjs +0 -1436
- package/fesm2015/muraai-mnl-chat.mjs.map +0 -1
- package/fesm2020/muraai-mnl-chat.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/core/chat-adapter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/chat-controller.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/chat-group-adapter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/chat-option.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/chat-participant-status-descriptor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/chat-participant-status.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/chat-participant-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/chat-participant.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/default-file-upload-adapter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/file-upload-adapter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/group.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/guid.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/localization.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/message-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/message.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/paged-history-chat-adapter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/participant-metadata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/participant-response.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/scroll-direction.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/theme.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/user.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/window.mjs +0 -0
- /package/{esm2020 → esm2022}/muraai-mnl-chat.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import { ChatParticipantStatus } from "../../core/chat-participant-status.enum";
|
|
4
|
+
import { MessageCounter } from "../../core/message-counter";
|
|
5
|
+
import { chatParticipantStatusDescriptor } from '../../core/chat-participant-status-descriptor';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/forms";
|
|
8
|
+
import * as i2 from "@angular/common";
|
|
9
|
+
import * as i3 from "../../pipes/sanitize.pipe";
|
|
10
|
+
import * as i4 from "../../firstLetter.pipe";
|
|
11
|
+
export class NgChatFriendsListComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.participantsInteractedWith = [];
|
|
14
|
+
this.onParticipantClicked = new EventEmitter();
|
|
15
|
+
this.onOptionPromptCanceled = new EventEmitter();
|
|
16
|
+
this.onOptionPromptConfirmed = new EventEmitter();
|
|
17
|
+
this.hideFriendsList = false;
|
|
18
|
+
this.onCloseWindowClick = new EventEmitter();
|
|
19
|
+
this.selectedUsersFromFriendsList = [];
|
|
20
|
+
this.searchInput = '';
|
|
21
|
+
// Exposes enums and functions for the ng-template
|
|
22
|
+
this.ChatParticipantStatus = ChatParticipantStatus;
|
|
23
|
+
this.chatParticipantStatusDescriptor = chatParticipantStatusDescriptor;
|
|
24
|
+
this.cleanUpUserSelection = () => this.selectedUsersFromFriendsList = [];
|
|
25
|
+
}
|
|
26
|
+
ngOnChanges(changes) {
|
|
27
|
+
if (this.currentActiveOption) {
|
|
28
|
+
const currentOptionTriggeredBy = this.currentActiveOption && this.currentActiveOption.chattingTo.participant.id;
|
|
29
|
+
const isActivatedUserInSelectedList = (this.selectedUsersFromFriendsList.filter(item => item.id == currentOptionTriggeredBy)).length > 0;
|
|
30
|
+
if (!isActivatedUserInSelectedList) {
|
|
31
|
+
this.selectedUsersFromFriendsList = this.selectedUsersFromFriendsList.concat(this.currentActiveOption.chattingTo.participant);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// let input = user.displayName;
|
|
35
|
+
// let parts = input.split(" ");
|
|
36
|
+
// let firstLetter = parts[0];
|
|
37
|
+
// let secondLetters = parts[1].slice(0, 2);
|
|
38
|
+
}
|
|
39
|
+
get filteredParticipants() {
|
|
40
|
+
if (this.searchInput.length > 0) {
|
|
41
|
+
// Searches in the friend list by the inputted search string
|
|
42
|
+
return this.participants.filter(x => x.displayName.toUpperCase().includes(this.searchInput.toUpperCase()));
|
|
43
|
+
}
|
|
44
|
+
console.log("this.participants", this.participants);
|
|
45
|
+
return this.participants;
|
|
46
|
+
}
|
|
47
|
+
isUserSelectedFromFriendsList(user) {
|
|
48
|
+
return (this.selectedUsersFromFriendsList.filter(item => item.id == user.id)).length > 0;
|
|
49
|
+
}
|
|
50
|
+
unreadMessagesTotalByParticipant(participant) {
|
|
51
|
+
let openedWindow = this.windows.find(x => x.participant.id == participant.id);
|
|
52
|
+
if (openedWindow) {
|
|
53
|
+
return MessageCounter.unreadMessagesTotal(openedWindow, this.userId);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
let totalUnreadMessages = this.participantsResponse
|
|
57
|
+
.filter(x => x.participant.id == participant.id && !this.participantsInteractedWith.find(u => u.id == participant.id) && x.metadata && x.metadata.totalUnreadMessages > 0)
|
|
58
|
+
.map((participantResponse) => {
|
|
59
|
+
return participantResponse.metadata.totalUnreadMessages;
|
|
60
|
+
})[0];
|
|
61
|
+
return MessageCounter.formatUnreadMessagesTotal(totalUnreadMessages);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Toggle friends list visibility
|
|
65
|
+
onChatTitleClicked() {
|
|
66
|
+
this.isCollapsed = !this.isCollapsed;
|
|
67
|
+
}
|
|
68
|
+
onFriendsListCheckboxChange(selectedUser, isChecked) {
|
|
69
|
+
if (isChecked) {
|
|
70
|
+
this.selectedUsersFromFriendsList.push(selectedUser);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.selectedUsersFromFriendsList.splice(this.selectedUsersFromFriendsList.indexOf(selectedUser), 1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
onUserClick(clickedUser) {
|
|
77
|
+
this.onParticipantClicked.emit(clickedUser);
|
|
78
|
+
}
|
|
79
|
+
onFriendsListActionCancelClicked() {
|
|
80
|
+
this.onOptionPromptCanceled.emit();
|
|
81
|
+
this.cleanUpUserSelection();
|
|
82
|
+
}
|
|
83
|
+
onFriendsListActionConfirmClicked() {
|
|
84
|
+
this.onOptionPromptConfirmed.emit(this.selectedUsersFromFriendsList);
|
|
85
|
+
this.cleanUpUserSelection();
|
|
86
|
+
}
|
|
87
|
+
onCloseWindow() {
|
|
88
|
+
this.onCloseWindowClick.emit(true);
|
|
89
|
+
console.log('hoi latest friendlist', this.shouldDisplay);
|
|
90
|
+
}
|
|
91
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NgChatFriendsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
92
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: NgChatFriendsListComponent, selector: "ng-chat-friends-list", inputs: { participants: "participants", participantsResponse: "participantsResponse", participantsInteractedWith: "participantsInteractedWith", windows: "windows", userId: "userId", localization: "localization", shouldDisplay: "shouldDisplay", isCollapsed: "isCollapsed", searchEnabled: "searchEnabled", currentActiveOption: "currentActiveOption", hideFriendsList: "hideFriendsList" }, outputs: { onParticipantClicked: "onParticipantClicked", onOptionPromptCanceled: "onOptionPromptCanceled", onOptionPromptConfirmed: "onOptionPromptConfirmed", onCloseWindowClick: "onCloseWindowClick" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"shouldDisplay\" id=\"ng-chat-people\" [ngClass]=\"{'primary-outline-color': true, 'primary-background': true, 'ng-chat-people-collapsed': isCollapsed}\">\n\t<a href=\"javascript:void(0);\" class=\"ng-chat-title secondary-background shadowed\" (click)=\"onChatTitleClicked()\">\n\t\t<span>\n\t\t\t{{localization.title}}\n\t\t</span>\n\t<a href=\"javascript:void(0);\" class=\" ng-chat-close \" (click)=\"onCloseWindow()\" >✕</a>\n\t</a>\n\t<div *ngIf=\"currentActiveOption\" class=\"ng-chat-people-actions\" (click)=\"onFriendsListActionCancelClicked()\">\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-people-action\">\n\t\t\t<i class=\"remove-icon\"></i>\n\t\t</a>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-people-action\" (click)=\"onFriendsListActionConfirmClicked()\">\n\t\t\t<i class=\"check-icon\"></i>\n\t\t</a>\n\t</div>\n\t<input *ngIf=\"searchEnabled\" id=\"ng-chat-search_friend\" class=\"friends-search-bar\" type=\"search\" [placeholder]=\"localization.searchPlaceholder\" [(ngModel)]=\"searchInput\" />\n\t<ul id=\"ng-chat-users\" *ngIf=\"!isCollapsed\" [ngClass]=\"{'offset-search': searchEnabled}\">\n\t\t<li *ngFor=\"let user of filteredParticipants\">\n\t\t\t<input \n\t\t\t\t*ngIf=\"currentActiveOption && currentActiveOption.validateContext(user)\" \n\t\t\t\ttype=\"checkbox\" \n\t\t\t\tclass=\"ng-chat-users-checkbox\" \n\t\t\t\t(change)=\"onFriendsListCheckboxChange(user, $event.target.checked)\" \n\t\t\t\t[checked]=\"isUserSelectedFromFriendsList(user)\"/>\n\t\t\t<div [ngClass]=\"{'ng-chat-friends-list-selectable-offset': currentActiveOption, 'ng-chat-friends-list-container': true}\" (click)=\"onUserClick(user)\">\n\t\t\t\t<!-- <div *ngIf=\"!user.avatar\" class=\"icon-wrapper\">\n\t\t\t\t\t<i class=\"user-icon\"></i>\n\t\t\t\t</div> -->\n\t\t\t\t<div class=\"user\" *ngIf=\"!user.avatar\">\n\t\t\t\t\t{{user.displayName|firstLetterPipe}}\n\n\t\t\t\t</div>\n\n\t\t\t\t<img *ngIf=\"user.avatar\" alt=\"\" class=\"avatar\" height=\"30\" width=\"30\" [src]=\"user.avatar | sanitize\"/>\n\t\t\t\t<div class=\"\"></div>\n\t\t\t\t<strong title=\"{{user.displayName}}\">{{user.displayName}}</strong>\n\t\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': user.status === ChatParticipantStatus.Online, 'busy': user.status === ChatParticipantStatus.Busy, 'away': user.status === ChatParticipantStatus.Away, 'offline': user.status === ChatParticipantStatus.Offline}\" title=\"{{chatParticipantStatusDescriptor(user.status, localization)}}\"></span>\n\t\t\t\t<span *ngIf=\"unreadMessagesTotalByParticipant(user).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotalByParticipant(user)}}</span>\n\t\t\t</div>\n\t\t</li>\n\t</ul>\n</div>", styles: ["#ng-chat-people{position:relative;width:240px;height:360px;border-width:1px;border-style:solid;margin-right:20px;box-shadow:0 4px 8px #00000040;border-bottom:0;border-radius:10px!important;box-sizing:border-box!important;overflow:hidden!important;margin-bottom:10px!important;border:1px solid grey!important}#ng-chat-people.ng-chat-people-collapsed{height:30px}#ng-chat-search_friend{display:block;padding:7px 10px;margin:10px auto 0;width:calc(100% - 20px);font-size:.9em;border-radius:20px!important;border:.5px solid grey!important}#ng-chat-users{padding:0 10px;list-style:none;margin:0;overflow:auto;position:absolute;top:42px;bottom:0;width:100%;box-sizing:border-box}#ng-chat-users.offset-search{top:84px}#ng-chat-users .ng-chat-users-checkbox{float:left;margin-right:5px;margin-top:8px}#ng-chat-users li{clear:both;margin-bottom:10px;overflow:hidden;cursor:pointer;max-height:30px}#ng-chat-users li>.ng-chat-friends-list-selectable-offset{margin-left:22px}#ng-chat-users li .ng-chat-friends-list-container{display:inline-block;width:100%}#ng-chat-users li>.ng-chat-friends-list-selectable-offset.ng-chat-friends-list-container{display:block;width:auto}#ng-chat-users li .ng-chat-friends-list-container>img.avatar,#ng-chat-users li .ng-chat-friends-list-container>.user{float:left;display:flex;justify-content:center;margin-right:5px}#ng-chat-users li .ng-chat-friends-list-container>.user{overflow:hidden;width:30px;height:30px}#ng-chat-users li .ng-chat-friends-list-container>.user>i{color:#fff;transform:scale(.7)}#ng-chat-users li .ng-chat-friends-list-container>strong{float:left;line-height:30px;font-size:.8em;max-width:57%;max-height:30px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#ng-chat-users li .ng-chat-friends-list-container>.ng-chat-participant-status{float:right}.ng-chat-people-actions{position:absolute;top:4px;right:5px;margin:0;padding:0;z-index:2}.ng-chat-people-actions>a.ng-chat-people-action{display:inline-block;width:21px;height:21px;margin-right:8px;text-decoration:none;border:none;border-radius:25px;padding:1px}@media only screen and (max-width: 581px){#ng-chat-people{width:300px;height:360px;margin-right:0}}.user{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background-color:#00b04c;color:#fff;font-size:12px;font-family:inherit}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.SanitizePipe, name: "sanitize" }, { kind: "pipe", type: i4.FirstLetterPipe, name: "firstLetterPipe" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
93
|
+
}
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NgChatFriendsListComponent, decorators: [{
|
|
95
|
+
type: Component,
|
|
96
|
+
args: [{ selector: 'ng-chat-friends-list', encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"shouldDisplay\" id=\"ng-chat-people\" [ngClass]=\"{'primary-outline-color': true, 'primary-background': true, 'ng-chat-people-collapsed': isCollapsed}\">\n\t<a href=\"javascript:void(0);\" class=\"ng-chat-title secondary-background shadowed\" (click)=\"onChatTitleClicked()\">\n\t\t<span>\n\t\t\t{{localization.title}}\n\t\t</span>\n\t<a href=\"javascript:void(0);\" class=\" ng-chat-close \" (click)=\"onCloseWindow()\" >✕</a>\n\t</a>\n\t<div *ngIf=\"currentActiveOption\" class=\"ng-chat-people-actions\" (click)=\"onFriendsListActionCancelClicked()\">\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-people-action\">\n\t\t\t<i class=\"remove-icon\"></i>\n\t\t</a>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-people-action\" (click)=\"onFriendsListActionConfirmClicked()\">\n\t\t\t<i class=\"check-icon\"></i>\n\t\t</a>\n\t</div>\n\t<input *ngIf=\"searchEnabled\" id=\"ng-chat-search_friend\" class=\"friends-search-bar\" type=\"search\" [placeholder]=\"localization.searchPlaceholder\" [(ngModel)]=\"searchInput\" />\n\t<ul id=\"ng-chat-users\" *ngIf=\"!isCollapsed\" [ngClass]=\"{'offset-search': searchEnabled}\">\n\t\t<li *ngFor=\"let user of filteredParticipants\">\n\t\t\t<input \n\t\t\t\t*ngIf=\"currentActiveOption && currentActiveOption.validateContext(user)\" \n\t\t\t\ttype=\"checkbox\" \n\t\t\t\tclass=\"ng-chat-users-checkbox\" \n\t\t\t\t(change)=\"onFriendsListCheckboxChange(user, $event.target.checked)\" \n\t\t\t\t[checked]=\"isUserSelectedFromFriendsList(user)\"/>\n\t\t\t<div [ngClass]=\"{'ng-chat-friends-list-selectable-offset': currentActiveOption, 'ng-chat-friends-list-container': true}\" (click)=\"onUserClick(user)\">\n\t\t\t\t<!-- <div *ngIf=\"!user.avatar\" class=\"icon-wrapper\">\n\t\t\t\t\t<i class=\"user-icon\"></i>\n\t\t\t\t</div> -->\n\t\t\t\t<div class=\"user\" *ngIf=\"!user.avatar\">\n\t\t\t\t\t{{user.displayName|firstLetterPipe}}\n\n\t\t\t\t</div>\n\n\t\t\t\t<img *ngIf=\"user.avatar\" alt=\"\" class=\"avatar\" height=\"30\" width=\"30\" [src]=\"user.avatar | sanitize\"/>\n\t\t\t\t<div class=\"\"></div>\n\t\t\t\t<strong title=\"{{user.displayName}}\">{{user.displayName}}</strong>\n\t\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': user.status === ChatParticipantStatus.Online, 'busy': user.status === ChatParticipantStatus.Busy, 'away': user.status === ChatParticipantStatus.Away, 'offline': user.status === ChatParticipantStatus.Offline}\" title=\"{{chatParticipantStatusDescriptor(user.status, localization)}}\"></span>\n\t\t\t\t<span *ngIf=\"unreadMessagesTotalByParticipant(user).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotalByParticipant(user)}}</span>\n\t\t\t</div>\n\t\t</li>\n\t</ul>\n</div>", styles: ["#ng-chat-people{position:relative;width:240px;height:360px;border-width:1px;border-style:solid;margin-right:20px;box-shadow:0 4px 8px #00000040;border-bottom:0;border-radius:10px!important;box-sizing:border-box!important;overflow:hidden!important;margin-bottom:10px!important;border:1px solid grey!important}#ng-chat-people.ng-chat-people-collapsed{height:30px}#ng-chat-search_friend{display:block;padding:7px 10px;margin:10px auto 0;width:calc(100% - 20px);font-size:.9em;border-radius:20px!important;border:.5px solid grey!important}#ng-chat-users{padding:0 10px;list-style:none;margin:0;overflow:auto;position:absolute;top:42px;bottom:0;width:100%;box-sizing:border-box}#ng-chat-users.offset-search{top:84px}#ng-chat-users .ng-chat-users-checkbox{float:left;margin-right:5px;margin-top:8px}#ng-chat-users li{clear:both;margin-bottom:10px;overflow:hidden;cursor:pointer;max-height:30px}#ng-chat-users li>.ng-chat-friends-list-selectable-offset{margin-left:22px}#ng-chat-users li .ng-chat-friends-list-container{display:inline-block;width:100%}#ng-chat-users li>.ng-chat-friends-list-selectable-offset.ng-chat-friends-list-container{display:block;width:auto}#ng-chat-users li .ng-chat-friends-list-container>img.avatar,#ng-chat-users li .ng-chat-friends-list-container>.user{float:left;display:flex;justify-content:center;margin-right:5px}#ng-chat-users li .ng-chat-friends-list-container>.user{overflow:hidden;width:30px;height:30px}#ng-chat-users li .ng-chat-friends-list-container>.user>i{color:#fff;transform:scale(.7)}#ng-chat-users li .ng-chat-friends-list-container>strong{float:left;line-height:30px;font-size:.8em;max-width:57%;max-height:30px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#ng-chat-users li .ng-chat-friends-list-container>.ng-chat-participant-status{float:right}.ng-chat-people-actions{position:absolute;top:4px;right:5px;margin:0;padding:0;z-index:2}.ng-chat-people-actions>a.ng-chat-people-action{display:inline-block;width:21px;height:21px;margin-right:8px;text-decoration:none;border:none;border-radius:25px;padding:1px}@media only screen and (max-width: 581px){#ng-chat-people{width:300px;height:360px;margin-right:0}}.user{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background-color:#00b04c;color:#fff;font-size:12px;font-family:inherit}\n"] }]
|
|
97
|
+
}], ctorParameters: () => [], propDecorators: { participants: [{
|
|
98
|
+
type: Input
|
|
99
|
+
}], participantsResponse: [{
|
|
100
|
+
type: Input
|
|
101
|
+
}], participantsInteractedWith: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], windows: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], userId: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], localization: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], shouldDisplay: [{
|
|
110
|
+
type: Input
|
|
111
|
+
}], isCollapsed: [{
|
|
112
|
+
type: Input
|
|
113
|
+
}], searchEnabled: [{
|
|
114
|
+
type: Input
|
|
115
|
+
}], currentActiveOption: [{
|
|
116
|
+
type: Input
|
|
117
|
+
}], onParticipantClicked: [{
|
|
118
|
+
type: Output
|
|
119
|
+
}], onOptionPromptCanceled: [{
|
|
120
|
+
type: Output
|
|
121
|
+
}], onOptionPromptConfirmed: [{
|
|
122
|
+
type: Output
|
|
123
|
+
}], hideFriendsList: [{
|
|
124
|
+
type: Input
|
|
125
|
+
}], onCloseWindowClick: [{
|
|
126
|
+
type: Output
|
|
127
|
+
}] } });
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2hhdC1mcmllbmRzLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC9zcmMvbGliL2NvbXBvbmVudHMvbmctY2hhdC1mcmllbmRzLWxpc3QvbmctY2hhdC1mcmllbmRzLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC9zcmMvbGliL2NvbXBvbmVudHMvbmctY2hhdC1mcmllbmRzLWxpc3QvbmctY2hhdC1mcmllbmRzLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBR3BILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBS2hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7O0FBUWhHLE1BQU0sT0FBTywwQkFBMEI7SUFDbkM7UUFXTywrQkFBMEIsR0FBdUIsRUFBRSxDQUFDO1FBd0JwRCx5QkFBb0IsR0FBbUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxRSwyQkFBc0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcvRCw0QkFBdUIsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRSxvQkFBZSxHQUFXLEtBQUssQ0FBRTtRQUdqQyx1QkFBa0IsR0FBeUIsSUFBSSxZQUFZLEVBQVcsQ0FBQTtRQUl0RSxpQ0FBNEIsR0FBVyxFQUFFLENBQUM7UUFFMUMsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFaEMsa0RBQWtEO1FBQzNDLDBCQUFxQixHQUFHLHFCQUFxQixD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QTFCLDBCQUEwQiw4cEJDbEJ2Qyw4dEZBeUNNOzsyRkR2Qk8sMEJBQTBCO2tCQU50QyxTQUFTOytCQUNJLHNCQUFzQixpQkFHakIsaUJBQWlCLENBQUMsSUFBSTt3REFROUIsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxvQkFBb0I7c0JBRDFCLEtBQUs7Z0JBSUMsMEJBQTBCO3NCQURoQyxLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLFdBQVc7c0JBRGpCLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBSUMsb0JBQW9CO3NCQUQxQixNQUFNO2dCQUlBLHNCQUFzQjtzQkFENUIsTUFBTTtnQkFJQSx1QkFBdUI7c0JBRDdCLE1BQU07Z0JBR0EsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdFbmNhcHN1bGF0aW9uLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2FsaXphdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7IElDaGF0T3B0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9jaGF0LW9wdGlvbic7XG5pbXBvcnQgeyBDaGF0UGFydGljaXBhbnRTdGF0dXMgfSBmcm9tIFwiLi4vLi4vY29yZS9jaGF0LXBhcnRpY2lwYW50LXN0YXR1cy5lbnVtXCI7XG5pbXBvcnQgeyBJQ2hhdFBhcnRpY2lwYW50IH0gZnJvbSBcIi4uLy4uL2NvcmUvY2hhdC1wYXJ0aWNpcGFudFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuLi8uLi9jb3JlL3VzZXJcIjtcbmltcG9ydCB7IFdpbmRvdyB9IGZyb20gXCIuLi8uLi9jb3JlL3dpbmRvd1wiO1xuaW1wb3J0IHsgUGFydGljaXBhbnRSZXNwb25zZSB9IGZyb20gXCIuLi8uLi9jb3JlL3BhcnRpY2lwYW50LXJlc3BvbnNlXCI7XG5pbXBvcnQgeyBNZXNzYWdlQ291bnRlciB9IGZyb20gXCIuLi8uLi9jb3JlL21lc3NhZ2UtY291bnRlclwiO1xuaW1wb3J0IHsgY2hhdFBhcnRpY2lwYW50U3RhdHVzRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NvcmUvY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMtZGVzY3JpcHRvcic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmctY2hhdC1mcmllbmRzLWxpc3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZy1jaGF0LWZyaWVuZHMtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmctY2hhdC1mcmllbmRzLWxpc3QuY29tcG9uZW50LmNzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgTmdDaGF0RnJpZW5kc0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgIFxuICAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYXJ0aWNpcGFudHM6IElDaGF0UGFydGljaXBhbnRbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHBhcnRpY2lwYW50c1Jlc3BvbnNlOiBQYXJ0aWNpcGFudFJlc3BvbnNlW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYXJ0aWNpcGFudHNJbnRlcmFjdGVkV2l0aDogSUNoYXRQYXJ0aWNpcGFudFtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aW5kb3dzOiBXaW5kb3dbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHVzZXJJZDogYW55O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbG9jYWxpemF0aW9uOiBMb2NhbGl6YXRpb247XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG91bGREaXNwbGF5OiBib29sZWFuO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXNDb2xsYXBzZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hFbmFibGVkOiBib29sZWFuO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VycmVudEFjdGl2ZU9wdGlvbjogSUNoYXRPcHRpb24gfCBudWxsO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUGFydGljaXBhbnRDbGlja2VkOiBFdmVudEVtaXR0ZXI8SUNoYXRQYXJ0aWNpcGFudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25PcHRpb25Qcm9tcHRDYW5jZWxlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25PcHRpb25Qcm9tcHRDb25maXJtZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhpZGVGcmllbmRzTGlzdDogYm9vbGVhbiA9ZmFsc2UgO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ2xvc2VXaW5kb3dDbGljazpFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KClcbiAgICBcbiAgIFxuXG4gICAgcHVibGljIHNlbGVjdGVkVXNlcnNGcm9tRnJpZW5kc0xpc3Q6IFVzZXJbXSA9IFtdO1xuXG4gICAgcHVibGljIHNlYXJjaElucHV0OiBzdHJpbmcgPSAnJztcblxuICAgIC8vIEV4cG9zZXMgZW51bXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIG5nLXRlbXBsYXRlXG4gICAgcHVibGljIENoYXRQYXJ0aWNpcGFudFN0YXR1cyA9IENoYXRQYXJ0aWNpcGFudFN0YXR1cztcbiAgICBwdWJsaWMgY2hhdFBhcnRpY2lwYW50U3RhdHVzRGVzY3JpcHRvciA9IGNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3I7XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRBY3RpdmVPcHRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcHRpb25UcmlnZ2VyZWRCeSA9IHRoaXMuY3VycmVudEFjdGl2ZU9wdGlvbiAmJiB0aGlzLmN1cnJlbnRBY3RpdmVPcHRpb24uY2hhdHRpbmdUby5wYXJ0aWNpcGFudC5pZDtcbiAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZhdGVkVXNlckluU2VsZWN0ZWRMaXN0ID0gKHRoaXMuc2VsZWN0ZWRVc2Vyc0Zyb21GcmllbmRzTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkID09IGN1cnJlbnRPcHRpb25UcmlnZ2VyZWRCeSkpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgICAgIGlmICghaXNBY3RpdmF0ZWRVc2VySW5TZWxlY3RlZExpc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcnNGcm9tRnJpZW5kc0xpc3QgPSB0aGlzLnNlbGVjdGVkVXNlcnNGcm9tRnJpZW5kc0xpc3QuY29uY2F0KHRoaXMuY3VycmVudEFjdGl2ZU9wdGlvbi5jaGF0dGluZ1RvLnBhcnRpY2lwYW50IGFzIFVzZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxldCBpbnB1dCA9IHVzZXIuZGlzcGxheU5hbWU7XG4gICAgICAgIC8vIGxldCBwYXJ0cyA9IGlucHV0LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgLy8gIGxldCBmaXJzdExldHRlciA9IHBhcnRzWzBdO1xuICAgICAgICAvLyAgbGV0IHNlY29uZExldHRlcnMgPSBwYXJ0c1sxXS5zbGljZSgwLCAyKTtcbiAgICB9XG5cbiAgICBnZXQgZmlsdGVyZWRQYXJ0aWNpcGFudHMoKTogSUNoYXRQYXJ0aWNpcGFudFtdXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIC8vIFNlYXJjaGVzIGluIHRoZSBmcmllbmQgbGlzdCBieSB0aGUgaW5wdXR0ZWQgc2VhcmNoIHN0cmluZ1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFydGljaXBhbnRzLmZpbHRlcih4ID0+IHguZGlzcGxheU5hbWUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaElucHV0LnRvVXBwZXJDYXNlKCkpKTtcbiAgICAgICAgfVxuY29uc29sZS5sb2coXCJ0aGlzLnBhcnRpY2lwYW50c1wiLHRoaXMucGFydGljaXBhbnRzKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJ0aWNpcGFudHM7XG4gICAgfVxuXG4gICAgaXNVc2VyU2VsZWN0ZWRGcm9tRnJpZW5kc0xpc3QodXNlcjogVXNlcikgOiBib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2VsZWN0ZWRVc2Vyc0Zyb21GcmllbmRzTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkID09IHVzZXIuaWQpKS5sZW5ndGggPiAwXG4gICAgfVxuXG4gICAgdW5yZWFkTWVzc2FnZXNUb3RhbEJ5UGFydGljaXBhbnQocGFydGljaXBhbnQ6IElDaGF0UGFydGljaXBhbnQpOiBzdHJpbmdcbiAgICB7XG4gICAgICAgIGxldCBvcGVuZWRXaW5kb3cgPSB0aGlzLndpbmRvd3MuZmluZCh4ID0+IHgucGFydGljaXBhbnQuaWQgPT0gcGFydGljaXBhbnQuaWQpO1xuXG4gICAgICAgIGlmIChvcGVuZWRXaW5kb3cpe1xuICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb3VudGVyLnVucmVhZE1lc3NhZ2VzVG90YWwob3BlbmVkV2luZG93LCB0aGlzLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgdG90YWxVbnJlYWRNZXNzYWdlcyA9IHRoaXMucGFydGljaXBhbnRzUmVzcG9uc2VcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHggPT4geC5wYXJ0aWNpcGFudC5pZCA9PSBwYXJ0aWNpcGFudC5pZCAmJiAhdGhpcy5wYXJ0aWNpcGFudHNJbnRlcmFjdGVkV2l0aC5maW5kKHUgPT4gdS5pZCA9PSBwYXJ0aWNpcGFudC5pZCkgJiYgeC5tZXRhZGF0YSAmJiB4Lm1ldGFkYXRhLnRvdGFsVW5yZWFkTWVzc2FnZXMgPiAwKVxuICAgICAgICAgICAgICAgIC5tYXAoKHBhcnRpY2lwYW50UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpY2lwYW50UmVzcG9uc2UubWV0YWRhdGEudG90YWxVbnJlYWRNZXNzYWdlc1xuICAgICAgICAgICAgICAgIH0pWzBdO1xuXG4gICAgICAgICAgICByZXR1cm4gTWVzc2FnZUNvdW50ZXIuZm9ybWF0VW5yZWFkTWVzc2FnZXNUb3RhbCh0b3RhbFVucmVhZE1lc3NhZ2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFuVXBVc2VyU2VsZWN0aW9uID0gKCkgPT4gdGhpcy5zZWxlY3RlZFVzZXJzRnJvbUZyaWVuZHNMaXN0ID0gW107XG5cbiAgICAvLyBUb2dnbGUgZnJpZW5kcyBsaXN0IHZpc2liaWxpdHlcbiAgICBvbkNoYXRUaXRsZUNsaWNrZWQoKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5pc0NvbGxhcHNlZCA9ICF0aGlzLmlzQ29sbGFwc2VkO1xuICAgIH1cblxuICAgIG9uRnJpZW5kc0xpc3RDaGVja2JveENoYW5nZShzZWxlY3RlZFVzZXI6IFVzZXIsIGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzRnJvbUZyaWVuZHNMaXN0LnB1c2goc2VsZWN0ZWRVc2VyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2Vyc0Zyb21GcmllbmRzTGlzdC5zcGxpY2UodGhpcy5zZWxlY3RlZFVzZXJzRnJvbUZyaWVuZHNMaXN0LmluZGV4T2Yoc2VsZWN0ZWRVc2VyKSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblVzZXJDbGljayhjbGlja2VkVXNlcjogVXNlcik6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMub25QYXJ0aWNpcGFudENsaWNrZWQuZW1pdChjbGlja2VkVXNlcik7XG4gICAgfVxuXG4gICAgb25GcmllbmRzTGlzdEFjdGlvbkNhbmNlbENsaWNrZWQoKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5vbk9wdGlvblByb21wdENhbmNlbGVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5jbGVhblVwVXNlclNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIG9uRnJpZW5kc0xpc3RBY3Rpb25Db25maXJtQ2xpY2tlZCgpIDogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5vbk9wdGlvblByb21wdENvbmZpcm1lZC5lbWl0KHRoaXMuc2VsZWN0ZWRVc2Vyc0Zyb21GcmllbmRzTGlzdCk7XG4gICAgICAgIHRoaXMuY2xlYW5VcFVzZXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgb25DbG9zZVdpbmRvdygpe1xuICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICB0aGlzLm9uQ2xvc2VXaW5kb3dDbGljay5lbWl0KHRydWUpXG5cbiAgICAgICAgY29uc29sZS5sb2coJ2hvaSBsYXRlc3QgZnJpZW5kbGlzdCcsdGhpcy5zaG91bGREaXNwbGF5KVxuXG4gICAgICAgIFxuICAgIH1cblxufVxuLyogZXNsaW50LWVuYWJsZSAqLyIsIjxkaXYgKm5nSWY9XCJzaG91bGREaXNwbGF5XCIgaWQ9XCJuZy1jaGF0LXBlb3BsZVwiIFtuZ0NsYXNzXT1cInsncHJpbWFyeS1vdXRsaW5lLWNvbG9yJzogdHJ1ZSwgJ3ByaW1hcnktYmFja2dyb3VuZCc6IHRydWUsICduZy1jaGF0LXBlb3BsZS1jb2xsYXBzZWQnOiBpc0NvbGxhcHNlZH1cIj5cblx0PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cIm5nLWNoYXQtdGl0bGUgc2Vjb25kYXJ5LWJhY2tncm91bmQgc2hhZG93ZWRcIiAoY2xpY2spPVwib25DaGF0VGl0bGVDbGlja2VkKClcIj5cblx0XHQ8c3Bhbj5cblx0XHRcdHt7bG9jYWxpemF0aW9uLnRpdGxlfX1cblx0XHQ8L3NwYW4+XG5cdDxhICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIGNsYXNzPVwiIG5nLWNoYXQtY2xvc2UgXCIgKGNsaWNrKT1cIm9uQ2xvc2VXaW5kb3coKVwiID4mI3gyNzE1OzwvYT5cblx0PC9hPlxuXHQ8ZGl2ICpuZ0lmPVwiY3VycmVudEFjdGl2ZU9wdGlvblwiIGNsYXNzPVwibmctY2hhdC1wZW9wbGUtYWN0aW9uc1wiIChjbGljayk9XCJvbkZyaWVuZHNMaXN0QWN0aW9uQ2FuY2VsQ2xpY2tlZCgpXCI+XG5cdFx0PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cIm5nLWNoYXQtcGVvcGxlLWFjdGlvblwiPlxuXHRcdFx0PGkgY2xhc3M9XCJyZW1vdmUtaWNvblwiPjwvaT5cblx0XHQ8L2E+XG5cdFx0PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cIm5nLWNoYXQtcGVvcGxlLWFjdGlvblwiIChjbGljayk9XCJvbkZyaWVuZHNMaXN0QWN0aW9uQ29uZmlybUNsaWNrZWQoKVwiPlxuXHRcdFx0PGkgY2xhc3M9XCJjaGVjay1pY29uXCI+PC9pPlxuXHRcdDwvYT5cblx0PC9kaXY+XG5cdDxpbnB1dCAqbmdJZj1cInNlYXJjaEVuYWJsZWRcIiBpZD1cIm5nLWNoYXQtc2VhcmNoX2ZyaWVuZFwiIGNsYXNzPVwiZnJpZW5kcy1zZWFyY2gtYmFyXCIgdHlwZT1cInNlYXJjaFwiIFtwbGFjZWhvbGRlcl09XCJsb2NhbGl6YXRpb24uc2VhcmNoUGxhY2Vob2xkZXJcIiBbKG5nTW9kZWwpXT1cInNlYXJjaElucHV0XCIgLz5cblx0PHVsIGlkPVwibmctY2hhdC11c2Vyc1wiICpuZ0lmPVwiIWlzQ29sbGFwc2VkXCIgW25nQ2xhc3NdPVwieydvZmZzZXQtc2VhcmNoJzogc2VhcmNoRW5hYmxlZH1cIj5cblx0XHQ8bGkgKm5nRm9yPVwibGV0IHVzZXIgb2YgZmlsdGVyZWRQYXJ0aWNpcGFudHNcIj5cblx0XHRcdDxpbnB1dCBcblx0XHRcdFx0Km5nSWY9XCJjdXJyZW50QWN0aXZlT3B0aW9uICYmIGN1cnJlbnRBY3RpdmVPcHRpb24udmFsaWRhdGVDb250ZXh0KHVzZXIpXCIgXG5cdFx0XHRcdHR5cGU9XCJjaGVja2JveFwiIFxuXHRcdFx0XHRjbGFzcz1cIm5nLWNoYXQtdXNlcnMtY2hlY2tib3hcIiBcblx0XHRcdFx0KGNoYW5nZSk9XCJvbkZyaWVuZHNMaXN0Q2hlY2tib3hDaGFuZ2UodXNlciwgJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiIFxuXHRcdFx0XHRbY2hlY2tlZF09XCJpc1VzZXJTZWxlY3RlZEZyb21GcmllbmRzTGlzdCh1c2VyKVwiLz5cblx0XHRcdDxkaXYgW25nQ2xhc3NdPVwieyduZy1jaGF0LWZyaWVuZHMtbGlzdC1zZWxlY3RhYmxlLW9mZnNldCc6IGN1cnJlbnRBY3RpdmVPcHRpb24sICduZy1jaGF0LWZyaWVuZHMtbGlzdC1jb250YWluZXInOiB0cnVlfVwiIChjbGljayk9XCJvblVzZXJDbGljayh1c2VyKVwiPlxuXHRcdFx0XHQ8IS0tIDxkaXYgKm5nSWY9XCIhdXNlci5hdmF0YXJcIiBjbGFzcz1cImljb24td3JhcHBlclwiPlxuXHRcdFx0XHRcdDxpIGNsYXNzPVwidXNlci1pY29uXCI+PC9pPlxuXHRcdFx0XHQ8L2Rpdj4gLS0+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJ1c2VyXCIgKm5nSWY9XCIhdXNlci5hdmF0YXJcIj5cblx0XHRcdFx0XHR7e3VzZXIuZGlzcGxheU5hbWV8Zmlyc3RMZXR0ZXJQaXBlfX1cblxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8aW1nICpuZ0lmPVwidXNlci5hdmF0YXJcIiBhbHQ9XCJcIiBjbGFzcz1cImF2YXRhclwiIGhlaWdodD1cIjMwXCIgd2lkdGg9XCIzMFwiICBbc3JjXT1cInVzZXIuYXZhdGFyIHwgc2FuaXRpemVcIi8+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJcIj48L2Rpdj5cblx0XHRcdFx0PHN0cm9uZyB0aXRsZT1cInt7dXNlci5kaXNwbGF5TmFtZX19XCI+e3t1c2VyLmRpc3BsYXlOYW1lfX08L3N0cm9uZz5cblx0XHRcdFx0PHNwYW4gW25nQ2xhc3NdPVwieyduZy1jaGF0LXBhcnRpY2lwYW50LXN0YXR1cyc6IHRydWUsICdvbmxpbmUnOiB1c2VyLnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLk9ubGluZSwgJ2J1c3knOiB1c2VyLnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLkJ1c3ksICdhd2F5JzogdXNlci5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5Bd2F5LCAnb2ZmbGluZSc6IHVzZXIuc3RhdHVzID09PSBDaGF0UGFydGljaXBhbnRTdGF0dXMuT2ZmbGluZX1cIiB0aXRsZT1cInt7Y2hhdFBhcnRpY2lwYW50U3RhdHVzRGVzY3JpcHRvcih1c2VyLnN0YXR1cywgbG9jYWxpemF0aW9uKX19XCI+PC9zcGFuPlxuXHRcdFx0XHQ8c3BhbiAqbmdJZj1cInVucmVhZE1lc3NhZ2VzVG90YWxCeVBhcnRpY2lwYW50KHVzZXIpLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm5nLWNoYXQtdW5yZWFkLW1lc3NhZ2VzLWNvdW50IHVucmVhZC1tZXNzYWdlcy1jb3VudGVyLWNvbnRhaW5lciBwcmltYXJ5LXRleHRcIj57e3VucmVhZE1lc3NhZ2VzVG90YWxCeVBhcnRpY2lwYW50KHVzZXIpfX08L3NwYW4+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2xpPlxuXHQ8L3VsPlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class NgChatOptionsComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.activeOptionTrackerChange = new EventEmitter();
|
|
8
|
+
}
|
|
9
|
+
onOptionClicked(option) {
|
|
10
|
+
option.isActive = true;
|
|
11
|
+
if (option.action) {
|
|
12
|
+
option.action(option.chattingTo);
|
|
13
|
+
}
|
|
14
|
+
this.activeOptionTrackerChange.emit(option);
|
|
15
|
+
}
|
|
16
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NgChatOptionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: NgChatOptionsComponent, selector: "ng-chat-options", inputs: { options: "options", activeOptionTracker: "activeOptionTracker" }, outputs: { activeOptionTrackerChange: "activeOptionTrackerChange" }, ngImport: i0, template: "<div *ngIf=\"options && options.length > 0\" class=\"ng-chat-options\">\n\t\t<button class=\"ng-chat-options-activator\">\n\t\t\t<span class=\"primary-text\">...</span>\n\t\t</button>\n\t<div class=\"ng-chat-options-content primary-background shadowed\">\n\t\t<a *ngFor=\"let option of options; let i = index\" [ngClass]=\"'primary-text'\" (click)=\"onOptionClicked(option)\">\n\t\t\t{{option.displayLabel}}\n\t\t</a>\n\t</div> \n</div>\n", styles: [".ng-chat-options-activator{background-color:unset;color:#fff;line-height:28px;border:none;position:relative}.ng-chat-options-activator>span{position:relative;top:-5px;left:0}.ng-chat-options{position:relative;display:inline-block}.ng-chat-options:hover .ng-chat-options-content{display:block}.ng-chat-options:hover .ng-chat-options-activator{background-color:#ddd}.ng-chat-options-content{display:none;position:absolute;min-width:160px;z-index:1}.ng-chat-options-content a:hover{background-color:#ddd}.ng-chat-options-content a{padding:6px 16px;text-decoration:none;display:block}@media only screen and (max-width: 581px){.ng-chat-options-content{right:0}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
18
|
+
}
|
|
19
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NgChatOptionsComponent, decorators: [{
|
|
20
|
+
type: Component,
|
|
21
|
+
args: [{ selector: 'ng-chat-options', template: "<div *ngIf=\"options && options.length > 0\" class=\"ng-chat-options\">\n\t\t<button class=\"ng-chat-options-activator\">\n\t\t\t<span class=\"primary-text\">...</span>\n\t\t</button>\n\t<div class=\"ng-chat-options-content primary-background shadowed\">\n\t\t<a *ngFor=\"let option of options; let i = index\" [ngClass]=\"'primary-text'\" (click)=\"onOptionClicked(option)\">\n\t\t\t{{option.displayLabel}}\n\t\t</a>\n\t</div> \n</div>\n", styles: [".ng-chat-options-activator{background-color:unset;color:#fff;line-height:28px;border:none;position:relative}.ng-chat-options-activator>span{position:relative;top:-5px;left:0}.ng-chat-options{position:relative;display:inline-block}.ng-chat-options:hover .ng-chat-options-content{display:block}.ng-chat-options:hover .ng-chat-options-activator{background-color:#ddd}.ng-chat-options-content{display:none;position:absolute;min-width:160px;z-index:1}.ng-chat-options-content a:hover{background-color:#ddd}.ng-chat-options-content a{padding:6px 16px;text-decoration:none;display:block}@media only screen and (max-width: 581px){.ng-chat-options-content{right:0}}\n"] }]
|
|
22
|
+
}], ctorParameters: () => [], propDecorators: { options: [{
|
|
23
|
+
type: Input
|
|
24
|
+
}], activeOptionTracker: [{
|
|
25
|
+
type: Input
|
|
26
|
+
}], activeOptionTrackerChange: [{
|
|
27
|
+
type: Output
|
|
28
|
+
}] } });
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2hhdC1vcHRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQvc3JjL2xpYi9jb21wb25lbnRzL25nLWNoYXQtb3B0aW9ucy9uZy1jaGF0LW9wdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC9zcmMvbGliL2NvbXBvbmVudHMvbmctY2hhdC1vcHRpb25zL25nLWNoYXQtb3B0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBUXZFLE1BQU0sT0FBTyxzQkFBc0I7SUFFbEM7UUFTTyw4QkFBeUIsR0FBOEIsSUFBSSxZQUFZLEVBQWUsQ0FBQztJQVQ5RSxDQUFDO0lBV2pCLGVBQWUsQ0FBQyxNQUFtQjtRQUVsQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUV2QixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxDQUFDOzhHQXRCVyxzQkFBc0I7a0dBQXRCLHNCQUFzQix3TUNUbkMsNmJBVUE7OzJGRERhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDSSxpQkFBaUI7d0RBU3ZCLE9BQU87c0JBRGIsS0FBSztnQkFJQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBSUMseUJBQXlCO3NCQUQvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQ2hhdE9wdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvY2hhdC1vcHRpb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25nLWNoYXQtb3B0aW9ucycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL25nLWNoYXQtb3B0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmctY2hhdC1vcHRpb25zLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0NoYXRPcHRpb25zQ29tcG9uZW50IHtcblxuXHRjb25zdHJ1Y3RvcigpIHsgfVxuXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBvcHRpb25zOiBJQ2hhdE9wdGlvbltdO1xuXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBhY3RpdmVPcHRpb25UcmFja2VyOiBJQ2hhdE9wdGlvbjtcblxuXHRAT3V0cHV0KClcblx0cHVibGljIGFjdGl2ZU9wdGlvblRyYWNrZXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJQ2hhdE9wdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGF0T3B0aW9uPigpO1xuXG5cdG9uT3B0aW9uQ2xpY2tlZChvcHRpb246IElDaGF0T3B0aW9uKTogdm9pZFxuXHR7XG5cdFx0b3B0aW9uLmlzQWN0aXZlID0gdHJ1ZTtcblxuXHRcdGlmIChvcHRpb24uYWN0aW9uKSB7XG5cdFx0XHRvcHRpb24uYWN0aW9uKG9wdGlvbi5jaGF0dGluZ1RvKTtcblx0XHR9XG5cblx0XHR0aGlzLmFjdGl2ZU9wdGlvblRyYWNrZXJDaGFuZ2UuZW1pdChvcHRpb24pO1xuXHR9XG59XG4vKiBlc2xpbnQtZW5hYmxlICovIiwiPGRpdiAqbmdJZj1cIm9wdGlvbnMgJiYgb3B0aW9ucy5sZW5ndGggPiAwXCIgY2xhc3M9XCJuZy1jaGF0LW9wdGlvbnNcIj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwibmctY2hhdC1vcHRpb25zLWFjdGl2YXRvclwiPlxuXHRcdFx0PHNwYW4gY2xhc3M9XCJwcmltYXJ5LXRleHRcIj4uLi48L3NwYW4+XG5cdFx0PC9idXR0b24+XG5cdDxkaXYgY2xhc3M9XCJuZy1jaGF0LW9wdGlvbnMtY29udGVudCBwcmltYXJ5LWJhY2tncm91bmQgc2hhZG93ZWRcIj5cblx0XHQ8YSAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnM7IGxldCBpID0gaW5kZXhcIiBbbmdDbGFzc109XCIncHJpbWFyeS10ZXh0J1wiIChjbGljayk9XCJvbk9wdGlvbkNsaWNrZWQob3B0aW9uKVwiPlxuXHRcdFx0e3tvcHRpb24uZGlzcGxheUxhYmVsfX1cblx0XHQ8L2E+XG5cdDwvZGl2PiAgICAgIFxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
import { Component, Input, Output, EventEmitter, ViewEncapsulation, ViewChild } from '@angular/core';
|
|
3
|
+
import { Message } from "../../core/message";
|
|
4
|
+
import { MessageType } from "../../core/message-type.enum";
|
|
5
|
+
import { ChatParticipantStatus } from "../../core/chat-participant-status.enum";
|
|
6
|
+
import { ScrollDirection } from "../../core/scroll-direction.enum";
|
|
7
|
+
import { ChatParticipantType } from "../../core/chat-participant-type.enum";
|
|
8
|
+
import { MessageCounter } from "../../core/message-counter";
|
|
9
|
+
import { chatParticipantStatusDescriptor } from '../../core/chat-participant-status-descriptor';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/forms";
|
|
12
|
+
import * as i2 from "@angular/common";
|
|
13
|
+
import * as i3 from "../../pipes/emojify.pipe";
|
|
14
|
+
import * as i4 from "../../pipes/linkfy.pipe";
|
|
15
|
+
import * as i5 from "../../pipes/group-message-display-name.pipe";
|
|
16
|
+
export class NgChatWindowComponent {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.emojisEnabled = true;
|
|
19
|
+
this.linkfyEnabled = true;
|
|
20
|
+
this.showMessageDate = true;
|
|
21
|
+
this.messageDatePipeFormat = "short";
|
|
22
|
+
this.hasPagedHistory = true;
|
|
23
|
+
this.onChatWindowClosed = new EventEmitter();
|
|
24
|
+
this.onMessagesSeen = new EventEmitter();
|
|
25
|
+
this.onMessageSent = new EventEmitter();
|
|
26
|
+
this.onTabTriggered = new EventEmitter();
|
|
27
|
+
this.onOptionTriggered = new EventEmitter();
|
|
28
|
+
this.onLoadHistoryTriggered = new EventEmitter();
|
|
29
|
+
// File upload state
|
|
30
|
+
this.fileUploadersInUse = []; // Id bucket of uploaders in use
|
|
31
|
+
// Exposes enums and functions for the ng-template
|
|
32
|
+
this.ChatParticipantType = ChatParticipantType;
|
|
33
|
+
this.ChatParticipantStatus = ChatParticipantStatus;
|
|
34
|
+
this.MessageType = MessageType;
|
|
35
|
+
this.chatParticipantStatusDescriptor = chatParticipantStatusDescriptor;
|
|
36
|
+
}
|
|
37
|
+
defaultWindowOptions(currentWindow) {
|
|
38
|
+
if (this.showOptions && currentWindow.participant.participantType == ChatParticipantType.User) {
|
|
39
|
+
return [{
|
|
40
|
+
isActive: false,
|
|
41
|
+
chattingTo: currentWindow,
|
|
42
|
+
validateContext: (participant) => {
|
|
43
|
+
return participant.participantType == ChatParticipantType.User;
|
|
44
|
+
},
|
|
45
|
+
displayLabel: 'Add People' // TODO: Localize this
|
|
46
|
+
}];
|
|
47
|
+
}
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
// Asserts if a user avatar is visible in a chat cluster
|
|
51
|
+
isAvatarVisible(window, message, index) {
|
|
52
|
+
if (message.fromId != this.userId) {
|
|
53
|
+
if (index == 0) {
|
|
54
|
+
return true; // First message, good to show the thumbnail
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Check if the previous message belongs to the same user, if it belongs there is no need to show the avatar again to form the message cluster
|
|
58
|
+
if (window.messages[index - 1].fromId != message.fromId) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
getChatWindowAvatar(participant, message) {
|
|
66
|
+
if (participant.participantType == ChatParticipantType.User) {
|
|
67
|
+
return participant.avatar;
|
|
68
|
+
}
|
|
69
|
+
else if (participant.participantType == ChatParticipantType.Group) {
|
|
70
|
+
let group = participant;
|
|
71
|
+
let userIndex = group.chattingTo.findIndex(x => x.id == message.fromId);
|
|
72
|
+
return group.chattingTo[userIndex >= 0 ? userIndex : 0].avatar;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
isUploadingFile(window) {
|
|
77
|
+
const fileUploadInstanceId = this.getUniqueFileUploadInstanceId(window);
|
|
78
|
+
return this.fileUploadersInUse.indexOf(fileUploadInstanceId) > -1;
|
|
79
|
+
}
|
|
80
|
+
// Generates a unique file uploader id for each participant
|
|
81
|
+
getUniqueFileUploadInstanceId(window) {
|
|
82
|
+
if (window && window.participant) {
|
|
83
|
+
return `ng-chat-file-upload-${window.participant.id}`;
|
|
84
|
+
}
|
|
85
|
+
return 'ng-chat-file-upload';
|
|
86
|
+
}
|
|
87
|
+
unreadMessagesTotal(window) {
|
|
88
|
+
return MessageCounter.unreadMessagesTotal(window, this.userId);
|
|
89
|
+
}
|
|
90
|
+
// Scrolls a chat window message flow to the bottom
|
|
91
|
+
scrollChatWindow(window, direction) {
|
|
92
|
+
if (!window.isCollapsed) {
|
|
93
|
+
setTimeout(() => {
|
|
94
|
+
if (this.chatMessages) {
|
|
95
|
+
let element = this.chatMessages.nativeElement;
|
|
96
|
+
let position = (direction === ScrollDirection.Top) ? 0 : element.scrollHeight;
|
|
97
|
+
element.scrollTop = position;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
activeOptionTrackerChange(option) {
|
|
103
|
+
this.onOptionTriggered.emit(option);
|
|
104
|
+
}
|
|
105
|
+
// Triggers native file upload for file selection from the user
|
|
106
|
+
triggerNativeFileUpload(window) {
|
|
107
|
+
if (window) {
|
|
108
|
+
if (this.nativeFileInput)
|
|
109
|
+
this.nativeFileInput.nativeElement.click();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Toggles a window focus on the focus/blur of a 'newMessage' input
|
|
113
|
+
toggleWindowFocus(window) {
|
|
114
|
+
window.hasFocus = !window.hasFocus;
|
|
115
|
+
if (window.hasFocus) {
|
|
116
|
+
const unreadMessages = window.messages
|
|
117
|
+
.filter(message => message.dateSeen == null
|
|
118
|
+
&& (message.toId == this.userId || window.participant.participantType === ChatParticipantType.Group));
|
|
119
|
+
if (unreadMessages && unreadMessages.length > 0) {
|
|
120
|
+
this.onMessagesSeen.emit(unreadMessages);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
markMessagesAsRead(messages) {
|
|
125
|
+
this.onMessagesSeen.emit(messages);
|
|
126
|
+
}
|
|
127
|
+
fetchMessageHistory(window) {
|
|
128
|
+
this.onLoadHistoryTriggered.emit(window);
|
|
129
|
+
}
|
|
130
|
+
// Closes a chat window via the close 'X' button
|
|
131
|
+
onCloseChatWindow() {
|
|
132
|
+
this.onChatWindowClosed.emit({ closedWindow: this.window, closedViaEscapeKey: false });
|
|
133
|
+
}
|
|
134
|
+
/* Monitors pressed keys on a chat window
|
|
135
|
+
- Dispatches a message when the ENTER key is pressed
|
|
136
|
+
- Tabs between windows on TAB or SHIFT + TAB
|
|
137
|
+
- Closes the current focused window on ESC
|
|
138
|
+
*/
|
|
139
|
+
onChatInputTyped(event, window) {
|
|
140
|
+
switch (event.keyCode) {
|
|
141
|
+
case 13:
|
|
142
|
+
if (window.newMessage && window.newMessage.trim() != "") {
|
|
143
|
+
let message = new Message();
|
|
144
|
+
message.fromId = this.userId;
|
|
145
|
+
message.toId = window.participant.id;
|
|
146
|
+
message.message = window.newMessage;
|
|
147
|
+
message.dateSent = new Date();
|
|
148
|
+
window.messages.push(message);
|
|
149
|
+
this.onMessageSent.emit(message);
|
|
150
|
+
window.newMessage = ""; // Resets the new message input
|
|
151
|
+
this.scrollChatWindow(window, ScrollDirection.Bottom);
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case 9:
|
|
155
|
+
event.preventDefault();
|
|
156
|
+
this.onTabTriggered.emit({ triggeringWindow: window, shiftKeyPressed: event.shiftKey });
|
|
157
|
+
break;
|
|
158
|
+
case 27:
|
|
159
|
+
this.onChatWindowClosed.emit({ closedWindow: window, closedViaEscapeKey: true });
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Toggles a chat window visibility between maximized/minimized
|
|
164
|
+
onChatWindowClicked(window) {
|
|
165
|
+
window.isCollapsed = !window.isCollapsed;
|
|
166
|
+
this.scrollChatWindow(window, ScrollDirection.Bottom);
|
|
167
|
+
}
|
|
168
|
+
clearInUseFileUploader(fileUploadInstanceId) {
|
|
169
|
+
const uploaderInstanceIdIndex = this.fileUploadersInUse.indexOf(fileUploadInstanceId);
|
|
170
|
+
if (uploaderInstanceIdIndex > -1) {
|
|
171
|
+
this.fileUploadersInUse.splice(uploaderInstanceIdIndex, 1);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Handles file selection and uploads the selected file using the file upload adapter
|
|
175
|
+
onFileChosen(window) {
|
|
176
|
+
const fileUploadInstanceId = this.getUniqueFileUploadInstanceId(window);
|
|
177
|
+
const uploadElementRef = this.nativeFileInput;
|
|
178
|
+
if (uploadElementRef) {
|
|
179
|
+
const file = uploadElementRef.nativeElement.files[0];
|
|
180
|
+
this.fileUploadersInUse.push(fileUploadInstanceId);
|
|
181
|
+
this.fileUploadAdapter.uploadFile(file, window.participant.id)
|
|
182
|
+
.subscribe(fileMessage => {
|
|
183
|
+
this.clearInUseFileUploader(fileUploadInstanceId);
|
|
184
|
+
fileMessage.fromId = this.userId;
|
|
185
|
+
// Push file message to current user window
|
|
186
|
+
window.messages.push(fileMessage);
|
|
187
|
+
this.onMessageSent.emit(fileMessage);
|
|
188
|
+
this.scrollChatWindow(window, ScrollDirection.Bottom);
|
|
189
|
+
// Resets the file upload element
|
|
190
|
+
uploadElementRef.nativeElement.value = '';
|
|
191
|
+
}, (error) => {
|
|
192
|
+
this.clearInUseFileUploader(fileUploadInstanceId);
|
|
193
|
+
// Resets the file upload element
|
|
194
|
+
uploadElementRef.nativeElement.value = '';
|
|
195
|
+
// TODO: Invoke a file upload adapter error here
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NgChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
200
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: NgChatWindowComponent, selector: "ng-chat-window", inputs: { fileUploadAdapter: "fileUploadAdapter", window: "window", userId: "userId", localization: "localization", showOptions: "showOptions", emojisEnabled: "emojisEnabled", linkfyEnabled: "linkfyEnabled", showMessageDate: "showMessageDate", messageDatePipeFormat: "messageDatePipeFormat", hasPagedHistory: "hasPagedHistory" }, outputs: { onChatWindowClosed: "onChatWindowClosed", onMessagesSeen: "onMessagesSeen", onMessageSent: "onMessageSent", onTabTriggered: "onTabTriggered", onOptionTriggered: "onOptionTriggered", onLoadHistoryTriggered: "onLoadHistoryTriggered" }, viewQueries: [{ propertyName: "chatMessages", first: true, predicate: ["chatMessages"], descendants: true }, { propertyName: "nativeFileInput", first: true, predicate: ["nativeFileInput"], descendants: true }, { propertyName: "chatWindowInput", first: true, predicate: ["chatWindowInput"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"window && window.isCollapsed\">\n\t<div class=\"ng-chat-title secondary-background\">\n\t\t<div class=\"ng-chat-title-visibility-toggle-area\" (click)=\"onChatWindowClicked(window)\">\n\t\t\t<strong title=\"{{window.participant.displayName}}\">\n\t\t\t\t{{window.participant.displayName}}\n\t\t\t</strong>\n\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': window.participant.status === ChatParticipantStatus.Online, 'busy': window.participant.status === ChatParticipantStatus.Busy, 'away': window.participant.status === ChatParticipantStatus.Away, 'offline': window.participant.status === ChatParticipantStatus.Offline}\" title=\"{{chatParticipantStatusDescriptor(window.participant.status, localization)}}\"></span>\n\t\t\t<span *ngIf=\"unreadMessagesTotal(window).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotal(window)}}</span>\n\t\t</div>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-close primary-text\" (click)=\"onCloseChatWindow()\">✕</a>\n\t</div>\n</ng-container>\n<ng-container *ngIf=\"window && !window.isCollapsed\"> \n\t<div class=\"ng-chat-title secondary-background\">\n\t\t<div class=\"ng-chat-title-visibility-toggle-area\" (click)=\"onChatWindowClicked(window)\">\n\t\t\t<strong title=\"{{window.participant.displayName}}\">\n\t\t\t\t{{window.participant.displayName}}\n\t\t\t</strong>\n\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': window.participant.status === ChatParticipantStatus.Online, 'busy': window.participant.status === ChatParticipantStatus.Busy, 'away': window.participant.status === ChatParticipantStatus.Away, 'offline': window.participant.status === ChatParticipantStatus.Offline}\" title=\"{{chatParticipantStatusDescriptor(window.participant.status, localization)}}\"></span>\n\t\t\t<span *ngIf=\"unreadMessagesTotal(window).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotal(window)}}</span>\n\t\t</div>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-close primary-text\" (click)=\"onCloseChatWindow()\">✕</a>\n\t\t<!-- <ng-chat-options [ngClass]=\"'ng-chat-options-container'\" [options]=\"defaultWindowOptions(window)\" (activeOptionTrackerChange)=\"activeOptionTrackerChange($event)\"></ng-chat-options> -->\n\t</div>\n\t\t<div #chatMessages class=\"ng-chat-messages primary-background\">\n\t\t\t<div *ngIf=\"window.isLoadingHistory\" class=\"ng-chat-loading-wrapper\">\n\t\t\t\t<div class=\"loader\">Loading history...</div>\n\t\t\t</div>\n\t\t\t<div *ngIf=\"hasPagedHistory && window.hasMoreMessages && !window.isLoadingHistory\" class=\"ng-chat-load-history\">\n\t\t\t\t<a class=\"load-history-action\" (click)=\"fetchMessageHistory(window)\">{{localization.loadMessageHistoryPlaceholder}}</a>\n\t\t\t</div>\n\n\t\t\t<div *ngFor=\"let message of window.messages; let i = index\" [ngClass]=\"{'ng-chat-message': true, 'ng-chat-message-received': message.fromId !== userId}\">\n\t\t\t\t<ng-container *ngIf=\"isAvatarVisible(window, message, i)\">\n\t\t\t\t\t<div *ngIf=\"!getChatWindowAvatar(window.participant, message)\" class=\"icon-wrapper\">\n\t\t\t\t\t\t<i class=\"user-icon\"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<!-- <img *ngIf=\"getChatWindowAvatar(window.participant, message)\" alt=\"\" class=\"avatar\" height=\"30\" width=\"30\" [src]=\"getChatWindowAvatar(window.participant, message) | sanitize\" /> -->\n\t\t\t\t\t<span *ngIf=\"window.participant.participantType === ChatParticipantType.Group\" class=\"ng-chat-participant-name\">{{window.participant | groupMessageDisplayName:message}}</span>\n\t\t\t\t</ng-container>\n\t\t\t\t<ng-container [ngSwitch]=\"message.type\">\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.Text\" [ngClass]=\"{'sent-chat-message-container': message.fromId === userId, 'received-chat-message-container': message.fromId !== userId}\">\n\t\t\t \t\t\t<span [innerHtml]=\"message.message | emojify:emojisEnabled | linkfy:linkfyEnabled\"></span>\n\t\t\t\t\t\t<span *ngIf=\"showMessageDate && message.dateSent\" class=\"message-sent-date\">{{message.dateSent | date:'dd'}}/{{message.dateSent | date:'MM'}}/{{message.dateSent | date:'y'}} {{message.dateSent | date:'h:mm a '}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.Image\" [ngClass]=\"{'sent-chat-message-container': message.fromId === userId, 'received-chat-message-container': message.fromId !== userId}\">\n\t\n\t\t\t \t\t\t<img src=\"{{message.message}}\" class=\"image-message\" />\n\t\n\t\t\t\t\t\t<span *ngIf=\"showMessageDate && message.dateSent\" class=\"message-sent-date\">{{message.dateSent | date:'dd'}}/{{message.dateSent | date:'MM'}}/{{message.dateSent | date:'y'}} {{message.dateSent | date:'h:mm a '}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.File\" [ngClass]=\"{'file-message-container': true, 'received': message.fromId !== userId}\">\n\t\t\t\t\t\t<div class=\"file-message-icon-container\">\n\t\t\t\t\t\t\t<i class=\"paperclip-icon\"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- <a class=\"file-details\" [attr.href]=\"message.downloadUrl\" target=\"_blank\" rel=\"noopener noreferrer\" (click)=\"this.markMessagesAsRead([message])\" download>\n\t\t\t\t\t\t\t<span class=\"file-message-title\" [attr.title]=\"message.message\">{{message.message}}</span>\n\t\t\t\t\t\t\t<span *ngIf=\"message.fileSizeInBytes\" class=\"file-message-size\">{{message.fileSizeInBytes}} Bytes</span>\n\t\t\t\t\t\t</a> -->\n\t\t\t\t\t</div>\n\t\t\t\t</ng-container>\n\t\t\t</div>\n\t</div>\n\n\t<div class=\"ng-chat-footer primary-outline-color primary-background\">\n\t\t<input #chatWindowInput\n\t\t\ttype=\"text\"\n\t\t\t[ngModel]=\"window.newMessage | emojify:emojisEnabled\"\n\t\t\t(ngModelChange)=\"window.newMessage=$event\"\n\t\t\t[placeholder]=\"localization.messagePlaceholder\"\n\t\t\t[ngClass]=\"{'chat-window-input': true, 'has-side-action': fileUploadAdapter}\"\n\t\t\t(keydown)=\"onChatInputTyped($event, window)\"\n\t\t\t(blur)=\"toggleWindowFocus(window)\"\n\t\t\t(focus)=\"toggleWindowFocus(window)\"/>\n\n\t\t<!-- File Upload -->\n\t\t<ng-container *ngIf=\"fileUploadAdapter\">\n\t\t\t<a *ngIf=\"!isUploadingFile(window)\" class=\"btn-add-file\" (click)=\"triggerNativeFileUpload(window)\">\n\t\t\t\t<i class=\"upload-icon\"></i>\n\t\t\t</a>\n\t\t\t<input\n\t\t\t\ttype=\"file\"\n\t\t\t\t#nativeFileInput\n\t\t\t\tstyle=\"display: none;\"\n\t\t\t\t[attr.id]=\"getUniqueFileUploadInstanceId(window)\"\n\t\t\t\t(change)=\"onFileChosen(window)\" />\n\t\t\t<div *ngIf=\"isUploadingFile(window)\" class=\"loader\"></div>\n\t\t</ng-container>\n\t</div>\n</ng-container>", styles: [".ng-chat-window{right:260px;height:360px;z-index:999;bottom:0;width:300px;position:fixed;border-width:1px;border-style:solid;border-bottom:0;box-shadow:0 4px 8px #00000040;margin-bottom:10px!important;border:1px solid grey!important;border-radius:10px!important;box-sizing:border-box!important;overflow:hidden!important;background-color:#fff}.ng-chat-window ::-webkit-scrollbar{width:8px!important}.ng-chat-window ::-webkit-scrollbar-thumb{background:#1b1b70!important;border-radius:5px!important}.ng-chat-window-collapsed{height:30px!important}.ng-chat-window .ng-chat-footer{box-sizing:border-box!important;padding-bottom:10px!important;display:block;height:10%;width:95%!important;margin:auto!important;background-color:inherit!important}.ng-chat-window .ng-chat-footer>input{font-size:.8em;box-sizing:border-box!important;padding:15px!important;height:100%;width:100%;border-radius:20px!important;border:1px solid grey!important}.ng-chat-window .ng-chat-footer>input.has-side-action{width:calc(100% - 30px)}.ng-chat-window .ng-chat-footer .btn-add-file{position:absolute;right:5px;bottom:7px;height:20px;width:20px;cursor:pointer}.ng-chat-window .ng-chat-footer .loader{position:absolute;right:14px;bottom:8px}.ng-chat-window .ng-chat-load-history{height:30px;text-align:center;font-size:.8em}.ng-chat-window .ng-chat-load-history>a{border-radius:15px;cursor:pointer;padding:5px 10px}.ng-chat-window .ng-chat-messages{padding:10px;width:100%;height:calc(90% - 30px);box-sizing:border-box;position:relative;overflow:auto}.ng-chat-window .ng-chat-messages .ng-chat-message{clear:both}.ng-chat-window .ng-chat-messages .ng-chat-message>img.avatar,.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper{position:absolute;left:10px;border-radius:25px}.ng-chat-window .ng-chat-messages .ng-chat-message .ng-chat-participant-name{display:inline-block;margin-left:40px;padding-bottom:5px;font-weight:700;font-size:.8em;text-overflow:ellipsis;max-width:180px}.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper{background-color:#bababa;overflow:hidden;width:30px;height:30px;padding:0}.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper>i{color:#fff;transform:scale(.7)}.ng-chat-window .ng-chat-messages .ng-chat-message .message-sent-date{font-size:.5em!important;display:block;text-align:right;margin-top:5px;color:#a1a0a0!important;font-style:italic!important}.ng-chat-window .ng-chat-messages .ng-chat-message>div{float:right;width:182px;border-radius:15px 15px 0!important;padding:10px;margin-top:0;margin-bottom:5px;font-size:.9em;word-wrap:break-word;background-color:#93d4f0!important}.ng-chat-window .ng-chat-message-received>div.received-chat-message-container{float:left;margin-left:40px;padding-top:7px;padding-bottom:7px;margin-top:0;margin-bottom:5px;background-color:#daf2fc!important;border-radius:15px 15px 15px 0!important}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container{float:right;width:202px;border-style:solid;border-width:3px;border-radius:5px;overflow:hidden;margin-bottom:5px;display:block;text-decoration:none;font-size:.9em;padding:0;box-sizing:border-box}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container.received{float:left;margin-left:40px;width:208px}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-message-icon-container{width:20px;height:35px;padding:10px 5px;float:left}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-message-icon-container i{margin-top:8px}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details{float:left;padding:10px;width:calc(100% - 60px);color:currentColor;text-decoration:none}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details:hover{text-decoration:underline}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details span{display:block;width:100%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details .file-message-title{font-weight:700}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details .file-message-size{font-size:.8em;margin-top:5px}.ng-chat-window .image-message{width:100%;height:auto}@media only screen and (max-width: 581px){.ng-chat-window{position:initial}}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i3.EmojifyPipe, name: "emojify" }, { kind: "pipe", type: i4.LinkfyPipe, name: "linkfy" }, { kind: "pipe", type: i5.GroupMessageDisplayNamePipe, name: "groupMessageDisplayName" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
201
|
+
}
|
|
202
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NgChatWindowComponent, decorators: [{
|
|
203
|
+
type: Component,
|
|
204
|
+
args: [{ selector: 'ng-chat-window', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"window && window.isCollapsed\">\n\t<div class=\"ng-chat-title secondary-background\">\n\t\t<div class=\"ng-chat-title-visibility-toggle-area\" (click)=\"onChatWindowClicked(window)\">\n\t\t\t<strong title=\"{{window.participant.displayName}}\">\n\t\t\t\t{{window.participant.displayName}}\n\t\t\t</strong>\n\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': window.participant.status === ChatParticipantStatus.Online, 'busy': window.participant.status === ChatParticipantStatus.Busy, 'away': window.participant.status === ChatParticipantStatus.Away, 'offline': window.participant.status === ChatParticipantStatus.Offline}\" title=\"{{chatParticipantStatusDescriptor(window.participant.status, localization)}}\"></span>\n\t\t\t<span *ngIf=\"unreadMessagesTotal(window).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotal(window)}}</span>\n\t\t</div>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-close primary-text\" (click)=\"onCloseChatWindow()\">✕</a>\n\t</div>\n</ng-container>\n<ng-container *ngIf=\"window && !window.isCollapsed\"> \n\t<div class=\"ng-chat-title secondary-background\">\n\t\t<div class=\"ng-chat-title-visibility-toggle-area\" (click)=\"onChatWindowClicked(window)\">\n\t\t\t<strong title=\"{{window.participant.displayName}}\">\n\t\t\t\t{{window.participant.displayName}}\n\t\t\t</strong>\n\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': window.participant.status === ChatParticipantStatus.Online, 'busy': window.participant.status === ChatParticipantStatus.Busy, 'away': window.participant.status === ChatParticipantStatus.Away, 'offline': window.participant.status === ChatParticipantStatus.Offline}\" title=\"{{chatParticipantStatusDescriptor(window.participant.status, localization)}}\"></span>\n\t\t\t<span *ngIf=\"unreadMessagesTotal(window).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotal(window)}}</span>\n\t\t</div>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-close primary-text\" (click)=\"onCloseChatWindow()\">✕</a>\n\t\t<!-- <ng-chat-options [ngClass]=\"'ng-chat-options-container'\" [options]=\"defaultWindowOptions(window)\" (activeOptionTrackerChange)=\"activeOptionTrackerChange($event)\"></ng-chat-options> -->\n\t</div>\n\t\t<div #chatMessages class=\"ng-chat-messages primary-background\">\n\t\t\t<div *ngIf=\"window.isLoadingHistory\" class=\"ng-chat-loading-wrapper\">\n\t\t\t\t<div class=\"loader\">Loading history...</div>\n\t\t\t</div>\n\t\t\t<div *ngIf=\"hasPagedHistory && window.hasMoreMessages && !window.isLoadingHistory\" class=\"ng-chat-load-history\">\n\t\t\t\t<a class=\"load-history-action\" (click)=\"fetchMessageHistory(window)\">{{localization.loadMessageHistoryPlaceholder}}</a>\n\t\t\t</div>\n\n\t\t\t<div *ngFor=\"let message of window.messages; let i = index\" [ngClass]=\"{'ng-chat-message': true, 'ng-chat-message-received': message.fromId !== userId}\">\n\t\t\t\t<ng-container *ngIf=\"isAvatarVisible(window, message, i)\">\n\t\t\t\t\t<div *ngIf=\"!getChatWindowAvatar(window.participant, message)\" class=\"icon-wrapper\">\n\t\t\t\t\t\t<i class=\"user-icon\"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<!-- <img *ngIf=\"getChatWindowAvatar(window.participant, message)\" alt=\"\" class=\"avatar\" height=\"30\" width=\"30\" [src]=\"getChatWindowAvatar(window.participant, message) | sanitize\" /> -->\n\t\t\t\t\t<span *ngIf=\"window.participant.participantType === ChatParticipantType.Group\" class=\"ng-chat-participant-name\">{{window.participant | groupMessageDisplayName:message}}</span>\n\t\t\t\t</ng-container>\n\t\t\t\t<ng-container [ngSwitch]=\"message.type\">\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.Text\" [ngClass]=\"{'sent-chat-message-container': message.fromId === userId, 'received-chat-message-container': message.fromId !== userId}\">\n\t\t\t \t\t\t<span [innerHtml]=\"message.message | emojify:emojisEnabled | linkfy:linkfyEnabled\"></span>\n\t\t\t\t\t\t<span *ngIf=\"showMessageDate && message.dateSent\" class=\"message-sent-date\">{{message.dateSent | date:'dd'}}/{{message.dateSent | date:'MM'}}/{{message.dateSent | date:'y'}} {{message.dateSent | date:'h:mm a '}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.Image\" [ngClass]=\"{'sent-chat-message-container': message.fromId === userId, 'received-chat-message-container': message.fromId !== userId}\">\n\t\n\t\t\t \t\t\t<img src=\"{{message.message}}\" class=\"image-message\" />\n\t\n\t\t\t\t\t\t<span *ngIf=\"showMessageDate && message.dateSent\" class=\"message-sent-date\">{{message.dateSent | date:'dd'}}/{{message.dateSent | date:'MM'}}/{{message.dateSent | date:'y'}} {{message.dateSent | date:'h:mm a '}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.File\" [ngClass]=\"{'file-message-container': true, 'received': message.fromId !== userId}\">\n\t\t\t\t\t\t<div class=\"file-message-icon-container\">\n\t\t\t\t\t\t\t<i class=\"paperclip-icon\"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- <a class=\"file-details\" [attr.href]=\"message.downloadUrl\" target=\"_blank\" rel=\"noopener noreferrer\" (click)=\"this.markMessagesAsRead([message])\" download>\n\t\t\t\t\t\t\t<span class=\"file-message-title\" [attr.title]=\"message.message\">{{message.message}}</span>\n\t\t\t\t\t\t\t<span *ngIf=\"message.fileSizeInBytes\" class=\"file-message-size\">{{message.fileSizeInBytes}} Bytes</span>\n\t\t\t\t\t\t</a> -->\n\t\t\t\t\t</div>\n\t\t\t\t</ng-container>\n\t\t\t</div>\n\t</div>\n\n\t<div class=\"ng-chat-footer primary-outline-color primary-background\">\n\t\t<input #chatWindowInput\n\t\t\ttype=\"text\"\n\t\t\t[ngModel]=\"window.newMessage | emojify:emojisEnabled\"\n\t\t\t(ngModelChange)=\"window.newMessage=$event\"\n\t\t\t[placeholder]=\"localization.messagePlaceholder\"\n\t\t\t[ngClass]=\"{'chat-window-input': true, 'has-side-action': fileUploadAdapter}\"\n\t\t\t(keydown)=\"onChatInputTyped($event, window)\"\n\t\t\t(blur)=\"toggleWindowFocus(window)\"\n\t\t\t(focus)=\"toggleWindowFocus(window)\"/>\n\n\t\t<!-- File Upload -->\n\t\t<ng-container *ngIf=\"fileUploadAdapter\">\n\t\t\t<a *ngIf=\"!isUploadingFile(window)\" class=\"btn-add-file\" (click)=\"triggerNativeFileUpload(window)\">\n\t\t\t\t<i class=\"upload-icon\"></i>\n\t\t\t</a>\n\t\t\t<input\n\t\t\t\ttype=\"file\"\n\t\t\t\t#nativeFileInput\n\t\t\t\tstyle=\"display: none;\"\n\t\t\t\t[attr.id]=\"getUniqueFileUploadInstanceId(window)\"\n\t\t\t\t(change)=\"onFileChosen(window)\" />\n\t\t\t<div *ngIf=\"isUploadingFile(window)\" class=\"loader\"></div>\n\t\t</ng-container>\n\t</div>\n</ng-container>", styles: [".ng-chat-window{right:260px;height:360px;z-index:999;bottom:0;width:300px;position:fixed;border-width:1px;border-style:solid;border-bottom:0;box-shadow:0 4px 8px #00000040;margin-bottom:10px!important;border:1px solid grey!important;border-radius:10px!important;box-sizing:border-box!important;overflow:hidden!important;background-color:#fff}.ng-chat-window ::-webkit-scrollbar{width:8px!important}.ng-chat-window ::-webkit-scrollbar-thumb{background:#1b1b70!important;border-radius:5px!important}.ng-chat-window-collapsed{height:30px!important}.ng-chat-window .ng-chat-footer{box-sizing:border-box!important;padding-bottom:10px!important;display:block;height:10%;width:95%!important;margin:auto!important;background-color:inherit!important}.ng-chat-window .ng-chat-footer>input{font-size:.8em;box-sizing:border-box!important;padding:15px!important;height:100%;width:100%;border-radius:20px!important;border:1px solid grey!important}.ng-chat-window .ng-chat-footer>input.has-side-action{width:calc(100% - 30px)}.ng-chat-window .ng-chat-footer .btn-add-file{position:absolute;right:5px;bottom:7px;height:20px;width:20px;cursor:pointer}.ng-chat-window .ng-chat-footer .loader{position:absolute;right:14px;bottom:8px}.ng-chat-window .ng-chat-load-history{height:30px;text-align:center;font-size:.8em}.ng-chat-window .ng-chat-load-history>a{border-radius:15px;cursor:pointer;padding:5px 10px}.ng-chat-window .ng-chat-messages{padding:10px;width:100%;height:calc(90% - 30px);box-sizing:border-box;position:relative;overflow:auto}.ng-chat-window .ng-chat-messages .ng-chat-message{clear:both}.ng-chat-window .ng-chat-messages .ng-chat-message>img.avatar,.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper{position:absolute;left:10px;border-radius:25px}.ng-chat-window .ng-chat-messages .ng-chat-message .ng-chat-participant-name{display:inline-block;margin-left:40px;padding-bottom:5px;font-weight:700;font-size:.8em;text-overflow:ellipsis;max-width:180px}.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper{background-color:#bababa;overflow:hidden;width:30px;height:30px;padding:0}.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper>i{color:#fff;transform:scale(.7)}.ng-chat-window .ng-chat-messages .ng-chat-message .message-sent-date{font-size:.5em!important;display:block;text-align:right;margin-top:5px;color:#a1a0a0!important;font-style:italic!important}.ng-chat-window .ng-chat-messages .ng-chat-message>div{float:right;width:182px;border-radius:15px 15px 0!important;padding:10px;margin-top:0;margin-bottom:5px;font-size:.9em;word-wrap:break-word;background-color:#93d4f0!important}.ng-chat-window .ng-chat-message-received>div.received-chat-message-container{float:left;margin-left:40px;padding-top:7px;padding-bottom:7px;margin-top:0;margin-bottom:5px;background-color:#daf2fc!important;border-radius:15px 15px 15px 0!important}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container{float:right;width:202px;border-style:solid;border-width:3px;border-radius:5px;overflow:hidden;margin-bottom:5px;display:block;text-decoration:none;font-size:.9em;padding:0;box-sizing:border-box}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container.received{float:left;margin-left:40px;width:208px}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-message-icon-container{width:20px;height:35px;padding:10px 5px;float:left}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-message-icon-container i{margin-top:8px}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details{float:left;padding:10px;width:calc(100% - 60px);color:currentColor;text-decoration:none}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details:hover{text-decoration:underline}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details span{display:block;width:100%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details .file-message-title{font-weight:700}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details .file-message-size{font-size:.8em;margin-top:5px}.ng-chat-window .image-message{width:100%;height:auto}@media only screen and (max-width: 581px){.ng-chat-window{position:initial}}\n"] }]
|
|
205
|
+
}], ctorParameters: () => [], propDecorators: { fileUploadAdapter: [{
|
|
206
|
+
type: Input
|
|
207
|
+
}], window: [{
|
|
208
|
+
type: Input
|
|
209
|
+
}], userId: [{
|
|
210
|
+
type: Input
|
|
211
|
+
}], localization: [{
|
|
212
|
+
type: Input
|
|
213
|
+
}], showOptions: [{
|
|
214
|
+
type: Input
|
|
215
|
+
}], emojisEnabled: [{
|
|
216
|
+
type: Input
|
|
217
|
+
}], linkfyEnabled: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], showMessageDate: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], messageDatePipeFormat: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], hasPagedHistory: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], onChatWindowClosed: [{
|
|
226
|
+
type: Output
|
|
227
|
+
}], onMessagesSeen: [{
|
|
228
|
+
type: Output
|
|
229
|
+
}], onMessageSent: [{
|
|
230
|
+
type: Output
|
|
231
|
+
}], onTabTriggered: [{
|
|
232
|
+
type: Output
|
|
233
|
+
}], onOptionTriggered: [{
|
|
234
|
+
type: Output
|
|
235
|
+
}], onLoadHistoryTriggered: [{
|
|
236
|
+
type: Output
|
|
237
|
+
}], chatMessages: [{
|
|
238
|
+
type: ViewChild,
|
|
239
|
+
args: ['chatMessages']
|
|
240
|
+
}], nativeFileInput: [{
|
|
241
|
+
type: ViewChild,
|
|
242
|
+
args: ['nativeFileInput']
|
|
243
|
+
}], chatWindowInput: [{
|
|
244
|
+
type: ViewChild,
|
|
245
|
+
args: ['chatWindowInput']
|
|
246
|
+
}] } });
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC9zcmMvbGliL2NvbXBvbmVudHMvbmctY2hhdC13aW5kb3cvbmctY2hhdC13aW5kb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC9zcmMvbGliL2NvbXBvbmVudHMvbmctY2hhdC13aW5kb3cvbmctY2hhdC13aW5kb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBS25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7OztBQVFoRyxNQUFNLE9BQU8scUJBQXFCO0lBQzlCO1FBa0JPLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRzlCLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRzlCLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBR2hDLDBCQUFxQixHQUFXLE9BQU8sQ0FBQztRQUd4QyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUdoQyx1QkFBa0IsR0FB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LFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDSyxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDRSxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0VuY2Fwc3VsYXRpb24sIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gXCIuLi8uLi9jb3JlL21lc3NhZ2VcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcIi4uLy4uL2NvcmUvbWVzc2FnZS10eXBlLmVudW1cIjtcbmltcG9ydCB7IFdpbmRvdyB9IGZyb20gXCIuLi8uLi9jb3JlL3dpbmRvd1wiO1xuaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50U3RhdHVzIH0gZnJvbSBcIi4uLy4uL2NvcmUvY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bVwiO1xuaW1wb3J0IHsgU2Nyb2xsRGlyZWN0aW9uIH0gZnJvbSBcIi4uLy4uL2NvcmUvc2Nyb2xsLWRpcmVjdGlvbi5lbnVtXCI7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL2xvY2FsaXphdGlvbic7XG5pbXBvcnQgeyBJRmlsZVVwbG9hZEFkYXB0ZXIgfSBmcm9tICcuLi8uLi9jb3JlL2ZpbGUtdXBsb2FkLWFkYXB0ZXInO1xuaW1wb3J0IHsgSUNoYXRPcHRpb24gfSBmcm9tICcuLi8uLi9jb3JlL2NoYXQtb3B0aW9uJztcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSBcIi4uLy4uL2NvcmUvZ3JvdXBcIjtcbmltcG9ydCB7IENoYXRQYXJ0aWNpcGFudFR5cGUgfSBmcm9tIFwiLi4vLi4vY29yZS9jaGF0LXBhcnRpY2lwYW50LXR5cGUuZW51bVwiO1xuaW1wb3J0IHsgSUNoYXRQYXJ0aWNpcGFudCB9IGZyb20gXCIuLi8uLi9jb3JlL2NoYXQtcGFydGljaXBhbnRcIjtcbmltcG9ydCB7IE1lc3NhZ2VDb3VudGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvbWVzc2FnZS1jb3VudGVyXCI7XG5pbXBvcnQgeyBjaGF0UGFydGljaXBhbnRTdGF0dXNEZXNjcmlwdG9yIH0gZnJvbSAnLi4vLi4vY29yZS9jaGF0LXBhcnRpY2lwYW50LXN0YXR1cy1kZXNjcmlwdG9yJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZy1jaGF0LXdpbmRvdycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL25nLWNoYXQtd2luZG93LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZy1jaGF0LXdpbmRvdy5jb21wb25lbnQuY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBOZ0NoYXRXaW5kb3dDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBmaWxlVXBsb2FkQWRhcHRlcjogSUZpbGVVcGxvYWRBZGFwdGVyO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2luZG93OiBXaW5kb3c7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB1c2VySWQ6IGFueTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxvY2FsaXphdGlvbjogTG9jYWxpemF0aW9uO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2hvd09wdGlvbnM6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBlbW9qaXNFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxpbmtmeUVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2hvd01lc3NhZ2VEYXRlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1lc3NhZ2VEYXRlUGlwZUZvcm1hdDogc3RyaW5nID0gXCJzaG9ydFwiO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGFzUGFnZWRIaXN0b3J5OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNoYXRXaW5kb3dDbG9zZWQ6IEV2ZW50RW1pdHRlcjx7IGNsb3NlZFdpbmRvdzogV2luZG93LCBjbG9zZWRWaWFFc2NhcGVLZXk6IGJvb2xlYW59PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbk1lc3NhZ2VzU2VlbjogRXZlbnRFbWl0dGVyPE1lc3NhZ2VbXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25NZXNzYWdlU2VudDogRXZlbnRFbWl0dGVyPE1lc3NhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uVGFiVHJpZ2dlcmVkOiBFdmVudEVtaXR0ZXI8eyB0cmlnZ2VyaW5nV2luZG93OiBXaW5kb3csIHNoaWZ0S2V5UHJlc3NlZDogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbk9wdGlvblRyaWdnZXJlZDogRXZlbnRFbWl0dGVyPElDaGF0T3B0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkxvYWRIaXN0b3J5VHJpZ2dlcmVkOiBFdmVudEVtaXR0ZXI8V2luZG93PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2NoYXRNZXNzYWdlcycpIGNoYXRNZXNzYWdlczogYW55O1xuICAgIEBWaWV3Q2hpbGQoJ25hdGl2ZUZpbGVJbnB1dCcpIG5hdGl2ZUZpbGVJbnB1dDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdjaGF0V2luZG93SW5wdXQnKSBjaGF0V2luZG93SW5wdXQ6IGFueTtcblxuICAgIC8vIEZpbGUgdXBsb2FkIHN0YXRlXG4gICAgcHVibGljIGZpbGVVcGxvYWRlcnNJblVzZTogc3RyaW5nW10gPSBbXTsgLy8gSWQgYnVja2V0IG9mIHVwbG9hZGVycyBpbiB1c2VcblxuICAgIC8vIEV4cG9zZXMgZW51bXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIG5nLXRlbXBsYXRlXG4gICAgcHVibGljIENoYXRQYXJ0aWNpcGFudFR5cGUgPSBDaGF0UGFydGljaXBhbnRUeXBlO1xuICAgIHB1YmxpYyBDaGF0UGFydGljaXBhbnRTdGF0dXMgPSBDaGF0UGFydGljaXBhbnRTdGF0dXM7XG4gICAgcHVibGljIE1lc3NhZ2VUeXBlID0gTWVzc2FnZVR5cGU7XG4gICAgcHVibGljIGNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3IgPSBjaGF0UGFydGljaXBhbnRTdGF0dXNEZXNjcmlwdG9yO1xuXG4gICAgZGVmYXVsdFdpbmRvd09wdGlvbnMoY3VycmVudFdpbmRvdzogV2luZG93KTogSUNoYXRPcHRpb25bXVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMgJiYgY3VycmVudFdpbmRvdy5wYXJ0aWNpcGFudC5wYXJ0aWNpcGFudFR5cGUgPT0gQ2hhdFBhcnRpY2lwYW50VHlwZS5Vc2VyKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY2hhdHRpbmdUbzogY3VycmVudFdpbmRvdyxcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUNvbnRleHQ6IChwYXJ0aWNpcGFudDogSUNoYXRQYXJ0aWNpcGFudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydGljaXBhbnQucGFydGljaXBhbnRUeXBlID09IENoYXRQYXJ0aWNpcGFudFR5cGUuVXNlcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3BsYXlMYWJlbDogJ0FkZCBQZW9wbGUnIC8vIFRPRE86IExvY2FsaXplIHRoaXNcbiAgICAgICAgICAgIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEFzc2VydHMgaWYgYSB1c2VyIGF2YXRhciBpcyB2aXNpYmxlIGluIGEgY2hhdCBjbHVzdGVyXG4gICAgaXNBdmF0YXJWaXNpYmxlKHdpbmRvdzogV2luZG93LCBtZXNzYWdlOiBNZXNzYWdlLCBpbmRleDogbnVtYmVyKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZnJvbUlkICE9IHRoaXMudXNlcklkKXtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRmlyc3QgbWVzc2FnZSwgZ29vZCB0byBzaG93IHRoZSB0aHVtYm5haWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByZXZpb3VzIG1lc3NhZ2UgYmVsb25ncyB0byB0aGUgc2FtZSB1c2VyLCBpZiBpdCBiZWxvbmdzIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2hvdyB0aGUgYXZhdGFyIGFnYWluIHRvIGZvcm0gdGhlIG1lc3NhZ2UgY2x1c3RlclxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubWVzc2FnZXNbaW5kZXggLSAxXS5mcm9tSWQgIT0gbWVzc2FnZS5mcm9tSWQpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0Q2hhdFdpbmRvd0F2YXRhcihwYXJ0aWNpcGFudDogSUNoYXRQYXJ0aWNpcGFudCwgbWVzc2FnZTogTWVzc2FnZSk6IHN0cmluZyB8IG51bGxcbiAgICB7XG4gICAgICAgIGlmIChwYXJ0aWNpcGFudC5wYXJ0aWNpcGFudFR5cGUgPT0gQ2hhdFBhcnRpY2lwYW50VHlwZS5Vc2VyKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gcGFydGljaXBhbnQuYXZhdGFyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcnRpY2lwYW50LnBhcnRpY2lwYW50VHlwZSA9PSBDaGF0UGFydGljaXBhbnRUeXBlLkdyb3VwKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgZ3JvdXAgPSBwYXJ0aWNpcGFudCBhcyBHcm91cDtcbiAgICAgICAgICAgIGxldCB1c2VySW5kZXggPSBncm91cC5jaGF0dGluZ1RvLmZpbmRJbmRleCh4ID0+IHguaWQgPT0gbWVzc2FnZS5mcm9tSWQpO1xuXG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAuY2hhdHRpbmdUb1t1c2VySW5kZXggPj0gMCA/IHVzZXJJbmRleCA6IDBdLmF2YXRhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlzVXBsb2FkaW5nRmlsZSh3aW5kb3c6IFdpbmRvdyk6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGNvbnN0IGZpbGVVcGxvYWRJbnN0YW5jZUlkID0gdGhpcy5nZXRVbmlxdWVGaWxlVXBsb2FkSW5zdGFuY2VJZCh3aW5kb3cpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVVcGxvYWRlcnNJblVzZS5pbmRleE9mKGZpbGVVcGxvYWRJbnN0YW5jZUlkKSA+IC0xO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlcyBhIHVuaXF1ZSBmaWxlIHVwbG9hZGVyIGlkIGZvciBlYWNoIHBhcnRpY2lwYW50XG4gICAgZ2V0VW5pcXVlRmlsZVVwbG9hZEluc3RhbmNlSWQod2luZG93OiBXaW5kb3cpOiBzdHJpbmdcbiAgICB7XG4gICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LnBhcnRpY2lwYW50KVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gYG5nLWNoYXQtZmlsZS11cGxvYWQtJHt3aW5kb3cucGFydGljaXBhbnQuaWR9YDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuICduZy1jaGF0LWZpbGUtdXBsb2FkJztcbiAgICB9XG5cbiAgICB1bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdzogV2luZG93KTogc3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gTWVzc2FnZUNvdW50ZXIudW5yZWFkTWVzc2FnZXNUb3RhbCh3aW5kb3csIHRoaXMudXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyBTY3JvbGxzIGEgY2hhdCB3aW5kb3cgbWVzc2FnZSBmbG93IHRvIHRoZSBib3R0b21cbiAgICBzY3JvbGxDaGF0V2luZG93KHdpbmRvdzogV2luZG93LCBkaXJlY3Rpb246IFNjcm9sbERpcmVjdGlvbik6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmICghd2luZG93LmlzQ29sbGFwc2VkKXtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoYXRNZXNzYWdlcyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5jaGF0TWVzc2FnZXMubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gKCBkaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5Ub3AgKSA/IDAgOiBlbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFjdGl2ZU9wdGlvblRyYWNrZXJDaGFuZ2Uob3B0aW9uOiBJQ2hhdE9wdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLm9uT3B0aW9uVHJpZ2dlcmVkLmVtaXQob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VycyBuYXRpdmUgZmlsZSB1cGxvYWQgZm9yIGZpbGUgc2VsZWN0aW9uIGZyb20gdGhlIHVzZXJcbiAgICB0cmlnZ2VyTmF0aXZlRmlsZVVwbG9hZCh3aW5kb3c6IFdpbmRvdyk6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmICh3aW5kb3cpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hdGl2ZUZpbGVJbnB1dCkgdGhpcy5uYXRpdmVGaWxlSW5wdXQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVG9nZ2xlcyBhIHdpbmRvdyBmb2N1cyBvbiB0aGUgZm9jdXMvYmx1ciBvZiBhICduZXdNZXNzYWdlJyBpbnB1dFxuICAgIHRvZ2dsZVdpbmRvd0ZvY3VzKHdpbmRvdzogV2luZG93KTogdm9pZFxuICAgIHtcbiAgICAgICAgd2luZG93Lmhhc0ZvY3VzID0gIXdpbmRvdy5oYXNGb2N1cztcbiAgICAgICAgaWYod2luZG93Lmhhc0ZvY3VzKSB7XG4gICAgICAgICAgICBjb25zdCB1bnJlYWRNZXNzYWdlcyA9IHdpbmRvdy5tZXNzYWdlc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIobWVzc2FnZSA9PiBtZXNzYWdlLmRhdGVTZWVuID09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgJiYgKG1lc3NhZ2UudG9JZCA9PSB0aGlzLnVzZXJJZCB8fCB3aW5kb3cucGFydGljaXBhbnQucGFydGljaXBhbnRUeXBlID09PSBDaGF0UGFydGljaXBhbnRUeXBlLkdyb3VwKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh1bnJlYWRNZXNzYWdlcyAmJiB1bnJlYWRNZXNzYWdlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMub25NZXNzYWdlc1NlZW4uZW1pdCh1bnJlYWRNZXNzYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtYXJrTWVzc2FnZXNBc1JlYWQobWVzc2FnZXM6IE1lc3NhZ2VbXSk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMub25NZXNzYWdlc1NlZW4uZW1pdChtZXNzYWdlcyk7XG4gICAgfVxuXG4gICAgZmV0Y2hNZXNzYWdlSGlzdG9yeSh3aW5kb3c6IFdpbmRvdyk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uTG9hZEhpc3RvcnlUcmlnZ2VyZWQuZW1pdCh3aW5kb3cpO1xuICAgIH1cblxuICAgIC8vIENsb3NlcyBhIGNoYXQgd2luZG93IHZpYSB0aGUgY2xvc2UgJ1gnIGJ1dHRvblxuICAgIG9uQ2xvc2VDaGF0V2luZG93KCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMub25DaGF0V2luZG93Q2xvc2VkLmVtaXQoeyBjbG9zZWRXaW5kb3c6IHRoaXMud2luZG93LCBjbG9zZWRWaWFFc2NhcGVLZXk6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8qICBNb25pdG9ycyBwcmVzc2VkIGtleXMgb24gYSBjaGF0IHdpbmRvd1xuICAgICAgICAtIERpc3BhdGNoZXMgYSBtZXNzYWdlIHdoZW4gdGhlIEVOVEVSIGtleSBpcyBwcmVzc2VkXG4gICAgICAgIC0gVGFicyBiZXR3ZWVuIHdpbmRvd3Mgb24gVEFCIG9yIFNISUZUICsgVEFCXG4gICAgICAgIC0gQ2xvc2VzIHRoZSBjdXJyZW50IGZvY3VzZWQgd2luZG93IG9uIEVTQ1xuICAgICovXG4gICBvbkNoYXRJbnB1dFR5cGVkKGV2ZW50OiBhbnksIHdpbmRvdzogV2luZG93KTogdm9pZFxuICAge1xuICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSlcbiAgICAgICB7XG4gICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICBpZiAod2luZG93Lm5ld01lc3NhZ2UgJiYgd2luZG93Lm5ld01lc3NhZ2UudHJpbSgpICE9IFwiXCIpXG4gICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mcm9tSWQgPSB0aGlzLnVzZXJJZDtcbiAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRvSWQgPSB3aW5kb3cucGFydGljaXBhbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tZXNzYWdlID0gd2luZG93Lm5ld01lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRlU2VudCA9IG5ldyBEYXRlKCk7XG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgd2luZG93Lm1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgdGhpcy5vbk1lc3NhZ2VTZW50LmVtaXQobWVzc2FnZSk7XG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgd2luZG93Lm5ld01lc3NhZ2UgPSBcIlwiOyAvLyBSZXNldHMgdGhlIG5ldyBtZXNzYWdlIGlucHV0XG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDaGF0V2luZG93KHdpbmRvdywgU2Nyb2xsRGlyZWN0aW9uLkJvdHRvbSk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgdGhpcy5vblRhYlRyaWdnZXJlZC5lbWl0KHsgdHJpZ2dlcmluZ1dpbmRvdzogd2luZG93LCBzaGlmdEtleVByZXNzZWQ6IGV2ZW50LnNoaWZ0S2V5IH0pO1xuXG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgIHRoaXMub25DaGF0V2luZG93Q2xvc2VkLmVtaXQoeyBjbG9zZWRXaW5kb3c6IHdpbmRvdywgY2xvc2VkVmlhRXNjYXBlS2V5OiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICB9XG4gICB9XG5cbiAgICAvLyBUb2dnbGVzIGEgY2hhdCB3aW5kb3cgdmlzaWJpbGl0eSBiZXR3ZWVuIG1heGltaXplZC9taW5pbWl6ZWRcbiAgICBvbkNoYXRXaW5kb3dDbGlja2VkKHdpbmRvdzogV2luZG93KTogdm9pZFxuICAgIHtcbiAgICAgICAgd2luZG93LmlzQ29sbGFwc2VkID0gIXdpbmRvdy5pc0NvbGxhcHNlZDtcbiAgICAgICAgdGhpcy5zY3JvbGxDaGF0V2luZG93KHdpbmRvdywgU2Nyb2xsRGlyZWN0aW9uLkJvdHRvbSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckluVXNlRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRJbnN0YW5jZUlkOiBzdHJpbmcpOiB2b2lkXG4gICAge1xuICAgICAgICBjb25zdCB1cGxvYWRlckluc3RhbmNlSWRJbmRleCA9IHRoaXMuZmlsZVVwbG9hZGVyc0luVXNlLmluZGV4T2YoZmlsZVVwbG9hZEluc3RhbmNlSWQpO1xuXG4gICAgICAgIGlmICh1cGxvYWRlckluc3RhbmNlSWRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRlcnNJblVzZS5zcGxpY2UodXBsb2FkZXJJbnN0YW5jZUlkSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlcyBmaWxlIHNlbGVjdGlvbiBhbmQgdXBsb2FkcyB0aGUgc2VsZWN0ZWQgZmlsZSB1c2luZyB0aGUgZmlsZSB1cGxvYWQgYWRhcHRlclxuICAgIG9uRmlsZUNob3Nlbih3aW5kb3c6IFdpbmRvdyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWxlVXBsb2FkSW5zdGFuY2VJZCA9IHRoaXMuZ2V0VW5pcXVlRmlsZVVwbG9hZEluc3RhbmNlSWQod2luZG93KTtcbiAgICAgICAgY29uc3QgdXBsb2FkRWxlbWVudFJlZiA9IHRoaXMubmF0aXZlRmlsZUlucHV0O1xuXG4gICAgICAgIGlmICh1cGxvYWRFbGVtZW50UmVmKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBmaWxlOiBGaWxlID0gdXBsb2FkRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZpbGVzWzBdO1xuXG4gICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRlcnNJblVzZS5wdXNoKGZpbGVVcGxvYWRJbnN0YW5jZUlkKTtcblxuICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkQWRhcHRlci51cGxvYWRGaWxlKGZpbGUsIHdpbmRvdy5wYXJ0aWNpcGFudC5pZClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGZpbGVNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckluVXNlRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRJbnN0YW5jZUlkKTtcblxuICAgICAgICAgICAgICAgICAgICBmaWxlTWVzc2FnZS5mcm9tSWQgPSB0aGlzLnVzZXJJZDtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQdXNoIGZpbGUgbWVzc2FnZSB0byBjdXJyZW50IHVzZXIgd2luZG93XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5tZXNzYWdlcy5wdXNoKGZpbGVNZXNzYWdlKTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25NZXNzYWdlU2VudC5lbWl0KGZpbGVNZXNzYWdlKTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ2hhdFdpbmRvdyh3aW5kb3csIFNjcm9sbERpcmVjdGlvbi5Cb3R0b20pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0cyB0aGUgZmlsZSB1cGxvYWQgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckluVXNlRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRJbnN0YW5jZUlkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIGZpbGUgdXBsb2FkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogSW52b2tlIGEgZmlsZSB1cGxvYWQgYWRhcHRlciBlcnJvciBoZXJlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qIGVzbGludC1lbmFibGUgKi8iLCI8bmctY29udGFpbmVyICpuZ0lmPVwid2luZG93ICYmIHdpbmRvdy5pc0NvbGxhcHNlZFwiPlxuXHQ8ZGl2IGNsYXNzPVwibmctY2hhdC10aXRsZSBzZWNvbmRhcnktYmFja2dyb3VuZFwiPlxuXHRcdDxkaXYgY2xhc3M9XCJuZy1jaGF0LXRpdGxlLXZpc2liaWxpdHktdG9nZ2xlLWFyZWFcIiAoY2xpY2spPVwib25DaGF0V2luZG93Q2xpY2tlZCh3aW5kb3cpXCI+XG5cdFx0XHQ8c3Ryb25nIHRpdGxlPVwie3t3aW5kb3cucGFydGljaXBhbnQuZGlzcGxheU5hbWV9fVwiPlxuXHRcdFx0XHR7e3dpbmRvdy5wYXJ0aWNpcGFudC5kaXNwbGF5TmFtZX19XG5cdFx0XHQ8L3N0cm9uZz5cblx0XHRcdDxzcGFuIFtuZ0NsYXNzXT1cInsnbmctY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMnOiB0cnVlLCAnb25saW5lJzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLk9ubGluZSwgJ2J1c3knOiB3aW5kb3cucGFydGljaXBhbnQuc3RhdHVzID09PSBDaGF0UGFydGljaXBhbnRTdGF0dXMuQnVzeSwgJ2F3YXknOiB3aW5kb3cucGFydGljaXBhbnQuc3RhdHVzID09PSBDaGF0UGFydGljaXBhbnRTdGF0dXMuQXdheSwgJ29mZmxpbmUnOiB3aW5kb3cucGFydGljaXBhbnQuc3RhdHVzID09PSBDaGF0UGFydGljaXBhbnRTdGF0dXMuT2ZmbGluZX1cIiB0aXRsZT1cInt7Y2hhdFBhcnRpY2lwYW50U3RhdHVzRGVzY3JpcHRvcih3aW5kb3cucGFydGljaXBhbnQuc3RhdHVzLCBsb2NhbGl6YXRpb24pfX1cIj48L3NwYW4+XG5cdFx0XHQ8c3BhbiAqbmdJZj1cInVucmVhZE1lc3NhZ2VzVG90YWwod2luZG93KS5sZW5ndGggPiAwXCIgY2xhc3M9XCJuZy1jaGF0LXVucmVhZC1tZXNzYWdlcy1jb3VudCB1bnJlYWQtbWVzc2FnZXMtY291bnRlci1jb250YWluZXIgcHJpbWFyeS10ZXh0XCI+e3t1bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdyl9fTwvc3Bhbj5cblx0XHQ8L2Rpdj5cblx0XHQ8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIGNsYXNzPVwibmctY2hhdC1jbG9zZSBwcmltYXJ5LXRleHRcIiAoY2xpY2spPVwib25DbG9zZUNoYXRXaW5kb3coKVwiPiYjeDI3MTU7PC9hPlxuXHQ8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIndpbmRvdyAmJiAhd2luZG93LmlzQ29sbGFwc2VkXCI+ICBcblx0PGRpdiBjbGFzcz1cIm5nLWNoYXQtdGl0bGUgc2Vjb25kYXJ5LWJhY2tncm91bmRcIj5cblx0XHQ8ZGl2IGNsYXNzPVwibmctY2hhdC10aXRsZS12aXNpYmlsaXR5LXRvZ2dsZS1hcmVhXCIgKGNsaWNrKT1cIm9uQ2hhdFdpbmRvd0NsaWNrZWQod2luZG93KVwiPlxuXHRcdFx0PHN0cm9uZyB0aXRsZT1cInt7d2luZG93LnBhcnRpY2lwYW50LmRpc3BsYXlOYW1lfX1cIj5cblx0XHRcdFx0e3t3aW5kb3cucGFydGljaXBhbnQuZGlzcGxheU5hbWV9fVxuXHRcdFx0PC9zdHJvbmc+XG5cdFx0XHQ8c3BhbiBbbmdDbGFzc109XCJ7J25nLWNoYXQtcGFydGljaXBhbnQtc3RhdHVzJzogdHJ1ZSwgJ29ubGluZSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5PbmxpbmUsICdidXN5Jzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLkJ1c3ksICdhd2F5Jzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLkF3YXksICdvZmZsaW5lJzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLk9mZmxpbmV9XCIgdGl0bGU9XCJ7e2NoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3Iod2luZG93LnBhcnRpY2lwYW50LnN0YXR1cywgbG9jYWxpemF0aW9uKX19XCI+PC9zcGFuPlxuXHRcdFx0PHNwYW4gKm5nSWY9XCJ1bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdykubGVuZ3RoID4gMFwiIGNsYXNzPVwibmctY2hhdC11bnJlYWQtbWVzc2FnZXMtY291bnQgdW5yZWFkLW1lc3NhZ2VzLWNvdW50ZXItY29udGFpbmVyIHByaW1hcnktdGV4dFwiPnt7dW5yZWFkTWVzc2FnZXNUb3RhbCh3aW5kb3cpfX08L3NwYW4+XG5cdFx0PC9kaXY+XG5cdFx0PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cIm5nLWNoYXQtY2xvc2UgcHJpbWFyeS10ZXh0XCIgKGNsaWNrKT1cIm9uQ2xvc2VDaGF0V2luZG93KClcIj4mI3gyNzE1OzwvYT5cblx0XHQ8IS0tIDxuZy1jaGF0LW9wdGlvbnMgW25nQ2xhc3NdPVwiJ25nLWNoYXQtb3B0aW9ucy1jb250YWluZXInXCIgW29wdGlvbnNdPVwiZGVmYXVsdFdpbmRvd09wdGlvbnMod2luZG93KVwiIChhY3RpdmVPcHRpb25UcmFja2VyQ2hhbmdlKT1cImFjdGl2ZU9wdGlvblRyYWNrZXJDaGFuZ2UoJGV2ZW50KVwiPjwvbmctY2hhdC1vcHRpb25zPiAtLT5cblx0PC9kaXY+XG5cdFx0PGRpdiAjY2hhdE1lc3NhZ2VzIGNsYXNzPVwibmctY2hhdC1tZXNzYWdlcyBwcmltYXJ5LWJhY2tncm91bmRcIj5cblx0XHRcdDxkaXYgKm5nSWY9XCJ3aW5kb3cuaXNMb2FkaW5nSGlzdG9yeVwiIGNsYXNzPVwibmctY2hhdC1sb2FkaW5nLXdyYXBwZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImxvYWRlclwiPkxvYWRpbmcgaGlzdG9yeS4uLjwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2ICpuZ0lmPVwiaGFzUGFnZWRIaXN0b3J5ICYmIHdpbmRvdy5oYXNNb3JlTWVzc2FnZXMgJiYgIXdpbmRvdy5pc0xvYWRpbmdIaXN0b3J5XCIgY2xhc3M9XCJuZy1jaGF0LWxvYWQtaGlzdG9yeVwiPlxuXHRcdFx0XHQ8YSBjbGFzcz1cImxvYWQtaGlzdG9yeS1hY3Rpb25cIiAoY2xpY2spPVwiZmV0Y2hNZXNzYWdlSGlzdG9yeSh3aW5kb3cpXCI+e3tsb2NhbGl6YXRpb24ubG9hZE1lc3NhZ2VIaXN0b3J5UGxhY2Vob2xkZXJ9fTwvYT5cblx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIHdpbmRvdy5tZXNzYWdlczsgbGV0IGkgPSBpbmRleFwiIFtuZ0NsYXNzXT1cInsnbmctY2hhdC1tZXNzYWdlJzogdHJ1ZSwgJ25nLWNoYXQtbWVzc2FnZS1yZWNlaXZlZCc6IG1lc3NhZ2UuZnJvbUlkICE9PSB1c2VySWR9XCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0F2YXRhclZpc2libGUod2luZG93LCBtZXNzYWdlLCBpKVwiPlxuXHRcdFx0XHRcdDxkaXYgKm5nSWY9XCIhZ2V0Q2hhdFdpbmRvd0F2YXRhcih3aW5kb3cucGFydGljaXBhbnQsIG1lc3NhZ2UpXCIgY2xhc3M9XCJpY29uLXdyYXBwZXJcIj5cblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwidXNlci1pY29uXCI+PC9pPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwhLS0gPGltZyAqbmdJZj1cImdldENoYXRXaW5kb3dBdmF0YXIod2luZG93LnBhcnRpY2lwYW50LCBtZXNzYWdlKVwiIGFsdD1cIlwiIGNsYXNzPVwiYXZhdGFyXCIgaGVpZ2h0PVwiMzBcIiB3aWR0aD1cIjMwXCIgW3NyY109XCJnZXRDaGF0V2luZG93QXZhdGFyKHdpbmRvdy5wYXJ0aWNpcGFudCwgbWVzc2FnZSkgfCBzYW5pdGl6ZVwiIC8+IC0tPlxuXHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwid2luZG93LnBhcnRpY2lwYW50LnBhcnRpY2lwYW50VHlwZSA9PT0gQ2hhdFBhcnRpY2lwYW50VHlwZS5Hcm91cFwiIGNsYXNzPVwibmctY2hhdC1wYXJ0aWNpcGFudC1uYW1lXCI+e3t3aW5kb3cucGFydGljaXBhbnQgfCBncm91cE1lc3NhZ2VEaXNwbGF5TmFtZTptZXNzYWdlfX08L3NwYW4+XG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJtZXNzYWdlLnR5cGVcIj5cblx0XHRcdFx0XHQ8ZGl2ICpuZ1N3aXRjaENhc2U9XCJNZXNzYWdlVHlwZS5UZXh0XCIgW25nQ2xhc3NdPVwieydzZW50LWNoYXQtbWVzc2FnZS1jb250YWluZXInOiBtZXNzYWdlLmZyb21JZCA9PT0gdXNlcklkLCAncmVjZWl2ZWQtY2hhdC1tZXNzYWdlLWNvbnRhaW5lcic6IG1lc3NhZ2UuZnJvbUlkICE9PSB1c2VySWR9XCI+XG5cdFx0XHQgIFx0XHRcdDxzcGFuIFtpbm5lckh0bWxdPVwibWVzc2FnZS5tZXNzYWdlIHwgZW1vamlmeTplbW9qaXNFbmFibGVkIHwgbGlua2Z5OmxpbmtmeUVuYWJsZWRcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cInNob3dNZXNzYWdlRGF0ZSAmJiBtZXNzYWdlLmRhdGVTZW50XCIgY2xhc3M9XCJtZXNzYWdlLXNlbnQtZGF0ZVwiPnt7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J2RkJ319L3t7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J01NJ319L3t7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J3knfX0ge3ttZXNzYWdlLmRhdGVTZW50IHwgZGF0ZTonaDptbSBhICd9fTwvc3Bhbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2ICpuZ1N3aXRjaENhc2U9XCJNZXNzYWdlVHlwZS5JbWFnZVwiIFtuZ0NsYXNzXT1cInsnc2VudC1jaGF0LW1lc3NhZ2UtY29udGFpbmVyJzogbWVzc2FnZS5mcm9tSWQgPT09IHVzZXJJZCwgJ3JlY2VpdmVkLWNoYXQtbWVzc2FnZS1jb250YWluZXInOiBtZXNzYWdlLmZyb21JZCAhPT0gdXNlcklkfVwiPlxuXHRcblx0XHRcdCAgXHRcdFx0PGltZyBzcmM9XCJ7e21lc3NhZ2UubWVzc2FnZX19XCIgY2xhc3M9XCJpbWFnZS1tZXNzYWdlXCIgLz5cblx0XG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cInNob3dNZXNzYWdlRGF0ZSAmJiBtZXNzYWdlLmRhdGVTZW50XCIgY2xhc3M9XCJtZXNzYWdlLXNlbnQtZGF0ZVwiPnt7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J2RkJ319L3t7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J01NJ319L3t7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J3knfX0ge3ttZXNzYWdlLmRhdGVTZW50IHwgZGF0ZTonaDptbSBhICd9fTwvc3Bhbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2ICpuZ1N3aXRjaENhc2U9XCJNZXNzYWdlVHlwZS5GaWxlXCIgW25nQ2xhc3NdPVwieydmaWxlLW1lc3NhZ2UtY29udGFpbmVyJzogdHJ1ZSwgJ3JlY2VpdmVkJzogbWVzc2FnZS5mcm9tSWQgIT09IHVzZXJJZH1cIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmaWxlLW1lc3NhZ2UtaWNvbi1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJwYXBlcmNsaXAtaWNvblwiPjwvaT5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PCEtLSA8YSBjbGFzcz1cImZpbGUtZGV0YWlsc1wiIFthdHRyLmhyZWZdPVwibWVzc2FnZS5kb3dubG9hZFVybFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiAoY2xpY2spPVwidGhpcy5tYXJrTWVzc2FnZXNBc1JlYWQoW21lc3NhZ2VdKVwiIGRvd25sb2FkPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImZpbGUtbWVzc2FnZS10aXRsZVwiIFthdHRyLnRpdGxlXT1cIm1lc3NhZ2UubWVzc2FnZVwiPnt7bWVzc2FnZS5tZXNzYWdlfX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwibWVzc2FnZS5maWxlU2l6ZUluQnl0ZXNcIiAgY2xhc3M9XCJmaWxlLW1lc3NhZ2Utc2l6ZVwiPnt7bWVzc2FnZS5maWxlU2l6ZUluQnl0ZXN9fSBCeXRlczwvc3Bhbj5cblx0XHRcdFx0XHRcdDwvYT4gLS0+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0PC9kaXY+XG5cdDwvZGl2PlxuXG5cdDxkaXYgY2xhc3M9XCJuZy1jaGF0LWZvb3RlciBwcmltYXJ5LW91dGxpbmUtY29sb3IgcHJpbWFyeS1iYWNrZ3JvdW5kXCI+XG5cdFx0PGlucHV0ICNjaGF0V2luZG93SW5wdXRcblx0XHRcdHR5cGU9XCJ0ZXh0XCJcblx0XHRcdFtuZ01vZGVsXT1cIndpbmRvdy5uZXdNZXNzYWdlIHwgZW1vamlmeTplbW9qaXNFbmFibGVkXCJcblx0XHRcdChuZ01vZGVsQ2hhbmdlKT1cIndpbmRvdy5uZXdNZXNzYWdlPSRldmVudFwiXG5cdFx0XHRbcGxhY2Vob2xkZXJdPVwibG9jYWxpemF0aW9uLm1lc3NhZ2VQbGFjZWhvbGRlclwiXG5cdFx0XHRbbmdDbGFzc109XCJ7J2NoYXQtd2luZG93LWlucHV0JzogdHJ1ZSwgJ2hhcy1zaWRlLWFjdGlvbic6IGZpbGVVcGxvYWRBZGFwdGVyfVwiXG5cdFx0XHQoa2V5ZG93bik9XCJvbkNoYXRJbnB1dFR5cGVkKCRldmVudCwgd2luZG93KVwiXG5cdFx0XHQoYmx1cik9XCJ0b2dnbGVXaW5kb3dGb2N1cyh3aW5kb3cpXCJcblx0XHRcdChmb2N1cyk9XCJ0b2dnbGVXaW5kb3dGb2N1cyh3aW5kb3cpXCIvPlxuXG5cdFx0PCEtLSBGaWxlIFVwbG9hZCAtLT5cblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsZVVwbG9hZEFkYXB0ZXJcIj5cblx0XHRcdDxhICpuZ0lmPVwiIWlzVXBsb2FkaW5nRmlsZSh3aW5kb3cpXCIgY2xhc3M9XCJidG4tYWRkLWZpbGVcIiAoY2xpY2spPVwidHJpZ2dlck5hdGl2ZUZpbGVVcGxvYWQod2luZG93KVwiPlxuXHRcdFx0XHQ8aSBjbGFzcz1cInVwbG9hZC1pY29uXCI+PC9pPlxuXHRcdFx0PC9hPlxuXHRcdFx0PGlucHV0XG5cdFx0XHRcdHR5cGU9XCJmaWxlXCJcblx0XHRcdFx0I25hdGl2ZUZpbGVJbnB1dFxuXHRcdFx0XHRzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCJcblx0XHRcdFx0W2F0dHIuaWRdPVwiZ2V0VW5pcXVlRmlsZVVwbG9hZEluc3RhbmNlSWQod2luZG93KVwiXG5cdFx0XHRcdChjaGFuZ2UpPVwib25GaWxlQ2hvc2VuKHdpbmRvdylcIiAvPlxuXHRcdFx0PGRpdiAqbmdJZj1cImlzVXBsb2FkaW5nRmlsZSh3aW5kb3cpXCIgY2xhc3M9XCJsb2FkZXJcIj48L2Rpdj5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0PC9kaXY+XG48L25nLWNvbnRhaW5lcj4iXX0=
|