@hivegpt/hiveai-angular 0.0.574 → 0.0.575
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/bundles/hivegpt-hiveai-angular.umd.js +525 -270
- package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
- package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +6 -6
- package/esm2015/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.js +85 -54
- package/esm2015/lib/components/voice-agent/services/daily-voice-client.service.js +153 -63
- package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +148 -84
- package/esm2015/lib/components/voice-agent/services/websocket-voice-client.service.js +79 -34
- package/fesm2015/hivegpt-hiveai-angular.js +464 -235
- package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
- package/hivegpt-hiveai-angular.metadata.json +1 -1
- package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts +7 -1
- package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts.map +1 -1
- package/lib/components/voice-agent/services/daily-voice-client.service.d.ts +37 -3
- package/lib/components/voice-agent/services/daily-voice-client.service.d.ts.map +1 -1
- package/lib/components/voice-agent/services/voice-agent.service.d.ts +19 -6
- package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
- package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts +5 -12
- package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -3,59 +3,87 @@ import { Injectable, NgZone } from '@angular/core';
|
|
|
3
3
|
import { BehaviorSubject } from 'rxjs';
|
|
4
4
|
import Daily from '@daily-co/daily-js';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Daily.js WebRTC client for voice agent audio.
|
|
8
|
+
* Responsibilities:
|
|
9
|
+
* - Create and manage Daily CallObject
|
|
10
|
+
* - Join Daily room using room_url
|
|
11
|
+
* - Handle mic capture + speaker playback
|
|
12
|
+
* - Bot speaking detection via AnalyserNode on remote track (instant)
|
|
13
|
+
* - User speaking detection via active-speaker-change
|
|
14
|
+
* - Expose speaking$ (bot speaking), userSpeaking$ (user speaking), micMuted$
|
|
15
|
+
* - Expose localStream$ for waveform visualization (AudioAnalyzerService)
|
|
16
|
+
*/
|
|
6
17
|
export class DailyVoiceClientService {
|
|
7
18
|
constructor(ngZone) {
|
|
8
19
|
this.ngZone = ngZone;
|
|
9
20
|
this.callObject = null;
|
|
10
21
|
this.localStream = null;
|
|
11
22
|
this.localSessionId = null;
|
|
23
|
+
/** Explicit playback of remote (bot) audio; required in some browsers. */
|
|
12
24
|
this.remoteAudioElement = null;
|
|
25
|
+
/** AnalyserNode-based remote audio monitor for instant bot speaking detection. */
|
|
13
26
|
this.remoteAudioContext = null;
|
|
14
|
-
|
|
27
|
+
/** Poll interval id (~100ms); named historically when RAF was used. */
|
|
28
|
+
this.remoteSpeakingPollId = null;
|
|
15
29
|
this.speakingSubject = new BehaviorSubject(false);
|
|
16
30
|
this.userSpeakingSubject = new BehaviorSubject(false);
|
|
17
|
-
this.micMutedSubject = new BehaviorSubject(
|
|
31
|
+
this.micMutedSubject = new BehaviorSubject(false);
|
|
18
32
|
this.localStreamSubject = new BehaviorSubject(null);
|
|
33
|
+
/** True when bot (remote participant) is the active speaker. */
|
|
19
34
|
this.speaking$ = this.speakingSubject.asObservable();
|
|
35
|
+
/** True when user (local participant) is the active speaker. */
|
|
20
36
|
this.userSpeaking$ = this.userSpeakingSubject.asObservable();
|
|
37
|
+
/** True when mic is muted. */
|
|
21
38
|
this.micMuted$ = this.micMutedSubject.asObservable();
|
|
39
|
+
/** Emits local mic stream for waveform visualization. */
|
|
22
40
|
this.localStream$ = this.localStreamSubject.asObservable();
|
|
23
41
|
}
|
|
24
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Connect to Daily room. Acquires mic first for waveform, then joins with audio.
|
|
44
|
+
* @param roomUrl Daily room URL (from room_created)
|
|
45
|
+
* @param token Optional meeting token
|
|
46
|
+
* @param existingStream Optional pre-acquired mic (avoids a second getUserMedia / extra prompts on some browsers)
|
|
47
|
+
*/
|
|
48
|
+
connect(roomUrl, token, existingStream) {
|
|
25
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26
50
|
if (this.callObject) {
|
|
27
51
|
yield this.disconnect();
|
|
28
52
|
}
|
|
29
53
|
try {
|
|
30
|
-
|
|
31
|
-
const stream =
|
|
54
|
+
const hasLiveTrack = !!(existingStream === null || existingStream === void 0 ? void 0 : existingStream.getAudioTracks().some((t) => t.readyState === 'live'));
|
|
55
|
+
const stream = hasLiveTrack
|
|
56
|
+
? existingStream
|
|
57
|
+
: yield navigator.mediaDevices.getUserMedia({ audio: true });
|
|
32
58
|
const audioTrack = stream.getAudioTracks()[0];
|
|
33
|
-
if (!audioTrack)
|
|
59
|
+
if (!audioTrack) {
|
|
60
|
+
stream.getTracks().forEach((t) => t.stop());
|
|
34
61
|
throw new Error('No audio track');
|
|
62
|
+
}
|
|
35
63
|
this.localStream = stream;
|
|
36
64
|
this.localStreamSubject.next(stream);
|
|
65
|
+
// Create audio-only call object
|
|
66
|
+
// videoSource: false = no camera, audioSource = our mic track
|
|
37
67
|
const callObject = Daily.createCallObject({
|
|
38
68
|
videoSource: false,
|
|
39
69
|
audioSource: audioTrack,
|
|
40
70
|
});
|
|
41
71
|
this.callObject = callObject;
|
|
42
72
|
this.setupEventHandlers(callObject);
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
this.micMutedSubject.next(true);
|
|
73
|
+
// Join room; Daily handles playback of remote (bot) audio automatically.
|
|
74
|
+
// Only pass token when it's a non-empty string (Daily rejects undefined/non-string).
|
|
46
75
|
const joinOptions = { url: roomUrl };
|
|
47
|
-
if (typeof token === 'string' && token.trim()) {
|
|
76
|
+
if (typeof token === 'string' && token.trim() !== '') {
|
|
48
77
|
joinOptions.token = token;
|
|
49
78
|
}
|
|
50
79
|
yield callObject.join(joinOptions);
|
|
51
|
-
console.log(`[VoiceDebug]
|
|
80
|
+
console.log(`[VoiceDebug] Room connected (Daily join complete) — ${new Date().toISOString()}`);
|
|
52
81
|
const participants = callObject.participants();
|
|
53
82
|
if (participants === null || participants === void 0 ? void 0 : participants.local) {
|
|
54
83
|
this.localSessionId = participants.local.session_id;
|
|
55
84
|
}
|
|
56
|
-
//
|
|
57
|
-
callObject.
|
|
58
|
-
this.micMutedSubject.next(true);
|
|
85
|
+
// Initial mute state: Daily starts with audio on
|
|
86
|
+
this.micMutedSubject.next(!callObject.localAudio());
|
|
59
87
|
}
|
|
60
88
|
catch (err) {
|
|
61
89
|
this.cleanup();
|
|
@@ -64,6 +92,8 @@ export class DailyVoiceClientService {
|
|
|
64
92
|
});
|
|
65
93
|
}
|
|
66
94
|
setupEventHandlers(call) {
|
|
95
|
+
// active-speaker-change: used ONLY for user speaking detection.
|
|
96
|
+
// Bot speaking is detected by our own AnalyserNode (instant, no debounce).
|
|
67
97
|
call.on('active-speaker-change', (event) => {
|
|
68
98
|
this.ngZone.run(() => {
|
|
69
99
|
var _a;
|
|
@@ -72,20 +102,23 @@ export class DailyVoiceClientService {
|
|
|
72
102
|
this.userSpeakingSubject.next(false);
|
|
73
103
|
return;
|
|
74
104
|
}
|
|
75
|
-
|
|
105
|
+
const isLocal = peerId === this.localSessionId;
|
|
106
|
+
this.userSpeakingSubject.next(isLocal);
|
|
76
107
|
});
|
|
77
108
|
});
|
|
109
|
+
// track-started / track-stopped: set up remote audio playback + AnalyserNode monitor.
|
|
78
110
|
call.on('track-started', (event) => {
|
|
79
111
|
this.ngZone.run(() => {
|
|
80
|
-
var _a, _b, _c, _d
|
|
112
|
+
var _a, _b, _c, _d;
|
|
81
113
|
const p = event === null || event === void 0 ? void 0 : event.participant;
|
|
82
114
|
const type = (_a = event === null || event === void 0 ? void 0 : event.type) !== null && _a !== void 0 ? _a : (_b = event === null || event === void 0 ? void 0 : event.track) === null || _b === void 0 ? void 0 : _b.kind;
|
|
115
|
+
const track = event === null || event === void 0 ? void 0 : event.track;
|
|
83
116
|
if (p && !p.local && type === 'audio') {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
this.playRemoteTrack(
|
|
88
|
-
this.monitorRemoteAudio(
|
|
117
|
+
console.log(`[VoiceDebug] Got audio track from backend (track-started) — readyState=${track === null || track === void 0 ? void 0 : track.readyState}, muted=${track === null || track === void 0 ? void 0 : track.muted} — ${new Date().toISOString()}`);
|
|
118
|
+
const audioTrack = track !== null && track !== void 0 ? track : (_d = (_c = p.tracks) === null || _c === void 0 ? void 0 : _c.audio) === null || _d === void 0 ? void 0 : _d.track;
|
|
119
|
+
if (audioTrack && typeof audioTrack === 'object') {
|
|
120
|
+
this.playRemoteTrack(audioTrack);
|
|
121
|
+
this.monitorRemoteAudio(audioTrack);
|
|
89
122
|
}
|
|
90
123
|
}
|
|
91
124
|
});
|
|
@@ -104,27 +137,57 @@ export class DailyVoiceClientService {
|
|
|
104
137
|
call.on('left-meeting', () => {
|
|
105
138
|
this.ngZone.run(() => this.cleanup());
|
|
106
139
|
});
|
|
107
|
-
call.on('error', (
|
|
108
|
-
|
|
109
|
-
|
|
140
|
+
call.on('error', (event) => {
|
|
141
|
+
this.ngZone.run(() => {
|
|
142
|
+
var _a;
|
|
143
|
+
console.error('DailyVoiceClient: Daily error', (_a = event === null || event === void 0 ? void 0 : event.errorMsg) !== null && _a !== void 0 ? _a : event);
|
|
144
|
+
this.cleanup();
|
|
145
|
+
});
|
|
110
146
|
});
|
|
111
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Play remote (bot) audio track via a dedicated audio element.
|
|
150
|
+
* Required in many browsers where Daily's internal playback does not output to speakers.
|
|
151
|
+
*/
|
|
112
152
|
playRemoteTrack(track) {
|
|
113
153
|
this.stopRemoteAudio();
|
|
114
154
|
try {
|
|
155
|
+
console.log(`[VoiceDebug] playRemoteTrack called — track.readyState=${track.readyState}, track.muted=${track.muted} — ${new Date().toISOString()}`);
|
|
156
|
+
track.onunmute = () => {
|
|
157
|
+
console.log(`[VoiceDebug] Remote audio track UNMUTED (audio data arriving) — ${new Date().toISOString()}`);
|
|
158
|
+
};
|
|
115
159
|
const stream = new MediaStream([track]);
|
|
116
160
|
const audio = new Audio();
|
|
117
161
|
audio.autoplay = true;
|
|
118
162
|
audio.srcObject = stream;
|
|
119
163
|
this.remoteAudioElement = audio;
|
|
120
|
-
audio.
|
|
121
|
-
console.
|
|
122
|
-
}
|
|
164
|
+
audio.onplaying = () => {
|
|
165
|
+
console.log(`[VoiceDebug] Audio element PLAYING (browser started playback) — ${new Date().toISOString()}`);
|
|
166
|
+
};
|
|
167
|
+
let firstTimeUpdate = true;
|
|
168
|
+
audio.ontimeupdate = () => {
|
|
169
|
+
if (firstTimeUpdate) {
|
|
170
|
+
firstTimeUpdate = false;
|
|
171
|
+
console.log(`[VoiceDebug] Audio element first TIMEUPDATE (actual audio output) — ${new Date().toISOString()}`);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
const p = audio.play();
|
|
175
|
+
if (p && typeof p.then === 'function') {
|
|
176
|
+
p.then(() => {
|
|
177
|
+
console.log(`[VoiceDebug] audio.play() resolved — ${new Date().toISOString()}`);
|
|
178
|
+
}).catch((err) => {
|
|
179
|
+
console.warn('DailyVoiceClient: remote audio play failed (may need user gesture)', err);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
123
182
|
}
|
|
124
183
|
catch (err) {
|
|
125
|
-
console.warn('
|
|
184
|
+
console.warn('DailyVoiceClient: failed to create remote audio element', err);
|
|
126
185
|
}
|
|
127
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Monitor remote audio track energy via AnalyserNode.
|
|
189
|
+
* Polls at ~10Hz; sufficient for speaking detection vs ~60fps RAF.
|
|
190
|
+
*/
|
|
128
191
|
monitorRemoteAudio(track) {
|
|
129
192
|
this.stopRemoteAudioMonitor();
|
|
130
193
|
try {
|
|
@@ -134,81 +197,108 @@ export class DailyVoiceClientService {
|
|
|
134
197
|
analyser.fftSize = 256;
|
|
135
198
|
source.connect(analyser);
|
|
136
199
|
this.remoteAudioContext = ctx;
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
|
|
200
|
+
const dataArray = new Uint8Array(analyser.frequencyBinCount);
|
|
201
|
+
const THRESHOLD = 5;
|
|
202
|
+
const SILENCE_MS = 1500;
|
|
203
|
+
const POLL_MS = 100;
|
|
204
|
+
let lastSoundTime = 0;
|
|
205
|
+
let isSpeaking = false;
|
|
206
|
+
this.remoteSpeakingPollId = setInterval(() => {
|
|
207
|
+
if (!this.remoteAudioContext) {
|
|
208
|
+
if (this.remoteSpeakingPollId) {
|
|
209
|
+
clearInterval(this.remoteSpeakingPollId);
|
|
210
|
+
this.remoteSpeakingPollId = null;
|
|
211
|
+
}
|
|
142
212
|
return;
|
|
143
|
-
|
|
144
|
-
|
|
213
|
+
}
|
|
214
|
+
analyser.getByteFrequencyData(dataArray);
|
|
215
|
+
let sum = 0;
|
|
216
|
+
for (let i = 0; i < dataArray.length; i++) {
|
|
217
|
+
sum += dataArray[i];
|
|
218
|
+
}
|
|
219
|
+
const avg = sum / dataArray.length;
|
|
145
220
|
const now = Date.now();
|
|
146
|
-
if (avg >
|
|
147
|
-
|
|
148
|
-
if (!
|
|
149
|
-
|
|
221
|
+
if (avg > THRESHOLD) {
|
|
222
|
+
lastSoundTime = now;
|
|
223
|
+
if (!isSpeaking) {
|
|
224
|
+
isSpeaking = true;
|
|
225
|
+
console.log(`[VoiceDebug] Bot audio energy detected (speaking=true) — avg=${avg.toFixed(1)} — ${new Date().toISOString()}`);
|
|
150
226
|
this.ngZone.run(() => {
|
|
151
227
|
this.userSpeakingSubject.next(false);
|
|
152
228
|
this.speakingSubject.next(true);
|
|
153
229
|
});
|
|
154
230
|
}
|
|
155
231
|
}
|
|
156
|
-
else if (
|
|
157
|
-
|
|
232
|
+
else if (isSpeaking && now - lastSoundTime > SILENCE_MS) {
|
|
233
|
+
isSpeaking = false;
|
|
234
|
+
console.log(`[VoiceDebug] Bot audio silence detected (speaking=false) — ${new Date().toISOString()}`);
|
|
158
235
|
this.ngZone.run(() => this.speakingSubject.next(false));
|
|
159
236
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
237
|
+
}, POLL_MS);
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
console.warn('DailyVoiceClient: failed to create remote audio monitor', err);
|
|
163
241
|
}
|
|
164
|
-
catch (_a) { }
|
|
165
242
|
}
|
|
166
243
|
stopRemoteAudioMonitor() {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
244
|
+
if (this.remoteSpeakingPollId !== null) {
|
|
245
|
+
clearInterval(this.remoteSpeakingPollId);
|
|
246
|
+
this.remoteSpeakingPollId = null;
|
|
247
|
+
}
|
|
248
|
+
if (this.remoteAudioContext) {
|
|
249
|
+
this.remoteAudioContext.close().catch(() => { });
|
|
250
|
+
this.remoteAudioContext = null;
|
|
171
251
|
}
|
|
172
|
-
(_a = this.remoteAudioContext) === null || _a === void 0 ? void 0 : _a.close().catch(() => { });
|
|
173
|
-
this.remoteAudioContext = null;
|
|
174
252
|
}
|
|
175
253
|
stopRemoteAudio() {
|
|
176
254
|
if (this.remoteAudioElement) {
|
|
177
|
-
|
|
178
|
-
|
|
255
|
+
try {
|
|
256
|
+
this.remoteAudioElement.pause();
|
|
257
|
+
this.remoteAudioElement.srcObject = null;
|
|
258
|
+
}
|
|
259
|
+
catch (_) { }
|
|
179
260
|
this.remoteAudioElement = null;
|
|
180
261
|
}
|
|
181
262
|
}
|
|
263
|
+
/** Set mic muted state. */
|
|
182
264
|
setMuted(muted) {
|
|
183
265
|
if (!this.callObject)
|
|
184
266
|
return;
|
|
185
267
|
this.callObject.setLocalAudio(!muted);
|
|
186
268
|
this.micMutedSubject.next(muted);
|
|
187
|
-
console.log(`[VoiceDebug] Mic ${muted ? 'MUTED' : 'UNMUTED'}`);
|
|
188
269
|
}
|
|
270
|
+
/** Disconnect and cleanup. */
|
|
189
271
|
disconnect() {
|
|
190
272
|
return __awaiter(this, void 0, void 0, function* () {
|
|
191
|
-
if (!this.callObject)
|
|
192
|
-
|
|
273
|
+
if (!this.callObject) {
|
|
274
|
+
this.cleanup();
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
193
277
|
try {
|
|
194
278
|
yield this.callObject.leave();
|
|
195
279
|
}
|
|
196
|
-
catch (
|
|
280
|
+
catch (e) {
|
|
281
|
+
// ignore
|
|
282
|
+
}
|
|
197
283
|
this.cleanup();
|
|
198
284
|
});
|
|
199
285
|
}
|
|
200
286
|
cleanup() {
|
|
201
|
-
var _a, _b;
|
|
202
287
|
this.stopRemoteAudioMonitor();
|
|
203
288
|
this.stopRemoteAudio();
|
|
204
|
-
(
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
289
|
+
if (this.callObject) {
|
|
290
|
+
this.callObject.destroy().catch(() => { });
|
|
291
|
+
this.callObject = null;
|
|
292
|
+
}
|
|
293
|
+
if (this.localStream) {
|
|
294
|
+
this.localStream.getTracks().forEach((t) => t.stop());
|
|
295
|
+
this.localStream = null;
|
|
296
|
+
}
|
|
208
297
|
this.localSessionId = null;
|
|
209
298
|
this.speakingSubject.next(false);
|
|
210
299
|
this.userSpeakingSubject.next(false);
|
|
211
300
|
this.localStreamSubject.next(null);
|
|
301
|
+
// Keep last micMuted state; will reset on next connect
|
|
212
302
|
}
|
|
213
303
|
}
|
|
214
304
|
DailyVoiceClientService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DailyVoiceClientService_Factory() { return new DailyVoiceClientService(i0.ɵɵinject(i0.NgZone)); }, token: DailyVoiceClientService, providedIn: "root" });
|
|
@@ -220,4 +310,4 @@ DailyVoiceClientService.decorators = [
|
|
|
220
310
|
DailyVoiceClientService.ctorParameters = () => [
|
|
221
311
|
{ type: NgZone }
|
|
222
312
|
];
|
|
223
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvc2VydmljZXMvZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7O0FBTXZDLE1BQU0sT0FBTyx1QkFBdUI7SUFtQmxDLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBbEIxQixlQUFVLEdBQXFCLElBQUksQ0FBQztRQUNwQyxnQkFBVyxHQUF1QixJQUFJLENBQUM7UUFDdkMsbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBQ3JDLHVCQUFrQixHQUE0QixJQUFJLENBQUM7UUFFbkQsdUJBQWtCLEdBQXdCLElBQUksQ0FBQztRQUMvQyxzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBRXhDLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsd0JBQW1CLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDMUQsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtRQUN6RSx1QkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFFM0UsY0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEQsa0JBQWEsR0FBRyxJQUFJ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Q0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixNQUFBLElBQUksQ0FBQyxVQUFVLDBDQUFFLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdkIsTUFBQSxJQUFJLENBQUMsV0FBVywwQ0FBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUUzQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQzs7OztZQWhQRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQVBvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBEYWlseSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuaW1wb3J0IHR5cGUgeyBEYWlseUNhbGwsIERhaWx5UGFydGljaXBhbnQgfSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRGFpbHlWb2ljZUNsaWVudFNlcnZpY2Uge1xuICBwcml2YXRlIGNhbGxPYmplY3Q6IERhaWx5Q2FsbCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvY2FsU3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvY2FsU2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZW1vdGVBdWRpb0VsZW1lbnQ6IEhUTUxBdWRpb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbW90ZUF1ZGlvQ29udGV4dDogQXVkaW9Db250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVtb3RlU3BlYWtpbmdSQUY6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc3BlYWtpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgdXNlclNwZWFraW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIG1pY011dGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7IC8vIPCflLQgZGVmYXVsdCBtdXRlZFxuICBwcml2YXRlIGxvY2FsU3RyZWFtU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVkaWFTdHJlYW0gfCBudWxsPihudWxsKTtcblxuICBzcGVha2luZyQgPSB0aGlzLnNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgdXNlclNwZWFraW5nJCA9IHRoaXMudXNlclNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgbWljTXV0ZWQkID0gdGhpcy5taWNNdXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGxvY2FsU3RyZWFtJCA9IHRoaXMubG9jYWxTdHJlYW1TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgYXN5bmMgY29ubmVjdChyb29tVXJsOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2FsbE9iamVjdCkge1xuICAgICAgYXdhaXQgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIPCfjqQgR2V0IG1pYyAoa2VwdCBmb3Igd2F2ZWZvcm0pXG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgY29uc3QgYXVkaW9UcmFjayA9IHN0cmVhbS5nZXRBdWRpb1RyYWNrcygpWzBdO1xuICAgICAgaWYgKCFhdWRpb1RyYWNrKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGF1ZGlvIHRyYWNrJyk7XG5cbiAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBzdHJlYW07XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtU3ViamVjdC5uZXh0KHN0cmVhbSk7XG5cbiAgICAgIGNvbnN0IGNhbGxPYmplY3QgPSBEYWlseS5jcmVhdGVDYWxsT2JqZWN0KHtcbiAgICAgICAgdmlkZW9Tb3VyY2U6IGZhbHNlLFxuICAgICAgICBhdWRpb1NvdXJjZTogYXVkaW9UcmFjayxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNhbGxPYmplY3QgPSBjYWxsT2JqZWN0O1xuICAgICAgdGhpcy5zZXR1cEV2ZW50SGFuZGxlcnMoY2FsbE9iamVjdCk7XG5cbiAgICAgIC8vIPCflLQgRW5zdXJlIG1pYyBpcyBPRkYgYmVmb3JlIGpvaW5cbiAgICAgIGNhbGxPYmplY3Quc2V0TG9jYWxBdWRpbyhmYWxzZSk7XG4gICAgICB0aGlzLm1pY011dGVkU3ViamVjdC5uZXh0KHRydWUpO1xuXG4gICAgICBjb25zdCBqb2luT3B0aW9uczogeyB1cmw6IHN0cmluZzsgdG9rZW4/OiBzdHJpbmcgfSA9IHsgdXJsOiByb29tVXJsIH07XG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJyAmJiB0b2tlbi50cmltKCkpIHtcbiAgICAgICAgam9pbk9wdGlvbnMudG9rZW4gPSB0b2tlbjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2FsbE9iamVjdC5qb2luKGpvaW5PcHRpb25zKTtcblxuICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBKb2luZWQgcm9vbSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG5cbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IGNhbGxPYmplY3QucGFydGljaXBhbnRzKCk7XG4gICAgICBpZiAocGFydGljaXBhbnRzPy5sb2NhbCkge1xuICAgICAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gcGFydGljaXBhbnRzLmxvY2FsLnNlc3Npb25faWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIPCflLQgRm9yY2Ugc3luYyBhZ2FpbiAoRGFpbHkgc29tZXRpbWVzIG92ZXJyaWRlcylcbiAgICAgIGNhbGxPYmplY3Quc2V0TG9jYWxBdWRpbyhmYWxzZSk7XG4gICAgICB0aGlzLm1pY011dGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50SGFuZGxlcnMoY2FsbDogRGFpbHlDYWxsKTogdm9pZCB7XG4gICAgY2FsbC5vbignYWN0aXZlLXNwZWFrZXItY2hhbmdlJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlZXJJZCA9IGV2ZW50Py5hY3RpdmVTcGVha2VyPy5wZWVySWQ7XG4gICAgICAgIGlmICghcGVlcklkIHx8ICF0aGlzLmxvY2FsU2Vzc2lvbklkKSB7XG4gICAgICAgICAgdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChwZWVySWQgPT09IHRoaXMubG9jYWxTZXNzaW9uSWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjYWxsLm9uKCd0cmFjay1zdGFydGVkJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBldmVudD8ucGFydGljaXBhbnQ7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBldmVudD8udHlwZSA/PyBldmVudD8udHJhY2s/LmtpbmQ7XG5cbiAgICAgICAgaWYgKHAgJiYgIXAubG9jYWwgJiYgdHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgIGNvbnN0IHRyYWNrID0gZXZlbnQudHJhY2sgPz8gcD8udHJhY2tzPy5hdWRpbz8udHJhY2s7XG5cbiAgICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbVm9pY2VEZWJ1Z10gUmVtb3RlIGF1ZGlvIHRyYWNrIHJlY2VpdmVkJyk7XG4gICAgICAgICAgICB0aGlzLnBsYXlSZW1vdGVUcmFjayh0cmFjayk7XG4gICAgICAgICAgICB0aGlzLm1vbml0b3JSZW1vdGVBdWRpbyh0cmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNhbGwub24oJ3RyYWNrLXN0b3BwZWQnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgcCA9IGV2ZW50Py5wYXJ0aWNpcGFudDtcbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50Py50eXBlID8/IGV2ZW50Py50cmFjaz8ua2luZDtcblxuICAgICAgICBpZiAocCAmJiAhcC5sb2NhbCAmJiB0eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgdGhpcy5zdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk7XG4gICAgICAgICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjYWxsLm9uKCdsZWZ0LW1lZXRpbmcnLCAoKSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5jbGVhbnVwKCkpO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbignZXJyb3InLCAoZTogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEYWlseSBlcnJvcjonLCBlKTtcbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwbGF5UmVtb3RlVHJhY2sodHJhY2s6IE1lZGlhU3RyZWFtVHJhY2spOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZW1vdGVBdWRpbygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBNZWRpYVN0cmVhbShbdHJhY2tdKTtcbiAgICAgIGNvbnN0IGF1ZGlvID0gbmV3IEF1ZGlvKCk7XG4gICAgICBhdWRpby5hdXRvcGxheSA9IHRydWU7XG4gICAgICBhdWRpby5zcmNPYmplY3QgPSBzdHJlYW07XG5cbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gYXVkaW87XG5cbiAgICAgIGF1ZGlvLnBsYXkoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignQXV0b3BsYXkgYmxvY2tlZCcpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0F1ZGlvIHBsYXliYWNrIGVycm9yJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vbml0b3JSZW1vdGVBdWRpbyh0cmFjazogTWVkaWFTdHJlYW1UcmFjayk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvTW9uaXRvcigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGN0eC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSkpO1xuICAgICAgY29uc3QgYW5hbHlzZXIgPSBjdHguY3JlYXRlQW5hbHlzZXIoKTtcblxuICAgICAgYW5hbHlzZXIuZmZ0U2l6ZSA9IDI1NjtcbiAgICAgIHNvdXJjZS5jb25uZWN0KGFuYWx5c2VyKTtcblxuICAgICAgdGhpcy5yZW1vdGVBdWRpb0NvbnRleHQgPSBjdHg7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCk7XG5cbiAgICAgIGxldCBzcGVha2luZyA9IGZhbHNlO1xuICAgICAgbGV0IGxhc3RTb3VuZCA9IDA7XG5cbiAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5yZW1vdGVBdWRpb0NvbnRleHQpIHJldHVybjtcblxuICAgICAgICBhbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YShkYXRhKTtcbiAgICAgICAgY29uc3QgYXZnID0gZGF0YS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIGRhdGEubGVuZ3RoO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGlmIChhdmcgPiA1KSB7XG4gICAgICAgICAgbGFzdFNvdW5kID0gbm93O1xuICAgICAgICAgIGlmICghc3BlYWtpbmcpIHtcbiAgICAgICAgICAgIHNwZWFraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzcGVha2luZyAmJiBub3cgLSBsYXN0U291bmQgPiAxNTAwKSB7XG4gICAgICAgICAgc3BlYWtpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdGVTcGVha2luZ1JBRiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMucmVtb3RlU3BlYWtpbmdSQUYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbW90ZVNwZWFraW5nUkFGKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJlbW90ZVNwZWFraW5nUkFGKTtcbiAgICAgIHRoaXMucmVtb3RlU3BlYWtpbmdSQUYgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dD8uY2xvc2UoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgdGhpcy5yZW1vdGVBdWRpb0NvbnRleHQgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVtb3RlQXVkaW9FbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0VsZW1lbnQuc3JjT2JqZWN0ID0gbnVsbDtcbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzZXRNdXRlZChtdXRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYWxsT2JqZWN0KSByZXR1cm47XG5cbiAgICB0aGlzLmNhbGxPYmplY3Quc2V0TG9jYWxBdWRpbyghbXV0ZWQpO1xuICAgIHRoaXMubWljTXV0ZWRTdWJqZWN0Lm5leHQobXV0ZWQpO1xuXG4gICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBNaWMgJHttdXRlZCA/ICdNVVRFRCcgOiAnVU5NVVRFRCd9YCk7XG4gIH1cblxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jYWxsT2JqZWN0KSByZXR1cm4gdGhpcy5jbGVhbnVwKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsT2JqZWN0LmxlYXZlKCk7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcblxuICAgIHRoaXMuY2FsbE9iamVjdD8uZGVzdHJveSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aGlzLmNhbGxPYmplY3QgPSBudWxsO1xuXG4gICAgdGhpcy5sb2NhbFN0cmVhbT8uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuICAgIHRoaXMubG9jYWxTdHJlYW0gPSBudWxsO1xuXG4gICAgdGhpcy5sb2NhbFNlc3Npb25JZCA9IG51bGw7XG5cbiAgICB0aGlzLnNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QubmV4dChudWxsKTtcbiAgfVxufVxuIl19
|
|
313
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvc2VydmljZXMvZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7O0FBR3ZDOzs7Ozs7Ozs7O0dBVUc7QUFJSCxNQUFNLE9BQU8sdUJBQXVCO0lBOEJsQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTdCMUIsZUFBVSxHQUFxQixJQUFJLENBQUM7UUFDcEMsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBQ3ZDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QywwRUFBMEU7UUFDbEUsdUJBQWtCLEdBQTRCLElBQUksQ0FBQztRQUUzRCxrRkFBa0Y7UUFDMUUsdUJBQWtCLEdBQXdCLElBQUksQ0FBQztRQUN2RCx1RUFBdUU7UUFDL0QseUJBQW9CLEdBQTBDLElBQUksQ0FBQztRQUVuRSxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3RELHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzFELG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO1FBRTNFLGdFQUFnRTtRQUNoRSxjQUFTLEdB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QyxDQUFDO1FBQ25DLHVEQUF1RDtJQUN6RCxDQUFDOzs7O1lBMVRGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBbEJvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBEYWlseSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuaW1wb3J0IHR5cGUgeyBEYWlseUNhbGwsIERhaWx5UGFydGljaXBhbnQgfSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuXG4vKipcbiAqIERhaWx5LmpzIFdlYlJUQyBjbGllbnQgZm9yIHZvaWNlIGFnZW50IGF1ZGlvLlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGFuZCBtYW5hZ2UgRGFpbHkgQ2FsbE9iamVjdFxuICogLSBKb2luIERhaWx5IHJvb20gdXNpbmcgcm9vbV91cmxcbiAqIC0gSGFuZGxlIG1pYyBjYXB0dXJlICsgc3BlYWtlciBwbGF5YmFja1xuICogLSBCb3Qgc3BlYWtpbmcgZGV0ZWN0aW9uIHZpYSBBbmFseXNlck5vZGUgb24gcmVtb3RlIHRyYWNrIChpbnN0YW50KVxuICogLSBVc2VyIHNwZWFraW5nIGRldGVjdGlvbiB2aWEgYWN0aXZlLXNwZWFrZXItY2hhbmdlXG4gKiAtIEV4cG9zZSBzcGVha2luZyQgKGJvdCBzcGVha2luZyksIHVzZXJTcGVha2luZyQgKHVzZXIgc3BlYWtpbmcpLCBtaWNNdXRlZCRcbiAqIC0gRXhwb3NlIGxvY2FsU3RyZWFtJCBmb3Igd2F2ZWZvcm0gdmlzdWFsaXphdGlvbiAoQXVkaW9BbmFseXplclNlcnZpY2UpXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBEYWlseVZvaWNlQ2xpZW50U2VydmljZSB7XG4gIHByaXZhdGUgY2FsbE9iamVjdDogRGFpbHlDYWxsIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9jYWxTdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9jYWxTZXNzaW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogRXhwbGljaXQgcGxheWJhY2sgb2YgcmVtb3RlIChib3QpIGF1ZGlvOyByZXF1aXJlZCBpbiBzb21lIGJyb3dzZXJzLiAqL1xuICBwcml2YXRlIHJlbW90ZUF1ZGlvRWxlbWVudDogSFRNTEF1ZGlvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBBbmFseXNlck5vZGUtYmFzZWQgcmVtb3RlIGF1ZGlvIG1vbml0b3IgZm9yIGluc3RhbnQgYm90IHNwZWFraW5nIGRldGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSByZW1vdGVBdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCB8IG51bGwgPSBudWxsO1xuICAvKiogUG9sbCBpbnRlcnZhbCBpZCAofjEwMG1zKTsgbmFtZWQgaGlzdG9yaWNhbGx5IHdoZW4gUkFGIHdhcyB1c2VkLiAqL1xuICBwcml2YXRlIHJlbW90ZVNwZWFraW5nUG9sbElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHNwZWFraW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHVzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBtaWNNdXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBsb2NhbFN0cmVhbVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhU3RyZWFtIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFRydWUgd2hlbiBib3QgKHJlbW90ZSBwYXJ0aWNpcGFudCkgaXMgdGhlIGFjdGl2ZSBzcGVha2VyLiAqL1xuICBzcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogVHJ1ZSB3aGVuIHVzZXIgKGxvY2FsIHBhcnRpY2lwYW50KSBpcyB0aGUgYWN0aXZlIHNwZWFrZXIuICovXG4gIHVzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFRydWUgd2hlbiBtaWMgaXMgbXV0ZWQuICovXG4gIG1pY011dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMubWljTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBFbWl0cyBsb2NhbCBtaWMgc3RyZWFtIGZvciB3YXZlZm9ybSB2aXN1YWxpemF0aW9uLiAqL1xuICBsb2NhbFN0cmVhbSQ6IE9ic2VydmFibGU8TWVkaWFTdHJlYW0gfCBudWxsPiA9XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBEYWlseSByb29tLiBBY3F1aXJlcyBtaWMgZmlyc3QgZm9yIHdhdmVmb3JtLCB0aGVuIGpvaW5zIHdpdGggYXVkaW8uXG4gICAqIEBwYXJhbSByb29tVXJsIERhaWx5IHJvb20gVVJMIChmcm9tIHJvb21fY3JlYXRlZClcbiAgICogQHBhcmFtIHRva2VuIE9wdGlvbmFsIG1lZXRpbmcgdG9rZW5cbiAgICogQHBhcmFtIGV4aXN0aW5nU3RyZWFtIE9wdGlvbmFsIHByZS1hY3F1aXJlZCBtaWMgKGF2b2lkcyBhIHNlY29uZCBnZXRVc2VyTWVkaWEgLyBleHRyYSBwcm9tcHRzIG9uIHNvbWUgYnJvd3NlcnMpXG4gICAqL1xuICBhc3luYyBjb25uZWN0KFxuICAgIHJvb21Vcmw6IHN0cmluZyxcbiAgICB0b2tlbj86IHN0cmluZyxcbiAgICBleGlzdGluZ1N0cmVhbT86IE1lZGlhU3RyZWFtLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFzTGl2ZVRyYWNrID1cbiAgICAgICAgISFleGlzdGluZ1N0cmVhbT8uZ2V0QXVkaW9UcmFja3MoKS5zb21lKCh0KSA9PiB0LnJlYWR5U3RhdGUgPT09ICdsaXZlJyk7XG4gICAgICBjb25zdCBzdHJlYW0gPSBoYXNMaXZlVHJhY2tcbiAgICAgICAgPyBleGlzdGluZ1N0cmVhbSFcbiAgICAgICAgOiBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgY29uc3QgYXVkaW9UcmFjayA9IHN0cmVhbS5nZXRBdWRpb1RyYWNrcygpWzBdO1xuICAgICAgaWYgKCFhdWRpb1RyYWNrKSB7XG4gICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYXVkaW8gdHJhY2snKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2NhbFN0cmVhbSA9IHN0cmVhbTtcbiAgICAgIHRoaXMubG9jYWxTdHJlYW1TdWJqZWN0Lm5leHQoc3RyZWFtKTtcblxuICAgICAgLy8gQ3JlYXRlIGF1ZGlvLW9ubHkgY2FsbCBvYmplY3RcbiAgICAgIC8vIHZpZGVvU291cmNlOiBmYWxzZSA9IG5vIGNhbWVyYSwgYXVkaW9Tb3VyY2UgPSBvdXIgbWljIHRyYWNrXG4gICAgICBjb25zdCBjYWxsT2JqZWN0ID0gRGFpbHkuY3JlYXRlQ2FsbE9iamVjdCh7XG4gICAgICAgIHZpZGVvU291cmNlOiBmYWxzZSxcbiAgICAgICAgYXVkaW9Tb3VyY2U6IGF1ZGlvVHJhY2ssXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jYWxsT2JqZWN0ID0gY2FsbE9iamVjdDtcblxuICAgICAgdGhpcy5zZXR1cEV2ZW50SGFuZGxlcnMoY2FsbE9iamVjdCk7XG5cbiAgICAgIC8vIEpvaW4gcm9vbTsgRGFpbHkgaGFuZGxlcyBwbGF5YmFjayBvZiByZW1vdGUgKGJvdCkgYXVkaW8gYXV0b21hdGljYWxseS5cbiAgICAgIC8vIE9ubHkgcGFzcyB0b2tlbiB3aGVuIGl0J3MgYSBub24tZW1wdHkgc3RyaW5nIChEYWlseSByZWplY3RzIHVuZGVmaW5lZC9ub24tc3RyaW5nKS5cbiAgICAgIGNvbnN0IGpvaW5PcHRpb25zOiB7IHVybDogc3RyaW5nOyB0b2tlbj86IHN0cmluZyB9ID0geyB1cmw6IHJvb21VcmwgfTtcbiAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnICYmIHRva2VuLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgam9pbk9wdGlvbnMudG9rZW4gPSB0b2tlbjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGNhbGxPYmplY3Quam9pbihqb2luT3B0aW9ucyk7XG4gICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIFJvb20gY29ubmVjdGVkIChEYWlseSBqb2luIGNvbXBsZXRlKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG5cbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IGNhbGxPYmplY3QucGFydGljaXBhbnRzKCk7XG4gICAgICBpZiAocGFydGljaXBhbnRzPy5sb2NhbCkge1xuICAgICAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gcGFydGljaXBhbnRzLmxvY2FsLnNlc3Npb25faWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWwgbXV0ZSBzdGF0ZTogRGFpbHkgc3RhcnRzIHdpdGggYXVkaW8gb25cbiAgICAgIHRoaXMubWljTXV0ZWRTdWJqZWN0Lm5leHQoIWNhbGxPYmplY3QubG9jYWxBdWRpbygpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBFdmVudEhhbmRsZXJzKGNhbGw6IERhaWx5Q2FsbCk6IHZvaWQge1xuICAgIC8vIGFjdGl2ZS1zcGVha2VyLWNoYW5nZTogdXNlZCBPTkxZIGZvciB1c2VyIHNwZWFraW5nIGRldGVjdGlvbi5cbiAgICAvLyBCb3Qgc3BlYWtpbmcgaXMgZGV0ZWN0ZWQgYnkgb3VyIG93biBBbmFseXNlck5vZGUgKGluc3RhbnQsIG5vIGRlYm91bmNlKS5cbiAgICBjYWxsLm9uKCdhY3RpdmUtc3BlYWtlci1jaGFuZ2UnLCAoZXZlbnQ6IHsgYWN0aXZlU3BlYWtlcj86IHsgcGVlcklkPzogc3RyaW5nIH0gfSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGVlcklkID0gZXZlbnQ/LmFjdGl2ZVNwZWFrZXI/LnBlZXJJZDtcbiAgICAgICAgaWYgKCFwZWVySWQgfHwgIXRoaXMubG9jYWxTZXNzaW9uSWQpIHtcbiAgICAgICAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzTG9jYWwgPSBwZWVySWQgPT09IHRoaXMubG9jYWxTZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMudXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGlzTG9jYWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFjay1zdGFydGVkIC8gdHJhY2stc3RvcHBlZDogc2V0IHVwIHJlbW90ZSBhdWRpbyBwbGF5YmFjayArIEFuYWx5c2VyTm9kZSBtb25pdG9yLlxuICAgIGNhbGwub24oJ3RyYWNrLXN0YXJ0ZWQnLCAoZXZlbnQ6IHsgcGFydGljaXBhbnQ/OiBEYWlseVBhcnRpY2lwYW50IHwgbnVsbDsgdHlwZT86IHN0cmluZzsgdHJhY2s/OiBNZWRpYVN0cmVhbVRyYWNrIH0pID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBldmVudD8ucGFydGljaXBhbnQ7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBldmVudD8udHlwZSA/PyBldmVudD8udHJhY2s/LmtpbmQ7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gZXZlbnQ/LnRyYWNrO1xuICAgICAgICBpZiAocCAmJiAhcC5sb2NhbCAmJiB0eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBHb3QgYXVkaW8gdHJhY2sgZnJvbSBiYWNrZW5kICh0cmFjay1zdGFydGVkKSDigJQgcmVhZHlTdGF0ZT0ke3RyYWNrPy5yZWFkeVN0YXRlfSwgbXV0ZWQ9JHt0cmFjaz8ubXV0ZWR9IOKAlCAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgICBjb25zdCBhdWRpb1RyYWNrID0gdHJhY2sgPz8gKHAgYXMgeyB0cmFja3M/OiB7IGF1ZGlvPzogeyB0cmFjaz86IE1lZGlhU3RyZWFtVHJhY2sgfSB9IH0pLnRyYWNrcz8uYXVkaW8/LnRyYWNrO1xuICAgICAgICAgIGlmIChhdWRpb1RyYWNrICYmIHR5cGVvZiBhdWRpb1RyYWNrID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5wbGF5UmVtb3RlVHJhY2soYXVkaW9UcmFjayk7XG4gICAgICAgICAgICB0aGlzLm1vbml0b3JSZW1vdGVBdWRpbyhhdWRpb1RyYWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbigndHJhY2stc3RvcHBlZCcsIChldmVudDogeyBwYXJ0aWNpcGFudD86IERhaWx5UGFydGljaXBhbnQgfCBudWxsOyB0eXBlPzogc3RyaW5nOyB0cmFjaz86IE1lZGlhU3RyZWFtVHJhY2sgfSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgcCA9IGV2ZW50Py5wYXJ0aWNpcGFudDtcbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50Py50eXBlID8/IGV2ZW50Py50cmFjaz8ua2luZDtcbiAgICAgICAgaWYgKHAgJiYgIXAubG9jYWwgJiYgdHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvTW9uaXRvcigpO1xuICAgICAgICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbignbGVmdC1tZWV0aW5nJywgKCkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuY2xlYW51cCgpKTtcbiAgICB9KTtcblxuICAgIGNhbGwub24oJ2Vycm9yJywgKGV2ZW50PzogeyBlcnJvck1zZz86IHN0cmluZyB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdEYWlseVZvaWNlQ2xpZW50OiBEYWlseSBlcnJvcicsIGV2ZW50Py5lcnJvck1zZyA/PyBldmVudCk7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSByZW1vdGUgKGJvdCkgYXVkaW8gdHJhY2sgdmlhIGEgZGVkaWNhdGVkIGF1ZGlvIGVsZW1lbnQuXG4gICAqIFJlcXVpcmVkIGluIG1hbnkgYnJvd3NlcnMgd2hlcmUgRGFpbHkncyBpbnRlcm5hbCBwbGF5YmFjayBkb2VzIG5vdCBvdXRwdXQgdG8gc3BlYWtlcnMuXG4gICAqL1xuICBwcml2YXRlIHBsYXlSZW1vdGVUcmFjayh0cmFjazogTWVkaWFTdHJlYW1UcmFjayk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gcGxheVJlbW90ZVRyYWNrIGNhbGxlZCDigJQgdHJhY2sucmVhZHlTdGF0ZT0ke3RyYWNrLnJlYWR5U3RhdGV9LCB0cmFjay5tdXRlZD0ke3RyYWNrLm11dGVkfSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG5cbiAgICAgIHRyYWNrLm9udW5tdXRlID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIFJlbW90ZSBhdWRpbyB0cmFjayBVTk1VVEVEIChhdWRpbyBkYXRhIGFycml2aW5nKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSk7XG4gICAgICBjb25zdCBhdWRpbyA9IG5ldyBBdWRpbygpO1xuICAgICAgYXVkaW8uYXV0b3BsYXkgPSB0cnVlO1xuICAgICAgYXVkaW8uc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0VsZW1lbnQgPSBhdWRpbztcblxuICAgICAgYXVkaW8ub25wbGF5aW5nID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIEF1ZGlvIGVsZW1lbnQgUExBWUlORyAoYnJvd3NlciBzdGFydGVkIHBsYXliYWNrKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICB9O1xuXG4gICAgICBsZXQgZmlyc3RUaW1lVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGF1ZGlvLm9udGltZXVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGZpcnN0VGltZVVwZGF0ZSkge1xuICAgICAgICAgIGZpcnN0VGltZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gQXVkaW8gZWxlbWVudCBmaXJzdCBUSU1FVVBEQVRFIChhY3R1YWwgYXVkaW8gb3V0cHV0KSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHAgPSBhdWRpby5wbGF5KCk7XG4gICAgICBpZiAocCAmJiB0eXBlb2YgcC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBhdWRpby5wbGF5KCkgcmVzb2x2ZWQg4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdEYWlseVZvaWNlQ2xpZW50OiByZW1vdGUgYXVkaW8gcGxheSBmYWlsZWQgKG1heSBuZWVkIHVzZXIgZ2VzdHVyZSknLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRGFpbHlWb2ljZUNsaWVudDogZmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgYXVkaW8gZWxlbWVudCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vbml0b3IgcmVtb3RlIGF1ZGlvIHRyYWNrIGVuZXJneSB2aWEgQW5hbHlzZXJOb2RlLlxuICAgKiBQb2xscyBhdCB+MTBIejsgc3VmZmljaWVudCBmb3Igc3BlYWtpbmcgZGV0ZWN0aW9uIHZzIH42MGZwcyBSQUYuXG4gICAqL1xuICBwcml2YXRlIG1vbml0b3JSZW1vdGVBdWRpbyh0cmFjazogTWVkaWFTdHJlYW1UcmFjayk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvTW9uaXRvcigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdHggPSBuZXcgQXVkaW9Db250ZXh0KCk7XG4gICAgICBjb25zdCBzb3VyY2UgPSBjdHguY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UobmV3IE1lZGlhU3RyZWFtKFt0cmFja10pKTtcbiAgICAgIGNvbnN0IGFuYWx5c2VyID0gY3R4LmNyZWF0ZUFuYWx5c2VyKCk7XG4gICAgICBhbmFseXNlci5mZnRTaXplID0gMjU2O1xuICAgICAgc291cmNlLmNvbm5lY3QoYW5hbHlzZXIpO1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0NvbnRleHQgPSBjdHg7XG5cbiAgICAgIGNvbnN0IGRhdGFBcnJheSA9IG5ldyBVaW50OEFycmF5KGFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTtcbiAgICAgIGNvbnN0IFRIUkVTSE9MRCA9IDU7XG4gICAgICBjb25zdCBTSUxFTkNFX01TID0gMTUwMDtcbiAgICAgIGNvbnN0IFBPTExfTVMgPSAxMDA7XG4gICAgICBsZXQgbGFzdFNvdW5kVGltZSA9IDA7XG4gICAgICBsZXQgaXNTcGVha2luZyA9IGZhbHNlO1xuXG4gICAgICB0aGlzLnJlbW90ZVNwZWFraW5nUG9sbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMucmVtb3RlQXVkaW9Db250ZXh0KSB7XG4gICAgICAgICAgaWYgKHRoaXMucmVtb3RlU3BlYWtpbmdQb2xsSWQpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZW1vdGVTcGVha2luZ1BvbGxJZCk7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZVNwZWFraW5nUG9sbElkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKGRhdGFBcnJheSk7XG5cbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc3VtICs9IGRhdGFBcnJheVtpXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdmcgPSBzdW0gLyBkYXRhQXJyYXkubGVuZ3RoO1xuXG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChhdmcgPiBUSFJFU0hPTEQpIHtcbiAgICAgICAgICBsYXN0U291bmRUaW1lID0gbm93O1xuICAgICAgICAgIGlmICghaXNTcGVha2luZykge1xuICAgICAgICAgICAgaXNTcGVha2luZyA9IHRydWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIEJvdCBhdWRpbyBlbmVyZ3kgZGV0ZWN0ZWQgKHNwZWFraW5nPXRydWUpIOKAlCBhdmc9JHthdmcudG9GaXhlZCgxKX0g4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICB0aGlzLnNwZWFraW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzU3BlYWtpbmcgJiYgbm93IC0gbGFzdFNvdW5kVGltZSA+IFNJTEVOQ0VfTVMpIHtcbiAgICAgICAgICBpc1NwZWFraW5nID0gZmFsc2U7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBCb3QgYXVkaW8gc2lsZW5jZSBkZXRlY3RlZCAoc3BlYWtpbmc9ZmFsc2UpIOKAlCAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICB9LCBQT0xMX01TKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRGFpbHlWb2ljZUNsaWVudDogZmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgYXVkaW8gbW9uaXRvcicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbW90ZVNwZWFraW5nUG9sbElkICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVtb3RlU3BlYWtpbmdQb2xsSWQpO1xuICAgICAgdGhpcy5yZW1vdGVTcGVha2luZ1BvbGxJZCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dCkge1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0NvbnRleHQuY2xvc2UoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVtb3RlQXVkaW9FbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0IG1pYyBtdXRlZCBzdGF0ZS4gKi9cbiAgc2V0TXV0ZWQobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbE9iamVjdC5zZXRMb2NhbEF1ZGlvKCFtdXRlZCk7XG4gICAgdGhpcy5taWNNdXRlZFN1YmplY3QubmV4dChtdXRlZCk7XG4gIH1cblxuICAvKiogRGlzY29ubmVjdCBhbmQgY2xlYW51cC4gKi9cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxPYmplY3QubGVhdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICB0aGlzLmNhbGxPYmplY3QuZGVzdHJveSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRoaXMuY2FsbE9iamVjdCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvY2FsU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLnNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBLZWVwIGxhc3QgbWljTXV0ZWQgc3RhdGU7IHdpbGwgcmVzZXQgb24gbmV4dCBjb25uZWN0XG4gIH1cbn1cbiJdfQ==
|