@muraai/mnl-chat 0.0.1 → 0.2.0-alpha-db495b1
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/esm2022/lib/chat.module.mjs +87 -0
- package/esm2022/lib/components/ng-chat/ng-chat.component.mjs +594 -0
- package/esm2022/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.mjs +166 -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 +272 -0
- package/esm2022/lib/core/chat-adapter.mjs +18 -0
- package/esm2022/lib/core/chat-controller.mjs +2 -0
- package/esm2022/lib/core/chat-group-adapter.mjs +2 -0
- package/esm2022/lib/core/chat-option.mjs +2 -0
- package/esm2022/lib/core/chat-participant-status-descriptor.mjs +6 -0
- package/{esm2020 → esm2022}/lib/core/chat-participant-status.enum.mjs +1 -1
- package/esm2022/lib/core/chat-participant-type.enum.mjs +6 -0
- package/esm2022/lib/core/chat-participant.mjs +2 -0
- package/esm2022/lib/core/default-file-upload-adapter.mjs +43 -0
- package/esm2022/lib/core/file-upload-adapter.mjs +2 -0
- package/esm2022/lib/core/group.mjs +14 -0
- package/esm2022/lib/core/guid.mjs +11 -0
- package/esm2022/lib/core/localization.mjs +2 -0
- package/esm2022/lib/core/message-counter.mjs +25 -0
- package/esm2022/lib/core/message-type.enum.mjs +7 -0
- package/esm2022/lib/core/message.mjs +7 -0
- package/esm2022/lib/core/paged-history-chat-adapter.mjs +9 -0
- package/esm2022/lib/core/participant-metadata.mjs +6 -0
- package/esm2022/lib/core/participant-response.mjs +3 -0
- package/esm2022/lib/core/scroll-direction.enum.mjs +6 -0
- package/esm2022/lib/core/theme.enum.mjs +7 -0
- package/esm2022/lib/core/user.mjs +7 -0
- package/esm2022/lib/core/window.mjs +20 -0
- package/esm2022/lib/firstLetter.pipe.mjs +20 -0
- package/esm2022/lib/material.module.mjs +65 -0
- package/esm2022/lib/pipes/emojify.pipe.mjs +41 -0
- package/esm2022/lib/pipes/group-message-display-name.pipe.mjs +24 -0
- package/esm2022/lib/pipes/linkfy.pipe.mjs +34 -0
- package/esm2022/lib/pipes/sanitize.pipe.mjs +21 -0
- package/esm2022/lib/services/chat.service.mjs +14 -0
- package/esm2022/muraai-mnl-chat.mjs +5 -0
- package/esm2022/public-api.mjs +25 -0
- package/fesm2022/muraai-mnl-chat.mjs +1507 -0
- package/fesm2022/muraai-mnl-chat.mjs.map +1 -0
- package/lib/components/ng-chat/ng-chat.component.d.ts +3 -1
- package/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.d.ts +11 -3
- 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 +3 -1
- package/lib/core/chat-participant.d.ts +12 -0
- package/lib/material.module.d.ts +6 -3
- package/package.json +7 -13
- package/src/assets/themes/ng-chat.theme.dark.scss +1 -1
- package/esm2020/lib/chat.module.mjs +0 -87
- 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/chat-adapter.mjs +0 -18
- package/esm2020/lib/core/chat-controller.mjs +0 -2
- package/esm2020/lib/core/chat-group-adapter.mjs +0 -2
- package/esm2020/lib/core/chat-option.mjs +0 -2
- package/esm2020/lib/core/chat-participant-status-descriptor.mjs +0 -6
- package/esm2020/lib/core/chat-participant-type.enum.mjs +0 -6
- package/esm2020/lib/core/chat-participant.mjs +0 -2
- package/esm2020/lib/core/default-file-upload-adapter.mjs +0 -43
- package/esm2020/lib/core/file-upload-adapter.mjs +0 -2
- package/esm2020/lib/core/group.mjs +0 -14
- package/esm2020/lib/core/guid.mjs +0 -11
- package/esm2020/lib/core/localization.mjs +0 -2
- package/esm2020/lib/core/message-counter.mjs +0 -25
- package/esm2020/lib/core/message-type.enum.mjs +0 -7
- package/esm2020/lib/core/message.mjs +0 -7
- package/esm2020/lib/core/paged-history-chat-adapter.mjs +0 -9
- package/esm2020/lib/core/participant-metadata.mjs +0 -6
- package/esm2020/lib/core/participant-response.mjs +0 -3
- package/esm2020/lib/core/scroll-direction.enum.mjs +0 -6
- package/esm2020/lib/core/theme.enum.mjs +0 -7
- package/esm2020/lib/core/user.mjs +0 -7
- package/esm2020/lib/core/window.mjs +0 -20
- package/esm2020/lib/firstLetter.pipe.mjs +0 -20
- package/esm2020/lib/material.module.mjs +0 -50
- package/esm2020/lib/pipes/emojify.pipe.mjs +0 -41
- package/esm2020/lib/pipes/group-message-display-name.pipe.mjs +0 -24
- package/esm2020/lib/pipes/linkfy.pipe.mjs +0 -34
- package/esm2020/lib/pipes/sanitize.pipe.mjs +0 -21
- package/esm2020/lib/services/chat.service.mjs +0 -14
- package/esm2020/muraai-mnl-chat.mjs +0 -5
- package/esm2020/public-api.mjs +0 -25
- package/fesm2015/muraai-mnl-chat.mjs +0 -1426
- package/fesm2015/muraai-mnl-chat.mjs.map +0 -1
- package/fesm2020/muraai-mnl-chat.mjs +0 -1424
- package/fesm2020/muraai-mnl-chat.mjs.map +0 -1
|
@@ -0,0 +1,272 @@
|
|
|
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/material/tooltip";
|
|
13
|
+
import * as i3 from "@angular/common";
|
|
14
|
+
import * as i4 from "../../pipes/emojify.pipe";
|
|
15
|
+
import * as i5 from "../../pipes/linkfy.pipe";
|
|
16
|
+
import * as i6 from "../../pipes/group-message-display-name.pipe";
|
|
17
|
+
export class NgChatWindowComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.emojisEnabled = true;
|
|
20
|
+
this.linkfyEnabled = true;
|
|
21
|
+
this.showMessageDate = true;
|
|
22
|
+
this.messageDatePipeFormat = "short";
|
|
23
|
+
this.hasPagedHistory = true;
|
|
24
|
+
this.onChatWindowClosed = new EventEmitter();
|
|
25
|
+
this.onMessagesSeen = new EventEmitter();
|
|
26
|
+
this.onMessageSent = new EventEmitter();
|
|
27
|
+
this.onTabTriggered = new EventEmitter();
|
|
28
|
+
this.onOptionTriggered = new EventEmitter();
|
|
29
|
+
this.onLoadHistoryTriggered = new EventEmitter();
|
|
30
|
+
// File upload state
|
|
31
|
+
this.fileUploadersInUse = []; // Id bucket of uploaders in use
|
|
32
|
+
// Exposes enums and functions for the ng-template
|
|
33
|
+
this.ChatParticipantType = ChatParticipantType;
|
|
34
|
+
this.ChatParticipantStatus = ChatParticipantStatus;
|
|
35
|
+
this.MessageType = MessageType;
|
|
36
|
+
this.chatParticipantStatusDescriptor = chatParticipantStatusDescriptor;
|
|
37
|
+
}
|
|
38
|
+
defaultWindowOptions(currentWindow) {
|
|
39
|
+
if (this.showOptions && currentWindow.participant.participantType == ChatParticipantType.User) {
|
|
40
|
+
return [{
|
|
41
|
+
isActive: false,
|
|
42
|
+
chattingTo: currentWindow,
|
|
43
|
+
validateContext: (participant) => {
|
|
44
|
+
return participant.participantType == ChatParticipantType.User;
|
|
45
|
+
},
|
|
46
|
+
displayLabel: 'Add People' // TODO: Localize this
|
|
47
|
+
}];
|
|
48
|
+
}
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
// Asserts if a user avatar is visible in a chat cluster
|
|
52
|
+
isAvatarVisible(window, message, index) {
|
|
53
|
+
if (message.fromId != this.userId) {
|
|
54
|
+
if (index == 0) {
|
|
55
|
+
return true; // First message, good to show the thumbnail
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// 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
|
|
59
|
+
if (window.messages[index - 1].fromId != message.fromId) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
getChatWindowAvatar(participant, message) {
|
|
67
|
+
if (participant.participantType == ChatParticipantType.User) {
|
|
68
|
+
return participant.avatar;
|
|
69
|
+
}
|
|
70
|
+
else if (participant.participantType == ChatParticipantType.Group) {
|
|
71
|
+
let group = participant;
|
|
72
|
+
let userIndex = group.chattingTo.findIndex(x => x.id == message.fromId);
|
|
73
|
+
return group.chattingTo[userIndex >= 0 ? userIndex : 0].avatar;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
isUploadingFile(window) {
|
|
78
|
+
const fileUploadInstanceId = this.getUniqueFileUploadInstanceId(window);
|
|
79
|
+
return this.fileUploadersInUse.indexOf(fileUploadInstanceId) > -1;
|
|
80
|
+
}
|
|
81
|
+
// Generates a unique file uploader id for each participant
|
|
82
|
+
getUniqueFileUploadInstanceId(window) {
|
|
83
|
+
if (window && window.participant) {
|
|
84
|
+
return `ng-chat-file-upload-${window.participant.id}`;
|
|
85
|
+
}
|
|
86
|
+
return 'ng-chat-file-upload';
|
|
87
|
+
}
|
|
88
|
+
unreadMessagesTotal(window) {
|
|
89
|
+
return MessageCounter.unreadMessagesTotal(window, this.userId);
|
|
90
|
+
}
|
|
91
|
+
// Scrolls a chat window message flow to the bottom
|
|
92
|
+
scrollChatWindow(window, direction) {
|
|
93
|
+
if (!window.isCollapsed) {
|
|
94
|
+
setTimeout(() => {
|
|
95
|
+
if (this.chatMessages) {
|
|
96
|
+
let element = this.chatMessages.nativeElement;
|
|
97
|
+
let position = (direction === ScrollDirection.Top) ? 0 : element.scrollHeight;
|
|
98
|
+
element.scrollTop = position;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
activeOptionTrackerChange(option) {
|
|
104
|
+
this.onOptionTriggered.emit(option);
|
|
105
|
+
}
|
|
106
|
+
// Triggers native file upload for file selection from the user
|
|
107
|
+
triggerNativeFileUpload(window) {
|
|
108
|
+
if (window) {
|
|
109
|
+
if (this.nativeFileInput)
|
|
110
|
+
this.nativeFileInput.nativeElement.click();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Toggles a window focus on the focus/blur of a 'newMessage' input
|
|
114
|
+
toggleWindowFocus(window) {
|
|
115
|
+
window.hasFocus = !window.hasFocus;
|
|
116
|
+
if (window.hasFocus) {
|
|
117
|
+
const unreadMessages = window.messages
|
|
118
|
+
.filter(message => message.dateSeen == null
|
|
119
|
+
&& (message.toId == this.userId || window.participant.participantType === ChatParticipantType.Group));
|
|
120
|
+
if (unreadMessages && unreadMessages.length > 0) {
|
|
121
|
+
this.onMessagesSeen.emit(unreadMessages);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
markMessagesAsRead(messages) {
|
|
126
|
+
this.onMessagesSeen.emit(messages);
|
|
127
|
+
}
|
|
128
|
+
fetchMessageHistory(window) {
|
|
129
|
+
this.onLoadHistoryTriggered.emit(window);
|
|
130
|
+
}
|
|
131
|
+
// Closes a chat window via the close 'X' button
|
|
132
|
+
onCloseChatWindow() {
|
|
133
|
+
this.onChatWindowClosed.emit({ closedWindow: this.window, closedViaEscapeKey: false });
|
|
134
|
+
}
|
|
135
|
+
/* Monitors pressed keys on a chat window
|
|
136
|
+
- Dispatches a message when the ENTER key is pressed
|
|
137
|
+
- Tabs between windows on TAB or SHIFT + TAB
|
|
138
|
+
- Closes the current focused window on ESC
|
|
139
|
+
*/
|
|
140
|
+
onChatInputTyped(event, window) {
|
|
141
|
+
switch (event.keyCode) {
|
|
142
|
+
case 13:
|
|
143
|
+
if (window.newMessage && window.newMessage.trim() != "") {
|
|
144
|
+
let message = new Message();
|
|
145
|
+
message.fromId = this.userId;
|
|
146
|
+
message.toId = window.participant.id;
|
|
147
|
+
message.message = window.newMessage;
|
|
148
|
+
message.dateSent = new Date();
|
|
149
|
+
window.messages.push(message);
|
|
150
|
+
this.onMessageSent.emit(message);
|
|
151
|
+
window.newMessage = ""; // Resets the new message input
|
|
152
|
+
this.scrollChatWindow(window, ScrollDirection.Bottom);
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
case 9:
|
|
156
|
+
event.preventDefault();
|
|
157
|
+
this.onTabTriggered.emit({ triggeringWindow: window, shiftKeyPressed: event.shiftKey });
|
|
158
|
+
break;
|
|
159
|
+
case 27:
|
|
160
|
+
this.onChatWindowClosed.emit({ closedWindow: window, closedViaEscapeKey: true });
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Toggles a chat window visibility between maximized/minimized
|
|
165
|
+
onChatWindowClicked(window) {
|
|
166
|
+
window.isCollapsed = !window.isCollapsed;
|
|
167
|
+
this.scrollChatWindow(window, ScrollDirection.Bottom);
|
|
168
|
+
}
|
|
169
|
+
clearInUseFileUploader(fileUploadInstanceId) {
|
|
170
|
+
const uploaderInstanceIdIndex = this.fileUploadersInUse.indexOf(fileUploadInstanceId);
|
|
171
|
+
if (uploaderInstanceIdIndex > -1) {
|
|
172
|
+
this.fileUploadersInUse.splice(uploaderInstanceIdIndex, 1);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Handles file selection and uploads the selected file using the file upload adapter
|
|
176
|
+
onFileChosen(window) {
|
|
177
|
+
const fileUploadInstanceId = this.getUniqueFileUploadInstanceId(window);
|
|
178
|
+
const uploadElementRef = this.nativeFileInput;
|
|
179
|
+
if (uploadElementRef) {
|
|
180
|
+
const file = uploadElementRef.nativeElement.files[0];
|
|
181
|
+
this.fileUploadersInUse.push(fileUploadInstanceId);
|
|
182
|
+
this.fileUploadAdapter.uploadFile(file, window.participant.id)
|
|
183
|
+
.subscribe(fileMessage => {
|
|
184
|
+
this.clearInUseFileUploader(fileUploadInstanceId);
|
|
185
|
+
fileMessage.fromId = this.userId;
|
|
186
|
+
// Push file message to current user window
|
|
187
|
+
window.messages.push(fileMessage);
|
|
188
|
+
this.onMessageSent.emit(fileMessage);
|
|
189
|
+
this.scrollChatWindow(window, ScrollDirection.Bottom);
|
|
190
|
+
// Resets the file upload element
|
|
191
|
+
uploadElementRef.nativeElement.value = '';
|
|
192
|
+
}, (error) => {
|
|
193
|
+
this.clearInUseFileUploader(fileUploadInstanceId);
|
|
194
|
+
// Resets the file upload element
|
|
195
|
+
uploadElementRef.nativeElement.value = '';
|
|
196
|
+
// TODO: Invoke a file upload adapter error here
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
getParticipantTooltip(participant) {
|
|
201
|
+
const { metadata, displayName } = participant;
|
|
202
|
+
if (!metadata)
|
|
203
|
+
return displayName;
|
|
204
|
+
const { primary, secondary, tertiary } = metadata;
|
|
205
|
+
const parts = [primary, secondary, tertiary].filter(Boolean);
|
|
206
|
+
return parts.length > 0 ? parts.join(' | ') : displayName;
|
|
207
|
+
}
|
|
208
|
+
getMetadataDisplay(participant) {
|
|
209
|
+
if (!participant.metadata || !participant.showMetadataInTitle) {
|
|
210
|
+
return '';
|
|
211
|
+
}
|
|
212
|
+
const parts = [];
|
|
213
|
+
if (participant.showMetadataInTitle.primary && participant.metadata.primary) {
|
|
214
|
+
parts.push(participant.metadata.primary);
|
|
215
|
+
}
|
|
216
|
+
if (participant.showMetadataInTitle.secondary && participant.metadata.secondary) {
|
|
217
|
+
parts.push(participant.metadata.secondary);
|
|
218
|
+
}
|
|
219
|
+
if (participant.showMetadataInTitle.tertiary && participant.metadata.tertiary) {
|
|
220
|
+
parts.push(participant.metadata.tertiary);
|
|
221
|
+
}
|
|
222
|
+
return parts.join(' | ');
|
|
223
|
+
}
|
|
224
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
225
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", 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 [matTooltip]=\"getParticipantTooltip(window.participant)\">\n\t\t\t\t{{window.participant.displayName}} <span *ngIf=\"getMetadataDisplay(window.participant)\">({{ getMetadataDisplay(window.participant) }})</span>\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}\" [matTooltip]=\"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 [matTooltip]=\"getParticipantTooltip(window.participant)\">\n\t\t\t\t{{window.participant.displayName}} <span *ngIf=\"getMetadataDisplay(window.participant)\">({{ getMetadataDisplay(window.participant) }})</span>\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}\" [matTooltip]=\"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.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i4.EmojifyPipe, name: "emojify" }, { kind: "pipe", type: i5.LinkfyPipe, name: "linkfy" }, { kind: "pipe", type: i6.GroupMessageDisplayNamePipe, name: "groupMessageDisplayName" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
226
|
+
}
|
|
227
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgChatWindowComponent, decorators: [{
|
|
228
|
+
type: Component,
|
|
229
|
+
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 [matTooltip]=\"getParticipantTooltip(window.participant)\">\n\t\t\t\t{{window.participant.displayName}} <span *ngIf=\"getMetadataDisplay(window.participant)\">({{ getMetadataDisplay(window.participant) }})</span>\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}\" [matTooltip]=\"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 [matTooltip]=\"getParticipantTooltip(window.participant)\">\n\t\t\t\t{{window.participant.displayName}} <span *ngIf=\"getMetadataDisplay(window.participant)\">({{ getMetadataDisplay(window.participant) }})</span>\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}\" [matTooltip]=\"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"] }]
|
|
230
|
+
}], ctorParameters: () => [], propDecorators: { fileUploadAdapter: [{
|
|
231
|
+
type: Input
|
|
232
|
+
}], window: [{
|
|
233
|
+
type: Input
|
|
234
|
+
}], userId: [{
|
|
235
|
+
type: Input
|
|
236
|
+
}], localization: [{
|
|
237
|
+
type: Input
|
|
238
|
+
}], showOptions: [{
|
|
239
|
+
type: Input
|
|
240
|
+
}], emojisEnabled: [{
|
|
241
|
+
type: Input
|
|
242
|
+
}], linkfyEnabled: [{
|
|
243
|
+
type: Input
|
|
244
|
+
}], showMessageDate: [{
|
|
245
|
+
type: Input
|
|
246
|
+
}], messageDatePipeFormat: [{
|
|
247
|
+
type: Input
|
|
248
|
+
}], hasPagedHistory: [{
|
|
249
|
+
type: Input
|
|
250
|
+
}], onChatWindowClosed: [{
|
|
251
|
+
type: Output
|
|
252
|
+
}], onMessagesSeen: [{
|
|
253
|
+
type: Output
|
|
254
|
+
}], onMessageSent: [{
|
|
255
|
+
type: Output
|
|
256
|
+
}], onTabTriggered: [{
|
|
257
|
+
type: Output
|
|
258
|
+
}], onOptionTriggered: [{
|
|
259
|
+
type: Output
|
|
260
|
+
}], onLoadHistoryTriggered: [{
|
|
261
|
+
type: Output
|
|
262
|
+
}], chatMessages: [{
|
|
263
|
+
type: ViewChild,
|
|
264
|
+
args: ['chatMessages']
|
|
265
|
+
}], nativeFileInput: [{
|
|
266
|
+
type: ViewChild,
|
|
267
|
+
args: ['nativeFileInput']
|
|
268
|
+
}], chatWindowInput: [{
|
|
269
|
+
type: ViewChild,
|
|
270
|
+
args: ['chatWindowInput']
|
|
271
|
+
}] } });
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29tcG9uZW50cy9uZy1jaGF0LXdpbmRvdy9uZy1jaGF0LXdpbmRvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NoYXQvc3JjL2xpYi9jb21wb25lbnRzL25nLWNoYXQtd2luZG93L25nLWNoYXQtd2luZG93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUtuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUU1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sK0NBQStDLENBQUM7Ozs7Ozs7O0FBUWhHLE1BQU0sT0FBTyxxQkFBcUI7SUFDOUI7UUFrQk8sa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFHOUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFHOUIsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFHaEMsMEJBQXFCLEdBQVcsT0FBTyxDQUFDO1FBR3hDLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBR2hDLHVCQUFrQixHQUF1RSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRzVHLG1CQUFjLEdBQTRCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHN0Qsa0JBQWEsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxRCxtQkFBYyxHQUF5RSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRzFHLHNCQUFpQixHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2xFLDJCQUFzQixHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBTXpFLG9CQUFvQjtRQUNiLHVCQUFrQixHQUFhLEVBQUUsQ0FBQyxDQUFDLGdDQUFnQztRQUUxRSxrREFBa0Q7UUFDM0Msd0JBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDMUMsMEJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFDOUMsZ0JBQVcsR0FBRyxXQUFXLENBQUM7UUFDMUIsb0NBQStCLEdBQUcsK0JBQStCLENBQUM7SUE3RHpELENBQUM7SUErRGpCLG9CQUFvQixDQUFDLGFBQXFCO1FBRXRDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsV0FBVyxDQUFDLGVBQWUsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQzdGLENBQUM7WUFDRyxPQUFPLENBQUM7b0JBQ0osUUFBUSxFQUFFLEtBQUs7b0JBQ2YsVUFBVSxFQUFFLGFBQWE7b0JBQ3pCLGVBQWUsRUFBRSxDQUFDLFdBQTZCLEVBQUUsRUFBRTt3QkFDL0MsT0FBTyxXQUFXLENBQUMsZUFBZSxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQztvQkFDbkUsQ0FBQztvQkFDRCxZQUFZLEVBQUUsWUFBWSxDQUFDLHNCQUFzQjtpQkFDcEQsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxlQUFlLENBQUMsTUFBYyxFQUFFLE9BQWdCLEVBQUUsS0FBYTtRQUUzRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFDO1lBQy9CLElBQUksS0FBSyxJQUFJLENBQUMsRUFBQyxDQUFDO2dCQUNaLE9BQU8sSUFBSSxDQUFDLENBQUMsNENBQTRDO1lBQzdELENBQUM7aUJBQ0csQ0FBQztnQkFDRCw4SUFBOEk7Z0JBQzlJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUMsQ0FBQztvQkFDckQsT0FBTyxJQUFJLENBQUM7Z0JBQ2hCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxXQUE2QixFQUFFLE9BQWdCO1FBRS9ELElBQUksV0FBVyxDQUFDLGVBQWUsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQzNELENBQUM7WUFDRyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDOUIsQ0FBQzthQUNJLElBQUksV0FBVyxDQUFDLGVBQWUsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLEVBQ2pFLENBQUM7WUFDRyxJQUFJLEtBQUssR0FBRyxXQUFvQixDQUFDO1lBQ2pDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFeEUsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ25FLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQWM7UUFFMUIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCw2QkFBNkIsQ0FBQyxNQUFjO1FBRXhDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQ2hDLENBQUM7WUFDRyxPQUFPLHVCQUF1QixNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFELENBQUM7UUFFRCxPQUFPLHFCQUFxQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFjO1FBRTlCLE9BQU8sY0FBYyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsU0FBMEI7UUFFdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUMsQ0FBQztZQUNyQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksSUFBSSxDQUFDLFlBQVksRUFBQyxDQUFDO29CQUNuQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztvQkFDOUMsSUFBSSxRQUFRLEdBQUcsQ0FBRSxTQUFTLEtBQUssZUFBZSxDQUFDLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7b0JBQ2hGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO2dCQUNqQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVELHlCQUF5QixDQUFDLE1BQW1CO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELCtEQUErRDtJQUMvRCx1QkFBdUIsQ0FBQyxNQUFjO1FBRWxDLElBQUksTUFBTSxFQUNWLENBQUM7WUFDRyxJQUFJLElBQUksQ0FBQyxlQUFlO2dCQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pFLENBQUM7SUFDTCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLGlCQUFpQixDQUFDLE1BQWM7UUFFNUIsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDbkMsSUFBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVE7aUJBQ2pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSTttQkFDcEMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEtBQUssbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUU5RyxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDL0MsQ0FBQztnQkFDRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxRQUFtQjtRQUVsQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBYztRQUM5QixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsaUJBQWlCO1FBRWIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVEOzs7O01BSUU7SUFDSCxnQkFBZ0IsQ0FBQyxLQUFVLEVBQUUsTUFBYztRQUV2QyxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQ3JCLENBQUM7WUFDRyxLQUFLLEVBQUU7Z0JBQ0gsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUN2RCxDQUFDO29CQUNHLElBQUksT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7b0JBRTVCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDN0IsT0FBTyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO29CQUNwQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7b0JBRTlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUU5QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFakMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7b0JBRXZELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO2dCQUNELE1BQU07WUFDVixLQUFLLENBQUM7Z0JBQ0YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUV2QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBRXhGLE1BQU07WUFDVixLQUFLLEVBQUU7Z0JBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFakYsTUFBTTtRQUNkLENBQUM7SUFDTCxDQUFDO0lBRUEsK0RBQStEO0lBQy9ELG1CQUFtQixDQUFDLE1BQWM7UUFFOUIsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVPLHNCQUFzQixDQUFDLG9CQUE0QjtRQUV2RCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUV0RixJQUFJLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0wsQ0FBQztJQUVELHFGQUFxRjtJQUNyRixZQUFZLENBQUMsTUFBYztRQUN2QixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFFOUMsSUFBSSxnQkFBZ0IsRUFDcEIsQ0FBQztZQUNHLE1BQU0sSUFBSSxHQUFTLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBRW5ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2lCQUN6RCxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUVsRCxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBRWpDLDJDQUEyQztnQkFDM0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRWxDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUVyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFdEQsaUNBQWlDO2dCQUNqQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM5QyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDVCxJQUFJLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFFbEQsaUNBQWlDO2dCQUNqQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFFMUMsZ0RBQWdEO1lBQ3BELENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNMLENBQUM7SUFDRCxxQkFBcUIsQ0FBQyxXQUE2QjtRQUMvQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sV0FBVyxDQUFDO1FBRWxDLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTdELE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztJQUM5RCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsV0FBNkI7UUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM1RCxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxXQUFXLENBQUMsbUJBQW1CLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5RSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVFLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7K0dBNVRRLHFCQUFxQjttR0FBckIscUJBQXFCLDY2QkN0QmxDLCt5TkF5RmU7OzRGRG5FRixxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0ksZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUk7d0RBTTlCLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBSUMsTUFBTTtzQkFEWixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxxQkFBcUI7c0JBRDNCLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLE1BQU07Z0JBSUEsY0FBYztzQkFEcEIsTUFBTTtnQkFJQSxhQUFhO3NCQURuQixNQUFNO2dCQUlBLGNBQWM7c0JBRHBCLE1BQU07Z0JBSUEsaUJBQWlCO3NCQUR2QixNQUFNO2dCQUlBLHNCQUFzQjtzQkFENUIsTUFBTTtnQkFHb0IsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNLLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNFLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3RW5jYXBzdWxhdGlvbiwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSBcIi4uLy4uL2NvcmUvbWVzc2FnZVwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwiLi4vLi4vY29yZS9tZXNzYWdlLXR5cGUuZW51bVwiO1xuaW1wb3J0IHsgV2luZG93IH0gZnJvbSBcIi4uLy4uL2NvcmUvd2luZG93XCI7XG5pbXBvcnQgeyBDaGF0UGFydGljaXBhbnRTdGF0dXMgfSBmcm9tIFwiLi4vLi4vY29yZS9jaGF0LXBhcnRpY2lwYW50LXN0YXR1cy5lbnVtXCI7XG5pbXBvcnQgeyBTY3JvbGxEaXJlY3Rpb24gfSBmcm9tIFwiLi4vLi4vY29yZS9zY3JvbGwtZGlyZWN0aW9uLmVudW1cIjtcbmltcG9ydCB7IExvY2FsaXphdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7IElGaWxlVXBsb2FkQWRhcHRlciB9IGZyb20gJy4uLy4uL2NvcmUvZmlsZS11cGxvYWQtYWRhcHRlcic7XG5pbXBvcnQgeyBJQ2hhdE9wdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvY2hhdC1vcHRpb24nO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vLi4vY29yZS9ncm91cFwiO1xuaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50VHlwZSB9IGZyb20gXCIuLi8uLi9jb3JlL2NoYXQtcGFydGljaXBhbnQtdHlwZS5lbnVtXCI7XG5pbXBvcnQgeyBJQ2hhdFBhcnRpY2lwYW50IH0gZnJvbSBcIi4uLy4uL2NvcmUvY2hhdC1wYXJ0aWNpcGFudFwiO1xuaW1wb3J0IHsgTWVzc2FnZUNvdW50ZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9tZXNzYWdlLWNvdW50ZXJcIjtcbmltcG9ydCB7IGNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3IgfSBmcm9tICcuLi8uLi9jb3JlL2NoYXQtcGFydGljaXBhbnQtc3RhdHVzLWRlc2NyaXB0b3InO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25nLWNoYXQtd2luZG93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmctY2hhdC13aW5kb3cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL25nLWNoYXQtd2luZG93LmNvbXBvbmVudC5jc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIE5nQ2hhdFdpbmRvd0NvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7IH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZpbGVVcGxvYWRBZGFwdGVyOiBJRmlsZVVwbG9hZEFkYXB0ZXI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aW5kb3c6IFdpbmRvdztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHVzZXJJZDogYW55O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbG9jYWxpemF0aW9uOiBMb2NhbGl6YXRpb247XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93T3B0aW9uczogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVtb2ppc0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGlua2Z5RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93TWVzc2FnZURhdGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWVzc2FnZURhdGVQaXBlRm9ybWF0OiBzdHJpbmcgPSBcInNob3J0XCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoYXNQYWdlZEhpc3Rvcnk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ2hhdFdpbmRvd0Nsb3NlZDogRXZlbnRFbWl0dGVyPHsgY2xvc2VkV2luZG93OiBXaW5kb3csIGNsb3NlZFZpYUVzY2FwZUtleTogYm9vbGVhbn0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uTWVzc2FnZXNTZWVuOiBFdmVudEVtaXR0ZXI8TWVzc2FnZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbk1lc3NhZ2VTZW50OiBFdmVudEVtaXR0ZXI8TWVzc2FnZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25UYWJUcmlnZ2VyZWQ6IEV2ZW50RW1pdHRlcjx7IHRyaWdnZXJpbmdXaW5kb3c6IFdpbmRvdywgc2hpZnRLZXlQcmVzc2VkOiBib29sZWFuIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uT3B0aW9uVHJpZ2dlcmVkOiBFdmVudEVtaXR0ZXI8SUNoYXRPcHRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uTG9hZEhpc3RvcnlUcmlnZ2VyZWQ6IEV2ZW50RW1pdHRlcjxXaW5kb3c+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZCgnY2hhdE1lc3NhZ2VzJykgY2hhdE1lc3NhZ2VzOiBhbnk7XG4gICAgQFZpZXdDaGlsZCgnbmF0aXZlRmlsZUlucHV0JykgbmF0aXZlRmlsZUlucHV0OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NoYXRXaW5kb3dJbnB1dCcpIGNoYXRXaW5kb3dJbnB1dDogYW55O1xuXG4gICAgLy8gRmlsZSB1cGxvYWQgc3RhdGVcbiAgICBwdWJsaWMgZmlsZVVwbG9hZGVyc0luVXNlOiBzdHJpbmdbXSA9IFtdOyAvLyBJZCBidWNrZXQgb2YgdXBsb2FkZXJzIGluIHVzZVxuXG4gICAgLy8gRXhwb3NlcyBlbnVtcyBhbmQgZnVuY3Rpb25zIGZvciB0aGUgbmctdGVtcGxhdGVcbiAgICBwdWJsaWMgQ2hhdFBhcnRpY2lwYW50VHlwZSA9IENoYXRQYXJ0aWNpcGFudFR5cGU7XG4gICAgcHVibGljIENoYXRQYXJ0aWNpcGFudFN0YXR1cyA9IENoYXRQYXJ0aWNpcGFudFN0YXR1cztcbiAgICBwdWJsaWMgTWVzc2FnZVR5cGUgPSBNZXNzYWdlVHlwZTtcbiAgICBwdWJsaWMgY2hhdFBhcnRpY2lwYW50U3RhdHVzRGVzY3JpcHRvciA9IGNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3I7XG5cbiAgICBkZWZhdWx0V2luZG93T3B0aW9ucyhjdXJyZW50V2luZG93OiBXaW5kb3cpOiBJQ2hhdE9wdGlvbltdXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucyAmJiBjdXJyZW50V2luZG93LnBhcnRpY2lwYW50LnBhcnRpY2lwYW50VHlwZSA9PSBDaGF0UGFydGljaXBhbnRUeXBlLlVzZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjaGF0dGluZ1RvOiBjdXJyZW50V2luZG93LFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQ29udGV4dDogKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aWNpcGFudC5wYXJ0aWNpcGFudFR5cGUgPT0gQ2hhdFBhcnRpY2lwYW50VHlwZS5Vc2VyO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzcGxheUxhYmVsOiAnQWRkIFBlb3BsZScgLy8gVE9ETzogTG9jYWxpemUgdGhpc1xuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0cyBpZiBhIHVzZXIgYXZhdGFyIGlzIHZpc2libGUgaW4gYSBjaGF0IGNsdXN0ZXJcbiAgICBpc0F2YXRhclZpc2libGUod2luZG93OiBXaW5kb3csIG1lc3NhZ2U6IE1lc3NhZ2UsIGluZGV4OiBudW1iZXIpOiBib29sZWFuXG4gICAge1xuICAgICAgICBpZiAobWVzc2FnZS5mcm9tSWQgIT0gdGhpcy51c2VySWQpe1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IDApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBGaXJzdCBtZXNzYWdlLCBnb29kIHRvIHNob3cgdGhlIHRodW1ibmFpbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJldmlvdXMgbWVzc2FnZSBiZWxvbmdzIHRvIHRoZSBzYW1lIHVzZXIsIGlmIGl0IGJlbG9uZ3MgdGhlcmUgaXMgbm8gbmVlZCB0byBzaG93IHRoZSBhdmF0YXIgYWdhaW4gdG8gZm9ybSB0aGUgbWVzc2FnZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5tZXNzYWdlc1tpbmRleCAtIDFdLmZyb21JZCAhPSBtZXNzYWdlLmZyb21JZCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRDaGF0V2luZG93QXZhdGFyKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50LCBtZXNzYWdlOiBNZXNzYWdlKTogc3RyaW5nIHwgbnVsbFxuICAgIHtcbiAgICAgICAgaWYgKHBhcnRpY2lwYW50LnBhcnRpY2lwYW50VHlwZSA9PSBDaGF0UGFydGljaXBhbnRUeXBlLlVzZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0aWNpcGFudC5hdmF0YXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFydGljaXBhbnQucGFydGljaXBhbnRUeXBlID09IENoYXRQYXJ0aWNpcGFudFR5cGUuR3JvdXApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBncm91cCA9IHBhcnRpY2lwYW50IGFzIEdyb3VwO1xuICAgICAgICAgICAgbGV0IHVzZXJJbmRleCA9IGdyb3VwLmNoYXR0aW5nVG8uZmluZEluZGV4KHggPT4geC5pZCA9PSBtZXNzYWdlLmZyb21JZCk7XG5cbiAgICAgICAgICAgIHJldHVybiBncm91cC5jaGF0dGluZ1RvW3VzZXJJbmRleCA+PSAwID8gdXNlckluZGV4IDogMF0uYXZhdGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaXNVcGxvYWRpbmdGaWxlKHdpbmRvdzogV2luZG93KTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgY29uc3QgZmlsZVVwbG9hZEluc3RhbmNlSWQgPSB0aGlzLmdldFVuaXF1ZUZpbGVVcGxvYWRJbnN0YW5jZUlkKHdpbmRvdyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZVVwbG9hZGVyc0luVXNlLmluZGV4T2YoZmlsZVVwbG9hZEluc3RhbmNlSWQpID4gLTE7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGVzIGEgdW5pcXVlIGZpbGUgdXBsb2FkZXIgaWQgZm9yIGVhY2ggcGFydGljaXBhbnRcbiAgICBnZXRVbmlxdWVGaWxlVXBsb2FkSW5zdGFuY2VJZCh3aW5kb3c6IFdpbmRvdyk6IHN0cmluZ1xuICAgIHtcbiAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cucGFydGljaXBhbnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBgbmctY2hhdC1maWxlLXVwbG9hZC0ke3dpbmRvdy5wYXJ0aWNpcGFudC5pZH1gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gJ25nLWNoYXQtZmlsZS11cGxvYWQnO1xuICAgIH1cblxuICAgIHVucmVhZE1lc3NhZ2VzVG90YWwod2luZG93OiBXaW5kb3cpOiBzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQ291bnRlci51bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdywgdGhpcy51c2VySWQpO1xuICAgIH1cblxuICAgIC8vIFNjcm9sbHMgYSBjaGF0IHdpbmRvdyBtZXNzYWdlIGZsb3cgdG8gdGhlIGJvdHRvbVxuICAgIHNjcm9sbENoYXRXaW5kb3cod2luZG93OiBXaW5kb3csIGRpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKCF3aW5kb3cuaXNDb2xsYXBzZWQpe1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhdE1lc3NhZ2VzKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmNoYXRNZXNzYWdlcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSAoIGRpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLlRvcCApID8gMCA6IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWN0aXZlT3B0aW9uVHJhY2tlckNoYW5nZShvcHRpb246IElDaGF0T3B0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25PcHRpb25UcmlnZ2VyZWQuZW1pdChvcHRpb24pO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXJzIG5hdGl2ZSBmaWxlIHVwbG9hZCBmb3IgZmlsZSBzZWxlY3Rpb24gZnJvbSB0aGUgdXNlclxuICAgIHRyaWdnZXJOYXRpdmVGaWxlVXBsb2FkKHdpbmRvdzogV2luZG93KTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHdpbmRvdylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF0aXZlRmlsZUlucHV0KSB0aGlzLm5hdGl2ZUZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUb2dnbGVzIGEgd2luZG93IGZvY3VzIG9uIHRoZSBmb2N1cy9ibHVyIG9mIGEgJ25ld01lc3NhZ2UnIGlucHV0XG4gICAgdG9nZ2xlV2luZG93Rm9jdXMod2luZG93OiBXaW5kb3cpOiB2b2lkXG4gICAge1xuICAgICAgICB3aW5kb3cuaGFzRm9jdXMgPSAhd2luZG93Lmhhc0ZvY3VzO1xuICAgICAgICBpZih3aW5kb3cuaGFzRm9jdXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHVucmVhZE1lc3NhZ2VzID0gd2luZG93Lm1lc3NhZ2VzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihtZXNzYWdlID0+IG1lc3NhZ2UuZGF0ZVNlZW4gPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAmJiAobWVzc2FnZS50b0lkID09IHRoaXMudXNlcklkIHx8IHdpbmRvdy5wYXJ0aWNpcGFudC5wYXJ0aWNpcGFudFR5cGUgPT09IENoYXRQYXJ0aWNpcGFudFR5cGUuR3JvdXApKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHVucmVhZE1lc3NhZ2VzICYmIHVucmVhZE1lc3NhZ2VzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk1lc3NhZ2VzU2Vlbi5lbWl0KHVucmVhZE1lc3NhZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1hcmtNZXNzYWdlc0FzUmVhZChtZXNzYWdlczogTWVzc2FnZVtdKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5vbk1lc3NhZ2VzU2Vlbi5lbWl0KG1lc3NhZ2VzKTtcbiAgICB9XG5cbiAgICBmZXRjaE1lc3NhZ2VIaXN0b3J5KHdpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Mb2FkSGlzdG9yeVRyaWdnZXJlZC5lbWl0KHdpbmRvdyk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2VzIGEgY2hhdCB3aW5kb3cgdmlhIHRoZSBjbG9zZSAnWCcgYnV0dG9uXG4gICAgb25DbG9zZUNoYXRXaW5kb3coKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5vbkNoYXRXaW5kb3dDbG9zZWQuZW1pdCh7IGNsb3NlZFdpbmRvdzogdGhpcy53aW5kb3csIGNsb3NlZFZpYUVzY2FwZUtleTogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgLyogIE1vbml0b3JzIHByZXNzZWQga2V5cyBvbiBhIGNoYXQgd2luZG93XG4gICAgICAgIC0gRGlzcGF0Y2hlcyBhIG1lc3NhZ2Ugd2hlbiB0aGUgRU5URVIga2V5IGlzIHByZXNzZWRcbiAgICAgICAgLSBUYWJzIGJldHdlZW4gd2luZG93cyBvbiBUQUIgb3IgU0hJRlQgKyBUQUJcbiAgICAgICAgLSBDbG9zZXMgdGhlIGN1cnJlbnQgZm9jdXNlZCB3aW5kb3cgb24gRVNDXG4gICAgKi9cbiAgIG9uQ2hhdElucHV0VHlwZWQoZXZlbnQ6IGFueSwgd2luZG93OiBXaW5kb3cpOiB2b2lkXG4gICB7XG4gICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKVxuICAgICAgIHtcbiAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgIGlmICh3aW5kb3cubmV3TWVzc2FnZSAmJiB3aW5kb3cubmV3TWVzc2FnZS50cmltKCkgIT0gXCJcIilcbiAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyb21JZCA9IHRoaXMudXNlcklkO1xuICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudG9JZCA9IHdpbmRvdy5wYXJ0aWNpcGFudC5pZDtcbiAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lc3NhZ2UgPSB3aW5kb3cubmV3TWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGVTZW50ID0gbmV3IERhdGUoKTtcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICB3aW5kb3cubWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICB0aGlzLm9uTWVzc2FnZVNlbnQuZW1pdChtZXNzYWdlKTtcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICB3aW5kb3cubmV3TWVzc2FnZSA9IFwiXCI7IC8vIFJlc2V0cyB0aGUgbmV3IG1lc3NhZ2UgaW5wdXRcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENoYXRXaW5kb3cod2luZG93LCBTY3JvbGxEaXJlY3Rpb24uQm90dG9tKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICB0aGlzLm9uVGFiVHJpZ2dlcmVkLmVtaXQoeyB0cmlnZ2VyaW5nV2luZG93OiB3aW5kb3csIHNoaWZ0S2V5UHJlc3NlZDogZXZlbnQuc2hpZnRLZXkgfSk7XG5cbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgdGhpcy5vbkNoYXRXaW5kb3dDbG9zZWQuZW1pdCh7IGNsb3NlZFdpbmRvdzogd2luZG93LCBjbG9zZWRWaWFFc2NhcGVLZXk6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgIH1cbiAgIH1cblxuICAgIC8vIFRvZ2dsZXMgYSBjaGF0IHdpbmRvdyB2aXNpYmlsaXR5IGJldHdlZW4gbWF4aW1pemVkL21pbmltaXplZFxuICAgIG9uQ2hhdFdpbmRvd0NsaWNrZWQod2luZG93OiBXaW5kb3cpOiB2b2lkXG4gICAge1xuICAgICAgICB3aW5kb3cuaXNDb2xsYXBzZWQgPSAhd2luZG93LmlzQ29sbGFwc2VkO1xuICAgICAgICB0aGlzLnNjcm9sbENoYXRXaW5kb3cod2luZG93LCBTY3JvbGxEaXJlY3Rpb24uQm90dG9tKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFySW5Vc2VGaWxlVXBsb2FkZXIoZmlsZVVwbG9hZEluc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWRcbiAgICB7XG4gICAgICAgIGNvbnN0IHVwbG9hZGVySW5zdGFuY2VJZEluZGV4ID0gdGhpcy5maWxlVXBsb2FkZXJzSW5Vc2UuaW5kZXhPZihmaWxlVXBsb2FkSW5zdGFuY2VJZCk7XG5cbiAgICAgICAgaWYgKHVwbG9hZGVySW5zdGFuY2VJZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyc0luVXNlLnNwbGljZSh1cGxvYWRlckluc3RhbmNlSWRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGVzIGZpbGUgc2VsZWN0aW9uIGFuZCB1cGxvYWRzIHRoZSBzZWxlY3RlZCBmaWxlIHVzaW5nIHRoZSBmaWxlIHVwbG9hZCBhZGFwdGVyXG4gICAgb25GaWxlQ2hvc2VuKHdpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVVcGxvYWRJbnN0YW5jZUlkID0gdGhpcy5nZXRVbmlxdWVGaWxlVXBsb2FkSW5zdGFuY2VJZCh3aW5kb3cpO1xuICAgICAgICBjb25zdCB1cGxvYWRFbGVtZW50UmVmID0gdGhpcy5uYXRpdmVGaWxlSW5wdXQ7XG5cbiAgICAgICAgaWYgKHVwbG9hZEVsZW1lbnRSZWYpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGU6IEZpbGUgPSB1cGxvYWRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZmlsZXNbMF07XG5cbiAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyc0luVXNlLnB1c2goZmlsZVVwbG9hZEluc3RhbmNlSWQpO1xuXG4gICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRBZGFwdGVyLnVwbG9hZEZpbGUoZmlsZSwgd2luZG93LnBhcnRpY2lwYW50LmlkKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZmlsZU1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5Vc2VGaWxlVXBsb2FkZXIoZmlsZVVwbG9hZEluc3RhbmNlSWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZpbGVNZXNzYWdlLmZyb21JZCA9IHRoaXMudXNlcklkO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFB1c2ggZmlsZSBtZXNzYWdlIHRvIGN1cnJlbnQgdXNlciB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm1lc3NhZ2VzLnB1c2goZmlsZU1lc3NhZ2UpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk1lc3NhZ2VTZW50LmVtaXQoZmlsZU1lc3NhZ2UpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDaGF0V2luZG93KHdpbmRvdywgU2Nyb2xsRGlyZWN0aW9uLkJvdHRvbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBmaWxlIHVwbG9hZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5Vc2VGaWxlVXBsb2FkZXIoZmlsZVVwbG9hZEluc3RhbmNlSWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0cyB0aGUgZmlsZSB1cGxvYWQgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcblxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBJbnZva2UgYSBmaWxlIHVwbG9hZCBhZGFwdGVyIGVycm9yIGhlcmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRQYXJ0aWNpcGFudFRvb2x0aXAocGFydGljaXBhbnQ6IElDaGF0UGFydGljaXBhbnQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IG1ldGFkYXRhLCBkaXNwbGF5TmFtZSB9ID0gcGFydGljaXBhbnQ7XG4gICAgICAgIGlmICghbWV0YWRhdGEpIHJldHVybiBkaXNwbGF5TmFtZTtcblxuICAgICAgICBjb25zdCB7IHByaW1hcnksIHNlY29uZGFyeSwgdGVydGlhcnkgfSA9IG1ldGFkYXRhO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IFtwcmltYXJ5LCBzZWNvbmRhcnksIHRlcnRpYXJ5XS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0cy5qb2luKCcgfCAnKSA6IGRpc3BsYXlOYW1lO1xuICAgIH1cbiAgICBcbiAgICBnZXRNZXRhZGF0YURpc3BsYXkocGFydGljaXBhbnQ6IElDaGF0UGFydGljaXBhbnQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXBhcnRpY2lwYW50Lm1ldGFkYXRhIHx8ICFwYXJ0aWNpcGFudC5zaG93TWV0YWRhdGFJblRpdGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgICBpZiAocGFydGljaXBhbnQuc2hvd01ldGFkYXRhSW5UaXRsZS5wcmltYXJ5ICYmIHBhcnRpY2lwYW50Lm1ldGFkYXRhLnByaW1hcnkpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gocGFydGljaXBhbnQubWV0YWRhdGEucHJpbWFyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpY2lwYW50LnNob3dNZXRhZGF0YUluVGl0bGUuc2Vjb25kYXJ5ICYmIHBhcnRpY2lwYW50Lm1ldGFkYXRhLnNlY29uZGFyeSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChwYXJ0aWNpcGFudC5tZXRhZGF0YS5zZWNvbmRhcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWNpcGFudC5zaG93TWV0YWRhdGFJblRpdGxlLnRlcnRpYXJ5ICYmIHBhcnRpY2lwYW50Lm1ldGFkYXRhLnRlcnRpYXJ5KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHBhcnRpY2lwYW50Lm1ldGFkYXRhLnRlcnRpYXJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydHMuam9pbignIHwgJyk7XG4gICAgfVxufVxuXG4vKiBlc2xpbnQtZW5hYmxlICovIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIndpbmRvdyAmJiB3aW5kb3cuaXNDb2xsYXBzZWRcIj5cblx0PGRpdiBjbGFzcz1cIm5nLWNoYXQtdGl0bGUgc2Vjb25kYXJ5LWJhY2tncm91bmRcIj5cblx0XHQ8ZGl2IGNsYXNzPVwibmctY2hhdC10aXRsZS12aXNpYmlsaXR5LXRvZ2dsZS1hcmVhXCIgKGNsaWNrKT1cIm9uQ2hhdFdpbmRvd0NsaWNrZWQod2luZG93KVwiPlxuXHRcdFx0PHN0cm9uZyBbbWF0VG9vbHRpcF09XCJnZXRQYXJ0aWNpcGFudFRvb2x0aXAod2luZG93LnBhcnRpY2lwYW50KVwiPlxuXHRcdFx0XHR7e3dpbmRvdy5wYXJ0aWNpcGFudC5kaXNwbGF5TmFtZX19IDxzcGFuICpuZ0lmPVwiZ2V0TWV0YWRhdGFEaXNwbGF5KHdpbmRvdy5wYXJ0aWNpcGFudClcIj4oe3sgZ2V0TWV0YWRhdGFEaXNwbGF5KHdpbmRvdy5wYXJ0aWNpcGFudCkgfX0pPC9zcGFuPlxuXHRcdFx0PC9zdHJvbmc+XG5cdFx0XHQ8c3BhbiBbbmdDbGFzc109XCJ7J25nLWNoYXQtcGFydGljaXBhbnQtc3RhdHVzJzogdHJ1ZSwgJ29ubGluZSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5PbmxpbmUsICdidXN5Jzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLkJ1c3ksICdhd2F5Jzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLkF3YXksICdvZmZsaW5lJzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLk9mZmxpbmV9XCIgW21hdFRvb2x0aXBdPVwiY2hhdFBhcnRpY2lwYW50U3RhdHVzRGVzY3JpcHRvcih3aW5kb3cucGFydGljaXBhbnQuc3RhdHVzLCBsb2NhbGl6YXRpb24pXCI+PC9zcGFuPlxuXHRcdFx0PHNwYW4gKm5nSWY9XCJ1bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdykubGVuZ3RoID4gMFwiIGNsYXNzPVwibmctY2hhdC11bnJlYWQtbWVzc2FnZXMtY291bnQgdW5yZWFkLW1lc3NhZ2VzLWNvdW50ZXItY29udGFpbmVyIHByaW1hcnktdGV4dFwiPnt7dW5yZWFkTWVzc2FnZXNUb3RhbCh3aW5kb3cpfX08L3NwYW4+XG5cdFx0PC9kaXY+XG5cdFx0PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cIm5nLWNoYXQtY2xvc2UgcHJpbWFyeS10ZXh0XCIgKGNsaWNrKT1cIm9uQ2xvc2VDaGF0V2luZG93KClcIj4mI3gyNzE1OzwvYT5cblx0PC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ3aW5kb3cgJiYgIXdpbmRvdy5pc0NvbGxhcHNlZFwiPiAgXG5cdDxkaXYgY2xhc3M9XCJuZy1jaGF0LXRpdGxlIHNlY29uZGFyeS1iYWNrZ3JvdW5kXCI+XG5cdFx0PGRpdiBjbGFzcz1cIm5nLWNoYXQtdGl0bGUtdmlzaWJpbGl0eS10b2dnbGUtYXJlYVwiIChjbGljayk9XCJvbkNoYXRXaW5kb3dDbGlja2VkKHdpbmRvdylcIj5cblx0XHRcdDxzdHJvbmcgW21hdFRvb2x0aXBdPVwiZ2V0UGFydGljaXBhbnRUb29sdGlwKHdpbmRvdy5wYXJ0aWNpcGFudClcIj5cblx0XHRcdFx0e3t3aW5kb3cucGFydGljaXBhbnQuZGlzcGxheU5hbWV9fSA8c3BhbiAqbmdJZj1cImdldE1ldGFkYXRhRGlzcGxheSh3aW5kb3cucGFydGljaXBhbnQpXCI+KHt7IGdldE1ldGFkYXRhRGlzcGxheSh3aW5kb3cucGFydGljaXBhbnQpIH19KTwvc3Bhbj5cblx0XHRcdDwvc3Ryb25nPlxuXHRcdFx0PHNwYW4gW25nQ2xhc3NdPVwieyduZy1jaGF0LXBhcnRpY2lwYW50LXN0YXR1cyc6IHRydWUsICdvbmxpbmUnOiB3aW5kb3cucGFydGljaXBhbnQuc3RhdHVzID09PSBDaGF0UGFydGljaXBhbnRTdGF0dXMuT25saW5lLCAnYnVzeSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5CdXN5LCAnYXdheSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5Bd2F5LCAnb2ZmbGluZSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5PZmZsaW5lfVwiIFttYXRUb29sdGlwXT1cImNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3Iod2luZG93LnBhcnRpY2lwYW50LnN0YXR1cywgbG9jYWxpemF0aW9uKVwiPjwvc3Bhbj5cblx0XHRcdDxzcGFuICpuZ0lmPVwidW5yZWFkTWVzc2FnZXNUb3RhbCh3aW5kb3cpLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm5nLWNoYXQtdW5yZWFkLW1lc3NhZ2VzLWNvdW50IHVucmVhZC1tZXNzYWdlcy1jb3VudGVyLWNvbnRhaW5lciBwcmltYXJ5LXRleHRcIj57e3VucmVhZE1lc3NhZ2VzVG90YWwod2luZG93KX19PC9zcGFuPlxuXHRcdDwvZGl2PlxuXHRcdDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgY2xhc3M9XCJuZy1jaGF0LWNsb3NlIHByaW1hcnktdGV4dFwiIChjbGljayk9XCJvbkNsb3NlQ2hhdFdpbmRvdygpXCI+JiN4MjcxNTs8L2E+XG5cdFx0PCEtLSA8bmctY2hhdC1vcHRpb25zIFtuZ0NsYXNzXT1cIiduZy1jaGF0LW9wdGlvbnMtY29udGFpbmVyJ1wiIFtvcHRpb25zXT1cImRlZmF1bHRXaW5kb3dPcHRpb25zKHdpbmRvdylcIiAoYWN0aXZlT3B0aW9uVHJhY2tlckNoYW5nZSk9XCJhY3RpdmVPcHRpb25UcmFja2VyQ2hhbmdlKCRldmVudClcIj48L25nLWNoYXQtb3B0aW9ucz4gLS0+XG5cdDwvZGl2PlxuXHRcdDxkaXYgI2NoYXRNZXNzYWdlcyBjbGFzcz1cIm5nLWNoYXQtbWVzc2FnZXMgcHJpbWFyeS1iYWNrZ3JvdW5kXCI+XG5cdFx0XHQ8ZGl2ICpuZ0lmPVwid2luZG93LmlzTG9hZGluZ0hpc3RvcnlcIiBjbGFzcz1cIm5nLWNoYXQtbG9hZGluZy13cmFwcGVyXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJsb2FkZXJcIj5Mb2FkaW5nIGhpc3RvcnkuLi48L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiAqbmdJZj1cImhhc1BhZ2VkSGlzdG9yeSAmJiB3aW5kb3cuaGFzTW9yZU1lc3NhZ2VzICYmICF3aW5kb3cuaXNMb2FkaW5nSGlzdG9yeVwiIGNsYXNzPVwibmctY2hhdC1sb2FkLWhpc3RvcnlcIj5cblx0XHRcdFx0PGEgY2xhc3M9XCJsb2FkLWhpc3RvcnktYWN0aW9uXCIgKGNsaWNrKT1cImZldGNoTWVzc2FnZUhpc3Rvcnkod2luZG93KVwiPnt7bG9jYWxpemF0aW9uLmxvYWRNZXNzYWdlSGlzdG9yeVBsYWNlaG9sZGVyfX08L2E+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiB3aW5kb3cubWVzc2FnZXM7IGxldCBpID0gaW5kZXhcIiBbbmdDbGFzc109XCJ7J25nLWNoYXQtbWVzc2FnZSc6IHRydWUsICduZy1jaGF0LW1lc3NhZ2UtcmVjZWl2ZWQnOiBtZXNzYWdlLmZyb21JZCAhPT0gdXNlcklkfVwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBdmF0YXJWaXNpYmxlKHdpbmRvdywgbWVzc2FnZSwgaSlcIj5cblx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIWdldENoYXRXaW5kb3dBdmF0YXIod2luZG93LnBhcnRpY2lwYW50LCBtZXNzYWdlKVwiIGNsYXNzPVwiaWNvbi13cmFwcGVyXCI+XG5cdFx0XHRcdFx0XHQ8aSBjbGFzcz1cInVzZXItaWNvblwiPjwvaT5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8IS0tIDxpbWcgKm5nSWY9XCJnZXRDaGF0V2luZG93QXZhdGFyKHdpbmRvdy5wYXJ0aWNpcGFudCwgbWVzc2FnZSlcIiBhbHQ9XCJcIiBjbGFzcz1cImF2YXRhclwiIGhlaWdodD1cIjMwXCIgd2lkdGg9XCIzMFwiIFtzcmNdPVwiZ2V0Q2hhdFdpbmRvd0F2YXRhcih3aW5kb3cucGFydGljaXBhbnQsIG1lc3NhZ2UpIHwgc2FuaXRpemVcIiAvPiAtLT5cblx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIndpbmRvdy5wYXJ0aWNpcGFudC5wYXJ0aWNpcGFudFR5cGUgPT09IENoYXRQYXJ0aWNpcGFudFR5cGUuR3JvdXBcIiBjbGFzcz1cIm5nLWNoYXQtcGFydGljaXBhbnQtbmFtZVwiPnt7d2luZG93LnBhcnRpY2lwYW50IHwgZ3JvdXBNZXNzYWdlRGlzcGxheU5hbWU6bWVzc2FnZX19PC9zcGFuPlxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwibWVzc2FnZS50eXBlXCI+XG5cdFx0XHRcdFx0PGRpdiAqbmdTd2l0Y2hDYXNlPVwiTWVzc2FnZVR5cGUuVGV4dFwiIFtuZ0NsYXNzXT1cInsnc2VudC1jaGF0LW1lc3NhZ2UtY29udGFpbmVyJzogbWVzc2FnZS5mcm9tSWQgPT09IHVzZXJJZCwgJ3JlY2VpdmVkLWNoYXQtbWVzc2FnZS1jb250YWluZXInOiBtZXNzYWdlLmZyb21JZCAhPT0gdXNlcklkfVwiPlxuXHRcdFx0ICBcdFx0XHQ8c3BhbiBbaW5uZXJIdG1sXT1cIm1lc3NhZ2UubWVzc2FnZSB8IGVtb2ppZnk6ZW1vamlzRW5hYmxlZCB8IGxpbmtmeTpsaW5rZnlFbmFibGVkXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJzaG93TWVzc2FnZURhdGUgJiYgbWVzc2FnZS5kYXRlU2VudFwiIGNsYXNzPVwibWVzc2FnZS1zZW50LWRhdGVcIj57e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOidkZCd9fS97e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOidNTSd9fS97e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOid5J319IHt7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J2g6bW0gYSAnfX08L3NwYW4+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiAqbmdTd2l0Y2hDYXNlPVwiTWVzc2FnZVR5cGUuSW1hZ2VcIiBbbmdDbGFzc109XCJ7J3NlbnQtY2hhdC1tZXNzYWdlLWNvbnRhaW5lcic6IG1lc3NhZ2UuZnJvbUlkID09PSB1c2VySWQsICdyZWNlaXZlZC1jaGF0LW1lc3NhZ2UtY29udGFpbmVyJzogbWVzc2FnZS5mcm9tSWQgIT09IHVzZXJJZH1cIj5cblx0XG5cdFx0XHQgIFx0XHRcdDxpbWcgc3JjPVwie3ttZXNzYWdlLm1lc3NhZ2V9fVwiIGNsYXNzPVwiaW1hZ2UtbWVzc2FnZVwiIC8+XG5cdFxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJzaG93TWVzc2FnZURhdGUgJiYgbWVzc2FnZS5kYXRlU2VudFwiIGNsYXNzPVwibWVzc2FnZS1zZW50LWRhdGVcIj57e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOidkZCd9fS97e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOidNTSd9fS97e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOid5J319IHt7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J2g6bW0gYSAnfX08L3NwYW4+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiAqbmdTd2l0Y2hDYXNlPVwiTWVzc2FnZVR5cGUuRmlsZVwiIFtuZ0NsYXNzXT1cInsnZmlsZS1tZXNzYWdlLWNvbnRhaW5lcic6IHRydWUsICdyZWNlaXZlZCc6IG1lc3NhZ2UuZnJvbUlkICE9PSB1c2VySWR9XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlsZS1tZXNzYWdlLWljb24tY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwicGFwZXJjbGlwLWljb25cIj48L2k+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwhLS0gPGEgY2xhc3M9XCJmaWxlLWRldGFpbHNcIiBbYXR0ci5ocmVmXT1cIm1lc3NhZ2UuZG93bmxvYWRVcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgKGNsaWNrKT1cInRoaXMubWFya01lc3NhZ2VzQXNSZWFkKFttZXNzYWdlXSlcIiBkb3dubG9hZD5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJmaWxlLW1lc3NhZ2UtdGl0bGVcIiBbYXR0ci50aXRsZV09XCJtZXNzYWdlLm1lc3NhZ2VcIj57e21lc3NhZ2UubWVzc2FnZX19PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIm1lc3NhZ2UuZmlsZVNpemVJbkJ5dGVzXCIgIGNsYXNzPVwiZmlsZS1tZXNzYWdlLXNpemVcIj57e21lc3NhZ2UuZmlsZVNpemVJbkJ5dGVzfX0gQnl0ZXM8L3NwYW4+XG5cdFx0XHRcdFx0XHQ8L2E+IC0tPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblxuXHQ8ZGl2IGNsYXNzPVwibmctY2hhdC1mb290ZXIgcHJpbWFyeS1vdXRsaW5lLWNvbG9yIHByaW1hcnktYmFja2dyb3VuZFwiPlxuXHRcdDxpbnB1dCAjY2hhdFdpbmRvd0lucHV0XG5cdFx0XHR0eXBlPVwidGV4dFwiXG5cdFx0XHRbbmdNb2RlbF09XCJ3aW5kb3cubmV3TWVzc2FnZSB8IGVtb2ppZnk6ZW1vamlzRW5hYmxlZFwiXG5cdFx0XHQobmdNb2RlbENoYW5nZSk9XCJ3aW5kb3cubmV3TWVzc2FnZT0kZXZlbnRcIlxuXHRcdFx0W3BsYWNlaG9sZGVyXT1cImxvY2FsaXphdGlvbi5tZXNzYWdlUGxhY2Vob2xkZXJcIlxuXHRcdFx0W25nQ2xhc3NdPVwieydjaGF0LXdpbmRvdy1pbnB1dCc6IHRydWUsICdoYXMtc2lkZS1hY3Rpb24nOiBmaWxlVXBsb2FkQWRhcHRlcn1cIlxuXHRcdFx0KGtleWRvd24pPVwib25DaGF0SW5wdXRUeXBlZCgkZXZlbnQsIHdpbmRvdylcIlxuXHRcdFx0KGJsdXIpPVwidG9nZ2xlV2luZG93Rm9jdXMod2luZG93KVwiXG5cdFx0XHQoZm9jdXMpPVwidG9nZ2xlV2luZG93Rm9jdXMod2luZG93KVwiLz5cblxuXHRcdDwhLS0gRmlsZSBVcGxvYWQgLS0+XG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbGVVcGxvYWRBZGFwdGVyXCI+XG5cdFx0XHQ8YSAqbmdJZj1cIiFpc1VwbG9hZGluZ0ZpbGUod2luZG93KVwiIGNsYXNzPVwiYnRuLWFkZC1maWxlXCIgKGNsaWNrKT1cInRyaWdnZXJOYXRpdmVGaWxlVXBsb2FkKHdpbmRvdylcIj5cblx0XHRcdFx0PGkgY2xhc3M9XCJ1cGxvYWQtaWNvblwiPjwvaT5cblx0XHRcdDwvYT5cblx0XHRcdDxpbnB1dFxuXHRcdFx0XHR0eXBlPVwiZmlsZVwiXG5cdFx0XHRcdCNuYXRpdmVGaWxlSW5wdXRcblx0XHRcdFx0c3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXG5cdFx0XHRcdFthdHRyLmlkXT1cImdldFVuaXF1ZUZpbGVVcGxvYWRJbnN0YW5jZUlkKHdpbmRvdylcIlxuXHRcdFx0XHQoY2hhbmdlKT1cIm9uRmlsZUNob3Nlbih3aW5kb3cpXCIgLz5cblx0XHRcdDxkaXYgKm5nSWY9XCJpc1VwbG9hZGluZ0ZpbGUod2luZG93KVwiIGNsYXNzPVwibG9hZGVyXCI+PC9kaXY+XG5cdFx0PC9uZy1jb250YWluZXI+XG5cdDwvZGl2PlxuPC9uZy1jb250YWluZXI+Il19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class ChatAdapter {
|
|
2
|
+
constructor() {
|
|
3
|
+
// ### Abstract adapter methods ###
|
|
4
|
+
// Event handlers
|
|
5
|
+
/** @internal */
|
|
6
|
+
this.friendsListChangedHandler = (participantsResponse) => { };
|
|
7
|
+
/** @internal */
|
|
8
|
+
this.messageReceivedHandler = (participant, message) => { };
|
|
9
|
+
}
|
|
10
|
+
// ### Adapter/Chat income/ingress events ###
|
|
11
|
+
onFriendsListChanged(participantsResponse) {
|
|
12
|
+
this.friendsListChangedHandler(participantsResponse);
|
|
13
|
+
}
|
|
14
|
+
onMessageReceived(participant, message) {
|
|
15
|
+
this.messageReceivedHandler(participant, message);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9jaGF0LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxPQUFnQixXQUFXO0lBQWpDO1FBRUksbUNBQW1DO1FBb0JuQyxpQkFBaUI7UUFDakIsZ0JBQWdCO1FBQ2hCLDhCQUF5QixHQUEyRCxDQUFDLG9CQUEyQyxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDeEksZ0JBQWdCO1FBQ2hCLDJCQUFzQixHQUE4RCxDQUFDLFdBQTZCLEVBQUUsT0FBZ0IsRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQ2hKLENBQUM7SUFqQkcsNkNBQTZDO0lBRXRDLG9CQUFvQixDQUFDLG9CQUEyQztRQUVuRSxJQUFJLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0saUJBQWlCLENBQUMsV0FBNkIsRUFBRSxPQUFnQjtRQUVwRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FPSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlXCI7XG4vLyBpbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4vdXNlclwiO1xuaW1wb3J0IHsgUGFydGljaXBhbnRSZXNwb25zZSB9IGZyb20gXCIuL3BhcnRpY2lwYW50LXJlc3BvbnNlXCI7XG5pbXBvcnQgeyBJQ2hhdFBhcnRpY2lwYW50IH0gZnJvbSAnLi9jaGF0LXBhcnRpY2lwYW50JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENoYXRBZGFwdGVyXG57XG4gICAgLy8gIyMjIEFic3RyYWN0IGFkYXB0ZXIgbWV0aG9kcyAjIyNcblxuICAgIHB1YmxpYyBhYnN0cmFjdCBsaXN0RnJpZW5kcygpOiBPYnNlcnZhYmxlPFBhcnRpY2lwYW50UmVzcG9uc2VbXT47XG4gICAgXG4gICAgcHVibGljIGFic3RyYWN0IGdldE1lc3NhZ2VIaXN0b3J5KGRlc3RpbmF0YXJ5SWQ6IGFueSk6IE9ic2VydmFibGU8TWVzc2FnZVtdPjtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCBzZW5kTWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlKTogdm9pZDtcblxuICAgIC8vICMjIyBBZGFwdGVyL0NoYXQgaW5jb21lL2luZ3Jlc3MgZXZlbnRzICMjI1xuXG4gICAgcHVibGljIG9uRnJpZW5kc0xpc3RDaGFuZ2VkKHBhcnRpY2lwYW50c1Jlc3BvbnNlOiBQYXJ0aWNpcGFudFJlc3BvbnNlW10pOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmZyaWVuZHNMaXN0Q2hhbmdlZEhhbmRsZXIocGFydGljaXBhbnRzUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1lc3NhZ2VSZWNlaXZlZChwYXJ0aWNpcGFudDogSUNoYXRQYXJ0aWNpcGFudCwgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkSGFuZGxlcihwYXJ0aWNpcGFudCwgbWVzc2FnZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEV2ZW50IGhhbmRsZXJzXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGZyaWVuZHNMaXN0Q2hhbmdlZEhhbmRsZXI6IChwYXJ0aWNpcGFudHNSZXNwb25zZTogUGFydGljaXBhbnRSZXNwb25zZVtdKSA9PiB2b2lkICA9IChwYXJ0aWNpcGFudHNSZXNwb25zZTogUGFydGljaXBhbnRSZXNwb25zZVtdKSA9PiB7fTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgbWVzc2FnZVJlY2VpdmVkSGFuZGxlcjogKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50LCBtZXNzYWdlOiBNZXNzYWdlKSA9PiB2b2lkID0gKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50LCBtZXNzYWdlOiBNZXNzYWdlKSA9PiB7fTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9jaGF0LWNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVzZXIgfSBmcm9tICcuL3VzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGF0Q29udHJvbGxlclxue1xuICAgIHRyaWdnZXJPcGVuQ2hhdFdpbmRvdyh1c2VyOiBVc2VyKTogdm9pZDtcblxuICAgIHRyaWdnZXJDbG9zZUNoYXRXaW5kb3codXNlcklkOiBhbnkpOiB2b2lkO1xuXG4gICAgdHJpZ2dlclRvZ2dsZUNoYXRXaW5kb3dWaXNpYmlsaXR5KHVzZXJJZDogYW55KTogdm9pZDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1ncm91cC1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9jaGF0LWdyb3VwLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyb3VwIH0gZnJvbSBcIi4vZ3JvdXBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhdEdyb3VwQWRhcHRlclxue1xuICAgIGdyb3VwQ3JlYXRlZChncm91cDogR3JvdXApOiB2b2lkO1xufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1vcHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NoYXQvc3JjL2xpYi9jb3JlL2NoYXQtb3B0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXaW5kb3cgfSBmcm9tICcuLi9jb3JlL3dpbmRvdyc7XG5pbXBvcnQgeyBJQ2hhdFBhcnRpY2lwYW50IH0gZnJvbSAnLi4vY29yZS9jaGF0LXBhcnRpY2lwYW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhdE9wdGlvblxue1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICAgIGRpc3BsYXlMYWJlbDogc3RyaW5nO1xuICAgIGNoYXR0aW5nVG86IFdpbmRvdztcbiAgICBhY3Rpb24/OiAoY2hhdHRpbmdUbzogV2luZG93KSA9PiB2b2lkO1xuICAgIHZhbGlkYXRlQ29udGV4dDogKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50KSA9PiBib29sZWFuO1xufVxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ChatParticipantStatus } from './chat-participant-status.enum';
|
|
2
|
+
export function chatParticipantStatusDescriptor(status, localization) {
|
|
3
|
+
const currentStatus = ChatParticipantStatus[status].toString().toLowerCase();
|
|
4
|
+
return localization.statusDescription[currentStatus];
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMtZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMtZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd2RSxNQUFNLFVBQVUsK0JBQStCLENBQUMsTUFBNkIsRUFBRSxZQUEwQjtJQUNyRyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU3RSxPQUFPLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50U3RhdHVzIH0gZnJvbSAnLi9jaGF0LXBhcnRpY2lwYW50LXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IExvY2FsaXphdGlvbiB9IGZyb20gJy4vbG9jYWxpemF0aW9uJ1xuIFxuZXhwb3J0IGZ1bmN0aW9uIGNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3Ioc3RhdHVzOiBDaGF0UGFydGljaXBhbnRTdGF0dXMsIGxvY2FsaXphdGlvbjogTG9jYWxpemF0aW9uKSB7XG4gICAgY29uc3QgY3VycmVudFN0YXR1cyA9IENoYXRQYXJ0aWNpcGFudFN0YXR1c1tzdGF0dXNdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICByZXR1cm4gbG9jYWxpemF0aW9uLnN0YXR1c0Rlc2NyaXB0aW9uW2N1cnJlbnRTdGF0dXNdO1xufSJdfQ==
|
|
@@ -5,4 +5,4 @@ export var ChatParticipantStatus;
|
|
|
5
5
|
ChatParticipantStatus[ChatParticipantStatus["Away"] = 2] = "Away";
|
|
6
6
|
ChatParticipantStatus[ChatParticipantStatus["Offline"] = 3] = "Offline";
|
|
7
7
|
})(ChatParticipantStatus || (ChatParticipantStatus = {}));
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxxQkFNWDtBQU5ELFdBQVkscUJBQXFCO0lBRTdCLHFFQUFNLENBQUE7SUFDTixpRUFBSSxDQUFBO0lBQ0osaUVBQUksQ0FBQTtJQUNKLHVFQUFPLENBQUE7QUFDWCxDQUFDLEVBTlcscUJBQXFCLEtBQXJCLHFCQUFxQixRQU1oQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIENoYXRQYXJ0aWNpcGFudFN0YXR1c1xue1xuICAgIE9ubGluZSxcbiAgICBCdXN5LFxuICAgIEF3YXksXG4gICAgT2ZmbGluZVxufVxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export var ChatParticipantType;
|
|
2
|
+
(function (ChatParticipantType) {
|
|
3
|
+
ChatParticipantType[ChatParticipantType["User"] = 0] = "User";
|
|
4
|
+
ChatParticipantType[ChatParticipantType["Group"] = 1] = "Group";
|
|
5
|
+
})(ChatParticipantType || (ChatParticipantType = {}));
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC10eXBlLmVudW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NoYXQvc3JjL2xpYi9jb3JlL2NoYXQtcGFydGljaXBhbnQtdHlwZS5lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLG1CQUlYO0FBSkQsV0FBWSxtQkFBbUI7SUFFM0IsNkRBQUksQ0FBQTtJQUNKLCtEQUFLLENBQUE7QUFDVCxDQUFDLEVBSlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUk5QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIENoYXRQYXJ0aWNpcGFudFR5cGVcbntcbiAgICBVc2VyLFxuICAgIEdyb3VwXG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvY2hhdC1wYXJ0aWNpcGFudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50U3RhdHVzIH0gZnJvbSBcIi4vY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bVwiO1xuaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50VHlwZSB9IGZyb20gXCIuL2NoYXQtcGFydGljaXBhbnQtdHlwZS5lbnVtXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXRQYXJ0aWNpcGFudCB7XG4gICAgcmVhZG9ubHkgcGFydGljaXBhbnRUeXBlOiBDaGF0UGFydGljaXBhbnRUeXBlO1xuICAgIHJlYWRvbmx5IGlkOiBhbnk7XG4gICAgcmVhZG9ubHkgc3RhdHVzOiBDaGF0UGFydGljaXBhbnRTdGF0dXM7XG4gICAgcmVhZG9ubHkgYXZhdGFyOiBzdHJpbmd8bnVsbDtcbiAgICByZWFkb25seSBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG1ldGFkYXRhPzogSU1ldGFkYXRhO1xuICAgIHJlYWRvbmx5IHNob3dNZXRhZGF0YUluVGl0bGU/OiBJTWV0YWRhdGFJblRpdGxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXRhZGF0YSB7XG4gICAgcHJpbWFyeT86IHN0cmluZztcbiAgICBzZWNvbmRhcnk/OiBzdHJpbmc7XG4gICAgdGVydGlhcnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1ldGFkYXRhSW5UaXRsZSB7XG4gICAgcHJpbWFyeT86IGJvb2xlYW47XG4gICAgc2Vjb25kYXJ5PzogYm9vbGVhbjtcbiAgICB0ZXJ0aWFyeT86IGJvb2xlYW47XG59XG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/*import { IFileUploadAdapter } from './file-upload-adapter';
|
|
2
|
+
import { HttpClient, HttpRequest, HttpEventType, HttpResponse, HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { Observable, Subject } from 'rxjs';
|
|
4
|
+
import { User } from './user';
|
|
5
|
+
import { Message } from './message';*/
|
|
6
|
+
export class DefaultFileUploadAdapter {
|
|
7
|
+
/**
|
|
8
|
+
* @summary Basic file upload adapter implementation for HTTP request form file consumption
|
|
9
|
+
* @param _serverEndpointUrl The API endpoint full qualified address that will receive a form file to process and return the metadata.
|
|
10
|
+
*/
|
|
11
|
+
constructor(_serverEndpointUrl, _http) {
|
|
12
|
+
this._serverEndpointUrl = _serverEndpointUrl;
|
|
13
|
+
this._http = _http;
|
|
14
|
+
}
|
|
15
|
+
uploadFile(file, participantId) {
|
|
16
|
+
const formData = new FormData();
|
|
17
|
+
//formData.append('ng-chat-sender-userid', currentUserId);
|
|
18
|
+
formData.append('ng-chat-participant-id', participantId);
|
|
19
|
+
formData.append('file', file, file.name);
|
|
20
|
+
return this._http.post(this._serverEndpointUrl, formData);
|
|
21
|
+
// TODO: Leaving this if we want to track upload progress in detail in the future. Might need a different Subject generic type wrapper
|
|
22
|
+
// const fileRequest = new HttpRequest('POST', this._serverEndpointUrl, formData, {
|
|
23
|
+
// reportProgress: true
|
|
24
|
+
// });
|
|
25
|
+
// const uploadProgress = new Subject<number>();
|
|
26
|
+
// const uploadStatus = uploadProgress.asObservable();
|
|
27
|
+
//const responsePromise = new Subject<Message>();
|
|
28
|
+
// this._http
|
|
29
|
+
// .request(fileRequest)
|
|
30
|
+
// .subscribe(event => {
|
|
31
|
+
// // if (event.type == HttpEventType.UploadProgress)
|
|
32
|
+
// // {
|
|
33
|
+
// // const percentDone = Math.round(100 * event.loaded / event.total);
|
|
34
|
+
// // uploadProgress.next(percentDone);
|
|
35
|
+
// // }
|
|
36
|
+
// // else if (event instanceof HttpResponse)
|
|
37
|
+
// // {
|
|
38
|
+
// // uploadProgress.complete();
|
|
39
|
+
// // }
|
|
40
|
+
// });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1maWxlLXVwbG9hZC1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9kZWZhdWx0LWZpbGUtdXBsb2FkLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0E7Ozs7c0NBSXNDO0FBRXRDLE1BQU0sT0FBTyx3QkFBd0I7SUFFakM7OztPQUdHO0lBQ0gsWUFBb0Isa0JBQTBCLEVBQVUsS0FBaUI7UUFBckQsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFRO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBWTtJQUN6RSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVUsRUFBRSxhQUFrQjtRQUNyQyxNQUFNLFFBQVEsR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBRTFDLDBEQUEwRDtRQUMxRCxRQUFRLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBVSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbkUsc0lBQXNJO1FBQ3RJLG1GQUFtRjtRQUNuRiwyQkFBMkI7UUFDM0IsTUFBTTtRQUVOLGdEQUFnRDtRQUNoRCxzREFBc0Q7UUFFdEQsaURBQWlEO1FBRWpELGFBQWE7UUFDYiw0QkFBNEI7UUFDNUIsNEJBQTRCO1FBQzVCLDZEQUE2RDtRQUM3RCxlQUFlO1FBQ2YsbUZBQW1GO1FBRW5GLG1EQUFtRDtRQUNuRCxlQUFlO1FBQ2YscURBQXFEO1FBQ3JELGVBQWU7UUFFZiw0Q0FBNEM7UUFDNUMsZUFBZTtRQUNmLFVBQVU7SUFDZCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRmlsZVVwbG9hZEFkYXB0ZXIgfSBmcm9tICcuL2ZpbGUtdXBsb2FkLWFkYXB0ZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL21lc3NhZ2UnO1xuXG4vKmltcG9ydCB7IElGaWxlVXBsb2FkQWRhcHRlciB9IGZyb20gJy4vZmlsZS11cGxvYWQtYWRhcHRlcic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwUmVxdWVzdCwgSHR0cEV2ZW50VHlwZSwgSHR0cFJlc3BvbnNlLCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuL3VzZXInO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnZSc7Ki9cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRGaWxlVXBsb2FkQWRhcHRlciBpbXBsZW1lbnRzIElGaWxlVXBsb2FkQWRhcHRlclxue1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEJhc2ljIGZpbGUgdXBsb2FkIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gZm9yIEhUVFAgcmVxdWVzdCBmb3JtIGZpbGUgY29uc3VtcHRpb25cbiAgICAgKiBAcGFyYW0gX3NlcnZlckVuZHBvaW50VXJsIFRoZSBBUEkgZW5kcG9pbnQgZnVsbCBxdWFsaWZpZWQgYWRkcmVzcyB0aGF0IHdpbGwgcmVjZWl2ZSBhIGZvcm0gZmlsZSB0byBwcm9jZXNzIGFuZCByZXR1cm4gdGhlIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NlcnZlckVuZHBvaW50VXJsOiBzdHJpbmcsIHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQpIHtcbiAgICB9XG5cbiAgICB1cGxvYWRGaWxlKGZpbGU6IEZpbGUsIHBhcnRpY2lwYW50SWQ6IGFueSk6IE9ic2VydmFibGU8TWVzc2FnZT4ge1xuICAgICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgICAgICAvL2Zvcm1EYXRhLmFwcGVuZCgnbmctY2hhdC1zZW5kZXItdXNlcmlkJywgY3VycmVudFVzZXJJZCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnbmctY2hhdC1wYXJ0aWNpcGFudC1pZCcsIHBhcnRpY2lwYW50SWQpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLnBvc3Q8TWVzc2FnZT4odGhpcy5fc2VydmVyRW5kcG9pbnRVcmwsIGZvcm1EYXRhKTtcblxuICAgICAgICAvLyBUT0RPOiBMZWF2aW5nIHRoaXMgaWYgd2Ugd2FudCB0byB0cmFjayB1cGxvYWQgcHJvZ3Jlc3MgaW4gZGV0YWlsIGluIHRoZSBmdXR1cmUuIE1pZ2h0IG5lZWQgYSBkaWZmZXJlbnQgU3ViamVjdCBnZW5lcmljIHR5cGUgd3JhcHBlclxuICAgICAgICAvLyBjb25zdCBmaWxlUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgnUE9TVCcsIHRoaXMuX3NlcnZlckVuZHBvaW50VXJsLCBmb3JtRGF0YSwge1xuICAgICAgICAvLyAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWVcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gY29uc3QgdXBsb2FkUHJvZ3Jlc3MgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gICAgICAgIC8vIGNvbnN0IHVwbG9hZFN0YXR1cyA9IHVwbG9hZFByb2dyZXNzLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgICAgIC8vY29uc3QgcmVzcG9uc2VQcm9taXNlID0gbmV3IFN1YmplY3Q8TWVzc2FnZT4oKTtcblxuICAgICAgICAvLyB0aGlzLl9odHRwXG4gICAgICAgIC8vICAgICAucmVxdWVzdChmaWxlUmVxdWVzdClcbiAgICAgICAgLy8gICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAvLyAgICAgICAgIC8vIGlmIChldmVudC50eXBlID09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpXG4gICAgICAgIC8vICAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICBjb25zdCBwZXJjZW50RG9uZSA9IE1hdGgucm91bmQoMTAwICogZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwpO1xuXG4gICAgICAgIC8vICAgICAgICAgLy8gICAgIHVwbG9hZFByb2dyZXNzLm5leHQocGVyY2VudERvbmUpO1xuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgICAgICAvLyBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSlcbiAgICAgICAgLy8gICAgICAgICAvLyB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAvLyAgICAgICAgIC8vICAgICB1cGxvYWRQcm9ncmVzcy5jb21wbGV0ZSgpO1xuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQtYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvZmlsZS11cGxvYWQtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuLy8gaW1wb3J0IHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9tZXNzYWdlJztcblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZVVwbG9hZEFkYXB0ZXJcbntcbiAgICB1cGxvYWRGaWxlKGZpbGU6IEZpbGUsIHBhcnRpY2lwYW50SWQ6IGFueSk6IE9ic2VydmFibGU8TWVzc2FnZT47XG59XG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Guid } from "./guid";
|
|
2
|
+
import { ChatParticipantStatus } from "./chat-participant-status.enum";
|
|
3
|
+
import { ChatParticipantType } from "./chat-participant-type.enum";
|
|
4
|
+
export class Group {
|
|
5
|
+
constructor(participants) {
|
|
6
|
+
this.id = Guid.newGuid();
|
|
7
|
+
this.participantType = ChatParticipantType.Group;
|
|
8
|
+
this.chattingTo = participants;
|
|
9
|
+
this.status = ChatParticipantStatus.Online;
|
|
10
|
+
// TODO: Add some customization for this in future releases
|
|
11
|
+
this.displayName = participants.map((p) => p.displayName).sort((first, second) => second > first ? -1 : 1).join(", ");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NoYXQvc3JjL2xpYi9jb3JlL2dyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFOUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbkUsTUFBTSxPQUFPLEtBQUs7SUFFZCxZQUFZLFlBQW9CO1FBU3pCLE9BQUUsR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFHbkIsb0JBQWUsR0FBd0IsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBVjdFLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBRTNDLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFILENBQUM7Q0FVSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEd1aWQgfSBmcm9tIFwiLi9ndWlkXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4vdXNlclwiO1xuaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50U3RhdHVzIH0gZnJvbSBcIi4vY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bVwiO1xuaW1wb3J0IHsgSUNoYXRQYXJ0aWNpcGFudCB9IGZyb20gXCIuL2NoYXQtcGFydGljaXBhbnRcIjtcbmltcG9ydCB7IENoYXRQYXJ0aWNpcGFudFR5cGUgfSBmcm9tIFwiLi9jaGF0LXBhcnRpY2lwYW50LXR5cGUuZW51bVwiO1xuXG5leHBvcnQgY2xhc3MgR3JvdXAgaW1wbGVtZW50cyBJQ2hhdFBhcnRpY2lwYW50XG57XG4gICAgY29uc3RydWN0b3IocGFydGljaXBhbnRzOiBVc2VyW10pXG4gICAge1xuICAgICAgICB0aGlzLmNoYXR0aW5nVG8gPSBwYXJ0aWNpcGFudHM7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLk9ubGluZTtcblxuICAgICAgICAvLyBUT0RPOiBBZGQgc29tZSBjdXN0b21pemF0aW9uIGZvciB0aGlzIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gcGFydGljaXBhbnRzLm1hcCgocCkgPT4gcC5kaXNwbGF5TmFtZSkuc29ydCgoZmlyc3QsIHNlY29uZCkgPT4gc2Vjb25kID4gZmlyc3QgPyAtMSA6IDEpLmpvaW4oXCIsIFwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaWQ6IHN0cmluZyA9IEd1aWQubmV3R3VpZCgpO1xuICAgIHB1YmxpYyBjaGF0dGluZ1RvOiBVc2VyW107XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFydGljaXBhbnRUeXBlOiBDaGF0UGFydGljaXBhbnRUeXBlID0gQ2hhdFBhcnRpY2lwYW50VHlwZS5Hcm91cDtcblxuICAgIHB1YmxpYyBzdGF0dXM6IENoYXRQYXJ0aWNpcGFudFN0YXR1cztcbiAgICBwdWJsaWMgYXZhdGFyOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBkaXNwbGF5TmFtZTogc3RyaW5nO1xufVxuIl19
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Poached from: https://github.com/Steve-Fenton/TypeScriptUtilities
|
|
2
|
+
// @dynamic
|
|
3
|
+
export class Guid {
|
|
4
|
+
static newGuid() {
|
|
5
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
6
|
+
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
|
7
|
+
return v.toString(16);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvZ3VpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvRUFBb0U7QUFDcEUsV0FBVztBQUNYLE1BQU0sT0FBTyxJQUFJO0lBQ2IsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBUyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEdBQUcsR0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzRCxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBQb2FjaGVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZS1GZW50b24vVHlwZVNjcmlwdFV0aWxpdGllc1xuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBHdWlkIHtcbiAgICBzdGF0aWMgbmV3R3VpZCgpIHtcbiAgICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpKjE2fDAsIHYgPSBjID09ICd4JyA/IHIgOiAociYweDN8MHg4KTtcbiAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9sb2NhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTG9jYWxpemF0aW9uXG57XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBtZXNzYWdlUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIHN0YXR1c0Rlc2NyaXB0aW9uOiBTdGF0dXNEZXNjcmlwdGlvbjtcbiAgICBicm93c2VyTm90aWZpY2F0aW9uVGl0bGU6IHN0cmluZztcbiAgICBsb2FkTWVzc2FnZUhpc3RvcnlQbGFjZWhvbGRlcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c0Rlc2NyaXB0aW9uXG57XG4gICAgb25saW5lOiBzdHJpbmc7XG4gICAgYnVzeTogc3RyaW5nO1xuICAgIGF3YXk6IHN0cmluZztcbiAgICBvZmZsaW5lOiBzdHJpbmc7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufVxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class MessageCounter {
|
|
2
|
+
static formatUnreadMessagesTotal(totalUnreadMessages) {
|
|
3
|
+
if (totalUnreadMessages > 0) {
|
|
4
|
+
if (totalUnreadMessages > 99)
|
|
5
|
+
return "99+";
|
|
6
|
+
else
|
|
7
|
+
return String(totalUnreadMessages);
|
|
8
|
+
}
|
|
9
|
+
// Empty fallback.
|
|
10
|
+
return "";
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns a formatted string containing the total unread messages of a chat window.
|
|
14
|
+
* @param window The window instance to count the unread total messages.
|
|
15
|
+
* @param currentUserId The current chat instance user id. In this context it would be the sender.
|
|
16
|
+
*/
|
|
17
|
+
static unreadMessagesTotal(window, currentUserId) {
|
|
18
|
+
let totalUnreadMessages = 0;
|
|
19
|
+
if (window) {
|
|
20
|
+
totalUnreadMessages = window.messages.filter(x => x.fromId != currentUserId && !x.dateSeen).length;
|
|
21
|
+
}
|
|
22
|
+
return MessageCounter.formatUnreadMessagesTotal(totalUnreadMessages);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1jb3VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9tZXNzYWdlLWNvdW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLGNBQWM7SUFFaEIsTUFBTSxDQUFDLHlCQUF5QixDQUFDLG1CQUEyQjtRQUUvRCxJQUFJLG1CQUFtQixHQUFHLENBQUMsRUFBQyxDQUFDO1lBRXpCLElBQUksbUJBQW1CLEdBQUcsRUFBRTtnQkFDeEIsT0FBUSxLQUFLLENBQUM7O2dCQUVkLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVELGtCQUFrQjtRQUNsQixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxhQUFrQjtRQUVoRSxJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUU1QixJQUFJLE1BQU0sRUFBQyxDQUFDO1lBQ1IsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdkcsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2luZG93IH0gZnJvbSAnLi93aW5kb3cnO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZUNvdW50ZXJcbntcbiAgICBwdWJsaWMgc3RhdGljIGZvcm1hdFVucmVhZE1lc3NhZ2VzVG90YWwodG90YWxVbnJlYWRNZXNzYWdlczogbnVtYmVyKTogc3RyaW5nXG4gICAge1xuICAgICAgICBpZiAodG90YWxVbnJlYWRNZXNzYWdlcyA+IDApe1xuXG4gICAgICAgICAgICBpZiAodG90YWxVbnJlYWRNZXNzYWdlcyA+IDk5KVxuICAgICAgICAgICAgICAgIHJldHVybiAgXCI5OStcIjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHRvdGFsVW5yZWFkTWVzc2FnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1wdHkgZmFsbGJhY2suXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRvdGFsIHVucmVhZCBtZXNzYWdlcyBvZiBhIGNoYXQgd2luZG93LlxuICAgICAqIEBwYXJhbSB3aW5kb3cgVGhlIHdpbmRvdyBpbnN0YW5jZSB0byBjb3VudCB0aGUgdW5yZWFkIHRvdGFsIG1lc3NhZ2VzLlxuICAgICAqIEBwYXJhbSBjdXJyZW50VXNlcklkIFRoZSBjdXJyZW50IGNoYXQgaW5zdGFuY2UgdXNlciBpZC4gSW4gdGhpcyBjb250ZXh0IGl0IHdvdWxkIGJlIHRoZSBzZW5kZXIuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB1bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdzogV2luZG93LCBjdXJyZW50VXNlcklkOiBhbnkpOiBzdHJpbmdcbiAgICB7XG4gICAgICAgIGxldCB0b3RhbFVucmVhZE1lc3NhZ2VzID0gMDtcblxuICAgICAgICBpZiAod2luZG93KXtcbiAgICAgICAgICAgIHRvdGFsVW5yZWFkTWVzc2FnZXMgPSB3aW5kb3cubWVzc2FnZXMuZmlsdGVyKHggPT4geC5mcm9tSWQgIT0gY3VycmVudFVzZXJJZCAmJiAheC5kYXRlU2VlbikubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb3VudGVyLmZvcm1hdFVucmVhZE1lc3NhZ2VzVG90YWwodG90YWxVbnJlYWRNZXNzYWdlcyk7XG4gICAgfVxufVxuIl19
|