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
@@ -1,57 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class SimpleTrafficLight {
4
- constructor() {
5
- this.status = 4 /* OFF */;
6
- }
7
- set status(status) {
8
- if (4 /* OFF */ === status) {
9
- this.lighttop = 'grey';
10
- this.lightmid = 'grey';
11
- this.lightbottom = 'grey';
12
- }
13
- else if (0 /* IDLE */ === status) {
14
- this.lighttop = 'red';
15
- this.lightmid = 'grey';
16
- this.lightbottom = 'grey';
17
- }
18
- else if (1 /* PRERECORDING */ == status) {
19
- this.lighttop = 'red';
20
- this.lightmid = 'yellow';
21
- this.lightbottom = 'grey';
22
- }
23
- else if (3 /* RECORDING */ == status) {
24
- this.lighttop = 'grey';
25
- this.lightmid = 'grey';
26
- this.lightbottom = 'green';
27
- }
28
- else if (2 /* POSTRECORDING */ == status) {
29
- this.lighttop = 'grey';
30
- this.lightmid = 'yellow';
31
- this.lightbottom = 'grey';
32
- }
33
- }
34
- }
35
- SimpleTrafficLight.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SimpleTrafficLight, deps: [], target: i0.ɵɵFactoryTarget.Component });
36
- SimpleTrafficLight.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SimpleTrafficLight, selector: "app-simpletrafficlight", inputs: { status: "status" }, ngImport: i0, template: `
37
-
38
- <div>
39
- <div class="circle {{lighttop}}"></div>
40
- <div class="circle {{lightmid}}"></div>
41
- <div class="circle {{lightbottom}}"></div>
42
- </div>
43
- `, isInline: true, styles: [".circle{width:50px;height:50px;border-radius:50%;margin:5px;background:grey}\n", ".red{background:red}\n", ".yellow{background:yellow}\n", ".green{background:green}\n", ".black{background:black}\n", ":host{display:flex;flex-direction:column;background:black;padding:2px;height:170px;max-height:170px;flex:0 0 content}\n"] });
44
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SimpleTrafficLight, decorators: [{
45
- type: Component,
46
- args: [{ selector: 'app-simpletrafficlight', template: `
47
-
48
- <div>
49
- <div class="circle {{lighttop}}"></div>
50
- <div class="circle {{lightmid}}"></div>
51
- <div class="circle {{lightbottom}}"></div>
52
- </div>
53
- `, styles: [".circle{width:50px;height:50px;border-radius:50%;margin:5px;background:grey}\n", ".red{background:red}\n", ".yellow{background:yellow}\n", ".green{background:green}\n", ".black{background:black}\n", ":host{display:flex;flex-direction:column;background:black;padding:2px;height:170px;max-height:170px;flex:0 0 content}\n"] }]
54
- }], ctorParameters: function () { return []; }, propDecorators: { status: [{
55
- type: Input
56
- }] } });
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxldHJhZmZpY2xpZ2h0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3N0YXJ0c3RvcHNpZ25hbC91aS9zaW1wbGV0cmFmZmljbGlnaHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUE7O0FBaUQ3QyxNQUFNLE9BQU8sa0JBQWtCO0lBTTdCO1FBQ0UsSUFBSSxDQUFDLE1BQU0sY0FBVSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUNJLE1BQU0sQ0FBQyxNQUFhO1FBQ3RCLElBQUksZ0JBQWMsTUFBTSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1NBQzNCO2FBQU0sSUFBSSxpQkFBZSxNQUFNLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7U0FDM0I7YUFBTSxJQUFJLHdCQUFzQixNQUFNLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7U0FDM0I7YUFBTSxJQUFJLHFCQUFtQixNQUFNLEVBQUU7WUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7U0FDNUI7YUFBTSxJQUFJLHlCQUF1QixNQUFNLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7U0FDM0I7SUFDSCxDQUFDOztnSEFqQ1Usa0JBQWtCO29HQUFsQixrQkFBa0IsNEZBMUNuQjs7Ozs7OztHQU9UOzRGQW1DVSxrQkFBa0I7a0JBOUM5QixTQUFTOytCQUVFLHdCQUF3QixZQUV4Qjs7Ozs7OztHQU9UOzBFQThDRyxNQUFNO3NCQURULEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCxJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtTdGFydFN0b3BTaWduYWwsIFN0YXRlfSBmcm9tICcuLi9zdGFydHN0b3BzaWduYWwnXHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtc2ltcGxldHJhZmZpY2xpZ2h0JyxcclxuXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8ZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlIHt7bGlnaHR0b3B9fVwiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlIHt7bGlnaHRtaWR9fVwiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlIHt7bGlnaHRib3R0b219fVwiPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYFxyXG4gICxcclxuICBzdHlsZXM6IFtgLmNpcmNsZSB7XHJcbiAgICB3aWR0aDogNTBweDtcclxuICAgIGhlaWdodDogNTBweDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIG1hcmdpbjogNXB4O1xyXG4gICAgYmFja2dyb3VuZDogZ3JleTtcclxuICB9YCwgYC5yZWQge1xyXG4gICAgYmFja2dyb3VuZDogcmVkO1xyXG4gIH1cclxuICBgLCBgXHJcbiAgICAueWVsbG93IHtcclxuICAgICAgYmFja2dyb3VuZDogeWVsbG93O1xyXG4gICAgfVxyXG4gIGAsIGBcclxuICAgIC5ncmVlbiB7XHJcbiAgICAgIGJhY2tncm91bmQ6IGdyZWVuO1xyXG4gICAgfVxyXG4gIGAsIGBcclxuICAgIC5ibGFjayB7XHJcbiAgICAgIGJhY2tncm91bmQ6IGJsYWNrO1xyXG4gICAgfWAsXHJcbiAgICAgIGA6aG9zdCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGJhY2tncm91bmQ6IGJsYWNrO1xyXG4gICAgICAgICAgXHJcbiAgICAgIHBhZGRpbmc6IDJweDtcclxuICAgICAgaGVpZ2h0OiAxNzBweDtcclxuICAgICAgbWF4LWhlaWdodDogMTcwcHg7XHJcbiAgICAgIGZsZXg6IDAgMCBjb250ZW50O1xyXG4gICAgfVxyXG4gICAgYF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXBsZVRyYWZmaWNMaWdodCBpbXBsZW1lbnRzIFN0YXJ0U3RvcFNpZ25hbCB7XHJcblxyXG4gIGxpZ2h0dG9wITogc3RyaW5nO1xyXG4gIGxpZ2h0bWlkITogc3RyaW5nO1xyXG4gIGxpZ2h0Ym90dG9tITogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuc3RhdHVzPVN0YXRlLk9GRjtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHN0YXR1cyhzdGF0dXM6IFN0YXRlKSB7XHJcbiAgICBpZiAoU3RhdGUuT0ZGID09PSBzdGF0dXMpIHtcclxuICAgICAgdGhpcy5saWdodHRvcCA9ICdncmV5JztcclxuICAgICAgdGhpcy5saWdodG1pZCA9ICdncmV5JztcclxuICAgICAgdGhpcy5saWdodGJvdHRvbSA9ICdncmV5JztcclxuICAgIH0gZWxzZSBpZiAoU3RhdGUuSURMRSA9PT0gc3RhdHVzKSB7XHJcbiAgICAgIHRoaXMubGlnaHR0b3AgPSAncmVkJztcclxuICAgICAgdGhpcy5saWdodG1pZCA9ICdncmV5JztcclxuICAgICAgdGhpcy5saWdodGJvdHRvbSA9ICdncmV5JztcclxuICAgIH0gZWxzZSBpZiAoU3RhdGUuUFJFUkVDT1JESU5HID09IHN0YXR1cykge1xyXG4gICAgICB0aGlzLmxpZ2h0dG9wID0gJ3JlZCc7XHJcbiAgICAgIHRoaXMubGlnaHRtaWQgPSAneWVsbG93JztcclxuICAgICAgdGhpcy5saWdodGJvdHRvbSA9ICdncmV5JztcclxuICAgIH0gZWxzZSBpZiAoU3RhdGUuUkVDT1JESU5HID09IHN0YXR1cykge1xyXG4gICAgICB0aGlzLmxpZ2h0dG9wID0gJ2dyZXknO1xyXG4gICAgICB0aGlzLmxpZ2h0bWlkID0gJ2dyZXknO1xyXG4gICAgICB0aGlzLmxpZ2h0Ym90dG9tID0gJ2dyZWVuJztcclxuICAgIH0gZWxzZSBpZiAoU3RhdGUuUE9TVFJFQ09SRElORyA9PSBzdGF0dXMpIHtcclxuICAgICAgdGhpcy5saWdodHRvcCA9ICdncmV5JztcclxuICAgICAgdGhpcy5saWdodG1pZCA9ICd5ZWxsb3cnO1xyXG4gICAgICB0aGlzLmxpZ2h0Ym90dG9tID0gJ2dyZXknO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==
@@ -1,253 +0,0 @@
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
- constructor(bpo, ref, changeDetectorRef) {
14
- super(bpo);
15
- this.bpo = bpo;
16
- this.ref = ref;
17
- this.changeDetectorRef = changeDetectorRef;
18
- this.ce = null;
19
- this.audioSignalCollapsed = true;
20
- this.enableDownload = false;
21
- this.peakDbLvl = MIN_DB_LEVEL;
22
- this._displayLevelInfos = null;
23
- this._agc = undefined;
24
- this.agcString = 'n/a';
25
- this.onShowRecordingDetails = new EventEmitter();
26
- this.onDownloadRecording = new EventEmitter();
27
- this.disableAudioDetails = true;
28
- this.audioLoaded = false;
29
- this.playStartEnabled = false;
30
- this.playStopEnabled = false;
31
- this.updateTimerId = null;
32
- this.destroyed = false;
33
- this.warnDbLevel = DEFAULT_WARN_DB_LEVEL;
34
- }
35
- set agc(agc) {
36
- this._agc = agc;
37
- if (this._agc === undefined || this._agc === null) {
38
- this.agcString = 'n/a';
39
- }
40
- else {
41
- if (this._agc === true) {
42
- this.agcString = 'On';
43
- }
44
- else {
45
- this.agcString = 'Off';
46
- }
47
- }
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
- }
68
- RecordingItemControls.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingItemControls, deps: [{ token: i1.BreakpointObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
69
- RecordingItemControls.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", 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: `
70
- <button matTooltip="Start playback" (click)="playStartAction?.perform()"
71
- [disabled]="playStartAction?.disabled"
72
- [style.color]="playStartAction?.disabled ? 'grey' : 'green'">
73
- <mat-icon>play_arrow</mat-icon>
74
- </button>
75
- <button matTooltip="Stop playback" (click)="playStopAction?.perform()"
76
- [disabled]="playStopAction?.disabled"
77
- [style.color]="playStopAction?.disabled ? 'grey' : 'yellow'">
78
- <mat-icon>stop</mat-icon>
79
- </button>
80
- <button *ngIf="!screenXs" matTooltip="Toggle detailed audio display" [disabled]="disableAudioDetails || !audioLoaded"
81
- (click)="showRecordingDetails()">
82
- <mat-icon>{{(audioSignalCollapsed) ? "expand_less" : "expand_more"}}</mat-icon>
83
- </button>
84
- <button matTooltip="Download current recording" *ngIf="enableDownload" [disabled]="disableAudioDetails || !audioLoaded"
85
- (click)="downloadRecording()">
86
- <mat-icon>file_download</mat-icon>
87
- </button>
88
- <div style="min-width: 14ch;padding:2px"><table style="border-style: none"><tr><td>Peak:</td><td><span matTooltip="Peak level"
89
- [style.color]="(peakDbLvl > warnDbLevel)?'red':'black'">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>
90
- <tr *ngIf="_agc"><td>AGC:</td><td><span matTooltip="Auto gain control">{{agcString}}</span></td></tr></table></div>
91
- `, 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]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }] });
92
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", 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?.disabled"
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: function () { return [{ 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
- constructor(bpo, ref, changeDetectorRef) {
142
- super(bpo);
143
- this.bpo = bpo;
144
- this.ref = ref;
145
- this.changeDetectorRef = changeDetectorRef;
146
- this.ce = null;
147
- this.streamingMode = false;
148
- this.audioSignalCollapsed = true;
149
- this.enableDownload = false;
150
- this.peakDbLvl = MIN_DB_LEVEL;
151
- this._displayLevelInfos = null;
152
- this._agc = undefined;
153
- this.agcString = 'n/a';
154
- this.onShowRecordingDetails = new EventEmitter();
155
- this.onDownloadRecording = new EventEmitter();
156
- this.playStartEnabled = false;
157
- this.playStopEnabled = false;
158
- this.updateTimerId = null;
159
- this.destroyed = false;
160
- this.warnDbLevel = DEFAULT_WARN_DB_LEVEL;
161
- }
162
- set agc(agc) {
163
- this._agc = agc;
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
- }
214
- RecordingItemDisplay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingItemDisplay, deps: [{ token: i1.BreakpointObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
215
- RecordingItemDisplay.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", 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: `
216
- <div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
217
- <audio-levelbar style="flex:1 0 1%" [streamingMode]="streamingMode" [displayLevelInfos]="_displayLevelInfos"></audio-levelbar>
218
- <spr-recordingitemcontrols style="flex:0 0 0px" [audioLoaded]="displayAudioBuffer!==null" [playStartAction]="playStartAction" [playStopAction]="playStopAction" [peakDbLvl]="peakDbLvl" [agc]="_agc" (onShowRecordingDetails)="onShowRecordingDetails.emit()"></spr-recordingitemcontrols>
219
- </div>
220
- `, 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"] }] });
221
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", 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: function () { return [{ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5naXRlbV9kaXNwbGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3VpL3JlY29yZGluZ2l0ZW1fZGlzcGxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ2dCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFDaEYsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFBO0FBRXRCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQUkzRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFrRHhDLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxtQkFBbUI7SUEyQzVELFlBQXNCLEdBQXNCLEVBQVMsR0FBZSxFQUFVLGlCQUFvQztRQUNoSCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFEUyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFTLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBekNsSCxPQUFFLEdBQXNCLElBQUksQ0FBQztRQUNwQix5QkFBb0IsR0FBVSxJQUFJLENBQUM7UUFFbkMsbUJBQWMsR0FBVSxLQUFLLENBQUM7UUFFOUIsY0FBUyxHQUFHLFlBQVksQ0FBQztRQUVsQyx1QkFBa0IsR0FBb0IsSUFBSSxDQUFDO1FBRTNDLFNBQUksR0FBd0IsU0FBUyxDQUFDO1FBQ3RDLGNBQVMsR0FBQyxLQUFLLENBQUM7UUFlTiwyQkFBc0IsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN0RSx3QkFBbUIsR0FBdUIsSUFBSSxZQUFZLEVBQVEs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RixpQkFBaUI7c0JBRHBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsXHJcbiAgICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXHJcbmltcG9ydCB7TGV2ZWxJbmZvLCBMZXZlbEluZm9zLCBMZXZlbExpc3RlbmVyfSBmcm9tIFwiLi4vYXVkaW8vZHNwL2xldmVsX21lYXN1cmVcIjtcclxuaW1wb3J0IHtMZXZlbEJhcn0gZnJvbSBcIi4uL2F1ZGlvL3VpL2xpdmVsZXZlbFwiO1xyXG5pbXBvcnQge0FjdGlvbn0gZnJvbSBcIi4uL2FjdGlvbi9hY3Rpb25cIjtcclxuaW1wb3J0IHtSZXNwb25zaXZlQ29tcG9uZW50fSBmcm9tIFwiLi9yZXNwb25zaXZlX2NvbXBvbmVudFwiO1xyXG5pbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9sYXlvdXRcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgTUlOX0RCX0xFVkVMID0gLTQwLjA7XHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBUk5fREJfTEVWRUwgPSAtMjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3ByLXJlY29yZGluZ2l0ZW1jb250cm9scycsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8YnV0dG9uIG1hdFRvb2x0aXA9XCJTdGFydCBwbGF5YmFja1wiIChjbGljayk9XCJwbGF5U3RhcnRBY3Rpb24/LnBlcmZvcm0oKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicGxheVN0YXJ0QWN0aW9uPy5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwicGxheVN0YXJ0QWN0aW9uPy5kaXNhYmxlZCA/ICdncmV5JyA6ICdncmVlbidcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnBsYXlfYXJyb3c8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0VG9vbHRpcD1cIlN0b3AgcGxheWJhY2tcIiAoY2xpY2spPVwicGxheVN0b3BBY3Rpb24/LnBlcmZvcm0oKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicGxheVN0b3BBY3Rpb24/LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJwbGF5U3RvcEFjdGlvbj8uZGlzYWJsZWQgPyAnZ3JleScgOiAneWVsbG93J1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+c3RvcDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFzY3JlZW5Yc1wiIG1hdFRvb2x0aXA9XCJUb2dnbGUgZGV0YWlsZWQgYXVkaW8gZGlzcGxheVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlQXVkaW9EZXRhaWxzIHx8ICFhdWRpb0xvYWRlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1JlY29yZGluZ0RldGFpbHMoKVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+e3soYXVkaW9TaWduYWxDb2xsYXBzZWQpID8gXCJleHBhbmRfbGVzc1wiIDogXCJleHBhbmRfbW9yZVwifX08L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0VG9vbHRpcD1cIkRvd25sb2FkIGN1cnJlbnQgcmVjb3JkaW5nXCIgKm5nSWY9XCJlbmFibGVEb3dubG9hZFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlQXVkaW9EZXRhaWxzIHx8ICFhdWRpb0xvYWRlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+ZmlsZV9kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1pbi13aWR0aDogMTRjaDtwYWRkaW5nOjJweFwiPjx0YWJsZSBzdHlsZT1cImJvcmRlci1zdHlsZTogbm9uZVwiPjx0cj48dGQ+UGVhazo8L3RkPjx0ZD48c3BhbiBtYXRUb29sdGlwPVwiUGVhayBsZXZlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCIocGVha0RiTHZsID4gd2FybkRiTGV2ZWwpPydyZWQnOidibGFjaydcIj57e3BlYWtEYkx2bCB8IG51bWJlcjonMS4xLTEnfX0gZEIgPC9zcGFuPjwvdGQ+PC90cj5cclxuICAgICAgICAgIDx0ciAqbmdJZj1cIl9hZ2NcIj48dGQ+QUdDOjwvdGQ+PHRkPjxzcGFuIG1hdFRvb2x0aXA9XCJBdXRvIGdhaW4gY29udHJvbFwiPnt7YWdjU3RyaW5nfX08L3NwYW4+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+XHJcbiAgICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICAgICAgZmxleDogMDsgLyogb25seSByZXF1aXJlZCB2ZXJ0aWNhbCBzcGFjZSAqL1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGJhY2tncm91bmQ6IGRhcmtncmF5O1xyXG4gICAgICAgIHBhZGRpbmc6IDRweDtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuXHJcbiAgICAgICAgZGlzcGxheTogZmxleDsgLyogZmxleCBjb250YWluZXI6IGxlZnQgbGV2ZWwgYmFyLCByaWdodCBkZWNpbWFsIHBlYWsgbGV2ZWwgdmFsdWUgKi9cclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgICAgIGZsZXgtd3JhcDogbm93cmFwOyAvKiB3cmFwIGNvdWxkIGNvbXBsZXRlbHkgZGVzdHJveSB0aGUgbGF5b3V0ICovXHJcbiAgICB9YCwgYHNwYW4ge1xyXG4gICAgICAgIGZsZXg6IDA7XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIH1gLGBcclxuICAgICBidXR0b24ge1xyXG4gICAgICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247XHJcbiAgICAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nSXRlbUNvbnRyb2xzIGV4dGVuZHMgUmVzcG9uc2l2ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIGNlOiBIVE1MRGl2RWxlbWVudHxudWxsPW51bGw7XHJcbiAgQElucHV0KCkgYXVkaW9TaWduYWxDb2xsYXBzZWQ6IGJvb2xlYW49dHJ1ZTtcclxuICBwcml2YXRlIF9kaXNwbGF5QXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyIHwgbnVsbHx1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgZW5hYmxlRG93bmxvYWQ6IGJvb2xlYW49ZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHBlYWtEYkx2bCA9IE1JTl9EQl9MRVZFTDtcclxuXHJcbiAgX2Rpc3BsYXlMZXZlbEluZm9zOiBMZXZlbEluZm9zIHwgbnVsbD1udWxsO1xyXG5cclxuICBfYWdjOmJvb2xlYW58bnVsbHx1bmRlZmluZWQ9dW5kZWZpbmVkO1xyXG4gIGFnY1N0cmluZz0nbi9hJztcclxuXHJcbiAgQElucHV0KCkgc2V0IGFnYyhhZ2M6Ym9vbGVhbnxudWxsfHVuZGVmaW5lZCl7XHJcbiAgICB0aGlzLl9hZ2M9YWdjO1xyXG4gICAgaWYodGhpcy5fYWdjPT09dW5kZWZpbmVkIHx8IHRoaXMuX2FnYz09PW51bGwpe1xyXG4gICAgICB0aGlzLmFnY1N0cmluZz0nbi9hJztcclxuICAgIH1lbHNle1xyXG4gICAgICBpZih0aGlzLl9hZ2M9PT10cnVlKXtcclxuICAgICAgICB0aGlzLmFnY1N0cmluZz0nT24nO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLmFnY1N0cmluZz0nT2ZmJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIG9uU2hvd1JlY29yZGluZ0RldGFpbHM6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgb25Eb3dubG9hZFJlY29yZGluZzogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBASW5wdXQoKSBkaXNhYmxlQXVkaW9EZXRhaWxzPXRydWU7XHJcbiAgQElucHV0KCkgYXVkaW9Mb2FkZWQ9ZmFsc2U7XHJcbiAgLy9ASW5wdXQoKSBjb250cm9sQXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xyXG4gIEBJbnB1dCgpIHBsYXlTdGFydEFjdGlvbjpBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIHBsYXlTdG9wQWN0aW9uOkFjdGlvbjx2b2lkPnx1bmRlZmluZWQ7XHJcbiAgcGxheVN0YXJ0RW5hYmxlZCA9IGZhbHNlO1xyXG4gIHBsYXlTdG9wRW5hYmxlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgdXBkYXRlVGltZXJJZDogbnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcclxuXHJcbiAgd2FybkRiTGV2ZWwgPSBERUZBVUxUX1dBUk5fREJfTEVWRUw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBicG86QnJlYWtwb2ludE9ic2VydmVyLHByaXZhdGUgcmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgc3VwZXIoYnBvKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc2hvd1JlY29yZGluZ0RldGFpbHMoKSB7XHJcbiAgICB0aGlzLm9uU2hvd1JlY29yZGluZ0RldGFpbHMuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgZG93bmxvYWRSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLm9uRG93bmxvYWRSZWNvcmRpbmcuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5jZSA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNwbGF5TGV2ZWxJbmZvcyhsZXZlbEluZm9zOiBMZXZlbEluZm9zIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fZGlzcGxheUxldmVsSW5mb3MgPSBsZXZlbEluZm9zO1xyXG4gIH1cclxuXHJcbiAgZXJyb3IoKSB7XHJcbiAgICAvLyB0aGlzLnN0YXR1cyA9ICdFUlJPUic7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzcHItcmVjb3JkaW5naXRlbWRpc3BsYXknLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgPGRpdiBbY2xhc3NdPVwie2F1ZGlvU3RhdHVzRGlzcGxheTohc2NyZWVuWHMsYXVkaW9TdGF0dXNEaXNwbGF5WHM6c2NyZWVuWHN9XCI+XHJcbiAgICAgICAgPGF1ZGlvLWxldmVsYmFyIHN0eWxlPVwiZmxleDoxIDAgMSVcIiBbc3RyZWFtaW5nTW9kZV09XCJzdHJlYW1pbmdNb2RlXCIgW2Rpc3BsYXlMZXZlbEluZm9zXT1cIl9kaXNwbGF5TGV2ZWxJbmZvc1wiPjwvYXVkaW8tbGV2ZWxiYXI+XHJcbiAgICAgICAgPHNwci1yZWNvcmRpbmdpdGVtY29udHJvbHMgc3R5bGU9XCJmbGV4OjAgMCAwcHhcIiBbYXVkaW9Mb2FkZWRdPVwiZGlzcGxheUF1ZGlvQnVmZmVyIT09bnVsbFwiIFtwbGF5U3RhcnRBY3Rpb25dPVwicGxheVN0YXJ0QWN0aW9uXCIgW3BsYXlTdG9wQWN0aW9uXT1cInBsYXlTdG9wQWN0aW9uXCIgW3BlYWtEYkx2bF09XCJwZWFrRGJMdmxcIiBbYWdjXT1cIl9hZ2NcIiAob25TaG93UmVjb3JkaW5nRGV0YWlscyk9XCJvblNob3dSZWNvcmRpbmdEZXRhaWxzLmVtaXQoKVwiPjwvc3ByLXJlY29yZGluZ2l0ZW1jb250cm9scz5cclxuICAgICAgPC9kaXY+XHJcbiAgICBgLFxyXG4gICAgc3R5bGVzOiBbYGRpdiB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgYmFja2dyb3VuZDogZGFya2dyYXk7XHJcbiAgICAgICAgcGFkZGluZzogNHB4O1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7IC8qIHdyYXAgY291bGQgY29tcGxldGVseSBkZXN0cm95IHRoZSBsYXlvdXQgKi9cclxuICAgIH1gLCBgYXVkaW8tbGV2ZWxiYXIge1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICB9YCxgLmF1ZGlvU3RhdHVzRGlzcGxheXtcclxuICAgIGRpc3BsYXk6ZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICBoZWlnaHQ6MTAwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiAxMDBweDtcclxuICB9YCxgLmF1ZGlvU3RhdHVzRGlzcGxheVhze1xyXG4gICAgZGlzcGxheTpmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGhlaWdodDoxMjVweDtcclxuICAgIG1pbi1oZWlnaHQ6IDEyNXB4O1xyXG4gIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0l0ZW1EaXNwbGF5IGV4dGVuZHMgUmVzcG9uc2l2ZUNvbXBvbmVudCBpbXBsZW1lbnRzIExldmVsTGlzdGVuZXIsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgY2U6IEhUTUxEaXZFbGVtZW50fG51bGw9bnVsbDtcclxuICAgIEBWaWV3Q2hpbGQoTGV2ZWxCYXIsIHsgc3RhdGljOiB0cnVlIH0pIGxpdmVMZXZlbCE6IExldmVsQmFyO1xyXG4gICAgQElucHV0KCkgc3RyZWFtaW5nTW9kZTogYm9vbGVhbj1mYWxzZTtcclxuICAgIEBJbnB1dCgpIGF1ZGlvU2lnbmFsQ29sbGFwc2VkOiBib29sZWFuPXRydWU7XHJcbiAgICBwcml2YXRlIF9kaXNwbGF5QXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyIHwgbnVsbHx1bmRlZmluZWQ7XHJcbiAgICBASW5wdXQoKSBlbmFibGVEb3dubG9hZDogYm9vbGVhbj1mYWxzZTtcclxuXHJcbiAgICBwZWFrRGJMdmwgPSBNSU5fREJfTEVWRUw7XHJcblxyXG4gICAgX2Rpc3BsYXlMZXZlbEluZm9zOiBMZXZlbEluZm9zIHwgbnVsbD1udWxsO1xyXG5cclxuICAgIF9hZ2M6Ym9vbGVhbnxudWxsfHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgICBhZ2NTdHJpbmc9J24vYSc7XHJcblxyXG4gICAgQElucHV0KCkgc2V0IGFnYyhhZ2M6Ym9vbGVhbnxudWxsfHVuZGVmaW5lZCl7XHJcbiAgICAgIHRoaXMuX2FnYz1hZ2M7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpIG9uU2hvd1JlY29yZGluZ0RldGFpbHM6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRvd25sb2FkUmVjb3JkaW5nOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLy9ASW5wdXQoKSBjb250cm9sQXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xyXG4gICAgQElucHV0KCkgcGxheVN0YXJ0QWN0aW9uOkFjdGlvbjx2b2lkPnx1bmRlZmluZWQ7XHJcbiAgICBASW5wdXQoKSBwbGF5U3RvcEFjdGlvbjpBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gICAgcGxheVN0YXJ0RW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgcGxheVN0b3BFbmFibGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHVwZGF0ZVRpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcclxuXHJcbiAgICB3YXJuRGJMZXZlbCA9IERFRkFVTFRfV0FSTl9EQl9MRVZFTDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYnBvOkJyZWFrcG9pbnRPYnNlcnZlcixwcml2YXRlIHJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgICAgICBzdXBlcihicG8pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBkaXNwbGF5QXVkaW9CdWZmZXIoZGlzcGxheUF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlciB8IG51bGx8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlBdWRpb0J1ZmZlciA9IGRpc3BsYXlBdWRpb0J1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheUF1ZGlvQnVmZmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwbGF5QXVkaW9CdWZmZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1JlY29yZGluZ0RldGFpbHMoKSB7XHJcbiAgICAgICAgdGhpcy5vblNob3dSZWNvcmRpbmdEZXRhaWxzLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBkb3dubG9hZFJlY29yZGluZygpIHtcclxuICAgICAgICB0aGlzLm9uRG93bmxvYWRSZWNvcmRpbmcuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLmNlID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAvL3RoaXMuY29udHJvbEF1ZGlvUGxheWVyLmxpc3RlbmVyPXRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBkaXNwbGF5TGV2ZWxJbmZvcyhsZXZlbEluZm9zOiBMZXZlbEluZm9zIHwgbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlMZXZlbEluZm9zID0gbGV2ZWxJbmZvcztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY2hhbm5lbENvdW50KGNoYW5uZWxDb3VudDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMubGl2ZUxldmVsLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDtcclxuICAgIH1cclxuXHJcbiAgc2V0IHBsYXlGcmFtZVBvc2l0aW9uKHBsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMubGl2ZUxldmVsLnBsYXlGcmFtZVBvc2l0aW9uPXBsYXlGcmFtZVBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgICB1cGRhdGUobGV2ZWxJbmZvOiBMZXZlbEluZm8sIHBlYWtMZXZlbEluZm86IExldmVsSW5mbykge1xyXG4gICAgICAgIGxldCBwZWFrREJWYWwgPSBsZXZlbEluZm8ucG93ZXJMZXZlbERCKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucGVha0RiTHZsIDwgcGVha0RCVmFsKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVha0RiTHZsID0gcGVha0RCVmFsO1xyXG4gICAgICAgICAgICAvLyB0aGUgZXZlbnQgY29tZXMgZnJvbSBvdXRzaWRlIGFuIEFuZ3VsYXIgem9uZVxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saXZlTGV2ZWwudXBkYXRlKGxldmVsSW5mbyk7XHJcbiAgICB9XHJcblxyXG4gICAgZXJyb3IoKSB7XHJcbiAgICAgICAgLy8gdGhpcy5zdGF0dXMgPSAnRVJST1InO1xyXG4gICAgfVxyXG5cclxuICAgIHN0cmVhbUZpbmlzaGVkKCkge1xyXG4gICAgICAgIHRoaXMubGl2ZUxldmVsLnN0cmVhbUZpbmlzaGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5wZWFrRGJMdmwgPSBNSU5fREJfTEVWRUw7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iXX0=
@@ -1,190 +0,0 @@
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
- build() {
58
- // // @ts-ignore
59
- // if(navigator.userAgentData){
60
- // // maybe we can use this in the future
61
- // console.info("Browser provides userAgentData:");
62
- //
63
- // console.info("Brands:");
64
- // // @ts-ignore
65
- // navigator.userAgentData.brands.forEach((br=>{
66
- // console.info(br.brand +" "+br.version);
67
- // }))
68
- // // @ts-ignore
69
- // console.info("Platform: "+navigator.userAgentData.platform);
70
- // // @ts-ignore
71
- // console.info("Mobile:"+navigator.userAgentData.mobile);
72
- // // @ts-ignore
73
- // //console.info(navigator.userAgentData.toJSON());
74
- // }else {
75
- // console.info("Browser does not provide userAgentData.");
76
- // }
77
- let ua = navigator.userAgent;
78
- console.debug("User agent: " + ua);
79
- this.comps = new Array();
80
- let pp = 0;
81
- while (pp < ua.length) {
82
- //parse name/version
83
- let name = null;
84
- let version = null;
85
- let comment;
86
- let blPos = ua.indexOf(' ', pp);
87
- let prt;
88
- // TODO Replace substr with substring (?)
89
- // https://stackoverflow.com/questions/52640271/why-is-string-prototype-substr-deprecated
90
- if (blPos == -1) {
91
- prt = ua.substr(pp);
92
- pp += prt.length;
93
- }
94
- else {
95
- prt = ua.substr(pp, blPos - pp);
96
- pp = blPos + 1;
97
- }
98
- let sepPos = prt.indexOf('/');
99
- if (sepPos > 0) {
100
- name = prt.substr(0, sepPos);
101
- version = prt.substr(sepPos + 1);
102
- }
103
- else {
104
- name = prt;
105
- }
106
- while (ua[pp] === ' ' && pp < ua.length) {
107
- pp++;
108
- }
109
- if (ua[pp] === '(') {
110
- pp++;
111
- let commEnd = ua.indexOf(')', pp);
112
- comment = ua.substr(pp, commEnd - pp);
113
- pp = commEnd + 1;
114
- }
115
- while (ua[pp] === ' ' && pp < ua.length) {
116
- pp++;
117
- }
118
- const uac = new UserAgentComponent(name, version, comment);
119
- console.debug("user agent comp: " + uac);
120
- this.comps.push(uac);
121
- }
122
- let detPlatf = null;
123
- if (this.runsOnOS(Platform.Android)) {
124
- detPlatf = Platform.Android;
125
- }
126
- else if (this.runsOnOS(Platform.Windows)) {
127
- detPlatf = Platform.Windows;
128
- }
129
- else if (this.runsOnOS(Platform.macOS)) {
130
- detPlatf = Platform.macOS;
131
- }
132
- let detBr = null;
133
- if (this.matchesBrowser(Browser.Firefox)) {
134
- detBr = Browser.Firefox;
135
- }
136
- else if (this.matchesBrowser(Browser.Chrome)) {
137
- detBr = Browser.Chrome;
138
- }
139
- else if (this.matchesBrowser(Browser.Safari)) {
140
- detBr = Browser.Safari;
141
- }
142
- let detBrVers = null;
143
- if (detBr) {
144
- detBrVers = this.browserVersion(detBr);
145
- }
146
- this.userAgent = new UserAgent(detPlatf, detBr, detBrVers);
147
- }
148
- matchesBrowser(browserName) {
149
- for (let ci = 0; ci < this.comps.length; ci++) {
150
- let bn = this.comps[ci].name;
151
- let bnRe = new RegExp(browserName, 'i');
152
- if (bn.match(bnRe)) {
153
- return true;
154
- }
155
- }
156
- return false;
157
- }
158
- browserVersion(browserName) {
159
- for (let ci = 0; ci < this.comps.length; ci++) {
160
- const comp = this.comps[ci];
161
- const bn = comp.name;
162
- const bnRe = new RegExp(browserName, 'i');
163
- if (bn.match(bnRe)) {
164
- return comp.version;
165
- }
166
- }
167
- return null;
168
- }
169
- runsOnOS(os) {
170
- for (let ci = 0; ci < this.comps.length; ci++) {
171
- let cc = this.comps[ci].comment;
172
- if (cc) {
173
- var osRe = new RegExp(os, 'i');
174
- if (cc.match(osRe)) {
175
- return true;
176
- }
177
- }
178
- }
179
- return false;
180
- }
181
- static userAgent() {
182
- if (!this.instance) {
183
- this.instance = new UserAgentBuilder();
184
- }
185
- this.instance.build();
186
- return this.instance.userAgent;
187
- }
188
- }
189
- UserAgentBuilder.instance = undefined;
190
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWEtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3V0aWxzL3VhLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQW1CLElBQVcsRUFBUSxPQUFtQixFQUFRLE9BQWU7UUFBN0QsU0FBSSxHQUFKLElBQUksQ0FBTztRQUFRLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUSxZQUFPLEdBQVAsT0FBTyxDQUFRO0lBRWhGLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLEdBQUMsR0FBRyxHQUFDLElBQUksQ0FBQyxJQUFJLEdBQUMsR0FBRyxDQUFDO1FBQ3hCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztZQUNkLENBQUMsR0FBQyxDQUFDLEdBQUMsSUFBSSxHQUFDLElBQUksQ0FBQyxPQUFPLEdBQUMsR0FBRyxDQUFDO1NBQzNCO1FBQ0QsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO1lBQ2QsQ0FBQyxHQUFDLENBQUMsR0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLE9BQU8sR0FBQyxHQUFHLENBQUM7U0FDM0I7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDRjtBQUNELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBQyxTQUFTLENBQUM7QUFDcEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFDLFFBQVEsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUMsUUFBUSxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBQyxNQUFNLENBQUM7QUFJOUIsTUFBTSxDQUFOLElBQVksT0FBdUU7QUFBbkYsV0FBWSxPQUFPO0lBQUUsOEJBQWlCLENBQUE7SUFBQyw0QkFBZSxDQUFBO0lBQUMsNEJBQWUsQ0FBQTtJQUFDLHdCQUFXLENBQUE7QUFBQSxDQUFDLEVBQXZFLE9B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QUksZ0JBQWdCLEVBQUUsQ0FBQztTQUN0QztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUVuQyxDQUFDOztBQTdJTSx5QkFBUSxHQUE0QixTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgVXNlckFnZW50Q29tcG9uZW50e1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOnN0cmluZyxwdWJsaWMgdmVyc2lvbjpzdHJpbmd8bnVsbCxwdWJsaWMgY29tbWVudD86c3RyaW5nKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTpzdHJpbmd7XHJcbiAgICBsZXQgcz0nWycrdGhpcy5uYW1lKyddJztcclxuICAgIGlmKHRoaXMudmVyc2lvbil7XHJcbiAgICAgIHM9cysnIFsnK3RoaXMudmVyc2lvbisnXSc7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmNvbW1lbnQpe1xyXG4gICAgICBzPXMrJyBbJyt0aGlzLmNvbW1lbnQrJ10nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHM7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjb25zdCBOQU1FX0ZJUkVGT1g9J0ZpcmVmb3gnO1xyXG5leHBvcnQgY29uc3QgTkFNRV9DSFJPTUU9J0Nocm9tZSc7XHJcbmV4cG9ydCBjb25zdCBOQU1FX1NBRkFSST0nU2FmYXJpJztcclxuZXhwb3J0IGNvbnN0IE5BTUVfRURHRT0nRWRnZSc7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBlbnVtIEJyb3dzZXIge0ZpcmVmb3g9J0ZpcmVmb3gnLENocm9tZT0nQ2hyb21lJyxTYWZhcmk9J1NhZmFyaScsRWRnZT0nRWRnZSd9XHJcblxyXG5leHBvcnQgY29uc3QgT1NfV0lORE9XUz0nV2luZG93cyc7XHJcbmV4cG9ydCBjb25zdCBPU19BTkRST0lEPSdBbmRyb2lkJztcclxuXHJcbmV4cG9ydCBlbnVtIFBsYXRmb3JtIHtXaW5kb3dzPSdXaW5kb3dzJyxBbmRyb2lkPSdBbmRyb2lkJyxtYWNPUz0nTUFDIE9TIFgnfVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJBZ2VudHtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RldGVjdGVkUGxhdGZvcm06UGxhdGZvcm18bnVsbCxwcml2YXRlIF9kZXRlY3RlZEJyb3dzZXI6QnJvd3NlcnxudWxsLHByaXZhdGUgX2RldGVjdGVkQnJvd3NlclZlcnNpb246c3RyaW5nfG51bGw9bnVsbCkge1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRldGVjdGVkQnJvd3NlcigpOiBCcm93c2VyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGV0ZWN0ZWRCcm93c2VyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRldGVjdGVkQnJvd3NlclZlcnNpb24oKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGV0ZWN0ZWRCcm93c2VyVmVyc2lvbjtcclxuICB9XHJcblxyXG4gIGdldCBkZXRlY3RlZFBsYXRmb3JtKCk6IFBsYXRmb3JtIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGV0ZWN0ZWRQbGF0Zm9ybTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlckFnZW50QnVpbGRlciB7XHJcbiAgc3RhdGljIGluc3RhbmNlOlVzZXJBZ2VudEJ1aWxkZXJ8dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNvbXBzOkFycmF5PFVzZXJBZ2VudENvbXBvbmVudD49bmV3IEFycmF5PFVzZXJBZ2VudENvbXBvbmVudD4oKTtcclxuICBwcml2YXRlIHVzZXJBZ2VudCE6VXNlckFnZW50O1xyXG5cclxuICBwcml2YXRlIGJ1aWxkKCkge1xyXG5cclxuICAgIC8vIC8vIEB0cy1pZ25vcmVcclxuICAgIC8vIGlmKG5hdmlnYXRvci51c2VyQWdlbnREYXRhKXtcclxuICAgIC8vICAgLy8gbWF5YmUgd2UgY2FuIHVzZSB0aGlzIGluICB0aGUgZnV0dXJlXHJcbiAgICAvLyAgIGNvbnNvbGUuaW5mbyhcIkJyb3dzZXIgcHJvdmlkZXMgdXNlckFnZW50RGF0YTpcIik7XHJcbiAgICAvL1xyXG4gICAgLy8gICBjb25zb2xlLmluZm8oXCJCcmFuZHM6XCIpO1xyXG4gICAgLy8gICAvLyBAdHMtaWdub3JlXHJcbiAgICAvLyAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLmJyYW5kcy5mb3JFYWNoKChicj0+e1xyXG4gICAgLy8gICAgIGNvbnNvbGUuaW5mbyhici5icmFuZCArXCIgXCIrYnIudmVyc2lvbik7XHJcbiAgICAvLyAgIH0pKVxyXG4gICAgLy8gICAvLyBAdHMtaWdub3JlXHJcbiAgICAvLyAgIGNvbnNvbGUuaW5mbyhcIlBsYXRmb3JtOiBcIituYXZpZ2F0b3IudXNlckFnZW50RGF0YS5wbGF0Zm9ybSk7XHJcbiAgICAvLyAgIC8vIEB0cy1pZ25vcmVcclxuICAgIC8vICAgY29uc29sZS5pbmZvKFwiTW9iaWxlOlwiK25hdmlnYXRvci51c2VyQWdlbnREYXRhLm1vYmlsZSk7XHJcbiAgICAvLyAgIC8vIEB0cy1pZ25vcmVcclxuICAgIC8vICAgLy9jb25zb2xlLmluZm8obmF2aWdhdG9yLnVzZXJBZ2VudERhdGEudG9KU09OKCkpO1xyXG4gICAgLy8gfWVsc2Uge1xyXG4gICAgLy8gICBjb25zb2xlLmluZm8oXCJCcm93c2VyIGRvZXMgbm90IHByb3ZpZGUgdXNlckFnZW50RGF0YS5cIik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgbGV0IHVhPW5hdmlnYXRvci51c2VyQWdlbnQ7XHJcbiAgICBjb25zb2xlLmRlYnVnKFwiVXNlciBhZ2VudDogXCIrdWEpO1xyXG4gICAgdGhpcy5jb21wcyA9IG5ldyBBcnJheTxVc2VyQWdlbnRDb21wb25lbnQ+KCk7XHJcblxyXG4gICAgbGV0IHBwID0gMDtcclxuICAgIHdoaWxlIChwcCA8IHVhLmxlbmd0aCkge1xyXG4gICAgICAvL3BhcnNlIG5hbWUvdmVyc2lvblxyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcclxuICAgICAgbGV0IHZlcnNpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICBsZXQgY29tbWVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgbGV0IGJsUG9zID0gdWEuaW5kZXhPZignICcsIHBwKTtcclxuICAgICAgbGV0IHBydDogc3RyaW5nO1xyXG4gICAgICAvLyBUT0RPIFJlcGxhY2Ugc3Vic3RyIHdpdGggc3Vic3RyaW5nICg/KVxyXG4gICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81MjY0MDI3MS93aHktaXMtc3RyaW5nLXByb3RvdHlwZS1zdWJzdHItZGVwcmVjYXRlZFxyXG4gICAgICBpZiAoYmxQb3MgPT0gLTEpIHtcclxuICAgICAgICBwcnQgPSB1YS5zdWJzdHIocHApO1xyXG4gICAgICAgIHBwICs9IHBydC5sZW5ndGg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJ0ID0gdWEuc3Vic3RyKHBwLCBibFBvcyAtIHBwKTtcclxuICAgICAgICBwcCA9IGJsUG9zICsgMTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2VwUG9zID0gcHJ0LmluZGV4T2YoJy8nKTtcclxuICAgICAgaWYgKHNlcFBvcyA+IDApIHtcclxuICAgICAgICBuYW1lID0gcHJ0LnN1YnN0cigwLCBzZXBQb3MpO1xyXG4gICAgICAgIHZlcnNpb24gPSBwcnQuc3Vic3RyKHNlcFBvcyArIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5hbWUgPSBwcnQ7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKHVhW3BwXSA9PT0gJyAnICYmIHBwIDwgdWEubGVuZ3RoKSB7XHJcbiAgICAgICAgcHArKztcclxuICAgICAgfVxyXG4gICAgICBpZiAodWFbcHBdID09PSAnKCcpIHtcclxuICAgICAgICBwcCsrO1xyXG4gICAgICAgIGxldCBjb21tRW5kID0gdWEuaW5kZXhPZignKScsIHBwKTtcclxuICAgICAgICBjb21tZW50ID0gdWEuc3Vic3RyKHBwLCBjb21tRW5kIC0gcHApO1xyXG4gICAgICAgIHBwID0gY29tbUVuZCArIDE7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKHVhW3BwXSA9PT0gJyAnICYmIHBwIDwgdWEubGVuZ3RoKSB7XHJcbiAgICAgICAgcHArKztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB1YWM9bmV3IFVzZXJBZ2VudENvbXBvbmVudChuYW1lLCB2ZXJzaW9uLCBjb21tZW50KTtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInVzZXIgYWdlbnQgY29tcDogXCIrdWFjKTtcclxuICAgICAgdGhpcy5jb21wcy5wdXNoKHVhYyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRldFBsYXRmOlBsYXRmb3JtfG51bGw9bnVsbDtcclxuICAgIGlmKHRoaXMucnVuc09uT1MoUGxhdGZvcm0uQW5kcm9pZCkpe1xyXG4gICAgICBkZXRQbGF0Zj1QbGF0Zm9ybS5BbmRyb2lkO1xyXG4gICAgfWVsc2UgaWYodGhpcy5ydW5zT25PUyhQbGF0Zm9ybS5XaW5kb3dzKSl7XHJcbiAgICAgIGRldFBsYXRmPVBsYXRmb3JtLldpbmRvd3M7XHJcbiAgICB9ZWxzZSBpZih0aGlzLnJ1bnNPbk9TKFBsYXRmb3JtLm1hY09TKSl7XHJcbiAgICAgIGRldFBsYXRmPVBsYXRmb3JtLm1hY09TO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgbGV0IGRldEJyOkJyb3dzZXJ8bnVsbD1udWxsO1xyXG4gICAgaWYodGhpcy5tYXRjaGVzQnJvd3NlcihCcm93c2VyLkZpcmVmb3gpKXtcclxuICAgICAgZGV0QnI9QnJvd3Nlci5GaXJlZm94O1xyXG4gICAgfWVsc2UgaWYodGhpcy5tYXRjaGVzQnJvd3NlcihCcm93c2VyLkNocm9tZSkpe1xyXG4gICAgICBkZXRCcj1Ccm93c2VyLkNocm9tZTtcclxuICAgIH1lbHNlIGlmKHRoaXMubWF0Y2hlc0Jyb3dzZXIoQnJvd3Nlci5TYWZhcmkpKXtcclxuICAgICAgZGV0QnI9QnJvd3Nlci5TYWZhcmk7XHJcbiAgICB9XHJcbiAgICBsZXQgZGV0QnJWZXJzID1udWxsO1xyXG4gICAgaWYoZGV0QnIpIHtcclxuICAgICBkZXRCclZlcnM9dGhpcy5icm93c2VyVmVyc2lvbihkZXRCcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJBZ2VudD1uZXcgVXNlckFnZW50KGRldFBsYXRmLGRldEJyLGRldEJyVmVycyk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXRjaGVzQnJvd3Nlcihicm93c2VyTmFtZTpzdHJpbmcpe1xyXG4gICAgZm9yKGxldCBjaT0wO2NpPHRoaXMuY29tcHMubGVuZ3RoO2NpKyspe1xyXG4gICAgICBsZXQgYm49dGhpcy5jb21wc1tjaV0ubmFtZVxyXG4gICAgICBsZXQgYm5SZT1uZXcgUmVnRXhwKGJyb3dzZXJOYW1lLCdpJyk7XHJcbiAgICAgIGlmKGJuLm1hdGNoKGJuUmUpKXtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBicm93c2VyVmVyc2lvbihicm93c2VyTmFtZTpzdHJpbmcpOnN0cmluZ3xudWxse1xyXG4gICAgZm9yKGxldCBjaT0wO2NpPHRoaXMuY29tcHMubGVuZ3RoO2NpKyspe1xyXG4gICAgICBjb25zdCBjb21wPXRoaXMuY29tcHNbY2ldO1xyXG4gICAgICBjb25zdCBibj1jb21wLm5hbWU7XHJcbiAgICAgIGNvbnN0IGJuUmU9bmV3IFJlZ0V4cChicm93c2VyTmFtZSwnaScpO1xyXG4gICAgICBpZihibi5tYXRjaChiblJlKSl7XHJcbiAgICAgICAgcmV0dXJuIGNvbXAudmVyc2lvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJ1bnNPbk9TKG9zOnN0cmluZyk6Ym9vbGVhbntcclxuICAgIGZvcihsZXQgY2k9MDtjaTx0aGlzLmNvbXBzLmxlbmd0aDtjaSsrKXtcclxuICAgICAgbGV0IGNjPXRoaXMuY29tcHNbY2ldLmNvbW1lbnRcclxuICAgICAgaWYoY2Mpe1xyXG4gICAgICAgIHZhciBvc1JlID0gbmV3IFJlZ0V4cChvcywnaScpO1xyXG4gICAgICAgIGlmKGNjLm1hdGNoKG9zUmUpKXtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHVzZXJBZ2VudCgpOlVzZXJBZ2VudHtcclxuICAgICAgaWYoIXRoaXMuaW5zdGFuY2Upe1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2U9bmV3IFVzZXJBZ2VudEJ1aWxkZXIoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmluc3RhbmNlLmJ1aWxkKCk7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnVzZXJBZ2VudDtcclxuXHJcbiAgfVxyXG5cclxufVxyXG4iXX0=