@hivegpt/hiveai-angular 0.0.593 → 0.0.596
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/environments/environment.d.ts.map +1 -1
- package/esm2020/environments/environment.mjs +15 -0
- package/esm2020/hivegpt-hiveai-angular.mjs +5 -0
- package/esm2020/lib/components/NotificationSocket.mjs +45 -0
- package/esm2020/lib/components/bot-html-editor/bot-html-editor.component.mjs +113 -0
- package/esm2020/lib/components/bot.service.mjs +45 -0
- package/esm2020/lib/components/chat-drawer/chat-drawer.component.mjs +3904 -0
- package/esm2020/lib/components/chatbot/chatbot.component.mjs +95 -0
- package/esm2020/lib/components/conversation.service.mjs +58 -0
- package/esm2020/lib/components/socket-service.service.mjs +65 -0
- package/esm2020/lib/components/translations/translation.service.mjs +244 -0
- package/esm2020/lib/components/video-player/video-player.component.mjs +131 -0
- package/esm2020/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.mjs +187 -0
- package/esm2020/lib/components/voice-agent/services/audio-analyzer.service.mjs +127 -0
- package/esm2020/lib/components/voice-agent/services/voice-agent.service.mjs +352 -0
- package/esm2020/lib/components/voice-agent/voice-agent.module.mjs +37 -0
- package/esm2020/lib/components/voice-agent/voice-modal-tokens.mjs +4 -0
- package/esm2020/lib/hivegpt.module.mjs +28 -0
- package/esm2020/lib/models/video.mjs +2 -0
- package/esm2020/lib/pipes/safe-html.pipe.mjs +20 -0
- package/esm2020/lib/services/platform-token-refresh.service.mjs +177 -0
- package/esm2020/lib/utils/utils.mjs +36 -0
- package/esm2020/public-api.mjs +15 -0
- package/fesm2015/hivegpt-hiveai-angular.mjs +5605 -0
- package/fesm2015/hivegpt-hiveai-angular.mjs.map +1 -0
- package/fesm2020/hivegpt-hiveai-angular.mjs +5606 -0
- package/fesm2020/hivegpt-hiveai-angular.mjs.map +1 -0
- package/hivegpt-hiveai-angular.d.ts.map +1 -1
- package/index.d.ts +6 -0
- package/lib/components/NotificationSocket.d.ts +6 -1
- package/lib/components/NotificationSocket.d.ts.map +1 -1
- package/lib/components/bot-html-editor/bot-html-editor.component.d.ts +3 -0
- package/lib/components/bot-html-editor/bot-html-editor.component.d.ts.map +1 -1
- package/lib/components/bot.service.d.ts +5 -1
- package/lib/components/bot.service.d.ts.map +1 -1
- package/lib/components/chat-drawer/chat-drawer.component.d.ts +7 -3
- package/lib/components/chat-drawer/chat-drawer.component.d.ts.map +1 -1
- package/lib/components/chatbot/chatbot.component.d.ts +3 -0
- package/lib/components/chatbot/chatbot.component.d.ts.map +1 -1
- package/lib/components/conversation.service.d.ts +3 -0
- package/lib/components/conversation.service.d.ts.map +1 -1
- package/lib/components/socket-service.service.d.ts +7 -3
- package/lib/components/socket-service.service.d.ts.map +1 -1
- package/lib/components/translations/translation.service.d.ts +3 -0
- package/lib/components/translations/translation.service.d.ts.map +1 -1
- package/lib/components/video-player/video-player.component.d.ts +3 -0
- package/lib/components/video-player/video-player.component.d.ts.map +1 -1
- package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts +3 -0
- package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts.map +1 -1
- package/lib/components/voice-agent/services/audio-analyzer.service.d.ts +3 -0
- package/lib/components/voice-agent/services/audio-analyzer.service.d.ts.map +1 -1
- package/lib/components/voice-agent/services/voice-agent.service.d.ts +4 -1
- package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
- package/lib/components/voice-agent/voice-agent.module.d.ts +6 -0
- package/lib/components/voice-agent/voice-agent.module.d.ts.map +1 -1
- package/lib/components/voice-agent/voice-modal-tokens.d.ts.map +1 -1
- package/lib/hivegpt.module.d.ts +16 -0
- package/lib/hivegpt.module.d.ts.map +1 -1
- package/lib/models/video.d.ts.map +1 -1
- package/lib/pipes/safe-html.pipe.d.ts +3 -0
- package/lib/pipes/safe-html.pipe.d.ts.map +1 -1
- package/lib/services/platform-token-refresh.service.d.ts +3 -0
- package/lib/services/platform-token-refresh.service.d.ts.map +1 -1
- package/lib/utils/utils.d.ts.map +1 -1
- package/package.json +24 -12
- package/public-api.d.ts +2 -0
- package/public-api.d.ts.map +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.js +0 -6285
- package/bundles/hivegpt-hiveai-angular.umd.js.map +0 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js +0 -2
- package/bundles/hivegpt-hiveai-angular.umd.min.js.map +0 -1
- package/esm2015/environments/environment.js +0 -15
- package/esm2015/hivegpt-hiveai-angular.js +0 -13
- package/esm2015/lib/components/NotificationSocket.js +0 -39
- package/esm2015/lib/components/bot-html-editor/bot-html-editor.component.js +0 -112
- package/esm2015/lib/components/bot.service.js +0 -50
- package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +0 -3809
- package/esm2015/lib/components/chatbot/chatbot.component.js +0 -57
- package/esm2015/lib/components/conversation.service.js +0 -57
- package/esm2015/lib/components/socket-service.service.js +0 -79
- package/esm2015/lib/components/translations/translation.service.js +0 -244
- package/esm2015/lib/components/video-player/video-player.component.js +0 -123
- package/esm2015/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.js +0 -192
- package/esm2015/lib/components/voice-agent/services/audio-analyzer.service.js +0 -125
- package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +0 -364
- package/esm2015/lib/components/voice-agent/voice-agent.module.js +0 -29
- package/esm2015/lib/components/voice-agent/voice-modal-tokens.js +0 -4
- package/esm2015/lib/hivegpt.module.js +0 -23
- package/esm2015/lib/models/video.js +0 -2
- package/esm2015/lib/pipes/safe-html.pipe.js +0 -19
- package/esm2015/lib/services/platform-token-refresh.service.js +0 -173
- package/esm2015/lib/utils/utils.js +0 -38
- package/esm2015/public-api.js +0 -13
- package/fesm2015/hivegpt-hiveai-angular.js +0 -5484
- package/fesm2015/hivegpt-hiveai-angular.js.map +0 -1
- package/hivegpt-hiveai-angular.d.ts +0 -13
- package/hivegpt-hiveai-angular.metadata.json +0 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Component, EventEmitter, Inject, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class VideoPlayerComponent {
|
|
6
|
+
constructor(doc, el, cdr) {
|
|
7
|
+
this.doc = doc;
|
|
8
|
+
this.el = el;
|
|
9
|
+
this.cdr = cdr;
|
|
10
|
+
this.isMuted = true;
|
|
11
|
+
this.isFullscreen = false;
|
|
12
|
+
this.isFullscreenvideoPlaying = false;
|
|
13
|
+
this.connectWithUser = new EventEmitter();
|
|
14
|
+
this.scheduleMeeting = new EventEmitter();
|
|
15
|
+
}
|
|
16
|
+
ngOnInit() {
|
|
17
|
+
}
|
|
18
|
+
toggleSound(isMuted = null) {
|
|
19
|
+
this.isMuted = isMuted != null ? isMuted : !this.isMuted;
|
|
20
|
+
setTimeout(() => {
|
|
21
|
+
const video = this.doc
|
|
22
|
+
.getElementById(this.video.id.toString());
|
|
23
|
+
if (video) {
|
|
24
|
+
video.muted = this.isMuted;
|
|
25
|
+
this.video.isMuted = this.isMuted;
|
|
26
|
+
}
|
|
27
|
+
this.cdr.markForCheck();
|
|
28
|
+
//this.muteToggle.emit(this.isMuted);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
togglePlay(playState, videoEl) {
|
|
32
|
+
this.videoObj.isPlaying = !this.videoObj.isPlaying;
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
if (playState) {
|
|
35
|
+
this.videoObj.isPlaying = true;
|
|
36
|
+
videoEl.play();
|
|
37
|
+
var pauseBtn = document.getElementById('pause-btn');
|
|
38
|
+
pauseBtn.classList.add('hide-pause-btn');
|
|
39
|
+
this.toggleSound(false);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
this.videoObj.isPlaying = false;
|
|
43
|
+
videoEl.pause();
|
|
44
|
+
}
|
|
45
|
+
this.cdr.markForCheck();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
ngAfterViewInit() {
|
|
49
|
+
if (window.innerWidth <= 576) {
|
|
50
|
+
this.observer = new IntersectionObserver((entries) => {
|
|
51
|
+
if (entries[0].isIntersecting === true) {
|
|
52
|
+
this.video.nativeElement.play();
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.video.nativeElement.pause();
|
|
56
|
+
}
|
|
57
|
+
}, {
|
|
58
|
+
threshold: 0.75,
|
|
59
|
+
});
|
|
60
|
+
this.observer.observe(this.el.nativeElement);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
toggleFullscreen() {
|
|
64
|
+
this.isFullscreen = !this.isFullscreen;
|
|
65
|
+
if (!this.isFullscreen) {
|
|
66
|
+
this.fullscreenvideo.nativeElement.pause();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
toggleFullscreenPlay() {
|
|
70
|
+
this.isFullscreenvideoPlaying = !this.isFullscreenvideoPlaying;
|
|
71
|
+
if (this.isFullscreenvideoPlaying) {
|
|
72
|
+
this.fullscreenvideo.nativeElement.play();
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this.fullscreenvideo.nativeElement.pause();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
followUser(userId) {
|
|
79
|
+
this.connectWithUser.emit(userId);
|
|
80
|
+
}
|
|
81
|
+
checkPendingSentRequest(userId) {
|
|
82
|
+
return this.myPendingSentRequests?.find(a => a == userId);
|
|
83
|
+
}
|
|
84
|
+
canUnfollowUser() {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
canFollowUser() {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
getIniNames(firstName, lastName) {
|
|
91
|
+
if (!firstName && !lastName) {
|
|
92
|
+
return '';
|
|
93
|
+
}
|
|
94
|
+
if (firstName && lastName)
|
|
95
|
+
return (firstName.charAt(0).toUpperCase() + lastName.charAt(0).toUpperCase());
|
|
96
|
+
else
|
|
97
|
+
return firstName.charAt(0).toUpperCase();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
VideoPlayerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: VideoPlayerComponent, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
101
|
+
VideoPlayerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: VideoPlayerComponent, selector: "app-video-player", inputs: { currentUserId: "currentUserId", user: "user", eventId: "eventId", videoObj: "videoObj", isDev: "isDev", type: "type" }, outputs: { connectWithUser: "connectWithUser", scheduleMeeting: "scheduleMeeting" }, viewQueries: [{ propertyName: "video", first: true, predicate: ["video"], descendants: true }, { propertyName: "fullscreenvideo", first: true, predicate: ["fullscreenvideo"], descendants: true }], ngImport: i0, template: "<div class=\"video-wrapper\" >\n <div class=\"overlymask-video\"></div>\n <video (click)=\"toggleFullscreen()\" #video [loop]=\"true\" [muted]=\"isMuted\" [src]=\"videoObj.processedUrls || videoObj.url\" playsinline\n [controls]=\"false\"></video>\n <div class=\"main-controls\" [class.no-opacity]=\"video.isPlaying\">\n <button mat-icon-button *ngIf=\"!videoObj.isPlaying\"\n attr.aria-label=\"Play Video\"\n title=\"Play Video\" class=\"play-pause-btn\"\n (click)=\"togglePlay(true, video)\">\n <!-- <mat-icon alt=\"Play\">play_arrow</mat-icon> -->\n <span class=\"material-icons notranslate \" aria-hidden=\"true\">play_circle_outline</span>\n </button>\n\n <button mat-icon-button id=\"pause-btn\" [hidden]=\"!videoObj.isPlaying\" class=\"pause_btn play-pause-btn playing\"\n title=\"Pause Video\"\n [class.half-opacity]=\"video.isPlaying\" (click)=\"togglePlay(false, video)\">\n <!-- <mat-icon alt=\"Pause\">pause</mat-icon> -->\n <span class=\"material-icons notranslate \" aria-hidden=\"true\">pause_circle_outline</span>\n </button>\n </div>\n <div class=\"video-actions\">\n <button class=\"button-trasparent action\" (click)=\"toggleSound()\" title=\"Mute\" *ngIf=\"isMuted\">\n <span class=\"material-icons notranslate \" aria-hidden=\"true\">volume_off</span>\n </button>\n <button class=\"button-trasparent action\" (click)=\"toggleSound()\" title=\"Unmute\" *ngIf=\"!isMuted\">\n <span class=\"material-icons notranslate \" aria-hidden=\"true\">volume_up</span>\n </button>\n\n </div>\n</div>\n\n<div class=\"full-screen\" *ngIf=\"isFullscreen\" [ngClass]=\"{'show': isFullscreen}\">\n <div class=\"video-wrapper\">\n <video #fullscreenvideo (click)=\"toggleFullscreenPlay()\" [loop]=\"true\" [muted]=\"isMuted\" [src]=\"videoObj.processedUrls || videoObj.url\"\n playsinline [controls]=\"false\"></video>\n <div (click)=\"toggleFullscreen()\" class=\"close-btn\">\n <span class=\"material-icons notranslate \">clear</span>\n </div>\n <div class=\"video-actions\">\n <button *ngIf=\"!video.isPlaying\" title=\"Play\"\n class=\"material-icons notranslate body-text-color fs-h2 play position-absolute transparent-btn\" (click)=\"togglePlay(true, video)\">\n play_circle_outline\n </button>\n <button id=\"pause-btn\" [hidden]=\"!videoObj.isPlaying\" title=\"Pause\"\n class=\"pause_btn material-icons body-text-color fs-h2 play position-absolute transparent-btn\"\n [class.half-opacity]=\"video.isPlaying\" (click)=\"togglePlay(false, video)\">\n pause_circle_outline\n </button>\n </div>\n </div>\n</div>\n", styles: [".video-wrapper{position:relative}.video-wrapper video{width:100%;height:330px;outline:0;object-fit:cover;border-radius:5px;cursor:pointer;transition:.3s ease-in-out}.video-wrapper .video-actions{position:absolute;right:10px;top:10px;display:flex;flex-direction:column}.video-wrapper .video-actions .action{margin-bottom:5px;cursor:pointer;color:#fff}.video-wrapper .author-details{display:flex;position:absolute;bottom:18px;left:12px;right:12px;transition:.3s ease-in-out;justify-content:flex-start;flex-direction:column}.video-wrapper .author-details .author-image{margin-right:6px;width:34px;height:34px;border-radius:50%;overflow:hidden}.video-wrapper .author-details .author-image img{width:100%;height:100%;object-fit:cover}.video-wrapper .author-details .author-name,.video-wrapper .author-details .video-title{font-size:14px;mix-blend-mode:hard-light;color:#fff;display:block}.video-wrapper .connect-btn{width:100%;position:absolute;bottom:20px;text-align:center;outline:0;opacity:0;transition:.3s ease-in-out}@media only screen and (max-width: 576px){.video-wrapper .connect-btn{opacity:1;width:unset;right:20px}}.video-wrapper .connect-btn button{margin:auto}.video-wrapper:hover .author-details{opacity:0}@media only screen and (max-width: 576px){.video-wrapper:hover .author-details{opacity:1}}.video-wrapper:hover .connect-btn{opacity:1}.video-wrapper .half-opacity{opacity:.2}.video-wrapper .no-opacity{background-color:transparent}.like-btn{text-align:center;margin-bottom:20px;transition:.2s ease-in-out}.like-btn .count{font-size:16px;margin-left:3px}.like-btn span{cursor:pointer;font-size:30px}.like-btn:hover{transform:scale(1.1)}.like-btn.like{color:#025be7}.like-btn.dislike{color:#8d8d8d}.like-btn.info{color:#aeae3f}.full-screen.show{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;justify-content:center;align-items:center;background:rgba(27,26,26,.9607843137);z-index:9999}.full-screen.show .video-wrapper video{transition:none;transform:none!important;width:300px;height:270px}.full-screen .close-btn{position:absolute;left:10px;top:10px;cursor:pointer}.full-screen .close-btn span{color:#fff}.main-controls{inset:0;position:absolute;display:flex;align-items:center;justify-content:center;background-color:#0000004d}.main-controls .play-pause-btn{line-height:0;color:#fff;display:flex;align-items:center;justify-content:center;background:none;border:none;position:absolute;top:34%}.main-controls .play-pause-btn.playing{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);cursor:pointer}.main-controls .play-pause-btn.playing span{color:#fff;text-shadow:0px 0px 6px rgba(47,47,47,.36)}.main-controls .play-pause-btn:focus{outline:none}.main-controls .play-pause-btn .material-icons{font-size:40px}.main-controls .play-pause-btn .mat-icon{height:auto;width:auto}.main-controls .half-opacity{opacity:.2}.main-controls .no-opacity{background-color:transparent}button.transparent-btn{background:transparent;border:0!important}.pause_btn{width:100%;height:100%;opacity:.02!important}.pause_btn:hover{opacity:1!important;background-color:#000000bd}.hide-pause-btn{opacity:0!important}.no-photo{height:35px;width:35px;display:flex;align-items:center;justify-content:center;font-size:14px}.overlymask-video{background-image:linear-gradient(rgba(255,255,255,.0588235294),rgba(0,0,0,.1803921569));position:absolute;width:100%;height:275px;z-index:0;background-position:0 bottom}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
102
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: VideoPlayerComponent, decorators: [{
|
|
103
|
+
type: Component,
|
|
104
|
+
args: [{ selector: 'app-video-player', template: "<div class=\"video-wrapper\" >\n <div class=\"overlymask-video\"></div>\n <video (click)=\"toggleFullscreen()\" #video [loop]=\"true\" [muted]=\"isMuted\" [src]=\"videoObj.processedUrls || videoObj.url\" playsinline\n [controls]=\"false\"></video>\n <div class=\"main-controls\" [class.no-opacity]=\"video.isPlaying\">\n <button mat-icon-button *ngIf=\"!videoObj.isPlaying\"\n attr.aria-label=\"Play Video\"\n title=\"Play Video\" class=\"play-pause-btn\"\n (click)=\"togglePlay(true, video)\">\n <!-- <mat-icon alt=\"Play\">play_arrow</mat-icon> -->\n <span class=\"material-icons notranslate \" aria-hidden=\"true\">play_circle_outline</span>\n </button>\n\n <button mat-icon-button id=\"pause-btn\" [hidden]=\"!videoObj.isPlaying\" class=\"pause_btn play-pause-btn playing\"\n title=\"Pause Video\"\n [class.half-opacity]=\"video.isPlaying\" (click)=\"togglePlay(false, video)\">\n <!-- <mat-icon alt=\"Pause\">pause</mat-icon> -->\n <span class=\"material-icons notranslate \" aria-hidden=\"true\">pause_circle_outline</span>\n </button>\n </div>\n <div class=\"video-actions\">\n <button class=\"button-trasparent action\" (click)=\"toggleSound()\" title=\"Mute\" *ngIf=\"isMuted\">\n <span class=\"material-icons notranslate \" aria-hidden=\"true\">volume_off</span>\n </button>\n <button class=\"button-trasparent action\" (click)=\"toggleSound()\" title=\"Unmute\" *ngIf=\"!isMuted\">\n <span class=\"material-icons notranslate \" aria-hidden=\"true\">volume_up</span>\n </button>\n\n </div>\n</div>\n\n<div class=\"full-screen\" *ngIf=\"isFullscreen\" [ngClass]=\"{'show': isFullscreen}\">\n <div class=\"video-wrapper\">\n <video #fullscreenvideo (click)=\"toggleFullscreenPlay()\" [loop]=\"true\" [muted]=\"isMuted\" [src]=\"videoObj.processedUrls || videoObj.url\"\n playsinline [controls]=\"false\"></video>\n <div (click)=\"toggleFullscreen()\" class=\"close-btn\">\n <span class=\"material-icons notranslate \">clear</span>\n </div>\n <div class=\"video-actions\">\n <button *ngIf=\"!video.isPlaying\" title=\"Play\"\n class=\"material-icons notranslate body-text-color fs-h2 play position-absolute transparent-btn\" (click)=\"togglePlay(true, video)\">\n play_circle_outline\n </button>\n <button id=\"pause-btn\" [hidden]=\"!videoObj.isPlaying\" title=\"Pause\"\n class=\"pause_btn material-icons body-text-color fs-h2 play position-absolute transparent-btn\"\n [class.half-opacity]=\"video.isPlaying\" (click)=\"togglePlay(false, video)\">\n pause_circle_outline\n </button>\n </div>\n </div>\n</div>\n", styles: [".video-wrapper{position:relative}.video-wrapper video{width:100%;height:330px;outline:0;object-fit:cover;border-radius:5px;cursor:pointer;transition:.3s ease-in-out}.video-wrapper .video-actions{position:absolute;right:10px;top:10px;display:flex;flex-direction:column}.video-wrapper .video-actions .action{margin-bottom:5px;cursor:pointer;color:#fff}.video-wrapper .author-details{display:flex;position:absolute;bottom:18px;left:12px;right:12px;transition:.3s ease-in-out;justify-content:flex-start;flex-direction:column}.video-wrapper .author-details .author-image{margin-right:6px;width:34px;height:34px;border-radius:50%;overflow:hidden}.video-wrapper .author-details .author-image img{width:100%;height:100%;object-fit:cover}.video-wrapper .author-details .author-name,.video-wrapper .author-details .video-title{font-size:14px;mix-blend-mode:hard-light;color:#fff;display:block}.video-wrapper .connect-btn{width:100%;position:absolute;bottom:20px;text-align:center;outline:0;opacity:0;transition:.3s ease-in-out}@media only screen and (max-width: 576px){.video-wrapper .connect-btn{opacity:1;width:unset;right:20px}}.video-wrapper .connect-btn button{margin:auto}.video-wrapper:hover .author-details{opacity:0}@media only screen and (max-width: 576px){.video-wrapper:hover .author-details{opacity:1}}.video-wrapper:hover .connect-btn{opacity:1}.video-wrapper .half-opacity{opacity:.2}.video-wrapper .no-opacity{background-color:transparent}.like-btn{text-align:center;margin-bottom:20px;transition:.2s ease-in-out}.like-btn .count{font-size:16px;margin-left:3px}.like-btn span{cursor:pointer;font-size:30px}.like-btn:hover{transform:scale(1.1)}.like-btn.like{color:#025be7}.like-btn.dislike{color:#8d8d8d}.like-btn.info{color:#aeae3f}.full-screen.show{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;justify-content:center;align-items:center;background:rgba(27,26,26,.9607843137);z-index:9999}.full-screen.show .video-wrapper video{transition:none;transform:none!important;width:300px;height:270px}.full-screen .close-btn{position:absolute;left:10px;top:10px;cursor:pointer}.full-screen .close-btn span{color:#fff}.main-controls{inset:0;position:absolute;display:flex;align-items:center;justify-content:center;background-color:#0000004d}.main-controls .play-pause-btn{line-height:0;color:#fff;display:flex;align-items:center;justify-content:center;background:none;border:none;position:absolute;top:34%}.main-controls .play-pause-btn.playing{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);cursor:pointer}.main-controls .play-pause-btn.playing span{color:#fff;text-shadow:0px 0px 6px rgba(47,47,47,.36)}.main-controls .play-pause-btn:focus{outline:none}.main-controls .play-pause-btn .material-icons{font-size:40px}.main-controls .play-pause-btn .mat-icon{height:auto;width:auto}.main-controls .half-opacity{opacity:.2}.main-controls .no-opacity{background-color:transparent}button.transparent-btn{background:transparent;border:0!important}.pause_btn{width:100%;height:100%;opacity:.02!important}.pause_btn:hover{opacity:1!important;background-color:#000000bd}.hide-pause-btn{opacity:0!important}.no-photo{height:35px;width:35px;display:flex;align-items:center;justify-content:center;font-size:14px}.overlymask-video{background-image:linear-gradient(rgba(255,255,255,.0588235294),rgba(0,0,0,.1803921569));position:absolute;width:100%;height:275px;z-index:0;background-position:0 bottom}\n"] }]
|
|
105
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
106
|
+
type: Inject,
|
|
107
|
+
args: [DOCUMENT]
|
|
108
|
+
}] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { currentUserId: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], user: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], eventId: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], videoObj: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], isDev: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], type: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], video: [{
|
|
121
|
+
type: ViewChild,
|
|
122
|
+
args: ['video']
|
|
123
|
+
}], fullscreenvideo: [{
|
|
124
|
+
type: ViewChild,
|
|
125
|
+
args: ['fullscreenvideo']
|
|
126
|
+
}], connectWithUser: [{
|
|
127
|
+
type: Output
|
|
128
|
+
}], scheduleMeeting: [{
|
|
129
|
+
type: Output
|
|
130
|
+
}] } });
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tcGxheWVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3ZpZGVvLXBsYXllci92aWRlby1wbGF5ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvdmlkZW8tcGxheWVyL3ZpZGVvLXBsYXllci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFPM0MsTUFBTSxPQUFPLG9CQUFvQjtJQW9CL0IsWUFDNEIsR0FBUSxFQUMxQixFQUFjLEVBQ2QsR0FBc0I7UUFGSixRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQzFCLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWJoQyxZQUFPLEdBQVksSUFBSSxDQUFDO1FBRXhCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRzlCLDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUVoQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDN0Msb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBT3BELENBQUM7SUFFRCxRQUFRO0lBQ1IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSTtRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMs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QXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVZpZGVvIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3ZpZGVvJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXZpZGVvLXBsYXllcicsXG4gIHRlbXBsYXRlVXJsOiAnLi92aWRlby1wbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi92aWRlby1wbGF5ZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmlkZW9QbGF5ZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBjdXJyZW50VXNlcklkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVzZXI6IGFueTtcbiAgQElucHV0KCkgZXZlbnRJZDogc3RyaW5nO1xuICBASW5wdXQoKSB2aWRlb09iajogSVZpZGVvO1xuICBASW5wdXQoKSBpc0RldjogYm9vbGVhbjtcbiAgbXlGb2xsb3dpbmdMaXN0OiBBcnJheTxzdHJpbmc+O1xuICBteVBlbmRpbmdTZW50UmVxdWVzdHM6IEFycmF5PHN0cmluZz47XG4gIEBJbnB1dCgpIHR5cGU6IHN0cmluZztcbiAgaXNNdXRlZDogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgb2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyO1xuICBpc0Z1bGxzY3JlZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgndmlkZW8nKSB2aWRlbzogYW55O1xuICBAVmlld0NoaWxkKCdmdWxsc2NyZWVudmlkZW8nKSBmdWxsc2NyZWVudmlkZW86IGFueTtcbiAgaXNGdWxsc2NyZWVudmlkZW9QbGF5aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGNvbm5lY3RXaXRoVXNlciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc2NoZWR1bGVNZWV0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgdG9nZ2xlU291bmQoaXNNdXRlZCA9IG51bGwpIHtcbiAgICB0aGlzLmlzTXV0ZWQgPSBpc011dGVkICE9IG51bGwgPyBpc011dGVkIDogIXRoaXMuaXNNdXRlZDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvOiBhbnkgPSB0aGlzLmRvY1xuICAgICAgICAuZ2V0RWxlbWVudEJ5SWQodGhpcy52aWRlby5pZC50b1N0cmluZygpKTtcbiAgICAgIGlmICh2aWRlbykge1xuICAgICAgICB2aWRlby5tdXRlZCA9IHRoaXMuaXNNdXRlZDtcbiAgICAgICAgdGhpcy52aWRlby5pc011dGVkID0gdGhpcy5pc011dGVkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAvL3RoaXMubXV0ZVRvZ2dsZS5lbWl0KHRoaXMuaXNNdXRlZCk7XG4gICAgICB9KVxufVxuXG4gIHRvZ2dsZVBsYXkocGxheVN0YXRlOiBib29sZWFuLCB2aWRlb0VsKSB7XG4gICAgdGhpcy52aWRlb09iai5pc1BsYXlpbmcgPSAhdGhpcy52aWRlb09iai5pc1BsYXlpbmc7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7ICAgICBcbiAgICAgIGlmIChwbGF5U3RhdGUpIHsgICAgIFxuICAgICAgICB0aGlzLnZpZGVvT2JqLmlzUGxheWluZyA9ICB0cnVlO1xuICAgICAgICB2aWRlb0VsLnBsYXkoKTtcbiAgICAgICAgdmFyIHBhdXNlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhdXNlLWJ0bicpO1xuICAgICAgICBwYXVzZUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLXBhdXNlLWJ0bicpO1xuXG4gICAgICAgIHRoaXMudG9nZ2xlU291bmQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgZWxzZXtcbiAgICAgICAgdGhpcy52aWRlb09iai5pc1BsYXlpbmcgPSAgZmFsc2U7XG4gICAgICAgIHZpZGVvRWwucGF1c2UoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSlcbiAgfVxuICBcbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSA1NzYpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXG4gICAgICAgIChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJpZXNbMF0uaXNJbnRlcnNlY3RpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudC5wbGF5KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRocmVzaG9sZDogMC43NSxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbHNjcmVlbigpIHtcbiAgICB0aGlzLmlzRnVsbHNjcmVlbiA9ICF0aGlzLmlzRnVsbHNjcmVlbjtcbiAgICBpZiAoIXRoaXMuaXNGdWxsc2NyZWVuKSB7XG4gICAgICB0aGlzLmZ1bGxzY3JlZW52aWRlby5uYXRpdmVFbGVtZW50LnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbHNjcmVlblBsYXkoKSB7XG4gICAgdGhpcy5pc0Z1bGxzY3JlZW52aWRlb1BsYXlpbmcgPSAhdGhpcy5pc0Z1bGxzY3JlZW52aWRlb1BsYXlpbmc7XG5cbiAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW52aWRlb1BsYXlpbmcpIHtcbiAgICAgIHRoaXMuZnVsbHNjcmVlbnZpZGVvLm5hdGl2ZUVsZW1lbnQucGxheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZ1bGxzY3JlZW52aWRlby5uYXRpdmVFbGVtZW50LnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgZm9sbG93VXNlcih1c2VySWQpIHtcbiAgICB0aGlzLmNvbm5lY3RXaXRoVXNlci5lbWl0KHVzZXJJZCk7XG4gIH1cblxuICBjaGVja1BlbmRpbmdTZW50UmVxdWVzdCh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5teVBlbmRpbmdTZW50UmVxdWVzdHM/LmZpbmQoYSA9PiBhID09IHVzZXJJZCk7XG4gIH1cblxuICBjYW5VbmZvbGxvd1VzZXIoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2FuRm9sbG93VXNlcigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldEluaU5hbWVzKGZpcnN0TmFtZSwgbGFzdE5hbWUpIHtcbiAgICBpZighZmlyc3ROYW1lICYmICFsYXN0TmFtZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZmlyc3ROYW1lICYmIGxhc3ROYW1lKVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZmlyc3ROYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbGFzdE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKClcbiAgICAgICk7XG4gICAgZWxzZSByZXR1cm4gZmlyc3ROYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidmlkZW8td3JhcHBlclwiID5cbiAgPGRpdiBjbGFzcz1cIm92ZXJseW1hc2stdmlkZW9cIj48L2Rpdj5cbiAgPHZpZGVvIChjbGljayk9XCJ0b2dnbGVGdWxsc2NyZWVuKClcIiAjdmlkZW8gW2xvb3BdPVwidHJ1ZVwiIFttdXRlZF09XCJpc011dGVkXCIgW3NyY109XCJ2aWRlb09iai5wcm9jZXNzZWRVcmxzIHx8IHZpZGVvT2JqLnVybFwiIHBsYXlzaW5saW5lXG4gICAgW2NvbnRyb2xzXT1cImZhbHNlXCI+PC92aWRlbz5cbiAgICA8ZGl2IGNsYXNzPVwibWFpbi1jb250cm9sc1wiIFtjbGFzcy5uby1vcGFjaXR5XT1cInZpZGVvLmlzUGxheWluZ1wiPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gICpuZ0lmPVwiIXZpZGVvT2JqLmlzUGxheWluZ1wiXG4gICAgICBhdHRyLmFyaWEtbGFiZWw9XCJQbGF5IFZpZGVvXCJcbiAgICAgIHRpdGxlPVwiUGxheSBWaWRlb1wiIGNsYXNzPVwicGxheS1wYXVzZS1idG5cIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZVBsYXkodHJ1ZSwgdmlkZW8pXCI+XG4gICAgICA8IS0tIDxtYXQtaWNvbiBhbHQ9XCJQbGF5XCI+cGxheV9hcnJvdzwvbWF0LWljb24+IC0tPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBub3RyYW5zbGF0ZSAgXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+cGxheV9jaXJjbGVfb3V0bGluZTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGlkPVwicGF1c2UtYnRuXCIgW2hpZGRlbl09XCIhdmlkZW9PYmouaXNQbGF5aW5nXCIgY2xhc3M9XCJwYXVzZV9idG4gcGxheS1wYXVzZS1idG4gcGxheWluZ1wiXG4gICAgICB0aXRsZT1cIlBhdXNlIFZpZGVvXCJcbiAgICAgIFtjbGFzcy5oYWxmLW9wYWNpdHldPVwidmlkZW8uaXNQbGF5aW5nXCIgKGNsaWNrKT1cInRvZ2dsZVBsYXkoZmFsc2UsIHZpZGVvKVwiPlxuICAgICAgPCEtLSA8bWF0LWljb24gYWx0PVwiUGF1c2VcIj5wYXVzZTwvbWF0LWljb24+IC0tPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBub3RyYW5zbGF0ZSAgXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+cGF1c2VfY2lyY2xlX291dGxpbmU8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ2aWRlby1hY3Rpb25zXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbi10cmFzcGFyZW50IGFjdGlvblwiIChjbGljayk9XCJ0b2dnbGVTb3VuZCgpXCIgdGl0bGU9XCJNdXRlXCIgKm5nSWY9XCJpc011dGVkXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5vdHJhbnNsYXRlICBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj52b2x1bWVfb2ZmPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tdHJhc3BhcmVudCBhY3Rpb25cIiAoY2xpY2spPVwidG9nZ2xlU291bmQoKVwiIHRpdGxlPVwiVW5tdXRlXCIgKm5nSWY9XCIhaXNNdXRlZFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBub3RyYW5zbGF0ZSAgXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+dm9sdW1lX3VwPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuXG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmdWxsLXNjcmVlblwiICpuZ0lmPVwiaXNGdWxsc2NyZWVuXCIgW25nQ2xhc3NdPVwieydzaG93JzogaXNGdWxsc2NyZWVufVwiPlxuICA8ZGl2IGNsYXNzPVwidmlkZW8td3JhcHBlclwiPlxuICAgIDx2aWRlbyAjZnVsbHNjcmVlbnZpZGVvIChjbGljayk9XCJ0b2dnbGVGdWxsc2NyZWVuUGxheSgpXCIgW2xvb3BdPVwidHJ1ZVwiIFttdXRlZF09XCJpc011dGVkXCIgW3NyY109XCJ2aWRlb09iai5wcm9jZXNzZWRVcmxzIHx8IHZpZGVvT2JqLnVybFwiXG4gICAgICBwbGF5c2lubGluZSBbY29udHJvbHNdPVwiZmFsc2VcIj48L3ZpZGVvPlxuICAgICAgPGRpdiAoY2xpY2spPVwidG9nZ2xlRnVsbHNjcmVlbigpXCIgY2xhc3M9XCJjbG9zZS1idG5cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBub3RyYW5zbGF0ZSAgXCI+Y2xlYXI8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidmlkZW8tYWN0aW9uc1wiPlxuICAgICAgPGJ1dHRvbiAgKm5nSWY9XCIhdmlkZW8uaXNQbGF5aW5nXCIgdGl0bGU9XCJQbGF5XCJcbiAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGUgICBib2R5LXRleHQtY29sb3IgZnMtaDIgcGxheSBwb3NpdGlvbi1hYnNvbHV0ZSB0cmFuc3BhcmVudC1idG5cIiAoY2xpY2spPVwidG9nZ2xlUGxheSh0cnVlLCB2aWRlbylcIj5cbiAgICAgIHBsYXlfY2lyY2xlX291dGxpbmVcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGlkPVwicGF1c2UtYnRuXCIgW2hpZGRlbl09XCIhdmlkZW9PYmouaXNQbGF5aW5nXCIgdGl0bGU9XCJQYXVzZVwiXG4gICAgICBjbGFzcz1cInBhdXNlX2J0biBtYXRlcmlhbC1pY29ucyBib2R5LXRleHQtY29sb3IgZnMtaDIgcGxheSBwb3NpdGlvbi1hYnNvbHV0ZSB0cmFuc3BhcmVudC1idG5cIlxuICAgICAgW2NsYXNzLmhhbGYtb3BhY2l0eV09XCJ2aWRlby5pc1BsYXlpbmdcIiAoY2xpY2spPVwidG9nZ2xlUGxheShmYWxzZSwgdmlkZW8pXCI+XG4gICAgICBwYXVzZV9jaXJjbGVfb3V0bGluZVxuICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { VOICE_MODAL_CONFIG, VOICE_MODAL_CLOSE_CALLBACK } from '../../voice-modal-tokens';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../services/voice-agent.service";
|
|
5
|
+
import * as i2 from "../../services/audio-analyzer.service";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
export class VoiceAgentModalComponent {
|
|
8
|
+
constructor(voiceAgentService, audioAnalyzer, injector) {
|
|
9
|
+
this.voiceAgentService = voiceAgentService;
|
|
10
|
+
this.audioAnalyzer = audioAnalyzer;
|
|
11
|
+
this.injector = injector;
|
|
12
|
+
this.close = new EventEmitter();
|
|
13
|
+
this.apiKey = '';
|
|
14
|
+
this.eventToken = '';
|
|
15
|
+
this.eventId = '';
|
|
16
|
+
this.eventUrl = '';
|
|
17
|
+
this.domainAuthority = 'prod-lite';
|
|
18
|
+
this.agentName = 'AI Assistant';
|
|
19
|
+
this.agentRole = 'AI Agent Specialist';
|
|
20
|
+
this.usersApiUrl = '';
|
|
21
|
+
this.injectedConfig = null;
|
|
22
|
+
this.onCloseCallback = null;
|
|
23
|
+
/** Hardcoded voice agent avatar (Nia). */
|
|
24
|
+
this.displayAvatarUrl = 'https://www.jotform.com/uploads/mehmetkarakasli/form_files/1564593667676a8e85f23758.86945537_icon.png';
|
|
25
|
+
this.callState = 'idle';
|
|
26
|
+
this.statusText = '';
|
|
27
|
+
this.duration = '00:00';
|
|
28
|
+
this.isMicMuted = false;
|
|
29
|
+
this.isUserSpeaking = false;
|
|
30
|
+
this.audioLevels = [];
|
|
31
|
+
this.subscriptions = [];
|
|
32
|
+
this.isConnecting = false;
|
|
33
|
+
}
|
|
34
|
+
/** True while the bot is speaking — drives avatar pulse animation and voice visualizer. */
|
|
35
|
+
get isBotTalking() { return this.callState === 'talking'; }
|
|
36
|
+
/** True while the user is actively speaking — drives waveform active color. */
|
|
37
|
+
get isUserActive() { return this.callState === 'listening' && this.isUserSpeaking && !this.isMicMuted; }
|
|
38
|
+
/** True during the brief processing pause between user speech and bot response. */
|
|
39
|
+
get isProcessing() { return this.callState === 'connected' && this.statusText === 'Processing...'; }
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
// When opened via Overlay, config is provided by injection
|
|
42
|
+
this.injectedConfig = this.injector.get(VOICE_MODAL_CONFIG, null);
|
|
43
|
+
this.onCloseCallback = this.injector.get(VOICE_MODAL_CLOSE_CALLBACK, null);
|
|
44
|
+
if (this.injectedConfig) {
|
|
45
|
+
this.apiUrl = this.injectedConfig.apiUrl;
|
|
46
|
+
this.token = this.injectedConfig.token;
|
|
47
|
+
this.botId = this.injectedConfig.botId;
|
|
48
|
+
this.conversationId = this.injectedConfig.conversationId;
|
|
49
|
+
this.apiKey = this.injectedConfig.apiKey ?? '';
|
|
50
|
+
this.eventToken = this.injectedConfig.eventToken ?? '';
|
|
51
|
+
this.eventId = this.injectedConfig.eventId ?? '';
|
|
52
|
+
this.eventUrl = this.injectedConfig.eventUrl ?? '';
|
|
53
|
+
this.domainAuthority = this.injectedConfig.domainAuthority ?? 'prod-lite';
|
|
54
|
+
this.agentName = this.injectedConfig.agentName ?? this.agentName;
|
|
55
|
+
this.agentRole = this.injectedConfig.agentRole ?? this.agentRole;
|
|
56
|
+
this.agentAvatar = this.injectedConfig.agentAvatar;
|
|
57
|
+
this.usersApiUrl = this.injectedConfig.usersApiUrl ?? this.usersApiUrl;
|
|
58
|
+
}
|
|
59
|
+
this.subscriptions.push(this.voiceAgentService.callState$.subscribe(state => {
|
|
60
|
+
this.callState = state;
|
|
61
|
+
}));
|
|
62
|
+
this.subscriptions.push(this.voiceAgentService.statusText$.subscribe(text => {
|
|
63
|
+
this.statusText = text;
|
|
64
|
+
}));
|
|
65
|
+
this.subscriptions.push(this.voiceAgentService.duration$.subscribe(duration => {
|
|
66
|
+
this.duration = duration;
|
|
67
|
+
}));
|
|
68
|
+
this.subscriptions.push(this.voiceAgentService.isMicMuted$.subscribe(muted => {
|
|
69
|
+
this.isMicMuted = muted;
|
|
70
|
+
}));
|
|
71
|
+
this.subscriptions.push(this.voiceAgentService.isUserSpeaking$.subscribe(speaking => {
|
|
72
|
+
this.isUserSpeaking = speaking;
|
|
73
|
+
}));
|
|
74
|
+
this.subscriptions.push(this.voiceAgentService.audioLevels$.subscribe(levels => {
|
|
75
|
+
this.audioLevels = levels;
|
|
76
|
+
}));
|
|
77
|
+
// Always start from a fresh voice session to avoid stale/disconnected state flashes.
|
|
78
|
+
void this.openFreshCallSession();
|
|
79
|
+
}
|
|
80
|
+
ngOnDestroy() {
|
|
81
|
+
this.subscriptions.forEach(sub => sub.unsubscribe());
|
|
82
|
+
this.disconnect();
|
|
83
|
+
}
|
|
84
|
+
async startCall() {
|
|
85
|
+
if (this.isConnecting || (this.callState !== 'idle' && this.callState !== 'ended'))
|
|
86
|
+
return;
|
|
87
|
+
this.isConnecting = true;
|
|
88
|
+
try {
|
|
89
|
+
await this.voiceAgentService.connect(this.apiUrl, this.token, this.botId, this.conversationId, this.apiKey, this.eventToken, this.eventId, this.eventUrl, this.domainAuthority, this.usersApiUrl || undefined);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
console.error('Failed to connect voice agent:', error);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
this.isConnecting = false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async disconnect() {
|
|
99
|
+
await this.voiceAgentService.disconnect();
|
|
100
|
+
}
|
|
101
|
+
async openFreshCallSession() {
|
|
102
|
+
await this.voiceAgentService.prepareFreshSession();
|
|
103
|
+
await this.startCall();
|
|
104
|
+
}
|
|
105
|
+
toggleMic() {
|
|
106
|
+
this.voiceAgentService.toggleMic();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Map audio level (0–100) to waveform bar height in px with a gaussian
|
|
110
|
+
* bell-curve envelope so centre bars are tallest and edge bars appear
|
|
111
|
+
* as tiny dots — matching the audio-waveform reference design.
|
|
112
|
+
*/
|
|
113
|
+
getWaveformHeight(level, index) {
|
|
114
|
+
const n = Math.min(100, Math.max(0, level ?? 0));
|
|
115
|
+
const total = this.audioLevels.length || 60;
|
|
116
|
+
const center = (total - 1) / 2;
|
|
117
|
+
const sigma = total / 5;
|
|
118
|
+
const envelope = Math.exp(-Math.pow(index - center, 2) / (2 * sigma * sigma));
|
|
119
|
+
// Minimum height scales with envelope so edges show as dots even in silence
|
|
120
|
+
const minHeight = 2 + envelope * 3;
|
|
121
|
+
const maxHeight = 4 + envelope * 38;
|
|
122
|
+
return minHeight + (n / 100) * (maxHeight - minHeight);
|
|
123
|
+
}
|
|
124
|
+
/** Status label for active call — driven by callState + service statusText. */
|
|
125
|
+
get statusLabel() {
|
|
126
|
+
switch (this.callState) {
|
|
127
|
+
case 'connecting': return 'Connecting...';
|
|
128
|
+
case 'talking': return 'Talking...';
|
|
129
|
+
case 'listening': return 'Listening...';
|
|
130
|
+
// 'connected' covers: initial connect, between turns (Listening / Processing)
|
|
131
|
+
case 'connected': return this.statusText || 'Connected';
|
|
132
|
+
default: return this.statusText || '';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Call Again: reset to idle then start a new call. */
|
|
136
|
+
async callAgain() {
|
|
137
|
+
await this.openFreshCallSession();
|
|
138
|
+
}
|
|
139
|
+
/** Back to Chat: close modal and disconnect. */
|
|
140
|
+
backToChat() {
|
|
141
|
+
this.endCall();
|
|
142
|
+
}
|
|
143
|
+
/** End call but keep modal open to show Call Ended + Call Again / Back to Chat. */
|
|
144
|
+
hangUp() {
|
|
145
|
+
this.disconnect();
|
|
146
|
+
}
|
|
147
|
+
async endCall() {
|
|
148
|
+
await this.disconnect();
|
|
149
|
+
this.onCloseCallback?.();
|
|
150
|
+
this.close.emit();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
VoiceAgentModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: VoiceAgentModalComponent, deps: [{ token: i1.VoiceAgentService }, { token: i2.AudioAnalyzerService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
|
|
154
|
+
VoiceAgentModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: VoiceAgentModalComponent, selector: "hivegpt-voice-agent-modal", inputs: { apiUrl: "apiUrl", token: "token", botId: "botId", conversationId: "conversationId", apiKey: "apiKey", eventToken: "eventToken", eventId: "eventId", eventUrl: "eventUrl", domainAuthority: "domainAuthority", agentName: "agentName", agentRole: "agentRole", agentAvatar: "agentAvatar", usersApiUrl: "usersApiUrl" }, outputs: { close: "close" }, ngImport: i0, template: "<div class=\"voice-agent-modal-overlay\" (click)=\"endCall()\">\n <div\n class=\"voice-container voice-agent-modal\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-left\">\n <div class=\"header-icon\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 1C8.13 1 5 4.13 5 8V14C5 17.87 8.13 21 12 21C15.87 21 19 17.87 19 14V8C19 4.13 15.87 1 12 1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23C10.34 23 9 21.66 9 20H15C15 21.66 13.66 23 12 23Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n <span class=\"header-title\">Voice</span>\n </div>\n <button\n class=\"close-button\"\n (click)=\"endCall()\"\n type=\"button\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Avatar Section with glow -->\n <div class=\"avatar-section\">\n <div class=\"avatar-glow\" [class.glow-talking]=\"isBotTalking\" [class.glow-listening]=\"callState === 'listening'\"></div>\n\n <!-- Particle ring \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"particles-container\">\n <span *ngFor=\"let i of [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]\"\n class=\"particle\"\n [style.--i]=\"i\"\n [style.animationDelay]=\"(i * 0.15) + 's'\">\n </span>\n </div>\n\n <div class=\"avatar-wrapper\" [class.speaking]=\"isBotTalking\" [class.listening]=\"callState === 'listening'\">\n <img class=\"avatar-image\" [src]=\"displayAvatarUrl\" alt=\"Nia\" />\n </div>\n </div>\n\n <!-- Agent Info: Nia + Collaboration Manager AI Agent Specialist -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">\n Nia\n <span class=\"ai-badge\">AI</span>\n </div>\n <p class=\"agent-role\">COP30 AI Agent </p>\n </div>\n\n <!-- Start Call (when idle only) -->\n <div *ngIf=\"callState === 'idle'\" class=\"start-call-section\">\n <p *ngIf=\"statusText === 'Connection failed'\" class=\"error-message\">\n {{ statusText }}\n </p>\n <button\n class=\"start-call-button\"\n type=\"button\"\n [disabled]=\"isConnecting\"\n (click)=\"startCall()\"\n >\n <span *ngIf=\"isConnecting\">Connecting...</span>\n <span *ngIf=\"!isConnecting && statusText === 'Connection failed'\"\n >Retry</span\n >\n <span *ngIf=\"!isConnecting && statusText !== 'Connection failed'\"\n >Start Call</span\n >\n </button>\n </div>\n\n <!-- Call Ended: status + Call Again / Back to Chat -->\n <div *ngIf=\"callState === 'ended'\" class=\"call-ended-section\">\n <p class=\"call-ended-status\">\n <span class=\"status-text\">Call Ended</span>\n <span class=\"status-timer\">{{ duration }}</span>\n </p>\n <div class=\"call-ended-controls\">\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"callAgain()\"\n title=\"Call Again\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n Call Again\n </button>\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"backToChat()\"\n title=\"Back to Chat\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n Back to Chat\n </button>\n </div>\n </div>\n\n <!-- Status (when connecting or in-call: Talking... / Listening / Connected + timer) -->\n <div\n class=\"status-indicator status-inline\"\n *ngIf=\"callState !== 'idle' && callState !== 'ended'\"\n >\n <div *ngIf=\"callState === 'connecting'\" class=\"status-connecting\">\n <svg\n class=\"spinner\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"31.416\"\n stroke-dashoffset=\"31.416\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 31.416;15.708 15.708;0 31.416;0 31.416\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-15.708;-31.416;-31.416\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n <span class=\"status-text\">{{ statusText }}</span>\n </div>\n <div\n *ngIf=\"callState !== 'connecting'\"\n class=\"status-connected status-inline-row\"\n >\n <span class=\"status-text\" [class.status-talking]=\"isBotTalking\" [class.status-listening]=\"callState === 'listening'\" [class.status-processing]=\"isProcessing\">\n {{ statusLabel }}\n </span>\n\n <!-- Animated bars \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"voice-visualizer\">\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n </div>\n\n <!-- Bouncing dots \u2014 visible during processing pause -->\n <div *ngIf=\"isProcessing\" class=\"processing-dots\">\n <span></span><span></span><span></span>\n </div>\n\n <span class=\"status-timer\">{{ duration }}</span>\n </div>\n </div>\n\n <!-- Waveform: always visible during an active call, active (coloured) when user speaks -->\n <div\n *ngIf=\"callState === 'connected' || callState === 'listening' || callState === 'talking'\"\n class=\"waveform-container\"\n >\n <div class=\"waveform-bars\">\n <div\n *ngFor=\"let level of audioLevels; let i = index\"\n class=\"waveform-bar\"\n [class.active]=\"isUserActive\"\n [style.height.px]=\"getWaveformHeight(level, i)\"\n ></div>\n </div>\n </div>\n\n <!-- Call Controls (when connected) -->\n <div\n class=\"controls\"\n *ngIf=\"\n callState === 'connecting' ||\n callState === 'connected' ||\n callState === 'listening' ||\n callState === 'talking'\n \"\n >\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn mic-btn\"\n [class.muted]=\"isMicMuted\"\n (click)=\"toggleMic()\"\n type=\"button\"\n [title]=\"isMicMuted ? 'Unmute' : 'Mute'\"\n >\n <!-- Microphone icon (unmuted) -->\n <svg\n *ngIf=\"!isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n </svg>\n <!-- Microphone icon (muted) -->\n <svg\n *ngIf=\"isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n <path\n d=\"M2 2 L30 30\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Mute</span>\n </div>\n\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn end-call-btn\"\n (click)=\"hangUp()\"\n type=\"button\"\n title=\"End Call\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">End Call</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.voice-agent-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;justify-content:flex-end;align-items:flex-end;z-index:99999;backdrop-filter:blur(4px);padding:24px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.voice-container.voice-agent-modal{width:100%;max-width:440px;background:white;border-radius:30px;padding:30px;box-shadow:0 10px 40px #0000001a;text-align:center;position:relative;display:flex;flex-direction:column;align-items:center;min-height:600px;animation:modalEnter .3s ease-out}@keyframes modalEnter{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.header{width:100%;display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.header-left{display:flex;align-items:center;gap:8px}.header-icon{width:28px;height:28px;background:#0f172a;border-radius:50%;color:#fff;display:flex;align-items:center;justify-content:center}.header-title{font-size:18px;font-weight:500;color:#0f172a}.close-button{background:none;border:none;cursor:pointer;padding:8px;color:#0f172a;display:flex;align-items:center;justify-content:center;transition:color .2s}.close-button:hover{color:#475569}.avatar-section{position:relative;margin-bottom:24px}.avatar-wrapper{width:180px;height:180px;border-radius:50%;padding:6px;background:#0ea5a4;background:linear-gradient(135deg,#ccfbf1 0%,#0ea5a4 100%);display:flex;align-items:center;justify-content:center;position:relative}.avatar-image{width:100%;height:100%;border-radius:50%;object-fit:cover;border:4px solid white}.avatar-glow{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:240px;height:240px;background:radial-gradient(circle,rgba(14,165,164,.2) 0%,transparent 70%);z-index:-1;pointer-events:none;transition:opacity .4s ease}.avatar-glow.glow-talking{width:280px;height:280px;background:radial-gradient(circle,rgba(14,165,164,.35) 0%,transparent 65%);animation:glowPulse 1.5s ease-in-out infinite}.avatar-glow.glow-listening{background:radial-gradient(circle,rgba(99,102,241,.25) 0%,transparent 65%)}@keyframes glowPulse{0%,to{opacity:.7;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.08)}}.avatar-wrapper.speaking{animation:avatarPulse 1.4s ease-in-out infinite}.avatar-wrapper.listening{animation:avatarListenPulse 1.8s ease-in-out infinite}@keyframes avatarPulse{0%,to{box-shadow:0 0 #0ea5a480}50%{box-shadow:0 0 0 18px #0ea5a400}}@keyframes avatarListenPulse{0%,to{box-shadow:0 0 #6366f166}50%{box-shadow:0 0 0 14px #6366f100}}.particles-container{position:absolute;top:50%;left:50%;width:0;height:0;z-index:2;pointer-events:none}.particle{position:absolute;width:7px;height:7px;border-radius:50%;background:#0ea5a4;opacity:0;animation:particleOrbit 2.4s ease-in-out infinite;animation-delay:var(--delay, 0s);transform-origin:0 0}@keyframes particleOrbit{0%{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg)) translateY(-108px) scale(.4)}25%{opacity:.9}75%{opacity:.9}to{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg + 45deg)) translateY(-108px) scale(.4)}}.agent-info{margin-bottom:40px}.agent-name{font-size:24px;font-weight:700;color:#0f172a;margin-bottom:8px;display:flex;align-items:center;justify-content:center;gap:8px}.ai-badge{background:#0ea5a4;color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:6px}.agent-role{font-size:16px;color:#0f172a;font-weight:500;margin:0}.start-call-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.error-message{color:#dc2626;font-size:14px;margin:0}.start-call-button{padding:14px 32px;font-size:16px;font-weight:600;color:#fff;background:#0ea5a4;border:none;border-radius:12px;cursor:pointer;transition:background .2s}.start-call-button:hover:not(:disabled){background:#0d9488}.start-call-button:disabled{opacity:.7;cursor:not-allowed!important}.status-indicator{display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:10px}.status-connecting{display:flex;align-items:center;gap:12px}.spinner{color:#0ea5a4;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.status-text{font-size:16px;color:#0f172a;font-weight:400;transition:color .25s ease}.status-text.status-talking{color:#0ea5a4;font-weight:500}.status-text.status-listening{color:#2a2a2c;font-weight:500}.status-text.status-processing{color:#94a3b8}.status-timer{font-size:16px;color:#0f172a;font-weight:500}.voice-visualizer{display:flex;align-items:center;gap:3px;height:18px}.vbar{width:3px;height:6px;background:#0ea5a4;border-radius:2px;animation:vbarBounce 1s ease-in-out infinite}.vbar:nth-child(1){animation-delay:0s}.vbar:nth-child(2){animation-delay:.15s}.vbar:nth-child(3){animation-delay:.3s}.vbar:nth-child(4){animation-delay:.45s}@keyframes vbarBounce{0%,to{height:4px;opacity:.5}50%{height:16px;opacity:1}}.processing-dots{display:flex;align-items:center;gap:4px}.processing-dots span{display:inline-block;width:5px;height:5px;border-radius:50%;background:#94a3b8;animation:dotFade 1.2s ease-in-out infinite}.processing-dots span:nth-child(1){animation-delay:0s}.processing-dots span:nth-child(2){animation-delay:.2s}.processing-dots span:nth-child(3){animation-delay:.4s}@keyframes dotFade{0%,80%,to{transform:scale(.8);opacity:.4}40%{transform:scale(1.2);opacity:1}}.status-connected{display:flex;flex-direction:column;align-items:center;gap:4px}.status-inline .status-inline-row{flex-direction:row;align-items:center;gap:8px}.call-ended-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.call-ended-status{display:flex;align-items:center;justify-content:center;gap:8px;margin:0;font-size:16px;color:#0f172a}.call-ended-status .status-text{font-weight:400}.call-ended-status .status-timer{font-weight:500}.call-ended-controls{display:flex;justify-content:center;align-items:center;gap:16px;flex-wrap:wrap}.action-btn{display:flex;align-items:center;gap:8px;padding:12px 24px;border-radius:24px;font-size:14px;font-weight:500;color:#0f172a;background:white;border:1px solid #e2e8f0;cursor:pointer;transition:background .2s ease}.action-btn:hover{background:#f8fafc}.waveform-container{width:100%;display:flex;align-items:center;justify-content:center;height:56px;margin-bottom:10px;padding:0 8px}.waveform-bars{display:flex;align-items:center;justify-content:center;gap:2px;height:56px;width:100%}.waveform-bar{flex:0 0 2px;width:2px;min-height:2px;border-radius:99px;background:#cbd5e1;transition:height .1s ease-out}.waveform-bar.active{background:linear-gradient(180deg,#0ea5a4 0%,#0d9488 100%);box-shadow:0 0 4px #0ea5a480}.controls{display:flex;align-items:center;justify-content:center;gap:24px;width:100%}.control-btn{width:60px;height:60px;border-radius:50%;border:none;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;transition:transform .2s ease}.control-btn:hover{transform:scale(1.05)}.control-btn:active{transform:scale(.95)}.control-label{font-size:12px;font-weight:500;color:#0f172a}.mic-btn{background:#e2e8f0;color:#475569}.mic-btn .control-label{color:#475569}.mic-btn.muted{background:#e2e8f0;color:#475569}.end-call-btn{background:#ef4444;color:#fff}.end-call-btn .control-label{color:#fff}.end-call-btn:hover{background:#dc2626}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
155
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: VoiceAgentModalComponent, decorators: [{
|
|
156
|
+
type: Component,
|
|
157
|
+
args: [{ selector: 'hivegpt-voice-agent-modal', template: "<div class=\"voice-agent-modal-overlay\" (click)=\"endCall()\">\n <div\n class=\"voice-container voice-agent-modal\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-left\">\n <div class=\"header-icon\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 1C8.13 1 5 4.13 5 8V14C5 17.87 8.13 21 12 21C15.87 21 19 17.87 19 14V8C19 4.13 15.87 1 12 1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23C10.34 23 9 21.66 9 20H15C15 21.66 13.66 23 12 23Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n <span class=\"header-title\">Voice</span>\n </div>\n <button\n class=\"close-button\"\n (click)=\"endCall()\"\n type=\"button\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Avatar Section with glow -->\n <div class=\"avatar-section\">\n <div class=\"avatar-glow\" [class.glow-talking]=\"isBotTalking\" [class.glow-listening]=\"callState === 'listening'\"></div>\n\n <!-- Particle ring \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"particles-container\">\n <span *ngFor=\"let i of [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]\"\n class=\"particle\"\n [style.--i]=\"i\"\n [style.animationDelay]=\"(i * 0.15) + 's'\">\n </span>\n </div>\n\n <div class=\"avatar-wrapper\" [class.speaking]=\"isBotTalking\" [class.listening]=\"callState === 'listening'\">\n <img class=\"avatar-image\" [src]=\"displayAvatarUrl\" alt=\"Nia\" />\n </div>\n </div>\n\n <!-- Agent Info: Nia + Collaboration Manager AI Agent Specialist -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">\n Nia\n <span class=\"ai-badge\">AI</span>\n </div>\n <p class=\"agent-role\">COP30 AI Agent </p>\n </div>\n\n <!-- Start Call (when idle only) -->\n <div *ngIf=\"callState === 'idle'\" class=\"start-call-section\">\n <p *ngIf=\"statusText === 'Connection failed'\" class=\"error-message\">\n {{ statusText }}\n </p>\n <button\n class=\"start-call-button\"\n type=\"button\"\n [disabled]=\"isConnecting\"\n (click)=\"startCall()\"\n >\n <span *ngIf=\"isConnecting\">Connecting...</span>\n <span *ngIf=\"!isConnecting && statusText === 'Connection failed'\"\n >Retry</span\n >\n <span *ngIf=\"!isConnecting && statusText !== 'Connection failed'\"\n >Start Call</span\n >\n </button>\n </div>\n\n <!-- Call Ended: status + Call Again / Back to Chat -->\n <div *ngIf=\"callState === 'ended'\" class=\"call-ended-section\">\n <p class=\"call-ended-status\">\n <span class=\"status-text\">Call Ended</span>\n <span class=\"status-timer\">{{ duration }}</span>\n </p>\n <div class=\"call-ended-controls\">\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"callAgain()\"\n title=\"Call Again\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n Call Again\n </button>\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"backToChat()\"\n title=\"Back to Chat\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n Back to Chat\n </button>\n </div>\n </div>\n\n <!-- Status (when connecting or in-call: Talking... / Listening / Connected + timer) -->\n <div\n class=\"status-indicator status-inline\"\n *ngIf=\"callState !== 'idle' && callState !== 'ended'\"\n >\n <div *ngIf=\"callState === 'connecting'\" class=\"status-connecting\">\n <svg\n class=\"spinner\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"31.416\"\n stroke-dashoffset=\"31.416\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 31.416;15.708 15.708;0 31.416;0 31.416\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-15.708;-31.416;-31.416\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n <span class=\"status-text\">{{ statusText }}</span>\n </div>\n <div\n *ngIf=\"callState !== 'connecting'\"\n class=\"status-connected status-inline-row\"\n >\n <span class=\"status-text\" [class.status-talking]=\"isBotTalking\" [class.status-listening]=\"callState === 'listening'\" [class.status-processing]=\"isProcessing\">\n {{ statusLabel }}\n </span>\n\n <!-- Animated bars \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"voice-visualizer\">\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n </div>\n\n <!-- Bouncing dots \u2014 visible during processing pause -->\n <div *ngIf=\"isProcessing\" class=\"processing-dots\">\n <span></span><span></span><span></span>\n </div>\n\n <span class=\"status-timer\">{{ duration }}</span>\n </div>\n </div>\n\n <!-- Waveform: always visible during an active call, active (coloured) when user speaks -->\n <div\n *ngIf=\"callState === 'connected' || callState === 'listening' || callState === 'talking'\"\n class=\"waveform-container\"\n >\n <div class=\"waveform-bars\">\n <div\n *ngFor=\"let level of audioLevels; let i = index\"\n class=\"waveform-bar\"\n [class.active]=\"isUserActive\"\n [style.height.px]=\"getWaveformHeight(level, i)\"\n ></div>\n </div>\n </div>\n\n <!-- Call Controls (when connected) -->\n <div\n class=\"controls\"\n *ngIf=\"\n callState === 'connecting' ||\n callState === 'connected' ||\n callState === 'listening' ||\n callState === 'talking'\n \"\n >\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn mic-btn\"\n [class.muted]=\"isMicMuted\"\n (click)=\"toggleMic()\"\n type=\"button\"\n [title]=\"isMicMuted ? 'Unmute' : 'Mute'\"\n >\n <!-- Microphone icon (unmuted) -->\n <svg\n *ngIf=\"!isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n </svg>\n <!-- Microphone icon (muted) -->\n <svg\n *ngIf=\"isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n <path\n d=\"M2 2 L30 30\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Mute</span>\n </div>\n\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn end-call-btn\"\n (click)=\"hangUp()\"\n type=\"button\"\n title=\"End Call\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">End Call</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.voice-agent-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;justify-content:flex-end;align-items:flex-end;z-index:99999;backdrop-filter:blur(4px);padding:24px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.voice-container.voice-agent-modal{width:100%;max-width:440px;background:white;border-radius:30px;padding:30px;box-shadow:0 10px 40px #0000001a;text-align:center;position:relative;display:flex;flex-direction:column;align-items:center;min-height:600px;animation:modalEnter .3s ease-out}@keyframes modalEnter{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.header{width:100%;display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.header-left{display:flex;align-items:center;gap:8px}.header-icon{width:28px;height:28px;background:#0f172a;border-radius:50%;color:#fff;display:flex;align-items:center;justify-content:center}.header-title{font-size:18px;font-weight:500;color:#0f172a}.close-button{background:none;border:none;cursor:pointer;padding:8px;color:#0f172a;display:flex;align-items:center;justify-content:center;transition:color .2s}.close-button:hover{color:#475569}.avatar-section{position:relative;margin-bottom:24px}.avatar-wrapper{width:180px;height:180px;border-radius:50%;padding:6px;background:#0ea5a4;background:linear-gradient(135deg,#ccfbf1 0%,#0ea5a4 100%);display:flex;align-items:center;justify-content:center;position:relative}.avatar-image{width:100%;height:100%;border-radius:50%;object-fit:cover;border:4px solid white}.avatar-glow{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:240px;height:240px;background:radial-gradient(circle,rgba(14,165,164,.2) 0%,transparent 70%);z-index:-1;pointer-events:none;transition:opacity .4s ease}.avatar-glow.glow-talking{width:280px;height:280px;background:radial-gradient(circle,rgba(14,165,164,.35) 0%,transparent 65%);animation:glowPulse 1.5s ease-in-out infinite}.avatar-glow.glow-listening{background:radial-gradient(circle,rgba(99,102,241,.25) 0%,transparent 65%)}@keyframes glowPulse{0%,to{opacity:.7;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.08)}}.avatar-wrapper.speaking{animation:avatarPulse 1.4s ease-in-out infinite}.avatar-wrapper.listening{animation:avatarListenPulse 1.8s ease-in-out infinite}@keyframes avatarPulse{0%,to{box-shadow:0 0 #0ea5a480}50%{box-shadow:0 0 0 18px #0ea5a400}}@keyframes avatarListenPulse{0%,to{box-shadow:0 0 #6366f166}50%{box-shadow:0 0 0 14px #6366f100}}.particles-container{position:absolute;top:50%;left:50%;width:0;height:0;z-index:2;pointer-events:none}.particle{position:absolute;width:7px;height:7px;border-radius:50%;background:#0ea5a4;opacity:0;animation:particleOrbit 2.4s ease-in-out infinite;animation-delay:var(--delay, 0s);transform-origin:0 0}@keyframes particleOrbit{0%{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg)) translateY(-108px) scale(.4)}25%{opacity:.9}75%{opacity:.9}to{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg + 45deg)) translateY(-108px) scale(.4)}}.agent-info{margin-bottom:40px}.agent-name{font-size:24px;font-weight:700;color:#0f172a;margin-bottom:8px;display:flex;align-items:center;justify-content:center;gap:8px}.ai-badge{background:#0ea5a4;color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:6px}.agent-role{font-size:16px;color:#0f172a;font-weight:500;margin:0}.start-call-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.error-message{color:#dc2626;font-size:14px;margin:0}.start-call-button{padding:14px 32px;font-size:16px;font-weight:600;color:#fff;background:#0ea5a4;border:none;border-radius:12px;cursor:pointer;transition:background .2s}.start-call-button:hover:not(:disabled){background:#0d9488}.start-call-button:disabled{opacity:.7;cursor:not-allowed!important}.status-indicator{display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:10px}.status-connecting{display:flex;align-items:center;gap:12px}.spinner{color:#0ea5a4;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.status-text{font-size:16px;color:#0f172a;font-weight:400;transition:color .25s ease}.status-text.status-talking{color:#0ea5a4;font-weight:500}.status-text.status-listening{color:#2a2a2c;font-weight:500}.status-text.status-processing{color:#94a3b8}.status-timer{font-size:16px;color:#0f172a;font-weight:500}.voice-visualizer{display:flex;align-items:center;gap:3px;height:18px}.vbar{width:3px;height:6px;background:#0ea5a4;border-radius:2px;animation:vbarBounce 1s ease-in-out infinite}.vbar:nth-child(1){animation-delay:0s}.vbar:nth-child(2){animation-delay:.15s}.vbar:nth-child(3){animation-delay:.3s}.vbar:nth-child(4){animation-delay:.45s}@keyframes vbarBounce{0%,to{height:4px;opacity:.5}50%{height:16px;opacity:1}}.processing-dots{display:flex;align-items:center;gap:4px}.processing-dots span{display:inline-block;width:5px;height:5px;border-radius:50%;background:#94a3b8;animation:dotFade 1.2s ease-in-out infinite}.processing-dots span:nth-child(1){animation-delay:0s}.processing-dots span:nth-child(2){animation-delay:.2s}.processing-dots span:nth-child(3){animation-delay:.4s}@keyframes dotFade{0%,80%,to{transform:scale(.8);opacity:.4}40%{transform:scale(1.2);opacity:1}}.status-connected{display:flex;flex-direction:column;align-items:center;gap:4px}.status-inline .status-inline-row{flex-direction:row;align-items:center;gap:8px}.call-ended-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.call-ended-status{display:flex;align-items:center;justify-content:center;gap:8px;margin:0;font-size:16px;color:#0f172a}.call-ended-status .status-text{font-weight:400}.call-ended-status .status-timer{font-weight:500}.call-ended-controls{display:flex;justify-content:center;align-items:center;gap:16px;flex-wrap:wrap}.action-btn{display:flex;align-items:center;gap:8px;padding:12px 24px;border-radius:24px;font-size:14px;font-weight:500;color:#0f172a;background:white;border:1px solid #e2e8f0;cursor:pointer;transition:background .2s ease}.action-btn:hover{background:#f8fafc}.waveform-container{width:100%;display:flex;align-items:center;justify-content:center;height:56px;margin-bottom:10px;padding:0 8px}.waveform-bars{display:flex;align-items:center;justify-content:center;gap:2px;height:56px;width:100%}.waveform-bar{flex:0 0 2px;width:2px;min-height:2px;border-radius:99px;background:#cbd5e1;transition:height .1s ease-out}.waveform-bar.active{background:linear-gradient(180deg,#0ea5a4 0%,#0d9488 100%);box-shadow:0 0 4px #0ea5a480}.controls{display:flex;align-items:center;justify-content:center;gap:24px;width:100%}.control-btn{width:60px;height:60px;border-radius:50%;border:none;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;transition:transform .2s ease}.control-btn:hover{transform:scale(1.05)}.control-btn:active{transform:scale(.95)}.control-label{font-size:12px;font-weight:500;color:#0f172a}.mic-btn{background:#e2e8f0;color:#475569}.mic-btn .control-label{color:#475569}.mic-btn.muted{background:#e2e8f0;color:#475569}.end-call-btn{background:#ef4444;color:#fff}.end-call-btn .control-label{color:#fff}.end-call-btn:hover{background:#dc2626}\n"] }]
|
|
158
|
+
}], ctorParameters: function () { return [{ type: i1.VoiceAgentService }, { type: i2.AudioAnalyzerService }, { type: i0.Injector }]; }, propDecorators: { close: [{
|
|
159
|
+
type: Output
|
|
160
|
+
}], apiUrl: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], token: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], botId: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], conversationId: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], apiKey: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], eventToken: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], eventId: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], eventUrl: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], domainAuthority: [{
|
|
177
|
+
type: Input
|
|
178
|
+
}], agentName: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}], agentRole: [{
|
|
181
|
+
type: Input
|
|
182
|
+
}], agentAvatar: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], usersApiUrl: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}] } });
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvY29tcG9uZW50cy92b2ljZS1hZ2VudC1tb2RhbC92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9jb21wb25lbnRzL3ZvaWNlLWFnZW50LW1vZGFsL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsWUFBWSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBSXBHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBb0IsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUFPNUcsTUFBTSxPQUFPLHdCQUF3QjtJQW1CbkMsWUFDUyxpQkFBb0MsRUFDcEMsYUFBbUMsRUFDbEMsUUFBa0I7UUFGbkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXJCbEIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLbEMsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixvQkFBZSxHQUFXLFdBQVcsQ0FBQztRQUN0QyxjQUFTLEdBQVcsY0FBYyxDQUFDO1FBQ25D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QUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudFNlcnZpY2UsIENhbGxTdGF0ZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdWRpby1hbmFseXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZPSUNFX01PREFMX0NPTkZJRywgVk9JQ0VfTU9EQUxfQ0xPU0VfQ0FMTEJBQ0ssIFZvaWNlTW9kYWxDb25maWcgfSBmcm9tICcuLi8uLi92b2ljZS1tb2RhbC10b2tlbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LXZvaWNlLWFnZW50LW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50TW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQElucHV0KCkgYXBpVXJsITogc3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbiE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbklkITogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlLZXk6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBldmVudFRva2VuOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZXZlbnRJZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGV2ZW50VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZG9tYWluQXV0aG9yaXR5OiBzdHJpbmcgPSAncHJvZC1saXRlJztcbiAgQElucHV0KCkgYWdlbnROYW1lOiBzdHJpbmcgPSAnQUkgQXNzaXN0YW50JztcbiAgQElucHV0KCkgYWdlbnRSb2xlOiBzdHJpbmcgPSAnQUkgQWdlbnQgU3BlY2lhbGlzdCc7XG4gIEBJbnB1dCgpIGFnZW50QXZhdGFyPzogc3RyaW5nO1xuICBASW5wdXQoKSB1c2Vyc0FwaVVybDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBpbmplY3RlZENvbmZpZzogVm9pY2VNb2RhbENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9uQ2xvc2VDYWxsYmFjazogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZvaWNlQWdlbnRTZXJ2aWNlOiBWb2ljZUFnZW50U2VydmljZSxcbiAgICBwdWJsaWMgYXVkaW9BbmFseXplcjogQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3JcbiAgKSB7fVxuXG4gIC8qKiBIYXJkY29kZWQgdm9pY2UgYWdlbnQgYXZhdGFyIChOaWEpLiAqL1xuICByZWFkb25seSBkaXNwbGF5QXZhdGFyVXJsID0gJ2h0dHBzOi8vd3d3LmpvdGZvcm0uY29tL3VwbG9hZHMvbWVobWV0a2FyYWthc2xpL2Zvcm1fZmlsZXMvMTU2NDU5MzY2NzY3NmE4ZTg1ZjIzNzU4Ljg2OTQ1NTM3X2ljb24ucG5nJztcblxuICBjYWxsU3RhdGU6IENhbGxTdGF0ZSA9ICdpZGxlJztcbiAgc3RhdHVzVGV4dDogc3RyaW5nID0gJyc7XG4gIGR1cmF0aW9uOiBzdHJpbmcgPSAnMDA6MDAnO1xuICBpc01pY011dGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzVXNlclNwZWFraW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGF1ZGlvTGV2ZWxzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBib3QgaXMgc3BlYWtpbmcg4oCUIGRyaXZlcyBhdmF0YXIgcHVsc2UgYW5pbWF0aW9uIGFuZCB2b2ljZSB2aXN1YWxpemVyLiAqL1xuICBnZXQgaXNCb3RUYWxraW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5jYWxsU3RhdGUgPT09ICd0YWxraW5nJzsgfVxuXG4gIC8qKiBUcnVlIHdoaWxlIHRoZSB1c2VyIGlzIGFjdGl2ZWx5IHNwZWFraW5nIOKAlCBkcml2ZXMgd2F2ZWZvcm0gYWN0aXZlIGNvbG9yLiAqL1xuICBnZXQgaXNVc2VyQWN0aXZlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5jYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnICYmIHRoaXMuaXNVc2VyU3BlYWtpbmcgJiYgIXRoaXMuaXNNaWNNdXRlZDsgfVxuXG4gIC8qKiBUcnVlIGR1cmluZyB0aGUgYnJpZWYgcHJvY2Vzc2luZyBwYXVzZSBiZXR3ZWVuIHVzZXIgc3BlZWNoIGFuZCBib3QgcmVzcG9uc2UuICovXG4gIGdldCBpc1Byb2Nlc3NpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNhbGxTdGF0ZSA9PT0gJ2Nvbm5lY3RlZCcgJiYgdGhpcy5zdGF0dXNUZXh0ID09PSAnUHJvY2Vzc2luZy4uLic7IH1cblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiBvcGVuZWQgdmlhIE92ZXJsYXksIGNvbmZpZyBpcyBwcm92aWRlZCBieSBpbmplY3Rpb25cbiAgICB0aGlzLmluamVjdGVkQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQoVk9JQ0VfTU9EQUxfQ09ORklHLCBudWxsKTtcbiAgICB0aGlzLm9uQ2xvc2VDYWxsYmFjayA9IHRoaXMuaW5qZWN0b3IuZ2V0KFZPSUNFX01PREFMX0NMT1NFX0NBTExCQUNLLCBudWxsKTtcbiAgICBpZiAodGhpcy5pbmplY3RlZENvbmZpZykge1xuICAgICAgdGhpcy5hcGlVcmwgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFwaVVybDtcbiAgICAgIHRoaXMudG9rZW4gPSB0aGlzLmluamVjdGVkQ29uZmlnLnRva2VuO1xuICAgICAgdGhpcy5ib3RJZCA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYm90SWQ7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gdGhpcy5pbmplY3RlZENvbmZpZy5jb252ZXJzYXRpb25JZDtcbiAgICAgIHRoaXMuYXBpS2V5ID0gdGhpcy5pbmplY3RlZENvbmZpZy5hcGlLZXkgPz8gJyc7XG4gICAgICB0aGlzLmV2ZW50VG9rZW4gPSB0aGlzLmluamVjdGVkQ29uZmlnLmV2ZW50VG9rZW4gPz8gJyc7XG4gICAgICB0aGlzLmV2ZW50SWQgPSB0aGlzLmluamVjdGVkQ29uZmlnLmV2ZW50SWQgPz8gJyc7XG4gICAgICB0aGlzLmV2ZW50VXJsID0gdGhpcy5pbmplY3RlZENvbmZpZy5ldmVudFVybCA/PyAnJztcbiAgICAgIHRoaXMuZG9tYWluQXV0aG9yaXR5ID0gdGhpcy5pbmplY3RlZENvbmZpZy5kb21haW5BdXRob3JpdHkgPz8gJ3Byb2QtbGl0ZSc7XG4gICAgICB0aGlzLmFnZW50TmFtZSA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYWdlbnROYW1lID8/IHRoaXMuYWdlbnROYW1lO1xuICAgICAgdGhpcy5hZ2VudFJvbGUgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFnZW50Um9sZSA/PyB0aGlzLmFnZW50Um9sZTtcbiAgICAgIHRoaXMuYWdlbnRBdmF0YXIgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFnZW50QXZhdGFyO1xuICAgICAgdGhpcy51c2Vyc0FwaVVybCA9IHRoaXMuaW5qZWN0ZWRDb25maWcudXNlcnNBcGlVcmwgPz8gdGhpcy51c2Vyc0FwaVVybDtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuY2FsbFN0YXRlJC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICB0aGlzLmNhbGxTdGF0ZSA9IHN0YXRlO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLnN0YXR1c1RleHQkLnN1YnNjcmliZSh0ZXh0ID0+IHtcbiAgICAgICAgdGhpcy5zdGF0dXNUZXh0ID0gdGV4dDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5kdXJhdGlvbiQuc3Vic2NyaWJlKGR1cmF0aW9uID0+IHtcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmlzTWljTXV0ZWQkLnN1YnNjcmliZShtdXRlZCA9PiB7XG4gICAgICAgIHRoaXMuaXNNaWNNdXRlZCA9IG11dGVkO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmlzVXNlclNwZWFraW5nJC5zdWJzY3JpYmUoc3BlYWtpbmcgPT4ge1xuICAgICAgICB0aGlzLmlzVXNlclNwZWFraW5nID0gc3BlYWtpbmc7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuYXVkaW9MZXZlbHMkLnN1YnNjcmliZShsZXZlbHMgPT4ge1xuICAgICAgICB0aGlzLmF1ZGlvTGV2ZWxzID0gbGV2ZWxzO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gQWx3YXlzIHN0YXJ0IGZyb20gYSBmcmVzaCB2b2ljZSBzZXNzaW9uIHRvIGF2b2lkIHN0YWxlL2Rpc2Nvbm5lY3RlZCBzdGF0ZSBmbGFzaGVzLlxuICAgIHZvaWQgdGhpcy5vcGVuRnJlc2hDYWxsU2Vzc2lvbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIGlzQ29ubmVjdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGFzeW5jIHN0YXJ0Q2FsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RpbmcgfHwgKHRoaXMuY2FsbFN0YXRlICE9PSAnaWRsZScgJiYgdGhpcy5jYWxsU3RhdGUgIT09ICdlbmRlZCcpKSByZXR1cm47XG4gICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmNvbm5lY3QoXG4gICAgICAgIHRoaXMuYXBpVXJsLFxuICAgICAgICB0aGlzLnRva2VuLFxuICAgICAgICB0aGlzLmJvdElkLFxuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkLFxuICAgICAgICB0aGlzLmFwaUtleSxcbiAgICAgICAgdGhpcy5ldmVudFRva2VuLFxuICAgICAgICB0aGlzLmV2ZW50SWQsXG4gICAgICAgIHRoaXMuZXZlbnRVcmwsXG4gICAgICAgIHRoaXMuZG9tYWluQXV0aG9yaXR5LFxuICAgICAgICB0aGlzLnVzZXJzQXBpVXJsIHx8IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb25uZWN0IHZvaWNlIGFnZW50OicsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvcGVuRnJlc2hDYWxsU2Vzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLnByZXBhcmVGcmVzaFNlc3Npb24oKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0Q2FsbCgpO1xuICB9XG5cbiAgdG9nZ2xlTWljKCk6IHZvaWQge1xuICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UudG9nZ2xlTWljKCk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGF1ZGlvIGxldmVsICgw4oCTMTAwKSB0byB3YXZlZm9ybSBiYXIgaGVpZ2h0IGluIHB4IHdpdGggYSBnYXVzc2lhblxuICAgKiBiZWxsLWN1cnZlIGVudmVsb3BlIHNvIGNlbnRyZSBiYXJzIGFyZSB0YWxsZXN0IGFuZCBlZGdlIGJhcnMgYXBwZWFyXG4gICAqIGFzIHRpbnkgZG90cyDigJQgbWF0Y2hpbmcgdGhlIGF1ZGlvLXdhdmVmb3JtIHJlZmVyZW5jZSBkZXNpZ24uXG4gICAqL1xuICBnZXRXYXZlZm9ybUhlaWdodChsZXZlbDogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBuID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCBsZXZlbCA/PyAwKSk7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmF1ZGlvTGV2ZWxzLmxlbmd0aCB8fCA2MDtcbiAgICBjb25zdCBjZW50ZXIgPSAodG90YWwgLSAxKSAvIDI7XG4gICAgY29uc3Qgc2lnbWEgPSB0b3RhbCAvIDU7XG4gICAgY29uc3QgZW52ZWxvcGUgPSBNYXRoLmV4cCgtTWF0aC5wb3coaW5kZXggLSBjZW50ZXIsIDIpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7XG4gICAgLy8gTWluaW11bSBoZWlnaHQgc2NhbGVzIHdpdGggZW52ZWxvcGUgc28gZWRnZXMgc2hvdyBhcyBkb3RzIGV2ZW4gaW4gc2lsZW5jZVxuICAgIGNvbnN0IG1pbkhlaWdodCA9IDIgKyBlbnZlbG9wZSAqIDM7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gNCArIGVudmVsb3BlICogMzg7XG4gICAgcmV0dXJuIG1pbkhlaWdodCArIChuIC8gMTAwKSAqIChtYXhIZWlnaHQgLSBtaW5IZWlnaHQpO1xuICB9XG5cbiAgLyoqIFN0YXR1cyBsYWJlbCBmb3IgYWN0aXZlIGNhbGwg4oCUIGRyaXZlbiBieSBjYWxsU3RhdGUgKyBzZXJ2aWNlIHN0YXR1c1RleHQuICovXG4gIGdldCBzdGF0dXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5jYWxsU3RhdGUpIHtcbiAgICAgIGNhc2UgJ2Nvbm5lY3RpbmcnOiByZXR1cm4gJ0Nvbm5lY3RpbmcuLi4nO1xuICAgICAgY2FzZSAndGFsa2luZyc6ICAgIHJldHVybiAnVGFsa2luZy4uLic7XG4gICAgICBjYXNlICdsaXN0ZW5pbmcnOiAgcmV0dXJuICdMaXN0ZW5pbmcuLi4nO1xuICAgICAgLy8gJ2Nvbm5lY3RlZCcgY292ZXJzOiBpbml0aWFsIGNvbm5lY3QsIGJldHdlZW4gdHVybnMgKExpc3RlbmluZyAvIFByb2Nlc3NpbmcpXG4gICAgICBjYXNlICdjb25uZWN0ZWQnOiAgcmV0dXJuIHRoaXMuc3RhdHVzVGV4dCB8fCAnQ29ubmVjdGVkJztcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXNUZXh0IHx8ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsIEFnYWluOiByZXNldCB0byBpZGxlIHRoZW4gc3RhcnQgYSBuZXcgY2FsbC4gKi9cbiAgYXN5bmMgY2FsbEFnYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMub3BlbkZyZXNoQ2FsbFNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKiBCYWNrIHRvIENoYXQ6IGNsb3NlIG1vZGFsIGFuZCBkaXNjb25uZWN0LiAqL1xuICBiYWNrVG9DaGF0KCk6IHZvaWQge1xuICAgIHRoaXMuZW5kQ2FsbCgpO1xuICB9XG5cbiAgLyoqIEVuZCBjYWxsIGJ1dCBrZWVwIG1vZGFsIG9wZW4gdG8gc2hvdyBDYWxsIEVuZGVkICsgQ2FsbCBBZ2FpbiAvIEJhY2sgdG8gQ2hhdC4gKi9cbiAgaGFuZ1VwKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgYXN5bmMgZW5kQ2FsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLm9uQ2xvc2VDYWxsYmFjaz8uKCk7XG4gICAgdGhpcy5jbG9zZS5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2b2ljZS1hZ2VudC1tb2RhbC1vdmVybGF5XCIgKGNsaWNrKT1cImVuZENhbGwoKVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ2b2ljZS1jb250YWluZXIgdm9pY2UtYWdlbnQtbW9kYWxcIlxuICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICA+XG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaWNvblwiPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPVwiMTZcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTEyIDFDOC4xMyAxIDUgNC4xMyA1IDhWMTRDNSAxNy44NyA4LjEzIDIxIDEyIDIxQzE1Ljg3IDIxIDE5IDE3Ljg3IDE5IDE0VjhDMTkgNC4xMyAxNS44NyAxIDEyIDFaXCJcbiAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xMiAyM0MxMC4zNCAyMyA5IDIxLjY2IDkgMjBIMTVDMTUgMjEuNjYgMTMuNjYgMjMgMTIgMjNaXCJcbiAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5Wb2ljZTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImNsb3NlLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJlbmRDYWxsKClcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgID5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEF2YXRhciBTZWN0aW9uIHdpdGggZ2xvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItZ2xvd1wiIFtjbGFzcy5nbG93LXRhbGtpbmddPVwiaXNCb3RUYWxraW5nXCIgW2NsYXNzLmdsb3ctbGlzdGVuaW5nXT1cImNhbGxTdGF0ZSA9PT0gJ2xpc3RlbmluZydcIj48L2Rpdj5cblxuICAgICAgPCEtLSBQYXJ0aWNsZSByaW5nIOKAlCB2aXNpYmxlIHdoaWxlIGJvdCBpcyB0YWxraW5nIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImlzQm90VGFsa2luZ1wiIGNsYXNzPVwicGFydGljbGVzLWNvbnRhaW5lclwiPlxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgaSBvZiBbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNV1cIlxuICAgICAgICAgICAgICBjbGFzcz1cInBhcnRpY2xlXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0taV09XCJpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmFuaW1hdGlvbkRlbGF5XT1cIihpICogMC4xNSkgKyAncydcIj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItd3JhcHBlclwiIFtjbGFzcy5zcGVha2luZ109XCJpc0JvdFRhbGtpbmdcIiBbY2xhc3MubGlzdGVuaW5nXT1cImNhbGxTdGF0ZSA9PT0gJ2xpc3RlbmluZydcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWFnZVwiIFtzcmNdPVwiZGlzcGxheUF2YXRhclVybFwiIGFsdD1cIk5pYVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWdlbnQgSW5mbzogTmlhICsgQ29sbGFib3JhdGlvbiBNYW5hZ2VyIEFJIEFnZW50IFNwZWNpYWxpc3QgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFnZW50LWluZm9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1uYW1lXCI+XG4gICAgICAgIE5pYVxuICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWJhZGdlXCI+QUk8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPVwiYWdlbnQtcm9sZVwiPkNPUDMwIEFJIEFnZW50IDwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3RhcnQgQ2FsbCAod2hlbiBpZGxlIG9ubHkpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjYWxsU3RhdGUgPT09ICdpZGxlJ1wiIGNsYXNzPVwic3RhcnQtY2FsbC1zZWN0aW9uXCI+XG4gICAgICA8cCAqbmdJZj1cInN0YXR1c1RleHQgPT09ICdDb25uZWN0aW9uIGZhaWxlZCdcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAge3sgc3RhdHVzVGV4dCB9fVxuICAgICAgPC9wPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInN0YXJ0LWNhbGwtYnV0dG9uXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0Nvbm5lY3RpbmdcIlxuICAgICAgICAoY2xpY2spPVwic3RhcnRDYWxsKClcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImlzQ29ubmVjdGluZ1wiPkNvbm5lY3RpbmcuLi48L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ29ubmVjdGluZyAmJiBzdGF0dXNUZXh0ID09PSAnQ29ubmVjdGlvbiBmYWlsZWQnXCJcbiAgICAgICAgICA+UmV0cnk8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0Nvbm5lY3RpbmcgJiYgc3RhdHVzVGV4dCAhPT0gJ0Nvbm5lY3Rpb24gZmFpbGVkJ1wiXG4gICAgICAgICAgPlN0YXJ0IENhbGw8L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENhbGwgRW5kZWQ6IHN0YXR1cyArIENhbGwgQWdhaW4gLyBCYWNrIHRvIENoYXQgLS0+XG4gICAgPGRpdiAqbmdJZj1cImNhbGxTdGF0ZSA9PT0gJ2VuZGVkJ1wiIGNsYXNzPVwiY2FsbC1lbmRlZC1zZWN0aW9uXCI+XG4gICAgICA8cCBjbGFzcz1cImNhbGwtZW5kZWQtc3RhdHVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLXRleHRcIj5DYWxsIEVuZGVkPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10aW1lclwiPnt7IGR1cmF0aW9uIH19PC9zcGFuPlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGwtZW5kZWQtY29udHJvbHNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ0blwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNhbGxBZ2FpbigpXCJcbiAgICAgICAgICB0aXRsZT1cIkNhbGwgQWdhaW5cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zIDEyYTkgOSAwIDEgMCA5LTkgOS43NSA5Ljc1IDAgMCAwLTYuNzQgMi43NEwzIDhcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zIDN2NWg1XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICBDYWxsIEFnYWluXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiYmFja1RvQ2hhdCgpXCJcbiAgICAgICAgICB0aXRsZT1cIkJhY2sgdG8gQ2hhdFwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTIxIDE1YTIgMiAwIDAgMS0yIDJIN2wtNCA0VjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAyelwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgQmFjayB0byBDaGF0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0YXR1cyAod2hlbiBjb25uZWN0aW5nIG9yIGluLWNhbGw6IFRhbGtpbmcuLi4gLyBMaXN0ZW5pbmcgLyBDb25uZWN0ZWQgKyB0aW1lcikgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yIHN0YXR1cy1pbmxpbmVcIlxuICAgICAgKm5nSWY9XCJjYWxsU3RhdGUgIT09ICdpZGxlJyAmJiBjYWxsU3RhdGUgIT09ICdlbmRlZCdcIlxuICAgID5cbiAgICAgIDxkaXYgKm5nSWY9XCJjYWxsU3RhdGUgPT09ICdjb25uZWN0aW5nJ1wiIGNsYXNzPVwic3RhdHVzLWNvbm5lY3RpbmdcIj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIGNsYXNzPVwic3Bpbm5lclwiXG4gICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgIGN4PVwiMTJcIlxuICAgICAgICAgICAgY3k9XCIxMlwiXG4gICAgICAgICAgICByPVwiMTBcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PVwiMzEuNDE2XCJcbiAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0PVwiMzEuNDE2XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YW5pbWF0ZVxuICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lPVwic3Ryb2tlLWRhc2hhcnJheVwiXG4gICAgICAgICAgICAgIGR1cj1cIjJzXCJcbiAgICAgICAgICAgICAgdmFsdWVzPVwiMCAzMS40MTY7MTUuNzA4IDE1LjcwODswIDMxLjQxNjswIDMxLjQxNlwiXG4gICAgICAgICAgICAgIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGFuaW1hdGVcbiAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZT1cInN0cm9rZS1kYXNob2Zmc2V0XCJcbiAgICAgICAgICAgICAgZHVyPVwiMnNcIlxuICAgICAgICAgICAgICB2YWx1ZXM9XCIwOy0xNS43MDg7LTMxLjQxNjstMzEuNDE2XCJcbiAgICAgICAgICAgICAgcmVwZWF0Q291bnQ9XCJpbmRlZmluaXRlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9jaXJjbGU+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10ZXh0XCI+e3sgc3RhdHVzVGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImNhbGxTdGF0ZSAhPT0gJ2Nvbm5lY3RpbmcnXCJcbiAgICAgICAgY2xhc3M9XCJzdGF0dXMtY29ubmVjdGVkIHN0YXR1cy1pbmxpbmUtcm93XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtdGV4dFwiIFtjbGFzcy5zdGF0dXMtdGFsa2luZ109XCJpc0JvdFRhbGtpbmdcIiBbY2xhc3Muc3RhdHVzLWxpc3RlbmluZ109XCJjYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnXCIgW2NsYXNzLnN0YXR1cy1wcm9jZXNzaW5nXT1cImlzUHJvY2Vzc2luZ1wiPlxuICAgICAgICAgIHt7IHN0YXR1c0xhYmVsIH19XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8IS0tIEFuaW1hdGVkIGJhcnMg4oCUIHZpc2libGUgd2hpbGUgYm90IGlzIHRhbGtpbmcgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0JvdFRhbGtpbmdcIiBjbGFzcz1cInZvaWNlLXZpc3VhbGl6ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmJhclwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YmFyXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZiYXJcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmJhclwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJvdW5jaW5nIGRvdHMg4oCUIHZpc2libGUgZHVyaW5nIHByb2Nlc3NpbmcgcGF1c2UgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc1Byb2Nlc3NpbmdcIiBjbGFzcz1cInByb2Nlc3NpbmctZG90c1wiPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10aW1lclwiPnt7IGR1cmF0aW9uIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFdhdmVmb3JtOiBhbHdheXMgdmlzaWJsZSBkdXJpbmcgYW4gYWN0aXZlIGNhbGwsIGFjdGl2ZSAoY29sb3VyZWQpIHdoZW4gdXNlciBzcGVha3MgLS0+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJjYWxsU3RhdGUgPT09ICdjb25uZWN0ZWQnIHx8IGNhbGxTdGF0ZSA9PT0gJ2xpc3RlbmluZycgfHwgY2FsbFN0YXRlID09PSAndGFsa2luZydcIlxuICAgICAgY2xhc3M9XCJ3YXZlZm9ybS1jb250YWluZXJcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3YXZlZm9ybS1iYXJzXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgbGV2ZWwgb2YgYXVkaW9MZXZlbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwid2F2ZWZvcm0tYmFyXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzVXNlckFjdGl2ZVwiXG4gICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJnZXRXYXZlZm9ybUhlaWdodChsZXZlbCwgaSlcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2FsbCBDb250cm9scyAod2hlbiBjb25uZWN0ZWQpIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY29udHJvbHNcIlxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgY2FsbFN0YXRlID09PSAnY29ubmVjdGluZycgfHxcbiAgICAgICAgY2FsbFN0YXRlID09PSAnY29ubmVjdGVkJyB8fFxuICAgICAgICBjYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnIHx8XG4gICAgICAgIGNhbGxTdGF0ZSA9PT0gJ3RhbGtpbmcnXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1idG4gbWljLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLm11dGVkXT1cImlzTWljTXV0ZWRcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNaWMoKVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3RpdGxlXT1cImlzTWljTXV0ZWQgPyAnVW5tdXRlJyA6ICdNdXRlJ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIE1pY3JvcGhvbmUgaWNvbiAodW5tdXRlZCkgLS0+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgKm5nSWY9XCIhaXNNaWNNdXRlZFwiXG4gICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCItNSAwIDMyIDMyXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0xMDUsIC0zMDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0xMTEsMzE0IEMxMTEsMzExLjIzOCAxMTMuMjM5LDMwOSAxMTYsMzA5IEMxMTguNzYxLDMwOSAxMjEsMzExLjIzOCAxMjEsMzE0IEwxMjEsMzI0IEMxMjEsMzI2Ljc2MiAxMTguNzYxLDMyOSAxMTYsMzI5IEMxMTMuMjM5LDMyOSAxMTEsMzI2Ljc2MiAxMTEsMzI0IEwxMTEsMzE0IEwxMTEsMzE0IFogTTExNiwzMzEgQzExOS44NjYsMzMxIDEyMywzMjcuODY2IDEyMywzMjQgTDEyMywzMTQgQzEyMywzMTAuMTM0IDExOS44NjYsMzA3IDExNiwzMDcgQzExMi4xMzQsMzA3IDEwOSwzMTAuMTM0IDEwOSwzMTQgTDEwOSwzMjQgQzEwOSwzMjcuODY2IDExMi4xMzQsMzMxIDExNiwzMzEgTDExNiwzMzEgWiBNMTI3LDMyNiBMMTI1LDMyNiBDMTI0LjA4OSwzMzAuMDA3IDEyMC4yODIsMzMzIDExNiwzMzMgQzExMS43MTgsMzMzIDEwNy45MTEsMzMwLjAwNyAxMDcsMzI2IEwxMDUsMzI2IEMxMDUuODgzLDMzMC43OTkgMTEwLjA2MywzMzQuNTEgMTE1LDMzNC45NTUgTDExNSwzMzcgTDExNCwzMzcgQzExMy40NDgsMzM3IDExMywzMzcuNDQ4IDExMywzMzggQzExMywzMzguNTUzIDExMy40NDgsMzM5IDExNCwzMzkgTDExOCwzMzkgQzExOC41NTIsMzM5IDExOSwzMzguNTUzIDExOSwzMzggQzExOSwzMzcuNDQ4IDExOC41NTIsMzM3IDExOCwzMzcgTDExNywzMzcgTDExNywzMzQuOTU1IEMxMjEuOTM3LDMzNC41MSAxMjYuMTE3LDMzMC43OTkgMTI3LDMyNiBMMTI3LDMyNiBaXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8IS0tIE1pY3JvcGhvbmUgaWNvbiAobXV0ZWQpIC0tPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICpuZ0lmPVwiaXNNaWNNdXRlZFwiXG4gICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCItNSAwIDMyIDMyXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0xMDUsIC0zMDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0xMTEsMzE0IEMxMTEsMzExLjIzOCAxMTMuMjM5LDMwOSAxMTYsMzA5IEMxMTguNzYxLDMwOSAxMjEsMzExLjIzOCAxMjEsMzE0IEwxMjEsMzI0IEMxMjEsMzI2Ljc2MiAxMTguNzYxLDMyOSAxMTYsMzI5IEMxMTMuMjM5LDMyOSAxMTEsMzI2Ljc2MiAxMTEsMzI0IEwxMTEsMzE0IEwxMTEsMzE0IFogTTExNiwzMzEgQzExOS44NjYsMzMxIDEyMywzMjcuODY2IDEyMywzMjQgTDEyMywzMTQgQzEyMywzMTAuMTM0IDExOS44NjYsMzA3IDExNiwzMDcgQzExMi4xMzQsMzA3IDEwOSwzMTAuMTM0IDEwOSwzMTQgTDEwOSwzMjQgQzEwOSwzMjcuODY2IDExMi4xMzQsMzMxIDExNiwzMzEgTDExNiwzMzEgWiBNMTI3LDMyNiBMMTI1LDMyNiBDMTI0LjA4OSwzMzAuMDA3IDEyMC4yODIsMzMzIDExNiwzMzMgQzExMS43MTgsMzMzIDEwNy45MTEsMzMwLjAwNyAxMDcsMzI2IEwxMDUsMzI2IEMxMDUuODgzLDMzMC43OTkgMTEwLjA2MywzMzQuNTEgMTE1LDMzNC45NTUgTDExNSwzMzcgTDExNCwzMzcgQzExMy40NDgsMzM3IDExMywzMzcuNDQ4IDExMywzMzggQzExMywzMzguNTUzIDExMy40NDgsMzM5IDExNCwzMzkgTDExOCwzMzkgQzExOC41NTIsMzM5IDExOSwzMzguNTUzIDExOSwzMzggQzExOSwzMzcuNDQ4IDExOC41NTIsMzM3IDExOCwzMzcgTDExNywzMzcgTDExNywzMzQuOTU1IEMxMjEuOTM3LDMzNC41MSAxMjYuMTE3LDMzMC43OTkgMTI3LDMyNiBMMTI3LDMyNiBaXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMiAyIEwzMCAzMFwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5NdXRlPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1idG4gZW5kLWNhbGwtYnRuXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZ1VwKClcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHRpdGxlPVwiRW5kIENhbGxcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5FbmQgQ2FsbDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|