@hivegpt/hiveai-angular 0.0.588 → 0.0.590

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.
Files changed (29) hide show
  1. package/bundles/hivegpt-hiveai-angular.umd.js +252 -654
  2. package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
  3. package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
  4. package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
  5. package/esm2015/hivegpt-hiveai-angular.js +4 -6
  6. package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +1 -1
  7. package/esm2015/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.js +17 -24
  8. package/esm2015/lib/components/voice-agent/services/audio-analyzer.service.js +3 -3
  9. package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +189 -155
  10. package/esm2015/lib/components/voice-agent/voice-agent.module.js +3 -7
  11. package/fesm2015/hivegpt-hiveai-angular.js +208 -579
  12. package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
  13. package/hivegpt-hiveai-angular.d.ts +3 -5
  14. package/hivegpt-hiveai-angular.d.ts.map +1 -1
  15. package/hivegpt-hiveai-angular.metadata.json +1 -1
  16. package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts +7 -4
  17. package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts.map +1 -1
  18. package/lib/components/voice-agent/services/audio-analyzer.service.d.ts +2 -2
  19. package/lib/components/voice-agent/services/voice-agent.service.d.ts +23 -17
  20. package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
  21. package/lib/components/voice-agent/voice-agent.module.d.ts +2 -2
  22. package/lib/components/voice-agent/voice-agent.module.d.ts.map +1 -1
  23. package/package.json +1 -1
  24. package/esm2015/lib/components/voice-agent/services/daily-voice-client.service.js +0 -312
  25. package/esm2015/lib/components/voice-agent/services/websocket-voice-client.service.js +0 -95
  26. package/lib/components/voice-agent/services/daily-voice-client.service.d.ts +0 -65
  27. package/lib/components/voice-agent/services/daily-voice-client.service.d.ts.map +0 -1
  28. package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts +0 -49
  29. package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts.map +0 -1
@@ -1,36 +1,33 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import { isPlatformBrowser } from '@angular/common';
3
- import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
4
- import { BehaviorSubject, combineLatest, Subject, Subscription, } from 'rxjs';
5
- import { filter, take, takeUntil } from 'rxjs/operators';
3
+ import { Inject, Injectable, NgZone, PLATFORM_ID } from '@angular/core';
4
+ import { BehaviorSubject, Subject, Subscription } from 'rxjs';
5
+ import { take } from 'rxjs/operators';
6
+ import { PipecatClient, RTVIEvent } from '@pipecat-ai/client-js';
7
+ import { WebSocketTransport } from '@pipecat-ai/websocket-transport';
6
8
  import { PlatformTokenRefreshService } from '../../../services/platform-token-refresh.service';
7
9
  import { AudioAnalyzerService } from './audio-analyzer.service';
8
- import { WebSocketVoiceClientService } from './websocket-voice-client.service';
9
- import { DailyVoiceClientService } from './daily-voice-client.service';
10
10
  import * as i0 from "@angular/core";
11
11
  import * as i1 from "./audio-analyzer.service";
12
- import * as i2 from "./websocket-voice-client.service";
13
- import * as i3 from "./daily-voice-client.service";
14
- import * as i4 from "../../../services/platform-token-refresh.service";
12
+ import * as i2 from "../../../services/platform-token-refresh.service";
15
13
  /**
16
- * Voice agent orchestrator. Coordinates WebSocket (signaling) and Daily.js (WebRTC audio).
14
+ * Voice agent orchestrator using the official PipecatClient SDK.
17
15
  *
18
- * CRITICAL: This service must NEVER use Socket.IO or ngx-socket-io. Voice flow uses only:
19
- * - Native WebSocket (WebSocketVoiceClientService) for signaling (room_created, transcripts)
20
- * - Daily.js (DailyVoiceClientService) for WebRTC audio. Audio does NOT flow over WebSocket.
21
- *
22
- * - Maintains callState, statusText, duration, isMicMuted, isUserSpeaking, audioLevels
23
- * - Uses WebSocket for room_created and transcripts only (no audio)
24
- * - Uses Daily.js for all audio, mic, and real-time speaking detection
16
+ * Audio flow (mirrors the React reference implementation):
17
+ * - Local mic: acquired by PipecatClient.initDevices(); local track fed to
18
+ * AudioAnalyzerService for waveform visualisation.
19
+ * - Bot audio: received as a MediaStreamTrack via RTVIEvent.TrackStarted,
20
+ * played through a hidden <audio> element.
21
+ * - All binary protobuf framing / RTVI protocol handled by
22
+ * @pipecat-ai/client-js + @pipecat-ai/websocket-transport.
25
23
  */
