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.
Files changed (220) hide show
  1. package/esm2022/lib/action/action.mjs +73 -0
  2. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
  3. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
  4. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
  5. package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
  6. package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
  7. package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
  8. package/esm2022/lib/audio/capture/capture.mjs +855 -0
  9. package/esm2022/lib/audio/context.mjs +79 -0
  10. package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
  11. package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
  12. package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
  13. package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
  14. package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
  15. package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
  16. package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
  17. package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
  18. package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
  19. package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
  20. package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
  21. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  22. package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
  23. package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
  24. package/esm2022/lib/audio/playback/player.mjs +402 -0
  25. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
  26. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
  27. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
  28. package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
  29. package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
  30. package/esm2022/lib/audio/ui/container.mjs +414 -0
  31. package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
  32. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
  33. package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
  34. package/esm2022/lib/db/inddb.mjs +120 -0
  35. package/esm2022/lib/dsp/utils.mjs +48 -0
  36. package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
  37. package/esm2022/lib/io/BinaryWriter.mjs +74 -0
  38. package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
  39. package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
  40. package/esm2022/lib/math/complex.mjs +58 -0
  41. package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
  42. package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
  43. package/esm2022/lib/net/uploader.mjs +367 -0
  44. package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
  45. package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
  46. package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
  47. package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
  48. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
  49. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
  50. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
  51. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
  52. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
  53. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
  54. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
  55. package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
  56. package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
  57. package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
  58. package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
  59. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
  60. package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
  61. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
  62. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
  63. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
  64. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
  65. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
  66. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
  67. package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
  68. package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
  69. package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
  70. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
  71. package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
  72. package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
  73. package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
  74. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
  75. package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
  76. package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
  77. package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
  78. package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
  79. package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
  80. package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
  81. package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
  82. package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
  83. package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
  84. package/esm2022/lib/utils/ua-parser.mjs +190 -0
  85. package/esm2022/lib/utils/utils.mjs +105 -0
  86. package/esm2022/lib/utils/wake_lock.mjs +114 -0
  87. package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
  88. package/{esm2020 → esm2022}/public-api.mjs +33 -33
  89. package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
  90. package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
  91. package/fesm2022/speechrecorderng.mjs.map +1 -0
  92. package/index.d.ts +5 -5
  93. package/lib/action/action.d.ts +27 -27
  94. package/lib/audio/array_audio_buffer.d.ts +31 -31
  95. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
  96. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
  97. package/lib/audio/audio_data_holder.d.ts +84 -84
  98. package/lib/audio/audio_display.d.ts +36 -36
  99. package/lib/audio/audio_player.d.ts +47 -47
  100. package/lib/audio/capture/capture.d.ts +67 -67
  101. package/lib/audio/context.d.ts +6 -6
  102. package/lib/audio/dsp/level_measure.d.ts +60 -60
  103. package/lib/audio/format.d.ts +11 -11
  104. package/lib/audio/impl/wavformat.d.ts +5 -5
  105. package/lib/audio/impl/wavreader.d.ts +16 -16
  106. package/lib/audio/impl/wavwriter.d.ts +13 -13
  107. package/lib/audio/inddb_audio_buffer.d.ts +68 -68
  108. package/lib/audio/io/stream.d.ts +28 -28
  109. package/lib/audio/net_audio_buffer.d.ts +57 -57
  110. package/lib/audio/persistor.d.ts +29 -29
  111. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
  112. package/lib/audio/playback/audio_source_node.d.ts +10 -10
  113. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
  114. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
  115. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
  116. package/lib/audio/playback/player.d.ts +65 -65
  117. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
  118. package/lib/audio/ui/audio_display_control.d.ts +25 -25
  119. package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
  120. package/lib/audio/ui/audiosignal.d.ts +30 -30
  121. package/lib/audio/ui/common.d.ts +11 -11
  122. package/lib/audio/ui/container.d.ts +63 -63
  123. package/lib/audio/ui/livelevel.d.ts +60 -60
  124. package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
  125. package/lib/audio/ui/sonagram.d.ts +37 -37
  126. package/lib/db/inddb.d.ts +21 -21
  127. package/lib/dsp/utils.d.ts +19 -19
  128. package/lib/io/BinaryReader.d.ts +18 -18
  129. package/lib/io/BinaryWriter.d.ts +15 -15
  130. package/lib/io/stream.d.ts +59 -59
  131. package/lib/math/2d/geometry.d.ts +18 -18
  132. package/lib/math/complex.d.ts +17 -17
  133. package/lib/math/dft.d.ts +22 -22
  134. package/lib/media/utils.d.ts +3 -3
  135. package/lib/net/uploader.d.ts +81 -81
  136. package/lib/recorder_component.d.ts +16 -16
  137. package/lib/speechrecorder/project/project.d.ts +59 -59
  138. package/lib/speechrecorder/project/project.service.d.ts +21 -21
  139. package/lib/speechrecorder/recording.d.ts +51 -51
  140. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
  141. package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
  142. package/lib/speechrecorder/script/script.d.ts +80 -79
  143. package/lib/speechrecorder/script/script.service.d.ts +16 -16
  144. package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
  145. package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
  146. package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
  147. package/lib/speechrecorder/session/item.d.ts +12 -12
  148. package/lib/speechrecorder/session/progress.d.ts +17 -17
  149. package/lib/speechrecorder/session/prompting.d.ts +121 -121
  150. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
  151. package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
  152. package/lib/speechrecorder/session/recording_list.d.ts +24 -24
  153. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
  154. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
  155. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
  156. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
  157. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
  158. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
  159. package/lib/speechrecorder/session/session.d.ts +15 -15
  160. package/lib/speechrecorder/session/session.service.d.ts +20 -20
  161. package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
  162. package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
  163. package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
  164. package/lib/speechrecorder/spruploader.d.ts +11 -11
  165. package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
  166. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
  167. package/lib/speechrecorderng.component.d.ts +61 -61
  168. package/lib/speechrecorderng.module.d.ts +56 -56
  169. package/lib/spr.config.d.ts +17 -17
  170. package/lib/spr.module.version.d.ts +1 -1
  171. package/lib/ui/canvas_layer_comp.d.ts +13 -13
  172. package/lib/ui/message_dialog.d.ts +10 -10
  173. package/lib/ui/recordingitem_display.d.ts +84 -84
  174. package/lib/ui/responsive_component.d.ts +9 -9
  175. package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
  176. package/lib/utils/ua-parser.d.ts +43 -43
  177. package/lib/utils/utils.d.ts +19 -19
  178. package/lib/utils/wake_lock.d.ts +23 -23
  179. package/lib/utils/wake_lock_media.d.ts +1 -1
  180. package/package.json +17 -23
  181. package/public-api.d.ts +33 -33
  182. package/esm2020/lib/action/action.mjs +0 -73
  183. package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
  184. package/esm2020/lib/audio/capture/capture.mjs +0 -855
  185. package/esm2020/lib/audio/context.mjs +0 -79
  186. package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
  187. package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
  188. package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
  189. package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
  190. package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
  191. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  192. package/esm2020/lib/audio/playback/player.mjs +0 -402
  193. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  194. package/esm2020/lib/audio/ui/container.mjs +0 -414
  195. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  196. package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
  197. package/esm2020/lib/db/inddb.mjs +0 -120
  198. package/esm2020/lib/dsp/utils.mjs +0 -48
  199. package/esm2020/lib/io/BinaryWriter.mjs +0 -74
  200. package/esm2020/lib/math/complex.mjs +0 -58
  201. package/esm2020/lib/net/uploader.mjs +0 -367
  202. package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
  203. package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
  204. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
  205. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  206. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  207. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
  208. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
  209. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  210. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  211. package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
  212. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
  213. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  214. package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
  215. package/esm2020/lib/utils/ua-parser.mjs +0 -190
  216. package/esm2020/lib/utils/utils.mjs +0 -105
  217. package/esm2020/lib/utils/wake_lock.mjs +0 -114
  218. package/fesm2015/speechrecorderng.mjs +0 -17708
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. package/fesm2020/speechrecorderng.mjs.map +0 -1
@@ -0,0 +1,253 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
2
+ import { LevelBar } from "../audio/ui/livelevel";
3
+ import { ResponsiveComponent } from "./responsive_component";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/cdk/layout";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "@angular/material/icon";
8
+ import * as i4 from "@angular/material/tooltip";
9
+ import * as i5 from "../audio/ui/livelevel";
10
+ export const MIN_DB_LEVEL = -40.0;
11
+ export const DEFAULT_WARN_DB_LEVEL = -2;
12
+ export class RecordingItemControls extends ResponsiveComponent {
13
+ set agc(agc) {
14
+ this._agc = agc;
15
+ if (this._agc === undefined || this._agc === null) {
16
+ this.agcString = 'n/a';
17
+ }
18
+ else {
19
+ if (this._agc === true) {
20
+ this.agcString = 'On';
21
+ }
22
+ else {
23
+ this.agcString = 'Off';
24
+ }
25
+ }
26
+ }
27
+ constructor(bpo, ref, changeDetectorRef) {
28
+ super(bpo);
29
+ this.bpo = bpo;
30
+ this.ref = ref;
31
+ this.changeDetectorRef = changeDetectorRef;
32
+ this.ce = null;
33
+ this.audioSignalCollapsed = true;
34
+ this.enableDownload = false;
35
+ this.peakDbLvl = MIN_DB_LEVEL;
36
+ this._displayLevelInfos = null;
37
+ this._agc = undefined;
38
+ this.agcString = 'n/a';
39
+ this.onShowRecordingDetails = new EventEmitter();
40
+ this.onDownloadRecording = new EventEmitter();
41
+ this.disableAudioDetails = true;
42
+ this.audioLoaded = false;
43
+ this.playStartEnabled = false;
44
+ this.playStopEnabled = false;
45
+ this.updateTimerId = null;
46
+ this.destroyed = false;
47
+ this.warnDbLevel = DEFAULT_WARN_DB_LEVEL;
48
+ }
49
+ ngOnDestroy() {
50
+ this.destroyed = true;
51
+ }
52
+ showRecordingDetails() {
53
+ this.onShowRecordingDetails.emit();
54
+ }
55
+ downloadRecording() {
56
+ this.onDownloadRecording.emit();
57
+ }
58
+ ngAfterViewInit() {
59
+ this.ce = this.ref.nativeElement;
60
+ }
61
+ set displayLevelInfos(levelInfos) {
62
+ this._displayLevelInfos = levelInfos;
63
+ }
64
+ error() {
65
+ // this.status = 'ERROR';
66
+ }
67
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RecordingItemControls, deps: [{ token: i1.BreakpointObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
68
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: { audioSignalCollapsed: "audioSignalCollapsed", enableDownload: "enableDownload", peakDbLvl: "peakDbLvl", agc: "agc", disableAudioDetails: "disableAudioDetails", audioLoaded: "audioLoaded", playStartAction: "playStartAction", playStopAction: "playStopAction", displayLevelInfos: "displayLevelInfos" }, outputs: { onShowRecordingDetails: "onShowRecordingDetails", onDownloadRecording: "onDownloadRecording" }, usesInheritance: true, ngImport: i0, template: `
69
+ <button matTooltip="Start playback" (click)="playStartAction?.perform()"
70
+ [disabled]="playStartAction?playStartAction.disabled:true"
71
+ [style.color]="playStartAction?.disabled ? 'grey' : 'green'">
72
+ <mat-icon>play_arrow</mat-icon>
73
+ </button>
74
+ <button matTooltip="Stop playback" (click)="playStopAction?.perform()"
75
+ [disabled]="playStopAction?.disabled"
76
+ [style.color]="playStopAction?.disabled ? 'grey' : 'yellow'">
77
+ <mat-icon>stop</mat-icon>
78
+ </button>
79
+ <button *ngIf="!screenXs" matTooltip="Toggle detailed audio display" [disabled]="disableAudioDetails || !audioLoaded"
80
+ (click)="showRecordingDetails()">
81
+ <mat-icon>{{(audioSignalCollapsed) ? "expand_less" : "expand_more"}}</mat-icon>
82
+ </button>
83
+ <button matTooltip="Download current recording" *ngIf="enableDownload" [disabled]="disableAudioDetails || !audioLoaded"
84
+ (click)="downloadRecording()">
85
+ <mat-icon>file_download</mat-icon>
86
+ </button>
87
+ <div style="min-width: 14ch;padding:2px"><table style="border-style: none"><tr><td>Peak:</td><td><span matTooltip="Peak level"
88
+ [style.color]="(peakDbLvl > warnDbLevel)?'red':'black'">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>
89
+ <tr *ngIf="_agc"><td>AGC:</td><td><span matTooltip="Auto gain control">{{agcString}}</span></td></tr></table></div>
90
+ `, isInline: true, styles: [":host{flex:0;width:100%;background:darkgray;padding:4px;box-sizing:border-box;height:100%;display:flex;flex-direction:row;flex-wrap:nowrap}\n", "span{flex:0;font-weight:700;display:inline-block;white-space:nowrap;box-sizing:border-box}\n", "button{touch-action:manipulation}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }] }); }
91
+ }
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RecordingItemControls, decorators: [{
93
+ type: Component,
94
+ args: [{ selector: 'spr-recordingitemcontrols', template: `
95
+ <button matTooltip="Start playback" (click)="playStartAction?.perform()"
96
+ [disabled]="playStartAction?playStartAction.disabled:true"
97
+ [style.color]="playStartAction?.disabled ? 'grey' : 'green'">
98
+ <mat-icon>play_arrow</mat-icon>
99
+ </button>
100
+ <button matTooltip="Stop playback" (click)="playStopAction?.perform()"
101
+ [disabled]="playStopAction?.disabled"
102
+ [style.color]="playStopAction?.disabled ? 'grey' : 'yellow'">
103
+ <mat-icon>stop</mat-icon>
104
+ </button>
105
+ <button *ngIf="!screenXs" matTooltip="Toggle detailed audio display" [disabled]="disableAudioDetails || !audioLoaded"
106
+ (click)="showRecordingDetails()">
107
+ <mat-icon>{{(audioSignalCollapsed) ? "expand_less" : "expand_more"}}</mat-icon>
108
+ </button>
109
+ <button matTooltip="Download current recording" *ngIf="enableDownload" [disabled]="disableAudioDetails || !audioLoaded"
110
+ (click)="downloadRecording()">
111
+ <mat-icon>file_download</mat-icon>
112
+ </button>
113
+ <div style="min-width: 14ch;padding:2px"><table style="border-style: none"><tr><td>Peak:</td><td><span matTooltip="Peak level"
114
+ [style.color]="(peakDbLvl > warnDbLevel)?'red':'black'">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>
115
+ <tr *ngIf="_agc"><td>AGC:</td><td><span matTooltip="Auto gain control">{{agcString}}</span></td></tr></table></div>
116
+ `, styles: [":host{flex:0;width:100%;background:darkgray;padding:4px;box-sizing:border-box;height:100%;display:flex;flex-direction:row;flex-wrap:nowrap}\n", "span{flex:0;font-weight:700;display:inline-block;white-space:nowrap;box-sizing:border-box}\n", "button{touch-action:manipulation}\n"] }]
117
+ }], ctorParameters: () => [{ type: i1.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { audioSignalCollapsed: [{
118
+ type: Input
119
+ }], enableDownload: [{
120
+ type: Input
121
+ }], peakDbLvl: [{
122
+ type: Input
123
+ }], agc: [{
124
+ type: Input
125
+ }], onShowRecordingDetails: [{
126
+ type: Output
127
+ }], onDownloadRecording: [{
128
+ type: Output
129
+ }], disableAudioDetails: [{
130
+ type: Input
131
+ }], audioLoaded: [{
132
+ type: Input
133
+ }], playStartAction: [{
134
+ type: Input
135
+ }], playStopAction: [{
136
+ type: Input
137
+ }], displayLevelInfos: [{
138
+ type: Input
139
+ }] } });
140
+ export class RecordingItemDisplay extends ResponsiveComponent {
141
+ set agc(agc) {
142
+ this._agc = agc;
143
+ }
144
+ constructor(bpo, ref, changeDetectorRef) {
145
+ super(bpo);
146
+ this.bpo = bpo;
147
+ this.ref = ref;
148
+ this.changeDetectorRef = changeDetectorRef;
149
+ this.ce = null;
150
+ this.streamingMode = false;
151
+ this.audioSignalCollapsed = true;
152
+ this.enableDownload = false;
153
+ this.peakDbLvl = MIN_DB_LEVEL;
154
+ this._displayLevelInfos = null;
155
+ this._agc = undefined;
156
+ this.agcString = 'n/a';
157
+ this.onShowRecordingDetails = new EventEmitter();
158
+ this.onDownloadRecording = new EventEmitter();
159
+ this.playStartEnabled = false;
160
+ this.playStopEnabled = false;
161
+ this.updateTimerId = null;
162
+ this.destroyed = false;
163
+ this.warnDbLevel = DEFAULT_WARN_DB_LEVEL;
164
+ }
165
+ ngOnDestroy() {
166
+ this.destroyed = true;
167
+ }
168
+ set displayAudioBuffer(displayAudioBuffer) {
169
+ this._displayAudioBuffer = displayAudioBuffer;
170
+ }
171
+ get displayAudioBuffer() {
172
+ return this._displayAudioBuffer;
173
+ }
174
+ showRecordingDetails() {
175
+ this.onShowRecordingDetails.emit();
176
+ }
177
+ downloadRecording() {
178
+ this.onDownloadRecording.emit();
179
+ }
180
+ ngAfterViewInit() {
181
+ this.ce = this.ref.nativeElement;
182
+ //this.controlAudioPlayer.listener=this;
183
+ }
184
+ set displayLevelInfos(levelInfos) {
185
+ this._displayLevelInfos = levelInfos;
186
+ }
187
+ set channelCount(channelCount) {
188
+ this.reset();
189
+ this.liveLevel.channelCount = channelCount;
190
+ }
191
+ set playFramePosition(playFramePosition) {
192
+ this.liveLevel.playFramePosition = playFramePosition;
193
+ }
194
+ update(levelInfo, peakLevelInfo) {
195
+ let peakDBVal = levelInfo.powerLevelDB();
196
+ if (this.peakDbLvl < peakDBVal) {
197
+ this.peakDbLvl = peakDBVal;
198
+ // the event comes from outside an Angular zone
199
+ this.changeDetectorRef.detectChanges();
200
+ }
201
+ this.liveLevel.update(levelInfo);
202
+ }
203
+ error() {
204
+ // this.status = 'ERROR';
205
+ }
206
+ streamFinished() {
207
+ this.liveLevel.streamFinished();
208
+ }
209
+ reset() {
210
+ this.peakDbLvl = MIN_DB_LEVEL;
211
+ this.changeDetectorRef.detectChanges();
212
+ }
213
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RecordingItemDisplay, deps: [{ token: i1.BreakpointObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
214
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: RecordingItemDisplay, selector: "spr-recordingitemdisplay", inputs: { streamingMode: "streamingMode", audioSignalCollapsed: "audioSignalCollapsed", enableDownload: "enableDownload", agc: "agc", playStartAction: "playStartAction", playStopAction: "playStopAction", displayAudioBuffer: "displayAudioBuffer", displayLevelInfos: "displayLevelInfos" }, outputs: { onShowRecordingDetails: "onShowRecordingDetails", onDownloadRecording: "onDownloadRecording" }, viewQueries: [{ propertyName: "liveLevel", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
215
+ <div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
216
+ <audio-levelbar style="flex:1 0 1%" [streamingMode]="streamingMode" [displayLevelInfos]="_displayLevelInfos"></audio-levelbar>
217
+ <spr-recordingitemcontrols style="flex:0 0 0px" [audioLoaded]="displayAudioBuffer!==null" [playStartAction]="playStartAction" [playStopAction]="playStopAction" [peakDbLvl]="peakDbLvl" [agc]="_agc" (onShowRecordingDetails)="onShowRecordingDetails.emit()"></spr-recordingitemcontrols>
218
+ </div>
219
+ `, isInline: true, styles: ["div{width:100%;background:darkgray;padding:4px;box-sizing:border-box;flex-wrap:nowrap}\n", "audio-levelbar{box-sizing:border-box}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"], dependencies: [{ kind: "component", type: i5.LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos", "state"] }, { kind: "component", type: RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "disableAudioDetails", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }] }); }
220
+ }
221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RecordingItemDisplay, decorators: [{
222
+ type: Component,
223
+ args: [{ selector: 'spr-recordingitemdisplay', template: `
224
+ <div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
225
+ <audio-levelbar style="flex:1 0 1%" [streamingMode]="streamingMode" [displayLevelInfos]="_displayLevelInfos"></audio-levelbar>
226
+ <spr-recordingitemcontrols style="flex:0 0 0px" [audioLoaded]="displayAudioBuffer!==null" [playStartAction]="playStartAction" [playStopAction]="playStopAction" [peakDbLvl]="peakDbLvl" [agc]="_agc" (onShowRecordingDetails)="onShowRecordingDetails.emit()"></spr-recordingitemcontrols>
227
+ </div>
228
+ `, styles: ["div{width:100%;background:darkgray;padding:4px;box-sizing:border-box;flex-wrap:nowrap}\n", "audio-levelbar{box-sizing:border-box}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"] }]
229
+ }], ctorParameters: () => [{ type: i1.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { liveLevel: [{
230
+ type: ViewChild,
231
+ args: [LevelBar, { static: true }]
232
+ }], streamingMode: [{
233
+ type: Input
234
+ }], audioSignalCollapsed: [{
235
+ type: Input
236
+ }], enableDownload: [{
237
+ type: Input
238
+ }], agc: [{
239
+ type: Input
240
+ }], onShowRecordingDetails: [{
241
+ type: Output
242
+ }], onDownloadRecording: [{
243
+ type: Output
244
+ }], playStartAction: [{
245
+ type: Input
246
+ }], playStopAction: [{
247
+ type: Input
248
+ }], displayAudioBuffer: [{
249
+ type: Input
250
+ }], displayLevelInfos: [{
251
+ type: Input
252
+ }] } });
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5naXRlbV9kaXNwbGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3VpL3JlY29yZGluZ2l0ZW1fZGlzcGxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ2dCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFDaEYsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFBO0FBRXRCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQUkzRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFrRHhDLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxtQkFBbUI7SUFjNUQsSUFBYSxHQUFHLENBQUMsR0FBMEI7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBQyxHQUFHLENBQUM7UUFDZCxJQUFHLElBQUksQ0FBQyxJQUFJLEtBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUcsSUFBSSxFQUFDO1lBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUMsS0FBSyxDQUFDO1NBQ3RCO2FBQUk7WUFDSCxJQUFHLElBQUksQ0FBQyxJQUFJLEtBQUcsSUFBSSxFQUFDO2dCQUNsQixJQUFJLENBQUMsU0FBUyxHQUFDLElBQUksQ0FBQzthQUNyQjtpQkFBSTtnQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFDLEtBQUssQ0FBQzthQUN0QjtTQUNGO0lBQ0gsQ0FBQztJQWtCRCxZQUFzQixHQUFzQixFQUFTLEdBQWUsRUFBVSxpQkFBb0M7UUFDaEgsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRFMsUUFBRyxHQUFILEdBQUcs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QkFBaUI7c0JBRHBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsXHJcbiAgICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXHJcbmltcG9ydCB7TGV2ZWxJbmZvLCBMZXZlbEluZm9zLCBMZXZlbExpc3RlbmVyfSBmcm9tIFwiLi4vYXVkaW8vZHNwL2xldmVsX21lYXN1cmVcIjtcclxuaW1wb3J0IHtMZXZlbEJhcn0gZnJvbSBcIi4uL2F1ZGlvL3VpL2xpdmVsZXZlbFwiO1xyXG5pbXBvcnQge0FjdGlvbn0gZnJvbSBcIi4uL2FjdGlvbi9hY3Rpb25cIjtcclxuaW1wb3J0IHtSZXNwb25zaXZlQ29tcG9uZW50fSBmcm9tIFwiLi9yZXNwb25zaXZlX2NvbXBvbmVudFwiO1xyXG5pbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9sYXlvdXRcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgTUlOX0RCX0xFVkVMID0gLTQwLjA7XHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBUk5fREJfTEVWRUwgPSAtMjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3ByLXJlY29yZGluZ2l0ZW1jb250cm9scycsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8YnV0dG9uIG1hdFRvb2x0aXA9XCJTdGFydCBwbGF5YmFja1wiIChjbGljayk9XCJwbGF5U3RhcnRBY3Rpb24/LnBlcmZvcm0oKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicGxheVN0YXJ0QWN0aW9uP3BsYXlTdGFydEFjdGlvbi5kaXNhYmxlZDp0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJwbGF5U3RhcnRBY3Rpb24/LmRpc2FibGVkID8gJ2dyZXknIDogJ2dyZWVuJ1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+cGxheV9hcnJvdzwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXRUb29sdGlwPVwiU3RvcCBwbGF5YmFja1wiIChjbGljayk9XCJwbGF5U3RvcEFjdGlvbj8ucGVyZm9ybSgpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwbGF5U3RvcEFjdGlvbj8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInBsYXlTdG9wQWN0aW9uPy5kaXNhYmxlZCA/ICdncmV5JyA6ICd5ZWxsb3cnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5zdG9wPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXNjcmVlblhzXCIgbWF0VG9vbHRpcD1cIlRvZ2dsZSBkZXRhaWxlZCBhdWRpbyBkaXNwbGF5XCIgW2Rpc2FibGVkXT1cImRpc2FibGVBdWRpb0RldGFpbHMgfHwgIWF1ZGlvTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93UmVjb3JkaW5nRGV0YWlscygpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj57eyhhdWRpb1NpZ25hbENvbGxhcHNlZCkgPyBcImV4cGFuZF9sZXNzXCIgOiBcImV4cGFuZF9tb3JlXCJ9fTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXRUb29sdGlwPVwiRG93bmxvYWQgY3VycmVudCByZWNvcmRpbmdcIiAqbmdJZj1cImVuYWJsZURvd25sb2FkXCIgW2Rpc2FibGVkXT1cImRpc2FibGVBdWRpb0RldGFpbHMgfHwgIWF1ZGlvTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkb3dubG9hZFJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5maWxlX2Rvd25sb2FkPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwibWluLXdpZHRoOiAxNGNoO3BhZGRpbmc6MnB4XCI+PHRhYmxlIHN0eWxlPVwiYm9yZGVyLXN0eWxlOiBub25lXCI+PHRyPjx0ZD5QZWFrOjwvdGQ+PHRkPjxzcGFuIG1hdFRvb2x0aXA9XCJQZWFrIGxldmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIihwZWFrRGJMdmwgPiB3YXJuRGJMZXZlbCk/J3JlZCc6J2JsYWNrJ1wiPnt7cGVha0RiTHZsIHwgbnVtYmVyOicxLjEtMSd9fSBkQiA8L3NwYW4+PC90ZD48L3RyPlxyXG4gICAgICAgICAgPHRyICpuZ0lmPVwiX2FnY1wiPjx0ZD5BR0M6PC90ZD48dGQ+PHNwYW4gbWF0VG9vbHRpcD1cIkF1dG8gZ2FpbiBjb250cm9sXCI+e3thZ2NTdHJpbmd9fTwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj5cclxuICAgIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgICAgICBmbGV4OiAwOyAvKiBvbmx5IHJlcXVpcmVkIHZlcnRpY2FsIHNwYWNlICovXHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgYmFja2dyb3VuZDogZGFya2dyYXk7XHJcbiAgICAgICAgcGFkZGluZzogNHB4O1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG5cclxuICAgICAgICBkaXNwbGF5OiBmbGV4OyAvKiBmbGV4IGNvbnRhaW5lcjogbGVmdCBsZXZlbCBiYXIsIHJpZ2h0IGRlY2ltYWwgcGVhayBsZXZlbCB2YWx1ZSAqL1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7IC8qIHdyYXAgY291bGQgY29tcGxldGVseSBkZXN0cm95IHRoZSBsYXlvdXQgKi9cclxuICAgIH1gLCBgc3BhbiB7XHJcbiAgICAgICAgZmxleDogMDtcclxuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgfWAsYFxyXG4gICAgIGJ1dHRvbiB7XHJcbiAgICAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjtcclxuICAgICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRpbmdJdGVtQ29udHJvbHMgZXh0ZW5kcyBSZXNwb25zaXZlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgY2U6IEhUTUxEaXZFbGVtZW50fG51bGw9bnVsbDtcclxuICBASW5wdXQoKSBhdWRpb1NpZ25hbENvbGxhcHNlZDogYm9vbGVhbj10cnVlO1xyXG4gIHByaXZhdGUgX2Rpc3BsYXlBdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIgfCBudWxsfHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBlbmFibGVEb3dubG9hZDogYm9vbGVhbj1mYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcGVha0RiTHZsID0gTUlOX0RCX0xFVkVMO1xyXG5cclxuICBfZGlzcGxheUxldmVsSW5mb3M6IExldmVsSW5mb3MgfCBudWxsPW51bGw7XHJcblxyXG4gIF9hZ2M6Ym9vbGVhbnxudWxsfHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgYWdjU3RyaW5nPSduL2EnO1xyXG5cclxuICBASW5wdXQoKSBzZXQgYWdjKGFnYzpib29sZWFufG51bGx8dW5kZWZpbmVkKXtcclxuICAgIHRoaXMuX2FnYz1hZ2M7XHJcbiAgICBpZih0aGlzLl9hZ2M9PT11bmRlZmluZWQgfHwgdGhpcy5fYWdjPT09bnVsbCl7XHJcbiAgICAgIHRoaXMuYWdjU3RyaW5nPSduL2EnO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIGlmKHRoaXMuX2FnYz09PXRydWUpe1xyXG4gICAgICAgIHRoaXMuYWdjU3RyaW5nPSdPbic7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuYWdjU3RyaW5nPSdPZmYnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgb25TaG93UmVjb3JkaW5nRGV0YWlsczogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBvbkRvd25sb2FkUmVjb3JkaW5nOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIEBJbnB1dCgpIGRpc2FibGVBdWRpb0RldGFpbHM9dHJ1ZTtcclxuICBASW5wdXQoKSBhdWRpb0xvYWRlZD1mYWxzZTtcclxuICAvL0BJbnB1dCgpIGNvbnRyb2xBdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XHJcbiAgQElucHV0KCkgcGxheVN0YXJ0QWN0aW9uOkFjdGlvbjx2b2lkPnx1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgcGxheVN0b3BBY3Rpb246QWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBwbGF5U3RhcnRFbmFibGVkID0gZmFsc2U7XHJcbiAgcGxheVN0b3BFbmFibGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB1cGRhdGVUaW1lcklkOiBudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xyXG5cclxuICB3YXJuRGJMZXZlbCA9IERFRkFVTFRfV0FSTl9EQl9MRVZFTDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJwbzpCcmVha3BvaW50T2JzZXJ2ZXIscHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICBzdXBlcihicG8pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzaG93UmVjb3JkaW5nRGV0YWlscygpIHtcclxuICAgIHRoaXMub25TaG93UmVjb3JkaW5nRGV0YWlscy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZFJlY29yZGluZygpIHtcclxuICAgIHRoaXMub25Eb3dubG9hZFJlY29yZGluZy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNlID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRpc3BsYXlMZXZlbEluZm9zKGxldmVsSW5mb3M6IExldmVsSW5mb3MgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9kaXNwbGF5TGV2ZWxJbmZvcyA9IGxldmVsSW5mb3M7XHJcbiAgfVxyXG5cclxuICBlcnJvcigpIHtcclxuICAgIC8vIHRoaXMuc3RhdHVzID0gJ0VSUk9SJztcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3Nwci1yZWNvcmRpbmdpdGVtZGlzcGxheScsXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgICA8ZGl2IFtjbGFzc109XCJ7YXVkaW9TdGF0dXNEaXNwbGF5OiFzY3JlZW5YcyxhdWRpb1N0YXR1c0Rpc3BsYXlYczpzY3JlZW5Yc31cIj5cclxuICAgICAgICA8YXVkaW8tbGV2ZWxiYXIgc3R5bGU9XCJmbGV4OjEgMCAxJVwiIFtzdHJlYW1pbmdNb2RlXT1cInN0cmVhbWluZ01vZGVcIiBbZGlzcGxheUxldmVsSW5mb3NdPVwiX2Rpc3BsYXlMZXZlbEluZm9zXCI+PC9hdWRpby1sZXZlbGJhcj5cclxuICAgICAgICA8c3ByLXJlY29yZGluZ2l0ZW1jb250cm9scyBzdHlsZT1cImZsZXg6MCAwIDBweFwiIFthdWRpb0xvYWRlZF09XCJkaXNwbGF5QXVkaW9CdWZmZXIhPT1udWxsXCIgW3BsYXlTdGFydEFjdGlvbl09XCJwbGF5U3RhcnRBY3Rpb25cIiBbcGxheVN0b3BBY3Rpb25dPVwicGxheVN0b3BBY3Rpb25cIiBbcGVha0RiTHZsXT1cInBlYWtEYkx2bFwiIFthZ2NdPVwiX2FnY1wiIChvblNob3dSZWNvcmRpbmdEZXRhaWxzKT1cIm9uU2hvd1JlY29yZGluZ0RldGFpbHMuZW1pdCgpXCI+PC9zcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIGAsXHJcbiAgICBzdHlsZXM6IFtgZGl2IHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBiYWNrZ3JvdW5kOiBkYXJrZ3JheTtcclxuICAgICAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsgLyogd3JhcCBjb3VsZCBjb21wbGV0ZWx5IGRlc3Ryb3kgdGhlIGxheW91dCAqL1xyXG4gICAgfWAsIGBhdWRpby1sZXZlbGJhciB7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIH1gLGAuYXVkaW9TdGF0dXNEaXNwbGF5e1xyXG4gICAgZGlzcGxheTpmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGhlaWdodDoxMDBweDtcclxuICAgIG1pbi1oZWlnaHQ6IDEwMHB4O1xyXG4gIH1gLGAuYXVkaW9TdGF0dXNEaXNwbGF5WHN7XHJcbiAgICBkaXNwbGF5OmZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgaGVpZ2h0OjEyNXB4O1xyXG4gICAgbWluLWhlaWdodDogMTI1cHg7XHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nSXRlbURpc3BsYXkgZXh0ZW5kcyBSZXNwb25zaXZlQ29tcG9uZW50IGltcGxlbWVudHMgTGV2ZWxMaXN0ZW5lciwgT25EZXN0cm95IHtcclxuXHJcbiAgICBjZTogSFRNTERpdkVsZW1lbnR8bnVsbD1udWxsO1xyXG4gICAgQFZpZXdDaGlsZChMZXZlbEJhciwgeyBzdGF0aWM6IHRydWUgfSkgbGl2ZUxldmVsITogTGV2ZWxCYXI7XHJcbiAgICBASW5wdXQoKSBzdHJlYW1pbmdNb2RlOiBib29sZWFuPWZhbHNlO1xyXG4gICAgQElucHV0KCkgYXVkaW9TaWduYWxDb2xsYXBzZWQ6IGJvb2xlYW49dHJ1ZTtcclxuICAgIHByaXZhdGUgX2Rpc3BsYXlBdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIgfCBudWxsfHVuZGVmaW5lZDtcclxuICAgIEBJbnB1dCgpIGVuYWJsZURvd25sb2FkOiBib29sZWFuPWZhbHNlO1xyXG5cclxuICAgIHBlYWtEYkx2bCA9IE1JTl9EQl9MRVZFTDtcclxuXHJcbiAgICBfZGlzcGxheUxldmVsSW5mb3M6IExldmVsSW5mb3MgfCBudWxsPW51bGw7XHJcblxyXG4gICAgX2FnYzpib29sZWFufG51bGx8dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICAgIGFnY1N0cmluZz0nbi9hJztcclxuXHJcbiAgICBASW5wdXQoKSBzZXQgYWdjKGFnYzpib29sZWFufG51bGx8dW5kZWZpbmVkKXtcclxuICAgICAgdGhpcy5fYWdjPWFnYztcclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgb25TaG93UmVjb3JkaW5nRGV0YWlsczogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRG93bmxvYWRSZWNvcmRpbmc6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICAvL0BJbnB1dCgpIGNvbnRyb2xBdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XHJcbiAgICBASW5wdXQoKSBwbGF5U3RhcnRBY3Rpb246QWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICAgIEBJbnB1dCgpIHBsYXlTdG9wQWN0aW9uOkFjdGlvbjx2b2lkPnx1bmRlZmluZWQ7XHJcbiAgICBwbGF5U3RhcnRFbmFibGVkID0gZmFsc2U7XHJcbiAgICBwbGF5U3RvcEVuYWJsZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgdXBkYXRlVGltZXJJZDogbnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xyXG5cclxuICAgIHdhcm5EYkxldmVsID0gREVGQVVMVF9XQVJOX0RCX0xFVkVMO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBicG86QnJlYWtwb2ludE9ic2VydmVyLHByaXZhdGUgcmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgICAgIHN1cGVyKGJwbyk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGRpc3BsYXlBdWRpb0J1ZmZlcihkaXNwbGF5QXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyIHwgbnVsbHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fZGlzcGxheUF1ZGlvQnVmZmVyID0gZGlzcGxheUF1ZGlvQnVmZmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5QXVkaW9CdWZmZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlBdWRpb0J1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBzaG93UmVjb3JkaW5nRGV0YWlscygpIHtcclxuICAgICAgICB0aGlzLm9uU2hvd1JlY29yZGluZ0RldGFpbHMuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkUmVjb3JkaW5nKCkge1xyXG4gICAgICAgIHRoaXMub25Eb3dubG9hZFJlY29yZGluZy5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuY2UgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIC8vdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIubGlzdGVuZXI9dGhpcztcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGRpc3BsYXlMZXZlbEluZm9zKGxldmVsSW5mb3M6IExldmVsSW5mb3MgfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fZGlzcGxheUxldmVsSW5mb3MgPSBsZXZlbEluZm9zO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5saXZlTGV2ZWwuY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50O1xyXG4gICAgfVxyXG5cclxuICBzZXQgcGxheUZyYW1lUG9zaXRpb24ocGxheUZyYW1lUG9zaXRpb246IG51bWJlcikge1xyXG4gICAgdGhpcy5saXZlTGV2ZWwucGxheUZyYW1lUG9zaXRpb249cGxheUZyYW1lUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICAgIHVwZGF0ZShsZXZlbEluZm86IExldmVsSW5mbywgcGVha0xldmVsSW5mbzogTGV2ZWxJbmZvKSB7XHJcbiAgICAgICAgbGV0IHBlYWtEQlZhbCA9IGxldmVsSW5mby5wb3dlckxldmVsREIoKTtcclxuICAgICAgICBpZiAodGhpcy5wZWFrRGJMdmwgPCBwZWFrREJWYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5wZWFrRGJMdmwgPSBwZWFrREJWYWw7XHJcbiAgICAgICAgICAgIC8vIHRoZSBldmVudCBjb21lcyBmcm9tIG91dHNpZGUgYW4gQW5ndWxhciB6b25lXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpdmVMZXZlbC51cGRhdGUobGV2ZWxJbmZvKTtcclxuICAgIH1cclxuXHJcbiAgICBlcnJvcigpIHtcclxuICAgICAgICAvLyB0aGlzLnN0YXR1cyA9ICdFUlJPUic7XHJcbiAgICB9XHJcblxyXG4gICAgc3RyZWFtRmluaXNoZWQoKSB7XHJcbiAgICAgICAgdGhpcy5saXZlTGV2ZWwuc3RyZWFtRmluaXNoZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldCgpIHtcclxuICAgICAgICB0aGlzLnBlYWtEYkx2bCA9IE1JTl9EQl9MRVZFTDtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcblxyXG59XHJcbiJdfQ==
@@ -1,24 +1,24 @@
1
- import { Breakpoints } from "@angular/cdk/layout";
2
- import { Directive } from "@angular/core";
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/cdk/layout";
5
- export class ResponsiveComponent {
6
- constructor(breakpointObserver) {
7
- this.breakpointObserver = breakpointObserver;
8
- this.screenXs = false;
9
- breakpointObserver
10
- .observe([
11
- Breakpoints.XSmall
12
- ])
13
- .subscribe(result => {
14
- this.screenXs = (result.matches);
15
- //console.debug("Screen XS: "+this.screenXs);
16
- });
17
- }
18
- }
19
- ResponsiveComponentfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ResponsiveComponent, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Directive });
20
- ResponsiveComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: ResponsiveComponent, ngImport: i0 });
21
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ResponsiveComponent, decorators: [{
22
- type: Directive
23
- }], ctorParameters: function () { return [{ type: i1.BreakpointObserver }]; } });
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2l2ZV9jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvdWkvcmVzcG9uc2l2ZV9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7QUFHeEMsTUFBTSxPQUFPLG1CQUFtQjtJQUk5QixZQUFzQixrQkFBc0M7UUFBdEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUY1RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2Ysa0JBQWtCO2FBQ2YsT0FBTyxDQUFDO1lBQ1AsV0FBVyxDQUFDLE1BQU07U0FDbkIsQ0FBQzthQUNELFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLDZDQUE2QztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7O2lIQWJVLG1CQUFtQjtxR0FBbkIsbUJBQW1COzRGQUFuQixtQkFBbUI7a0JBRC9CLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludHN9IGZyb20gXCJAYW5ndWxhci9jZGsvbGF5b3V0XCI7XHJcbmltcG9ydCB7RGlyZWN0aXZlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBjbGFzcyBSZXNwb25zaXZlQ29tcG9uZW50IHtcclxuXHJcbiAgc2NyZWVuWHMgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyKSB7XHJcbiAgICBicmVha3BvaW50T2JzZXJ2ZXJcclxuICAgICAgLm9ic2VydmUoW1xyXG4gICAgICAgIEJyZWFrcG9pbnRzLlhTbWFsbFxyXG4gICAgICBdKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgdGhpcy5zY3JlZW5YcyA9IChyZXN1bHQubWF0Y2hlcyk7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2NyZWVuIFhTOiBcIit0aGlzLnNjcmVlblhzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
1
+ import { Breakpoints } from "@angular/cdk/layout";
2
+ import { Directive } from "@angular/core";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/cdk/layout";
5
+ export class ResponsiveComponent {
6
+ constructor(breakpointObserver) {
7
+ this.breakpointObserver = breakpointObserver;
8
+ this.screenXs = false;
9
+ breakpointObserver
10
+ .observe([
11
+ Breakpoints.XSmall
12
+ ])
13
+ .subscribe(result => {
14
+ this.screenXs = (result.matches);
15
+ //console.debug("Screen XS: "+this.screenXs);
16
+ });
17
+ }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ResponsiveComponent, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Directive }); }
19
+ static { thisdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.6", type: ResponsiveComponent, ngImport: i0 }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ResponsiveComponent, decorators: [{
22
+ type: Directive
23
+ }], ctorParameters: () => [{ type: i1.BreakpointObserver }] });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2l2ZV9jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvdWkvcmVzcG9uc2l2ZV9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7QUFHeEMsTUFBTSxPQUFPLG1CQUFtQjtJQUk5QixZQUFzQixrQkFBc0M7UUFBdEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUY1RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2Ysa0JBQWtCO2FBQ2YsT0FBTyxDQUFDO1lBQ1AsV0FBVyxDQUFDLE1BQU07U0FDbkIsQ0FBQzthQUNELFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLDZDQUE2QztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBYlUsbUJBQW1CO2tHQUFuQixtQkFBbUI7OzJGQUFuQixtQkFBbUI7a0JBRC9CLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludHN9IGZyb20gXCJAYW5ndWxhci9jZGsvbGF5b3V0XCI7XHJcbmltcG9ydCB7RGlyZWN0aXZlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBjbGFzcyBSZXNwb25zaXZlQ29tcG9uZW50IHtcclxuXHJcbiAgc2NyZWVuWHMgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyKSB7XHJcbiAgICBicmVha3BvaW50T2JzZXJ2ZXJcclxuICAgICAgLm9ic2VydmUoW1xyXG4gICAgICAgIEJyZWFrcG9pbnRzLlhTbWFsbFxyXG4gICAgICBdKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgdGhpcy5zY3JlZW5YcyA9IChyZXN1bHQubWF0Y2hlcyk7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2NyZWVuIFhTOiBcIit0aGlzLnNjcmVlblhzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
@@ -1,23 +1,23 @@
1
- import { Directive, Input } from "@angular/core";
2
- import * as i0 from "@angular/core";
3
- export class ScrollIntoViewDirective {
4
- constructor(elRef) {
5
- this.elRef = elRef;
6
- }
7
- set scrollIntoViewToBottom(siv) {
8
- if (siv) {
9
- this.elRef.nativeElement.scrollIntoView(false);
10
- }
11
- }
12
- }
13
- ScrollIntoViewDirectivefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollIntoViewDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
14
- ScrollIntoViewDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: { scrollIntoViewToBottom: "scrollIntoViewToBottom" }, ngImport: i0 });
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollIntoViewDirective, decorators: [{
16
- type: Directive,
17
- args: [{
18
- selector: "[scrollIntoViewToBottom]"
19
- }]
20
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { scrollIntoViewToBottom: [{
21
- type: Input
22
- }] } });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsSW50b1ZpZXdUb0JvdHRvbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi91dGlscy9zY3JvbGxJbnRvVmlld1RvQm90dG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBQyxTQUFTLEVBQWMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQUkzRCxNQUFNLE9BQU8sdUJBQXVCO0lBRWxDLFlBQW9CLEtBQWdCO1FBQWhCLFVBQUssR0FBTCxLQUFLLENBQVc7SUFBRSxDQUFDO0lBQ3ZDLElBQ0ksc0JBQXNCLENBQUMsR0FBVztRQUNsQyxJQUFHLEdBQUcsRUFBQztZQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoRDtJQUNMLENBQUM7O3FIQVJVLHVCQUF1Qjt5R0FBdkIsdUJBQXVCOzRGQUF2Qix1QkFBdUI7a0JBSG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtpQkFDckM7aUdBS0ssc0JBQXNCO3NCQUR6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiXHJcblxyXG5pbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIltzY3JvbGxJbnRvVmlld1RvQm90dG9tXVwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTY3JvbGxJbnRvVmlld0RpcmVjdGl2ZXtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbFJlZjpFbGVtZW50UmVmKXt9XHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsSW50b1ZpZXdUb0JvdHRvbShzaXY6Ym9vbGVhbil7XHJcbiAgICAgIGlmKHNpdil7XHJcbiAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KGZhbHNlKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19
1
+ import { Directive, Input } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class ScrollIntoViewDirective {
4
+ constructor(elRef) {
5
+ this.elRef = elRef;
6
+ }
7
+ set scrollIntoViewToBottom(siv) {
8
+ if (siv) {
9
+ this.elRef.nativeElement.scrollIntoView(false);
10
+ }
11
+ }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ScrollIntoViewDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
13
+ static { thisdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.6", type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: { scrollIntoViewToBottom: "scrollIntoViewToBottom" }, ngImport: i0 }); }
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ScrollIntoViewDirective, decorators: [{
16
+ type: Directive,
17
+ args: [{
18
+ selector: "[scrollIntoViewToBottom]"
19
+ }]
20
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { scrollIntoViewToBottom: [{
21
+ type: Input
22
+ }] } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsSW50b1ZpZXdUb0JvdHRvbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi91dGlscy9zY3JvbGxJbnRvVmlld1RvQm90dG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBQyxTQUFTLEVBQWMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQUkzRCxNQUFNLE9BQU8sdUJBQXVCO0lBRWxDLFlBQW9CLEtBQWdCO1FBQWhCLFVBQUssR0FBTCxLQUFLLENBQVc7SUFBRSxDQUFDO0lBQ3ZDLElBQ0ksc0JBQXNCLENBQUMsR0FBVztRQUNsQyxJQUFHLEdBQUcsRUFBQztZQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoRDtJQUNMLENBQUM7OEdBUlUsdUJBQXVCO2tHQUF2Qix1QkFBdUI7OzJGQUF2Qix1QkFBdUI7a0JBSG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtpQkFDckM7K0VBS0ssc0JBQXNCO3NCQUR6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiXHJcblxyXG5pbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIltzY3JvbGxJbnRvVmlld1RvQm90dG9tXVwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTY3JvbGxJbnRvVmlld0RpcmVjdGl2ZXtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbFJlZjpFbGVtZW50UmVmKXt9XHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsSW50b1ZpZXdUb0JvdHRvbShzaXY6Ym9vbGVhbil7XHJcbiAgICAgIGlmKHNpdil7XHJcbiAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KGZhbHNlKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -0,0 +1,190 @@
1
+ export class UserAgentComponent {
2
+ constructor(name, version, comment) {
3
+ this.name = name;
4
+ this.version = version;
5
+ this.comment = comment;
6
+ }
7
+ toString() {
8
+ let s = '[' + this.name + ']';
9
+ if (this.version) {
10
+ s = s + ' [' + this.version + ']';
11
+ }
12
+ if (this.comment) {
13
+ s = s + ' [' + this.comment + ']';
14
+ }
15
+ return s;
16
+ }
17
+ }
18
+ export const NAME_FIREFOX = 'Firefox';
19
+ export const NAME_CHROME = 'Chrome';
20
+ export const NAME_SAFARI = 'Safari';
21
+ export const NAME_EDGE = 'Edge';
22
+ export var Browser;
23
+ (function (Browser) {
24
+ Browser["Firefox"] = "Firefox";
25
+ Browser["Chrome"] = "Chrome";
26
+ Browser["Safari"] = "Safari";
27
+ Browser["Edge"] = "Edge";
28
+ })(Browser || (Browser = {}));
29
+ export const OS_WINDOWS = 'Windows';
30
+ export const OS_ANDROID = 'Android';
31
+ export var Platform;
32
+ (function (Platform) {
33
+ Platform["Windows"] = "Windows";
34
+ Platform["Android"] = "Android";
35
+ Platform["macOS"] = "MAC OS X";
36
+ })(Platform || (Platform = {}));
37
+ export class UserAgent {
38
+ constructor(_detectedPlatform, _detectedBrowser, _detectedBrowserVersion = null) {
39
+ this._detectedPlatform = _detectedPlatform;
40
+ this._detectedBrowser = _detectedBrowser;
41
+ this._detectedBrowserVersion = _detectedBrowserVersion;
42
+ }
43
+ get detectedBrowser() {
44
+ return this._detectedBrowser;
45
+ }
46
+ get detectedBrowserVersion() {
47
+ return this._detectedBrowserVersion;
48
+ }
49
+ get detectedPlatform() {
50
+ return this._detectedPlatform;
51
+ }
52
+ }
53
+ export class UserAgentBuilder {
54
+ constructor() {
55
+ this.comps = new Array();
56
+ }
57
+ static { this.instance = undefined; }
58
+ build() {
59
+ // // @ts-ignore
60
+ // if(navigator.userAgentData){
61
+ // // maybe we can use this in the future
62
+ // console.info("Browser provides userAgentData:");
63
+ //
64
+ // console.info("Brands:");
65
+ // // @ts-ignore
66
+ // navigator.userAgentData.brands.forEach((br=>{
67
+ // console.info(br.brand +" "+br.version);
68
+ // }))
69
+ // // @ts-ignore
70
+ // console.info("Platform: "+navigator.userAgentData.platform);
71
+ // // @ts-ignore
72
+ // console.info("Mobile:"+navigator.userAgentData.mobile);
73
+ // // @ts-ignore
74
+ // //console.info(navigator.userAgentData.toJSON());
75
+ // }else {
76
+ // console.info("Browser does not provide userAgentData.");
77
+ // }
78
+ let ua = navigator.userAgent;
79
+ console.debug("User agent: " + ua);
80
+ this.comps = new Array();
81
+ let pp = 0;
82
+ while (pp < ua.length) {
83
+ //parse name/version
84
+ let name = null;
85
+ let version = null;
86
+ let comment;
87
+ let blPos = ua.indexOf(' ', pp);
88
+ let prt;
89
+ // TODO Replace substr with substring (?)
90
+ // https://stackoverflow.com/questions/52640271/why-is-string-prototype-substr-deprecated
91
+ if (blPos == -1) {
92
+ prt = ua.substr(pp);
93
+ pp += prt.length;
94
+ }
95
+ else {
96
+ prt = ua.substr(pp, blPos - pp);
97
+ pp = blPos + 1;
98
+ }
99
+ let sepPos = prt.indexOf('/');
100
+ if (sepPos > 0) {
101
+ name = prt.substr(0, sepPos);
102
+ version = prt.substr(sepPos + 1);
103
+ }
104
+ else {
105
+ name = prt;
106
+ }
107
+ while (ua[pp] === ' ' && pp < ua.length) {
108
+ pp++;
109
+ }
110
+ if (ua[pp] === '(') {
111
+ pp++;
112
+ let commEnd = ua.indexOf(')', pp);
113
+ comment = ua.substr(pp, commEnd - pp);
114
+ pp = commEnd + 1;
115
+ }
116
+ while (ua[pp] === ' ' && pp < ua.length) {
117
+ pp++;
118
+ }
119
+ const uac = new UserAgentComponent(name, version, comment);
120
+ console.debug("user agent comp: " + uac);
121
+ this.comps.push(uac);
122
+ }
123
+ let detPlatf = null;
124
+ if (this.runsOnOS(Platform.Android)) {
125
+ detPlatf = Platform.Android;
126
+ }
127
+ else if (this.runsOnOS(Platform.Windows)) {
128
+ detPlatf = Platform.Windows;
129
+ }
130
+ else if (this.runsOnOS(Platform.macOS)) {
131
+ detPlatf = Platform.macOS;
132
+ }
133
+ let detBr = null;
134
+ if (this.matchesBrowser(Browser.Firefox)) {
135
+ detBr = Browser.Firefox;
136
+ }
137
+ else if (this.matchesBrowser(Browser.Chrome)) {
138
+ detBr = Browser.Chrome;
139
+ }
140
+ else if (this.matchesBrowser(Browser.Safari)) {
141
+ detBr = Browser.Safari;
142
+ }
143
+ let detBrVers = null;
144
+ if (detBr) {
145
+ detBrVers = this.browserVersion(detBr);
146
+ }
147
+ this.userAgent = new UserAgent(detPlatf, detBr, detBrVers);
148
+ }
149
+ matchesBrowser(browserName) {
150
+ for (let ci = 0; ci < this.comps.length; ci++) {
151
+ let bn = this.comps[ci].name;
152
+ let bnRe = new RegExp(browserName, 'i');
153
+ if (bn.match(bnRe)) {
154
+ return true;
155
+ }
156
+ }
157
+ return false;
158
+ }
159
+ browserVersion(browserName) {
160
+ for (let ci = 0; ci < this.comps.length; ci++) {
161
+ const comp = this.comps[ci];
162
+ const bn = comp.name;
163
+ const bnRe = new RegExp(browserName, 'i');
164
+ if (bn.match(bnRe)) {
165
+ return comp.version;
166
+ }
167
+ }
168
+ return null;
169
+ }
170
+ runsOnOS(os) {
171
+ for (let ci = 0; ci < this.comps.length; ci++) {
172
+ let cc = this.comps[ci].comment;
173
+ if (cc) {
174
+ var osRe = new RegExp(os, 'i');
175
+ if (cc.match(osRe)) {
176
+ return true;
177
+ }
178
+ }
179
+ }
180
+ return false;
181
+ }
182
+ static userAgent() {
183
+ if (!this.instance) {
184
+ this.instance = new UserAgentBuilder();
185
+ }
186
+ this.instance.build();
187
+ return this.instance.userAgent;
188
+ }
189
+ }
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWEtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3V0aWxzL3VhLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQW1CLElBQVcsRUFBUSxPQUFtQixFQUFRLE9BQWU7UUFBN0QsU0FBSSxHQUFKLElBQUksQ0FBTztRQUFRLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUSxZQUFPLEdBQVAsT0FBTyxDQUFRO0lBRWhGLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLEdBQUMsR0FBRyxHQUFDLElBQUksQ0FBQyxJQUFJLEdBQUMsR0FBRyxDQUFDO1FBQ3hCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztZQUNkLENBQUMsR0FBQyxDQUFDLEdBQUMsSUFBSSxHQUFDLElBQUksQ0FBQyxPQUFPLEdBQUMsR0FBRyxDQUFDO1NBQzNCO1FBQ0QsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO1lBQ2QsQ0FBQyxHQUFDLENBQUMsR0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLE9BQU8sR0FBQyxHQUFHLENBQUM7U0FDM0I7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDRjtBQUNELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBQyxTQUFTLENBQUM7QUFDcEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFDLFFBQVEsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUMsUUFBUSxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBQyxNQUFNLENBQUM7QUFJOUIsTUFBTSxDQUFOLElBQVksT0FBdUU7QUFBbkYsV0FBWSxPQUFPO0lBQUUsOEJBQWlCLENBQUE7SUFBQyw0QkFBZSxDQUFBO0lBQUMsNEJBQWUsQ0FBQTtJQUFDLHdCQUFXLENBQUE7QUFBQSxDQUFDLEVBQXZFLE9B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LEVBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFFbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBVc2VyQWdlbnRDb21wb25lbnR7XHJcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6c3RyaW5nLHB1YmxpYyB2ZXJzaW9uOnN0cmluZ3xudWxsLHB1YmxpYyBjb21tZW50PzpzdHJpbmcpIHtcclxuXHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOnN0cmluZ3tcclxuICAgIGxldCBzPSdbJyt0aGlzLm5hbWUrJ10nO1xyXG4gICAgaWYodGhpcy52ZXJzaW9uKXtcclxuICAgICAgcz1zKycgWycrdGhpcy52ZXJzaW9uKyddJztcclxuICAgIH1cclxuICAgIGlmKHRoaXMuY29tbWVudCl7XHJcbiAgICAgIHM9cysnIFsnK3RoaXMuY29tbWVudCsnXSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcztcclxuICB9XHJcbn1cclxuZXhwb3J0IGNvbnN0IE5BTUVfRklSRUZPWD0nRmlyZWZveCc7XHJcbmV4cG9ydCBjb25zdCBOQU1FX0NIUk9NRT0nQ2hyb21lJztcclxuZXhwb3J0IGNvbnN0IE5BTUVfU0FGQVJJPSdTYWZhcmknO1xyXG5leHBvcnQgY29uc3QgTkFNRV9FREdFPSdFZGdlJztcclxuXHJcblxyXG5cclxuZXhwb3J0IGVudW0gQnJvd3NlciB7RmlyZWZveD0nRmlyZWZveCcsQ2hyb21lPSdDaHJvbWUnLFNhZmFyaT0nU2FmYXJpJyxFZGdlPSdFZGdlJ31cclxuXHJcbmV4cG9ydCBjb25zdCBPU19XSU5ET1dTPSdXaW5kb3dzJztcclxuZXhwb3J0IGNvbnN0IE9TX0FORFJPSUQ9J0FuZHJvaWQnO1xyXG5cclxuZXhwb3J0IGVudW0gUGxhdGZvcm0ge1dpbmRvd3M9J1dpbmRvd3MnLEFuZHJvaWQ9J0FuZHJvaWQnLG1hY09TPSdNQUMgT1MgWCd9XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlckFnZW50e1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGV0ZWN0ZWRQbGF0Zm9ybTpQbGF0Zm9ybXxudWxsLHByaXZhdGUgX2RldGVjdGVkQnJvd3NlcjpCcm93c2VyfG51bGwscHJpdmF0ZSBfZGV0ZWN0ZWRCcm93c2VyVmVyc2lvbjpzdHJpbmd8bnVsbD1udWxsKSB7XHJcbiAgfVxyXG5cclxuICBnZXQgZGV0ZWN0ZWRCcm93c2VyKCk6IEJyb3dzZXIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXRlY3RlZEJyb3dzZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgZGV0ZWN0ZWRCcm93c2VyVmVyc2lvbigpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXRlY3RlZEJyb3dzZXJWZXJzaW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRldGVjdGVkUGxhdGZvcm0oKTogUGxhdGZvcm0gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXRlY3RlZFBsYXRmb3JtO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBVc2VyQWdlbnRCdWlsZGVyIHtcclxuICBzdGF0aWMgaW5zdGFuY2U6VXNlckFnZW50QnVpbGRlcnx1bmRlZmluZWQ9dW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY29tcHM6QXJyYXk8VXNlckFnZW50Q29tcG9uZW50Pj1uZXcgQXJyYXk8VXNlckFnZW50Q29tcG9uZW50PigpO1xyXG4gIHByaXZhdGUgdXNlckFnZW50ITpVc2VyQWdlbnQ7XHJcblxyXG4gIHByaXZhdGUgYnVpbGQoKSB7XHJcblxyXG4gICAgLy8gLy8gQHRzLWlnbm9yZVxyXG4gICAgLy8gaWYobmF2aWdhdG9yLnVzZXJBZ2VudERhdGEpe1xyXG4gICAgLy8gICAvLyBtYXliZSB3ZSBjYW4gdXNlIHRoaXMgaW4gIHRoZSBmdXR1cmVcclxuICAgIC8vICAgY29uc29sZS5pbmZvKFwiQnJvd3NlciBwcm92aWRlcyB1c2VyQWdlbnREYXRhOlwiKTtcclxuICAgIC8vXHJcbiAgICAvLyAgIGNvbnNvbGUuaW5mbyhcIkJyYW5kczpcIik7XHJcbiAgICAvLyAgIC8vIEB0cy1pZ25vcmVcclxuICAgIC8vICAgbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEuYnJhbmRzLmZvckVhY2goKGJyPT57XHJcbiAgICAvLyAgICAgY29uc29sZS5pbmZvKGJyLmJyYW5kICtcIiBcIitici52ZXJzaW9uKTtcclxuICAgIC8vICAgfSkpXHJcbiAgICAvLyAgIC8vIEB0cy1pZ25vcmVcclxuICAgIC8vICAgY29uc29sZS5pbmZvKFwiUGxhdGZvcm06IFwiK25hdmlnYXRvci51c2VyQWdlbnREYXRhLnBsYXRmb3JtKTtcclxuICAgIC8vICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgLy8gICBjb25zb2xlLmluZm8oXCJNb2JpbGU6XCIrbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEubW9iaWxlKTtcclxuICAgIC8vICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgLy8gICAvL2NvbnNvbGUuaW5mbyhuYXZpZ2F0b3IudXNlckFnZW50RGF0YS50b0pTT04oKSk7XHJcbiAgICAvLyB9ZWxzZSB7XHJcbiAgICAvLyAgIGNvbnNvbGUuaW5mbyhcIkJyb3dzZXIgZG9lcyBub3QgcHJvdmlkZSB1c2VyQWdlbnREYXRhLlwiKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBsZXQgdWE9bmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuICAgIGNvbnNvbGUuZGVidWcoXCJVc2VyIGFnZW50OiBcIit1YSk7XHJcbiAgICB0aGlzLmNvbXBzID0gbmV3IEFycmF5PFVzZXJBZ2VudENvbXBvbmVudD4oKTtcclxuXHJcbiAgICBsZXQgcHAgPSAwO1xyXG4gICAgd2hpbGUgKHBwIDwgdWEubGVuZ3RoKSB7XHJcbiAgICAgIC8vcGFyc2UgbmFtZS92ZXJzaW9uXHJcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbFxyXG4gICAgICBsZXQgdmVyc2lvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgIGxldCBjb21tZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBsZXQgYmxQb3MgPSB1YS5pbmRleE9mKCcgJywgcHApO1xyXG4gICAgICBsZXQgcHJ0OiBzdHJpbmc7XHJcbiAgICAgIC8vIFRPRE8gUmVwbGFjZSBzdWJzdHIgd2l0aCBzdWJzdHJpbmcgKD8pXHJcbiAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUyNjQwMjcxL3doeS1pcy1zdHJpbmctcHJvdG90eXBlLXN1YnN0ci1kZXByZWNhdGVkXHJcbiAgICAgIGlmIChibFBvcyA9PSAtMSkge1xyXG4gICAgICAgIHBydCA9IHVhLnN1YnN0cihwcCk7XHJcbiAgICAgICAgcHAgKz0gcHJ0Lmxlbmd0aDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwcnQgPSB1YS5zdWJzdHIocHAsIGJsUG9zIC0gcHApO1xyXG4gICAgICAgIHBwID0gYmxQb3MgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzZXBQb3MgPSBwcnQuaW5kZXhPZignLycpO1xyXG4gICAgICBpZiAoc2VwUG9zID4gMCkge1xyXG4gICAgICAgIG5hbWUgPSBwcnQuc3Vic3RyKDAsIHNlcFBvcyk7XHJcbiAgICAgICAgdmVyc2lvbiA9IHBydC5zdWJzdHIoc2VwUG9zICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmFtZSA9IHBydDtcclxuICAgICAgfVxyXG4gICAgICB3aGlsZSAodWFbcHBdID09PSAnICcgJiYgcHAgPCB1YS5sZW5ndGgpIHtcclxuICAgICAgICBwcCsrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh1YVtwcF0gPT09ICcoJykge1xyXG4gICAgICAgIHBwKys7XHJcbiAgICAgICAgbGV0IGNvbW1FbmQgPSB1YS5pbmRleE9mKCcpJywgcHApO1xyXG4gICAgICAgIGNvbW1lbnQgPSB1YS5zdWJzdHIocHAsIGNvbW1FbmQgLSBwcCk7XHJcbiAgICAgICAgcHAgPSBjb21tRW5kICsgMTtcclxuICAgICAgfVxyXG4gICAgICB3aGlsZSAodWFbcHBdID09PSAnICcgJiYgcHAgPCB1YS5sZW5ndGgpIHtcclxuICAgICAgICBwcCsrO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHVhYz1uZXcgVXNlckFnZW50Q29tcG9uZW50KG5hbWUsIHZlcnNpb24sIGNvbW1lbnQpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwidXNlciBhZ2VudCBjb21wOiBcIit1YWMpO1xyXG4gICAgICB0aGlzLmNvbXBzLnB1c2godWFjKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGV0UGxhdGY6UGxhdGZvcm18bnVsbD1udWxsO1xyXG4gICAgaWYodGhpcy5ydW5zT25PUyhQbGF0Zm9ybS5BbmRyb2lkKSl7XHJcbiAgICAgIGRldFBsYXRmPVBsYXRmb3JtLkFuZHJvaWQ7XHJcbiAgICB9ZWxzZSBpZih0aGlzLnJ1bnNPbk9TKFBsYXRmb3JtLldpbmRvd3MpKXtcclxuICAgICAgZGV0UGxhdGY9UGxhdGZvcm0uV2luZG93cztcclxuICAgIH1lbHNlIGlmKHRoaXMucnVuc09uT1MoUGxhdGZvcm0ubWFjT1MpKXtcclxuICAgICAgZGV0UGxhdGY9UGxhdGZvcm0ubWFjT1M7XHJcbiAgICB9XHJcblxyXG5cclxuICBsZXQgZGV0QnI6QnJvd3NlcnxudWxsPW51bGw7XHJcbiAgICBpZih0aGlzLm1hdGNoZXNCcm93c2VyKEJyb3dzZXIuRmlyZWZveCkpe1xyXG4gICAgICBkZXRCcj1Ccm93c2VyLkZpcmVmb3g7XHJcbiAgICB9ZWxzZSBpZih0aGlzLm1hdGNoZXNCcm93c2VyKEJyb3dzZXIuQ2hyb21lKSl7XHJcbiAgICAgIGRldEJyPUJyb3dzZXIuQ2hyb21lO1xyXG4gICAgfWVsc2UgaWYodGhpcy5tYXRjaGVzQnJvd3NlcihCcm93c2VyLlNhZmFyaSkpe1xyXG4gICAgICBkZXRCcj1Ccm93c2VyLlNhZmFyaTtcclxuICAgIH1cclxuICAgIGxldCBkZXRCclZlcnMgPW51bGw7XHJcbiAgICBpZihkZXRCcikge1xyXG4gICAgIGRldEJyVmVycz10aGlzLmJyb3dzZXJWZXJzaW9uKGRldEJyKTtcclxuICAgIH1cclxuICAgIHRoaXMudXNlckFnZW50PW5ldyBVc2VyQWdlbnQoZGV0UGxhdGYsZGV0QnIsZGV0QnJWZXJzKTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hdGNoZXNCcm93c2VyKGJyb3dzZXJOYW1lOnN0cmluZyl7XHJcbiAgICBmb3IobGV0IGNpPTA7Y2k8dGhpcy5jb21wcy5sZW5ndGg7Y2krKyl7XHJcbiAgICAgIGxldCBibj10aGlzLmNvbXBzW2NpXS5uYW1lXHJcbiAgICAgIGxldCBiblJlPW5ldyBSZWdFeHAoYnJvd3Nlck5hbWUsJ2knKTtcclxuICAgICAgaWYoYm4ubWF0Y2goYm5SZSkpe1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJyb3dzZXJWZXJzaW9uKGJyb3dzZXJOYW1lOnN0cmluZyk6c3RyaW5nfG51bGx7XHJcbiAgICBmb3IobGV0IGNpPTA7Y2k8dGhpcy5jb21wcy5sZW5ndGg7Y2krKyl7XHJcbiAgICAgIGNvbnN0IGNvbXA9dGhpcy5jb21wc1tjaV07XHJcbiAgICAgIGNvbnN0IGJuPWNvbXAubmFtZTtcclxuICAgICAgY29uc3QgYm5SZT1uZXcgUmVnRXhwKGJyb3dzZXJOYW1lLCdpJyk7XHJcbiAgICAgIGlmKGJuLm1hdGNoKGJuUmUpKXtcclxuICAgICAgICByZXR1cm4gY29tcC52ZXJzaW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcnVuc09uT1Mob3M6c3RyaW5nKTpib29sZWFue1xyXG4gICAgZm9yKGxldCBjaT0wO2NpPHRoaXMuY29tcHMubGVuZ3RoO2NpKyspe1xyXG4gICAgICBsZXQgY2M9dGhpcy5jb21wc1tjaV0uY29tbWVudFxyXG4gICAgICBpZihjYyl7XHJcbiAgICAgICAgdmFyIG9zUmUgPSBuZXcgUmVnRXhwKG9zLCdpJyk7XHJcbiAgICAgICAgaWYoY2MubWF0Y2gob3NSZSkpe1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgdXNlckFnZW50KCk6VXNlckFnZW50e1xyXG4gICAgICBpZighdGhpcy5pbnN0YW5jZSl7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZT1uZXcgVXNlckFnZW50QnVpbGRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaW5zdGFuY2UuYnVpbGQoKTtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UudXNlckFnZW50O1xyXG5cclxuICB9XHJcblxyXG59XHJcbiJdfQ==