speechrecorderng 3.6.0 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/action/action.mjs +73 -0
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
- package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
- package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
- package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
- package/esm2022/lib/audio/capture/capture.mjs +855 -0
- package/esm2022/lib/audio/context.mjs +79 -0
- package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
- package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
- package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
- package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
- package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
- package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
- package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
- package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
- package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
- package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
- package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
- package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
- package/esm2022/lib/audio/playback/player.mjs +402 -0
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
- package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
- package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
- package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
- package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
- package/esm2022/lib/audio/ui/container.mjs +414 -0
- package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
- package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
- package/esm2022/lib/db/inddb.mjs +120 -0
- package/esm2022/lib/dsp/utils.mjs +48 -0
- package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
- package/esm2022/lib/io/BinaryWriter.mjs +74 -0
- package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
- package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
- package/esm2022/lib/math/complex.mjs +58 -0
- package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
- package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
- package/esm2022/lib/net/uploader.mjs +367 -0
- package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
- package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
- package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
- package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
- package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
- package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
- package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
- package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
- package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
- package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
- package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
- package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
- package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
- package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
- package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
- package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
- package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
- package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
- package/esm2022/lib/utils/ua-parser.mjs +190 -0
- package/esm2022/lib/utils/utils.mjs +105 -0
- package/esm2022/lib/utils/wake_lock.mjs +114 -0
- package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
- package/{esm2020 → esm2022}/public-api.mjs +33 -33
- package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
- package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
- package/fesm2022/speechrecorderng.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/action/action.d.ts +27 -27
- package/lib/audio/array_audio_buffer.d.ts +31 -31
- package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
- package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
- package/lib/audio/audio_data_holder.d.ts +84 -84
- package/lib/audio/audio_display.d.ts +36 -36
- package/lib/audio/audio_player.d.ts +47 -47
- package/lib/audio/capture/capture.d.ts +67 -67
- package/lib/audio/context.d.ts +6 -6
- package/lib/audio/dsp/level_measure.d.ts +60 -60
- package/lib/audio/format.d.ts +11 -11
- package/lib/audio/impl/wavformat.d.ts +5 -5
- package/lib/audio/impl/wavreader.d.ts +16 -16
- package/lib/audio/impl/wavwriter.d.ts +13 -13
- package/lib/audio/inddb_audio_buffer.d.ts +68 -68
- package/lib/audio/io/stream.d.ts +28 -28
- package/lib/audio/net_audio_buffer.d.ts +57 -57
- package/lib/audio/persistor.d.ts +29 -29
- package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
- package/lib/audio/playback/audio_source_node.d.ts +10 -10
- package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
- package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
- package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
- package/lib/audio/playback/player.d.ts +65 -65
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
- package/lib/audio/ui/audio_display_control.d.ts +25 -25
- package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
- package/lib/audio/ui/audiosignal.d.ts +30 -30
- package/lib/audio/ui/common.d.ts +11 -11
- package/lib/audio/ui/container.d.ts +63 -63
- package/lib/audio/ui/livelevel.d.ts +60 -60
- package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
- package/lib/audio/ui/sonagram.d.ts +37 -37
- package/lib/db/inddb.d.ts +21 -21
- package/lib/dsp/utils.d.ts +19 -19
- package/lib/io/BinaryReader.d.ts +18 -18
- package/lib/io/BinaryWriter.d.ts +15 -15
- package/lib/io/stream.d.ts +59 -59
- package/lib/math/2d/geometry.d.ts +18 -18
- package/lib/math/complex.d.ts +17 -17
- package/lib/math/dft.d.ts +22 -22
- package/lib/media/utils.d.ts +3 -3
- package/lib/net/uploader.d.ts +81 -81
- package/lib/recorder_component.d.ts +16 -16
- package/lib/speechrecorder/project/project.d.ts +59 -59
- package/lib/speechrecorder/project/project.service.d.ts +21 -21
- package/lib/speechrecorder/recording.d.ts +51 -51
- package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
- package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
- package/lib/speechrecorder/script/script.d.ts +80 -79
- package/lib/speechrecorder/script/script.service.d.ts +16 -16
- package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
- package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
- package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
- package/lib/speechrecorder/session/item.d.ts +12 -12
- package/lib/speechrecorder/session/progress.d.ts +17 -17
- package/lib/speechrecorder/session/prompting.d.ts +121 -121
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
- package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
- package/lib/speechrecorder/session/recording_list.d.ts +24 -24
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
- package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
- package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
- package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
- package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
- package/lib/speechrecorder/session/session.d.ts +15 -15
- package/lib/speechrecorder/session/session.service.d.ts +20 -20
- package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
- package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
- package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
- package/lib/speechrecorder/spruploader.d.ts +11 -11
- package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
- package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
- package/lib/speechrecorderng.component.d.ts +61 -61
- package/lib/speechrecorderng.module.d.ts +56 -56
- package/lib/spr.config.d.ts +17 -17
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +13 -13
- package/lib/ui/message_dialog.d.ts +10 -10
- package/lib/ui/recordingitem_display.d.ts +84 -84
- package/lib/ui/responsive_component.d.ts +9 -9
- package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
- package/lib/utils/ua-parser.d.ts +43 -43
- package/lib/utils/utils.d.ts +19 -19
- package/lib/utils/wake_lock.d.ts +23 -23
- package/lib/utils/wake_lock_media.d.ts +1 -1
- package/package.json +17 -23
- package/public-api.d.ts +33 -33
- package/esm2020/lib/action/action.mjs +0 -73
- package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2020/lib/audio/capture/capture.mjs +0 -855
- package/esm2020/lib/audio/context.mjs +0 -79
- package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
- package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
- package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2020/lib/audio/playback/player.mjs +0 -402
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2020/lib/audio/ui/container.mjs +0 -414
- package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2020/lib/db/inddb.mjs +0 -120
- package/esm2020/lib/dsp/utils.mjs +0 -48
- package/esm2020/lib/io/BinaryWriter.mjs +0 -74
- package/esm2020/lib/math/complex.mjs +0 -58
- package/esm2020/lib/net/uploader.mjs +0 -367
- package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
- package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
- package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
- package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2020/lib/utils/ua-parser.mjs +0 -190
- package/esm2020/lib/utils/utils.mjs +0 -105
- package/esm2020/lib/utils/wake_lock.mjs +0 -114
- package/fesm2015/speechrecorderng.mjs +0 -17708
- package/fesm2015/speechrecorderng.mjs.map +0 -1
- package/fesm2020/speechrecorderng.mjs.map +0 -1
|
@@ -1,391 +1,391 @@
|
|
|
1
|
-
import { Component, ViewChild } from '@angular/core';
|
|
2
|
-
import { EventType as PlaybackEventType, AudioPlayer } from './audio/playback/player';
|
|
3
|
-
import { SessionManager } from './speechrecorder/session/sessionmanager';
|
|
4
|
-
import { UploaderStatus } from './net/uploader';
|
|
5
|
-
import { SessionService } from "./speechrecorder/session/session.service";
|
|
6
|
-
import { AudioStorageType, ProjectUtil } from "./speechrecorder/project/project";
|
|
7
|
-
import { Arrays } from "./utils/utils";
|
|
8
|
-
import { RecorderComponent } from "./recorder_component";
|
|
9
|
-
import { BasicRecorder } from "./speechrecorder/session/basicrecorder";
|
|
10
|
-
import { SprDb } from "./db/inddb";
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "@angular/router";
|
|
13
|
-
import * as i2 from "./speechrecorder/session/session.service";
|
|
14
|
-
import * as i3 from "./speechrecorder/project/project.service";
|
|
15
|
-
import * as i4 from "./speechrecorder/script/script.service";
|
|
16
|
-
import * as i5 from "./speechrecorder/recordings/recordings.service";
|
|
17
|
-
import * as i6 from "./speechrecorder/spruploader";
|
|
18
|
-
import * as i7 from "./speechrecorder/session/sessionmanager";
|
|
19
|
-
export var Mode;
|
|
20
|
-
(function (Mode) {
|
|
21
|
-
Mode[Mode["SINGLE_SESSION"] = 0] = "SINGLE_SESSION";
|
|
22
|
-
Mode[Mode["DEMO"] = 1] = "DEMO";
|
|
23
|
-
})(Mode || (Mode = {}));
|
|
24
|
-
export class SpeechrecorderngComponent extends RecorderComponent {
|
|
25
|
-
constructor(route, router, changeDetectorRef, sessionsService, projectService, scriptService, recFilesService, uploader) {
|
|
26
|
-
super(uploader);
|
|
27
|
-
this.route = route;
|
|
28
|
-
this.router = router;
|
|
29
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
30
|
-
this.sessionsService = sessionsService;
|
|
31
|
-
this.projectService = projectService;
|
|
32
|
-
this.scriptService = scriptService;
|
|
33
|
-
this.recFilesService = recFilesService;
|
|
34
|
-
this.uploader = uploader;
|
|
35
|
-
this.controlAudioPlayer = null;
|
|
36
|
-
this._project = null;
|
|
37
|
-
}
|
|
38
|
-
handleError(err) {
|
|
39
|
-
let errMsg = 'Unknown error';
|
|
40
|
-
if (err instanceof Error) {
|
|
41
|
-
errMsg = err.message;
|
|
42
|
-
}
|
|
43
|
-
this.sm.statusMsg = errMsg;
|
|
44
|
-
this.sm.statusAlertType = 'error';
|
|
45
|
-
console.error(errMsg);
|
|
46
|
-
}
|
|
47
|
-
ngOnInit() {
|
|
48
|
-
this.controlAudioPlayer = new AudioPlayer(this);
|
|
49
|
-
this.sm.controlAudioPlayer = this.controlAudioPlayer;
|
|
50
|
-
this.sm.statusAlertType = 'info';
|
|
51
|
-
this.sm.statusMsg = 'Player initialized.';
|
|
52
|
-
}
|
|
53
|
-
ngAfterViewInit() {
|
|
54
|
-
// let wakeLockSupp=('wakeLock' in navigator);
|
|
55
|
-
// alert('Wake lock API supported: '+wakeLockSupp);
|
|
56
|
-
if (this.sm.status !==
|
|
57
|
-
let initSuccess = this.init();
|
|
58
|
-
if (initSuccess) {
|
|
59
|
-
this.route.queryParams.subscribe((params) => {
|
|
60
|
-
if (params['sessionId']) {
|
|
61
|
-
this.fetchSession(params['sessionId']);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
this.route.params.subscribe((params) => {
|
|
65
|
-
let routeParamsId = params['id'];
|
|
66
|
-
if (routeParamsId) {
|
|
67
|
-
this.fetchSession(routeParamsId);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
fetchSession(sessionId) {
|
|
74
|
-
let sessObs = this.sessionsService.sessionObserver(sessionId);
|
|
75
|
-
if (sessObs) {
|
|
76
|
-
sessObs.subscribe({
|
|
77
|
-
next: sess => {
|
|
78
|
-
this.setSession(sess);
|
|
79
|
-
this.sm.statusAlertType = 'info';
|
|
80
|
-
this.sm.statusMsg = 'Received session info.';
|
|
81
|
-
this.sm.statusWaiting = false;
|
|
82
|
-
if (sess.project) {
|
|
83
|
-
//console.debug("Session associated project: "+sess.project)
|
|
84
|
-
this.projectService.projectObservable(sess.project).subscribe({
|
|
85
|
-
next: (project) => {
|
|
86
|
-
this.project = project;
|
|
87
|
-
let persistentAudiStorage = (AudioStorageType.DB_CHUNKED === project.clientAudioStorageType);
|
|
88
|
-
super.prepare(persistentAudiStorage).subscribe({
|
|
89
|
-
complete: () => {
|
|
90
|
-
this.sm.persistentAudioStorageTarget = this._persistentAudioStorageTarget;
|
|
91
|
-
this.fetchScript(sess);
|
|
92
|
-
},
|
|
93
|
-
error: (err) => {
|
|
94
|
-
this.handleError(err);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}, error: (reason) => {
|
|
98
|
-
this.sm.statusMsg = reason;
|
|
99
|
-
this.sm.statusAlertType = 'error';
|
|
100
|
-
this.sm.statusWaiting = false;
|
|
101
|
-
console.error("Error fetching project config: " + reason);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
console.info("Session has no associated project. Using default configuration.");
|
|
107
|
-
this.fetchScript(sess);
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
error: (reason) => {
|
|
111
|
-
this.sm.statusMsg = reason;
|
|
112
|
-
this.sm.statusAlertType = 'error';
|
|
113
|
-
this.sm.statusWaiting = false;
|
|
114
|
-
console.error("Error fetching session " + reason);
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
fetchScript(sess) {
|
|
120
|
-
if (sess.script) {
|
|
121
|
-
this.sm.statusAlertType = 'info';
|
|
122
|
-
this.sm.statusMsg = 'Fetching recording script...';
|
|
123
|
-
this.sm.statusWaiting = true;
|
|
124
|
-
this.scriptService.scriptObservable(sess.script).subscribe({
|
|
125
|
-
next: (script) => {
|
|
126
|
-
this.sm.statusAlertType = 'info';
|
|
127
|
-
this.sm.statusMsg = 'Received recording script.';
|
|
128
|
-
this.sm.statusWaiting = false;
|
|
129
|
-
this.setScript(script);
|
|
130
|
-
this.sm.session = sess;
|
|
131
|
-
this.fetchRecordings(sess, this.script);
|
|
132
|
-
}, error: (reason) => {
|
|
133
|
-
let errMsg = "Error fetching recording script: " + reason;
|
|
134
|
-
console.error(errMsg);
|
|
135
|
-
this.sm.statusMsg = errMsg;
|
|
136
|
-
this.sm.statusAlertType = 'error';
|
|
137
|
-
this.sm.statusWaiting = false;
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
let errMsg = "No recording script is defined for this session with ID " + sess.sessionId;
|
|
143
|
-
console.error(this.sm.statusMsg);
|
|
144
|
-
this.sm.statusMsg = errMsg;
|
|
145
|
-
this.sm.statusAlertType = 'error';
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
fetchRecordings(sess, script) {
|
|
149
|
-
this.sm.statusAlertType = 'info';
|
|
150
|
-
this.sm.statusMsg = 'Fetching infos of recordings...';
|
|
151
|
-
this.sm.statusWaiting = true;
|
|
152
|
-
let prNm = null;
|
|
153
|
-
if (this.project) {
|
|
154
|
-
let rfsObs = this.recFilesService.recordingFileDescrList(this.project.name, sess.sessionId);
|
|
155
|
-
rfsObs.subscribe({
|
|
156
|
-
next: (rfs) => {
|
|
157
|
-
this.sm.statusAlertType = 'info';
|
|
158
|
-
this.sm.statusMsg = 'Received infos of recordings.';
|
|
159
|
-
this.sm.statusWaiting = false;
|
|
160
|
-
if (rfs) {
|
|
161
|
-
if (rfs instanceof Array) {
|
|
162
|
-
rfs.forEach((rf) => {
|
|
163
|
-
//console.debug("Already recorded: " + rf+ " "+rf.recording.itemcode);
|
|
164
|
-
this.sm.addRecordingFileByDescriptor(rf);
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
console.error('Expected type array for list of already recorded files ');
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
//console.debug("Recording file list: " + rfs);
|
|
173
|
-
}
|
|
174
|
-
}, error: (err) => {
|
|
175
|
-
// we start the session anyway
|
|
176
|
-
this.startSession();
|
|
177
|
-
}, complete: () => {
|
|
178
|
-
this.startSession();
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
// TODO
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
get screenLocked() {
|
|
187
|
-
return this.sm.screenLocked;
|
|
188
|
-
}
|
|
189
|
-
startSession() {
|
|
190
|
-
this.sm.statusWaiting = false;
|
|
191
|
-
this.sm.start();
|
|
192
|
-
}
|
|
193
|
-
setSession(session) {
|
|
194
|
-
if (session) {
|
|
195
|
-
// console.debug("Session ID: " + session.sessionId);
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
//console.debug("Session Undefined");
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
ready() {
|
|
202
|
-
return this.dataSaved && !this.sm.isActive();
|
|
203
|
-
}
|
|
204
|
-
init() {
|
|
205
|
-
//TODO Duplicate code in AudioRecorderComponent
|
|
206
|
-
this.uploader.listener = (ue) => {
|
|
207
|
-
this.uploadUpdate(ue);
|
|
208
|
-
};
|
|
209
|
-
window.addEventListener('beforeunload', (e) => {
|
|
210
|
-
//console.debug("Before page unload event");
|
|
211
|
-
if (this.ready()) {
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
// all this attempts to customize the message do not work anymore (for security reasons)!!
|
|
216
|
-
const message = "Please do not leave the page, until all recordings are uploaded!";
|
|
217
|
-
alert(message);
|
|
218
|
-
e = e || window.event;
|
|
219
|
-
if (e) {
|
|
220
|
-
e.returnValue = message;
|
|
221
|
-
e.cancelBubble = true;
|
|
222
|
-
if (e.stopPropagation) {
|
|
223
|
-
e.stopPropagation();
|
|
224
|
-
}
|
|
225
|
-
if (e.preventDefault) {
|
|
226
|
-
e.preventDefault();
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return message;
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
|
-
uploadUpdate(ue) {
|
|
235
|
-
let upStatus = ue.status;
|
|
236
|
-
this.dataSaved = (UploaderStatus.DONE === upStatus);
|
|
237
|
-
let percentUpl = ue.percentDone();
|
|
238
|
-
let sizeInQueue = ue.sizeInQueue();
|
|
239
|
-
//console.debug("Uploader: status: "+upStatus+", "+percentUpl+"%, Bytes in queue: "+sizeInQueue+' ('+DataSize.formatBytesToBinaryUnits(sizeInQueue)+')');
|
|
240
|
-
if (UploaderStatus.ERR === upStatus) {
|
|
241
|
-
this.sm.uploadStatus = 'warn';
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
if (percentUpl < 50) {
|
|
245
|
-
this.sm.uploadStatus = 'accent';
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
this.sm.uploadStatus = 'success';
|
|
249
|
-
}
|
|
250
|
-
this.sm.uploadProgress = percentUpl;
|
|
251
|
-
}
|
|
252
|
-
//console.debug("Upload update, update wake lock.")
|
|
253
|
-
this.sm.updateWakeLock(this.dataSaved);
|
|
254
|
-
this.changeDetectorRef.detectChanges();
|
|
255
|
-
}
|
|
256
|
-
configure() {
|
|
257
|
-
this.loadProjectCfg(() => {
|
|
258
|
-
// display project name
|
|
259
|
-
let prName = '[Unknown]';
|
|
260
|
-
if (this.project && this.project.name) {
|
|
261
|
-
prName = this.project.name;
|
|
262
|
-
}
|
|
263
|
-
//this.titleEl.innerText = prName;
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
randomize(script) {
|
|
267
|
-
script.sections.forEach((s) => {
|
|
268
|
-
if ('RANDOM' === s.order) {
|
|
269
|
-
s._shuffledGroups = Arrays.shuffleArray(s.groups);
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
s._shuffledGroups = s.groups;
|
|
273
|
-
}
|
|
274
|
-
s._shuffledGroups.forEach((g) => {
|
|
275
|
-
if ('RANDOM' === g.order) {
|
|
276
|
-
g._shuffledPromptItems = Arrays.shuffleArray(g.promptItems);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
g._shuffledPromptItems = g.promptItems;
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
setScript(script) {
|
|
285
|
-
this.script = script;
|
|
286
|
-
this.randomize(this.script);
|
|
287
|
-
this.sm.script = this.script;
|
|
288
|
-
}
|
|
289
|
-
set project(project) {
|
|
290
|
-
this._project = project;
|
|
291
|
-
let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
|
|
292
|
-
if (project) {
|
|
293
|
-
console.info("Project name: " + project.name);
|
|
294
|
-
if (project.recordingDeviceWakeLock === true) {
|
|
295
|
-
this.sm.wakeLock = true;
|
|
296
|
-
}
|
|
297
|
-
console.info("Audio storage type: " + project.clientAudioStorageType);
|
|
298
|
-
if (AudioStorageType.DB_CHUNKED === project.clientAudioStorageType) {
|
|
299
|
-
SprDb.prepare().subscribe();
|
|
300
|
-
}
|
|
301
|
-
if (project.clientAudioStorageType) {
|
|
302
|
-
this.sm.clientAudioStorageType = project.clientAudioStorageType;
|
|
303
|
-
}
|
|
304
|
-
this.sm.audioDevices = project.audioDevices;
|
|
305
|
-
chCnt = ProjectUtil.audioChannelCount(project);
|
|
306
|
-
console.info("Project requested recording channel count: " + chCnt);
|
|
307
|
-
this.sm.autoGainControlConfigs = project.autoGainControlConfigs;
|
|
308
|
-
if (project.allowEchoCancellation !== undefined) {
|
|
309
|
-
this.sm.allowEchoCancellation = project.allowEchoCancellation;
|
|
310
|
-
}
|
|
311
|
-
if (project.chunkedRecording === true) {
|
|
312
|
-
console.debug("Enable chunked upload: chunkSize: " + BasicRecorder.DEFAULT_CHUNK_SIZE_SECONDS);
|
|
313
|
-
this.sm.uploadChunkSizeSeconds = BasicRecorder.DEFAULT_CHUNK_SIZE_SECONDS;
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
this.sm.uploadChunkSizeSeconds = null;
|
|
317
|
-
}
|
|
318
|
-
if (project.showSessionCompleteMessage != null) {
|
|
319
|
-
this.sm.showSessionCompleteMessage = project.showSessionCompleteMessage;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
else {
|
|
323
|
-
console.error("Empty project configuration!");
|
|
324
|
-
}
|
|
325
|
-
this.sm.channelCount = chCnt;
|
|
326
|
-
}
|
|
327
|
-
get project() {
|
|
328
|
-
return this._project;
|
|
329
|
-
}
|
|
330
|
-
loadProjectCfg(callback) {
|
|
331
|
-
let projUrl = null;
|
|
332
|
-
if (this.sessionId === null) {
|
|
333
|
-
if (window.location.hostname === 'localhost' || this.mode === Mode.DEMO) {
|
|
334
|
-
// debug or demo mode
|
|
335
|
-
projUrl = 'test/Demo1.json?' + new Date().getTime();
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
// load RESTful by sessionId
|
|
340
|
-
projUrl = window.location.protocol + '//' + window.location.hostname + ':' + window.location.port + '/wikispeech/rest/projects/?sessionId=' + this.sessionId;
|
|
341
|
-
}
|
|
342
|
-
if (projUrl) {
|
|
343
|
-
const pLoader = new XMLHttpRequest();
|
|
344
|
-
pLoader.open("GET", projUrl, true);
|
|
345
|
-
pLoader.setRequestHeader('Accept', 'application/json');
|
|
346
|
-
pLoader.responseType = "json";
|
|
347
|
-
pLoader.onload = (e) => {
|
|
348
|
-
this.project = pLoader.response.project;
|
|
349
|
-
callback();
|
|
350
|
-
};
|
|
351
|
-
pLoader.onerror = (e) => {
|
|
352
|
-
console.error("Error downloading project data ...");
|
|
353
|
-
};
|
|
354
|
-
pLoader.send();
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
start() {
|
|
358
|
-
}
|
|
359
|
-
audioPlayerUpdate(e) {
|
|
360
|
-
if (PlaybackEventType.STARTED === e.type) {
|
|
361
|
-
this.sm.statusAlertType = 'info';
|
|
362
|
-
this.sm.statusMsg = 'Playback...';
|
|
363
|
-
}
|
|
364
|
-
else if (PlaybackEventType.ENDED === e.type) {
|
|
365
|
-
this.sm.statusAlertType = 'info';
|
|
366
|
-
this.sm.statusMsg = 'Ready.';
|
|
367
|
-
}
|
|
368
|
-
else if (PlaybackEventType.ERROR === e.type) {
|
|
369
|
-
this.sm.statusAlertType = 'error';
|
|
370
|
-
this.sm.statusMsg = 'Playback error.';
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
error() {
|
|
374
|
-
this.sm.statusAlertType = 'error';
|
|
375
|
-
this.sm.statusMsg = 'ERROR: Recording.';
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
SpeechrecorderngComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SpeechrecorderngComponent, selector: "app-speechrecorder", providers: [SessionService], viewQueries: [{ propertyName: "sm", first: true, predicate: SessionManager, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { EventType as PlaybackEventType, AudioPlayer } from './audio/playback/player';
|
|
3
|
+
import { SessionManager } from './speechrecorder/session/sessionmanager';
|
|
4
|
+
import { UploaderStatus } from './net/uploader';
|
|
5
|
+
import { SessionService } from "./speechrecorder/session/session.service";
|
|
6
|
+
import { AudioStorageType, ProjectUtil } from "./speechrecorder/project/project";
|
|
7
|
+
import { Arrays } from "./utils/utils";
|
|
8
|
+
import { RecorderComponent } from "./recorder_component";
|
|
9
|
+
import { BasicRecorder } from "./speechrecorder/session/basicrecorder";
|
|
10
|
+
import { SprDb } from "./db/inddb";
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/router";
|
|
13
|
+
import * as i2 from "./speechrecorder/session/session.service";
|
|
14
|
+
import * as i3 from "./speechrecorder/project/project.service";
|
|
15
|
+
import * as i4 from "./speechrecorder/script/script.service";
|
|
16
|
+
import * as i5 from "./speechrecorder/recordings/recordings.service";
|
|
17
|
+
import * as i6 from "./speechrecorder/spruploader";
|
|
18
|
+
import * as i7 from "./speechrecorder/session/sessionmanager";
|
|
19
|
+
export var Mode;
|
|
20
|
+
(function (Mode) {
|
|
21
|
+
Mode[Mode["SINGLE_SESSION"] = 0] = "SINGLE_SESSION";
|
|
22
|
+
Mode[Mode["DEMO"] = 1] = "DEMO";
|
|
23
|
+
})(Mode || (Mode = {}));
|
|
24
|
+
export class SpeechrecorderngComponent extends RecorderComponent {
|
|
25
|
+
constructor(route, router, changeDetectorRef, sessionsService, projectService, scriptService, recFilesService, uploader) {
|
|
26
|
+
super(uploader);
|
|
27
|
+
this.route = route;
|
|
28
|
+
this.router = router;
|
|
29
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
30
|
+
this.sessionsService = sessionsService;
|
|
31
|
+
this.projectService = projectService;
|
|
32
|
+
this.scriptService = scriptService;
|
|
33
|
+
this.recFilesService = recFilesService;
|
|
34
|
+
this.uploader = uploader;
|
|
35
|
+
this.controlAudioPlayer = null;
|
|
36
|
+
this._project = null;
|
|
37
|
+
}
|
|
38
|
+
handleError(err) {
|
|
39
|
+
let errMsg = 'Unknown error';
|
|
40
|
+
if (err instanceof Error) {
|
|
41
|
+
errMsg = err.message;
|
|
42
|
+
}
|
|
43
|
+
this.sm.statusMsg = errMsg;
|
|
44
|
+
this.sm.statusAlertType = 'error';
|
|
45
|
+
console.error(errMsg);
|
|
46
|
+
}
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
this.controlAudioPlayer = new AudioPlayer(this);
|
|
49
|
+
this.sm.controlAudioPlayer = this.controlAudioPlayer;
|
|
50
|
+
this.sm.statusAlertType = 'info';
|
|
51
|
+
this.sm.statusMsg = 'Player initialized.';
|
|
52
|
+
}
|
|
53
|
+
ngAfterViewInit() {
|
|
54
|
+
// let wakeLockSupp=('wakeLock' in navigator);
|
|
55
|
+
// alert('Wake lock API supported: '+wakeLockSupp);
|
|
56
|
+
if (this.sm.status !== 10 /* SessionManagerStatus.ERROR */) {
|
|
57
|
+
let initSuccess = this.init();
|
|
58
|
+
if (initSuccess) {
|
|
59
|
+
this.route.queryParams.subscribe((params) => {
|
|
60
|
+
if (params['sessionId']) {
|
|
61
|
+
this.fetchSession(params['sessionId']);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
this.route.params.subscribe((params) => {
|
|
65
|
+
let routeParamsId = params['id'];
|
|
66
|
+
if (routeParamsId) {
|
|
67
|
+
this.fetchSession(routeParamsId);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
fetchSession(sessionId) {
|
|
74
|
+
let sessObs = this.sessionsService.sessionObserver(sessionId);
|
|
75
|
+
if (sessObs) {
|
|
76
|
+
sessObs.subscribe({
|
|
77
|
+
next: sess => {
|
|
78
|
+
this.setSession(sess);
|
|
79
|
+
this.sm.statusAlertType = 'info';
|
|
80
|
+
this.sm.statusMsg = 'Received session info.';
|
|
81
|
+
this.sm.statusWaiting = false;
|
|
82
|
+
if (sess.project) {
|
|
83
|
+
//console.debug("Session associated project: "+sess.project)
|
|
84
|
+
this.projectService.projectObservable(sess.project).subscribe({
|
|
85
|
+
next: (project) => {
|
|
86
|
+
this.project = project;
|
|
87
|
+
let persistentAudiStorage = (AudioStorageType.DB_CHUNKED === project.clientAudioStorageType);
|
|
88
|
+
super.prepare(persistentAudiStorage).subscribe({
|
|
89
|
+
complete: () => {
|
|
90
|
+
this.sm.persistentAudioStorageTarget = this._persistentAudioStorageTarget;
|
|
91
|
+
this.fetchScript(sess);
|
|
92
|
+
},
|
|
93
|
+
error: (err) => {
|
|
94
|
+
this.handleError(err);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}, error: (reason) => {
|
|
98
|
+
this.sm.statusMsg = reason;
|
|
99
|
+
this.sm.statusAlertType = 'error';
|
|
100
|
+
this.sm.statusWaiting = false;
|
|
101
|
+
console.error("Error fetching project config: " + reason);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.info("Session has no associated project. Using default configuration.");
|
|
107
|
+
this.fetchScript(sess);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
error: (reason) => {
|
|
111
|
+
this.sm.statusMsg = reason;
|
|
112
|
+
this.sm.statusAlertType = 'error';
|
|
113
|
+
this.sm.statusWaiting = false;
|
|
114
|
+
console.error("Error fetching session " + reason);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
fetchScript(sess) {
|
|
120
|
+
if (sess.script) {
|
|
121
|
+
this.sm.statusAlertType = 'info';
|
|
122
|
+
this.sm.statusMsg = 'Fetching recording script...';
|
|
123
|
+
this.sm.statusWaiting = true;
|
|
124
|
+
this.scriptService.scriptObservable(sess.script).subscribe({
|
|
125
|
+
next: (script) => {
|
|
126
|
+
this.sm.statusAlertType = 'info';
|
|
127
|
+
this.sm.statusMsg = 'Received recording script.';
|
|
128
|
+
this.sm.statusWaiting = false;
|
|
129
|
+
this.setScript(script);
|
|
130
|
+
this.sm.session = sess;
|
|
131
|
+
this.fetchRecordings(sess, this.script);
|
|
132
|
+
}, error: (reason) => {
|
|
133
|
+
let errMsg = "Error fetching recording script: " + reason;
|
|
134
|
+
console.error(errMsg);
|
|
135
|
+
this.sm.statusMsg = errMsg;
|
|
136
|
+
this.sm.statusAlertType = 'error';
|
|
137
|
+
this.sm.statusWaiting = false;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
let errMsg = "No recording script is defined for this session with ID " + sess.sessionId;
|
|
143
|
+
console.error(this.sm.statusMsg);
|
|
144
|
+
this.sm.statusMsg = errMsg;
|
|
145
|
+
this.sm.statusAlertType = 'error';
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
fetchRecordings(sess, script) {
|
|
149
|
+
this.sm.statusAlertType = 'info';
|
|
150
|
+
this.sm.statusMsg = 'Fetching infos of recordings...';
|
|
151
|
+
this.sm.statusWaiting = true;
|
|
152
|
+
let prNm = null;
|
|
153
|
+
if (this.project) {
|
|
154
|
+
let rfsObs = this.recFilesService.recordingFileDescrList(this.project.name, sess.sessionId);
|
|
155
|
+
rfsObs.subscribe({
|
|
156
|
+
next: (rfs) => {
|
|
157
|
+
this.sm.statusAlertType = 'info';
|
|
158
|
+
this.sm.statusMsg = 'Received infos of recordings.';
|
|
159
|
+
this.sm.statusWaiting = false;
|
|
160
|
+
if (rfs) {
|
|
161
|
+
if (rfs instanceof Array) {
|
|
162
|
+
rfs.forEach((rf) => {
|
|
163
|
+
//console.debug("Already recorded: " + rf+ " "+rf.recording.itemcode);
|
|
164
|
+
this.sm.addRecordingFileByDescriptor(rf);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
console.error('Expected type array for list of already recorded files ');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
//console.debug("Recording file list: " + rfs);
|
|
173
|
+
}
|
|
174
|
+
}, error: (err) => {
|
|
175
|
+
// we start the session anyway
|
|
176
|
+
this.startSession();
|
|
177
|
+
}, complete: () => {
|
|
178
|
+
this.startSession();
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
// TODO
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
get screenLocked() {
|
|
187
|
+
return this.sm.screenLocked;
|
|
188
|
+
}
|
|
189
|
+
startSession() {
|
|
190
|
+
this.sm.statusWaiting = false;
|
|
191
|
+
this.sm.start();
|
|
192
|
+
}
|
|
193
|
+
setSession(session) {
|
|
194
|
+
if (session) {
|
|
195
|
+
// console.debug("Session ID: " + session.sessionId);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
//console.debug("Session Undefined");
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
ready() {
|
|
202
|
+
return this.dataSaved && !this.sm.isActive();
|
|
203
|
+
}
|
|
204
|
+
init() {
|
|
205
|
+
//TODO Duplicate code in AudioRecorderComponent
|
|
206
|
+
this.uploader.listener = (ue) => {
|
|
207
|
+
this.uploadUpdate(ue);
|
|
208
|
+
};
|
|
209
|
+
window.addEventListener('beforeunload', (e) => {
|
|
210
|
+
//console.debug("Before page unload event");
|
|
211
|
+
if (this.ready()) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// all this attempts to customize the message do not work anymore (for security reasons)!!
|
|
216
|
+
const message = "Please do not leave the page, until all recordings are uploaded!";
|
|
217
|
+
alert(message);
|
|
218
|
+
e = e || window.event;
|
|
219
|
+
if (e) {
|
|
220
|
+
e.returnValue = message;
|
|
221
|
+
e.cancelBubble = true;
|
|
222
|
+
if (e.stopPropagation) {
|
|
223
|
+
e.stopPropagation();
|
|
224
|
+
}
|
|
225
|
+
if (e.preventDefault) {
|
|
226
|
+
e.preventDefault();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return message;
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
uploadUpdate(ue) {
|
|
235
|
+
let upStatus = ue.status;
|
|
236
|
+
this.dataSaved = (UploaderStatus.DONE === upStatus);
|
|
237
|
+
let percentUpl = ue.percentDone();
|
|
238
|
+
let sizeInQueue = ue.sizeInQueue();
|
|
239
|
+
//console.debug("Uploader: status: "+upStatus+", "+percentUpl+"%, Bytes in queue: "+sizeInQueue+' ('+DataSize.formatBytesToBinaryUnits(sizeInQueue)+')');
|
|
240
|
+
if (UploaderStatus.ERR === upStatus) {
|
|
241
|
+
this.sm.uploadStatus = 'warn';
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
if (percentUpl < 50) {
|
|
245
|
+
this.sm.uploadStatus = 'accent';
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
this.sm.uploadStatus = 'success';
|
|
249
|
+
}
|
|
250
|
+
this.sm.uploadProgress = percentUpl;
|
|
251
|
+
}
|
|
252
|
+
//console.debug("Upload update, update wake lock.")
|
|
253
|
+
this.sm.updateWakeLock(this.dataSaved);
|
|
254
|
+
this.changeDetectorRef.detectChanges();
|
|
255
|
+
}
|
|
256
|
+
configure() {
|
|
257
|
+
this.loadProjectCfg(() => {
|
|
258
|
+
// display project name
|
|
259
|
+
let prName = '[Unknown]';
|
|
260
|
+
if (this.project && this.project.name) {
|
|
261
|
+
prName = this.project.name;
|
|
262
|
+
}
|
|
263
|
+
//this.titleEl.innerText = prName;
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
randomize(script) {
|
|
267
|
+
script.sections.forEach((s) => {
|
|
268
|
+
if ('RANDOM' === s.order) {
|
|
269
|
+
s._shuffledGroups = Arrays.shuffleArray(s.groups);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
s._shuffledGroups = s.groups;
|
|
273
|
+
}
|
|
274
|
+
s._shuffledGroups.forEach((g) => {
|
|
275
|
+
if ('RANDOM' === g.order) {
|
|
276
|
+
g._shuffledPromptItems = Arrays.shuffleArray(g.promptItems);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
g._shuffledPromptItems = g.promptItems;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
setScript(script) {
|
|
285
|
+
this.script = script;
|
|
286
|
+
this.randomize(this.script);
|
|
287
|
+
this.sm.script = this.script;
|
|
288
|
+
}
|
|
289
|
+
set project(project) {
|
|
290
|
+
this._project = project;
|
|
291
|
+
let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
|
|
292
|
+
if (project) {
|
|
293
|
+
console.info("Project name: " + project.name);
|
|
294
|
+
if (project.recordingDeviceWakeLock === true) {
|
|
295
|
+
this.sm.wakeLock = true;
|
|
296
|
+
}
|
|
297
|
+
console.info("Audio storage type: " + project.clientAudioStorageType);
|
|
298
|
+
if (AudioStorageType.DB_CHUNKED === project.clientAudioStorageType) {
|
|
299
|
+
SprDb.prepare().subscribe();
|
|
300
|
+
}
|
|
301
|
+
if (project.clientAudioStorageType) {
|
|
302
|
+
this.sm.clientAudioStorageType = project.clientAudioStorageType;
|
|
303
|
+
}
|
|
304
|
+
this.sm.audioDevices = project.audioDevices;
|
|
305
|
+
chCnt = ProjectUtil.audioChannelCount(project);
|
|
306
|
+
console.info("Project requested recording channel count: " + chCnt);
|
|
307
|
+
this.sm.autoGainControlConfigs = project.autoGainControlConfigs;
|
|
308
|
+
if (project.allowEchoCancellation !== undefined) {
|
|
309
|
+
this.sm.allowEchoCancellation = project.allowEchoCancellation;
|
|
310
|
+
}
|
|
311
|
+
if (project.chunkedRecording === true) {
|
|
312
|
+
console.debug("Enable chunked upload: chunkSize: " + BasicRecorder.DEFAULT_CHUNK_SIZE_SECONDS);
|
|
313
|
+
this.sm.uploadChunkSizeSeconds = BasicRecorder.DEFAULT_CHUNK_SIZE_SECONDS;
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
this.sm.uploadChunkSizeSeconds = null;
|
|
317
|
+
}
|
|
318
|
+
if (project.showSessionCompleteMessage != null) {
|
|
319
|
+
this.sm.showSessionCompleteMessage = project.showSessionCompleteMessage;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
console.error("Empty project configuration!");
|
|
324
|
+
}
|
|
325
|
+
this.sm.channelCount = chCnt;
|
|
326
|
+
}
|
|
327
|
+
get project() {
|
|
328
|
+
return this._project;
|
|
329
|
+
}
|
|
330
|
+
loadProjectCfg(callback) {
|
|
331
|
+
let projUrl = null;
|
|
332
|
+
if (this.sessionId === null) {
|
|
333
|
+
if (window.location.hostname === 'localhost' || this.mode === Mode.DEMO) {
|
|
334
|
+
// debug or demo mode
|
|
335
|
+
projUrl = 'test/Demo1.json?' + new Date().getTime();
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
// load RESTful by sessionId
|
|
340
|
+
projUrl = window.location.protocol + '//' + window.location.hostname + ':' + window.location.port + '/wikispeech/rest/projects/?sessionId=' + this.sessionId;
|
|
341
|
+
}
|
|
342
|
+
if (projUrl) {
|
|
343
|
+
const pLoader = new XMLHttpRequest();
|
|
344
|
+
pLoader.open("GET", projUrl, true);
|
|
345
|
+
pLoader.setRequestHeader('Accept', 'application/json');
|
|
346
|
+
pLoader.responseType = "json";
|
|
347
|
+
pLoader.onload = (e) => {
|
|
348
|
+
this.project = pLoader.response.project;
|
|
349
|
+
callback();
|
|
350
|
+
};
|
|
351
|
+
pLoader.onerror = (e) => {
|
|
352
|
+
console.error("Error downloading project data ...");
|
|
353
|
+
};
|
|
354
|
+
pLoader.send();
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
start() {
|
|
358
|
+
}
|
|
359
|
+
audioPlayerUpdate(e) {
|
|
360
|
+
if (PlaybackEventType.STARTED === e.type) {
|
|
361
|
+
this.sm.statusAlertType = 'info';
|
|
362
|
+
this.sm.statusMsg = 'Playback...';
|
|
363
|
+
}
|
|
364
|
+
else if (PlaybackEventType.ENDED === e.type) {
|
|
365
|
+
this.sm.statusAlertType = 'info';
|
|
366
|
+
this.sm.statusMsg = 'Ready.';
|
|
367
|
+
}
|
|
368
|
+
else if (PlaybackEventType.ERROR === e.type) {
|
|
369
|
+
this.sm.statusAlertType = 'error';
|
|
370
|
+
this.sm.statusMsg = 'Playback error.';
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
error() {
|
|
374
|
+
this.sm.statusAlertType = 'error';
|
|
375
|
+
this.sm.statusMsg = 'ERROR: Recording.';
|
|
376
|
+
}
|
|
377
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: SpeechrecorderngComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i0.ChangeDetectorRef }, { token: i2.SessionService }, { token: i3.ProjectService }, { token: i4.ScriptService }, { token: i5.RecordingService }, { token: i6.SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
378
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: SpeechrecorderngComponent, selector: "app-speechrecorder", providers: [SessionService], viewQueries: [{ propertyName: "sm", first: true, predicate: SessionManager, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
|
|
380
379
|
<app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
|
|
381
|
-
`, isInline: true, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"], dependencies: [{ kind: "component", type: i7.SessionManager, selector: "app-sprrecordingsession", inputs: ["projectName", "dataSaved"] }] });
|
|
382
|
-
|
|
383
|
-
|
|
380
|
+
`, isInline: true, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"], dependencies: [{ kind: "component", type: i7.SessionManager, selector: "app-sprrecordingsession", inputs: ["projectName", "dataSaved"] }] }); }
|
|
381
|
+
}
|
|
382
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: SpeechrecorderngComponent, decorators: [{
|
|
383
|
+
type: Component,
|
|
384
384
|
args: [{ selector: 'app-speechrecorder', providers: [SessionService], template: `
|
|
385
385
|
<app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
|
|
386
|
-
`, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"] }]
|
|
387
|
-
}], ctorParameters:
|
|
388
|
-
type: ViewChild,
|
|
389
|
-
args: [SessionManager, { static: true }]
|
|
390
|
-
}] } });
|
|
391
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlZWNocmVjb3JkZXJuZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXJuZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQTJDLE1BQU0sZUFBZSxDQUFBO0FBQzVGLE9BQU8sRUFDa0MsU0FBUyxJQUFJLGlCQUFpQixFQUNyRSxXQUFXLEVBQ1osTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsY0FBYyxFQUFnQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3ZHLE9BQU8sRUFBNkIsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBSXhFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBVyxXQUFXLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUt4RixPQUFPLEVBQUMsTUFBTSxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7QUFFakMsTUFBTSxDQUFOLElBQVksSUFBMEI7QUFBdEMsV0FBWSxJQUFJO0lBQUUsbURBQWMsQ0FBQTtJQUFDLCtCQUFJLENBQUE7QUFBQSxDQUFDLEVBQTFCLElBQUksS0FBSixJQUFJLFFBQXNCO0FBa0J0QyxNQUFNLE9BQU8seUJBQTBCLFNBQVEsaUJBQWlCO0lBWTlELFlBQW9CLEtBQXFCLEVBQ2YsTUFBYyxFQUNsQixpQkFBb0MsRUFDcEMsZUFBOEIsRUFDOUIsY0FBNkIsRUFDN0IsYUFBMkIsRUFDM0IsZUFBZ0Ms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Qzs7dUhBdllVLHlCQUF5QjsyR0FBekIseUJBQXlCLDZDQWJ6QixDQUFDLGNBQWMsQ0FBQyw4REF1QmhCLGNBQWMscUZBdEJmOztHQUVUOzRGQVVVLHlCQUF5QjtrQkFoQnJDLFNBQVM7K0JBRUUsb0JBQW9CLGFBQ25CLENBQUMsY0FBYyxDQUFDLFlBQ2pCOztHQUVUO29UQW9CNEMsRUFBRTtzQkFBOUMsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEFmdGVyVmlld0luaXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtcclxuICBBdWRpb1BsYXllckxpc3RlbmVyLCBBdWRpb1BsYXllckV2ZW50LCBFdmVudFR5cGUgYXMgUGxheWJhY2tFdmVudFR5cGUsXHJcbiAgQXVkaW9QbGF5ZXJcclxufSBmcm9tICcuL2F1ZGlvL3BsYXliYWNrL3BsYXllcic7XHJcbmltcG9ydCB7R3JvdXAsIFByb21wdEl0ZW0sIFNjcmlwdH0gZnJvbSAnLi9zcGVlY2hyZWNvcmRlci9zY3JpcHQvc2NyaXB0J1xyXG5pbXBvcnQgeyBTZXNzaW9uTWFuYWdlcixTdGF0dXMgYXMgU2Vzc2lvbk1hbmFnZXJTdGF0dXN9IGZyb20gJy4vc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9ubWFuYWdlcic7XHJcbmltcG9ydCB7IFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQsIFVwbG9hZGVyU3RhdHVzIH0gZnJvbSAnLi9uZXQvdXBsb2FkZXInO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIFJvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL3Nlc3Npb24uc2VydmljZVwiO1xyXG5pbXBvcnQge1NjcmlwdFNlcnZpY2V9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3NjcmlwdC9zY3JpcHQuc2VydmljZVwiO1xyXG5pbXBvcnQge1NwZWVjaFJlY29yZGVyVXBsb2FkZXJ9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3NwcnVwbG9hZGVyXCI7XHJcbmltcG9ydCB7U2Vzc2lvbn0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9uXCI7XHJcbmltcG9ydCB7QXVkaW9TdG9yYWdlVHlwZSwgUHJvamVjdCwgUHJvamVjdFV0aWx9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdFwiO1xyXG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tIFwiLi9zcGVlY2hyZWNvcmRlci9wcm9qZWN0L3Byb2plY3Quc2VydmljZVwiO1xyXG5pbXBvcnQge0F1ZGlvQ29udGV4dFByb3ZpZGVyfSBmcm9tIFwiLi9hdWRpby9jb250ZXh0XCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nU2VydmljZX0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9yZWNvcmRpbmdzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlRGVzY3JpcHRvckltcGx9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZ1wiO1xyXG5pbXBvcnQge0FycmF5cywgRGF0YVNpemV9IGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7UmVjb3JkZXJDb21wb25lbnR9IGZyb20gXCIuL3JlY29yZGVyX2NvbXBvbmVudFwiO1xyXG5pbXBvcnQge0Jhc2ljUmVjb3JkZXJ9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vYmFzaWNyZWNvcmRlclwiO1xyXG5pbXBvcnQge1NwckRifSBmcm9tIFwiLi9kYi9pbmRkYlwiO1xyXG5cclxuZXhwb3J0IGVudW0gTW9kZSB7U0lOR0xFX1NFU1NJT04sREVNT31cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcGVlY2hyZWNvcmRlcicsXHJcbiAgcHJvdmlkZXJzOiBbU2Vzc2lvblNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YXBwLXNwcnJlY29yZGluZ3Nlc3Npb24gW3Byb2plY3ROYW1lXT1cInByb2plY3Q/Lm5hbWVcIiBbZGF0YVNhdmVkXT1cImRhdGFTYXZlZFwiPjwvYXBwLXNwcnJlY29yZGluZ3Nlc3Npb24+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgOmhvc3R7XHJcbiAgICBmbGV4OiAyO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtaW4taGVpZ2h0OjA7XHJcblxyXG4gIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFNwZWVjaHJlY29yZGVybmdDb21wb25lbnQgZXh0ZW5kcyBSZWNvcmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxBZnRlclZpZXdJbml0LEF1ZGlvUGxheWVyTGlzdGVuZXIge1xyXG5cclxuICBtb2RlITpNb2RlO1xyXG4gIGNvbnRyb2xBdWRpb1BsYXllcjpBdWRpb1BsYXllcnxudWxsPW51bGw7XHJcbiAgYXVkaW86YW55O1xyXG4gIF9wcm9qZWN0OlByb2plY3R8bnVsbD1udWxsO1xyXG4gIHNlc3Npb25JZCE6IHN0cmluZztcclxuICBzZXNzaW9uITpTZXNzaW9uO1xyXG4gIHNjcmlwdCE6U2NyaXB0O1xyXG5cclxuICBAVmlld0NoaWxkKFNlc3Npb25NYW5hZ2VyLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbSE6U2Vzc2lvbk1hbmFnZXI7XHJcblxyXG5cdFx0Y29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBzZXNzaW9uc1NlcnZpY2U6U2Vzc2lvblNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOlByb2plY3RTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBzY3JpcHRTZXJ2aWNlOlNjcmlwdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlY0ZpbGVzU2VydmljZTpSZWNvcmRpbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHVwbG9hZGVyOlNwZWVjaFJlY29yZGVyVXBsb2FkZXIpIHtcclxuICAgICAgc3VwZXIodXBsb2FkZXIpO1xyXG5cdFx0fVxyXG5cclxuICAgIGhhbmRsZUVycm9yKGVycjphbnkpe1xyXG4gICAgICBsZXQgZXJyTXNnPSdVbmtub3duIGVycm9yJztcclxuICAgICAgaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xyXG4gICAgICAgIGVyck1zZz1lcnIubWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZz1lcnJNc2c7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdlcnJvcic7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKVxyXG4gICAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKCB0aGlzKTtcclxuICAgICAgdGhpcy5zbS5jb250cm9sQXVkaW9QbGF5ZXI9dGhpcy5jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdpbmZvJztcclxuICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSAnUGxheWVyIGluaXRpYWxpemVkLic7XHJcblxyXG4gIH1cclxuICAgICAgIG5nQWZ0ZXJWaWV3SW5pdCgpe1xyXG4gICAgICAgIC8vIGxldCB3YWtlTG9ja1N1cHA9KCd3YWtlTG9jaycgaW4gbmF2aWdhdG9yKTtcclxuICAgICAgICAvLyBhbGVydCgnV2FrZSBsb2NrIEFQSSBzdXBwb3J0ZWQ6ICcrd2FrZUxvY2tTdXBwKTtcclxuICAgICAgICAgICBpZiAodGhpcy5zbS5zdGF0dXMgIT09IFNlc3Npb25NYW5hZ2VyU3RhdHVzLkVSUk9SKSB7XHJcbiAgICAgICAgICAgICBsZXQgaW5pdFN1Y2Nlc3MgPSB0aGlzLmluaXQoKTtcclxuICAgICAgICAgICAgIGlmIChpbml0U3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICBpZiAocGFyYW1zWydzZXNzaW9uSWQnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaFNlc3Npb24ocGFyYW1zWydzZXNzaW9uSWQnXSk7XHJcbiAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICBsZXQgcm91dGVQYXJhbXNJZCA9IHBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICBpZiAocm91dGVQYXJhbXNJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaFNlc3Npb24ocm91dGVQYXJhbXNJZCk7XHJcbiAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZldGNoU2Vzc2lvbihzZXNzaW9uSWQ6c3RyaW5nKXtcclxuXHJcbiAgICAgIGxldCBzZXNzT2JzPSB0aGlzLnNlc3Npb25zU2VydmljZS5zZXNzaW9uT2JzZXJ2ZXIoc2Vzc2lvbklkKTtcclxuXHJcbiAgICAgIGlmKHNlc3NPYnMpIHtcclxuICAgICAgICBzZXNzT2JzLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiBzZXNzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZXNzaW9uKHNlc3MpO1xyXG4gICAgICAgICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgICAgICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSAnUmVjZWl2ZWQgc2Vzc2lvbiBpbmZvLic7XHJcbiAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoc2Vzcy5wcm9qZWN0KSB7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2Vzc2lvbiBhc3NvY2lhdGVkIHByb2plY3Q6IFwiK3Nlc3MucHJvamVjdClcclxuICAgICAgICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3RPYnNlcnZhYmxlKHNlc3MucHJvamVjdCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgbmV4dDogKHByb2plY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGVyc2lzdGVudEF1ZGlTdG9yYWdlPShBdWRpb1N0b3JhZ2VUeXBlLkRCX0NIVU5LRUQ9PT1wcm9qZWN0LmNsaWVudEF1ZGlvU3RvcmFnZVR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3VwZXIucHJlcGFyZShwZXJzaXN0ZW50QXVkaVN0b3JhZ2UpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbS5wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0ID0gdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoU2NyaXB0KHNlc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICB9LCBlcnJvcjogKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gcmVhc29uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtLnN0YXR1c1dhaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgcHJvamVjdCBjb25maWc6IFwiICsgcmVhc29uKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiU2Vzc2lvbiBoYXMgbm8gYXNzb2NpYXRlZCBwcm9qZWN0LiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXCIpXHJcbiAgICAgICAgICAgICAgdGhpcy5mZXRjaFNjcmlwdChzZXNzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOihyZWFzb24pID0+XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gcmVhc29uO1xyXG4gICAgICAgICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgc2Vzc2lvbiBcIiArIHJlYXNvbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICBmZXRjaFNjcmlwdChzZXNzOiBTZXNzaW9uKSB7XHJcbiAgICBpZiAoc2Vzcy5zY3JpcHQpIHtcclxuICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gJ0ZldGNoaW5nIHJlY29yZGluZyBzY3JpcHQuLi4nO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c1dhaXRpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNjcmlwdFNlcnZpY2Uuc2NyaXB0T2JzZXJ2YWJsZShzZXNzLnNjcmlwdCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoc2NyaXB0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gJ1JlY2VpdmVkIHJlY29yZGluZyBzY3JpcHQuJztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zZXRTY3JpcHQoc2NyaXB0KVxyXG4gICAgICAgICAgdGhpcy5zbS5zZXNzaW9uID0gc2VzcztcclxuICAgICAgICAgIHRoaXMuZmV0Y2hSZWNvcmRpbmdzKHNlc3MsIHRoaXMuc2NyaXB0KVxyXG4gICAgICAgIH0sIGVycm9yOiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZXJyTXNnID0gXCJFcnJvciBmZXRjaGluZyByZWNvcmRpbmcgc2NyaXB0OiBcIiArIHJlYXNvblxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpXHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c01zZyA9IGVyck1zZztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZXJyTXNnID0gXCJObyByZWNvcmRpbmcgc2NyaXB0IGlzIGRlZmluZWQgZm9yIHRoaXMgc2Vzc2lvbiB3aXRoIElEIFwiICsgc2Vzcy5zZXNzaW9uSWQ7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5zbS5zdGF0dXNNc2cpXHJcbiAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gZXJyTXNnO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdzKHNlc3M6IFNlc3Npb24sIHNjcmlwdDogU2NyaXB0KSB7XHJcbiAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc20uc3RhdHVzTXNnID0gJ0ZldGNoaW5nIGluZm9zIG9mIHJlY29yZGluZ3MuLi4nO1xyXG4gICAgdGhpcy5zbS5zdGF0dXNXYWl0aW5nID0gdHJ1ZTtcclxuICAgIGxldCBwck5tOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLnByb2plY3QpIHtcclxuICAgICAgbGV0IHJmc09icyA9IHRoaXMucmVjRmlsZXNTZXJ2aWNlLnJlY29yZGluZ0ZpbGVEZXNjckxpc3QodGhpcy5wcm9qZWN0Lm5hbWUsIHNlc3Muc2Vzc2lvbklkKTtcclxuICAgICAgcmZzT2JzLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJmczogQXJyYXk8UmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsPikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c01zZyA9ICdSZWNlaXZlZCBpbmZvcyBvZiByZWNvcmRpbmdzLic7XHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c1dhaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGlmIChyZnMpIHtcclxuICAgICAgICAgICAgaWYgKHJmcyBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgcmZzLmZvckVhY2goKHJmKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQWxyZWFkeSByZWNvcmRlZDogXCIgKyByZisgXCIgXCIrcmYucmVjb3JkaW5nLml0ZW1jb2RlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc20uYWRkUmVjb3JkaW5nRmlsZUJ5RGVzY3JpcHRvcihyZik7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFeHBlY3RlZCB0eXBlIGFycmF5IGZvciBsaXN0IG9mIGFscmVhZHkgcmVjb3JkZWQgZmlsZXMgJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUmVjb3JkaW5nIGZpbGUgbGlzdDogXCIgKyByZnMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAvLyB3ZSBzdGFydCB0aGUgc2Vzc2lvbiBhbnl3YXlcclxuICAgICAgICAgIHRoaXMuc3RhcnRTZXNzaW9uKClcclxuICAgICAgICB9LCBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdGFydFNlc3Npb24oKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRPRE9cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzY3JlZW5Mb2NrZWQoKTpib29sZWFue1xyXG4gICAgICByZXR1cm4gIHRoaXMuc20uc2NyZWVuTG9ja2VkO1xyXG4gIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0U2Vzc2lvbigpe1xyXG4gICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZz1mYWxzZTtcclxuXHRcdCAgdGhpcy5zbS5zdGFydCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uOmFueSl7XHJcblx0XHQgICAgaWYoc2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKFwiU2Vzc2lvbiBJRDogXCIgKyBzZXNzaW9uLnNlc3Npb25JZCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2Vzc2lvbiBVbmRlZmluZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlYWR5KCk6Ym9vbGVhbntcclxuXHRcdCAgICByZXR1cm4gdGhpcy5kYXRhU2F2ZWQgJiYgIXRoaXMuc20uaXNBY3RpdmUoKVxyXG4gICAgICAgIH1cclxuXHJcblx0XHRpbml0KCk6Ym9vbGVhbiB7XHJcbiAgICAgIC8vVE9ETyBEdXBsaWNhdGUgY29kZSBpbiBBdWRpb1JlY29yZGVyQ29tcG9uZW50XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5saXN0ZW5lciA9ICh1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRVcGRhdGUodWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkJlZm9yZSBwYWdlIHVubG9hZCBldmVudFwiKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5yZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGFsbCB0aGlzIGF0dGVtcHRzIHRvIGN1c3RvbWl6ZSB0aGUgbWVzc2FnZSBkbyBub3Qgd29yayBhbnltb3JlIChmb3Igc2VjdXJpdHkgcmVhc29ucykhIVxyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gXCJQbGVhc2UgZG8gbm90IGxlYXZlIHRoZSBwYWdlLCB1bnRpbCBhbGwgcmVjb3JkaW5ncyBhcmUgdXBsb2FkZWQhXCI7XHJcbiAgICAgICAgICAgIGFsZXJ0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBtZXNzYWdlO1xyXG4gICAgICAgICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gIHVwbG9hZFVwZGF0ZSh1ZTogVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCkge1xyXG4gICAgbGV0IHVwU3RhdHVzID0gdWUuc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhU2F2ZWQgPSAoVXBsb2FkZXJTdGF0dXMuRE9ORSA9PT0gdXBTdGF0dXMpO1xyXG4gICAgbGV0IHBlcmNlbnRVcGwgPSB1ZS5wZXJjZW50RG9uZSgpO1xyXG4gICAgbGV0IHNpemVJblF1ZXVlPXVlLnNpemVJblF1ZXVlKCk7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWRlcjogc3RhdHVzOiBcIit1cFN0YXR1cytcIiwgXCIrcGVyY2VudFVwbCtcIiUsIEJ5dGVzIGluIHF1ZXVlOiBcIitzaXplSW5RdWV1ZSsnICgnK0RhdGFTaXplLmZvcm1hdEJ5dGVzVG9CaW5hcnlVbml0cyhzaXplSW5RdWV1ZSkrJyknKTtcclxuICAgIGlmIChVcGxvYWRlclN0YXR1cy5FUlIgPT09IHVwU3RhdHVzKSB7XHJcbiAgICAgIHRoaXMuc20udXBsb2FkU3RhdHVzID0gJ3dhcm4nXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocGVyY2VudFVwbCA8IDUwKSB7XHJcbiAgICAgICAgdGhpcy5zbS51cGxvYWRTdGF0dXMgPSAnYWNjZW50J1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc20udXBsb2FkU3RhdHVzID0gJ3N1Y2Nlc3MnXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zbS51cGxvYWRQcm9ncmVzcyA9IHBlcmNlbnRVcGw7XHJcbiAgICB9XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWQgdXBkYXRlLCB1cGRhdGUgd2FrZSBsb2NrLlwiKVxyXG4gICAgdGhpcy5zbS51cGRhdGVXYWtlTG9jayh0aGlzLmRhdGFTYXZlZCk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxyXG4gIH1cclxuXHJcbiAgY29uZmlndXJlKCkge1xyXG5cclxuICAgICAgdGhpcy5sb2FkUHJvamVjdENmZygoKSA9PiB7XHJcbiAgICAgICAgLy8gZGlzcGxheSBwcm9qZWN0IG5hbWVcclxuICAgICAgICBsZXQgcHJOYW1lOiBzdHJpbmcgPSAnW1Vua25vd25dJztcclxuICAgICAgICBpZiAodGhpcy5wcm9qZWN0ICYmIHRoaXMucHJvamVjdC5uYW1lKSB7XHJcbiAgICAgICAgICBwck5hbWUgPSB0aGlzLnByb2plY3QubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLnRpdGxlRWwuaW5uZXJUZXh0ID0gcHJOYW1lO1xyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmFuZG9taXplKHNjcmlwdDpTY3JpcHQpe1xyXG5cdFx0ICAgIHNjcmlwdC5zZWN0aW9ucy5mb3JFYWNoKChzKT0+e1xyXG5cdFx0ICAgICAgICBpZignUkFORE9NJz09PXMub3JkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzLl9zaHVmZmxlZEdyb3VwcyA9IEFycmF5cy5zaHVmZmxlQXJyYXk8R3JvdXA+KHMuZ3JvdXBzKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG5cdFx0ICAgICAgICAgICAgcy5fc2h1ZmZsZWRHcm91cHM9cy5ncm91cHM7XHJcbiAgICAgICAgICAgICAgICB9XHJcblx0XHQgICAgICAgIHMuX3NodWZmbGVkR3JvdXBzLmZvckVhY2goKGcpPT57XHJcblx0XHQgICAgICAgICAgICBpZignUkFORE9NJz09PWcub3JkZXIpe1xyXG5cdFx0ICAgICAgICAgICAgICAgZy5fc2h1ZmZsZWRQcm9tcHRJdGVtcz1BcnJheXMuc2h1ZmZsZUFycmF5PFByb21wdEl0ZW0+KGcucHJvbXB0SXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG5cdFx0ICAgICAgICAgICAgICAgIGcuX3NodWZmbGVkUHJvbXB0SXRlbXM9Zy5wcm9tcHRJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2NyaXB0KHNjcmlwdDpTY3JpcHQpe1xyXG4gICAgICAgIHRoaXMuc2NyaXB0PXNjcmlwdDtcclxuICAgICAgICB0aGlzLnJhbmRvbWl6ZSh0aGlzLnNjcmlwdCk7XHJcbiAgICAgICAgdGhpcy5zbS5zY3JpcHQgPSB0aGlzLnNjcmlwdDtcclxuICAgIH1cclxuXHJcblxyXG4gIHNldCBwcm9qZWN0KHByb2plY3Q6IFByb2plY3R8bnVsbCkge1xyXG4gICAgdGhpcy5fcHJvamVjdCA9IHByb2plY3Q7XHJcbiAgICBsZXQgY2hDbnQgPSBQcm9qZWN0VXRpbC5ERUZBVUxUX0FVRElPX0NIQU5ORUxfQ09VTlQ7XHJcblxyXG4gICAgaWYgKHByb2plY3QpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiUHJvamVjdCBuYW1lOiBcIiArIHByb2plY3QubmFtZSlcclxuICAgICAgaWYocHJvamVjdC5yZWNvcmRpbmdEZXZpY2VXYWtlTG9jaz09PXRydWUpe1xyXG4gICAgICAgIHRoaXMuc20ud2FrZUxvY2s9dHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmluZm8oXCJBdWRpbyBzdG9yYWdlIHR5cGU6IFwiK3Byb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSk7XHJcbiAgICAgIGlmKEF1ZGlvU3RvcmFnZVR5cGUuREJfQ0hVTktFRD09PXByb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSl7XHJcbiAgICAgICAgU3ByRGIucHJlcGFyZSgpLnN1YnNjcmliZSgpXHJcbiAgICAgIH1cclxuICAgICAgaWYocHJvamVjdC5jbGllbnRBdWRpb1N0b3JhZ2VUeXBlKSB7XHJcbiAgICAgICAgdGhpcy5zbS5jbGllbnRBdWRpb1N0b3JhZ2VUeXBlID0gcHJvamVjdC5jbGllbnRBdWRpb1N0b3JhZ2VUeXBlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNtLmF1ZGlvRGV2aWNlcyA9IHByb2plY3QuYXVkaW9EZXZpY2VzO1xyXG4gICAgICBjaENudCA9IFByb2plY3RVdGlsLmF1ZGlvQ2hhbm5lbENvdW50KHByb2plY3QpO1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJQcm9qZWN0IHJlcXVlc3RlZCByZWNvcmRpbmcgY2hhbm5lbCBjb3VudDogXCIgKyBjaENudCk7XHJcbiAgICAgIHRoaXMuc20uYXV0b0dhaW5Db250cm9sQ29uZmlncz1wcm9qZWN0LmF1dG9HYWluQ29udHJvbENvbmZpZ3M7XHJcbiAgICAgIGlmKHByb2plY3QuYWxsb3dFY2hvQ2FuY2VsbGF0aW9uIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zbS5hbGxvd0VjaG9DYW5jZWxsYXRpb24gPSBwcm9qZWN0LmFsbG93RWNob0NhbmNlbGxhdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZihwcm9qZWN0LmNodW5rZWRSZWNvcmRpbmc9PT10cnVlKXtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiRW5hYmxlIGNodW5rZWQgdXBsb2FkOiBjaHVua1NpemU6IFwiK0Jhc2ljUmVjb3JkZXIuREVGQVVMVF9DSFVOS19TSVpFX1NFQ09ORFMpXHJcbiAgICAgICAgdGhpcy5zbS51cGxvYWRDaHVua1NpemVTZWNvbmRzPUJhc2ljUmVjb3JkZXIuREVGQVVMVF9DSFVOS19TSVpFX1NFQ09ORFM7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuc20udXBsb2FkQ2h1bmtTaXplU2Vjb25kcz1udWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHByb2plY3Quc2hvd1Nlc3Npb25Db21wbGV0ZU1lc3NhZ2UhPW51bGwpe1xyXG4gICAgICAgIHRoaXMuc20uc2hvd1Nlc3Npb25Db21wbGV0ZU1lc3NhZ2U9cHJvamVjdC5zaG93U2Vzc2lvbkNvbXBsZXRlTWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVtcHR5IHByb2plY3QgY29uZmlndXJhdGlvbiFcIilcclxuICAgIH1cclxuICAgIHRoaXMuc20uY2hhbm5lbENvdW50ID0gY2hDbnQ7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2plY3QoKTpQcm9qZWN0fG51bGx7XHJcblx0XHQgIHJldHVybiB0aGlzLl9wcm9qZWN0O1xyXG4gIH1cclxuXHJcbiAgICBsb2FkUHJvamVjdENmZyhjYWxsYmFjazogKCk9PiBhbnkpe1xyXG4gICAgICBsZXQgcHJvalVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZXNzaW9uSWQgPT09IG51bGwpIHtcclxuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCB0aGlzLm1vZGUgPT09IE1vZGUuREVNTykge1xyXG4gICAgICAgICAgLy8gZGVidWcgb3IgZGVtbyBtb2RlXHJcbiAgICAgICAgICBwcm9qVXJsID0gJ3Rlc3QvRGVtbzEuanNvbj8nICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGxvYWQgUkVTVGZ1bCBieSBzZXNzaW9uSWRcclxuICAgICAgICBwcm9qVXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICc6JyArIHdpbmRvdy5sb2NhdGlvbi5wb3J0ICsgJy93aWtpc3BlZWNoL3Jlc3QvcHJvamVjdHMvP3Nlc3Npb25JZD0nICsgdGhpcy5zZXNzaW9uSWQ7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGlmKHByb2pVcmwpIHtcclxuICAgICAgICBjb25zdCBwTG9hZGVyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgcExvYWRlci5vcGVuKFwiR0VUXCIsIHByb2pVcmwsIHRydWUpO1xyXG4gICAgICAgIHBMb2FkZXIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBwTG9hZGVyLnJlc3BvbnNlVHlwZSA9IFwianNvblwiO1xyXG4gICAgICAgIHBMb2FkZXIub25sb2FkID0gKGUpID0+IHtcclxuXHJcbiAgICAgICAgICB0aGlzLnByb2plY3QgPSBwTG9hZGVyLnJlc3BvbnNlLnByb2plY3Q7XHJcblxyXG4gICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcExvYWRlci5vbmVycm9yID0gKGUpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkb3dubG9hZGluZyBwcm9qZWN0IGRhdGEgLi4uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwTG9hZGVyLnNlbmQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcbiAgICB9XHJcblxyXG4gIGF1ZGlvUGxheWVyVXBkYXRlKGU6QXVkaW9QbGF5ZXJFdmVudCl7XHJcbiAgICBpZihQbGF5YmFja0V2ZW50VHlwZS5TVEFSVEVEPT09ZS50eXBlKXtcclxuICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGU9J2luZm8nO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZz0nUGxheWJhY2suLi4nO1xyXG4gICAgfSBlbHNlIGlmIChQbGF5YmFja0V2ZW50VHlwZS5FTkRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdpbmZvJztcclxuICAgICAgdGhpcy5zbS5zdGF0dXNNc2c9J1JlYWR5Lic7XHJcbiAgICB9ZWxzZSBpZihQbGF5YmFja0V2ZW50VHlwZS5FUlJPUj09PSBlLnR5cGUpe1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZT0nZXJyb3InO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZz0nUGxheWJhY2sgZXJyb3IuJztcclxuICAgIH1cclxuICB9XHJcblx0XHRlcnJvcigpe1xyXG5cdFx0ICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdlcnJvcic7XHJcblx0XHRcdHRoaXMuc20uc3RhdHVzTXNnPSdFUlJPUjogUmVjb3JkaW5nLic7XHJcblx0XHR9XHJcblx0fVxyXG4iXX0=
|
|
386
|
+
`, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"] }]
|
|
387
|
+
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i0.ChangeDetectorRef }, { type: i2.SessionService }, { type: i3.ProjectService }, { type: i4.ScriptService }, { type: i5.RecordingService }, { type: i6.SpeechRecorderUploader }], propDecorators: { sm: [{
|
|
388
|
+
type: ViewChild,
|
|
389
|
+
args: [SessionManager, { static: true }]
|
|
390
|
+
}] } });
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlZWNocmVjb3JkZXJuZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXJuZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQTJDLE1BQU0sZUFBZSxDQUFBO0FBQzVGLE9BQU8sRUFDa0MsU0FBUyxJQUFJLGlCQUFpQixFQUNyRSxXQUFXLEVBQ1osTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsY0FBYyxFQUFnQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3ZHLE9BQU8sRUFBNkIsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBSXhFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBVyxXQUFXLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUt4RixPQUFPLEVBQUMsTUFBTSxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7QUFFakMsTUFBTSxDQUFOLElBQVksSUFBMEI7QUFBdEMsV0FBWSxJQUFJO0lBQUUsbURBQWMsQ0FBQTtJQUFDLCtCQUFJLENBQUE7QUFBQSxDQUFDLEVBQTFCLElBQUksS0FBSixJQUFJLFFBQXNCO0FBa0J0QyxNQUFNLE9BQU8seUJBQTBCLFNBQVEsaUJBQWlCO0lBWTlELFlBQW9CLEtBQXFCLEVBQ2YsTUFBYyxFQUNsQixpQkFBb0MsRUFDcEMsZUFBOEIsRUFDOUIsY0FBNkIsRUFDN0IsYUFBMkIsRUFDM0IsZUFBZ0Ms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Qzs4R0F2WVUseUJBQXlCO2tHQUF6Qix5QkFBeUIsNkNBYnpCLENBQUMsY0FBYyxDQUFDLDhEQXVCaEIsY0FBYyxxRkF0QmY7O0dBRVQ7OzJGQVVVLHlCQUF5QjtrQkFoQnJDLFNBQVM7K0JBRUUsb0JBQW9CLGFBQ25CLENBQUMsY0FBYyxDQUFDLFlBQ2pCOztHQUVUO2tTQW9CNEMsRUFBRTtzQkFBOUMsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEFmdGVyVmlld0luaXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtcclxuICBBdWRpb1BsYXllckxpc3RlbmVyLCBBdWRpb1BsYXllckV2ZW50LCBFdmVudFR5cGUgYXMgUGxheWJhY2tFdmVudFR5cGUsXHJcbiAgQXVkaW9QbGF5ZXJcclxufSBmcm9tICcuL2F1ZGlvL3BsYXliYWNrL3BsYXllcic7XHJcbmltcG9ydCB7R3JvdXAsIFByb21wdEl0ZW0sIFNjcmlwdH0gZnJvbSAnLi9zcGVlY2hyZWNvcmRlci9zY3JpcHQvc2NyaXB0J1xyXG5pbXBvcnQgeyBTZXNzaW9uTWFuYWdlcixTdGF0dXMgYXMgU2Vzc2lvbk1hbmFnZXJTdGF0dXN9IGZyb20gJy4vc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9ubWFuYWdlcic7XHJcbmltcG9ydCB7IFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQsIFVwbG9hZGVyU3RhdHVzIH0gZnJvbSAnLi9uZXQvdXBsb2FkZXInO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIFJvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL3Nlc3Npb24uc2VydmljZVwiO1xyXG5pbXBvcnQge1NjcmlwdFNlcnZpY2V9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3NjcmlwdC9zY3JpcHQuc2VydmljZVwiO1xyXG5pbXBvcnQge1NwZWVjaFJlY29yZGVyVXBsb2FkZXJ9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3NwcnVwbG9hZGVyXCI7XHJcbmltcG9ydCB7U2Vzc2lvbn0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9uXCI7XHJcbmltcG9ydCB7QXVkaW9TdG9yYWdlVHlwZSwgUHJvamVjdCwgUHJvamVjdFV0aWx9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdFwiO1xyXG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tIFwiLi9zcGVlY2hyZWNvcmRlci9wcm9qZWN0L3Byb2plY3Quc2VydmljZVwiO1xyXG5pbXBvcnQge0F1ZGlvQ29udGV4dFByb3ZpZGVyfSBmcm9tIFwiLi9hdWRpby9jb250ZXh0XCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nU2VydmljZX0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9yZWNvcmRpbmdzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlRGVzY3JpcHRvckltcGx9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZ1wiO1xyXG5pbXBvcnQge0FycmF5cywgRGF0YVNpemV9IGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7UmVjb3JkZXJDb21wb25lbnR9IGZyb20gXCIuL3JlY29yZGVyX2NvbXBvbmVudFwiO1xyXG5pbXBvcnQge0Jhc2ljUmVjb3JkZXJ9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vYmFzaWNyZWNvcmRlclwiO1xyXG5pbXBvcnQge1NwckRifSBmcm9tIFwiLi9kYi9pbmRkYlwiO1xyXG5cclxuZXhwb3J0IGVudW0gTW9kZSB7U0lOR0xFX1NFU1NJT04sREVNT31cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcGVlY2hyZWNvcmRlcicsXHJcbiAgcHJvdmlkZXJzOiBbU2Vzc2lvblNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YXBwLXNwcnJlY29yZGluZ3Nlc3Npb24gW3Byb2plY3ROYW1lXT1cInByb2plY3Q/Lm5hbWVcIiBbZGF0YVNhdmVkXT1cImRhdGFTYXZlZFwiPjwvYXBwLXNwcnJlY29yZGluZ3Nlc3Npb24+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgOmhvc3R7XHJcbiAgICBmbGV4OiAyO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtaW4taGVpZ2h0OjA7XHJcblxyXG4gIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFNwZWVjaHJlY29yZGVybmdDb21wb25lbnQgZXh0ZW5kcyBSZWNvcmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxBZnRlclZpZXdJbml0LEF1ZGlvUGxheWVyTGlzdGVuZXIge1xyXG5cclxuICBtb2RlITpNb2RlO1xyXG4gIGNvbnRyb2xBdWRpb1BsYXllcjpBdWRpb1BsYXllcnxudWxsPW51bGw7XHJcbiAgYXVkaW86YW55O1xyXG4gIF9wcm9qZWN0OlByb2plY3R8bnVsbD1udWxsO1xyXG4gIHNlc3Npb25JZCE6IHN0cmluZztcclxuICBzZXNzaW9uITpTZXNzaW9uO1xyXG4gIHNjcmlwdCE6U2NyaXB0O1xyXG5cclxuICBAVmlld0NoaWxkKFNlc3Npb25NYW5hZ2VyLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbSE6U2Vzc2lvbk1hbmFnZXI7XHJcblxyXG5cdFx0Y29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBzZXNzaW9uc1NlcnZpY2U6U2Vzc2lvblNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOlByb2plY3RTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBzY3JpcHRTZXJ2aWNlOlNjcmlwdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlY0ZpbGVzU2VydmljZTpSZWNvcmRpbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHVwbG9hZGVyOlNwZWVjaFJlY29yZGVyVXBsb2FkZXIpIHtcclxuICAgICAgc3VwZXIodXBsb2FkZXIpO1xyXG5cdFx0fVxyXG5cclxuICAgIGhhbmRsZUVycm9yKGVycjphbnkpe1xyXG4gICAgICBsZXQgZXJyTXNnPSdVbmtub3duIGVycm9yJztcclxuICAgICAgaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xyXG4gICAgICAgIGVyck1zZz1lcnIubWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZz1lcnJNc2c7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdlcnJvcic7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKVxyXG4gICAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKCB0aGlzKTtcclxuICAgICAgdGhpcy5zbS5jb250cm9sQXVkaW9QbGF5ZXI9dGhpcy5jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdpbmZvJztcclxuICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSAnUGxheWVyIGluaXRpYWxpemVkLic7XHJcblxyXG4gIH1cclxuICAgICAgIG5nQWZ0ZXJWaWV3SW5pdCgpe1xyXG4gICAgICAgIC8vIGxldCB3YWtlTG9ja1N1cHA9KCd3YWtlTG9jaycgaW4gbmF2aWdhdG9yKTtcclxuICAgICAgICAvLyBhbGVydCgnV2FrZSBsb2NrIEFQSSBzdXBwb3J0ZWQ6ICcrd2FrZUxvY2tTdXBwKTtcclxuICAgICAgICAgICBpZiAodGhpcy5zbS5zdGF0dXMgIT09IFNlc3Npb25NYW5hZ2VyU3RhdHVzLkVSUk9SKSB7XHJcbiAgICAgICAgICAgICBsZXQgaW5pdFN1Y2Nlc3MgPSB0aGlzLmluaXQoKTtcclxuICAgICAgICAgICAgIGlmIChpbml0U3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICBpZiAocGFyYW1zWydzZXNzaW9uSWQnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaFNlc3Npb24ocGFyYW1zWydzZXNzaW9uSWQnXSk7XHJcbiAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICBsZXQgcm91dGVQYXJhbXNJZCA9IHBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICBpZiAocm91dGVQYXJhbXNJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaFNlc3Npb24ocm91dGVQYXJhbXNJZCk7XHJcbiAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZldGNoU2Vzc2lvbihzZXNzaW9uSWQ6c3RyaW5nKXtcclxuXHJcbiAgICAgIGxldCBzZXNzT2JzPSB0aGlzLnNlc3Npb25zU2VydmljZS5zZXNzaW9uT2JzZXJ2ZXIoc2Vzc2lvbklkKTtcclxuXHJcbiAgICAgIGlmKHNlc3NPYnMpIHtcclxuICAgICAgICBzZXNzT2JzLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiBzZXNzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZXNzaW9uKHNlc3MpO1xyXG4gICAgICAgICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgICAgICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSAnUmVjZWl2ZWQgc2Vzc2lvbiBpbmZvLic7XHJcbiAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoc2Vzcy5wcm9qZWN0KSB7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2Vzc2lvbiBhc3NvY2lhdGVkIHByb2plY3Q6IFwiK3Nlc3MucHJvamVjdClcclxuICAgICAgICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3RPYnNlcnZhYmxlKHNlc3MucHJvamVjdCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgbmV4dDogKHByb2plY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGVyc2lzdGVudEF1ZGlTdG9yYWdlPShBdWRpb1N0b3JhZ2VUeXBlLkRCX0NIVU5LRUQ9PT1wcm9qZWN0LmNsaWVudEF1ZGlvU3RvcmFnZVR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3VwZXIucHJlcGFyZShwZXJzaXN0ZW50QXVkaVN0b3JhZ2UpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbS5wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0ID0gdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoU2NyaXB0KHNlc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICB9LCBlcnJvcjogKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gcmVhc29uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtLnN0YXR1c1dhaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgcHJvamVjdCBjb25maWc6IFwiICsgcmVhc29uKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiU2Vzc2lvbiBoYXMgbm8gYXNzb2NpYXRlZCBwcm9qZWN0LiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXCIpXHJcbiAgICAgICAgICAgICAgdGhpcy5mZXRjaFNjcmlwdChzZXNzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOihyZWFzb24pID0+XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gcmVhc29uO1xyXG4gICAgICAgICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgc2Vzc2lvbiBcIiArIHJlYXNvbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICBmZXRjaFNjcmlwdChzZXNzOiBTZXNzaW9uKSB7XHJcbiAgICBpZiAoc2Vzcy5zY3JpcHQpIHtcclxuICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gJ0ZldGNoaW5nIHJlY29yZGluZyBzY3JpcHQuLi4nO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c1dhaXRpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNjcmlwdFNlcnZpY2Uuc2NyaXB0T2JzZXJ2YWJsZShzZXNzLnNjcmlwdCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoc2NyaXB0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gJ1JlY2VpdmVkIHJlY29yZGluZyBzY3JpcHQuJztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zZXRTY3JpcHQoc2NyaXB0KVxyXG4gICAgICAgICAgdGhpcy5zbS5zZXNzaW9uID0gc2VzcztcclxuICAgICAgICAgIHRoaXMuZmV0Y2hSZWNvcmRpbmdzKHNlc3MsIHRoaXMuc2NyaXB0KVxyXG4gICAgICAgIH0sIGVycm9yOiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZXJyTXNnID0gXCJFcnJvciBmZXRjaGluZyByZWNvcmRpbmcgc2NyaXB0OiBcIiArIHJlYXNvblxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpXHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c01zZyA9IGVyck1zZztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZXJyTXNnID0gXCJObyByZWNvcmRpbmcgc2NyaXB0IGlzIGRlZmluZWQgZm9yIHRoaXMgc2Vzc2lvbiB3aXRoIElEIFwiICsgc2Vzcy5zZXNzaW9uSWQ7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5zbS5zdGF0dXNNc2cpXHJcbiAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gZXJyTXNnO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdzKHNlc3M6IFNlc3Npb24sIHNjcmlwdDogU2NyaXB0KSB7XHJcbiAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc20uc3RhdHVzTXNnID0gJ0ZldGNoaW5nIGluZm9zIG9mIHJlY29yZGluZ3MuLi4nO1xyXG4gICAgdGhpcy5zbS5zdGF0dXNXYWl0aW5nID0gdHJ1ZTtcclxuICAgIGxldCBwck5tOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLnByb2plY3QpIHtcclxuICAgICAgbGV0IHJmc09icyA9IHRoaXMucmVjRmlsZXNTZXJ2aWNlLnJlY29yZGluZ0ZpbGVEZXNjckxpc3QodGhpcy5wcm9qZWN0Lm5hbWUsIHNlc3Muc2Vzc2lvbklkKTtcclxuICAgICAgcmZzT2JzLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJmczogQXJyYXk8UmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsPikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c01zZyA9ICdSZWNlaXZlZCBpbmZvcyBvZiByZWNvcmRpbmdzLic7XHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c1dhaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGlmIChyZnMpIHtcclxuICAgICAgICAgICAgaWYgKHJmcyBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgcmZzLmZvckVhY2goKHJmKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQWxyZWFkeSByZWNvcmRlZDogXCIgKyByZisgXCIgXCIrcmYucmVjb3JkaW5nLml0ZW1jb2RlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc20uYWRkUmVjb3JkaW5nRmlsZUJ5RGVzY3JpcHRvcihyZik7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFeHBlY3RlZCB0eXBlIGFycmF5IGZvciBsaXN0IG9mIGFscmVhZHkgcmVjb3JkZWQgZmlsZXMgJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUmVjb3JkaW5nIGZpbGUgbGlzdDogXCIgKyByZnMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAvLyB3ZSBzdGFydCB0aGUgc2Vzc2lvbiBhbnl3YXlcclxuICAgICAgICAgIHRoaXMuc3RhcnRTZXNzaW9uKClcclxuICAgICAgICB9LCBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdGFydFNlc3Npb24oKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRPRE9cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzY3JlZW5Mb2NrZWQoKTpib29sZWFue1xyXG4gICAgICByZXR1cm4gIHRoaXMuc20uc2NyZWVuTG9ja2VkO1xyXG4gIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0U2Vzc2lvbigpe1xyXG4gICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZz1mYWxzZTtcclxuXHRcdCAgdGhpcy5zbS5zdGFydCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uOmFueSl7XHJcblx0XHQgICAgaWYoc2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKFwiU2Vzc2lvbiBJRDogXCIgKyBzZXNzaW9uLnNlc3Npb25JZCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2Vzc2lvbiBVbmRlZmluZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlYWR5KCk6Ym9vbGVhbntcclxuXHRcdCAgICByZXR1cm4gdGhpcy5kYXRhU2F2ZWQgJiYgIXRoaXMuc20uaXNBY3RpdmUoKVxyXG4gICAgICAgIH1cclxuXHJcblx0XHRpbml0KCk6Ym9vbGVhbiB7XHJcbiAgICAgIC8vVE9ETyBEdXBsaWNhdGUgY29kZSBpbiBBdWRpb1JlY29yZGVyQ29tcG9uZW50XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5saXN0ZW5lciA9ICh1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRVcGRhdGUodWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkJlZm9yZSBwYWdlIHVubG9hZCBldmVudFwiKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5yZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGFsbCB0aGlzIGF0dGVtcHRzIHRvIGN1c3RvbWl6ZSB0aGUgbWVzc2FnZSBkbyBub3Qgd29yayBhbnltb3JlIChmb3Igc2VjdXJpdHkgcmVhc29ucykhIVxyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gXCJQbGVhc2UgZG8gbm90IGxlYXZlIHRoZSBwYWdlLCB1bnRpbCBhbGwgcmVjb3JkaW5ncyBhcmUgdXBsb2FkZWQhXCI7XHJcbiAgICAgICAgICAgIGFsZXJ0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBtZXNzYWdlO1xyXG4gICAgICAgICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gIHVwbG9hZFVwZGF0ZSh1ZTogVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCkge1xyXG4gICAgbGV0IHVwU3RhdHVzID0gdWUuc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhU2F2ZWQgPSAoVXBsb2FkZXJTdGF0dXMuRE9ORSA9PT0gdXBTdGF0dXMpO1xyXG4gICAgbGV0IHBlcmNlbnRVcGwgPSB1ZS5wZXJjZW50RG9uZSgpO1xyXG4gICAgbGV0IHNpemVJblF1ZXVlPXVlLnNpemVJblF1ZXVlKCk7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWRlcjogc3RhdHVzOiBcIit1cFN0YXR1cytcIiwgXCIrcGVyY2VudFVwbCtcIiUsIEJ5dGVzIGluIHF1ZXVlOiBcIitzaXplSW5RdWV1ZSsnICgnK0RhdGFTaXplLmZvcm1hdEJ5dGVzVG9CaW5hcnlVbml0cyhzaXplSW5RdWV1ZSkrJyknKTtcclxuICAgIGlmIChVcGxvYWRlclN0YXR1cy5FUlIgPT09IHVwU3RhdHVzKSB7XHJcbiAgICAgIHRoaXMuc20udXBsb2FkU3RhdHVzID0gJ3dhcm4nXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocGVyY2VudFVwbCA8IDUwKSB7XHJcbiAgICAgICAgdGhpcy5zbS51cGxvYWRTdGF0dXMgPSAnYWNjZW50J1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc20udXBsb2FkU3RhdHVzID0gJ3N1Y2Nlc3MnXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zbS51cGxvYWRQcm9ncmVzcyA9IHBlcmNlbnRVcGw7XHJcbiAgICB9XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWQgdXBkYXRlLCB1cGRhdGUgd2FrZSBsb2NrLlwiKVxyXG4gICAgdGhpcy5zbS51cGRhdGVXYWtlTG9jayh0aGlzLmRhdGFTYXZlZCk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxyXG4gIH1cclxuXHJcbiAgY29uZmlndXJlKCkge1xyXG5cclxuICAgICAgdGhpcy5sb2FkUHJvamVjdENmZygoKSA9PiB7XHJcbiAgICAgICAgLy8gZGlzcGxheSBwcm9qZWN0IG5hbWVcclxuICAgICAgICBsZXQgcHJOYW1lOiBzdHJpbmcgPSAnW1Vua25vd25dJztcclxuICAgICAgICBpZiAodGhpcy5wcm9qZWN0ICYmIHRoaXMucHJvamVjdC5uYW1lKSB7XHJcbiAgICAgICAgICBwck5hbWUgPSB0aGlzLnByb2plY3QubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLnRpdGxlRWwuaW5uZXJUZXh0ID0gcHJOYW1lO1xyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmFuZG9taXplKHNjcmlwdDpTY3JpcHQpe1xyXG5cdFx0ICAgIHNjcmlwdC5zZWN0aW9ucy5mb3JFYWNoKChzKT0+e1xyXG5cdFx0ICAgICAgICBpZignUkFORE9NJz09PXMub3JkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzLl9zaHVmZmxlZEdyb3VwcyA9IEFycmF5cy5zaHVmZmxlQXJyYXk8R3JvdXA+KHMuZ3JvdXBzKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG5cdFx0ICAgICAgICAgICAgcy5fc2h1ZmZsZWRHcm91cHM9cy5ncm91cHM7XHJcbiAgICAgICAgICAgICAgICB9XHJcblx0XHQgICAgICAgIHMuX3NodWZmbGVkR3JvdXBzLmZvckVhY2goKGcpPT57XHJcblx0XHQgICAgICAgICAgICBpZignUkFORE9NJz09PWcub3JkZXIpe1xyXG5cdFx0ICAgICAgICAgICAgICAgZy5fc2h1ZmZsZWRQcm9tcHRJdGVtcz1BcnJheXMuc2h1ZmZsZUFycmF5PFByb21wdEl0ZW0+KGcucHJvbXB0SXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG5cdFx0ICAgICAgICAgICAgICAgIGcuX3NodWZmbGVkUHJvbXB0SXRlbXM9Zy5wcm9tcHRJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2NyaXB0KHNjcmlwdDpTY3JpcHQpe1xyXG4gICAgICAgIHRoaXMuc2NyaXB0PXNjcmlwdDtcclxuICAgICAgICB0aGlzLnJhbmRvbWl6ZSh0aGlzLnNjcmlwdCk7XHJcbiAgICAgICAgdGhpcy5zbS5zY3JpcHQgPSB0aGlzLnNjcmlwdDtcclxuICAgIH1cclxuXHJcblxyXG4gIHNldCBwcm9qZWN0KHByb2plY3Q6IFByb2plY3R8bnVsbCkge1xyXG4gICAgdGhpcy5fcHJvamVjdCA9IHByb2plY3Q7XHJcbiAgICBsZXQgY2hDbnQgPSBQcm9qZWN0VXRpbC5ERUZBVUxUX0FVRElPX0NIQU5ORUxfQ09VTlQ7XHJcblxyXG4gICAgaWYgKHByb2plY3QpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiUHJvamVjdCBuYW1lOiBcIiArIHByb2plY3QubmFtZSlcclxuICAgICAgaWYocHJvamVjdC5yZWNvcmRpbmdEZXZpY2VXYWtlTG9jaz09PXRydWUpe1xyXG4gICAgICAgIHRoaXMuc20ud2FrZUxvY2s9dHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmluZm8oXCJBdWRpbyBzdG9yYWdlIHR5cGU6IFwiK3Byb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSk7XHJcbiAgICAgIGlmKEF1ZGlvU3RvcmFnZVR5cGUuREJfQ0hVTktFRD09PXByb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSl7XHJcbiAgICAgICAgU3ByRGIucHJlcGFyZSgpLnN1YnNjcmliZSgpXHJcbiAgICAgIH1cclxuICAgICAgaWYocHJvamVjdC5jbGllbnRBdWRpb1N0b3JhZ2VUeXBlKSB7XHJcbiAgICAgICAgdGhpcy5zbS5jbGllbnRBdWRpb1N0b3JhZ2VUeXBlID0gcHJvamVjdC5jbGllbnRBdWRpb1N0b3JhZ2VUeXBlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNtLmF1ZGlvRGV2aWNlcyA9IHByb2plY3QuYXVkaW9EZXZpY2VzO1xyXG4gICAgICBjaENudCA9IFByb2plY3RVdGlsLmF1ZGlvQ2hhbm5lbENvdW50KHByb2plY3QpO1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJQcm9qZWN0IHJlcXVlc3RlZCByZWNvcmRpbmcgY2hhbm5lbCBjb3VudDogXCIgKyBjaENudCk7XHJcbiAgICAgIHRoaXMuc20uYXV0b0dhaW5Db250cm9sQ29uZmlncz1wcm9qZWN0LmF1dG9HYWluQ29udHJvbENvbmZpZ3M7XHJcbiAgICAgIGlmKHByb2plY3QuYWxsb3dFY2hvQ2FuY2VsbGF0aW9uIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zbS5hbGxvd0VjaG9DYW5jZWxsYXRpb24gPSBwcm9qZWN0LmFsbG93RWNob0NhbmNlbGxhdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZihwcm9qZWN0LmNodW5rZWRSZWNvcmRpbmc9PT10cnVlKXtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiRW5hYmxlIGNodW5rZWQgdXBsb2FkOiBjaHVua1NpemU6IFwiK0Jhc2ljUmVjb3JkZXIuREVGQVVMVF9DSFVOS19TSVpFX1NFQ09ORFMpXHJcbiAgICAgICAgdGhpcy5zbS51cGxvYWRDaHVua1NpemVTZWNvbmRzPUJhc2ljUmVjb3JkZXIuREVGQVVMVF9DSFVOS19TSVpFX1NFQ09ORFM7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuc20udXBsb2FkQ2h1bmtTaXplU2Vjb25kcz1udWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHByb2plY3Quc2hvd1Nlc3Npb25Db21wbGV0ZU1lc3NhZ2UhPW51bGwpe1xyXG4gICAgICAgIHRoaXMuc20uc2hvd1Nlc3Npb25Db21wbGV0ZU1lc3NhZ2U9cHJvamVjdC5zaG93U2Vzc2lvbkNvbXBsZXRlTWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVtcHR5IHByb2plY3QgY29uZmlndXJhdGlvbiFcIilcclxuICAgIH1cclxuICAgIHRoaXMuc20uY2hhbm5lbENvdW50ID0gY2hDbnQ7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2plY3QoKTpQcm9qZWN0fG51bGx7XHJcblx0XHQgIHJldHVybiB0aGlzLl9wcm9qZWN0O1xyXG4gIH1cclxuXHJcbiAgICBsb2FkUHJvamVjdENmZyhjYWxsYmFjazogKCk9PiBhbnkpe1xyXG4gICAgICBsZXQgcHJvalVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZXNzaW9uSWQgPT09IG51bGwpIHtcclxuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCB0aGlzLm1vZGUgPT09IE1vZGUuREVNTykge1xyXG4gICAgICAgICAgLy8gZGVidWcgb3IgZGVtbyBtb2RlXHJcbiAgICAgICAgICBwcm9qVXJsID0gJ3Rlc3QvRGVtbzEuanNvbj8nICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGxvYWQgUkVTVGZ1bCBieSBzZXNzaW9uSWRcclxuICAgICAgICBwcm9qVXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICc6JyArIHdpbmRvdy5sb2NhdGlvbi5wb3J0ICsgJy93aWtpc3BlZWNoL3Jlc3QvcHJvamVjdHMvP3Nlc3Npb25JZD0nICsgdGhpcy5zZXNzaW9uSWQ7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGlmKHByb2pVcmwpIHtcclxuICAgICAgICBjb25zdCBwTG9hZGVyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgcExvYWRlci5vcGVuKFwiR0VUXCIsIHByb2pVcmwsIHRydWUpO1xyXG4gICAgICAgIHBMb2FkZXIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBwTG9hZGVyLnJlc3BvbnNlVHlwZSA9IFwianNvblwiO1xyXG4gICAgICAgIHBMb2FkZXIub25sb2FkID0gKGUpID0+IHtcclxuXHJcbiAgICAgICAgICB0aGlzLnByb2plY3QgPSBwTG9hZGVyLnJlc3BvbnNlLnByb2plY3Q7XHJcblxyXG4gICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcExvYWRlci5vbmVycm9yID0gKGUpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkb3dubG9hZGluZyBwcm9qZWN0IGRhdGEgLi4uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwTG9hZGVyLnNlbmQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcbiAgICB9XHJcblxyXG4gIGF1ZGlvUGxheWVyVXBkYXRlKGU6QXVkaW9QbGF5ZXJFdmVudCl7XHJcbiAgICBpZihQbGF5YmFja0V2ZW50VHlwZS5TVEFSVEVEPT09ZS50eXBlKXtcclxuICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGU9J2luZm8nO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZz0nUGxheWJhY2suLi4nO1xyXG4gICAgfSBlbHNlIGlmIChQbGF5YmFja0V2ZW50VHlwZS5FTkRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdpbmZvJztcclxuICAgICAgdGhpcy5zbS5zdGF0dXNNc2c9J1JlYWR5Lic7XHJcbiAgICB9ZWxzZSBpZihQbGF5YmFja0V2ZW50VHlwZS5FUlJPUj09PSBlLnR5cGUpe1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZT0nZXJyb3InO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZz0nUGxheWJhY2sgZXJyb3IuJztcclxuICAgIH1cclxuICB9XHJcblx0XHRlcnJvcigpe1xyXG5cdFx0ICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdlcnJvcic7XHJcblx0XHRcdHRoaXMuc20uc3RhdHVzTXNnPSdFUlJPUjogUmVjb3JkaW5nLic7XHJcblx0XHR9XHJcblx0fVxyXG4iXX0=
|