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,361 +1,361 @@
|
|
|
1
|
-
import { Component, HostListener, Input, ViewChild } from "@angular/core";
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export const DEFAULT_WARN_DB_LEVEL = -2;
|
|
4
|
-
export const MIN_DB_LEVEL = -60.0;
|
|
5
|
-
export const CONSIDERED_SILENCE_DB_LEVEL = MIN_DB_LEVEL * 2;
|
|
6
|
-
export const LINE_WIDTH = 2;
|
|
7
|
-
export const LINE_DISTANCE = 2;
|
|
8
|
-
export const LEVEL_INDICATOR_HEIGHT = 3;
|
|
9
|
-
export const OVERFLOW_THRESHOLD = 0.25;
|
|
10
|
-
export const OVERFLOW_INCR_FACTOR = 0.5;
|
|
11
|
-
export var State;
|
|
12
|
-
(function (State) {
|
|
13
|
-
State[State["LOADING"] = 0] = "LOADING";
|
|
14
|
-
State[State["RENDERING"] = 1] = "RENDERING";
|
|
15
|
-
State[State["READY"] = 2] = "READY";
|
|
16
|
-
})(State || (State = {}));
|
|
17
|
-
export class LevelBar {
|
|
18
|
-
constructor(ref, changeDetectorRef) {
|
|
19
|
-
this.ref = ref;
|
|
20
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
21
|
-
this.pixelsPerValue = LINE_DISTANCE + LINE_WIDTH;
|
|
22
|
-
this.peakDbLvl = MIN_DB_LEVEL;
|
|
23
|
-
this._streamingMode = false;
|
|
24
|
-
this._streamingFrameLength = 0;
|
|
25
|
-
this._staticLevelInfos = null;
|
|
26
|
-
this._playFramePosition = null;
|
|
27
|
-
this._state = null;
|
|
28
|
-
this.warnDBLevel = DEFAULT_WARN_DB_LEVEL;
|
|
29
|
-
this.dbValues = new Array();
|
|
30
|
-
}
|
|
31
|
-
ngAfterViewInit() {
|
|
32
|
-
this.ce = this.ref.nativeElement;
|
|
33
|
-
this.liveLevelCanvas = this.liveLevelCanvasRef.nativeElement;
|
|
34
|
-
this.markerCanvas = this.markerCanvasRef.nativeElement;
|
|
35
|
-
this.markerCanvas.style.zIndex = '4';
|
|
36
|
-
this.virtualCanvas = this.virtualCanvasRef.nativeElement;
|
|
37
|
-
this.layout();
|
|
38
|
-
this.drawAll();
|
|
39
|
-
}
|
|
40
|
-
onScroll(se) {
|
|
41
|
-
setTimeout(() => {
|
|
42
|
-
this.updateViewportPosition();
|
|
43
|
-
this.drawAll();
|
|
44
|
-
this.drawPlayPosition();
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
updateViewportPosition() {
|
|
48
|
-
// Move canvases to visible viewport position
|
|
49
|
-
let viewPortStyleLeft = this.ce.scrollLeft + 'px';
|
|
50
|
-
this.liveLevelCanvas.style.left = viewPortStyleLeft;
|
|
51
|
-
this.markerCanvas.style.left = viewPortStyleLeft;
|
|
52
|
-
}
|
|
53
|
-
set streamingMode(streamingMode) {
|
|
54
|
-
if (this._streamingMode !== streamingMode) {
|
|
55
|
-
this._streamingMode = streamingMode;
|
|
56
|
-
this.reset();
|
|
57
|
-
this.layoutStatic();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
set displayLevelInfos(levelInfos) {
|
|
61
|
-
if (levelInfos) {
|
|
62
|
-
this._staticLevelInfos = levelInfos;
|
|
63
|
-
this.dbValues = levelInfos.bufferLevelInfos.map((li) => {
|
|
64
|
-
return li.powerLevelsDB();
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
this._staticLevelInfos = null;
|
|
69
|
-
this.dbValues = new Array();
|
|
70
|
-
}
|
|
71
|
-
this.layoutStatic();
|
|
72
|
-
}
|
|
73
|
-
set state(state) {
|
|
74
|
-
this._state = state;
|
|
75
|
-
this.layoutStatic();
|
|
76
|
-
}
|
|
77
|
-
set channelCount(channelCount) {
|
|
78
|
-
this.reset();
|
|
79
|
-
}
|
|
80
|
-
set playFramePosition(playFramePosition) {
|
|
81
|
-
this._playFramePosition = playFramePosition;
|
|
82
|
-
this.drawPlayPosition();
|
|
83
|
-
}
|
|
84
|
-
onResize(event) {
|
|
85
|
-
this.layout();
|
|
86
|
-
this.drawAll();
|
|
87
|
-
}
|
|
88
|
-
layout() {
|
|
89
|
-
// set Canvas size to viewport size
|
|
90
|
-
this.liveLevelCanvas.width = this.ce.offsetWidth;
|
|
91
|
-
this.liveLevelCanvas.height = this.ce.offsetHeight;
|
|
92
|
-
this.markerCanvas.width = this.ce.offsetWidth;
|
|
93
|
-
this.markerCanvas.height = this.ce.offsetHeight;
|
|
94
|
-
// and move to viewport position
|
|
95
|
-
this.updateViewportPosition();
|
|
96
|
-
this.drawAll();
|
|
97
|
-
this.drawPlayPosition();
|
|
98
|
-
}
|
|
99
|
-
update(levelInfos) {
|
|
100
|
-
if (this._streamingMode) {
|
|
101
|
-
let dbVals = levelInfos.powerLevelsDB();
|
|
102
|
-
let peakDBVal = levelInfos.powerLevelDB();
|
|
103
|
-
this._streamingFrameLength += levelInfos.frameLength;
|
|
104
|
-
//console.debug("Update level info frameLength: "+levelInfos.frameLength+", total streaming frame length: "+this._streamingFrameLength);
|
|
105
|
-
if (this.peakDbLvl < peakDBVal) {
|
|
106
|
-
this.peakDbLvl = peakDBVal;
|
|
107
|
-
this.changeDetectorRef.detectChanges();
|
|
108
|
-
}
|
|
109
|
-
this.dbValues.push(dbVals);
|
|
110
|
-
let i = this.dbValues.length - 1;
|
|
111
|
-
let x = i * this.pixelsPerValue;
|
|
112
|
-
this.drawPushValue(x, dbVals);
|
|
113
|
-
this.checkWidth();
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
streamFinished() {
|
|
117
|
-
this.layoutStatic();
|
|
118
|
-
}
|
|
119
|
-
layoutStatic() {
|
|
120
|
-
let requiredWidth = Math.round(this.dbValues.length * this.pixelsPerValue);
|
|
121
|
-
if (this.virtualCanvas && this.ce) {
|
|
122
|
-
this.virtualCanvas.style.width = requiredWidth + 'px';
|
|
123
|
-
this.ce.scrollLeft = requiredWidth - this.ce.offsetWidth;
|
|
124
|
-
this.layout();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
checkWidth() {
|
|
128
|
-
let requiredWidth = this.dbValues.length * this.pixelsPerValue;
|
|
129
|
-
if (this.virtualCanvas.offsetWidth - requiredWidth < this.ce.offsetWidth * OVERFLOW_THRESHOLD) {
|
|
130
|
-
let newWidth = Math.floor(this.virtualCanvas.offsetWidth + (this.ce.offsetWidth * OVERFLOW_INCR_FACTOR));
|
|
131
|
-
this.virtualCanvas.style.width = newWidth + 'px';
|
|
132
|
-
this.ce.scrollLeft = newWidth - this.ce.offsetWidth;
|
|
133
|
-
// do not call layout here it is triggered by the scroll event
|
|
134
|
-
//this.layout();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
reset(stat = false) {
|
|
138
|
-
this.peakDbLvl = MIN_DB_LEVEL;
|
|
139
|
-
this.dbValues = new Array();
|
|
140
|
-
this._streamingFrameLength = 0;
|
|
141
|
-
if (stat) {
|
|
142
|
-
this.layoutStatic();
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
this.layout();
|
|
146
|
-
}
|
|
147
|
-
this.drawAll();
|
|
148
|
-
this.drawPlayPosition();
|
|
149
|
-
}
|
|
150
|
-
drawLevelBackground(g, x, h) {
|
|
151
|
-
g.strokeStyle = 'black';
|
|
152
|
-
g.fillStyle = 'black';
|
|
153
|
-
g.fillRect(x, 0, this.pixelsPerValue, h);
|
|
154
|
-
}
|
|
155
|
-
// private drawLevelLine(g: CanvasRenderingContext2D, x: number, h: number, dbVal: number) {
|
|
156
|
-
// //translate to viewport
|
|
157
|
-
// let xc = x - this.ce.scrollLeft;
|
|
158
|
-
//
|
|
159
|
-
// this.drawLevelBackground(g,xc,h);
|
|
160
|
-
// g.lineWidth = LINE_WIDTH;
|
|
161
|
-
// if (dbVal >= this.warnDBLevel) {
|
|
162
|
-
// g.strokeStyle = 'red';
|
|
163
|
-
// g.fillStyle = 'red';
|
|
164
|
-
//
|
|
165
|
-
// } else {
|
|
166
|
-
// g.strokeStyle = '#00c853';
|
|
167
|
-
// g.fillStyle = '#00c853';
|
|
168
|
-
// }
|
|
169
|
-
// g.beginPath();
|
|
170
|
-
// g.moveTo(xc, h);
|
|
171
|
-
// let pVal = ((dbVal - MIN_DB_LEVEL) / -MIN_DB_LEVEL) * h;
|
|
172
|
-
//
|
|
173
|
-
// g.lineTo(xc, h - pVal);
|
|
174
|
-
// g.closePath();
|
|
175
|
-
// g.stroke();
|
|
176
|
-
//
|
|
177
|
-
// }
|
|
178
|
-
drawLevelLines(g, x, h, dbVals) {
|
|
179
|
-
//translate to viewport
|
|
180
|
-
let xc = x - this.ce.scrollLeft;
|
|
181
|
-
this.drawLevelBackground(g, xc, h);
|
|
182
|
-
let chH = Math.floor(h / dbVals.length);
|
|
183
|
-
g.lineWidth = LINE_WIDTH;
|
|
184
|
-
for (let ch = 0; ch < dbVals.length; ch++) {
|
|
185
|
-
let dbVal = dbVals[ch];
|
|
186
|
-
let y = Math.floor(ch * chH);
|
|
187
|
-
if (dbVal >= this.warnDBLevel) {
|
|
188
|
-
g.strokeStyle = 'red';
|
|
189
|
-
g.fillStyle = 'red';
|
|
190
|
-
}
|
|
191
|
-
else if (dbVal < CONSIDERED_SILENCE_DB_LEVEL) {
|
|
192
|
-
g.strokeStyle = 'grey';
|
|
193
|
-
g.fillStyle = 'grey';
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
g.strokeStyle = '#00c853';
|
|
197
|
-
g.fillStyle = '#00c853';
|
|
198
|
-
}
|
|
199
|
-
g.beginPath();
|
|
200
|
-
g.moveTo(xc, y + chH);
|
|
201
|
-
g.lineTo(xc, y + chH - LEVEL_INDICATOR_HEIGHT);
|
|
202
|
-
let pnVal = ((dbVal - MIN_DB_LEVEL) / -MIN_DB_LEVEL);
|
|
203
|
-
let lvlIndicatorSpace = LEVEL_INDICATOR_HEIGHT + LINE_DISTANCE;
|
|
204
|
-
let levelH = chH - lvlIndicatorSpace;
|
|
205
|
-
let pVal = pnVal * levelH;
|
|
206
|
-
if (pVal > levelH - 1) {
|
|
207
|
-
pVal = levelH - 1;
|
|
208
|
-
}
|
|
209
|
-
else if (pVal < 0) {
|
|
210
|
-
pVal = 0;
|
|
211
|
-
}
|
|
212
|
-
g.moveTo(xc, y + chH - lvlIndicatorSpace);
|
|
213
|
-
g.lineTo(xc, y + chH - lvlIndicatorSpace - pVal);
|
|
214
|
-
g.closePath();
|
|
215
|
-
g.stroke();
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
drawPushValue(x, dbVals) {
|
|
219
|
-
if (this.liveLevelCanvas) {
|
|
220
|
-
let h = this.liveLevelCanvas.height;
|
|
221
|
-
let g = this.liveLevelCanvas.getContext("2d");
|
|
222
|
-
if (g) {
|
|
223
|
-
this.drawLevelLines(g, x, h, dbVals);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
drawAll() {
|
|
228
|
-
if (this.liveLevelCanvas) {
|
|
229
|
-
let w = this.liveLevelCanvas.width;
|
|
230
|
-
let h = this.liveLevelCanvas.height;
|
|
231
|
-
let g = this.liveLevelCanvas.getContext("2d");
|
|
232
|
-
if (g) {
|
|
233
|
-
// clear canvas
|
|
234
|
-
g.fillStyle = 'grey';
|
|
235
|
-
g.fillRect(0, 0, w, h);
|
|
236
|
-
g.lineWidth = LINE_WIDTH;
|
|
237
|
-
if (this.dbValues.length > 0) {
|
|
238
|
-
// draw only viewport part:
|
|
239
|
-
// draw from x1 to x2
|
|
240
|
-
let x1 = this.ce.scrollLeft;
|
|
241
|
-
let x2 = x1 + this.ce.offsetWidth;
|
|
242
|
-
// corresponds to this level values:
|
|
243
|
-
let i1 = Math.floor(x1 / this.pixelsPerValue);
|
|
244
|
-
let i2 = Math.ceil(x2 / this.pixelsPerValue);
|
|
245
|
-
// some values around
|
|
246
|
-
i1 -= 2;
|
|
247
|
-
i2 += 2;
|
|
248
|
-
// limits
|
|
249
|
-
if (i1 < 0) {
|
|
250
|
-
i1 = 0;
|
|
251
|
-
}
|
|
252
|
-
if (i2 > this.dbValues.length) {
|
|
253
|
-
i2 = this.dbValues.length;
|
|
254
|
-
}
|
|
255
|
-
let c = 0;
|
|
256
|
-
for (let i = i1; i < i2; i++) {
|
|
257
|
-
let x = i * this.pixelsPerValue;
|
|
258
|
-
let dbVals = this.dbValues[i];
|
|
259
|
-
if (dbVals) {
|
|
260
|
-
this.drawLevelLines(g, x, h, dbVals);
|
|
261
|
-
c++;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
else if (this._state !== State.READY) {
|
|
266
|
-
g.strokeStyle = 'white';
|
|
267
|
-
g.fillStyle = 'white';
|
|
268
|
-
g.font = '20px sans-serif';
|
|
269
|
-
let stateTxt = '';
|
|
270
|
-
if (this._state === State.LOADING) {
|
|
271
|
-
stateTxt = "Loading...";
|
|
272
|
-
}
|
|
273
|
-
else if (this._state === State.RENDERING) {
|
|
274
|
-
stateTxt = "Rendering...";
|
|
275
|
-
}
|
|
276
|
-
g.fillText(stateTxt, 10, 25);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
framesPerPixel() {
|
|
282
|
-
let fpp = null;
|
|
283
|
-
// one buffer
|
|
284
|
-
if (this._staticLevelInfos) {
|
|
285
|
-
let framesPerBuffer = this._staticLevelInfos.framesPerBuffer();
|
|
286
|
-
fpp = framesPerBuffer / this.pixelsPerValue;
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
if (this.dbValues && this.dbValues.length > 0) {
|
|
290
|
-
fpp = this._streamingFrameLength / (this.dbValues.length * this.pixelsPerValue);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return fpp;
|
|
294
|
-
}
|
|
295
|
-
drawPlayPosition() {
|
|
296
|
-
if (this.markerCanvas) {
|
|
297
|
-
let w = this.markerCanvas.width;
|
|
298
|
-
let h = this.markerCanvas.height;
|
|
299
|
-
let g = this.markerCanvas.getContext("2d");
|
|
300
|
-
if (g) {
|
|
301
|
-
g.clearRect(0, 0, w, h);
|
|
302
|
-
let framesPerPixel = this.framesPerPixel();
|
|
303
|
-
if (framesPerPixel && this._playFramePosition) {
|
|
304
|
-
let x = this._playFramePosition / framesPerPixel;
|
|
305
|
-
// Get position in viewport
|
|
306
|
-
let xc = x - this.ce.scrollLeft;
|
|
307
|
-
// Only draw if inside marker (viewport) canvas
|
|
308
|
-
if (xc >= 0 && xc <= w) {
|
|
309
|
-
g.fillStyle = 'red';
|
|
310
|
-
g.strokeStyle = 'red';
|
|
311
|
-
g.lineWidth = LINE_WIDTH;
|
|
312
|
-
g.beginPath();
|
|
313
|
-
// paint over all channels
|
|
314
|
-
g.moveTo(xc, 0);
|
|
315
|
-
g.lineTo(xc, h);
|
|
316
|
-
g.closePath();
|
|
317
|
-
g.stroke();
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
LevelBar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: LevelBar, selector: "audio-levelbar", inputs: { streamingMode: "streamingMode", displayLevelInfos: "displayLevelInfos", state: "state" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "virtualCanvasRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "liveLevelCanvasRef", first: true, predicate: ["levelbar"], descendants: true, static: true }, { propertyName: "markerCanvasRef", first: true, predicate: ["markerCanvas"], descendants: true, static: true }], ngImport: i0, template: `
|
|
1
|
+
import { Component, HostListener, Input, ViewChild } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export const DEFAULT_WARN_DB_LEVEL = -2;
|
|
4
|
+
export const MIN_DB_LEVEL = -60.0;
|
|
5
|
+
export const CONSIDERED_SILENCE_DB_LEVEL = MIN_DB_LEVEL * 2;
|
|
6
|
+
export const LINE_WIDTH = 2;
|
|
7
|
+
export const LINE_DISTANCE = 2;
|
|
8
|
+
export const LEVEL_INDICATOR_HEIGHT = 3;
|
|
9
|
+
export const OVERFLOW_THRESHOLD = 0.25;
|
|
10
|
+
export const OVERFLOW_INCR_FACTOR = 0.5;
|
|
11
|
+
export var State;
|
|
12
|
+
(function (State) {
|
|
13
|
+
State[State["LOADING"] = 0] = "LOADING";
|
|
14
|
+
State[State["RENDERING"] = 1] = "RENDERING";
|
|
15
|
+
State[State["READY"] = 2] = "READY";
|
|
16
|
+
})(State || (State = {}));
|
|
17
|
+
export class LevelBar {
|
|
18
|
+
constructor(ref, changeDetectorRef) {
|
|
19
|
+
this.ref = ref;
|
|
20
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
21
|
+
this.pixelsPerValue = LINE_DISTANCE + LINE_WIDTH;
|
|
22
|
+
this.peakDbLvl = MIN_DB_LEVEL;
|
|
23
|
+
this._streamingMode = false;
|
|
24
|
+
this._streamingFrameLength = 0;
|
|
25
|
+
this._staticLevelInfos = null;
|
|
26
|
+
this._playFramePosition = null;
|
|
27
|
+
this._state = null;
|
|
28
|
+
this.warnDBLevel = DEFAULT_WARN_DB_LEVEL;
|
|
29
|
+
this.dbValues = new Array();
|
|
30
|
+
}
|
|
31
|
+
ngAfterViewInit() {
|
|
32
|
+
this.ce = this.ref.nativeElement;
|
|
33
|
+
this.liveLevelCanvas = this.liveLevelCanvasRef.nativeElement;
|
|
34
|
+
this.markerCanvas = this.markerCanvasRef.nativeElement;
|
|
35
|
+
this.markerCanvas.style.zIndex = '4';
|
|
36
|
+
this.virtualCanvas = this.virtualCanvasRef.nativeElement;
|
|
37
|
+
this.layout();
|
|
38
|
+
this.drawAll();
|
|
39
|
+
}
|
|
40
|
+
onScroll(se) {
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
this.updateViewportPosition();
|
|
43
|
+
this.drawAll();
|
|
44
|
+
this.drawPlayPosition();
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
updateViewportPosition() {
|
|
48
|
+
// Move canvases to visible viewport position
|
|
49
|
+
let viewPortStyleLeft = this.ce.scrollLeft + 'px';
|
|
50
|
+
this.liveLevelCanvas.style.left = viewPortStyleLeft;
|
|
51
|
+
this.markerCanvas.style.left = viewPortStyleLeft;
|
|
52
|
+
}
|
|
53
|
+
set streamingMode(streamingMode) {
|
|
54
|
+
if (this._streamingMode !== streamingMode) {
|
|
55
|
+
this._streamingMode = streamingMode;
|
|
56
|
+
this.reset();
|
|
57
|
+
this.layoutStatic();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
set displayLevelInfos(levelInfos) {
|
|
61
|
+
if (levelInfos) {
|
|
62
|
+
this._staticLevelInfos = levelInfos;
|
|
63
|
+
this.dbValues = levelInfos.bufferLevelInfos.map((li) => {
|
|
64
|
+
return li.powerLevelsDB();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this._staticLevelInfos = null;
|
|
69
|
+
this.dbValues = new Array();
|
|
70
|
+
}
|
|
71
|
+
this.layoutStatic();
|
|
72
|
+
}
|
|
73
|
+
set state(state) {
|
|
74
|
+
this._state = state;
|
|
75
|
+
this.layoutStatic();
|
|
76
|
+
}
|
|
77
|
+
set channelCount(channelCount) {
|
|
78
|
+
this.reset();
|
|
79
|
+
}
|
|
80
|
+
set playFramePosition(playFramePosition) {
|
|
81
|
+
this._playFramePosition = playFramePosition;
|
|
82
|
+
this.drawPlayPosition();
|
|
83
|
+
}
|
|
84
|
+
onResize(event) {
|
|
85
|
+
this.layout();
|
|
86
|
+
this.drawAll();
|
|
87
|
+
}
|
|
88
|
+
layout() {
|
|
89
|
+
// set Canvas size to viewport size
|
|
90
|
+
this.liveLevelCanvas.width = this.ce.offsetWidth;
|
|
91
|
+
this.liveLevelCanvas.height = this.ce.offsetHeight;
|
|
92
|
+
this.markerCanvas.width = this.ce.offsetWidth;
|
|
93
|
+
this.markerCanvas.height = this.ce.offsetHeight;
|
|
94
|
+
// and move to viewport position
|
|
95
|
+
this.updateViewportPosition();
|
|
96
|
+
this.drawAll();
|
|
97
|
+
this.drawPlayPosition();
|
|
98
|
+
}
|
|
99
|
+
update(levelInfos) {
|
|
100
|
+
if (this._streamingMode) {
|
|
101
|
+
let dbVals = levelInfos.powerLevelsDB();
|
|
102
|
+
let peakDBVal = levelInfos.powerLevelDB();
|
|
103
|
+
this._streamingFrameLength += levelInfos.frameLength;
|
|
104
|
+
//console.debug("Update level info frameLength: "+levelInfos.frameLength+", total streaming frame length: "+this._streamingFrameLength);
|
|
105
|
+
if (this.peakDbLvl < peakDBVal) {
|
|
106
|
+
this.peakDbLvl = peakDBVal;
|
|
107
|
+
this.changeDetectorRef.detectChanges();
|
|
108
|
+
}
|
|
109
|
+
this.dbValues.push(dbVals);
|
|
110
|
+
let i = this.dbValues.length - 1;
|
|
111
|
+
let x = i * this.pixelsPerValue;
|
|
112
|
+
this.drawPushValue(x, dbVals);
|
|
113
|
+
this.checkWidth();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
streamFinished() {
|
|
117
|
+
this.layoutStatic();
|
|
118
|
+
}
|
|
119
|
+
layoutStatic() {
|
|
120
|
+
let requiredWidth = Math.round(this.dbValues.length * this.pixelsPerValue);
|
|
121
|
+
if (this.virtualCanvas && this.ce) {
|
|
122
|
+
this.virtualCanvas.style.width = requiredWidth + 'px';
|
|
123
|
+
this.ce.scrollLeft = requiredWidth - this.ce.offsetWidth;
|
|
124
|
+
this.layout();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
checkWidth() {
|
|
128
|
+
let requiredWidth = this.dbValues.length * this.pixelsPerValue;
|
|
129
|
+
if (this.virtualCanvas.offsetWidth - requiredWidth < this.ce.offsetWidth * OVERFLOW_THRESHOLD) {
|
|
130
|
+
let newWidth = Math.floor(this.virtualCanvas.offsetWidth + (this.ce.offsetWidth * OVERFLOW_INCR_FACTOR));
|
|
131
|
+
this.virtualCanvas.style.width = newWidth + 'px';
|
|
132
|
+
this.ce.scrollLeft = newWidth - this.ce.offsetWidth;
|
|
133
|
+
// do not call layout here it is triggered by the scroll event
|
|
134
|
+
//this.layout();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
reset(stat = false) {
|
|
138
|
+
this.peakDbLvl = MIN_DB_LEVEL;
|
|
139
|
+
this.dbValues = new Array();
|
|
140
|
+
this._streamingFrameLength = 0;
|
|
141
|
+
if (stat) {
|
|
142
|
+
this.layoutStatic();
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.layout();
|
|
146
|
+
}
|
|
147
|
+
this.drawAll();
|
|
148
|
+
this.drawPlayPosition();
|
|
149
|
+
}
|
|
150
|
+
drawLevelBackground(g, x, h) {
|
|
151
|
+
g.strokeStyle = 'black';
|
|
152
|
+
g.fillStyle = 'black';
|
|
153
|
+
g.fillRect(x, 0, this.pixelsPerValue, h);
|
|
154
|
+
}
|
|
155
|
+
// private drawLevelLine(g: CanvasRenderingContext2D, x: number, h: number, dbVal: number) {
|
|
156
|
+
// //translate to viewport
|
|
157
|
+
// let xc = x - this.ce.scrollLeft;
|
|
158
|
+
//
|
|
159
|
+
// this.drawLevelBackground(g,xc,h);
|
|
160
|
+
// g.lineWidth = LINE_WIDTH;
|
|
161
|
+
// if (dbVal >= this.warnDBLevel) {
|
|
162
|
+
// g.strokeStyle = 'red';
|
|
163
|
+
// g.fillStyle = 'red';
|
|
164
|
+
//
|
|
165
|
+
// } else {
|
|
166
|
+
// g.strokeStyle = '#00c853';
|
|
167
|
+
// g.fillStyle = '#00c853';
|
|
168
|
+
// }
|
|
169
|
+
// g.beginPath();
|
|
170
|
+
// g.moveTo(xc, h);
|
|
171
|
+
// let pVal = ((dbVal - MIN_DB_LEVEL) / -MIN_DB_LEVEL) * h;
|
|
172
|
+
//
|
|
173
|
+
// g.lineTo(xc, h - pVal);
|
|
174
|
+
// g.closePath();
|
|
175
|
+
// g.stroke();
|
|
176
|
+
//
|
|
177
|
+
// }
|
|
178
|
+
drawLevelLines(g, x, h, dbVals) {
|
|
179
|
+
//translate to viewport
|
|
180
|
+
let xc = x - this.ce.scrollLeft;
|
|
181
|
+
this.drawLevelBackground(g, xc, h);
|
|
182
|
+
let chH = Math.floor(h / dbVals.length);
|
|
183
|
+
g.lineWidth = LINE_WIDTH;
|
|
184
|
+
for (let ch = 0; ch < dbVals.length; ch++) {
|
|
185
|
+
let dbVal = dbVals[ch];
|
|
186
|
+
let y = Math.floor(ch * chH);
|
|
187
|
+
if (dbVal >= this.warnDBLevel) {
|
|
188
|
+
g.strokeStyle = 'red';
|
|
189
|
+
g.fillStyle = 'red';
|
|
190
|
+
}
|
|
191
|
+
else if (dbVal < CONSIDERED_SILENCE_DB_LEVEL) {
|
|
192
|
+
g.strokeStyle = 'grey';
|
|
193
|
+
g.fillStyle = 'grey';
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
g.strokeStyle = '#00c853';
|
|
197
|
+
g.fillStyle = '#00c853';
|
|
198
|
+
}
|
|
199
|
+
g.beginPath();
|
|
200
|
+
g.moveTo(xc, y + chH);
|
|
201
|
+
g.lineTo(xc, y + chH - LEVEL_INDICATOR_HEIGHT);
|
|
202
|
+
let pnVal = ((dbVal - MIN_DB_LEVEL) / -MIN_DB_LEVEL);
|
|
203
|
+
let lvlIndicatorSpace = LEVEL_INDICATOR_HEIGHT + LINE_DISTANCE;
|
|
204
|
+
let levelH = chH - lvlIndicatorSpace;
|
|
205
|
+
let pVal = pnVal * levelH;
|
|
206
|
+
if (pVal > levelH - 1) {
|
|
207
|
+
pVal = levelH - 1;
|
|
208
|
+
}
|
|
209
|
+
else if (pVal < 0) {
|
|
210
|
+
pVal = 0;
|
|
211
|
+
}
|
|
212
|
+
g.moveTo(xc, y + chH - lvlIndicatorSpace);
|
|
213
|
+
g.lineTo(xc, y + chH - lvlIndicatorSpace - pVal);
|
|
214
|
+
g.closePath();
|
|
215
|
+
g.stroke();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
drawPushValue(x, dbVals) {
|
|
219
|
+
if (this.liveLevelCanvas) {
|
|
220
|
+
let h = this.liveLevelCanvas.height;
|
|
221
|
+
let g = this.liveLevelCanvas.getContext("2d");
|
|
222
|
+
if (g) {
|
|
223
|
+
this.drawLevelLines(g, x, h, dbVals);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
drawAll() {
|
|
228
|
+
if (this.liveLevelCanvas) {
|
|
229
|
+
let w = this.liveLevelCanvas.width;
|
|
230
|
+
let h = this.liveLevelCanvas.height;
|
|
231
|
+
let g = this.liveLevelCanvas.getContext("2d");
|
|
232
|
+
if (g) {
|
|
233
|
+
// clear canvas
|
|
234
|
+
g.fillStyle = 'grey';
|
|
235
|
+
g.fillRect(0, 0, w, h);
|
|
236
|
+
g.lineWidth = LINE_WIDTH;
|
|
237
|
+
if (this.dbValues.length > 0) {
|
|
238
|
+
// draw only viewport part:
|
|
239
|
+
// draw from x1 to x2
|
|
240
|
+
let x1 = this.ce.scrollLeft;
|
|
241
|
+
let x2 = x1 + this.ce.offsetWidth;
|
|
242
|
+
// corresponds to this level values:
|
|
243
|
+
let i1 = Math.floor(x1 / this.pixelsPerValue);
|
|
244
|
+
let i2 = Math.ceil(x2 / this.pixelsPerValue);
|
|
245
|
+
// some values around
|
|
246
|
+
i1 -= 2;
|
|
247
|
+
i2 += 2;
|
|
248
|
+
// limits
|
|
249
|
+
if (i1 < 0) {
|
|
250
|
+
i1 = 0;
|
|
251
|
+
}
|
|
252
|
+
if (i2 > this.dbValues.length) {
|
|
253
|
+
i2 = this.dbValues.length;
|
|
254
|
+
}
|
|
255
|
+
let c = 0;
|
|
256
|
+
for (let i = i1; i < i2; i++) {
|
|
257
|
+
let x = i * this.pixelsPerValue;
|
|
258
|
+
let dbVals = this.dbValues[i];
|
|
259
|
+
if (dbVals) {
|
|
260
|
+
this.drawLevelLines(g, x, h, dbVals);
|
|
261
|
+
c++;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else if (this._state !== State.READY) {
|
|
266
|
+
g.strokeStyle = 'white';
|
|
267
|
+
g.fillStyle = 'white';
|
|
268
|
+
g.font = '20px sans-serif';
|
|
269
|
+
let stateTxt = '';
|
|
270
|
+
if (this._state === State.LOADING) {
|
|
271
|
+
stateTxt = "Loading...";
|
|
272
|
+
}
|
|
273
|
+
else if (this._state === State.RENDERING) {
|
|
274
|
+
stateTxt = "Rendering...";
|
|
275
|
+
}
|
|
276
|
+
g.fillText(stateTxt, 10, 25);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
framesPerPixel() {
|
|
282
|
+
let fpp = null;
|
|
283
|
+
// one buffer
|
|
284
|
+
if (this._staticLevelInfos) {
|
|
285
|
+
let framesPerBuffer = this._staticLevelInfos.framesPerBuffer();
|
|
286
|
+
fpp = framesPerBuffer / this.pixelsPerValue;
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
if (this.dbValues && this.dbValues.length > 0) {
|
|
290
|
+
fpp = this._streamingFrameLength / (this.dbValues.length * this.pixelsPerValue);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return fpp;
|
|
294
|
+
}
|
|
295
|
+
drawPlayPosition() {
|
|
296
|
+
if (this.markerCanvas) {
|
|
297
|
+
let w = this.markerCanvas.width;
|
|
298
|
+
let h = this.markerCanvas.height;
|
|
299
|
+
let g = this.markerCanvas.getContext("2d");
|
|
300
|
+
if (g) {
|
|
301
|
+
g.clearRect(0, 0, w, h);
|
|
302
|
+
let framesPerPixel = this.framesPerPixel();
|
|
303
|
+
if (framesPerPixel && this._playFramePosition) {
|
|
304
|
+
let x = this._playFramePosition / framesPerPixel;
|
|
305
|
+
// Get position in viewport
|
|
306
|
+
let xc = x - this.ce.scrollLeft;
|
|
307
|
+
// Only draw if inside marker (viewport) canvas
|
|
308
|
+
if (xc >= 0 && xc <= w) {
|
|
309
|
+
g.fillStyle = 'red';
|
|
310
|
+
g.strokeStyle = 'red';
|
|
311
|
+
g.lineWidth = LINE_WIDTH;
|
|
312
|
+
g.beginPath();
|
|
313
|
+
// paint over all channels
|
|
314
|
+
g.moveTo(xc, 0);
|
|
315
|
+
g.lineTo(xc, h);
|
|
316
|
+
g.closePath();
|
|
317
|
+
g.stroke();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: LevelBar, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
324
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: LevelBar, selector: "audio-levelbar", inputs: { streamingMode: "streamingMode", displayLevelInfos: "displayLevelInfos", state: "state" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "virtualCanvasRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "liveLevelCanvasRef", first: true, predicate: ["levelbar"], descendants: true, static: true }, { propertyName: "markerCanvasRef", first: true, predicate: ["markerCanvas"], descendants: true, static: true }], ngImport: i0, template: `
|
|
326
325
|
<div #virtualCanvas>
|
|
327
326
|
<canvas #levelbar></canvas>
|
|
328
327
|
<canvas #markerCanvas></canvas>
|
|
329
328
|
</div>
|
|
330
|
-
`, isInline: true, styles: [":host{width:100%;background:darkgray;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "div{top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n", "canvas{top:0;left:0;width:100%;height:100%;position:absolute}\n"] });
|
|
331
|
-
|
|
332
|
-
|
|
329
|
+
`, isInline: true, styles: [":host{width:100%;background:darkgray;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "div{top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n", "canvas{top:0;left:0;width:100%;height:100%;position:absolute}\n"] }); }
|
|
330
|
+
}
|
|
331
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: LevelBar, decorators: [{
|
|
332
|
+
type: Component,
|
|
333
333
|
args: [{ selector: 'audio-levelbar', template: `
|
|
334
334
|
<div #virtualCanvas>
|
|
335
335
|
<canvas #levelbar></canvas>
|
|
336
336
|
<canvas #markerCanvas></canvas>
|
|
337
337
|
</div>
|
|
338
|
-
`, styles: [":host{width:100%;background:darkgray;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "div{top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n", "canvas{top:0;left:0;width:100%;height:100%;position:absolute}\n"] }]
|
|
339
|
-
}], ctorParameters:
|
|
340
|
-
type: ViewChild,
|
|
341
|
-
args: ['virtualCanvas', { static: true }]
|
|
342
|
-
}], liveLevelCanvasRef: [{
|
|
343
|
-
type: ViewChild,
|
|
344
|
-
args: ['levelbar', { static: true }]
|
|
345
|
-
}], markerCanvasRef: [{
|
|
346
|
-
type: ViewChild,
|
|
347
|
-
args: ['markerCanvas', { static: true }]
|
|
348
|
-
}], onScroll: [{
|
|
349
|
-
type: HostListener,
|
|
350
|
-
args: ['scroll', ['$event']]
|
|
351
|
-
}], streamingMode: [{
|
|
352
|
-
type: Input
|
|
353
|
-
}], displayLevelInfos: [{
|
|
354
|
-
type: Input
|
|
355
|
-
}], state: [{
|
|
356
|
-
type: Input
|
|
357
|
-
}], onResize: [{
|
|
358
|
-
type: HostListener,
|
|
359
|
-
args: ['window:resize', ['$event']]
|
|
360
|
-
}] } });
|
|
361
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZWxldmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2xpdmVsZXZlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1DLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQTs7QUFHckgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFlBQVksR0FBQyxDQUFDLENBQUM7QUFDMUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUM1QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFDLENBQUMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRXhDLE1BQU0sQ0FBTixJQUFZLEtBQStCO0FBQTNDLFdBQVksS0FBSztJQUFFLHVDQUFPLENBQUE7SUFBQywyQ0FBUyxDQUFBO0lBQUMsbUNBQUssQ0FBQTtBQUFBLENBQUMsRUFBL0IsS0FBSyxLQUFMLEtBQUssUUFBMEI7QUFxQzNDLE1BQU0sT0FBTyxRQUFRO0lBb0JuQixZQUFvQixHQUFlLEVBQVUsaUJBQW9DO1FBQTdELFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBVnpFLG1CQUFjLEdBQVEsYUFBYSxHQUFDLFVBQVUsQ0FBQztRQUN2RCxjQUFTLEdBQUcsWUFBWSxDQUFDO1FBQ2pCLG1C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QUFDLFFBQVEsQ0FBQztnQkFpQjlCLGFBQWE7c0JBRGhCLEtBQUs7Z0JBVUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQWVGLEtBQUs7c0JBRFIsS0FBSztnQkFnQk4sUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgVmlld0NoaWxkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXHJcbmltcG9ydCB7TGV2ZWxJbmZvLCBMZXZlbEluZm9zLCBMZXZlbExpc3RlbmVyfSBmcm9tIFwiLi4vZHNwL2xldmVsX21lYXN1cmVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBUk5fREJfTEVWRUwgPSAtMjtcclxuZXhwb3J0IGNvbnN0IE1JTl9EQl9MRVZFTCA9IC02MC4wO1xyXG5leHBvcnQgY29uc3QgQ09OU0lERVJFRF9TSUxFTkNFX0RCX0xFVkVMID0gTUlOX0RCX0xFVkVMKjI7XHJcbmV4cG9ydCBjb25zdCBMSU5FX1dJRFRIID0gMjtcclxuZXhwb3J0IGNvbnN0IExJTkVfRElTVEFOQ0UgPSAyO1xyXG5leHBvcnQgY29uc3QgTEVWRUxfSU5ESUNBVE9SX0hFSUdIVD0zO1xyXG5cclxuZXhwb3J0IGNvbnN0IE9WRVJGTE9XX1RIUkVTSE9MRCA9IDAuMjU7XHJcbmV4cG9ydCBjb25zdCBPVkVSRkxPV19JTkNSX0ZBQ1RPUiA9IDAuNTtcclxuXHJcbmV4cG9ydCBlbnVtIFN0YXRlIHtMT0FESU5HLFJFTkRFUklORyxSRUFEWX1cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLWxldmVsYmFyJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiAjdmlydHVhbENhbnZhcz5cclxuICAgICAgPGNhbnZhcyAjbGV2ZWxiYXI+PC9jYW52YXM+XHJcbiAgICAgIDxjYW52YXMgI21hcmtlckNhbnZhcz48L2NhbnZhcz5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuXHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJhY2tncm91bmQ6IGRhcmtncmF5O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgfWAsIGBkaXYge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG5cclxuICAgIC8qcG9zaXRpb246IGFic29sdXRlOyovXHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIH1gLCBgY2FudmFzIHtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMZXZlbEJhciBpbXBsZW1lbnRzIExldmVsTGlzdGVuZXIsQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpcnR1YWxDYW52YXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSB2aXJ0dWFsQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICB2aXJ0dWFsQ2FudmFzITogSFRNTERpdkVsZW1lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnbGV2ZWxiYXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBsaXZlTGV2ZWxDYW52YXNSZWYhOiBFbGVtZW50UmVmO1xyXG4gIGxpdmVMZXZlbENhbnZhcyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ21hcmtlckNhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIG1hcmtlckNhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgbWFya2VyQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuICBkYlZhbHVlczogQXJyYXk8QXJyYXk8bnVtYmVyPj47XHJcbiAgcHJpdmF0ZSBwaXhlbHNQZXJWYWx1ZTpudW1iZXI9TElORV9ESVNUQU5DRStMSU5FX1dJRFRIO1xyXG4gIHBlYWtEYkx2bCA9IE1JTl9EQl9MRVZFTDtcclxuICBwcml2YXRlIF9zdHJlYW1pbmdNb2RlID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc3RyZWFtaW5nRnJhbWVMZW5ndGg9MDtcclxuICBwcml2YXRlIF9zdGF0aWNMZXZlbEluZm9zOiBMZXZlbEluZm9zIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGxheUZyYW1lUG9zaXRpb246IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBfc3RhdGU6U3RhdGV8bnVsbD1udWxsO1xyXG5cclxuICB3YXJuREJMZXZlbCA9IERFRkFVTFRfV0FSTl9EQl9MRVZFTDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICB0aGlzLmRiVmFsdWVzID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNlID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMubGl2ZUxldmVsQ2FudmFzID0gdGhpcy5saXZlTGV2ZWxDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMubWFya2VyQ2FudmFzID0gdGhpcy5tYXJrZXJDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMubWFya2VyQ2FudmFzLnN0eWxlLnpJbmRleCA9ICc0JztcclxuICAgIHRoaXMudmlydHVhbENhbnZhcyA9IHRoaXMudmlydHVhbENhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICAgIHRoaXMuZHJhd0FsbCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3Njcm9sbCcsIFsnJGV2ZW50J10pXHJcbiAgb25TY3JvbGwoc2U6IEV2ZW50KSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0UG9zaXRpb24oKTtcclxuICAgICAgICAgIHRoaXMuZHJhd0FsbCgpO1xyXG4gICAgICAgICAgdGhpcy5kcmF3UGxheVBvc2l0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVWaWV3cG9ydFBvc2l0aW9uKCl7XHJcbiAgICAvLyBNb3ZlIGNhbnZhc2VzIHRvIHZpc2libGUgdmlld3BvcnQgcG9zaXRpb25cclxuICAgIGxldCB2aWV3UG9ydFN0eWxlTGVmdD10aGlzLmNlLnNjcm9sbExlZnQgKyAncHgnO1xyXG4gICAgdGhpcy5saXZlTGV2ZWxDYW52YXMuc3R5bGUubGVmdCA9IHZpZXdQb3J0U3R5bGVMZWZ0O1xyXG4gICAgdGhpcy5tYXJrZXJDYW52YXMuc3R5bGUubGVmdCA9IHZpZXdQb3J0U3R5bGVMZWZ0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc3RyZWFtaW5nTW9kZShzdHJlYW1pbmdNb2RlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fc3RyZWFtaW5nTW9kZSAhPT0gc3RyZWFtaW5nTW9kZSkge1xyXG4gICAgICB0aGlzLl9zdHJlYW1pbmdNb2RlID0gc3RyZWFtaW5nTW9kZTtcclxuICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICB0aGlzLmxheW91dFN0YXRpYygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgZGlzcGxheUxldmVsSW5mb3MobGV2ZWxJbmZvczogTGV2ZWxJbmZvcyB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmIChsZXZlbEluZm9zKSB7XHJcbiAgICAgIHRoaXMuX3N0YXRpY0xldmVsSW5mb3MgPSBsZXZlbEluZm9zO1xyXG4gICAgICB0aGlzLmRiVmFsdWVzID0gbGV2ZWxJbmZvcy5idWZmZXJMZXZlbEluZm9zLm1hcCgobGkpID0+IHtcclxuICAgICAgICByZXR1cm4gbGkucG93ZXJMZXZlbHNEQigpXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc3RhdGljTGV2ZWxJbmZvcyA9bnVsbDtcclxuICAgICAgICB0aGlzLmRiVmFsdWVzID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmxheW91dFN0YXRpYygpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc3RhdGUoc3RhdGU6U3RhdGUpe1xyXG4gICB0aGlzLl9zdGF0ZT1zdGF0ZTtcclxuICAgdGhpcy5sYXlvdXRTdGF0aWMoKTtcclxuICB9XHJcblxyXG4gIHNldCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihwbGF5RnJhbWVQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbiA9IHBsYXlGcmFtZVBvc2l0aW9uO1xyXG4gICAgdGhpcy5kcmF3UGxheVBvc2l0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgdGhpcy5kcmF3QWxsKCk7XHJcbiAgfVxyXG5cclxuICBsYXlvdXQoKSB7XHJcblxyXG4gICAgLy8gc2V0IENhbnZhcyBzaXplIHRvIHZpZXdwb3J0IHNpemVcclxuICAgIHRoaXMubGl2ZUxldmVsQ2FudmFzLndpZHRoID0gdGhpcy5jZS5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMubGl2ZUxldmVsQ2FudmFzLmhlaWdodCA9IHRoaXMuY2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIHRoaXMubWFya2VyQ2FudmFzLndpZHRoID0gdGhpcy5jZS5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMubWFya2VyQ2FudmFzLmhlaWdodCA9IHRoaXMuY2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIC8vIGFuZCBtb3ZlIHRvIHZpZXdwb3J0IHBvc2l0aW9uXHJcbiAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0UG9zaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLmRyYXdBbGwoKTtcclxuICAgIHRoaXMuZHJhd1BsYXlQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGxldmVsSW5mb3M6IExldmVsSW5mbykge1xyXG4gICAgaWYgKHRoaXMuX3N0cmVhbWluZ01vZGUpIHtcclxuICAgICAgbGV0IGRiVmFscyA9IGxldmVsSW5mb3MucG93ZXJMZXZlbHNEQigpO1xyXG4gICAgICBsZXQgcGVha0RCVmFsID0gbGV2ZWxJbmZvcy5wb3dlckxldmVsREIoKTtcclxuICAgICAgdGhpcy5fc3RyZWFtaW5nRnJhbWVMZW5ndGgrPWxldmVsSW5mb3MuZnJhbWVMZW5ndGg7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwZGF0ZSBsZXZlbCBpbmZvIGZyYW1lTGVuZ3RoOiBcIitsZXZlbEluZm9zLmZyYW1lTGVuZ3RoK1wiLCB0b3RhbCBzdHJlYW1pbmcgZnJhbWUgbGVuZ3RoOiBcIit0aGlzLl9zdHJlYW1pbmdGcmFtZUxlbmd0aCk7XHJcbiAgICAgIGlmICh0aGlzLnBlYWtEYkx2bCA8IHBlYWtEQlZhbCkge1xyXG4gICAgICAgIHRoaXMucGVha0RiTHZsID0gcGVha0RCVmFsO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGJWYWx1ZXMucHVzaChkYlZhbHMpO1xyXG4gICAgICBsZXQgaSA9IHRoaXMuZGJWYWx1ZXMubGVuZ3RoIC0gMTtcclxuICAgICAgbGV0IHggPSBpICogdGhpcy5waXhlbHNQZXJWYWx1ZTtcclxuICAgICAgdGhpcy5kcmF3UHVzaFZhbHVlKHgsIGRiVmFscyk7XHJcbiAgICAgIHRoaXMuY2hlY2tXaWR0aCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RyZWFtRmluaXNoZWQoKSB7XHJcbiAgICB0aGlzLmxheW91dFN0YXRpYygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsYXlvdXRTdGF0aWMoKSB7XHJcblxyXG4gICAgbGV0IHJlcXVpcmVkV2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuZGJWYWx1ZXMubGVuZ3RoICogdGhpcy5waXhlbHNQZXJWYWx1ZSk7XHJcbiAgICBpZiAodGhpcy52aXJ0dWFsQ2FudmFzICYmIHRoaXMuY2UpIHtcclxuXHJcbiAgICAgIHRoaXMudmlydHVhbENhbnZhcy5zdHlsZS53aWR0aCA9IHJlcXVpcmVkV2lkdGggKyAncHgnO1xyXG4gICAgICB0aGlzLmNlLnNjcm9sbExlZnQgPSByZXF1aXJlZFdpZHRoIC0gdGhpcy5jZS5vZmZzZXRXaWR0aDtcclxuICAgICAgdGhpcy5sYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrV2lkdGgoKSB7XHJcbiAgICBsZXQgcmVxdWlyZWRXaWR0aCA9IHRoaXMuZGJWYWx1ZXMubGVuZ3RoKnRoaXMucGl4ZWxzUGVyVmFsdWU7XHJcbiAgICBpZiAodGhpcy52aXJ0dWFsQ2FudmFzLm9mZnNldFdpZHRoIC0gcmVxdWlyZWRXaWR0aCA8IHRoaXMuY2Uub2Zmc2V0V2lkdGggKiBPVkVSRkxPV19USFJFU0hPTEQpIHtcclxuICAgICAgbGV0IG5ld1dpZHRoID0gTWF0aC5mbG9vcih0aGlzLnZpcnR1YWxDYW52YXMub2Zmc2V0V2lkdGggKyAodGhpcy5jZS5vZmZzZXRXaWR0aCAqIE9WRVJGTE9XX0lOQ1JfRkFDVE9SKSk7XHJcbiAgICAgIHRoaXMudmlydHVhbENhbnZhcy5zdHlsZS53aWR0aCA9IG5ld1dpZHRoICsgJ3B4JztcclxuICAgICAgdGhpcy5jZS5zY3JvbGxMZWZ0ID0gbmV3V2lkdGggLSB0aGlzLmNlLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgIC8vIGRvIG5vdCBjYWxsIGxheW91dCBoZXJlIGl0IGlzIHRyaWdnZXJlZCBieSB0aGUgc2Nyb2xsIGV2ZW50XHJcbiAgICAgIC8vdGhpcy5sYXlvdXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KHN0YXQ9ZmFsc2UpIHtcclxuICAgIHRoaXMucGVha0RiTHZsID0gTUlOX0RCX0xFVkVMO1xyXG4gICAgdGhpcy5kYlZhbHVlcyA9IG5ldyBBcnJheTxBcnJheTxudW1iZXI+PigpO1xyXG4gICAgdGhpcy5fc3RyZWFtaW5nRnJhbWVMZW5ndGg9MDtcclxuICAgIGlmKHN0YXQpe1xyXG4gICAgICB0aGlzLmxheW91dFN0YXRpYygpO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kcmF3QWxsKCk7XHJcbiAgICB0aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGRyYXdMZXZlbEJhY2tncm91bmQoZzogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCB4OiBudW1iZXIsIGg6IG51bWJlcil7XHJcbiAgICBnLnN0cm9rZVN0eWxlID0gJ2JsYWNrJztcclxuICAgIGcuZmlsbFN0eWxlID0gJ2JsYWNrJztcclxuICAgIGcuZmlsbFJlY3QoeCwwLHRoaXMucGl4ZWxzUGVyVmFsdWUsaClcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgZHJhd0xldmVsTGluZShnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHg6IG51bWJlciwgaDogbnVtYmVyLCBkYlZhbDogbnVtYmVyKSB7XHJcbiAgLy8gICAvL3RyYW5zbGF0ZSB0byB2aWV3cG9ydFxyXG4gIC8vICAgbGV0IHhjID0geCAtIHRoaXMuY2Uuc2Nyb2xsTGVmdDtcclxuICAvL1xyXG4gIC8vICAgdGhpcy5kcmF3TGV2ZWxCYWNrZ3JvdW5kKGcseGMsaCk7XHJcbiAgLy8gICBnLmxpbmVXaWR0aCA9IExJTkVfV0lEVEg7XHJcbiAgLy8gICBpZiAoZGJWYWwgPj0gdGhpcy53YXJuREJMZXZlbCkge1xyXG4gIC8vICAgICBnLnN0cm9rZVN0eWxlID0gJ3JlZCc7XHJcbiAgLy8gICAgIGcuZmlsbFN0eWxlID0gJ3JlZCc7XHJcbiAgLy9cclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIGcuc3Ryb2tlU3R5bGUgPSAnIzAwYzg1Myc7XHJcbiAgLy8gICAgIGcuZmlsbFN0eWxlID0gJyMwMGM4NTMnO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZy5iZWdpblBhdGgoKTtcclxuICAvLyAgIGcubW92ZVRvKHhjLCBoKTtcclxuICAvLyAgIGxldCBwVmFsID0gKChkYlZhbCAtIE1JTl9EQl9MRVZFTCkgLyAtTUlOX0RCX0xFVkVMKSAqIGg7XHJcbiAgLy9cclxuICAvLyAgIGcubGluZVRvKHhjLCBoIC0gcFZhbCk7XHJcbiAgLy8gICBnLmNsb3NlUGF0aCgpO1xyXG4gIC8vICAgZy5zdHJva2UoKTtcclxuICAvL1xyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3TGV2ZWxMaW5lcyhnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHg6IG51bWJlciwgaDogbnVtYmVyLCBkYlZhbHM6IEFycmF5PG51bWJlcj4pIHtcclxuICAgIC8vdHJhbnNsYXRlIHRvIHZpZXdwb3J0XHJcbiAgICBsZXQgeGMgPSB4IC0gdGhpcy5jZS5zY3JvbGxMZWZ0O1xyXG4gICAgdGhpcy5kcmF3TGV2ZWxCYWNrZ3JvdW5kKGcseGMsaCk7XHJcblxyXG4gICAgbGV0IGNoSCA9IE1hdGguZmxvb3IoaCAvIGRiVmFscy5sZW5ndGgpO1xyXG4gICAgZy5saW5lV2lkdGggPSBMSU5FX1dJRFRIO1xyXG4gICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGRiVmFscy5sZW5ndGg7IGNoKyspIHtcclxuICAgICAgbGV0IGRiVmFsID0gZGJWYWxzW2NoXTtcclxuXHJcbiAgICAgIGxldCB5ID0gTWF0aC5mbG9vcihjaCAqIGNoSCk7XHJcbiAgICAgIGlmIChkYlZhbCA+PSB0aGlzLndhcm5EQkxldmVsKSB7XHJcbiAgICAgICAgZy5zdHJva2VTdHlsZSA9ICdyZWQnO1xyXG4gICAgICAgIGcuZmlsbFN0eWxlID0gJ3JlZCc7XHJcbiAgICAgIH0gZWxzZSBpZihkYlZhbCA8IENPTlNJREVSRURfU0lMRU5DRV9EQl9MRVZFTCkge1xyXG4gICAgICAgIGcuc3Ryb2tlU3R5bGU9J2dyZXknO1xyXG4gICAgICAgIGcuZmlsbFN0eWxlPSdncmV5J1xyXG4gICAgICB9IGVsc2V7XHJcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJyMwMGM4NTMnO1xyXG4gICAgICAgICAgZy5maWxsU3R5bGUgPSAnIzAwYzg1MydcclxuICAgICAgfVxyXG4gICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICBnLm1vdmVUbyh4YywgeSArIGNoSCk7XHJcbiAgICAgIGcubGluZVRvKHhjLCB5ICsgY2hIIC0gTEVWRUxfSU5ESUNBVE9SX0hFSUdIVCk7XHJcbiAgICAgIGxldCBwblZhbD0oKGRiVmFsIC0gTUlOX0RCX0xFVkVMKSAvIC1NSU5fREJfTEVWRUwpO1xyXG4gICAgICBsZXQgbHZsSW5kaWNhdG9yU3BhY2U9TEVWRUxfSU5ESUNBVE9SX0hFSUdIVCtMSU5FX0RJU1RBTkNFO1xyXG4gICAgICBsZXQgbGV2ZWxIPWNoSC1sdmxJbmRpY2F0b3JTcGFjZTtcclxuICAgICAgbGV0IHBWYWwgPSBwblZhbCAqIGxldmVsSDtcclxuICAgICAgaWYocFZhbD5sZXZlbEgtMSl7XHJcbiAgICAgICAgcFZhbD1sZXZlbEgtMVxyXG4gICAgICB9ZWxzZSBpZihwVmFsPDApe1xyXG4gICAgICAgIHBWYWw9MFxyXG4gICAgICB9XHJcbiAgICAgIGcubW92ZVRvKHhjLCB5ICsgY2hIIC0gbHZsSW5kaWNhdG9yU3BhY2UgKTtcclxuICAgICAgZy5saW5lVG8oeGMsIHkgKyBjaEggLSBsdmxJbmRpY2F0b3JTcGFjZSAtIHBWYWwpO1xyXG4gICAgICBnLmNsb3NlUGF0aCgpO1xyXG4gICAgICBnLnN0cm9rZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3UHVzaFZhbHVlKHg6IG51bWJlciwgZGJWYWxzOiBBcnJheTxudW1iZXI+KSB7XHJcblxyXG4gICAgaWYgKHRoaXMubGl2ZUxldmVsQ2FudmFzKSB7XHJcbiAgICAgIGxldCBoID0gdGhpcy5saXZlTGV2ZWxDYW52YXMuaGVpZ2h0O1xyXG4gICAgICBsZXQgZyA9IHRoaXMubGl2ZUxldmVsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgaWYgKGcpIHtcclxuICAgICAgICB0aGlzLmRyYXdMZXZlbExpbmVzKGcsIHgsIGgsIGRiVmFscyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgIGRyYXdBbGwoKSB7XHJcbiAgICBpZiAodGhpcy5saXZlTGV2ZWxDYW52YXMpIHtcclxuICAgICAgbGV0IHcgPSB0aGlzLmxpdmVMZXZlbENhbnZhcy53aWR0aDtcclxuICAgICAgbGV0IGggPSB0aGlzLmxpdmVMZXZlbENhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGxldCBnID0gdGhpcy5saXZlTGV2ZWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBpZiAoZykge1xyXG4gICAgICAgIC8vIGNsZWFyIGNhbnZhc1xyXG4gICAgICAgIGcuZmlsbFN0eWxlID0gJ2dyZXknO1xyXG4gICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcblxyXG4gICAgICAgIGcubGluZVdpZHRoID0gTElORV9XSURUSDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGJWYWx1ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgLy8gZHJhdyBvbmx5IHZpZXdwb3J0IHBhcnQ6XHJcblxyXG4gICAgICAgICAgLy8gZHJhdyBmcm9tIHgxIHRvIHgyXHJcbiAgICAgICAgICBsZXQgeDEgPSB0aGlzLmNlLnNjcm9sbExlZnQ7XHJcbiAgICAgICAgICBsZXQgeDIgPSB4MSArIHRoaXMuY2Uub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gdGhpcyBsZXZlbCB2YWx1ZXM6XHJcbiAgICAgICAgICBsZXQgaTEgPSBNYXRoLmZsb29yKHgxIC8gdGhpcy5waXhlbHNQZXJWYWx1ZSk7XHJcbiAgICAgICAgICBsZXQgaTIgPSBNYXRoLmNlaWwoeDIgL3RoaXMucGl4ZWxzUGVyVmFsdWUpO1xyXG4gICAgICAgICAgLy8gc29tZSB2YWx1ZXMgYXJvdW5kXHJcbiAgICAgICAgICBpMSAtPSAyO1xyXG4gICAgICAgICAgaTIgKz0gMjtcclxuICAgICAgICAgIC8vIGxpbWl0c1xyXG4gICAgICAgICAgaWYgKGkxIDwgMCkge1xyXG4gICAgICAgICAgICBpMSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaTIgPiB0aGlzLmRiVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpMiA9IHRoaXMuZGJWYWx1ZXMubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBjPTA7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gaTE7IGkgPCBpMjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHggPSBpICogdGhpcy5waXhlbHNQZXJWYWx1ZTtcclxuICAgICAgICAgICAgICBsZXQgZGJWYWxzID0gdGhpcy5kYlZhbHVlc1tpXTtcclxuICAgICAgICAgICAgICBpZiAoZGJWYWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0xldmVsTGluZXMoZywgeCwgaCwgZGJWYWxzKTtcclxuICAgICAgICAgICAgICAgICAgYysrO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYodGhpcy5fc3RhdGUhPT1TdGF0ZS5SRUFEWSl7XHJcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ3doaXRlJztcclxuICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3doaXRlJztcclxuICAgICAgICAgIGcuZm9udCA9ICcyMHB4IHNhbnMtc2VyaWYnO1xyXG5cclxuICAgICAgICAgIGxldCBzdGF0ZVR4dD0nJztcclxuXHJcbiAgICAgICAgICBpZih0aGlzLl9zdGF0ZT09PVN0YXRlLkxPQURJTkcpe1xyXG4gICAgICAgICAgICBzdGF0ZVR4dD1cIkxvYWRpbmcuLi5cIjtcclxuICAgICAgICAgIH1lbHNlIGlmKHRoaXMuX3N0YXRlPT09U3RhdGUuUkVOREVSSU5HKXtcclxuICAgICAgICAgICAgc3RhdGVUeHQ9XCJSZW5kZXJpbmcuLi5cIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGcuZmlsbFRleHQoc3RhdGVUeHQsIDEwLCAyNSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZnJhbWVzUGVyUGl4ZWwoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBsZXQgZnBwOm51bWJlcnxudWxsPW51bGw7XHJcbiAgICAvLyBvbmUgYnVmZmVyXHJcbiAgICBpZiAodGhpcy5fc3RhdGljTGV2ZWxJbmZvcykge1xyXG4gICAgICBsZXQgZnJhbWVzUGVyQnVmZmVyID0gdGhpcy5fc3RhdGljTGV2ZWxJbmZvcy5mcmFtZXNQZXJCdWZmZXIoKTtcclxuICAgICAgZnBwPWZyYW1lc1BlckJ1ZmZlciAvIHRoaXMucGl4ZWxzUGVyVmFsdWU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYodGhpcy5kYlZhbHVlcyAmJiB0aGlzLmRiVmFsdWVzLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgZnBwPXRoaXMuX3N0cmVhbWluZ0ZyYW1lTGVuZ3RoIC8gKHRoaXMuZGJWYWx1ZXMubGVuZ3RoKnRoaXMucGl4ZWxzUGVyVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnBwO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZHJhd1BsYXlQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1hcmtlckNhbnZhcykge1xyXG4gICAgICBsZXQgdyA9IHRoaXMubWFya2VyQ2FudmFzLndpZHRoO1xyXG4gICAgICBsZXQgaCA9IHRoaXMubWFya2VyQ2FudmFzLmhlaWdodDtcclxuICAgICAgbGV0IGcgPSB0aGlzLm1hcmtlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gdGhpcy5mcmFtZXNQZXJQaXhlbCgpO1xyXG4gICAgICAgIGlmIChmcmFtZXNQZXJQaXhlbCAmJiB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbikge1xyXG4gICAgICAgICAgbGV0IHggPSB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbiAvIGZyYW1lc1BlclBpeGVsO1xyXG5cclxuICAgICAgICAgIC8vIEdldCBwb3NpdGlvbiBpbiB2aWV3cG9ydFxyXG4gICAgICAgICAgbGV0IHhjID0geCAtIHRoaXMuY2Uuc2Nyb2xsTGVmdDtcclxuICAgICAgICAgIC8vIE9ubHkgZHJhdyBpZiBpbnNpZGUgbWFya2VyICh2aWV3cG9ydCkgY2FudmFzXHJcbiAgICAgICAgICBpZih4Yz49MCAmJiB4Yzw9dykge1xyXG4gICAgICAgICAgICBnLmZpbGxTdHlsZSA9ICdyZWQnO1xyXG4gICAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ3JlZCc7XHJcbiAgICAgICAgICAgIGcubGluZVdpZHRoID0gTElORV9XSURUSDtcclxuICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgLy8gcGFpbnQgb3ZlciBhbGwgY2hhbm5lbHNcclxuICAgICAgICAgICAgZy5tb3ZlVG8oeGMsIDApO1xyXG4gICAgICAgICAgICBnLmxpbmVUbyh4YywgaCk7XHJcbiAgICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==
|
|
338
|
+
`, styles: [":host{width:100%;background:darkgray;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "div{top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n", "canvas{top:0;left:0;width:100%;height:100%;position:absolute}\n"] }]
|
|
339
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { virtualCanvasRef: [{
|
|
340
|
+
type: ViewChild,
|
|
341
|
+
args: ['virtualCanvas', { static: true }]
|
|
342
|
+
}], liveLevelCanvasRef: [{
|
|
343
|
+
type: ViewChild,
|
|
344
|
+
args: ['levelbar', { static: true }]
|
|
345
|
+
}], markerCanvasRef: [{
|
|
346
|
+
type: ViewChild,
|
|
347
|
+
args: ['markerCanvas', { static: true }]
|
|
348
|
+
}], onScroll: [{
|
|
349
|
+
type: HostListener,
|
|
350
|
+
args: ['scroll', ['$event']]
|
|
351
|
+
}], streamingMode: [{
|
|
352
|
+
type: Input
|
|
353
|
+
}], displayLevelInfos: [{
|
|
354
|
+
type: Input
|
|
355
|
+
}], state: [{
|
|
356
|
+
type: Input
|
|
357
|
+
}], onResize: [{
|
|
358
|
+
type: HostListener,
|
|
359
|
+
args: ['window:resize', ['$event']]
|
|
360
|
+
}] } });
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZWxldmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2xpdmVsZXZlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1DLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQTs7QUFHckgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFlBQVksR0FBQyxDQUFDLENBQUM7QUFDMUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUM1QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFDLENBQUMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRXhDLE1BQU0sQ0FBTixJQUFZLEtBQStCO0FBQTNDLFdBQVksS0FBSztJQUFFLHVDQUFPLENBQUE7SUFBQywyQ0FBUyxDQUFBO0lBQUMsbUNBQUssQ0FBQTtBQUFBLENBQUMsRUFBL0IsS0FBSyxLQUFMLEtBQUssUUFBMEI7QUFxQzNDLE1BQU0sT0FBTyxRQUFRO0lBb0JuQixZQUFvQixHQUFlLEVBQVUsaUJBQW9DO1FBQTdELFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBVnpFLG1CQUFjLEdBQVEsYUFBYSxHQUFDLFVBQVUsQ0FBQztRQUN2RCxjQUFTLEdBQUcsWUFBWSxDQUFDO1FBQ2pCLG1C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QUFDLFFBQVEsQ0FBQztnQkFpQjlCLGFBQWE7c0JBRGhCLEtBQUs7Z0JBVUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQWVGLEtBQUs7c0JBRFIsS0FBSztnQkFnQk4sUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgVmlld0NoaWxkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXHJcbmltcG9ydCB7TGV2ZWxJbmZvLCBMZXZlbEluZm9zLCBMZXZlbExpc3RlbmVyfSBmcm9tIFwiLi4vZHNwL2xldmVsX21lYXN1cmVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBUk5fREJfTEVWRUwgPSAtMjtcclxuZXhwb3J0IGNvbnN0IE1JTl9EQl9MRVZFTCA9IC02MC4wO1xyXG5leHBvcnQgY29uc3QgQ09OU0lERVJFRF9TSUxFTkNFX0RCX0xFVkVMID0gTUlOX0RCX0xFVkVMKjI7XHJcbmV4cG9ydCBjb25zdCBMSU5FX1dJRFRIID0gMjtcclxuZXhwb3J0IGNvbnN0IExJTkVfRElTVEFOQ0UgPSAyO1xyXG5leHBvcnQgY29uc3QgTEVWRUxfSU5ESUNBVE9SX0hFSUdIVD0zO1xyXG5cclxuZXhwb3J0IGNvbnN0IE9WRVJGTE9XX1RIUkVTSE9MRCA9IDAuMjU7XHJcbmV4cG9ydCBjb25zdCBPVkVSRkxPV19JTkNSX0ZBQ1RPUiA9IDAuNTtcclxuXHJcbmV4cG9ydCBlbnVtIFN0YXRlIHtMT0FESU5HLFJFTkRFUklORyxSRUFEWX1cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLWxldmVsYmFyJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiAjdmlydHVhbENhbnZhcz5cclxuICAgICAgPGNhbnZhcyAjbGV2ZWxiYXI+PC9jYW52YXM+XHJcbiAgICAgIDxjYW52YXMgI21hcmtlckNhbnZhcz48L2NhbnZhcz5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuXHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJhY2tncm91bmQ6IGRhcmtncmF5O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgfWAsIGBkaXYge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG5cclxuICAgIC8qcG9zaXRpb246IGFic29sdXRlOyovXHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIH1gLCBgY2FudmFzIHtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMZXZlbEJhciBpbXBsZW1lbnRzIExldmVsTGlzdGVuZXIsQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpcnR1YWxDYW52YXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSB2aXJ0dWFsQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICB2aXJ0dWFsQ2FudmFzITogSFRNTERpdkVsZW1lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnbGV2ZWxiYXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBsaXZlTGV2ZWxDYW52YXNSZWYhOiBFbGVtZW50UmVmO1xyXG4gIGxpdmVMZXZlbENhbnZhcyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ21hcmtlckNhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIG1hcmtlckNhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgbWFya2VyQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuICBkYlZhbHVlczogQXJyYXk8QXJyYXk8bnVtYmVyPj47XHJcbiAgcHJpdmF0ZSBwaXhlbHNQZXJWYWx1ZTpudW1iZXI9TElORV9ESVNUQU5DRStMSU5FX1dJRFRIO1xyXG4gIHBlYWtEYkx2bCA9IE1JTl9EQl9MRVZFTDtcclxuICBwcml2YXRlIF9zdHJlYW1pbmdNb2RlID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc3RyZWFtaW5nRnJhbWVMZW5ndGg9MDtcclxuICBwcml2YXRlIF9zdGF0aWNMZXZlbEluZm9zOiBMZXZlbEluZm9zIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGxheUZyYW1lUG9zaXRpb246IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBfc3RhdGU6U3RhdGV8bnVsbD1udWxsO1xyXG5cclxuICB3YXJuREJMZXZlbCA9IERFRkFVTFRfV0FSTl9EQl9MRVZFTDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICB0aGlzLmRiVmFsdWVzID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNlID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMubGl2ZUxldmVsQ2FudmFzID0gdGhpcy5saXZlTGV2ZWxDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMubWFya2VyQ2FudmFzID0gdGhpcy5tYXJrZXJDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMubWFya2VyQ2FudmFzLnN0eWxlLnpJbmRleCA9ICc0JztcclxuICAgIHRoaXMudmlydHVhbENhbnZhcyA9IHRoaXMudmlydHVhbENhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICAgIHRoaXMuZHJhd0FsbCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3Njcm9sbCcsIFsnJGV2ZW50J10pXHJcbiAgb25TY3JvbGwoc2U6IEV2ZW50KSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0UG9zaXRpb24oKTtcclxuICAgICAgICAgIHRoaXMuZHJhd0FsbCgpO1xyXG4gICAgICAgICAgdGhpcy5kcmF3UGxheVBvc2l0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVWaWV3cG9ydFBvc2l0aW9uKCl7XHJcbiAgICAvLyBNb3ZlIGNhbnZhc2VzIHRvIHZpc2libGUgdmlld3BvcnQgcG9zaXRpb25cclxuICAgIGxldCB2aWV3UG9ydFN0eWxlTGVmdD10aGlzLmNlLnNjcm9sbExlZnQgKyAncHgnO1xyXG4gICAgdGhpcy5saXZlTGV2ZWxDYW52YXMuc3R5bGUubGVmdCA9IHZpZXdQb3J0U3R5bGVMZWZ0O1xyXG4gICAgdGhpcy5tYXJrZXJDYW52YXMuc3R5bGUubGVmdCA9IHZpZXdQb3J0U3R5bGVMZWZ0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc3RyZWFtaW5nTW9kZShzdHJlYW1pbmdNb2RlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fc3RyZWFtaW5nTW9kZSAhPT0gc3RyZWFtaW5nTW9kZSkge1xyXG4gICAgICB0aGlzLl9zdHJlYW1pbmdNb2RlID0gc3RyZWFtaW5nTW9kZTtcclxuICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICB0aGlzLmxheW91dFN0YXRpYygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgZGlzcGxheUxldmVsSW5mb3MobGV2ZWxJbmZvczogTGV2ZWxJbmZvcyB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmIChsZXZlbEluZm9zKSB7XHJcbiAgICAgIHRoaXMuX3N0YXRpY0xldmVsSW5mb3MgPSBsZXZlbEluZm9zO1xyXG4gICAgICB0aGlzLmRiVmFsdWVzID0gbGV2ZWxJbmZvcy5idWZmZXJMZXZlbEluZm9zLm1hcCgobGkpID0+IHtcclxuICAgICAgICByZXR1cm4gbGkucG93ZXJMZXZlbHNEQigpXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc3RhdGljTGV2ZWxJbmZvcyA9bnVsbDtcclxuICAgICAgICB0aGlzLmRiVmFsdWVzID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmxheW91dFN0YXRpYygpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc3RhdGUoc3RhdGU6U3RhdGUpe1xyXG4gICB0aGlzLl9zdGF0ZT1zdGF0ZTtcclxuICAgdGhpcy5sYXlvdXRTdGF0aWMoKTtcclxuICB9XHJcblxyXG4gIHNldCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihwbGF5RnJhbWVQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbiA9IHBsYXlGcmFtZVBvc2l0aW9uO1xyXG4gICAgdGhpcy5kcmF3UGxheVBvc2l0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgdGhpcy5kcmF3QWxsKCk7XHJcbiAgfVxyXG5cclxuICBsYXlvdXQoKSB7XHJcblxyXG4gICAgLy8gc2V0IENhbnZhcyBzaXplIHRvIHZpZXdwb3J0IHNpemVcclxuICAgIHRoaXMubGl2ZUxldmVsQ2FudmFzLndpZHRoID0gdGhpcy5jZS5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMubGl2ZUxldmVsQ2FudmFzLmhlaWdodCA9IHRoaXMuY2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIHRoaXMubWFya2VyQ2FudmFzLndpZHRoID0gdGhpcy5jZS5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMubWFya2VyQ2FudmFzLmhlaWdodCA9IHRoaXMuY2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIC8vIGFuZCBtb3ZlIHRvIHZpZXdwb3J0IHBvc2l0aW9uXHJcbiAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0UG9zaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLmRyYXdBbGwoKTtcclxuICAgIHRoaXMuZHJhd1BsYXlQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGxldmVsSW5mb3M6IExldmVsSW5mbykge1xyXG4gICAgaWYgKHRoaXMuX3N0cmVhbWluZ01vZGUpIHtcclxuICAgICAgbGV0IGRiVmFscyA9IGxldmVsSW5mb3MucG93ZXJMZXZlbHNEQigpO1xyXG4gICAgICBsZXQgcGVha0RCVmFsID0gbGV2ZWxJbmZvcy5wb3dlckxldmVsREIoKTtcclxuICAgICAgdGhpcy5fc3RyZWFtaW5nRnJhbWVMZW5ndGgrPWxldmVsSW5mb3MuZnJhbWVMZW5ndGg7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwZGF0ZSBsZXZlbCBpbmZvIGZyYW1lTGVuZ3RoOiBcIitsZXZlbEluZm9zLmZyYW1lTGVuZ3RoK1wiLCB0b3RhbCBzdHJlYW1pbmcgZnJhbWUgbGVuZ3RoOiBcIit0aGlzLl9zdHJlYW1pbmdGcmFtZUxlbmd0aCk7XHJcbiAgICAgIGlmICh0aGlzLnBlYWtEYkx2bCA8IHBlYWtEQlZhbCkge1xyXG4gICAgICAgIHRoaXMucGVha0RiTHZsID0gcGVha0RCVmFsO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGJWYWx1ZXMucHVzaChkYlZhbHMpO1xyXG4gICAgICBsZXQgaSA9IHRoaXMuZGJWYWx1ZXMubGVuZ3RoIC0gMTtcclxuICAgICAgbGV0IHggPSBpICogdGhpcy5waXhlbHNQZXJWYWx1ZTtcclxuICAgICAgdGhpcy5kcmF3UHVzaFZhbHVlKHgsIGRiVmFscyk7XHJcbiAgICAgIHRoaXMuY2hlY2tXaWR0aCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RyZWFtRmluaXNoZWQoKSB7XHJcbiAgICB0aGlzLmxheW91dFN0YXRpYygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsYXlvdXRTdGF0aWMoKSB7XHJcblxyXG4gICAgbGV0IHJlcXVpcmVkV2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuZGJWYWx1ZXMubGVuZ3RoICogdGhpcy5waXhlbHNQZXJWYWx1ZSk7XHJcbiAgICBpZiAodGhpcy52aXJ0dWFsQ2FudmFzICYmIHRoaXMuY2UpIHtcclxuXHJcbiAgICAgIHRoaXMudmlydHVhbENhbnZhcy5zdHlsZS53aWR0aCA9IHJlcXVpcmVkV2lkdGggKyAncHgnO1xyXG4gICAgICB0aGlzLmNlLnNjcm9sbExlZnQgPSByZXF1aXJlZFdpZHRoIC0gdGhpcy5jZS5vZmZzZXRXaWR0aDtcclxuICAgICAgdGhpcy5sYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrV2lkdGgoKSB7XHJcbiAgICBsZXQgcmVxdWlyZWRXaWR0aCA9IHRoaXMuZGJWYWx1ZXMubGVuZ3RoKnRoaXMucGl4ZWxzUGVyVmFsdWU7XHJcbiAgICBpZiAodGhpcy52aXJ0dWFsQ2FudmFzLm9mZnNldFdpZHRoIC0gcmVxdWlyZWRXaWR0aCA8IHRoaXMuY2Uub2Zmc2V0V2lkdGggKiBPVkVSRkxPV19USFJFU0hPTEQpIHtcclxuICAgICAgbGV0IG5ld1dpZHRoID0gTWF0aC5mbG9vcih0aGlzLnZpcnR1YWxDYW52YXMub2Zmc2V0V2lkdGggKyAodGhpcy5jZS5vZmZzZXRXaWR0aCAqIE9WRVJGTE9XX0lOQ1JfRkFDVE9SKSk7XHJcbiAgICAgIHRoaXMudmlydHVhbENhbnZhcy5zdHlsZS53aWR0aCA9IG5ld1dpZHRoICsgJ3B4JztcclxuICAgICAgdGhpcy5jZS5zY3JvbGxMZWZ0ID0gbmV3V2lkdGggLSB0aGlzLmNlLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgIC8vIGRvIG5vdCBjYWxsIGxheW91dCBoZXJlIGl0IGlzIHRyaWdnZXJlZCBieSB0aGUgc2Nyb2xsIGV2ZW50XHJcbiAgICAgIC8vdGhpcy5sYXlvdXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KHN0YXQ9ZmFsc2UpIHtcclxuICAgIHRoaXMucGVha0RiTHZsID0gTUlOX0RCX0xFVkVMO1xyXG4gICAgdGhpcy5kYlZhbHVlcyA9IG5ldyBBcnJheTxBcnJheTxudW1iZXI+PigpO1xyXG4gICAgdGhpcy5fc3RyZWFtaW5nRnJhbWVMZW5ndGg9MDtcclxuICAgIGlmKHN0YXQpe1xyXG4gICAgICB0aGlzLmxheW91dFN0YXRpYygpO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kcmF3QWxsKCk7XHJcbiAgICB0aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGRyYXdMZXZlbEJhY2tncm91bmQoZzogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCB4OiBudW1iZXIsIGg6IG51bWJlcil7XHJcbiAgICBnLnN0cm9rZVN0eWxlID0gJ2JsYWNrJztcclxuICAgIGcuZmlsbFN0eWxlID0gJ2JsYWNrJztcclxuICAgIGcuZmlsbFJlY3QoeCwwLHRoaXMucGl4ZWxzUGVyVmFsdWUsaClcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgZHJhd0xldmVsTGluZShnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHg6IG51bWJlciwgaDogbnVtYmVyLCBkYlZhbDogbnVtYmVyKSB7XHJcbiAgLy8gICAvL3RyYW5zbGF0ZSB0byB2aWV3cG9ydFxyXG4gIC8vICAgbGV0IHhjID0geCAtIHRoaXMuY2Uuc2Nyb2xsTGVmdDtcclxuICAvL1xyXG4gIC8vICAgdGhpcy5kcmF3TGV2ZWxCYWNrZ3JvdW5kKGcseGMsaCk7XHJcbiAgLy8gICBnLmxpbmVXaWR0aCA9IExJTkVfV0lEVEg7XHJcbiAgLy8gICBpZiAoZGJWYWwgPj0gdGhpcy53YXJuREJMZXZlbCkge1xyXG4gIC8vICAgICBnLnN0cm9rZVN0eWxlID0gJ3JlZCc7XHJcbiAgLy8gICAgIGcuZmlsbFN0eWxlID0gJ3JlZCc7XHJcbiAgLy9cclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIGcuc3Ryb2tlU3R5bGUgPSAnIzAwYzg1Myc7XHJcbiAgLy8gICAgIGcuZmlsbFN0eWxlID0gJyMwMGM4NTMnO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZy5iZWdpblBhdGgoKTtcclxuICAvLyAgIGcubW92ZVRvKHhjLCBoKTtcclxuICAvLyAgIGxldCBwVmFsID0gKChkYlZhbCAtIE1JTl9EQl9MRVZFTCkgLyAtTUlOX0RCX0xFVkVMKSAqIGg7XHJcbiAgLy9cclxuICAvLyAgIGcubGluZVRvKHhjLCBoIC0gcFZhbCk7XHJcbiAgLy8gICBnLmNsb3NlUGF0aCgpO1xyXG4gIC8vICAgZy5zdHJva2UoKTtcclxuICAvL1xyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3TGV2ZWxMaW5lcyhnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHg6IG51bWJlciwgaDogbnVtYmVyLCBkYlZhbHM6IEFycmF5PG51bWJlcj4pIHtcclxuICAgIC8vdHJhbnNsYXRlIHRvIHZpZXdwb3J0XHJcbiAgICBsZXQgeGMgPSB4IC0gdGhpcy5jZS5zY3JvbGxMZWZ0O1xyXG4gICAgdGhpcy5kcmF3TGV2ZWxCYWNrZ3JvdW5kKGcseGMsaCk7XHJcblxyXG4gICAgbGV0IGNoSCA9IE1hdGguZmxvb3IoaCAvIGRiVmFscy5sZW5ndGgpO1xyXG4gICAgZy5saW5lV2lkdGggPSBMSU5FX1dJRFRIO1xyXG4gICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGRiVmFscy5sZW5ndGg7IGNoKyspIHtcclxuICAgICAgbGV0IGRiVmFsID0gZGJWYWxzW2NoXTtcclxuXHJcbiAgICAgIGxldCB5ID0gTWF0aC5mbG9vcihjaCAqIGNoSCk7XHJcbiAgICAgIGlmIChkYlZhbCA+PSB0aGlzLndhcm5EQkxldmVsKSB7XHJcbiAgICAgICAgZy5zdHJva2VTdHlsZSA9ICdyZWQnO1xyXG4gICAgICAgIGcuZmlsbFN0eWxlID0gJ3JlZCc7XHJcbiAgICAgIH0gZWxzZSBpZihkYlZhbCA8IENPTlNJREVSRURfU0lMRU5DRV9EQl9MRVZFTCkge1xyXG4gICAgICAgIGcuc3Ryb2tlU3R5bGU9J2dyZXknO1xyXG4gICAgICAgIGcuZmlsbFN0eWxlPSdncmV5J1xyXG4gICAgICB9IGVsc2V7XHJcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJyMwMGM4NTMnO1xyXG4gICAgICAgICAgZy5maWxsU3R5bGUgPSAnIzAwYzg1MydcclxuICAgICAgfVxyXG4gICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICBnLm1vdmVUbyh4YywgeSArIGNoSCk7XHJcbiAgICAgIGcubGluZVRvKHhjLCB5ICsgY2hIIC0gTEVWRUxfSU5ESUNBVE9SX0hFSUdIVCk7XHJcbiAgICAgIGxldCBwblZhbD0oKGRiVmFsIC0gTUlOX0RCX0xFVkVMKSAvIC1NSU5fREJfTEVWRUwpO1xyXG4gICAgICBsZXQgbHZsSW5kaWNhdG9yU3BhY2U9TEVWRUxfSU5ESUNBVE9SX0hFSUdIVCtMSU5FX0RJU1RBTkNFO1xyXG4gICAgICBsZXQgbGV2ZWxIPWNoSC1sdmxJbmRpY2F0b3JTcGFjZTtcclxuICAgICAgbGV0IHBWYWwgPSBwblZhbCAqIGxldmVsSDtcclxuICAgICAgaWYocFZhbD5sZXZlbEgtMSl7XHJcbiAgICAgICAgcFZhbD1sZXZlbEgtMVxyXG4gICAgICB9ZWxzZSBpZihwVmFsPDApe1xyXG4gICAgICAgIHBWYWw9MFxyXG4gICAgICB9XHJcbiAgICAgIGcubW92ZVRvKHhjLCB5ICsgY2hIIC0gbHZsSW5kaWNhdG9yU3BhY2UgKTtcclxuICAgICAgZy5saW5lVG8oeGMsIHkgKyBjaEggLSBsdmxJbmRpY2F0b3JTcGFjZSAtIHBWYWwpO1xyXG4gICAgICBnLmNsb3NlUGF0aCgpO1xyXG4gICAgICBnLnN0cm9rZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3UHVzaFZhbHVlKHg6IG51bWJlciwgZGJWYWxzOiBBcnJheTxudW1iZXI+KSB7XHJcblxyXG4gICAgaWYgKHRoaXMubGl2ZUxldmVsQ2FudmFzKSB7XHJcbiAgICAgIGxldCBoID0gdGhpcy5saXZlTGV2ZWxDYW52YXMuaGVpZ2h0O1xyXG4gICAgICBsZXQgZyA9IHRoaXMubGl2ZUxldmVsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgaWYgKGcpIHtcclxuICAgICAgICB0aGlzLmRyYXdMZXZlbExpbmVzKGcsIHgsIGgsIGRiVmFscyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgIGRyYXdBbGwoKSB7XHJcbiAgICBpZiAodGhpcy5saXZlTGV2ZWxDYW52YXMpIHtcclxuICAgICAgbGV0IHcgPSB0aGlzLmxpdmVMZXZlbENhbnZhcy53aWR0aDtcclxuICAgICAgbGV0IGggPSB0aGlzLmxpdmVMZXZlbENhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGxldCBnID0gdGhpcy5saXZlTGV2ZWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBpZiAoZykge1xyXG4gICAgICAgIC8vIGNsZWFyIGNhbnZhc1xyXG4gICAgICAgIGcuZmlsbFN0eWxlID0gJ2dyZXknO1xyXG4gICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcblxyXG4gICAgICAgIGcubGluZVdpZHRoID0gTElORV9XSURUSDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGJWYWx1ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgLy8gZHJhdyBvbmx5IHZpZXdwb3J0IHBhcnQ6XHJcblxyXG4gICAgICAgICAgLy8gZHJhdyBmcm9tIHgxIHRvIHgyXHJcbiAgICAgICAgICBsZXQgeDEgPSB0aGlzLmNlLnNjcm9sbExlZnQ7XHJcbiAgICAgICAgICBsZXQgeDIgPSB4MSArIHRoaXMuY2Uub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gdGhpcyBsZXZlbCB2YWx1ZXM6XHJcbiAgICAgICAgICBsZXQgaTEgPSBNYXRoLmZsb29yKHgxIC8gdGhpcy5waXhlbHNQZXJWYWx1ZSk7XHJcbiAgICAgICAgICBsZXQgaTIgPSBNYXRoLmNlaWwoeDIgL3RoaXMucGl4ZWxzUGVyVmFsdWUpO1xyXG4gICAgICAgICAgLy8gc29tZSB2YWx1ZXMgYXJvdW5kXHJcbiAgICAgICAgICBpMSAtPSAyO1xyXG4gICAgICAgICAgaTIgKz0gMjtcclxuICAgICAgICAgIC8vIGxpbWl0c1xyXG4gICAgICAgICAgaWYgKGkxIDwgMCkge1xyXG4gICAgICAgICAgICBpMSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaTIgPiB0aGlzLmRiVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpMiA9IHRoaXMuZGJWYWx1ZXMubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBjPTA7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gaTE7IGkgPCBpMjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHggPSBpICogdGhpcy5waXhlbHNQZXJWYWx1ZTtcclxuICAgICAgICAgICAgICBsZXQgZGJWYWxzID0gdGhpcy5kYlZhbHVlc1tpXTtcclxuICAgICAgICAgICAgICBpZiAoZGJWYWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0xldmVsTGluZXMoZywgeCwgaCwgZGJWYWxzKTtcclxuICAgICAgICAgICAgICAgICAgYysrO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYodGhpcy5fc3RhdGUhPT1TdGF0ZS5SRUFEWSl7XHJcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ3doaXRlJztcclxuICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3doaXRlJztcclxuICAgICAgICAgIGcuZm9udCA9ICcyMHB4IHNhbnMtc2VyaWYnO1xyXG5cclxuICAgICAgICAgIGxldCBzdGF0ZVR4dD0nJztcclxuXHJcbiAgICAgICAgICBpZih0aGlzLl9zdGF0ZT09PVN0YXRlLkxPQURJTkcpe1xyXG4gICAgICAgICAgICBzdGF0ZVR4dD1cIkxvYWRpbmcuLi5cIjtcclxuICAgICAgICAgIH1lbHNlIGlmKHRoaXMuX3N0YXRlPT09U3RhdGUuUkVOREVSSU5HKXtcclxuICAgICAgICAgICAgc3RhdGVUeHQ9XCJSZW5kZXJpbmcuLi5cIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGcuZmlsbFRleHQoc3RhdGVUeHQsIDEwLCAyNSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZnJhbWVzUGVyUGl4ZWwoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBsZXQgZnBwOm51bWJlcnxudWxsPW51bGw7XHJcbiAgICAvLyBvbmUgYnVmZmVyXHJcbiAgICBpZiAodGhpcy5fc3RhdGljTGV2ZWxJbmZvcykge1xyXG4gICAgICBsZXQgZnJhbWVzUGVyQnVmZmVyID0gdGhpcy5fc3RhdGljTGV2ZWxJbmZvcy5mcmFtZXNQZXJCdWZmZXIoKTtcclxuICAgICAgZnBwPWZyYW1lc1BlckJ1ZmZlciAvIHRoaXMucGl4ZWxzUGVyVmFsdWU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYodGhpcy5kYlZhbHVlcyAmJiB0aGlzLmRiVmFsdWVzLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgZnBwPXRoaXMuX3N0cmVhbWluZ0ZyYW1lTGVuZ3RoIC8gKHRoaXMuZGJWYWx1ZXMubGVuZ3RoKnRoaXMucGl4ZWxzUGVyVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnBwO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZHJhd1BsYXlQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1hcmtlckNhbnZhcykge1xyXG4gICAgICBsZXQgdyA9IHRoaXMubWFya2VyQ2FudmFzLndpZHRoO1xyXG4gICAgICBsZXQgaCA9IHRoaXMubWFya2VyQ2FudmFzLmhlaWdodDtcclxuICAgICAgbGV0IGcgPSB0aGlzLm1hcmtlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gdGhpcy5mcmFtZXNQZXJQaXhlbCgpO1xyXG4gICAgICAgIGlmIChmcmFtZXNQZXJQaXhlbCAmJiB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbikge1xyXG4gICAgICAgICAgbGV0IHggPSB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbiAvIGZyYW1lc1BlclBpeGVsO1xyXG5cclxuICAgICAgICAgIC8vIEdldCBwb3NpdGlvbiBpbiB2aWV3cG9ydFxyXG4gICAgICAgICAgbGV0IHhjID0geCAtIHRoaXMuY2Uuc2Nyb2xsTGVmdDtcclxuICAgICAgICAgIC8vIE9ubHkgZHJhdyBpZiBpbnNpZGUgbWFya2VyICh2aWV3cG9ydCkgY2FudmFzXHJcbiAgICAgICAgICBpZih4Yz49MCAmJiB4Yzw9dykge1xyXG4gICAgICAgICAgICBnLmZpbGxTdHlsZSA9ICdyZWQnO1xyXG4gICAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ3JlZCc7XHJcbiAgICAgICAgICAgIGcubGluZVdpZHRoID0gTElORV9XSURUSDtcclxuICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgLy8gcGFpbnQgb3ZlciBhbGwgY2hhbm5lbHNcclxuICAgICAgICAgICAgZy5tb3ZlVG8oeGMsIDApO1xyXG4gICAgICAgICAgICBnLmxpbmVUbyh4YywgaCk7XHJcbiAgICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==
|