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.
Files changed (99) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/speechrecorderng.mjs +204 -201
  3. package/fesm2022/speechrecorderng.mjs.map +1 -1
  4. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
  5. package/lib/spr.module.version.d.ts +1 -1
  6. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  7. package/lib/ui/responsive_component.d.ts +1 -1
  8. package/package.json +13 -15
  9. package/esm2022/lib/action/action.mjs +0 -73
  10. package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
  11. package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
  12. package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
  13. package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
  14. package/esm2022/lib/audio/audio_display.mjs +0 -118
  15. package/esm2022/lib/audio/audio_player.mjs +0 -238
  16. package/esm2022/lib/audio/capture/capture.mjs +0 -855
  17. package/esm2022/lib/audio/context.mjs +0 -79
  18. package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
  19. package/esm2022/lib/audio/format.mjs +0 -20
  20. package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
  21. package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
  22. package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
  23. package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
  24. package/esm2022/lib/audio/io/stream.mjs +0 -59
  25. package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
  26. package/esm2022/lib/audio/persistor.mjs +0 -81
  27. package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
  28. package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
  29. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  30. package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
  31. package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
  32. package/esm2022/lib/audio/playback/player.mjs +0 -402
  33. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  34. package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
  35. package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
  36. package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
  37. package/esm2022/lib/audio/ui/common.mjs +0 -19
  38. package/esm2022/lib/audio/ui/container.mjs +0 -414
  39. package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
  40. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  41. package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
  42. package/esm2022/lib/db/inddb.mjs +0 -120
  43. package/esm2022/lib/dsp/utils.mjs +0 -48
  44. package/esm2022/lib/environment/environment.defaults.mjs +0 -9
  45. package/esm2022/lib/io/BinaryReader.mjs +0 -93
  46. package/esm2022/lib/io/BinaryWriter.mjs +0 -80
  47. package/esm2022/lib/io/stream.mjs +0 -259
  48. package/esm2022/lib/math/2d/geometry.mjs +0 -28
  49. package/esm2022/lib/math/complex.mjs +0 -58
  50. package/esm2022/lib/math/dft.mjs +0 -196
  51. package/esm2022/lib/media/utils.mjs +0 -14
  52. package/esm2022/lib/net/uploader.mjs +0 -367
  53. package/esm2022/lib/recorder_component.mjs +0 -65
  54. package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
  55. package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
  56. package/esm2022/lib/speechrecorder/recording.mjs +0 -124
  57. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
  58. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  59. package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
  60. package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
  61. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  62. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
  63. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
  64. package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
  65. package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
  66. package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
  67. package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
  68. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  69. package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
  70. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
  71. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
  72. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
  73. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
  74. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
  75. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  76. package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
  77. package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
  78. package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
  79. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
  80. package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
  81. package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
  82. package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
  83. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  84. package/esm2022/lib/speechrecorderng.component.mjs +0 -392
  85. package/esm2022/lib/speechrecorderng.module.mjs +0 -97
  86. package/esm2022/lib/spr.config.mjs +0 -27
  87. package/esm2022/lib/spr.module.version.mjs +0 -2
  88. package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
  89. package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
  90. package/esm2022/lib/ui/message_dialog.mjs +0 -51
  91. package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
  92. package/esm2022/lib/ui/responsive_component.mjs +0 -24
  93. package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
  94. package/esm2022/lib/utils/ua-parser.mjs +0 -190
  95. package/esm2022/lib/utils/utils.mjs +0 -132
  96. package/esm2022/lib/utils/wake_lock.mjs +0 -114
  97. package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
  98. package/esm2022/public-api.mjs +0 -35
  99. package/esm2022/speechrecorderng.mjs +0 -5
