speechrecorderng 3.10.13 → 3.11.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/README.md +1 -1
- package/fesm2022/speechrecorderng.mjs +204 -201
- package/fesm2022/speechrecorderng.mjs.map +1 -1
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +1 -1
- package/lib/ui/responsive_component.d.ts +1 -1
- package/package.json +13 -15
- package/esm2022/lib/action/action.mjs +0 -73
- package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
- package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
- package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
- package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2022/lib/audio/audio_display.mjs +0 -118
- package/esm2022/lib/audio/audio_player.mjs +0 -238
- package/esm2022/lib/audio/capture/capture.mjs +0 -855
- package/esm2022/lib/audio/context.mjs +0 -79
- package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
- package/esm2022/lib/audio/format.mjs +0 -20
- package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
- package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
- package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2022/lib/audio/io/stream.mjs +0 -59
- package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2022/lib/audio/persistor.mjs +0 -81
- package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
- package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
- package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
- package/esm2022/lib/audio/playback/player.mjs +0 -402
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
- package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
- package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
- package/esm2022/lib/audio/ui/common.mjs +0 -19
- package/esm2022/lib/audio/ui/container.mjs +0 -414
- package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2022/lib/db/inddb.mjs +0 -120
- package/esm2022/lib/dsp/utils.mjs +0 -48
- package/esm2022/lib/environment/environment.defaults.mjs +0 -9
- package/esm2022/lib/io/BinaryReader.mjs +0 -93
- package/esm2022/lib/io/BinaryWriter.mjs +0 -80
- package/esm2022/lib/io/stream.mjs +0 -259
- package/esm2022/lib/math/2d/geometry.mjs +0 -28
- package/esm2022/lib/math/complex.mjs +0 -58
- package/esm2022/lib/math/dft.mjs +0 -196
- package/esm2022/lib/media/utils.mjs +0 -14
- package/esm2022/lib/net/uploader.mjs +0 -367
- package/esm2022/lib/recorder_component.mjs +0 -65
- package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
- package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2022/lib/speechrecorder/recording.mjs +0 -124
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
- package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
- package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
- package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
- package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
- package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
- package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
- package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
- package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
- package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2022/lib/speechrecorderng.component.mjs +0 -392
- package/esm2022/lib/speechrecorderng.module.mjs +0 -97
- package/esm2022/lib/spr.config.mjs +0 -27
- package/esm2022/lib/spr.module.version.mjs +0 -2
- package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
- package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
- package/esm2022/lib/ui/message_dialog.mjs +0 -51
- package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2022/lib/ui/responsive_component.mjs +0 -24
- package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
- package/esm2022/lib/utils/ua-parser.mjs +0 -190
- package/esm2022/lib/utils/utils.mjs +0 -132
- package/esm2022/lib/utils/wake_lock.mjs +0 -114
- package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
- package/esm2022/public-api.mjs +0 -35
- package/esm2022/speechrecorderng.mjs +0 -5
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
|
|
2
|
-
import { RecordingList } from "./recording_list";
|
|
3
|
-
import { AudioDisplay } from "../../audio/audio_display";
|
|
4
|
-
import { ResponsiveComponent } from "../../ui/responsive_component";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/cdk/layout";
|
|
7
|
-
import * as i2 from "../../audio/audio_display";
|
|
8
|
-
import * as i3 from "./recording_list";
|
|
9
|
-
export class RecorderCombiPane extends ResponsiveComponent {
|
|
10
|
-
constructor(bpo) {
|
|
11
|
-
super(bpo);
|
|
12
|
-
this.bpo = bpo;
|
|
13
|
-
this.selectDisabled = false;
|
|
14
|
-
this.selectedRecordingFileChanged = new EventEmitter();
|
|
15
|
-
this.selectedRecordingFile = null;
|
|
16
|
-
this.audioSignalCollapsed = true;
|
|
17
|
-
this.displayAudioClip = null;
|
|
18
|
-
}
|
|
19
|
-
ngAfterViewInit() {
|
|
20
|
-
}
|
|
21
|
-
addRecFile(rf) {
|
|
22
|
-
this.recordingListComp.addRecFile(rf);
|
|
23
|
-
}
|
|
24
|
-
setRecFileAudioData(recFile, adh) {
|
|
25
|
-
this.recordingListComp.setRecFileAudioData(recFile, adh);
|
|
26
|
-
}
|
|
27
|
-
selectRecordingFile(rf) {
|
|
28
|
-
this.selectedRecordingFileChanged.emit(rf);
|
|
29
|
-
}
|
|
30
|
-
selectTop() {
|
|
31
|
-
this.recordingListComp.selectTop();
|
|
32
|
-
}
|
|
33
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecorderCombiPane, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RecorderCombiPane, selector: "app-recordercombipane", inputs: { selectDisabled: "selectDisabled", selectedRecordingFile: "selectedRecordingFile", audioSignalCollapsed: "audioSignalCollapsed", displayAudioClip: "displayAudioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", playStopAction: "playStopAction" }, outputs: { selectedRecordingFileChanged: "selectedRecordingFileChanged" }, viewQueries: [{ propertyName: "recordingListComp", first: true, predicate: RecordingList, descendants: true }, { propertyName: "audioDisplay", first: true, predicate: AudioDisplay, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
|
|
35
|
-
<div class="scrollList">
|
|
36
|
-
<app-recordinglist [selectedRecordingFile]="selectedRecordingFile" [selectDisabled]="selectDisabled" (selectedRecordingFileChanged)="selectRecordingFile($event)"></app-recordinglist>
|
|
37
|
-
</div>
|
|
38
|
-
<div class="collapsable" #asCt [class.active]="!audioSignalCollapsed && !screenXs">
|
|
39
|
-
<app-audiodisplay #audioSignalContainer [class.active]="!audioSignalCollapsed"
|
|
40
|
-
[audioClip]="displayAudioClip"
|
|
41
|
-
[playStartAction]="playStartAction"
|
|
42
|
-
[playSelectionAction]="playSelectionAction"
|
|
43
|
-
[autoPlayOnSelectToggleAction]="autoPlayOnSelectToggleAction"
|
|
44
|
-
[playStopAction]="playStopAction"></app-audiodisplay>
|
|
45
|
-
</div>
|
|
46
|
-
`, isInline: true, styles: [".monospaced{font-family:monospace}.mat-mdc-cell,.mat-mdc-header-cell{padding-left:5px;padding-right:5px}.mat-mdc-card,.mat-mdc-card-header,.mat-mdc-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}.spr-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ":host{background-color:#ff0;position:relative;margin:0;padding:0;background:#d3d3d3;width:100%;flex:1;min-height:0px}\n", ".scrollList{margin:0;padding:0;background:#d3d3d3;width:100%;height:100%;overflow-y:auto}\n", ".collapsable{display:none;position:absolute;z-index:5}\n", ".collapsable.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:200;box-sizing:border-box;background-color:#0000}\n"], dependencies: [{ kind: "component", type: i2.AudioDisplay, selector: "app-audiodisplay", inputs: ["playStartAction", "playStopAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "audioData", "audioClip"] }, { kind: "component", type: i3.RecordingList, selector: "app-recordinglist", inputs: ["selectDisabled", "selectedRecordingFile"], outputs: ["selectedRecordingFileChanged"] }] }); }
|
|
47
|
-
}
|
|
48
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecorderCombiPane, decorators: [{
|
|
49
|
-
type: Component,
|
|
50
|
-
args: [{ selector: 'app-recordercombipane', template: `
|
|
51
|
-
<div class="scrollList">
|
|
52
|
-
<app-recordinglist [selectedRecordingFile]="selectedRecordingFile" [selectDisabled]="selectDisabled" (selectedRecordingFileChanged)="selectRecordingFile($event)"></app-recordinglist>
|
|
53
|
-
</div>
|
|
54
|
-
<div class="collapsable" #asCt [class.active]="!audioSignalCollapsed && !screenXs">
|
|
55
|
-
<app-audiodisplay #audioSignalContainer [class.active]="!audioSignalCollapsed"
|
|
56
|
-
[audioClip]="displayAudioClip"
|
|
57
|
-
[playStartAction]="playStartAction"
|
|
58
|
-
[playSelectionAction]="playSelectionAction"
|
|
59
|
-
[autoPlayOnSelectToggleAction]="autoPlayOnSelectToggleAction"
|
|
60
|
-
[playStopAction]="playStopAction"></app-audiodisplay>
|
|
61
|
-
</div>
|
|
62
|
-
`, styles: [".monospaced{font-family:monospace}.mat-mdc-cell,.mat-mdc-header-cell{padding-left:5px;padding-right:5px}.mat-mdc-card,.mat-mdc-card-header,.mat-mdc-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}.spr-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ":host{background-color:#ff0;position:relative;margin:0;padding:0;background:#d3d3d3;width:100%;flex:1;min-height:0px}\n", ".scrollList{margin:0;padding:0;background:#d3d3d3;width:100%;height:100%;overflow-y:auto}\n", ".collapsable{display:none;position:absolute;z-index:5}\n", ".collapsable.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:200;box-sizing:border-box;background-color:#0000}\n"] }]
|
|
63
|
-
}], ctorParameters: () => [{ type: i1.BreakpointObserver }], propDecorators: { recordingListComp: [{
|
|
64
|
-
type: ViewChild,
|
|
65
|
-
args: [RecordingList]
|
|
66
|
-
}], selectDisabled: [{
|
|
67
|
-
type: Input
|
|
68
|
-
}], selectedRecordingFileChanged: [{
|
|
69
|
-
type: Output
|
|
70
|
-
}], selectedRecordingFile: [{
|
|
71
|
-
type: Input
|
|
72
|
-
}], audioDisplay: [{
|
|
73
|
-
type: ViewChild,
|
|
74
|
-
args: [AudioDisplay, { static: true }]
|
|
75
|
-
}], audioSignalCollapsed: [{
|
|
76
|
-
type: Input
|
|
77
|
-
}], displayAudioClip: [{
|
|
78
|
-
type: Input
|
|
79
|
-
}], playStartAction: [{
|
|
80
|
-
type: Input
|
|
81
|
-
}], playSelectionAction: [{
|
|
82
|
-
type: Input
|
|
83
|
-
}], autoPlayOnSelectToggleAction: [{
|
|
84
|
-
type: Input
|
|
85
|
-
}], playStopAction: [{
|
|
86
|
-
type: Input
|
|
87
|
-
}] } });
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkZXJfY29tYmlfcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL3JlY29yZGVyX2NvbWJpX3BhbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9GLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUcvQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7O0FBK0RsRSxNQUFNLE9BQU8saUJBQWtCLFNBQVEsbUJBQW1CO0lBZXhELFlBQXNCLEdBQXNCO1FBQzFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURTLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBWm5DLG1CQUFjLEdBQVMsS0FBSyxDQUFDO1FBQzVCLGlDQUE0QixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQ2xFLDBCQUFxQixHQUFvQixJQUFJLENBQUM7UUFHOUMseUJBQW9CLEdBQVUsSUFBSSxDQUFDO1FBQ25DLHFCQUFnQixHQUFtQixJQUFJLENBQUM7SUFRakQsQ0FBQztJQUVELGVBQWU7SUFFZixDQUFDO0lBRUQsVUFBVSxDQUFDLEVBQWdCO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQXFCLEVBQUMsR0FBd0I7UUFDaEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBR0QsbUJBQW1CLENBQUMsRUFBZ0I7UUFDbEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyQyxDQUFDOytHQXRDVSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2aEJBRWpCLGFBQWEsK0VBS2IsWUFBWSxxRkEvRGI7Ozs7Ozs7Ozs7OztHQVlUOzs0RkE0Q1UsaUJBQWlCO2tCQTVEN0IsU0FBUzsrQkFFRSx1QkFBdUIsWUFFdkI7Ozs7Ozs7Ozs7OztHQVlUO3VGQThDeUIsaUJBQWlCO3NCQUExQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ2YsY0FBYztzQkFBdEIsS0FBSztnQkFDSSw0QkFBNEI7c0JBQXJDLE1BQU07Z0JBQ0UscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVxQyxZQUFZO3NCQUF0RCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2hDLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csNEJBQTRCO3NCQUFwQyxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nRmlsZX0gZnJvbSBcIi4uL3JlY29yZGluZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ0xpc3R9IGZyb20gXCIuL3JlY29yZGluZ19saXN0XCI7XHJcbmltcG9ydCB7QXVkaW9DbGlwfSBmcm9tIFwiLi4vLi4vYXVkaW8vcGVyc2lzdG9yXCI7XHJcbmltcG9ydCB7QWN0aW9ufSBmcm9tIFwiLi4vLi4vYWN0aW9uL2FjdGlvblwiO1xyXG5pbXBvcnQge0F1ZGlvRGlzcGxheX0gZnJvbSBcIi4uLy4uL2F1ZGlvL2F1ZGlvX2Rpc3BsYXlcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5pbXBvcnQge1Jlc3BvbnNpdmVDb21wb25lbnR9IGZyb20gXCIuLi8uLi91aS9yZXNwb25zaXZlX2NvbXBvbmVudFwiO1xyXG5pbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9sYXlvdXRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1yZWNvcmRlcmNvbWJpcGFuZScsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsTGlzdFwiPlxyXG4gICAgICAgIDxhcHAtcmVjb3JkaW5nbGlzdCBbc2VsZWN0ZWRSZWNvcmRpbmdGaWxlXT1cInNlbGVjdGVkUmVjb3JkaW5nRmlsZVwiIFtzZWxlY3REaXNhYmxlZF09XCJzZWxlY3REaXNhYmxlZFwiIChzZWxlY3RlZFJlY29yZGluZ0ZpbGVDaGFuZ2VkKT1cInNlbGVjdFJlY29yZGluZ0ZpbGUoJGV2ZW50KVwiPjwvYXBwLXJlY29yZGluZ2xpc3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzYWJsZVwiICAjYXNDdCBbY2xhc3MuYWN0aXZlXT1cIiFhdWRpb1NpZ25hbENvbGxhcHNlZCAmJiAhc2NyZWVuWHNcIj5cclxuICAgICAgPGFwcC1hdWRpb2Rpc3BsYXkgI2F1ZGlvU2lnbmFsQ29udGFpbmVyIFtjbGFzcy5hY3RpdmVdPVwiIWF1ZGlvU2lnbmFsQ29sbGFwc2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvQ2xpcF09XCJkaXNwbGF5QXVkaW9DbGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJwbGF5U3RhcnRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxheVNlbGVjdGlvbkFjdGlvbl09XCJwbGF5U2VsZWN0aW9uQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25dPVwiYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJwbGF5U3RvcEFjdGlvblwiPjwvYXBwLWF1ZGlvZGlzcGxheT5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93O1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGJhY2tncm91bmQ6IGxpZ2h0Z3JleTtcclxuICAgIHdpZHRoOiAxMDAlOyAvKiB1c2UgYWxsIGhvcml6b250YWwgYXZhaWxhYmxlIHNwYWNlICovXHJcbiAgICBmbGV4OiAxOyAvKiAuLi4gYW5kIGZpbGwgcmVzdCBvZiB2ZXJ0aWNhbCBhdmFpbGFibGUgc3BhY2UgKG90aGVyIGNvbXBvbmVudHMgaGF2ZSBmbGV4IDApICovXHJcbiAgICAvKiBXb3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICBJZiB0aGUgcHJvZ3Jlc3MgdGFibGUgZ2V0cyBsb25nIChzY3JpcHQgd2l0aCBtYW55IGl0ZW1zKSBGRiBpbmNyZWFzZXMgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmZsb3cgcHJvZ3Jlc3NDb250YWluZXIgYW5kXHJcbiAgICB0aGUgd2hvbGUgYXBwIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwYWdlIGFueW1vcmUuIFRoZSBhcHAgb3ZlcmZsb3dzIGFuZCBzaG93cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBmb3IgdGhlIHdob2xlIGFwcC5cclxuICAgIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODYzNjgzMi9maXJlZm94LW92ZXJmbG93LXktbm90LXdvcmtpbmctd2l0aC1uZXN0ZWQtZmxleGJveFxyXG4gICAgKi9cclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgfWAsYC5zY3JvbGxMaXN0e1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGJhY2tncm91bmQ6IGxpZ2h0Z3JleTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgb3ZlcmZsb3cteTogYXV0bztcclxuICB9YCwgYFxyXG4gICAgLmNvbGxhcHNhYmxlIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICB6LWluZGV4OiA1O1xyXG4gICAgfWAsIGBcclxuICAgIC5jb2xsYXBzYWJsZS5hY3RpdmUge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIGJvdHRvbTogMHB4O1xyXG4gICAgICBoZWlnaHQ6IDkwJTtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIHBhZGRpbmc6IDBweDtcclxuICAgICAgei1pbmRleDogMjAwOyAgLyogTmVlZHMgYSBoaWdoZXIgdmFsdWUgdGhlbiB0aGUgc3RpY2t5IE1hdGVyaWFsIHRhYmxlIGhlYWRlciAod2hpY2ggaXMgei1pbmRleDogMTAwKSAqL1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApXHJcbiAgICB9YF0sXHJcbiAgc3R5bGVVcmxzOiBbJy4uLy4uL3NwZWVjaHJlY29yZGVyX21hdC5zY3NzJ11cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRlckNvbWJpUGFuZSBleHRlbmRzIFJlc3BvbnNpdmVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0e1xyXG5cclxuICBAVmlld0NoaWxkKFJlY29yZGluZ0xpc3QpIHJlY29yZGluZ0xpc3RDb21wITpSZWNvcmRpbmdMaXN0O1xyXG4gIEBJbnB1dCgpIHNlbGVjdERpc2FibGVkOmJvb2xlYW49ZmFsc2U7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkUmVjb3JkaW5nRmlsZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRSZWNvcmRpbmdGaWxlOlJlY29yZGluZ0ZpbGV8bnVsbD1udWxsO1xyXG5cclxuICBAVmlld0NoaWxkKEF1ZGlvRGlzcGxheSwgeyBzdGF0aWM6IHRydWUgfSkgYXVkaW9EaXNwbGF5ITogQXVkaW9EaXNwbGF5O1xyXG4gIEBJbnB1dCgpIGF1ZGlvU2lnbmFsQ29sbGFwc2VkOiBib29sZWFuPXRydWU7XHJcbiAgQElucHV0KCkgZGlzcGxheUF1ZGlvQ2xpcDogQXVkaW9DbGlwIHwgbnVsbD1udWxsO1xyXG4gIEBJbnB1dCgpIHBsYXlTdGFydEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBwbGF5U2VsZWN0aW9uQWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb246QWN0aW9uPGJvb2xlYW4+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBwbGF5U3RvcEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJwbzpCcmVha3BvaW50T2JzZXJ2ZXIpIHtcclxuICAgIHN1cGVyKGJwbyk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgYWRkUmVjRmlsZShyZjpSZWNvcmRpbmdGaWxlKXtcclxuICAgIHRoaXMucmVjb3JkaW5nTGlzdENvbXAuYWRkUmVjRmlsZShyZik7XHJcbiAgfVxyXG5cclxuICBzZXRSZWNGaWxlQXVkaW9EYXRhKHJlY0ZpbGU6UmVjb3JkaW5nRmlsZSxhZGg6QXVkaW9EYXRhSG9sZGVyfG51bGwpIHtcclxuICAgIHRoaXMucmVjb3JkaW5nTGlzdENvbXAuc2V0UmVjRmlsZUF1ZGlvRGF0YShyZWNGaWxlLCBhZGgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdFJlY29yZGluZ0ZpbGUocmY6UmVjb3JkaW5nRmlsZSl7XHJcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3JkaW5nRmlsZUNoYW5nZWQuZW1pdChyZik7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RUb3AoKSB7XHJcbiAgICB0aGlzLnJlY29yZGluZ0xpc3RDb21wLnNlbGVjdFRvcCgpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { RecordingFileUtils } from "../recording";
|
|
2
|
-
export class BasicRecFilesCache {
|
|
3
|
-
constructor() {
|
|
4
|
-
//public static readonly DEFAULT_MAX_SAMPLES=30*48000; // TEST 30 seconds
|
|
5
|
-
this._sampleCount = 0;
|
|
6
|
-
this.maxSampleCount = BasicRecFilesCache.DEFAULT_MAX_SAMPLES;
|
|
7
|
-
this._currentRecordingFile = null;
|
|
8
|
-
}
|
|
9
|
-
static { this.DEBUG = false; }
|
|
10
|
-
static { this.DEFAULT_MAX_SAMPLES = 10 * 60 * 48000; } // 10 Minutes mono 48kHz
|
|
11
|
-
get currentRecordingFile() {
|
|
12
|
-
return this._currentRecordingFile;
|
|
13
|
-
}
|
|
14
|
-
set currentRecordingFile(value) {
|
|
15
|
-
this._currentRecordingFile = value;
|
|
16
|
-
this.expire();
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export class SprItemsCache extends BasicRecFilesCache {
|
|
20
|
-
constructor() {
|
|
21
|
-
super(...arguments);
|
|
22
|
-
this._items = new Array();
|
|
23
|
-
}
|
|
24
|
-
get items() {
|
|
25
|
-
return this._items;
|
|
26
|
-
}
|
|
27
|
-
addItem(item) {
|
|
28
|
-
this._items.push(item);
|
|
29
|
-
}
|
|
30
|
-
getItem(index) {
|
|
31
|
-
return this._items[index];
|
|
32
|
-
}
|
|
33
|
-
length() {
|
|
34
|
-
return this._items.length;
|
|
35
|
-
}
|
|
36
|
-
tryExpire(toBeExpiredRf) {
|
|
37
|
-
if (BasicRecFilesCache.DEBUG)
|
|
38
|
-
console.debug("Rec. files cache: " + toBeExpiredRf.toString() + " try expire:");
|
|
39
|
-
if (!RecordingFileUtils.equals(toBeExpiredRf, this.currentRecordingFile)) {
|
|
40
|
-
if (BasicRecFilesCache.DEBUG)
|
|
41
|
-
console.debug("Rec. files cache: " + toBeExpiredRf.toString() + " not current file...");
|
|
42
|
-
if (toBeExpiredRf.serverPersisted) {
|
|
43
|
-
if (BasicRecFilesCache.DEBUG)
|
|
44
|
-
console.debug("Rec. files cache: " + toBeExpiredRf.toString() + " is server persisted...");
|
|
45
|
-
// expire recording files first stored to the cache
|
|
46
|
-
let expiredSamples = RecordingFileUtils.expireAudioData(toBeExpiredRf);
|
|
47
|
-
this._sampleCount -= expiredSamples;
|
|
48
|
-
if (expiredSamples > 0) {
|
|
49
|
-
if (BasicRecFilesCache.DEBUG)
|
|
50
|
-
console.debug("Rec. files cache: Expired: " + toBeExpiredRf.toString() + ". Cache samples now: " + this._sampleCount);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
if (BasicRecFilesCache.DEBUG)
|
|
55
|
-
console.debug("Rec. files cache: #" + toBeExpiredRf.toString() + " not yet persisted on server.");
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
if (BasicRecFilesCache.DEBUG)
|
|
60
|
-
console.debug("Rec. files cache: " + toBeExpiredRf.toString() + " is current file.");
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
expire() {
|
|
64
|
-
// expire corrected versions first
|
|
65
|
-
if (BasicRecFilesCache.DEBUG)
|
|
66
|
-
console.debug("Rec. files cache: Expire? current: " + this._sampleCount + ", max: " + this.maxSampleCount);
|
|
67
|
-
if (this._sampleCount > this.maxSampleCount) {
|
|
68
|
-
// expire older versions of an item first
|
|
69
|
-
for (let ii = 0; ii < this._items.length; ii++) {
|
|
70
|
-
if (this._sampleCount <= this.maxSampleCount) {
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
let it = this._items[ii];
|
|
74
|
-
let itRfs = it.recs;
|
|
75
|
-
if (itRfs && itRfs.length > 1) {
|
|
76
|
-
for (let rfi = 0; rfi < itRfs.length - 1; rfi++) {
|
|
77
|
-
if (this._sampleCount <= this.maxSampleCount) {
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
let toBeExpiredRf = itRfs[rfi];
|
|
81
|
-
this.tryExpire(toBeExpiredRf);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// if that's not sufficient expire audio data of latest versions as well
|
|
86
|
-
for (let ii = 0; ii < this._items.length; ii++) {
|
|
87
|
-
if (this._sampleCount <= this.maxSampleCount) {
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
let it = this._items[ii];
|
|
91
|
-
let itRfs = it.recs;
|
|
92
|
-
if (itRfs && itRfs.length > 0) {
|
|
93
|
-
for (let rfi = 0; rfi < itRfs.length; rfi++) {
|
|
94
|
-
if (this._sampleCount <= this.maxSampleCount) {
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
let toBeExpiredRf = itRfs[rfi];
|
|
98
|
-
this.tryExpire(toBeExpiredRf);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
addSprRecFile(item, sprRecFile) {
|
|
105
|
-
this.expire();
|
|
106
|
-
if (!item.recs) {
|
|
107
|
-
item.recs = new Array();
|
|
108
|
-
}
|
|
109
|
-
item.recs[sprRecFile.version] = sprRecFile;
|
|
110
|
-
this._sampleCount += RecordingFileUtils.sampleCount(sprRecFile);
|
|
111
|
-
if (BasicRecFilesCache.DEBUG)
|
|
112
|
-
console.debug("Rec. files cache: Added. Cache samples: " + this._sampleCount);
|
|
113
|
-
}
|
|
114
|
-
setSprRecFileAudioData(sprRecFile, adh) {
|
|
115
|
-
this.expire();
|
|
116
|
-
if (BasicRecFilesCache.DEBUG)
|
|
117
|
-
console.debug("Rec. files cache: Set audio data after expire. Cache samples: " + this._sampleCount);
|
|
118
|
-
let currSampleCnt = RecordingFileUtils.sampleCount(sprRecFile);
|
|
119
|
-
this._sampleCount -= currSampleCnt;
|
|
120
|
-
if (BasicRecFilesCache.DEBUG)
|
|
121
|
-
console.debug("Rec. files cache: Set audio data subtracted curr sample count: " + currSampleCnt + ". Cache samples: " + this._sampleCount);
|
|
122
|
-
RecordingFileUtils.setAudioData(sprRecFile, adh);
|
|
123
|
-
let newSampleCnt = RecordingFileUtils.sampleCount(sprRecFile);
|
|
124
|
-
this._sampleCount += newSampleCnt;
|
|
125
|
-
if (BasicRecFilesCache.DEBUG)
|
|
126
|
-
console.debug("Rec. files cache: Set audio data added new sample count: " + newSampleCnt + ". Cache samples: " + this._sampleCount);
|
|
127
|
-
let fl = adh?.frameLen;
|
|
128
|
-
if (sprRecFile.frames == null && fl) {
|
|
129
|
-
sprRecFile.frames = fl;
|
|
130
|
-
}
|
|
131
|
-
if (BasicRecFilesCache.DEBUG)
|
|
132
|
-
console.debug("Rec. files cache: Set audio data. Cache samples: " + this._sampleCount);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
export class RecFilesCache extends BasicRecFilesCache {
|
|
136
|
-
constructor() {
|
|
137
|
-
super(...arguments);
|
|
138
|
-
this._recFiles = new Array();
|
|
139
|
-
}
|
|
140
|
-
get recFiles() {
|
|
141
|
-
return this._recFiles;
|
|
142
|
-
}
|
|
143
|
-
getRecFile(index) {
|
|
144
|
-
return this._recFiles[index];
|
|
145
|
-
}
|
|
146
|
-
length() {
|
|
147
|
-
return this._recFiles.length;
|
|
148
|
-
}
|
|
149
|
-
expire() {
|
|
150
|
-
if (this._sampleCount > this.maxSampleCount) {
|
|
151
|
-
// audio recorder list is sorted: lower index is newer
|
|
152
|
-
for (let rfI = this._recFiles.length - 1; rfI >= 0; rfI--) {
|
|
153
|
-
if (this._sampleCount <= this.maxSampleCount) {
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
let toBeExpiredRf = this._recFiles[rfI];
|
|
157
|
-
if (toBeExpiredRf.serverPersisted) {
|
|
158
|
-
if (!RecordingFileUtils.equals(toBeExpiredRf, this.currentRecordingFile)) {
|
|
159
|
-
// expire recording files first stored to the cache
|
|
160
|
-
let expiredSamples = RecordingFileUtils.expireAudioData(toBeExpiredRf);
|
|
161
|
-
this._sampleCount -= expiredSamples;
|
|
162
|
-
if (expiredSamples > 0) {
|
|
163
|
-
if (BasicRecFilesCache.DEBUG)
|
|
164
|
-
console.debug("Rec. files cache: Expired #" + rfI + ". Cache samples: " + this._sampleCount);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
if (BasicRecFilesCache.DEBUG)
|
|
169
|
-
console.debug("Rec. files cache: #" + rfI + " is current file. (not expiring)");
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
if (BasicRecFilesCache.DEBUG)
|
|
174
|
-
console.debug("Rec. files cache: #" + rfI + " not yet server persisted.");
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
addRecFile(recFile) {
|
|
180
|
-
this.expire();
|
|
181
|
-
this._recFiles.push(recFile);
|
|
182
|
-
this._sampleCount += RecordingFileUtils.sampleCount(recFile);
|
|
183
|
-
if (BasicRecFilesCache.DEBUG)
|
|
184
|
-
console.debug("Rec. files cache: Added. Cache samples: " + this._sampleCount);
|
|
185
|
-
}
|
|
186
|
-
setRecFileAudioData(recFile, adh) {
|
|
187
|
-
this.expire();
|
|
188
|
-
this._sampleCount -= RecordingFileUtils.sampleCount(recFile);
|
|
189
|
-
RecordingFileUtils.setAudioData(recFile, adh);
|
|
190
|
-
this._sampleCount += RecordingFileUtils.sampleCount(recFile);
|
|
191
|
-
if (BasicRecFilesCache.DEBUG)
|
|
192
|
-
console.debug("Rec. files cache: Set audio data. Cache samples: " + this._sampleCount);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nX2ZpbGVfY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdfZmlsZV9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLGtCQUFrQixFQUFtQixNQUFNLGNBQWMsQ0FBQztBQUlqRixNQUFNLE9BQWdCLGtCQUFrQjtJQUF4QztRQUtFLDBFQUEwRTtRQUVoRSxpQkFBWSxHQUFRLENBQUMsQ0FBQztRQUNoQyxtQkFBYyxHQUFRLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDO1FBQ3JELDBCQUFxQixHQUFvQixJQUFJLENBQUM7SUFXeEQsQ0FBQzthQWxCd0IsVUFBSyxHQUFDLEtBQUssQUFBTixDQUFPO2FBQ1osd0JBQW1CLEdBQUMsRUFBRSxHQUFDLEVBQUUsR0FBQyxLQUFLLEFBQVosQ0FBYSxHQUFFLHdCQUF3QjtJQVNqRixJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxLQUEyQjtRQUNsRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDOztBQUtILE1BQU0sT0FBTyxhQUFjLFNBQVEsa0JBQWtCO0lBQXJEOztRQUdZLFdBQU0sR0FBYSxJQUFJLEtBQUssRUFBUSxDQUFDO0lBOEdqRCxDQUFDO0lBNUdHLElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVM7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTyxDQUFDLEtB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LEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxPQUFxQixFQUFFLEdBQXdCO1FBQ2pFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxZQUFZLElBQUUsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELGtCQUFrQixDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFlBQVksSUFBRSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsSUFBRyxrQkFBa0IsQ0FBQyxLQUFLO1lBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsR0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkgsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZWNvcmRpbmdGaWxlLCBSZWNvcmRpbmdGaWxlVXRpbHMsIFNwclJlY29yZGluZ0ZpbGV9IGZyb20gXCIuLi9yZWNvcmRpbmdcIjtcclxuaW1wb3J0IHtJdGVtfSBmcm9tIFwiLi9pdGVtXCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNpY1JlY0ZpbGVzQ2FjaGUge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFQlVHPWZhbHNlO1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfU0FNUExFUz0xMCo2MCo0ODAwMDsgIC8vIDEwIE1pbnV0ZXMgbW9ubyA0OGtIelxyXG5cclxuICAvL3B1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfU0FNUExFUz0zMCo0ODAwMDsgIC8vIFRFU1QgMzAgc2Vjb25kc1xyXG5cclxuICBwcm90ZWN0ZWQgX3NhbXBsZUNvdW50Om51bWJlcj0wO1xyXG4gIG1heFNhbXBsZUNvdW50Om51bWJlcj1CYXNpY1JlY0ZpbGVzQ2FjaGUuREVGQVVMVF9NQVhfU0FNUExFUztcclxuICBwcml2YXRlIF9jdXJyZW50UmVjb3JkaW5nRmlsZTpSZWNvcmRpbmdGaWxlfG51bGw9bnVsbDtcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZXhwaXJlKCk6dm9pZDtcclxuXHJcbiAgZ2V0IGN1cnJlbnRSZWNvcmRpbmdGaWxlKCk6IFJlY29yZGluZ0ZpbGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UmVjb3JkaW5nRmlsZTtcclxuICB9XHJcblxyXG4gIHNldCBjdXJyZW50UmVjb3JkaW5nRmlsZSh2YWx1ZTogUmVjb3JkaW5nRmlsZSB8IG51bGwpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRSZWNvcmRpbmdGaWxlID0gdmFsdWU7XHJcbiAgICB0aGlzLmV4cGlyZSgpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU3BySXRlbXNDYWNoZSBleHRlbmRzIEJhc2ljUmVjRmlsZXNDYWNoZXtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfaXRlbXM6QXJyYXk8SXRlbT49bmV3IEFycmF5PEl0ZW0+KCk7XHJcblxyXG4gICAgZ2V0IGl0ZW1zKCk6IEFycmF5PEl0ZW0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSXRlbShpdGVtOkl0ZW0pe1xyXG4gICAgICAgIHRoaXMuX2l0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SXRlbShpbmRleDpudW1iZXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1tpbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgbGVuZ3RoKCk6bnVtYmVye1xyXG4gICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmxlbmd0aDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSB0cnlFeHBpcmUodG9CZUV4cGlyZWRSZjpTcHJSZWNvcmRpbmdGaWxlKXtcclxuICAgICAgaWYoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKWNvbnNvbGUuZGVidWcoXCJSZWMuIGZpbGVzIGNhY2hlOiBcIiArIHRvQmVFeHBpcmVkUmYudG9TdHJpbmcoKStcIiB0cnkgZXhwaXJlOlwiKTtcclxuICAgICAgaWYoIVJlY29yZGluZ0ZpbGVVdGlscy5lcXVhbHModG9CZUV4cGlyZWRSZix0aGlzLmN1cnJlbnRSZWNvcmRpbmdGaWxlKSkge1xyXG4gICAgICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogXCIgKyB0b0JlRXhwaXJlZFJmLnRvU3RyaW5nKCkrXCIgbm90IGN1cnJlbnQgZmlsZS4uLlwiKTtcclxuICAgICAgICBpZiAodG9CZUV4cGlyZWRSZi5zZXJ2ZXJQZXJzaXN0ZWQpIHtcclxuICAgICAgICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogXCIgKyB0b0JlRXhwaXJlZFJmLnRvU3RyaW5nKCkrXCIgaXMgc2VydmVyIHBlcnNpc3RlZC4uLlwiKTtcclxuICAgICAgICAgIC8vIGV4cGlyZSByZWNvcmRpbmcgZmlsZXMgZmlyc3Qgc3RvcmVkIHRvIHRoZSBjYWNoZVxyXG4gICAgICAgICAgbGV0IGV4cGlyZWRTYW1wbGVzID0gUmVjb3JkaW5nRmlsZVV0aWxzLmV4cGlyZUF1ZGlvRGF0YSh0b0JlRXhwaXJlZFJmKTtcclxuICAgICAgICAgIHRoaXMuX3NhbXBsZUNvdW50IC09IGV4cGlyZWRTYW1wbGVzO1xyXG4gICAgICAgICAgaWYoZXhwaXJlZFNhbXBsZXM+MCkge1xyXG4gICAgICAgICAgICBpZiAoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKSBjb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogRXhwaXJlZDogXCIgKyB0b0JlRXhwaXJlZFJmLnRvU3RyaW5nKCkgKyBcIi4gQ2FjaGUgc2FtcGxlcyBub3c6IFwiICsgdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6ICNcIiArIHRvQmVFeHBpcmVkUmYudG9TdHJpbmcoKSArIFwiIG5vdCB5ZXQgcGVyc2lzdGVkIG9uIHNlcnZlci5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6IFwiICsgdG9CZUV4cGlyZWRSZi50b1N0cmluZygpK1wiIGlzIGN1cnJlbnQgZmlsZS5cIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgcHJvdGVjdGVkIGV4cGlyZSgpIHtcclxuICAgIC8vIGV4cGlyZSBjb3JyZWN0ZWQgdmVyc2lvbnMgZmlyc3RcclxuICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogRXhwaXJlPyBjdXJyZW50OiBcIit0aGlzLl9zYW1wbGVDb3VudCtcIiwgbWF4OiBcIit0aGlzLm1heFNhbXBsZUNvdW50KTtcclxuICAgIGlmICh0aGlzLl9zYW1wbGVDb3VudCA+IHRoaXMubWF4U2FtcGxlQ291bnQpIHtcclxuXHJcbiAgICAgIC8vIGV4cGlyZSBvbGRlciB2ZXJzaW9ucyBvZiBhbiBpdGVtIGZpcnN0XHJcbiAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5fc2FtcGxlQ291bnQgPD0gdGhpcy5tYXhTYW1wbGVDb3VudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuX2l0ZW1zW2lpXTtcclxuICAgICAgICBsZXQgaXRSZnMgPSBpdC5yZWNzO1xyXG5cclxuICAgICAgICBpZiAoaXRSZnMgJiYgaXRSZnMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgZm9yIChsZXQgcmZpID0gMDsgcmZpIDwgaXRSZnMubGVuZ3RoIC0gMTsgcmZpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NhbXBsZUNvdW50IDw9IHRoaXMubWF4U2FtcGxlQ291bnQpIHtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgdG9CZUV4cGlyZWRSZiA9IGl0UmZzW3JmaV07XHJcbiAgICAgICAgICAgIHRoaXMudHJ5RXhwaXJlKHRvQmVFeHBpcmVkUmYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhhdCdzIG5vdCBzdWZmaWNpZW50IGV4cGlyZSBhdWRpbyBkYXRhIG9mIGxhdGVzdCB2ZXJzaW9ucyBhcyB3ZWxsXHJcbiAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5fc2FtcGxlQ291bnQgPD0gdGhpcy5tYXhTYW1wbGVDb3VudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuX2l0ZW1zW2lpXTtcclxuICAgICAgICBsZXQgaXRSZnMgPSBpdC5yZWNzO1xyXG5cclxuICAgICAgICBpZiAoaXRSZnMgJiYgaXRSZnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgcmZpID0gMDsgcmZpIDwgaXRSZnMubGVuZ3RoOyByZmkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2FtcGxlQ291bnQgPD0gdGhpcy5tYXhTYW1wbGVDb3VudCkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB0b0JlRXhwaXJlZFJmID0gaXRSZnNbcmZpXTtcclxuICAgICAgICAgICAgdGhpcy50cnlFeHBpcmUodG9CZUV4cGlyZWRSZik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRTcHJSZWNGaWxlKGl0ZW06SXRlbSxzcHJSZWNGaWxlOlNwclJlY29yZGluZ0ZpbGUpe1xyXG4gICAgdGhpcy5leHBpcmUoKTtcclxuICAgIGlmKCFpdGVtLnJlY3MpIHtcclxuICAgICAgaXRlbS5yZWNzPW5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgfVxyXG4gICAgaXRlbS5yZWNzW3NwclJlY0ZpbGUudmVyc2lvbl09c3ByUmVjRmlsZTtcclxuICAgIHRoaXMuX3NhbXBsZUNvdW50ICs9IFJlY29yZGluZ0ZpbGVVdGlscy5zYW1wbGVDb3VudChzcHJSZWNGaWxlKTtcclxuICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogQWRkZWQuIENhY2hlIHNhbXBsZXM6IFwiK3RoaXMuX3NhbXBsZUNvdW50KTtcclxuICB9XHJcblxyXG4gIHNldFNwclJlY0ZpbGVBdWRpb0RhdGEoc3ByUmVjRmlsZTpTcHJSZWNvcmRpbmdGaWxlLCBhZGg6QXVkaW9EYXRhSG9sZGVyfG51bGwpe1xyXG4gICAgdGhpcy5leHBpcmUoKTtcclxuICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogU2V0IGF1ZGlvIGRhdGEgYWZ0ZXIgZXhwaXJlLiBDYWNoZSBzYW1wbGVzOiBcIit0aGlzLl9zYW1wbGVDb3VudCk7XHJcbiAgICBsZXQgY3VyclNhbXBsZUNudD1SZWNvcmRpbmdGaWxlVXRpbHMuc2FtcGxlQ291bnQoc3ByUmVjRmlsZSk7XHJcbiAgICB0aGlzLl9zYW1wbGVDb3VudC09Y3VyclNhbXBsZUNudDtcclxuICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogU2V0IGF1ZGlvIGRhdGEgc3VidHJhY3RlZCBjdXJyIHNhbXBsZSBjb3VudDogXCIrY3VyclNhbXBsZUNudCtcIi4gQ2FjaGUgc2FtcGxlczogXCIrdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShzcHJSZWNGaWxlLGFkaCk7XHJcbiAgICBsZXQgbmV3U2FtcGxlQ250PVJlY29yZGluZ0ZpbGVVdGlscy5zYW1wbGVDb3VudChzcHJSZWNGaWxlKTtcclxuICAgIHRoaXMuX3NhbXBsZUNvdW50Kz1uZXdTYW1wbGVDbnQ7XHJcbiAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6IFNldCBhdWRpbyBkYXRhIGFkZGVkIG5ldyBzYW1wbGUgY291bnQ6IFwiK25ld1NhbXBsZUNudCtcIi4gQ2FjaGUgc2FtcGxlczogXCIrdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gICAgbGV0IGZsPWFkaD8uZnJhbWVMZW47XHJcbiAgICBpZihzcHJSZWNGaWxlLmZyYW1lcz09bnVsbCAmJiBmbCl7XHJcbiAgICAgIHNwclJlY0ZpbGUuZnJhbWVzPWZsO1xyXG4gICAgfVxyXG4gICAgaWYoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKWNvbnNvbGUuZGVidWcoXCJSZWMuIGZpbGVzIGNhY2hlOiBTZXQgYXVkaW8gZGF0YS4gQ2FjaGUgc2FtcGxlczogXCIrdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNGaWxlc0NhY2hlIGV4dGVuZHMgQmFzaWNSZWNGaWxlc0NhY2hle1xyXG5cclxuICBwcml2YXRlIF9yZWNGaWxlczpBcnJheTxSZWNvcmRpbmdGaWxlPj1uZXcgQXJyYXk8UmVjb3JkaW5nRmlsZT4oKTtcclxuXHJcbiAgZ2V0IHJlY0ZpbGVzKCk6IEFycmF5PFJlY29yZGluZ0ZpbGU+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNGaWxlcztcclxuICB9XHJcblxyXG4gIGdldFJlY0ZpbGUoaW5kZXg6bnVtYmVyKXtcclxuICAgIHJldHVybiB0aGlzLl9yZWNGaWxlc1tpbmRleF07XHJcbiAgfVxyXG5cclxuICBsZW5ndGgoKTpudW1iZXJ7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjRmlsZXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGV4cGlyZSgpIHtcclxuICAgIGlmICh0aGlzLl9zYW1wbGVDb3VudCA+IHRoaXMubWF4U2FtcGxlQ291bnQpIHtcclxuICAgICAgLy8gYXVkaW8gcmVjb3JkZXIgbGlzdCBpcyBzb3J0ZWQ6IGxvd2VyIGluZGV4IGlzIG5ld2VyXHJcbiAgICAgIGZvciAobGV0IHJmSSA9IHRoaXMuX3JlY0ZpbGVzLmxlbmd0aC0xOyByZkkgPj0wOyByZkktLSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zYW1wbGVDb3VudCA8PSB0aGlzLm1heFNhbXBsZUNvdW50KSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHRvQmVFeHBpcmVkUmYgPSB0aGlzLl9yZWNGaWxlc1tyZkldO1xyXG4gICAgICAgIGlmICh0b0JlRXhwaXJlZFJmLnNlcnZlclBlcnNpc3RlZCkge1xyXG4gICAgICAgICAgaWYoIVJlY29yZGluZ0ZpbGVVdGlscy5lcXVhbHModG9CZUV4cGlyZWRSZix0aGlzLmN1cnJlbnRSZWNvcmRpbmdGaWxlKSkge1xyXG4gICAgICAgICAgICAvLyBleHBpcmUgcmVjb3JkaW5nIGZpbGVzIGZpcnN0IHN0b3JlZCB0byB0aGUgY2FjaGVcclxuICAgICAgICAgICAgbGV0IGV4cGlyZWRTYW1wbGVzID0gUmVjb3JkaW5nRmlsZVV0aWxzLmV4cGlyZUF1ZGlvRGF0YSh0b0JlRXhwaXJlZFJmKTtcclxuICAgICAgICAgICAgdGhpcy5fc2FtcGxlQ291bnQgLT0gZXhwaXJlZFNhbXBsZXM7XHJcbiAgICAgICAgICAgIGlmKGV4cGlyZWRTYW1wbGVzPjApIHtcclxuICAgICAgICAgICAgICBpZiAoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKSBjb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogRXhwaXJlZCAjXCIgKyByZkkgKyBcIi4gQ2FjaGUgc2FtcGxlczogXCIgKyB0aGlzLl9zYW1wbGVDb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6ICNcIityZkkrXCIgaXMgY3VycmVudCBmaWxlLiAobm90IGV4cGlyaW5nKVwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogI1wiK3JmSStcIiBub3QgeWV0IHNlcnZlciBwZXJzaXN0ZWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUmVjRmlsZShyZWNGaWxlOlJlY29yZGluZ0ZpbGUpe1xyXG4gICAgdGhpcy5leHBpcmUoKTtcclxuICAgIHRoaXMuX3JlY0ZpbGVzLnB1c2gocmVjRmlsZSk7XHJcbiAgICB0aGlzLl9zYW1wbGVDb3VudCArPSBSZWNvcmRpbmdGaWxlVXRpbHMuc2FtcGxlQ291bnQocmVjRmlsZSk7XHJcbiAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6IEFkZGVkLiBDYWNoZSBzYW1wbGVzOiBcIit0aGlzLl9zYW1wbGVDb3VudCk7XHJcbiAgfVxyXG5cclxuICBzZXRSZWNGaWxlQXVkaW9EYXRhKHJlY0ZpbGU6UmVjb3JkaW5nRmlsZSwgYWRoOkF1ZGlvRGF0YUhvbGRlcnxudWxsKXtcclxuICAgIHRoaXMuZXhwaXJlKCk7XHJcbiAgICB0aGlzLl9zYW1wbGVDb3VudC09UmVjb3JkaW5nRmlsZVV0aWxzLnNhbXBsZUNvdW50KHJlY0ZpbGUpO1xyXG4gICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShyZWNGaWxlLGFkaCk7XHJcbiAgICB0aGlzLl9zYW1wbGVDb3VudCs9UmVjb3JkaW5nRmlsZVV0aWxzLnNhbXBsZUNvdW50KHJlY0ZpbGUpO1xyXG4gICAgaWYoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKWNvbnNvbGUuZGVidWcoXCJSZWMuIGZpbGVzIGNhY2hlOiBTZXQgYXVkaW8gZGF0YS4gQ2FjaGUgc2FtcGxlczogXCIrdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from "@angular/core";
|
|
2
|
-
import { MediaUtils } from "../../media/utils";
|
|
3
|
-
import { MatTableDataSource } from "@angular/material/table";
|
|
4
|
-
import { RecFilesCache } from "./recording_file_cache";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/material/icon";
|
|
7
|
-
import * as i2 from "@angular/material/button";
|
|
8
|
-
import * as i3 from "@angular/material/card";
|
|
9
|
-
import * as i4 from "@angular/material/table";
|
|
10
|
-
import * as i5 from "../../utils/scrollIntoViewToBottom";
|
|
11
|
-
import * as i6 from "@angular/common";
|
|
12
|
-
export class RecordingList {
|
|
13
|
-
constructor() {
|
|
14
|
-
//private recordingList:Array<RecordingFile>=new Array<RecordingFile>();
|
|
15
|
-
this.recordingList = new RecFilesCache();
|
|
16
|
-
//cols=['index','length','samples','samplerate','action'];
|
|
17
|
-
this.cols = ['index', 'startedDate', 'length', 'action'];
|
|
18
|
-
this.selectDisabled = false;
|
|
19
|
-
this.selectedRecordingFileChanged = new EventEmitter();
|
|
20
|
-
this.selectedRecordingFile = null;
|
|
21
|
-
this.recordingListDataSource = new MatTableDataSource();
|
|
22
|
-
}
|
|
23
|
-
ngAfterViewInit() {
|
|
24
|
-
this.buildDataSource();
|
|
25
|
-
}
|
|
26
|
-
buildDataSource() {
|
|
27
|
-
this.recordingList.recFiles.sort((a, b) => {
|
|
28
|
-
let cmp = 0;
|
|
29
|
-
let aD = null;
|
|
30
|
-
let bD = null;
|
|
31
|
-
if (a._startedAsDateObj && b._startedAsDateObj) {
|
|
32
|
-
aD = a._startedAsDateObj;
|
|
33
|
-
bD = b._startedAsDateObj;
|
|
34
|
-
}
|
|
35
|
-
else if (a.startedDate && b.startedDate) {
|
|
36
|
-
aD = new Date(a.startedDate);
|
|
37
|
-
bD = new Date(b.startedDate);
|
|
38
|
-
}
|
|
39
|
-
else if (a.date && b.date) {
|
|
40
|
-
aD = new Date(a.date);
|
|
41
|
-
bD = new Date(b.date);
|
|
42
|
-
}
|
|
43
|
-
if (aD !== null && bD !== null) {
|
|
44
|
-
cmp = bD.getTime() - aD.getTime();
|
|
45
|
-
}
|
|
46
|
-
return cmp;
|
|
47
|
-
});
|
|
48
|
-
this.recordingListDataSource.data = this.recordingList.recFiles;
|
|
49
|
-
}
|
|
50
|
-
addRecFile(rf) {
|
|
51
|
-
this.recordingList.addRecFile(rf);
|
|
52
|
-
this.buildDataSource();
|
|
53
|
-
}
|
|
54
|
-
setRecFileAudioData(recFile, adh) {
|
|
55
|
-
this.recordingList.setRecFileAudioData(recFile, adh);
|
|
56
|
-
}
|
|
57
|
-
selectRecordingFile(rf) {
|
|
58
|
-
this.recordingList.currentRecordingFile = rf;
|
|
59
|
-
this.selectedRecordingFileChanged.emit(rf);
|
|
60
|
-
}
|
|
61
|
-
selectTop() {
|
|
62
|
-
if (this.recordingList.recFiles.length > 0) {
|
|
63
|
-
this.selectRecordingFile(this.recordingList.recFiles[0]);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
lengthTimeFormatted(rf) {
|
|
67
|
-
let str = '--:--:--';
|
|
68
|
-
let tl = null;
|
|
69
|
-
if (rf.timeLength) {
|
|
70
|
-
tl = rf.timeLength;
|
|
71
|
-
}
|
|
72
|
-
else if (rf.frames && rf.audioDataHolder) {
|
|
73
|
-
tl = rf.frames / rf.audioDataHolder?.sampleRate;
|
|
74
|
-
}
|
|
75
|
-
if (tl) {
|
|
76
|
-
str = MediaUtils.toMediaTime(tl);
|
|
77
|
-
}
|
|
78
|
-
return str;
|
|
79
|
-
}
|
|
80
|
-
recordingFileCached(rf) {
|
|
81
|
-
let cached = null;
|
|
82
|
-
if (rf && rf.serverPersisted) {
|
|
83
|
-
cached = (rf.audioDataHolder != null);
|
|
84
|
-
}
|
|
85
|
-
return cached;
|
|
86
|
-
}
|
|
87
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
88
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RecordingList, selector: "app-recordinglist", inputs: { selectDisabled: "selectDisabled", selectedRecordingFile: "selectedRecordingFile" }, outputs: { selectedRecordingFileChanged: "selectedRecordingFileChanged" }, ngImport: i0, template: `
|
|
89
|
-
<mat-card appearance="outlined">
|
|
90
|
-
<mat-card-header>
|
|
91
|
-
<h2>Recording list</h2>
|
|
92
|
-
</mat-card-header>
|
|
93
|
-
<mat-card-content>
|
|
94
|
-
<table mat-table [dataSource]="recordingListDataSource" class="mat-elevation-z0">
|
|
95
|
-
<tr mat-header-row *matHeaderRowDef="cols;sticky:true"></tr>
|
|
96
|
-
<tr mat-row *matRowDef="let element; columns: cols;"
|
|
97
|
-
[scrollIntoViewToBottom]="element.uuid===selectedRecordingFile?.uuid" [class.selected]="element.uuid===selectedRecordingFile?.uuid"></tr>
|
|
98
|
-
<ng-container matColumnDef="index">
|
|
99
|
-
<th mat-header-cell *matHeaderCellDef mat-header>#</th>
|
|
100
|
-
<td mat-cell class="monospaced"
|
|
101
|
-
*matCellDef="let element;let i = index">{{recordingListDataSource.data.length - i}}</td>
|
|
102
|
-
</ng-container>
|
|
103
|
-
<ng-container matColumnDef="startedDate">
|
|
104
|
-
<th mat-header-cell *matHeaderCellDef mat-header>Started</th>
|
|
105
|
-
<td mat-cell class="monospaced"
|
|
106
|
-
*matCellDef="let element">{{element.startedDate | date:'YYYY-MM-dd HH:mm:ss'}}</td>
|
|
107
|
-
</ng-container>
|
|
108
|
-
<ng-container matColumnDef="length">
|
|
109
|
-
<th mat-header-cell *matHeaderCellDef mat-header>Length</th>
|
|
110
|
-
<td mat-cell class="monospaced" *matCellDef="let element">{{lengthTimeFormatted(element)}}</td>
|
|
111
|
-
</ng-container>
|
|
112
|
-
<ng-container matColumnDef="action">
|
|
113
|
-
<th mat-header-cell *matHeaderCellDef>Action</th>
|
|
114
|
-
<td mat-cell *matCellDef="let element">
|
|
115
|
-
<!--
|
|
116
|
-
<mat-icon *ngIf="recordingFileCached(element)===false" style="font-size:0.8em;width:0.8em;height:0.8em">
|
|
117
|
-
cloud_download
|
|
118
|
-
</mat-icon>
|
|
119
|
-
-->
|
|
120
|
-
<button mat-stroked-button color="primary" (click)="selectRecordingFile(element)"
|
|
121
|
-
[disabled]="selectDisabled || element.uuid===selectedRecordingFile?.uuid">
|
|
122
|
-
<mat-icon>edit_attributes</mat-icon>
|
|
123
|
-
Select
|
|
124
|
-
</button>
|
|
125
|
-
|
|
126
|
-
</td>
|
|
127
|
-
</ng-container>
|
|
128
|
-
</table>
|
|
129
|
-
</mat-card-content>
|
|
130
|
-
</mat-card>
|
|
131
|
-
|
|
132
|
-
`, isInline: true, styles: [".monospaced{font-family:monospace}.mat-mdc-cell,.mat-mdc-header-cell{padding-left:5px;padding-right:5px}.mat-mdc-card,.mat-mdc-card-header,.mat-mdc-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}.spr-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ":host{position:relative;margin:0;padding:0;background:#d3d3d3;width:100%;flex:1;overflow-y:auto;min-height:0px}\n", ".selected{font-weight:700}\n"], dependencies: [{ kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i5.ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: ["scrollIntoViewToBottom"] }, { kind: "pipe", type: i6.DatePipe, name: "date" }] }); }
|
|
133
|
-
}
|
|
134
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingList, decorators: [{
|
|
135
|
-
type: Component,
|
|
136
|
-
args: [{ selector: 'app-recordinglist', template: `
|
|
137
|
-
<mat-card appearance="outlined">
|
|
138
|
-
<mat-card-header>
|
|
139
|
-
<h2>Recording list</h2>
|
|
140
|
-
</mat-card-header>
|
|
141
|
-
<mat-card-content>
|
|
142
|
-
<table mat-table [dataSource]="recordingListDataSource" class="mat-elevation-z0">
|
|
143
|
-
<tr mat-header-row *matHeaderRowDef="cols;sticky:true"></tr>
|
|
144
|
-
<tr mat-row *matRowDef="let element; columns: cols;"
|
|
145
|
-
[scrollIntoViewToBottom]="element.uuid===selectedRecordingFile?.uuid" [class.selected]="element.uuid===selectedRecordingFile?.uuid"></tr>
|
|
146
|
-
<ng-container matColumnDef="index">
|
|
147
|
-
<th mat-header-cell *matHeaderCellDef mat-header>#</th>
|
|
148
|
-
<td mat-cell class="monospaced"
|
|
149
|
-
*matCellDef="let element;let i = index">{{recordingListDataSource.data.length - i}}</td>
|
|
150
|
-
</ng-container>
|
|
151
|
-
<ng-container matColumnDef="startedDate">
|
|
152
|
-
<th mat-header-cell *matHeaderCellDef mat-header>Started</th>
|
|
153
|
-
<td mat-cell class="monospaced"
|
|
154
|
-
*matCellDef="let element">{{element.startedDate | date:'YYYY-MM-dd HH:mm:ss'}}</td>
|
|
155
|
-
</ng-container>
|
|
156
|
-
<ng-container matColumnDef="length">
|
|
157
|
-
<th mat-header-cell *matHeaderCellDef mat-header>Length</th>
|
|
158
|
-
<td mat-cell class="monospaced" *matCellDef="let element">{{lengthTimeFormatted(element)}}</td>
|
|
159
|
-
</ng-container>
|
|
160
|
-
<ng-container matColumnDef="action">
|
|
161
|
-
<th mat-header-cell *matHeaderCellDef>Action</th>
|
|
162
|
-
<td mat-cell *matCellDef="let element">
|
|
163
|
-
<!--
|
|
164
|
-
<mat-icon *ngIf="recordingFileCached(element)===false" style="font-size:0.8em;width:0.8em;height:0.8em">
|
|
165
|
-
cloud_download
|
|
166
|
-
</mat-icon>
|
|
167
|
-
-->
|
|
168
|
-
<button mat-stroked-button color="primary" (click)="selectRecordingFile(element)"
|
|
169
|
-
[disabled]="selectDisabled || element.uuid===selectedRecordingFile?.uuid">
|
|
170
|
-
<mat-icon>edit_attributes</mat-icon>
|
|
171
|
-
Select
|
|
172
|
-
</button>
|
|
173
|
-
|
|
174
|
-
</td>
|
|
175
|
-
</ng-container>
|
|
176
|
-
</table>
|
|
177
|
-
</mat-card-content>
|
|
178
|
-
</mat-card>
|
|
179
|
-
|
|
180
|
-
`, styles: [".monospaced{font-family:monospace}.mat-mdc-cell,.mat-mdc-header-cell{padding-left:5px;padding-right:5px}.mat-mdc-card,.mat-mdc-card-header,.mat-mdc-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}.spr-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ":host{position:relative;margin:0;padding:0;background:#d3d3d3;width:100%;flex:1;overflow-y:auto;min-height:0px}\n", ".selected{font-weight:700}\n"] }]
|
|
181
|
-
}], ctorParameters: () => [], propDecorators: { selectDisabled: [{
|
|
182
|
-
type: Input
|
|
183
|
-
}], selectedRecordingFileChanged: [{
|
|
184
|
-
type: Output
|
|
185
|
-
}], selectedRecordingFile: [{
|
|
186
|
-
type: Input
|
|
187
|
-
}] } });
|
|
188
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nX2xpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdfbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVwRixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7OztBQTRFckQsTUFBTSxPQUFPLGFBQWE7SUFXeEI7UUFWQSx3RUFBd0U7UUFDaEUsa0JBQWEsR0FBZSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBR3hELDBEQUEwRDtRQUMxRCxTQUFJLEdBQUMsQ0FBQyxPQUFPLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxtQkFBYyxHQUFTLEtBQUssQ0FBQztRQUM1QixpQ0FBNEIsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUNsRSwwQkFBcUIsR0FBb0IsSUFBSSxDQUFDO1FBR3JELElBQUksQ0FBQyx1QkFBdUIsR0FBQyxJQUFJLGtCQUFrQixFQUFpQixDQUFDO0lBQ3ZFLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLEdBQUcsR0FBUSxDQUFDLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQVcsSUFB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UUFDaEIsSUFBRyxFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7K0dBbEZVLGFBQWE7bUdBQWIsYUFBYSxrT0FyRWQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNENUOzs0RkF5QlUsYUFBYTtrQkF6RXpCLFNBQVM7K0JBRUUsbUJBQW1CLFlBRW5COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDVDt3REFnQ1EsY0FBYztzQkFBdEIsS0FBSztnQkFDSSw0QkFBNEI7c0JBQXJDLE1BQU07Z0JBQ0UscUJBQXFCO3NCQUE3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlfSBmcm9tIFwiLi4vcmVjb3JkaW5nXCI7XHJcbmltcG9ydCB7TWVkaWFVdGlsc30gZnJvbSBcIi4uLy4uL21lZGlhL3V0aWxzXCI7XHJcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHtSZWNGaWxlc0NhY2hlfSBmcm9tIFwiLi9yZWNvcmRpbmdfZmlsZV9jYWNoZVwiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtcmVjb3JkaW5nbGlzdCcsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCI+XHJcbiAgICAgIDxtYXQtY2FyZC1oZWFkZXI+XHJcbiAgICAgICAgPGgyPlJlY29yZGluZyBsaXN0PC9oMj5cclxuICAgICAgPC9tYXQtY2FyZC1oZWFkZXI+XHJcbiAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVjb3JkaW5nTGlzdERhdGFTb3VyY2VcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejBcIj5cclxuICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29scztzdGlja3k6dHJ1ZVwiPjwvdHI+XHJcbiAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IGNvbHM7XCJcclxuICAgICAgICAgICAgICBbc2Nyb2xsSW50b1ZpZXdUb0JvdHRvbV09XCJlbGVtZW50LnV1aWQ9PT1zZWxlY3RlZFJlY29yZGluZ0ZpbGU/LnV1aWRcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiZWxlbWVudC51dWlkPT09c2VsZWN0ZWRSZWNvcmRpbmdGaWxlPy51dWlkXCI+PC90cj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5kZXhcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtaGVhZGVyPiM8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJtb25vc3BhY2VkXCJcclxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7bGV0IGkgPSBpbmRleFwiPnt7cmVjb3JkaW5nTGlzdERhdGFTb3VyY2UuZGF0YS5sZW5ndGggLSBpfX08L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInN0YXJ0ZWREYXRlXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LWhlYWRlcj5TdGFydGVkPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwibW9ub3NwYWNlZFwiXHJcbiAgICAgICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50LnN0YXJ0ZWREYXRlIHwgZGF0ZTonWVlZWS1NTS1kZCBISDptbTpzcyd9fTwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LWhlYWRlcj5MZW5ndGg8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJtb25vc3BhY2VkXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7bGVuZ3RoVGltZUZvcm1hdHRlZChlbGVtZW50KX19PC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25cIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgICAgICAgIDwhLS1cclxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyZWNvcmRpbmdGaWxlQ2FjaGVkKGVsZW1lbnQpPT09ZmFsc2VcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTt3aWR0aDowLjhlbTtoZWlnaHQ6MC44ZW1cIj5cclxuICAgICAgICAgICAgICAgIGNsb3VkX2Rvd25sb2FkXHJcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAtLT5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2VsZWN0UmVjb3JkaW5nRmlsZShlbGVtZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0RGlzYWJsZWQgfHwgZWxlbWVudC51dWlkPT09c2VsZWN0ZWRSZWNvcmRpbmdGaWxlPy51dWlkXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdF9hdHRyaWJ1dGVzPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdFxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgIDwvbWF0LWNhcmQ+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaWdodGdyZXk7XHJcbiAgICB3aWR0aDogMTAwJTsgLyogdXNlIGFsbCBob3Jpem9udGFsIGF2YWlsYWJsZSBzcGFjZSAqL1xyXG4gICAgZmxleDogMTsgLyogLi4uIGFuZCBmaWxsIHJlc3Qgb2YgdmVydGljYWwgYXZhaWxhYmxlIHNwYWNlIChvdGhlciBjb21wb25lbnRzIGhhdmUgZmxleCAwKSAqL1xyXG4gICAgb3ZlcmZsb3cteTogYXV0bztcclxuXHJcbiAgICAvKiBXb3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICBJZiB0aGUgcHJvZ3Jlc3MgdGFibGUgZ2V0cyBsb25nIChzY3JpcHQgd2l0aCBtYW55IGl0ZW1zKSBGRiBpbmNyZWFzZXMgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmZsb3cgcHJvZ3Jlc3NDb250YWluZXIgYW5kXHJcbiAgICB0aGUgd2hvbGUgYXBwIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwYWdlIGFueW1vcmUuIFRoZSBhcHAgb3ZlcmZsb3dzIGFuZCBzaG93cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBmb3IgdGhlIHdob2xlIGFwcC5cclxuICAgIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODYzNjgzMi9maXJlZm94LW92ZXJmbG93LXktbm90LXdvcmtpbmctd2l0aC1uZXN0ZWQtZmxleGJveFxyXG4gICAgKi9cclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgfWAsYFxyXG4gICAgLnNlbGVjdGVke1xyXG4gICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIH1cclxuICBgXSxcclxuICBzdHlsZVVybHM6IFsnLi4vLi4vc3BlZWNocmVjb3JkZXJfbWF0LnNjc3MnXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0xpc3QgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0e1xyXG4gIC8vcHJpdmF0ZSByZWNvcmRpbmdMaXN0OkFycmF5PFJlY29yZGluZ0ZpbGU+PW5ldyBBcnJheTxSZWNvcmRpbmdGaWxlPigpO1xyXG4gIHByaXZhdGUgcmVjb3JkaW5nTGlzdDpSZWNGaWxlc0NhY2hlPW5ldyBSZWNGaWxlc0NhY2hlKCk7XHJcbiAgLy9yZWNvcmRpbmdMaXN0U3ViamVjdDpTdWJqZWN0PEFycmF5PFJlY29yZGluZ0ZpbGU+PiA9IG5ldyBTdWJqZWN0PEFycmF5PFJlY29yZGluZ0ZpbGU+PigpO1xyXG4gIHJlY29yZGluZ0xpc3REYXRhU291cmNlOk1hdFRhYmxlRGF0YVNvdXJjZTxSZWNvcmRpbmdGaWxlPjtcclxuICAvL2NvbHM9WydpbmRleCcsJ2xlbmd0aCcsJ3NhbXBsZXMnLCdzYW1wbGVyYXRlJywnYWN0aW9uJ107XHJcbiAgY29scz1bJ2luZGV4Jywnc3RhcnRlZERhdGUnLCdsZW5ndGgnLCdhY3Rpb24nXTtcclxuICBASW5wdXQoKSBzZWxlY3REaXNhYmxlZDpib29sZWFuPWZhbHNlO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFJlY29yZGluZ0ZpbGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmRpbmdGaWxlPigpO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkUmVjb3JkaW5nRmlsZTpSZWNvcmRpbmdGaWxlfG51bGw9bnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnJlY29yZGluZ0xpc3REYXRhU291cmNlPW5ldyBNYXRUYWJsZURhdGFTb3VyY2U8UmVjb3JkaW5nRmlsZT4oKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuYnVpbGREYXRhU291cmNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkRGF0YVNvdXJjZSgpe1xyXG4gICAgdGhpcy5yZWNvcmRpbmdMaXN0LnJlY0ZpbGVzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgbGV0IGNtcDpudW1iZXI9MDtcclxuICAgICAgbGV0IGFEOkRhdGV8bnVsbD1udWxsO1xyXG4gICAgICBsZXQgYkQ6RGF0ZXxudWxsPW51bGw7XHJcbiAgICAgIGlmKGEuX3N0YXJ0ZWRBc0RhdGVPYmogJiYgYi5fc3RhcnRlZEFzRGF0ZU9iail7XHJcbiAgICAgICAgYUQ9YS5fc3RhcnRlZEFzRGF0ZU9ialxyXG4gICAgICAgIGJEPWIuX3N0YXJ0ZWRBc0RhdGVPYmpcclxuICAgICAgfWVsc2UgaWYoYS5zdGFydGVkRGF0ZSAmJiBiLnN0YXJ0ZWREYXRlKXtcclxuICAgICAgICBhRD1uZXcgRGF0ZShhLnN0YXJ0ZWREYXRlKTtcclxuICAgICAgICBiRD1uZXcgRGF0ZShiLnN0YXJ0ZWREYXRlKTtcclxuICAgICAgfWVsc2UgaWYoYS5kYXRlICYmIGIuZGF0ZSkge1xyXG4gICAgICAgIGFEPW5ldyBEYXRlKGEuZGF0ZSk7XHJcbiAgICAgICAgYkQ9bmV3IERhdGUoYi5kYXRlKTtcclxuICAgICAgfVxyXG4gICAgICBpZihhRCE9PW51bGwgJiYgYkQhPT1udWxsKXtcclxuICAgICAgICBjbXA9YkQuZ2V0VGltZSgpLWFELmdldFRpbWUoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY21wO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlY29yZGluZ0xpc3REYXRhU291cmNlLmRhdGE9dGhpcy5yZWNvcmRpbmdMaXN0LnJlY0ZpbGVzO1xyXG4gIH1cclxuXHJcbiAgYWRkUmVjRmlsZShyZjpSZWNvcmRpbmdGaWxlKXtcclxuICAgIHRoaXMucmVjb3JkaW5nTGlzdC5hZGRSZWNGaWxlKHJmKTtcclxuICAgIHRoaXMuYnVpbGREYXRhU291cmNlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRSZWNGaWxlQXVkaW9EYXRhKHJlY0ZpbGU6UmVjb3JkaW5nRmlsZSwgYWRoOkF1ZGlvRGF0YUhvbGRlcnxudWxsKSB7XHJcbiAgICB0aGlzLnJlY29yZGluZ0xpc3Quc2V0UmVjRmlsZUF1ZGlvRGF0YShyZWNGaWxlLGFkaCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RSZWNvcmRpbmdGaWxlKHJmOlJlY29yZGluZ0ZpbGUpe1xyXG4gICAgdGhpcy5yZWNvcmRpbmdMaXN0LmN1cnJlbnRSZWNvcmRpbmdGaWxlPXJmO1xyXG4gICAgdGhpcy5zZWxlY3RlZFJlY29yZGluZ0ZpbGVDaGFuZ2VkLmVtaXQocmYpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VG9wKCkge1xyXG4gICAgaWYgKHRoaXMucmVjb3JkaW5nTGlzdC5yZWNGaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0UmVjb3JkaW5nRmlsZSh0aGlzLnJlY29yZGluZ0xpc3QucmVjRmlsZXNbMF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGVuZ3RoVGltZUZvcm1hdHRlZChyZjpSZWNvcmRpbmdGaWxlKXtcclxuICAgIGxldCBzdHI9Jy0tOi0tOi0tJztcclxuICAgIGxldCB0bD1udWxsO1xyXG4gICAgaWYocmYudGltZUxlbmd0aCl7XHJcbiAgICAgIHRsPXJmLnRpbWVMZW5ndGg7XHJcbiAgICB9ZWxzZSBpZihyZi5mcmFtZXMgJiYgcmYuYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgICAgIHRsPXJmLmZyYW1lcyAvIHJmLmF1ZGlvRGF0YUhvbGRlcj8uc2FtcGxlUmF0ZVxyXG4gICAgfVxyXG4gICAgaWYodGwpIHtcclxuICAgICAgc3RyID0gTWVkaWFVdGlscy50b01lZGlhVGltZSh0bCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgcmVjb3JkaW5nRmlsZUNhY2hlZChyZjpSZWNvcmRpbmdGaWxlKTpib29sZWFufG51bGx7XHJcbiAgICBsZXQgY2FjaGVkPW51bGw7XHJcbiAgICBpZihyZiAmJiByZi5zZXJ2ZXJQZXJzaXN0ZWQpIHtcclxuICAgICAgY2FjaGVkID0gKHJmLmF1ZGlvRGF0YUhvbGRlciAhPSBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjYWNoZWQ7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|