26
24
  export class VoiceAgentService {
27
- constructor(audioAnalyzer, wsClient, dailyClient, platformTokenRefresh,
25
+ constructor(audioAnalyzer, platformTokenRefresh, ngZone,
28
26
  /** `Object` not `object` — ngc metadata collection rejects the `object` type in DI params. */
29
27
  platformId) {
30
28
  this.audioAnalyzer = audioAnalyzer;
31
- this.wsClient = wsClient;
32
- this.dailyClient = dailyClient;
33
29
  this.platformTokenRefresh = platformTokenRefresh;
30
+ this.ngZone = ngZone;
34
31
  this.platformId = platformId;
35
32
  this.callStateSubject = new BehaviorSubject('idle');
36
33
  this.statusTextSubject = new BehaviorSubject('');
@@ -42,9 +39,10 @@ export class VoiceAgentService {
42
39
  this.botTranscriptSubject = new Subject();
43
40
  this.callStartTime = 0;
44
41
  this.durationInterval = null;
42
+ this.pcClient = null;
43
+ this.botAudioElement = null;
45
44
  this.subscriptions = new Subscription();
46
45
  this.destroy$ = new Subject();
47
- this.hasAutoUnmutedAfterFirstAudio = false;
48
46
  this.callState$ = this.callStateSubject.asObservable();
49
47
  this.statusText$ = this.statusTextSubject.asObservable();
50
48
  this.duration$ = this.durationSubject.asObservable();
@@ -53,199 +51,236 @@ export class VoiceAgentService {
53
51
  this.audioLevels$ = this.audioLevelsSubject.asObservable();
54
52
  this.userTranscript$ = this.userTranscriptSubject.asObservable();
55
53
  this.botTranscript$ = this.botTranscriptSubject.asObservable();
56
- // Waveform visualization only - do NOT use for speaking state
57
54
  this.subscriptions.add(this.audioAnalyzer.audioLevels$.subscribe((levels) => this.audioLevelsSubject.next(levels)));
58
55
  }
59
56
  ngOnDestroy() {
60
57
  this.destroy$.next();
61
58
  this.subscriptions.unsubscribe();
62
- this.disconnect();
59
+ void this.disconnect();
63
60
  }
64
- /** Reset to idle state (e.g. when modal opens so user can click Start Call). */
61
+ /** Reset to idle (e.g. when modal re-opens so user can click Start Call). */
65
62
  resetToIdle() {
66
63
  if (this.callStateSubject.value === 'idle')
67
64
  return;
68
- this.stopDurationTimer();
69
- this.audioAnalyzer.stop();
70
- this.wsClient.disconnect();
71
- // Fire-and-forget: Daily disconnect is async; connect() will await if needed
72
- void this.dailyClient.disconnect();
65
+ void this.disconnect();
73
66
  this.callStateSubject.next('idle');
74
67
  this.statusTextSubject.next('');
75
68
  this.durationSubject.next('0:00');
76
- this.hasAutoUnmutedAfterFirstAudio = false;
77
69
  }
78
70
  connect(apiUrl, token, botId, conversationId, apiKey, eventToken, eventId, eventUrl, domainAuthority, usersApiUrl) {
79
71
  return __awaiter(this, void 0, void 0, function* () {
80
72
  if (this.callStateSubject.value !== 'idle') {
81
- console.warn('Call already in progress');
73
+ console.warn('[HiveGpt Voice] Call already in progress');
82
74
  return;
83
75
  }
84
76
  try {
85
77
  this.callStateSubject.next('connecting');
86
78
  this.statusTextSubject.next('Connecting...');
87
79
  let accessToken = token;
88
- // Align with chat drawer token handling: always delegate to
89
- // PlatformTokenRefreshService when we have a usersApiUrl, so it can
90
- // fall back to stored tokens even if the caller passed an empty token.
91
80
  if (usersApiUrl && isPlatformBrowser(this.platformId)) {
92
81
  try {
93
82
  const ensured = yield this.platformTokenRefresh
94
83
  .ensureValidAccessToken(token, usersApiUrl)
95
84
  .pipe(take(1))
96
85
  .toPromise();
97
- if (ensured === null || ensured === void 0 ? void 0 : ensured.accessToken) {
86
+ if (ensured === null || ensured === void 0 ? void 0 : ensured.accessToken)
98
87
  accessToken = ensured.accessToken;
99
- }
100
88
  }
101
89
  catch (e) {
102
- console.warn('[HiveGpt Voice] Token refresh before connect failed', e);
90
+ console.warn('[HiveGpt Voice] Token refresh failed', e);
103
91
  }
104
92
  }
105
93
  const baseUrl = apiUrl.replace(/\/$/, '');
106
- const postUrl = `${baseUrl}/ai/ask-voice`;
107
- const headers = {
108
- 'Content-Type': 'application/json',
109
- Authorization: `Bearer ${accessToken}`,
110
- 'x-api-key': apiKey,
111
- 'hive-bot-id': botId,
112
- 'domain-authority': domainAuthority,
113
- eventUrl,
114
- eventId,
115
- eventToken,
116
- 'ngrok-skip-browser-warning': 'true',
117
- };
118
- // POST to get ws_url for signaling
119
- const res = yield fetch(postUrl, {
120
- method: 'POST',
121
- headers,
122
- body: JSON.stringify({
123
- bot_id: botId,
124
- conversation_id: conversationId,
125
- voice: 'alloy',
126
- }),
94
+ const pcClient = new PipecatClient({
95
+ transport: new WebSocketTransport(),
96
+ enableMic: true,
97
+ enableCam: false,
98
+ callbacks: {
99
+ onConnected: () => this.ngZone.run(() => this.onPipecatConnected()),
100
+ onDisconnected: () => this.ngZone.run(() => this.onPipecatDisconnected()),
101
+ onBotReady: () => this.ngZone.run(() => this.onBotReady()),
102
+ onUserTranscript: (data) => this.ngZone.run(() => this.userTranscriptSubject.next({ text: data.text, final: !!data.final })),
103
+ onBotTranscript: (data) => this.ngZone.run(() => this.botTranscriptSubject.next(data.text)),
104
+ onError: (err) => {
105
+ this.ngZone.run(() => {
106
+ console.error('[HiveGpt Voice] PipecatClient error', err);
107
+ this.callStateSubject.next('ended');
108
+ this.statusTextSubject.next('Connection failed');
109
+ });
110
+ },
111
+ },
127
112
  });
128
- if (!res.ok) {
129
- throw new Error(`HTTP ${res.status}`);
130
- }
131
- const json = yield res.json();
132
- const wsUrl = json === null || json === void 0 ? void 0 : json.rn_ws_url;
133
- if (!wsUrl || typeof wsUrl !== 'string') {
134
- throw new Error('No ws_url in response');
135
- }
136
- // Subscribe to room_created BEFORE connecting to avoid race
137
- this.wsClient.roomCreated$
138
- .pipe(take(1), takeUntil(this.destroy$))
139
- .subscribe((roomUrl) => __awaiter(this, void 0, void 0, function* () {
140
- try {
141
- yield this.onRoomCreated(roomUrl);
113
+ this.pcClient = pcClient;
114
+ // Bot audio arrives as a MediaStreamTrack — wire to a hidden <audio> element
115
+ pcClient.on(RTVIEvent.TrackStarted, (track, participant) => {
116
+ if (!(participant === null || participant === void 0 ? void 0 : participant.local) && track.kind === 'audio') {
117
+ this.ngZone.run(() => this.setupBotAudioTrack(track));
142
118
  }
143
- catch (err) {
144
- console.error('Daily join failed:', err);
145
- this.callStateSubject.next('ended');
146
- this.statusTextSubject.next('Connection failed');
147
- yield this.disconnect();
148
- throw err;
119
+ });
120
+ // Speaking state comes straight from RTVI events
121
+ pcClient.on(RTVIEvent.BotStartedSpeaking, () => this.ngZone.run(() => this.onBotStartedSpeaking()));
122
+ pcClient.on(RTVIEvent.BotStoppedSpeaking, () => this.ngZone.run(() => this.onBotStoppedSpeaking()));
123
+ pcClient.on(RTVIEvent.UserStartedSpeaking, () => this.ngZone.run(() => {
124
+ this.isUserSpeakingSubject.next(true);
125
+ this.callStateSubject.next('listening');
126
+ this.statusTextSubject.next('Listening...');
127
+ }));
128
+ pcClient.on(RTVIEvent.UserStoppedSpeaking, () => this.ngZone.run(() => {
129
+ this.isUserSpeakingSubject.next(false);
130
+ if (this.callStateSubject.value === 'listening') {
131
+ // Brief 'Processing...' while we wait for the bot to respond.
132
+ this.callStateSubject.next('connected');
133
+ this.statusTextSubject.next('Processing...');
149
134
  }
150
135
  }));
151
- // Forward transcripts from WebSocket
152
- this.subscriptions.add(this.wsClient.userTranscript$
153
- .pipe(takeUntil(this.destroy$))
154
- .subscribe((t) => this.userTranscriptSubject.next(t)));
155
- this.subscriptions.add(this.wsClient.botTranscript$
156
- .pipe(takeUntil(this.destroy$))
157
- .subscribe((t) => this.botTranscriptSubject.next(t)));
158
- // Connect signaling WebSocket (no audio over WS)
159
- this.wsClient.connect(wsUrl);
136
+ // Acquire mic (triggers browser permission prompt)
137
+ yield pcClient.initDevices();
138
+ // Build headers using the browser Headers API (required by pipecat's APIRequest type)
139
+ const requestHeaders = new Headers();
140
+ requestHeaders.append('Authorization', `Bearer ${accessToken}`);
141
+ requestHeaders.append('x-api-key', apiKey);
142
+ requestHeaders.append('hive-bot-id', botId);
143
+ requestHeaders.append('domain-authority', domainAuthority);
144
+ requestHeaders.append('eventUrl', eventUrl);
145
+ requestHeaders.append('eventId', eventId);
146
+ requestHeaders.append('eventToken', eventToken);
147
+ requestHeaders.append('ngrok-skip-browser-warning', 'true');
148
+ // POST to /ai/ask-voice-socket → receives { ws_url } → WebSocketTransport connects
149
+ yield pcClient.startBotAndConnect({
150
+ endpoint: `${baseUrl}/ai/ask-voice-socket`,
151
+ headers: requestHeaders,
152
+ requestData: {
153
+ bot_id: botId,
154
+ conversation_id: conversationId,
155
+ voice: 'alloy',
156
+ },
157
+ });
160
158
  }
161
159
  catch (error) {
162
- console.error('Error connecting voice agent:', error);
160
+ console.error('[HiveGpt Voice] connect failed', error);
163
161
  this.callStateSubject.next('ended');
164
- yield this.disconnect();
162
+ yield this.cleanupPipecatClient();
165
163
  this.statusTextSubject.next('Connection failed');
166
164
  throw error;
167
165
  }
168
166
  });
169
167
  }
170
- onRoomCreated(roomUrl) {
171
- return __awaiter(this, void 0, void 0, function* () {
172
- // Connect Daily.js for WebRTC audio
173
- yield this.dailyClient.connect(roomUrl);
174
- this.hasAutoUnmutedAfterFirstAudio = false;
175
- // Waveform: use local mic stream from Daily client
176
- this.dailyClient.localStream$
177
- .pipe(filter((s) => s != null), take(1))
178
- .subscribe((stream) => {
179
- this.audioAnalyzer.start(stream);
180
- });
181
- this.subscriptions.add(this.dailyClient.userSpeaking$.subscribe((s) => this.isUserSpeakingSubject.next(s)));
182
- this.subscriptions.add(combineLatest([
183
- this.dailyClient.speaking$,
184
- this.dailyClient.userSpeaking$,
185
- ]).subscribe(([bot, user]) => {
186
- const current = this.callStateSubject.value;
187
- if (current === 'connecting' && !bot) {
188
- return;
189
- }
190
- if (current === 'connecting' && bot) {
191
- this.callStartTime = Date.now();
192
- this.startDurationTimer();
193
- this.callStateSubject.next('talking');
194
- return;
195
- }
196
- if (user) {
197
- this.callStateSubject.next('listening');
198
- }
199
- else if (bot) {
200
- this.callStateSubject.next('talking');
201
- }
202
- else if (current === 'talking' || current === 'listening') {
203
- this.callStateSubject.next('connected');
204
- }
205
- }));
206
- this.subscriptions.add(this.dailyClient.micMuted$.subscribe((muted) => this.isMicMutedSubject.next(muted)));
207
- // One-time auto-unmute after first remote audio frame starts playing.
208
- // This keeps initial capture muted until bot audio is heard, then restores normal mic flow.
209
- this.subscriptions.add(this.dailyClient.firstRemoteAudioFrame$
210
- .pipe(filter((hasFirstFrame) => hasFirstFrame), take(1))
211
- .subscribe(() => {
212
- if (this.hasAutoUnmutedAfterFirstAudio)
213
- return;
214
- this.hasAutoUnmutedAfterFirstAudio = true;
215
- if (this.isMicMutedSubject.value) {
216
- this.dailyClient.setMuted(false);
217
- }
218
- }));
219
- this.statusTextSubject.next('Connecting...');
220
- });
168
+ onPipecatConnected() {
169
+ // Start the duration timer from the moment the session is live.
170
+ this.callStartTime = Date.now();
171
+ this.startDurationTimer();
172
+ this.callStateSubject.next('connected');
173
+ this.statusTextSubject.next('Connected');
174
+ this.isMicMutedSubject.next(false);
175
+ this.startLocalMicAnalyzer();
176
+ }
177
+ onPipecatDisconnected() {
178
+ this.stopDurationTimer();
179
+ this.callStartTime = 0;
180
+ this.audioAnalyzer.stop();
181
+ this.stopBotAudio();
182
+ this.callStateSubject.next('ended');
183
+ this.statusTextSubject.next('Call Ended');
184
+ }
185
+ onBotReady() {
186
+ var _a, _b, _c;
187
+ // Retry track wiring in case tracks weren't ready at onConnected.
188
+ this.startLocalMicAnalyzer();
189
+ const botTrack = (_c = (_b = (_a = this.pcClient) === null || _a === void 0 ? void 0 : _a.tracks()) === null || _b === void 0 ? void 0 : _b.bot) === null || _c === void 0 ? void 0 : _c.audio;
190
+ if (botTrack)
191
+ this.setupBotAudioTrack(botTrack);
192
+ // Bot is initialised — signal that we're now waiting for user input.
193
+ this.statusTextSubject.next('Listening...');
194
+ }
195
+ startLocalMicAnalyzer() {
196
+ var _a, _b, _c;
197
+ const localTrack = (_c = (_b = (_a = this.pcClient) === null || _a === void 0 ? void 0 : _a.tracks()) === null || _b === void 0 ? void 0 : _b.local) === null || _c === void 0 ? void 0 : _c.audio;
198
+ if (localTrack) {
199
+ this.audioAnalyzer.start(new MediaStream([localTrack]));
200
+ }
201
+ }
202
+ onBotStartedSpeaking() {
203
+ this.callStateSubject.next('talking');
204
+ this.statusTextSubject.next('Talking...');
205
+ // Mark user as no longer speaking when bot takes the turn.
206
+ this.isUserSpeakingSubject.next(false);
207
+ }
208
+ onBotStoppedSpeaking() {
209
+ if (this.callStateSubject.value === 'talking') {
210
+ this.callStateSubject.next('connected');
211
+ this.statusTextSubject.next('Listening...');
212
+ }
213
+ }
214
+ setupBotAudioTrack(track) {
215
+ var _a;
216
+ if (!this.botAudioElement) {
217
+ this.botAudioElement = new Audio();
218
+ this.botAudioElement.autoplay = true;
219
+ }
220
+ const existing = (_a = this.botAudioElement.srcObject) === null || _a === void 0 ? void 0 : _a.getAudioTracks()[0];
221
+ if ((existing === null || existing === void 0 ? void 0 : existing.id) === track.id)
222
+ return;
223
+ this.botAudioElement.srcObject = new MediaStream([track]);
224
+ this.botAudioElement.play().catch((err) => console.warn('[HiveGpt Voice] Bot audio play blocked', err));
225
+ }
226
+ stopBotAudio() {
227
+ var _a;
228
+ if (this.botAudioElement) {
229
+ try {
230
+ this.botAudioElement.pause();
231
+ (_a = this.botAudioElement.srcObject) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((t) => t.stop());
232
+ this.botAudioElement.srcObject = null;
233
+ }
234
+ catch (_b) {
235
+ // ignore
236
+ }
237
+ this.botAudioElement = null;
238
+ }
221
239
  }
222
240
  disconnect() {
223
241
  return __awaiter(this, void 0, void 0, function* () {
224
242
  this.stopDurationTimer();
243
+ this.callStartTime = 0;
225
244
  this.audioAnalyzer.stop();
226
- // Daily first, then WebSocket
227
- yield this.dailyClient.disconnect();
228
- this.wsClient.disconnect();
245
+ this.stopBotAudio();
246
+ yield this.cleanupPipecatClient();
229
247
  this.callStateSubject.next('ended');
230
248
  this.statusTextSubject.next('Call Ended');
231
- this.hasAutoUnmutedAfterFirstAudio = false;
249
+ });
250
+ }
251
+ cleanupPipecatClient() {
252
+ return __awaiter(this, void 0, void 0, function* () {
253
+ if (this.pcClient) {
254
+ try {
255
+ yield this.pcClient.disconnect();
256
+ }
257
+ catch (_a) {
258
+ // ignore
259
+ }
260
+ this.pcClient = null;
261
+ }
232
262
  });
233
263
  }
234
264
  toggleMic() {
235
- const current = this.isMicMutedSubject.value;
236
- this.dailyClient.setMuted(!current);
265
+ if (!this.pcClient)
266
+ return;
267
+ const nextMuted = !this.isMicMutedSubject.value;
268
+ this.pcClient.enableMic(!nextMuted);
269
+ this.isMicMutedSubject.next(nextMuted);
270
+ if (nextMuted)
271
+ this.isUserSpeakingSubject.next(false);
237
272
  }
238
273
  startDurationTimer() {
239
- const updateDuration = () => {
274
+ const tick = () => {
240
275
  if (this.callStartTime > 0) {
241
276
  const elapsed = Math.floor((Date.now() - this.callStartTime) / 1000);
242
- const minutes = Math.floor(elapsed / 60);
243
- const seconds = elapsed % 60;
244
- this.durationSubject.next(`${minutes}:${String(seconds).padStart(2, '0')}`);
277
+ const m = Math.floor(elapsed / 60);
278
+ const s = elapsed % 60;
279
+ this.durationSubject.next(`${m}:${String(s).padStart(2, '0')}`);
245
280
  }
246
281
  };
247
- updateDuration();
248
- this.durationInterval = setInterval(updateDuration, 1000);
282
+ tick();
283
+ this.durationInterval = setInterval(tick, 1000);
249
284
  }
250
285
  stopDurationTimer() {
251
286
  if (this.durationInterval) {
@@ -254,7 +289,7 @@ export class VoiceAgentService {
254
289
  }
255
290
  }
256
291
  }
257
- VoiceAgentService.ɵprov = i0.ɵɵdefineInjectable({ factory: function VoiceAgentService_Factory() { return new VoiceAgentService(i0.ɵɵinject(i1.AudioAnalyzerService), i0.ɵɵinject(i2.WebSocketVoiceClientService), i0.ɵɵinject(i3.DailyVoiceClientService), i0.ɵɵinject(i4.PlatformTokenRefreshService), i0.ɵɵinject(i0.PLATFORM_ID)); }, token: VoiceAgentService, providedIn: "root" });
292
+ VoiceAgentService.ɵprov = i0.ɵɵdefineInjectable({ factory: function VoiceAgentService_Factory() { return new VoiceAgentService(i0.ɵɵinject(i1.AudioAnalyzerService), i0.ɵɵinject(i2.PlatformTokenRefreshService), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.PLATFORM_ID)); }, token: VoiceAgentService, providedIn: "root" });
258
293
  VoiceAgentService.decorators = [
259
294
  { type: Injectable, args: [{
260
295
  providedIn: 'root',
@@ -262,9 +297,8 @@ VoiceAgentService.decorators = [
262
297
  ];
263
298
  VoiceAgentService.ctorParameters = () => [
264
299
  { type: AudioAnalyzerService },
265
- { type: WebSocketVoiceClientService },
266
- { type: DailyVoiceClientService },
267
300
  { type: PlatformTokenRefreshService },
301
+ { type: NgZone },
268
302
  { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
269
303
  ];
270
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9oaXR0aGFrdXIvaGl2ZS1ncHQvSGl2ZUFJLVBhY2thZ2VzL0FuZ3VsYXIvcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9zZXJ2aWNlcy92b2ljZS1hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBRWIsT0FBTyxFQUNQLFlBQVksR0FDYixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7QUFldkU7Ozs7Ozs7Ozs7R0FVRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUE0QjVCLFlBQ1UsYUFBbUMsRUFDbkMsUUFBcUMsRUFDckMsV0FBb0MsRUFDcEMsb0JBQWlEO0lBQ3pELDhGQUE4RjtJQUNqRSxVQUFrQjtRQUx2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbkMsYUFBUSxHQUFSLFFBQVEsQ0FBNkI7UUFDckMsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBQ3BDLHlCQUFvQixHQUFwQixvQkFB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QjtRQUN4QixNQUFNLGNBQWMsR0FBRyxHQUFHLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLE9BQU8sR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDdkIsR0FBRyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FDakQsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsY0FBYyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNILENBQUM7Ozs7WUFwU0YsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUE5QlEsb0JBQW9CO1lBQ3BCLDJCQUEyQjtZQUMzQix1QkFBdUI7WUFIdkIsMkJBQTJCO1lBa0VTLE1BQU0sdUJBQTlDLE1BQU0sU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BsYXRmb3JtLXRva2VuLXJlZnJlc2guc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpb0FuYWx5emVyU2VydmljZSB9IGZyb20gJy4vYXVkaW8tYW5hbHl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBXZWJTb2NrZXRWb2ljZUNsaWVudFNlcnZpY2UgfSBmcm9tICcuL3dlYnNvY2tldC12b2ljZS1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQgeyBEYWlseVZvaWNlQ2xpZW50U2VydmljZSB9IGZyb20gJy4vZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBDYWxsU3RhdGUgPVxuICB8ICdpZGxlJ1xuICB8ICdjb25uZWN0aW5nJ1xuICB8ICdjb25uZWN0ZWQnXG4gIHwgJ2xpc3RlbmluZydcbiAgfCAndGFsa2luZydcbiAgfCAnZW5kZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHREYXRhIHtcbiAgdGV4dDogc3RyaW5nO1xuICBmaW5hbDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBWb2ljZSBhZ2VudCBvcmNoZXN0cmF0b3IuIENvb3JkaW5hdGVzIFdlYlNvY2tldCAoc2lnbmFsaW5nKSBhbmQgRGFpbHkuanMgKFdlYlJUQyBhdWRpbykuXG4gKlxuICogQ1JJVElDQUw6IFRoaXMgc2VydmljZSBtdXN0IE5FVkVSIHVzZSBTb2NrZXQuSU8gb3Igbmd4LXNvY2tldC1pby4gVm9pY2UgZmxvdyB1c2VzIG9ubHk6XG4gKiAtIE5hdGl2ZSBXZWJTb2NrZXQgKFdlYlNvY2tldFZvaWNlQ2xpZW50U2VydmljZSkgZm9yIHNpZ25hbGluZyAocm9vbV9jcmVhdGVkLCB0cmFuc2NyaXB0cylcbiAqIC0gRGFpbHkuanMgKERhaWx5Vm9pY2VDbGllbnRTZXJ2aWNlKSBmb3IgV2ViUlRDIGF1ZGlvLiBBdWRpbyBkb2VzIE5PVCBmbG93IG92ZXIgV2ViU29ja2V0LlxuICpcbiAqIC0gTWFpbnRhaW5zIGNhbGxTdGF0ZSwgc3RhdHVzVGV4dCwgZHVyYXRpb24sIGlzTWljTXV0ZWQsIGlzVXNlclNwZWFraW5nLCBhdWRpb0xldmVsc1xuICogLSBVc2VzIFdlYlNvY2tldCBmb3Igcm9vbV9jcmVhdGVkIGFuZCB0cmFuc2NyaXB0cyBvbmx5IChubyBhdWRpbylcbiAqIC0gVXNlcyBEYWlseS5qcyBmb3IgYWxsIGF1ZGlvLCBtaWMsIGFuZCByZWFsLXRpbWUgc3BlYWtpbmcgZGV0ZWN0aW9uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgY2FsbFN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FsbFN0YXRlPignaWRsZScpO1xuICBwcml2YXRlIHN0YXR1c1RleHRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSBkdXJhdGlvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJzAwOjAwJyk7XG4gIHByaXZhdGUgaXNNaWNNdXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBpc1VzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBhdWRpb0xldmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcltdPihbXSk7XG4gIHByaXZhdGUgdXNlclRyYW5zY3JpcHRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VHJhbnNjcmlwdERhdGE+KCk7XG4gIHByaXZhdGUgYm90VHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBjYWxsU3RhcnRUaW1lID0gMDtcbiAgcHJpdmF0ZSBkdXJhdGlvbkludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIGhhc0F1dG9Vbm11dGVkQWZ0ZXJGaXJzdEF1ZGlvID0gZmFsc2U7XG5cbiAgY2FsbFN0YXRlJDogT2JzZXJ2YWJsZTxDYWxsU3RhdGU+ID0gdGhpcy5jYWxsU3RhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBzdGF0dXNUZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgZHVyYXRpb24kOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLmR1cmF0aW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgaXNNaWNNdXRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmlzTWljTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBpc1VzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPVxuICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBhdWRpb0xldmVscyQ6IE9ic2VydmFibGU8bnVtYmVyW10+ID0gdGhpcy5hdWRpb0xldmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHVzZXJUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxUcmFuc2NyaXB0RGF0YT4gPVxuICAgIHRoaXMudXNlclRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBib3RUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1ZGlvQW5hbHl6ZXI6IEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgd3NDbGllbnQ6IFdlYlNvY2tldFZvaWNlQ2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIGRhaWx5Q2xpZW50OiBEYWlseVZvaWNlQ2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtVG9rZW5SZWZyZXNoOiBQbGF0Zm9ybVRva2VuUmVmcmVzaFNlcnZpY2UsXG4gICAgLyoqIGBPYmplY3RgIG5vdCBgb2JqZWN0YCDigJQgbmdjIG1ldGFkYXRhIGNvbGxlY3Rpb24gcmVqZWN0cyB0aGUgYG9iamVjdGAgdHlwZSBpbiBESSBwYXJhbXMuICovXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsXG4gICkge1xuICAgIC8vIFdhdmVmb3JtIHZpc3VhbGl6YXRpb24gb25seSAtIGRvIE5PVCB1c2UgZm9yIHNwZWFraW5nIHN0YXRlXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuYXVkaW9BbmFseXplci5hdWRpb0xldmVscyQuc3Vic2NyaWJlKChsZXZlbHMpID0+XG4gICAgICAgIHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0Lm5leHQobGV2ZWxzKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgLyoqIFJlc2V0IHRvIGlkbGUgc3RhdGUgKGUuZy4gd2hlbiBtb2RhbCBvcGVucyBzbyB1c2VyIGNhbiBjbGljayBTdGFydCBDYWxsKS4gKi9cbiAgcmVzZXRUb0lkbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZSA9PT0gJ2lkbGUnKSByZXR1cm47XG4gICAgdGhpcy5zdG9wRHVyYXRpb25UaW1lcigpO1xuICAgIHRoaXMuYXVkaW9BbmFseXplci5zdG9wKCk7XG4gICAgdGhpcy53c0NsaWVudC5kaXNjb25uZWN0KCk7XG4gICAgLy8gRmlyZS1hbmQtZm9yZ2V0OiBEYWlseSBkaXNjb25uZWN0IGlzIGFzeW5jOyBjb25uZWN0KCkgd2lsbCBhd2FpdCBpZiBuZWVkZWRcbiAgICB2b2lkIHRoaXMuZGFpbHlDbGllbnQuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdpZGxlJyk7XG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCcnKTtcbiAgICB0aGlzLmR1cmF0aW9uU3ViamVjdC5uZXh0KCcwOjAwJyk7XG4gICAgdGhpcy5oYXNBdXRvVW5tdXRlZEFmdGVyRmlyc3RBdWRpbyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdChcbiAgICBhcGlVcmw6IHN0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIGJvdElkOiBzdHJpbmcsXG4gICAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcbiAgICBhcGlLZXk6IHN0cmluZyxcbiAgICBldmVudFRva2VuOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nLFxuICAgIGV2ZW50VXJsOiBzdHJpbmcsXG4gICAgZG9tYWluQXV0aG9yaXR5OiBzdHJpbmcsXG4gICAgdXNlcnNBcGlVcmw/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNhbGxTdGF0ZVN1YmplY3QudmFsdWUgIT09ICdpZGxlJykge1xuICAgICAgY29uc29sZS53YXJuKCdDYWxsIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGluZy4uLicpO1xuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgIC8vIEFsaWduIHdpdGggY2hhdCBkcmF3ZXIgdG9rZW4gaGFuZGxpbmc6IGFsd2F5cyBkZWxlZ2F0ZSB0b1xuICAgICAgLy8gUGxhdGZvcm1Ub2tlblJlZnJlc2hTZXJ2aWNlIHdoZW4gd2UgaGF2ZSBhIHVzZXJzQXBpVXJsLCBzbyBpdCBjYW5cbiAgICAgIC8vIGZhbGwgYmFjayB0byBzdG9yZWQgdG9rZW5zIGV2ZW4gaWYgdGhlIGNhbGxlciBwYXNzZWQgYW4gZW1wdHkgdG9rZW4uXG4gICAgICBpZiAodXNlcnNBcGlVcmwgJiYgaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVuc3VyZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVG9rZW5SZWZyZXNoXG4gICAgICAgICAgICAuZW5zdXJlVmFsaWRBY2Nlc3NUb2tlbih0b2tlbiwgdXNlcnNBcGlVcmwpXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgICAgICAgIGlmIChlbnN1cmVkPy5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgYWNjZXNzVG9rZW4gPSBlbnN1cmVkLmFjY2Vzc1Rva2VuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbSGl2ZUdwdCBWb2ljZV0gVG9rZW4gcmVmcmVzaCBiZWZvcmUgY29ubmVjdCBmYWlsZWQnLFxuICAgICAgICAgICAgZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhcGlVcmwucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICAgIGNvbnN0IHBvc3RVcmwgPSBgJHtiYXNlVXJsfS9haS9hc2stdm9pY2VgO1xuXG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcbiAgICAgICAgJ3gtYXBpLWtleSc6IGFwaUtleSxcbiAgICAgICAgJ2hpdmUtYm90LWlkJzogYm90SWQsXG4gICAgICAgICdkb21haW4tYXV0aG9yaXR5JzogZG9tYWluQXV0aG9yaXR5LFxuICAgICAgICBldmVudFVybCxcbiAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgZXZlbnRUb2tlbixcbiAgICAgICAgJ25ncm9rLXNraXAtYnJvd3Nlci13YXJuaW5nJzogJ3RydWUnLFxuICAgICAgfTtcblxuICAgICAgLy8gUE9TVCB0byBnZXQgd3NfdXJsIGZvciBzaWduYWxpbmdcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHBvc3RVcmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBib3RfaWQ6IGJvdElkLFxuICAgICAgICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgdm9pY2U6ICdhbGxveScsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3Qgd3NVcmwgPSBqc29uPy5ybl93c191cmw7XG4gICAgICBpZiAoIXdzVXJsIHx8IHR5cGVvZiB3c1VybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3c191cmwgaW4gcmVzcG9uc2UnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3Vic2NyaWJlIHRvIHJvb21fY3JlYXRlZCBCRUZPUkUgY29ubmVjdGluZyB0byBhdm9pZCByYWNlXG4gICAgICB0aGlzLndzQ2xpZW50LnJvb21DcmVhdGVkJFxuICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHJvb21VcmwpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5vblJvb21DcmVhdGVkKHJvb21VcmwpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRGFpbHkgam9pbiBmYWlsZWQ6JywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdlbmRlZCcpO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdDb25uZWN0aW9uIGZhaWxlZCcpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0cmFuc2NyaXB0cyBmcm9tIFdlYlNvY2tldFxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgdGhpcy53c0NsaWVudC51c2VyVHJhbnNjcmlwdCRcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgLnN1YnNjcmliZSgodCkgPT4gdGhpcy51c2VyVHJhbnNjcmlwdFN1YmplY3QubmV4dCh0KSksXG4gICAgICApO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgdGhpcy53c0NsaWVudC5ib3RUcmFuc2NyaXB0JFxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKCh0KSA9PiB0aGlzLmJvdFRyYW5zY3JpcHRTdWJqZWN0Lm5leHQodCkpLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29ubmVjdCBzaWduYWxpbmcgV2ViU29ja2V0IChubyBhdWRpbyBvdmVyIFdTKVxuICAgICAgdGhpcy53c0NsaWVudC5jb25uZWN0KHdzVXJsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY29ubmVjdGluZyB2b2ljZSBhZ2VudDonLCBlcnJvcik7XG4gICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdDb25uZWN0aW9uIGZhaWxlZCcpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvblJvb21DcmVhdGVkKHJvb21Vcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENvbm5lY3QgRGFpbHkuanMgZm9yIFdlYlJUQyBhdWRpb1xuICAgIGF3YWl0IHRoaXMuZGFpbHlDbGllbnQuY29ubmVjdChyb29tVXJsKTtcbiAgICB0aGlzLmhhc0F1dG9Vbm11dGVkQWZ0ZXJGaXJzdEF1ZGlvID0gZmFsc2U7XG5cbiAgICAvLyBXYXZlZm9ybTogdXNlIGxvY2FsIG1pYyBzdHJlYW0gZnJvbSBEYWlseSBjbGllbnRcbiAgICB0aGlzLmRhaWx5Q2xpZW50LmxvY2FsU3RyZWFtJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigocyk6IHMgaXMgTWVkaWFTdHJlYW0gPT4gcyAhPSBudWxsKSxcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHN0cmVhbSkgPT4ge1xuICAgICAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RhcnQoc3RyZWFtKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuZGFpbHlDbGllbnQudXNlclNwZWFraW5nJC5zdWJzY3JpYmUoKHMpID0+XG4gICAgICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQocyksXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmRhaWx5Q2xpZW50LnNwZWFraW5nJCxcbiAgICAgICAgdGhpcy5kYWlseUNsaWVudC51c2VyU3BlYWtpbmckLFxuICAgICAgXSkuc3Vic2NyaWJlKChbYm90LCB1c2VyXSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWxsU3RhdGVTdWJqZWN0LnZhbHVlO1xuICAgICAgICBpZiAoY3VycmVudCA9PT0gJ2Nvbm5lY3RpbmcnICYmICFib3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICdjb25uZWN0aW5nJyAmJiBib3QpIHtcbiAgICAgICAgICB0aGlzLmNhbGxTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHRoaXMuc3RhcnREdXJhdGlvblRpbWVyKCk7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ3RhbGtpbmcnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnbGlzdGVuaW5nJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoYm90KSB7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ3RhbGtpbmcnKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50ID09PSAndGFsa2luZycgfHwgY3VycmVudCA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5kYWlseUNsaWVudC5taWNNdXRlZCQuc3Vic2NyaWJlKChtdXRlZCkgPT5cbiAgICAgICAgdGhpcy5pc01pY011dGVkU3ViamVjdC5uZXh0KG11dGVkKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIC8vIE9uZS10aW1lIGF1dG8tdW5tdXRlIGFmdGVyIGZpcnN0IHJlbW90ZSBhdWRpbyBmcmFtZSBzdGFydHMgcGxheWluZy5cbiAgICAvLyBUaGlzIGtlZXBzIGluaXRpYWwgY2FwdHVyZSBtdXRlZCB1bnRpbCBib3QgYXVkaW8gaXMgaGVhcmQsIHRoZW4gcmVzdG9yZXMgbm9ybWFsIG1pYyBmbG93LlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmRhaWx5Q2xpZW50LmZpcnN0UmVtb3RlQXVkaW9GcmFtZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChoYXNGaXJzdEZyYW1lKSA9PiBoYXNGaXJzdEZyYW1lKSxcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0F1dG9Vbm11dGVkQWZ0ZXJGaXJzdEF1ZGlvKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5oYXNBdXRvVW5tdXRlZEFmdGVyRmlyc3RBdWRpbyA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMuaXNNaWNNdXRlZFN1YmplY3QudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGFpbHlDbGllbnQuc2V0TXV0ZWQoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGluZy4uLicpO1xuICB9XG5cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BEdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5hdWRpb0FuYWx5emVyLnN0b3AoKTtcblxuICAgIC8vIERhaWx5IGZpcnN0LCB0aGVuIFdlYlNvY2tldFxuICAgIGF3YWl0IHRoaXMuZGFpbHlDbGllbnQuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMud3NDbGllbnQuZGlzY29ubmVjdCgpO1xuXG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdDYWxsIEVuZGVkJyk7XG4gICAgdGhpcy5oYXNBdXRvVW5tdXRlZEFmdGVyRmlyc3RBdWRpbyA9IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlTWljKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmlzTWljTXV0ZWRTdWJqZWN0LnZhbHVlO1xuICAgIHRoaXMuZGFpbHlDbGllbnQuc2V0TXV0ZWQoIWN1cnJlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydER1cmF0aW9uVGltZXIoKTogdm9pZCB7XG4gICAgY29uc3QgdXBkYXRlRHVyYXRpb24gPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jYWxsU3RhcnRUaW1lID4gMCkge1xuICAgICAgICBjb25zdCBlbGFwc2VkID0gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIHRoaXMuY2FsbFN0YXJ0VGltZSkgLyAxMDAwKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvIDYwKTtcbiAgICAgICAgY29uc3Qgc2Vjb25kcyA9IGVsYXBzZWQgJSA2MDtcbiAgICAgICAgdGhpcy5kdXJhdGlvblN1YmplY3QubmV4dChcbiAgICAgICAgICBgJHttaW51dGVzfToke1N0cmluZyhzZWNvbmRzKS5wYWRTdGFydCgyLCAnMCcpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICB1cGRhdGVEdXJhdGlvbigpO1xuICAgIHRoaXMuZHVyYXRpb25JbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZUR1cmF0aW9uLCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcER1cmF0aW9uVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHVyYXRpb25JbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmR1cmF0aW9uSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5kdXJhdGlvbkludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9oaXR0aGFrdXIvaGl2ZS1ncHQvSGl2ZUFJLVBhY2thZ2VzL0FuZ3VsYXIvcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9zZXJ2aWNlcy92b2ljZS1hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQWEsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQWVoRTs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQTRCNUIsWUFDVSxhQUFtQyxFQUNuQyxvQkFBaUQsRUFDakQsTUFBYztJQUN0Qiw4RkFBOEY7SUFDakUsVUFBa0I7UUFKdkMsa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBQ25DLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBNkI7UUFDakQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUVPLGVBQVUsR0FBVixVQUFVLENBQVE7UUFoQ3pDLHFCQUFnQixHQUFHLElB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eEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxDQUFDLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxFQUFFLENBQUM7UUFDUCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQzs7OztZQTlURixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQTVCUSxvQkFBb0I7WUFEcEIsMkJBQTJCO1lBTFAsTUFBTTtZQW9FVSxNQUFNLHVCQUE5QyxNQUFNLFNBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3ksIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFBpcGVjYXRDbGllbnQsIFJUVklFdmVudCB9IGZyb20gJ0BwaXBlY2F0LWFpL2NsaWVudC1qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRUcmFuc3BvcnQgfSBmcm9tICdAcGlwZWNhdC1haS93ZWJzb2NrZXQtdHJhbnNwb3J0JztcbmltcG9ydCB7IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BsYXRmb3JtLXRva2VuLXJlZnJlc2guc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpb0FuYWx5emVyU2VydmljZSB9IGZyb20gJy4vYXVkaW8tYW5hbHl6ZXIuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIENhbGxTdGF0ZSA9XG4gIHwgJ2lkbGUnXG4gIHwgJ2Nvbm5lY3RpbmcnXG4gIHwgJ2Nvbm5lY3RlZCdcbiAgfCAnbGlzdGVuaW5nJ1xuICB8ICd0YWxraW5nJ1xuICB8ICdlbmRlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdERhdGEge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGZpbmFsOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFZvaWNlIGFnZW50IG9yY2hlc3RyYXRvciB1c2luZyB0aGUgb2ZmaWNpYWwgUGlwZWNhdENsaWVudCBTREsuXG4gKlxuICogQXVkaW8gZmxvdyAobWlycm9ycyB0aGUgUmVhY3QgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uKTpcbiAqICAtIExvY2FsIG1pYzogYWNxdWlyZWQgYnkgUGlwZWNhdENsaWVudC5pbml0RGV2aWNlcygpOyBsb2NhbCB0cmFjayBmZWQgdG9cbiAqICAgIEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlIGZvciB3YXZlZm9ybSB2aXN1YWxpc2F0aW9uLlxuICogIC0gQm90IGF1ZGlvOiByZWNlaXZlZCBhcyBhIE1lZGlhU3RyZWFtVHJhY2sgdmlhIFJUVklFdmVudC5UcmFja1N0YXJ0ZWQsXG4gKiAgICBwbGF5ZWQgdGhyb3VnaCBhIGhpZGRlbiA8YXVkaW8+IGVsZW1lbnQuXG4gKiAgLSBBbGwgYmluYXJ5IHByb3RvYnVmIGZyYW1pbmcgLyBSVFZJIHByb3RvY29sIGhhbmRsZWQgYnlcbiAqICAgIEBwaXBlY2F0LWFpL2NsaWVudC1qcyArIEBwaXBlY2F0LWFpL3dlYnNvY2tldC10cmFuc3BvcnQuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgY2FsbFN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FsbFN0YXRlPignaWRsZScpO1xuICBwcml2YXRlIHN0YXR1c1RleHRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSBkdXJhdGlvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJzAwOjAwJyk7XG4gIHByaXZhdGUgaXNNaWNNdXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBpc1VzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBhdWRpb0xldmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcltdPihbXSk7XG4gIHByaXZhdGUgdXNlclRyYW5zY3JpcHRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VHJhbnNjcmlwdERhdGE+KCk7XG4gIHByaXZhdGUgYm90VHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBjYWxsU3RhcnRUaW1lID0gMDtcbiAgcHJpdmF0ZSBkdXJhdGlvbkludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHBjQ2xpZW50OiBQaXBlY2F0Q2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm90QXVkaW9FbGVtZW50OiBIVE1MQXVkaW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjYWxsU3RhdGUkOiBPYnNlcnZhYmxlPENhbGxTdGF0ZT4gPSB0aGlzLmNhbGxTdGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHN0YXR1c1RleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLnN0YXR1c1RleHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBkdXJhdGlvbiQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuZHVyYXRpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBpc01pY011dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNNaWNNdXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGlzVXNlclNwZWFraW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBhdWRpb0xldmVscyQ6IE9ic2VydmFibGU8bnVtYmVyW10+ID0gdGhpcy5hdWRpb0xldmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHVzZXJUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxUcmFuc2NyaXB0RGF0YT4gPSB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgYm90VHJhbnNjcmlwdCQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuYm90VHJhbnNjcmlwdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhdWRpb0FuYWx5emVyOiBBdWRpb0FuYWx5emVyU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtVG9rZW5SZWZyZXNoOiBQbGF0Zm9ybVRva2VuUmVmcmVzaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAvKiogYE9iamVjdGAgbm90IGBvYmplY3RgIOKAlCBuZ2MgbWV0YWRhdGEgY29sbGVjdGlvbiByZWplY3RzIHRoZSBgb2JqZWN0YCB0eXBlIGluIERJIHBhcmFtcy4gKi9cbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuYXVkaW9BbmFseXplci5hdWRpb0xldmVscyQuc3Vic2NyaWJlKChsZXZlbHMpID0+XG4gICAgICAgIHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0Lm5leHQobGV2ZWxzKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHZvaWQgdGhpcy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICAvKiogUmVzZXQgdG8gaWRsZSAoZS5nLiB3aGVuIG1vZGFsIHJlLW9wZW5zIHNvIHVzZXIgY2FuIGNsaWNrIFN0YXJ0IENhbGwpLiAqL1xuICByZXNldFRvSWRsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWxsU3RhdGVTdWJqZWN0LnZhbHVlID09PSAnaWRsZScpIHJldHVybjtcbiAgICB2b2lkIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdpZGxlJyk7XG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCcnKTtcbiAgICB0aGlzLmR1cmF0aW9uU3ViamVjdC5uZXh0KCcwOjAwJyk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KFxuICAgIGFwaVVybDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgYm90SWQ6IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIGFwaUtleTogc3RyaW5nLFxuICAgIGV2ZW50VG9rZW46IHN0cmluZyxcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgZXZlbnRVcmw6IHN0cmluZyxcbiAgICBkb21haW5BdXRob3JpdHk6IHN0cmluZyxcbiAgICB1c2Vyc0FwaVVybD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZSAhPT0gJ2lkbGUnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBDYWxsIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGluZy4uLicpO1xuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgIGlmICh1c2Vyc0FwaVVybCAmJiBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1Ub2tlblJlZnJlc2hcbiAgICAgICAgICAgIC5lbnN1cmVWYWxpZEFjY2Vzc1Rva2VuKHRva2VuLCB1c2Vyc0FwaVVybClcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgICAgICAgaWYgKGVuc3VyZWQ/LmFjY2Vzc1Rva2VuKSBhY2Nlc3NUb2tlbiA9IGVuc3VyZWQuYWNjZXNzVG9rZW47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBUb2tlbiByZWZyZXNoIGZhaWxlZCcsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhcGlVcmwucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAgICAgY29uc3QgcGNDbGllbnQgPSBuZXcgUGlwZWNhdENsaWVudCh7XG4gICAgICAgIHRyYW5zcG9ydDogbmV3IFdlYlNvY2tldFRyYW5zcG9ydCgpLFxuICAgICAgICBlbmFibGVNaWM6IHRydWUsXG4gICAgICAgIGVuYWJsZUNhbTogZmFsc2UsXG4gICAgICAgIGNhbGxiYWNrczoge1xuICAgICAgICAgIG9uQ29ubmVjdGVkOiAoKSA9PiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vblBpcGVjYXRDb25uZWN0ZWQoKSksXG4gICAgICAgICAgb25EaXNjb25uZWN0ZWQ6ICgpID0+IHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uUGlwZWNhdERpc2Nvbm5lY3RlZCgpKSxcbiAgICAgICAgICBvbkJvdFJlYWR5OiAoKSA9PiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vbkJvdFJlYWR5KCkpLFxuICAgICAgICAgIG9uVXNlclRyYW5zY3JpcHQ6IChkYXRhKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMudXNlclRyYW5zY3JpcHRTdWJqZWN0Lm5leHQoeyB0ZXh0OiBkYXRhLnRleHQsIGZpbmFsOiAhIWRhdGEuZmluYWwgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIG9uQm90VHJhbnNjcmlwdDogKGRhdGEpID0+XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5uZXh0KGRhdGEudGV4dCkpLFxuICAgICAgICAgIG9uRXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tIaXZlR3B0IFZvaWNlXSBQaXBlY2F0Q2xpZW50IGVycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGlvbiBmYWlsZWQnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wY0NsaWVudCA9IHBjQ2xpZW50O1xuXG4gICAgICAvLyBCb3QgYXVkaW8gYXJyaXZlcyBhcyBhIE1lZGlhU3RyZWFtVHJhY2sg4oCUIHdpcmUgdG8gYSBoaWRkZW4gPGF1ZGlvPiBlbGVtZW50XG4gICAgICBwY0NsaWVudC5vbihcbiAgICAgICAgUlRWSUV2ZW50LlRyYWNrU3RhcnRlZCxcbiAgICAgICAgKHRyYWNrOiBNZWRpYVN0cmVhbVRyYWNrLCBwYXJ0aWNpcGFudD86IHsgbG9jYWw/OiBib29sZWFuIH0pID0+IHtcbiAgICAgICAgICBpZiAoIXBhcnRpY2lwYW50Py5sb2NhbCAmJiB0cmFjay5raW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5zZXR1cEJvdEF1ZGlvVHJhY2sodHJhY2spKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBTcGVha2luZyBzdGF0ZSBjb21lcyBzdHJhaWdodCBmcm9tIFJUVkkgZXZlbnRzXG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuQm90U3RhcnRlZFNwZWFraW5nLCAoKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vbkJvdFN0YXJ0ZWRTcGVha2luZygpKSxcbiAgICAgICk7XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuQm90U3RvcHBlZFNwZWFraW5nLCAoKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vbkJvdFN0b3BwZWRTcGVha2luZygpKSxcbiAgICAgICk7XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuVXNlclN0YXJ0ZWRTcGVha2luZywgKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdsaXN0ZW5pbmcnKTtcbiAgICAgICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0xpc3RlbmluZy4uLicpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuVXNlclN0b3BwZWRTcGVha2luZywgKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICBpZiAodGhpcy5jYWxsU3RhdGVTdWJqZWN0LnZhbHVlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgLy8gQnJpZWYgJ1Byb2Nlc3NpbmcuLi4nIHdoaWxlIHdlIHdhaXQgZm9yIHRoZSBib3QgdG8gcmVzcG9uZC5cbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnUHJvY2Vzc2luZy4uLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyBBY3F1aXJlIG1pYyAodHJpZ2dlcnMgYnJvd3NlciBwZXJtaXNzaW9uIHByb21wdClcbiAgICAgIGF3YWl0IHBjQ2xpZW50LmluaXREZXZpY2VzKCk7XG5cbiAgICAgIC8vIEJ1aWxkIGhlYWRlcnMgdXNpbmcgdGhlIGJyb3dzZXIgSGVhZGVycyBBUEkgKHJlcXVpcmVkIGJ5IHBpcGVjYXQncyBBUElSZXF1ZXN0IHR5cGUpXG4gICAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ3gtYXBpLWtleScsIGFwaUtleSk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ2hpdmUtYm90LWlkJywgYm90SWQpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdkb21haW4tYXV0aG9yaXR5JywgZG9tYWluQXV0aG9yaXR5KTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnZXZlbnRVcmwnLCBldmVudFVybCk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ2V2ZW50SWQnLCBldmVudElkKTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnZXZlbnRUb2tlbicsIGV2ZW50VG9rZW4pO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCduZ3Jvay1za2lwLWJyb3dzZXItd2FybmluZycsICd0cnVlJyk7XG5cbiAgICAgIC8vIFBPU1QgdG8gL2FpL2Fzay12b2ljZS1zb2NrZXQg4oaSIHJlY2VpdmVzIHsgd3NfdXJsIH0g4oaSIFdlYlNvY2tldFRyYW5zcG9ydCBjb25uZWN0c1xuICAgICAgYXdhaXQgcGNDbGllbnQuc3RhcnRCb3RBbmRDb25uZWN0KHtcbiAgICAgICAgZW5kcG9pbnQ6IGAke2Jhc2VVcmx9L2FpL2Fzay12b2ljZS1zb2NrZXRgLFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgcmVxdWVzdERhdGE6IHtcbiAgICAgICAgICBib3RfaWQ6IGJvdElkLFxuICAgICAgICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgdm9pY2U6ICdhbGxveScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW0hpdmVHcHQgVm9pY2VdIGNvbm5lY3QgZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBQaXBlY2F0Q2xpZW50KCk7XG4gICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3Rpb24gZmFpbGVkJyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUGlwZWNhdENvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB0aGUgZHVyYXRpb24gdGltZXIgZnJvbSB0aGUgbW9tZW50IHRoZSBzZXNzaW9uIGlzIGxpdmUuXG4gICAgdGhpcy5jYWxsU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLnN0YXJ0RHVyYXRpb25UaW1lcigpO1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdjb25uZWN0ZWQnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3RlZCcpO1xuICAgIHRoaXMuaXNNaWNNdXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFydExvY2FsTWljQW5hbHl6ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25QaXBlY2F0RGlzY29ubmVjdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcER1cmF0aW9uVGltZXIoKTtcbiAgICB0aGlzLmNhbGxTdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuYXVkaW9BbmFseXplci5zdG9wKCk7XG4gICAgdGhpcy5zdG9wQm90QXVkaW8oKTtcbiAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0NhbGwgRW5kZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Cb3RSZWFkeSgpOiB2b2lkIHtcbiAgICAvLyBSZXRyeSB0cmFjayB3aXJpbmcgaW4gY2FzZSB0cmFja3Mgd2VyZW4ndCByZWFkeSBhdCBvbkNvbm5lY3RlZC5cbiAgICB0aGlzLnN0YXJ0TG9jYWxNaWNBbmFseXplcigpO1xuICAgIGNvbnN0IGJvdFRyYWNrID0gKHRoaXMucGNDbGllbnQ/LnRyYWNrcygpIGFzIHsgYm90PzogeyBhdWRpbz86IE1lZGlhU3RyZWFtVHJhY2sgfSB9KVxuICAgICAgPy5ib3Q/LmF1ZGlvO1xuICAgIGlmIChib3RUcmFjaykgdGhpcy5zZXR1cEJvdEF1ZGlvVHJhY2soYm90VHJhY2spO1xuICAgIC8vIEJvdCBpcyBpbml0aWFsaXNlZCDigJQgc2lnbmFsIHRoYXQgd2UncmUgbm93IHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQuXG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdMaXN0ZW5pbmcuLi4nKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRMb2NhbE1pY0FuYWx5emVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGxvY2FsVHJhY2sgPSAodGhpcy5wY0NsaWVudD8udHJhY2tzKCkgYXMgeyBsb2NhbD86IHsgYXVkaW8/OiBNZWRpYVN0cmVhbVRyYWNrIH0gfSlcbiAgICAgID8ubG9jYWw/LmF1ZGlvO1xuICAgIGlmIChsb2NhbFRyYWNrKSB7XG4gICAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RhcnQobmV3IE1lZGlhU3RyZWFtKFtsb2NhbFRyYWNrXSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25Cb3RTdGFydGVkU3BlYWtpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ3RhbGtpbmcnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ1RhbGtpbmcuLi4nKTtcbiAgICAvLyBNYXJrIHVzZXIgYXMgbm8gbG9uZ2VyIHNwZWFraW5nIHdoZW4gYm90IHRha2VzIHRoZSB0dXJuLlxuICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkJvdFN0b3BwZWRTcGVha2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWxsU3RhdGVTdWJqZWN0LnZhbHVlID09PSAndGFsa2luZycpIHtcbiAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdjb25uZWN0ZWQnKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnTGlzdGVuaW5nLi4uJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEJvdEF1ZGlvVHJhY2sodHJhY2s6IE1lZGlhU3RyZWFtVHJhY2spOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYm90QXVkaW9FbGVtZW50KSB7XG4gICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudCA9IG5ldyBBdWRpbygpO1xuICAgICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQuYXV0b3BsYXkgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9ICh0aGlzLmJvdEF1ZGlvRWxlbWVudC5zcmNPYmplY3QgYXMgTWVkaWFTdHJlYW0gfCBudWxsKVxuICAgICAgPy5nZXRBdWRpb1RyYWNrcygpWzBdO1xuICAgIGlmIChleGlzdGluZz8uaWQgPT09IHRyYWNrLmlkKSByZXR1cm47XG5cbiAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSk7XG4gICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQucGxheSgpLmNhdGNoKChlcnIpID0+XG4gICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBCb3QgYXVkaW8gcGxheSBibG9ja2VkJywgZXJyKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQm90QXVkaW8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYm90QXVkaW9FbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAodGhpcy5ib3RBdWRpb0VsZW1lbnQuc3JjT2JqZWN0IGFzIE1lZGlhU3RyZWFtIHwgbnVsbClcbiAgICAgICAgICA/LmdldEF1ZGlvVHJhY2tzKClcbiAgICAgICAgICAuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuICAgICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9wRHVyYXRpb25UaW1lcigpO1xuICAgIHRoaXMuY2FsbFN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5hdWRpb0FuYWx5emVyLnN0b3AoKTtcbiAgICB0aGlzLnN0b3BCb3RBdWRpbygpO1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cFBpcGVjYXRDbGllbnQoKTtcbiAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0NhbGwgRW5kZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cFBpcGVjYXRDbGllbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucGNDbGllbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGNDbGllbnQuZGlzY29ubmVjdCgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgICAgdGhpcy5wY0NsaWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlTWljKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wY0NsaWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHRNdXRlZCA9ICF0aGlzLmlzTWljTXV0ZWRTdWJqZWN0LnZhbHVlO1xuICAgIHRoaXMucGNDbGllbnQuZW5hYmxlTWljKCFuZXh0TXV0ZWQpO1xuICAgIHRoaXMuaXNNaWNNdXRlZFN1YmplY3QubmV4dChuZXh0TXV0ZWQpO1xuICAgIGlmIChuZXh0TXV0ZWQpIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydER1cmF0aW9uVGltZXIoKTogdm9pZCB7XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbGxTdGFydFRpbWUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWQgPSBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gdGhpcy5jYWxsU3RhcnRUaW1lKSAvIDEwMDApO1xuICAgICAgICBjb25zdCBtID0gTWF0aC5mbG9vcihlbGFwc2VkIC8gNjApO1xuICAgICAgICBjb25zdCBzID0gZWxhcHNlZCAlIDYwO1xuICAgICAgICB0aGlzLmR1cmF0aW9uU3ViamVjdC5uZXh0KGAke219OiR7U3RyaW5nKHMpLnBhZFN0YXJ0KDIsICcwJyl9YCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aWNrKCk7XG4gICAgdGhpcy5kdXJhdGlvbkludGVydmFsID0gc2V0SW50ZXJ2YWwodGljaywgMTAwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BEdXJhdGlvblRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmR1cmF0aW9uSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5kdXJhdGlvbkludGVydmFsKTtcbiAgICAgIHRoaXMuZHVyYXRpb25JbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -3,11 +3,9 @@ import { CommonModule } from '@angular/common';
3
3
  import { VoiceAgentModalComponent } from './components/voice-agent-modal/voice-agent-modal.component';
4
4
  import { VoiceAgentService } from './services/voice-agent.service';
5
5
  import { AudioAnalyzerService } from './services/audio-analyzer.service';
6
- import { WebSocketVoiceClientService } from './services/websocket-voice-client.service';
7
- import { DailyVoiceClientService } from './services/daily-voice-client.service';
8
6
  /**
9
- * Voice agent module. Uses native WebSocket + Daily.js only.
10
- * Does NOT use Socket.IO or ngx-socket-io.
7
+ * Voice agent module. Uses @pipecat-ai/client-js + @pipecat-ai/websocket-transport
8
+ * (peer dependencies) for WebSocket transport, RTVI protocol, and audio.
11
9
  */
12
10
  export class VoiceAgentModule {
13
11
  }
@@ -22,12 +20,10 @@ VoiceAgentModule.decorators = [
22
20
  providers: [
23
21
  VoiceAgentService,
24
22
  AudioAnalyzerService,
25
- WebSocketVoiceClientService,
26
- DailyVoiceClientService
27
23
  ],
28
24
  exports: [
29
25
  VoiceAgentModalComponent
30
26
  ]
31
27
  },] }
32
28
  ];
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3ZvaWNlLWFnZW50Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUVoRjs7O0dBR0c7QUFrQkgsTUFBTSxPQUFPLGdCQUFnQjs7O1lBakI1QixRQUFRLFNBQUM7Z0JBQ1IsWUFBWSxFQUFFO29CQUNaLHdCQUF3QjtpQkFDekI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLFlBQVk7aUJBQ2I7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULGlCQUFpQjtvQkFDakIsb0JBQW9CO29CQUNwQiwyQkFBMkI7b0JBQzNCLHVCQUF1QjtpQkFDeEI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLHdCQUF3QjtpQkFDekI7YUFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVm9pY2VBZ2VudE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3ZvaWNlLWFnZW50LW1vZGFsL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWb2ljZUFnZW50U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdm9pY2UtYWdlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpb0FuYWx5emVyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYXVkaW8tYW5hbHl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBXZWJTb2NrZXRWb2ljZUNsaWVudFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3dlYnNvY2tldC12b2ljZS1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQgeyBEYWlseVZvaWNlQ2xpZW50U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UnO1xuXG4vKipcbiAqIFZvaWNlIGFnZW50IG1vZHVsZS4gVXNlcyBuYXRpdmUgV2ViU29ja2V0ICsgRGFpbHkuanMgb25seS5cbiAqIERvZXMgTk9UIHVzZSBTb2NrZXQuSU8gb3Igbmd4LXNvY2tldC1pby5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgVm9pY2VBZ2VudE1vZGFsQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGVcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgVm9pY2VBZ2VudFNlcnZpY2UsXG4gICAgQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlLFxuICAgIERhaWx5Vm9pY2VDbGllbnRTZXJ2aWNlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBWb2ljZUFnZW50TW9kYWxDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50TW9kdWxlIHsgfVxuIl19
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3ZvaWNlLWFnZW50Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV6RTs7O0dBR0c7QUFnQkgsTUFBTSxPQUFPLGdCQUFnQjs7O1lBZjVCLFFBQVEsU0FBQztnQkFDUixZQUFZLEVBQUU7b0JBQ1osd0JBQXdCO2lCQUN6QjtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsWUFBWTtpQkFDYjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsaUJBQWlCO29CQUNqQixvQkFBb0I7aUJBQ3JCO2dCQUNELE9BQU8sRUFBRTtvQkFDUCx3QkFBd0I7aUJBQ3pCO2FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFZvaWNlQWdlbnRNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy92b2ljZS1hZ2VudC1tb2RhbC92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2F1ZGlvLWFuYWx5emVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIFZvaWNlIGFnZW50IG1vZHVsZS4gVXNlcyBAcGlwZWNhdC1haS9jbGllbnQtanMgKyBAcGlwZWNhdC1haS93ZWJzb2NrZXQtdHJhbnNwb3J0XG4gKiAocGVlciBkZXBlbmRlbmNpZXMpIGZvciBXZWJTb2NrZXQgdHJhbnNwb3J0LCBSVFZJIHByb3RvY29sLCBhbmQgYXVkaW8uXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFZvaWNlQWdlbnRNb2RhbENvbXBvbmVudFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIFZvaWNlQWdlbnRTZXJ2aWNlLFxuICAgIEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgVm9pY2VBZ2VudE1vZGFsQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVm9pY2VBZ2VudE1vZHVsZSB7IH1cbiJdfQ==