@@ -1,146 +0,0 @@
1
- import { Component, ViewChild, HostListener, Output, Input, } from '@angular/core';
2
- import { AudioClipUIContainer } from './container';
3
- import { Action } from "../../action/action";
4
- import { Position, Dimension, Rectangle } from "../../math/2d/geometry";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./container";
7
- export class AudioDisplayScrollPane {
8
- constructor(ref) {
9
- this.ref = ref;
10
- this.zoomInAction = new Action('+');
11
- this.zoomOutAction = new Action('-');
12
- this.zoomSelectedAction = new Action("Selected");
13
- this.zoomFitToPanelAction = new Action("Fit to panel");
14
- this.zoomFixFitToPanelAction = new Action("Fix fit to panel");
15
- this.spEl = this.ref.nativeElement;
16
- this.zoomInAction.onAction = (e) => {
17
- this.ac.fixFitToPanel = false;
18
- const oldXZoom = this.ac.currentXZoom();
19
- if (oldXZoom === null) {
20
- return;
21
- }
22
- this.ac.xZoom = oldXZoom * 2;
23
- let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
24
- this.ac.clipBounds(cbr);
25
- this.zoomFitToPanelAction.disabled = false;
26
- };
27
- this.zoomOutAction.onAction = (e) => {
28
- this.ac.fixFitToPanel = false;
29
- const cbr1 = new Rectangle(new Position((this.spEl.scrollLeft / 2) - this.spEl.clientWidth, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
30
- this.ac.clipBounds(cbr1);
31
- let oldXZoom = this.ac.currentXZoom();
32
- if (oldXZoom === null) {
33
- return;
34
- }
35
- this.ac.xZoom = oldXZoom / 2;
36
- let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
37
- this.ac.clipBounds(cbr);
38
- this.zoomFitToPanelAction.disabled = false;
39
- };
40
- this.zoomFitToPanelAction.onAction = (e) => {
41
- this.zoomFitToPanelAction.disabled = true;
42
- // set container div width to this (viewport) width
43
- this.ac.ce.style.width = this.spEl.offsetWidth + 'px';
44
- this.ac.fixFitToPanel = true;
45
- };
46
- this.zoomSelectedAction.onAction = (e) => {
47
- //alert("not implemented yet")
48
- let s = this.ac.selection;
49
- if (s) {
50
- // reset auto fit to panel mode
51
- this.ac.fixFitToPanel = false;
52
- // calculate selection length in seconds
53
- if (this.ac.audioData) {
54
- let sr = this.ac.audioData.sampleRate;
55
- let selFrLen = s.endFrame - s.startFrame;
56
- let selLenInSecs = selFrLen / sr;
57
- // calculate corresponding xZoom value and apply
58
- this.ac.xZoom = this.spEl.clientWidth / selLenInSecs;
59
- // Move viewport to show selection
60
- let x1 = this.ac.frameToXPixelPosition(s.startFrame);
61
- if (x1 !== null) {
62
- this.spEl.scrollLeft = x1;
63
- }
64
- }
65
- this.updateClipBounds();
66
- this.zoomFitToPanelAction.disabled = false;
67
- }
68
- };
69
- }
70
- updateClipBounds() {
71
- let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
72
- this.ac.clipBounds(cbr);
73
- }
74
- onScroll(se) {
75
- this.updateClipBounds();
76
- }
77
- onResize(event) {
78
- this.updateClipBounds();
79
- }
80
- layout() {
81
- this.ac.layout();
82
- }
83
- selectionChanged(s) {
84
- this.zoomSelectedAction.disabled = (s == null);
85
- }
86
- set audioData(audioData) {
87
- this.ac.audioData = audioData;
88
- this.zoomOutAction.disabled = (!audioData);
89
- this.zoomInAction.disabled = (!audioData);
90
- }
91
- set audioClip(audioClip) {
92
- let audioData = null;
93
- let sel = null;
94
- if (audioClip) {
95
- audioData = audioClip.audioDataHolder;
96
- sel = audioClip.selection;
97
- audioClip.addSelectionObserver((clip) => {
98
- this.zoomSelectedAction.disabled = (clip.selection == null);
99
- });
100
- }
101
- this.selectionChanged(sel);
102
- this.ac.audioClip = audioClip;
103
- this.zoomOutAction.disabled = (!audioData);
104
- this.zoomInAction.disabled = (!audioData);
105
- window.setTimeout(() => {
106
- this.layout();
107
- });
108
- }
109
- set playFramePosition(framePos) {
110
- this.ac.playFramePosition = framePos;
111
- }
112
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplayScrollPane, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
113
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: { audioClip: "audioClip" }, outputs: { zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomSelectedAction: "zoomSelectedAction", zoomFitToPanelAction: "zoomFitToPanelAction" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "ac", first: true, predicate: AudioClipUIContainer, descendants: true, static: true }], ngImport: i0, template: `
114
-
115
- <app-audio #audioSignalContainer (selectionEventEmitter)="selectionChanged($event)"></app-audio>
116
-
117
- `, isInline: true, styles: [":host{flex:2;width:100%;background:#a9a9a9;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "app-audio{margin:0;padding:0;top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n"], dependencies: [{ kind: "component", type: i1.AudioClipUIContainer, selector: "app-audio", inputs: ["audioData", "audioClip"], outputs: ["selectionEventEmitter"] }] }); }
118
- }
119
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplayScrollPane, decorators: [{
120
- type: Component,
121
- args: [{ selector: 'audio-display-scroll-pane', template: `
122
-
123
- <app-audio #audioSignalContainer (selectionEventEmitter)="selectionChanged($event)"></app-audio>
124
-
125
- `, styles: [":host{flex:2;width:100%;background:#a9a9a9;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "app-audio{margin:0;padding:0;top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n"] }]
126
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { zoomInAction: [{
127
- type: Output
128
- }], zoomOutAction: [{
129
- type: Output
130
- }], zoomSelectedAction: [{
131
- type: Output
132
- }], zoomFitToPanelAction: [{
133
- type: Output
134
- }], ac: [{
135
- type: ViewChild,
136
- args: [AudioClipUIContainer, { static: true }]
137
- }], onScroll: [{
138
- type: HostListener,
139
- args: ['scroll', ['$event']]
140
- }], onResize: [{
141
- type: HostListener,
142
- args: ['window:resize', ['$event']]
143
- }], audioClip: [{
144
- type: Input
145
- }] } });
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fZGlzcGxheV9zY3JvbGxfcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby91aS9hdWRpb19kaXNwbGF5X3Njcm9sbF9wYW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFBYyxNQUFNLEVBQUUsS0FBSyxHQUN4QyxNQUFNLGVBQWUsQ0FBQTtBQUd0QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDaEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxRQUFRLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7QUFzQ3JFLE1BQU0sT0FBTyxzQkFBc0I7SUFnQmpDLFlBQXFCLEdBQWU7UUFBZixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBWjFCLGlCQUFZLEdBQWMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsa0JBQWEsR0FBYyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyx1QkFBa0IsR0FBYyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCx5QkFBb0IsR0FBYyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RSw0QkFBdUIsR0FBYyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBU2hFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFFbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7WUFDN0IsTUFB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LElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBQyxTQUFTLENBQUE7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNyQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBR0QsSUFBSSxpQkFBaUIsQ0FBQyxRQUFlO1FBQ25DLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEdBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7K0dBN0lVLHNCQUFzQjttR0FBdEIsc0JBQXNCLHdZQVd0QixvQkFBb0IsOERBekNyQjs7OztHQUlUOzs0RkEwQlUsc0JBQXNCO2tCQWxDbEMsU0FBUzsrQkFFRSwyQkFBMkIsWUFFM0I7Ozs7R0FJVDsrRUE4QlMsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBS0MsRUFBRTtzQkFEVCxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpRmpELFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTWxDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcUJyQyxTQUFTO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBPdXRwdXQsIElucHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcblxyXG5cclxuaW1wb3J0IHtBdWRpb0NsaXBVSUNvbnRhaW5lcn0gZnJvbSAnLi9jb250YWluZXInXHJcbmltcG9ydCB7QWN0aW9ufSBmcm9tIFwiLi4vLi4vYWN0aW9uL2FjdGlvblwiO1xyXG5pbXBvcnQge1Bvc2l0aW9uLERpbWVuc2lvbiwgUmVjdGFuZ2xlfSBmcm9tIFwiLi4vLi4vbWF0aC8yZC9nZW9tZXRyeVwiO1xyXG5pbXBvcnQge0F1ZGlvQ2xpcCwgU2VsZWN0aW9ufSBmcm9tIFwiLi4vcGVyc2lzdG9yXCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmUnLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG5cclxuICAgIDxhcHAtYXVkaW8gI2F1ZGlvU2lnbmFsQ29udGFpbmVyIChzZWxlY3Rpb25FdmVudEVtaXR0ZXIpPVwic2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCI+PC9hcHAtYXVkaW8+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgOmhvc3Qge1xyXG4gICAgICAgICAgIGZsZXg6IDI7XHJcbiAgICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgICAgYmFja2dyb3VuZDogZGFya2dyYXk7XHJcbiAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcclxuICAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICAgICB9YCxcclxuICAgIGBhcHAtYXVkaW8ge1xyXG4gICAgIFxyXG4gICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgIHRvcDogMDtcclxuICAgICAgICAgbGVmdDogMDtcclxuICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICBcclxuICAgICAgICAgLypwb3NpdGlvbjogYWJzb2x1dGU7Ki9cclxuICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvRGlzcGxheVNjcm9sbFBhbmUge1xyXG5cclxuICBwcml2YXRlIHNwRWwhOkhUTUxFbGVtZW50O1xyXG5cclxuICBAT3V0cHV0KCkgem9vbUluQWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKCcrJyk7XHJcbiAgQE91dHB1dCgpIHpvb21PdXRBY3Rpb246QWN0aW9uPHZvaWQ+PW5ldyBBY3Rpb24oJy0nKTtcclxuICBAT3V0cHV0KCkgem9vbVNlbGVjdGVkQWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKFwiU2VsZWN0ZWRcIik7XHJcbiAgQE91dHB1dCgpIHpvb21GaXRUb1BhbmVsQWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKFwiRml0IHRvIHBhbmVsXCIpO1xyXG4gIHpvb21GaXhGaXRUb1BhbmVsQWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKFwiRml4IGZpdCB0byBwYW5lbFwiKTtcclxuXHJcblxyXG4gIEBWaWV3Q2hpbGQoQXVkaW9DbGlwVUlDb250YWluZXIsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHJpdmF0ZSBhYyE6IEF1ZGlvQ2xpcFVJQ29udGFpbmVyO1xyXG5cclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHJlZjogRWxlbWVudFJlZikge1xyXG4gICAgICB0aGlzLnNwRWwgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgdGhpcy56b29tSW5BY3Rpb24ub25BY3Rpb24gPSAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hYy5maXhGaXRUb1BhbmVsID0gZmFsc2VcclxuICAgICAgICAgIGNvbnN0IG9sZFhab29tID0gdGhpcy5hYy5jdXJyZW50WFpvb20oKVxyXG4gICAgICAgICAgaWYob2xkWFpvb20gPT09IG51bGwpe1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmFjLnhab29tID0gb2xkWFpvb20gKiAyO1xyXG4gICAgICAgICAgbGV0IGNiciA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHRoaXMuc3BFbC5zY3JvbGxMZWZ0LCB0aGlzLnNwRWwuc2Nyb2xsVG9wKSwgbmV3IERpbWVuc2lvbih0aGlzLnNwRWwuY2xpZW50V2lkdGgsIHRoaXMuc3BFbC5jbGllbnRIZWlnaHQpKTtcclxuICAgICAgICAgIHRoaXMuYWMuY2xpcEJvdW5kcyhjYnIpO1xyXG4gICAgICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5kaXNhYmxlZD1mYWxzZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuem9vbU91dEFjdGlvbi5vbkFjdGlvbiA9IChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFjLmZpeEZpdFRvUGFuZWwgPSBmYWxzZVxyXG4gICAgICAgICAgY29uc3QgY2JyMSA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKCh0aGlzLnNwRWwuc2Nyb2xsTGVmdCAvIDIpIC0gdGhpcy5zcEVsLmNsaWVudFdpZHRoLCB0aGlzLnNwRWwuc2Nyb2xsVG9wKSwgbmV3IERpbWVuc2lvbih0aGlzLnNwRWwuY2xpZW50V2lkdGgsIHRoaXMuc3BFbC5jbGllbnRIZWlnaHQpKTtcclxuICAgICAgICAgIHRoaXMuYWMuY2xpcEJvdW5kcyhjYnIxKTtcclxuICAgICAgICAgIGxldCBvbGRYWm9vbSA9IHRoaXMuYWMuY3VycmVudFhab29tKClcclxuICAgICAgICAgIGlmKG9sZFhab29tID09PSBudWxsKXtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmFjLnhab29tID0gb2xkWFpvb20gLyAyO1xyXG5cclxuICAgICAgICAgIGxldCBjYnIgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb3NpdGlvbih0aGlzLnNwRWwuc2Nyb2xsTGVmdCwgdGhpcy5zcEVsLnNjcm9sbFRvcCksIG5ldyBEaW1lbnNpb24odGhpcy5zcEVsLmNsaWVudFdpZHRoLCB0aGlzLnNwRWwuY2xpZW50SGVpZ2h0KSk7XHJcbiAgICAgICAgICB0aGlzLmFjLmNsaXBCb3VuZHMoY2JyKTtcclxuICAgICAgICAgIHRoaXMuem9vbUZpdFRvUGFuZWxBY3Rpb24uZGlzYWJsZWQ9ZmFsc2VcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5vbkFjdGlvbiA9IChlKSA9PiB7XHJcblxyXG4gICAgICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5kaXNhYmxlZD10cnVlXHJcblxyXG4gICAgICAgICAgLy8gc2V0IGNvbnRhaW5lciBkaXYgd2lkdGggdG8gdGhpcyAodmlld3BvcnQpIHdpZHRoXHJcbiAgICAgICAgICB0aGlzLmFjLmNlLnN0eWxlLndpZHRoPXRoaXMuc3BFbC5vZmZzZXRXaWR0aCsncHgnO1xyXG5cclxuICAgICAgICAgIHRoaXMuYWMuZml4Rml0VG9QYW5lbD10cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnpvb21TZWxlY3RlZEFjdGlvbi5vbkFjdGlvbiA9IChlKSA9PiB7XHJcbiAgICAgICAgICAvL2FsZXJ0KFwibm90IGltcGxlbWVudGVkIHlldFwiKVxyXG5cclxuICAgICAgICAgIGxldCBzID0gdGhpcy5hYy5zZWxlY3Rpb25cclxuICAgICAgICAgIGlmIChzKSB7XHJcbiAgICAgICAgICAgICAgLy8gcmVzZXQgYXV0byBmaXQgdG8gcGFuZWwgbW9kZVxyXG4gICAgICAgICAgICAgIHRoaXMuYWMuZml4Rml0VG9QYW5lbCA9IGZhbHNlXHJcblxyXG4gICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBzZWxlY3Rpb24gbGVuZ3RoIGluIHNlY29uZHNcclxuICAgICAgICAgICAgICBpZih0aGlzLmFjLmF1ZGlvRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc3IgPSB0aGlzLmFjLmF1ZGlvRGF0YS5zYW1wbGVSYXRlO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc2VsRnJMZW4gPSBzLmVuZEZyYW1lIC0gcy5zdGFydEZyYW1lO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc2VsTGVuSW5TZWNzID0gc2VsRnJMZW4gLyBzcjtcclxuICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGNvcnJlc3BvbmRpbmcgeFpvb20gdmFsdWUgYW5kIGFwcGx5XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWMueFpvb20gPSB0aGlzLnNwRWwuY2xpZW50V2lkdGggLyBzZWxMZW5JblNlY3M7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBNb3ZlIHZpZXdwb3J0IHRvIHNob3cgc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgIGxldCB4MSA9IHRoaXMuYWMuZnJhbWVUb1hQaXhlbFBvc2l0aW9uKHMuc3RhcnRGcmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh4MSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcEVsLnNjcm9sbExlZnQgPSB4MTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsaXBCb3VuZHMoKVxyXG4gICAgICAgICAgICAgIHRoaXMuem9vbUZpdFRvUGFuZWxBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHVwZGF0ZUNsaXBCb3VuZHMoKXtcclxuICAgIGxldCBjYnI9bmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odGhpcy5zcEVsLnNjcm9sbExlZnQsdGhpcy5zcEVsLnNjcm9sbFRvcCksIG5ldyBEaW1lbnNpb24odGhpcy5zcEVsLmNsaWVudFdpZHRoLHRoaXMuc3BFbC5jbGllbnRIZWlnaHQpKTtcclxuICAgIHRoaXMuYWMuY2xpcEJvdW5kcyhjYnIpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignc2Nyb2xsJywgWyckZXZlbnQnXSlcclxuICBvblNjcm9sbChzZTogRXZlbnQpIHtcclxuICAgICB0aGlzLnVwZGF0ZUNsaXBCb3VuZHMoKVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgb25SZXNpemUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUNsaXBCb3VuZHMoKVxyXG4gIH1cclxuXHJcbiAgbGF5b3V0KCl7XHJcbiAgICAgICAgICB0aGlzLmFjLmxheW91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGlvbkNoYW5nZWQoczpTZWxlY3Rpb258IG51bGwpe1xyXG4gICAgICB0aGlzLnpvb21TZWxlY3RlZEFjdGlvbi5kaXNhYmxlZD0ocz09bnVsbClcclxuICAgIH1cclxuXHJcbiAgc2V0IGF1ZGlvRGF0YShhdWRpb0RhdGE6IEF1ZGlvRGF0YUhvbGRlciB8IG51bGwpIHtcclxuICAgIHRoaXMuYWMuYXVkaW9EYXRhPWF1ZGlvRGF0YTtcclxuICAgICAgdGhpcy56b29tT3V0QWN0aW9uLmRpc2FibGVkPSghYXVkaW9EYXRhKVxyXG4gICAgICB0aGlzLnpvb21JbkFjdGlvbi5kaXNhYmxlZD0oIWF1ZGlvRGF0YSlcclxuICAgIH1cclxuXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGF1ZGlvQ2xpcChhdWRpb0NsaXA6IEF1ZGlvQ2xpcCB8IG51bGwpIHtcclxuXHJcbiAgICBsZXQgYXVkaW9EYXRhOkF1ZGlvRGF0YUhvbGRlcnxudWxsPW51bGw7XHJcbiAgICBsZXQgc2VsOlNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgICBpZihhdWRpb0NsaXApe1xyXG4gICAgICBhdWRpb0RhdGE9YXVkaW9DbGlwLmF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgc2VsPWF1ZGlvQ2xpcC5zZWxlY3Rpb247XHJcbiAgICAgIGF1ZGlvQ2xpcC5hZGRTZWxlY3Rpb25PYnNlcnZlcigoY2xpcCk9PntcclxuICAgICAgICB0aGlzLnpvb21TZWxlY3RlZEFjdGlvbi5kaXNhYmxlZD0oY2xpcC5zZWxlY3Rpb249PW51bGwpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKHNlbClcclxuICAgIHRoaXMuYWMuYXVkaW9DbGlwPWF1ZGlvQ2xpcFxyXG4gICAgdGhpcy56b29tT3V0QWN0aW9uLmRpc2FibGVkPSghYXVkaW9EYXRhKVxyXG4gICAgdGhpcy56b29tSW5BY3Rpb24uZGlzYWJsZWQ9KCFhdWRpb0RhdGEpXHJcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihmcmFtZVBvczpudW1iZXIpe1xyXG4gICAgdGhpcy5hYy5wbGF5RnJhbWVQb3NpdGlvbj1mcmFtZVBvcztcclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuIl19