speechrecorderng 3.0.1 → 3.3.1

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 (141) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +19 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +724 -54
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +10 -10
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12675 -9136
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +11580 -8050
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +7 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  120. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  125. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  126. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  127. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  128. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  129. package/lib/speechrecorderng.component.d.ts +2 -1
  130. package/lib/spr.module.version.d.ts +1 -1
  131. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  132. package/lib/ui/message_dialog.d.ts +1 -1
  133. package/lib/ui/recordingitem_display.d.ts +3 -2
  134. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  135. package/lib/utils/ua-parser.d.ts +4 -1
  136. package/lib/utils/utils.d.ts +6 -0
  137. package/package.json +15 -15
  138. package/esm2020/lib/math/utils.mjs +0 -14
  139. package/esm2020/lib/utils/css_utils.mjs +0 -7
  140. package/lib/math/utils.d.ts +0 -3
  141. package/lib/utils/css_utils.d.ts +0 -3
@@ -0,0 +1,134 @@
1
+ import { WavFileFormat } from './wavformat';
2
+ import { PCMAudioFormat } from '../format';
3
+ import { BinaryByteReader } from '../../io/BinaryReader';
4
+ export class WavReader {
5
+ constructor(data) {
6
+ this.format = null;
7
+ this.totalLength = 0;
8
+ this.dataChunkLength = null;
9
+ this.br = new BinaryByteReader(data);
10
+ }
11
+ readHeader() {
12
+ const rh = this.br.readAscii(4);
13
+ if (rh !== WavFileFormat.RIFF_KEY) {
14
+ const errMsg = "Expected RIFF header, not: " + rh;
15
+ throw new Error(errMsg);
16
+ }
17
+ const cl = this.br.readUint32LE();
18
+ if (this.br.pos + cl !== this.br.length()) {
19
+ throw new Error("Wrong chunksize in RIFF header: " + cl + " (expected: " + (this.br.length() - this.br.pos) + " )");
20
+ }
21
+ this.totalLength = cl;
22
+ const rt = this.br.readAscii(4);
23
+ if (rt !== WavFileFormat.WAV_KEY) {
24
+ const errMsg = "Expected " + WavFileFormat.WAV_KEY + " not: " + rt;
25
+ throw new Error(errMsg);
26
+ }
27
+ }
28
+ readFormat() {
29
+ this.br.pos = 0;
30
+ this.readHeader();
31
+ const s = this.navigateToChunk('fmt ');
32
+ if (!s) {
33
+ let errMsg = "WAV file does not contain a fmt chunk";
34
+ throw new Error(errMsg);
35
+ }
36
+ this.format = this.parseFmtChunk();
37
+ return this.format;
38
+ }
39
+ _frameLength() {
40
+ let fl = null;
41
+ if (this.format && this.dataChunkLength != null) {
42
+ fl = this.dataChunkLength / this.format.channelCount / this.format.sampleSize;
43
+ }
44
+ return fl;
45
+ }
46
+ frameLength() {
47
+ let fl = this._frameLength();
48
+ if (fl === null) {
49
+ this.readFormat();
50
+ this.dataChunkLength = this.navigateToChunk('data');
51
+ fl = this._frameLength();
52
+ }
53
+ return fl;
54
+ }
55
+ // Not tested yet!!!
56
+ read() {
57
+ this.br.pos = 0;
58
+ let ab = null;
59
+ this.readHeader();
60
+ let s = this.navigateToChunk('fmt ');
61
+ if (!s) {
62
+ let errMsg = "WAV file does not contain a fmt chunk";
63
+ throw new Error(errMsg);
64
+ }
65
+ this.format = this.parseFmtChunk();
66
+ this.dataChunkLength = this.navigateToChunk('data');
67
+ let chsArr = this.readData();
68
+ let sr = this.format?.sampleRate;
69
+ let nChs = this.format?.channelCount;
70
+ if (sr && chsArr && nChs && nChs > 0 && nChs == chsArr?.length) {
71
+ ab = new AudioBuffer({
72
+ length: chsArr[0].length,
73
+ numberOfChannels: this.format?.channelCount,
74
+ sampleRate: sr
75
+ });
76
+ for (let ch = 0; ch < nChs; ch++) {
77
+ ab.copyToChannel(chsArr[ch], ch);
78
+ }
79
+ }
80
+ return ab;
81
+ }
82
+ navigateToChunk(chunkString) {
83
+ // position after RIFF header
84
+ // TODO assumes no other chunks except 'data'
85
+ this.br.pos = 12;
86
+ let chkStr = null;
87
+ let chkLen = -1;
88
+ while (!this.br.eof()) {
89
+ chkStr = this.br.readAscii(4);
90
+ chkLen = this.br.readUint32LE();
91
+ if (chunkString === chkStr) {
92
+ return chkLen;
93
+ }
94
+ this.br.pos += chkLen;
95
+ }
96
+ return chkLen;
97
+ }
98
+ parseFmtChunk() {
99
+ let pcmAf = null;
100
+ const fmt = this.br.readUint16LE();
101
+ if (fmt === WavFileFormat.PCM) {
102
+ const channels = this.br.readUint16LE();
103
+ const sampleRate = this.br.readUint32LE();
104
+ // skip bandwidth
105
+ this.br.skip(4);
106
+ // frame size
107
+ const frameSize = this.br.readUint16LE();
108
+ // sample size in bits (PCM format only)
109
+ const sampleSizeInBits = this.br.readUint16LE();
110
+ pcmAf = new PCMAudioFormat(sampleRate, channels, frameSize / channels, sampleSizeInBits);
111
+ }
112
+ return pcmAf;
113
+ }
114
+ readData() {
115
+ let chsArr = null;
116
+ if (this.format) {
117
+ chsArr = new Array(this.format.channelCount);
118
+ const sampleCount = this.totalLength / this.format.channelCount / this.format.sampleSize;
119
+ for (let ch = 0; ch < this.format.channelCount; ch++) {
120
+ chsArr[ch] = new Float32Array(sampleCount);
121
+ }
122
+ if (this.format.sampleSize == 2) {
123
+ for (let i = 0; i < this.totalLength / 2; i++) {
124
+ for (let ch = 0; ch < this.format.channelCount; ch++) {
125
+ const s16Ampl = this.br.readInt16LE();
126
+ chsArr[ch][i] = s16Ampl / 32768;
127
+ }
128
+ }
129
+ }
130
+ }
131
+ return chsArr;
132
+ }
133
+ }
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F2cmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2ltcGwvd2F2cmVhZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVwRCxNQUFNLE9BQU8sU0FBUztJQU9sQixZQUFZLElBQWdCO1FBSnBCLFdBQU0sR0FBdUIsSUFBSSxDQUFDO1FBQ2xDLGdCQUFXLEdBQVEsQ0FBQyxDQUFDO1FBQ3JCLG9CQUFlLEdBQWEsSUFBSSxDQUFDO1FBR3JDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sVUFBVTtRQUNkLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksRUFBRSxLQUFLLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxNQUFNLEdBQUMsNkJBQTZCLEdBQUUsRUFBRSxDQUFDO1lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0I7UUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBQyxFQUFFLEdBQUMsY0FBYyxHQUFDLENBQUMsSUFBSSxDQUFDLEVB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LElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRTtnQkFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM3QyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7d0JBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3RDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDO3FCQUNqQztpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXYXZGaWxlRm9ybWF0IH0gZnJvbSAnLi93YXZmb3JtYXQnXHJcbmltcG9ydCB7IFBDTUF1ZGlvRm9ybWF0IH0gZnJvbSAnLi4vZm9ybWF0J1xyXG5pbXBvcnQgeyBCaW5hcnlCeXRlUmVhZGVyIH0gZnJvbSAnLi4vLi4vaW8vQmluYXJ5UmVhZGVyJ1xyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBXYXZSZWFkZXIge1xyXG5cclxuICAgICAgICBwcml2YXRlIGJyOkJpbmFyeUJ5dGVSZWFkZXI7XHJcbiAgICAgICAgcHJpdmF0ZSBmb3JtYXQ6UENNQXVkaW9Gb3JtYXQgfCBudWxsPW51bGw7XHJcbiAgICAgICAgcHJpdmF0ZSB0b3RhbExlbmd0aDpudW1iZXI9MDtcclxuICAgICAgICBwcml2YXRlIGRhdGFDaHVua0xlbmd0aDpudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3RvcihkYXRhOkFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnIgPSBuZXcgQmluYXJ5Qnl0ZVJlYWRlcihkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgcmVhZEhlYWRlcigpe1xyXG4gICAgICAgICAgICBjb25zdCByaCA9IHRoaXMuYnIucmVhZEFzY2lpKDQpO1xyXG4gICAgICAgICAgICBpZiAocmggIT09IFdhdkZpbGVGb3JtYXQuUklGRl9LRVkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZz1cIkV4cGVjdGVkIFJJRkYgaGVhZGVyLCBub3Q6IFwiKyByaDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGNsID0gdGhpcy5ici5yZWFkVWludDMyTEUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYnIucG9zICsgY2wgIT09IHRoaXMuYnIubGVuZ3RoKCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGNodW5rc2l6ZSBpbiBSSUZGIGhlYWRlcjogXCIrY2wrXCIgKGV4cGVjdGVkOiBcIisodGhpcy5ici5sZW5ndGgoKSAtIHRoaXMuYnIucG9zKSsgXCIgKVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRvdGFsTGVuZ3RoID0gY2w7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBydCA9IHRoaXMuYnIucmVhZEFzY2lpKDQpO1xyXG4gICAgICAgICAgICBpZiAocnQgIT09IFdhdkZpbGVGb3JtYXQuV0FWX0tFWSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnPVwiRXhwZWN0ZWQgXCIrV2F2RmlsZUZvcm1hdC5XQVZfS0VZK1wiIG5vdDogXCIrIHJ0O1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlYWRGb3JtYXQoKTpQQ01BdWRpb0Zvcm1hdHxudWxse1xyXG4gICAgICAgICAgICB0aGlzLmJyLnBvcz0wO1xyXG4gICAgICAgICAgICB0aGlzLnJlYWRIZWFkZXIoKTtcclxuICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLm5hdmlnYXRlVG9DaHVuaygnZm10ICcpO1xyXG4gICAgICAgICAgaWYgKCFzKSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJNc2c9XCJXQVYgZmlsZSBkb2VzIG5vdCBjb250YWluIGEgZm10IGNodW5rXCI7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmZvcm1hdCA9IHRoaXMucGFyc2VGbXRDaHVuaygpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIF9mcmFtZUxlbmd0aCgpOm51bWJlcnxudWxse1xyXG4gICAgICAgICAgbGV0IGZsOm51bWJlcnxudWxsPW51bGw7XHJcbiAgICAgICAgICBpZih0aGlzLmZvcm1hdCAmJiB0aGlzLmRhdGFDaHVua0xlbmd0aCE9bnVsbCkge1xyXG4gICAgICAgICAgICBmbCA9IHRoaXMuZGF0YUNodW5rTGVuZ3RoIC8gdGhpcy5mb3JtYXQuY2hhbm5lbENvdW50IC8gdGhpcy5mb3JtYXQuc2FtcGxlU2l6ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZyYW1lTGVuZ3RoKCk6bnVtYmVyfG51bGwge1xyXG4gICAgICAgICAgbGV0IGZsOm51bWJlcnxudWxsPXRoaXMuX2ZyYW1lTGVuZ3RoKCk7XHJcbiAgICAgICAgICBpZihmbD09PW51bGwpe1xyXG4gICAgICAgICAgICB0aGlzLnJlYWRGb3JtYXQoKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhQ2h1bmtMZW5ndGg9dGhpcy5uYXZpZ2F0ZVRvQ2h1bmsoJ2RhdGEnKTtcclxuICAgICAgICAgICAgZmw9dGhpcy5fZnJhbWVMZW5ndGgoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5vdCB0ZXN0ZWQgeWV0ISEhXHJcbiAgICAgICAgcmVhZCgpOkF1ZGlvQnVmZmVyIHwgbnVsbHtcclxuICAgICAgICAgICAgdGhpcy5ici5wb3M9MDtcclxuICAgICAgICAgICAgbGV0IGFiOkF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgdGhpcy5yZWFkSGVhZGVyKCk7XHJcbiAgICAgICAgICAgIGxldCBzID0gdGhpcy5uYXZpZ2F0ZVRvQ2h1bmsoJ2ZtdCAnKTtcclxuICAgICAgICAgICAgaWYgKCFzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyTXNnPVwiV0FWIGZpbGUgZG9lcyBub3QgY29udGFpbiBhIGZtdCBjaHVua1wiO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5mb3JtYXQgPSB0aGlzLnBhcnNlRm10Q2h1bmsoKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhQ2h1bmtMZW5ndGggPSB0aGlzLm5hdmlnYXRlVG9DaHVuaygnZGF0YScpO1xyXG4gICAgICAgICAgICBsZXQgY2hzQXJyID0gdGhpcy5yZWFkRGF0YSgpO1xyXG4gICAgICAgICAgICBsZXQgc3I9dGhpcy5mb3JtYXQ/LnNhbXBsZVJhdGU7XHJcbiAgICAgICAgICAgIGxldCBuQ2hzPXRoaXMuZm9ybWF0Py5jaGFubmVsQ291bnQ7XHJcbiAgICAgICAgICAgIGlmKHNyICYmIGNoc0FyciAmJiBuQ2hzICYmIG5DaHM+MCAmJiBuQ2hzPT1jaHNBcnI/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgYWIgPSBuZXcgQXVkaW9CdWZmZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aDogY2hzQXJyWzBdLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkNoYW5uZWxzOiB0aGlzLmZvcm1hdD8uY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU6IHNyXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2g9MDtjaDxuQ2hzO2NoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBhYi5jb3B5VG9DaGFubmVsKGNoc0FycltjaF0sIGNoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRlVG9DaHVuayhjaHVua1N0cmluZzpzdHJpbmcpOm51bWJlciB7XHJcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFmdGVyIFJJRkYgaGVhZGVyXHJcbiAgICAgICAgICAvLyBUT0RPIGFzc3VtZXMgbm8gb3RoZXIgY2h1bmtzIGV4Y2VwdCAnZGF0YSdcclxuICAgICAgICAgICAgdGhpcy5ici5wb3MgPSAxMjtcclxuICAgICAgICAgICAgbGV0IGNoa1N0ciA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBjaGtMZW4gPSAtMTtcclxuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLmJyLmVvZigpKSB7XHJcbiAgICAgICAgICAgICAgICBjaGtTdHIgPSB0aGlzLmJyLnJlYWRBc2NpaSg0KTtcclxuICAgICAgICAgICAgICAgIGNoa0xlbiA9IHRoaXMuYnIucmVhZFVpbnQzMkxFKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2h1bmtTdHJpbmcgPT09IGNoa1N0cikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGtMZW47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyLnBvcyArPSBjaGtMZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNoa0xlbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgcGFyc2VGbXRDaHVuaygpOlBDTUF1ZGlvRm9ybWF0IHwgbnVsbCB7XHJcbiAgICAgICAgICAgIGxldCBwY21BZjpQQ01BdWRpb0Zvcm1hdHxudWxsPW51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGZtdCA9IHRoaXMuYnIucmVhZFVpbnQxNkxFKCk7XHJcbiAgICAgICAgICAgIGlmIChmbXQgPT09IFdhdkZpbGVGb3JtYXQuUENNKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVscyA9IHRoaXMuYnIucmVhZFVpbnQxNkxFKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzYW1wbGVSYXRlID0gdGhpcy5ici5yZWFkVWludDMyTEUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBza2lwIGJhbmR3aWR0aFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ici5za2lwKDQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGZyYW1lIHNpemVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lU2l6ZSA9IHRoaXMuYnIucmVhZFVpbnQxNkxFKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc2FtcGxlIHNpemUgaW4gYml0cyAoUENNIGZvcm1hdCBvbmx5KVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2FtcGxlU2l6ZUluQml0cyA9IHRoaXMuYnIucmVhZFVpbnQxNkxFKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcGNtQWY9bmV3IFBDTUF1ZGlvRm9ybWF0KHNhbXBsZVJhdGUsIGNoYW5uZWxzLCBmcmFtZVNpemUgLyBjaGFubmVscywgc2FtcGxlU2l6ZUluQml0cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBjbUFmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkRGF0YSgpOkFycmF5PEZsb2F0MzJBcnJheT4gfCBudWxse1xyXG4gICAgICAgICAgICBsZXQgY2hzQXJyPW51bGw7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuZm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgY2hzQXJyID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4odGhpcy5mb3JtYXQuY2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgICBjb25zdCBzYW1wbGVDb3VudCA9IHRoaXMudG90YWxMZW5ndGggLyB0aGlzLmZvcm1hdC5jaGFubmVsQ291bnQgLyB0aGlzLmZvcm1hdC5zYW1wbGVTaXplO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmZvcm1hdC5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgIGNoc0FycltjaF0gPSBuZXcgRmxvYXQzMkFycmF5KHNhbXBsZUNvdW50KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0LnNhbXBsZVNpemUgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvdGFsTGVuZ3RoIC8gMjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmZvcm1hdC5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzMTZBbXBsID0gdGhpcy5ici5yZWFkSW50MTZMRSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoc0FycltjaF1baV0gPSBzMTZBbXBsIC8gMzI3Njg7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNoc0FycjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4iXX0=
@@ -3,8 +3,6 @@ import { BinaryByteWriter } from '../../io/BinaryWriter';
3
3
  import { WorkerHelper } from "../../utils/utils";
4
4
  export class WavWriter {
5
5
  constructor() {
6
- this.format = null;
7
- this.dataLength = null;
8
6
  this.workerURL = null;
9
7
  this.bw = new BinaryByteWriter();
10
8
  }
@@ -13,8 +11,7 @@ export class WavWriter {
13
11
  */
14
12
  workerFunction() {
15
13
  self.onmessage = function (msg) {
16
- let bufLen = msg.data.frameLength * msg.data.chs;
17
- let valView = new DataView(msg.data.buf, msg.data.bufPos);
14
+ const valView = new DataView(msg.data.buf, msg.data.bufPos);
18
15
  let bufPos = 0;
19
16
  let hDynIntRange = 1 << (msg.data.sampleSizeInBits - 1);
20
17
  for (let s = 0; s < msg.data.frameLength; s++) {
@@ -88,9 +85,14 @@ export class WavWriter {
88
85
  }
89
86
  writeHeader(audioBuffer) {
90
87
  this.bw.writeAscii(WavFileFormat.RIFF_KEY);
91
- let dataChkByteLen = audioBuffer.getChannelData(0).length * WavWriter.DEFAULT_SAMPLE_SIZE_BYTES * audioBuffer.numberOfChannels;
92
- let wavChunkByteLen = (4 + 4) * 3 + 16 + dataChkByteLen;
93
- let wavFileDataByteLen = wavChunkByteLen + 8;
88
+ let dataChkByteLen = 0;
89
+ //const dataChkByteLen=audioBuffer.getChannelData(0).length*WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*audioBuffer.numberOfChannels;
90
+ const abChs = audioBuffer.numberOfChannels;
91
+ if (abChs > 0) {
92
+ const abCh0 = audioBuffer.getChannelData(0);
93
+ dataChkByteLen = abCh0.length * WavWriter.DEFAULT_SAMPLE_SIZE_BYTES * abChs;
94
+ }
95
+ const wavChunkByteLen = (4 + 4) * 3 + 16 + dataChkByteLen;
94
96
  this.bw.writeUint32(wavChunkByteLen, true); // must be set to file length-8 later
95
97
  this.bw.writeAscii(WavFileFormat.WAV_KEY);
96
98
  this.writeChunkHeader('fmt ', 16);
@@ -99,6 +101,5 @@ export class WavWriter {
99
101
  return dataChkByteLen;
100
102
  }
101
103
  }
102
- WavWriter.PCM = 1;
103
104
  WavWriter.DEFAULT_SAMPLE_SIZE_BYTES = 2;
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F2d3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2ltcGwvd2F2d3JpdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBSTVDLE1BQU0sT0FBTyxTQUFTO0lBU3BCO1FBSlEsV0FBTSxHQUFxQixJQUFJLENBQUM7UUFDaEMsZUFBVSxHQUFhLElBQUksQ0FBQztRQUM1QixjQUFTLEdBQWMsSUFBSSxDQUFDO1FBR2xDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBZ0I7WUFFekMsSUFBSSxNQUFNLEdBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDL0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV6RCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtn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QUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBQyxjQUFjLENBQUMsQ0FBQztRQUM3QyxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDOztBQXhISyxhQUFHLEdBQVUsQ0FBQyxDQUFDO0FBQ2YsbUNBQXlCLEdBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2F2RmlsZUZvcm1hdCB9IGZyb20gJy4vd2F2Zm9ybWF0J1xyXG5pbXBvcnQgeyBQQ01BdWRpb0Zvcm1hdCB9IGZyb20gJy4uL2Zvcm1hdCdcclxuaW1wb3J0IHsgQmluYXJ5Qnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL2lvL0JpbmFyeVdyaXRlcidcclxuaW1wb3J0IHtXb3JrZXJIZWxwZXJ9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xyXG5kZWNsYXJlIGZ1bmN0aW9uIHBvc3RNZXNzYWdlIChtZXNzYWdlOmFueSwgdHJhbnNmZXI6QXJyYXk8YW55Pik6dm9pZDtcclxuXHJcblxyXG4gICBleHBvcnQgY2xhc3MgV2F2V3JpdGVyIHtcclxuXHJcbiAgICAgc3RhdGljIFBDTTpudW1iZXIgPSAxO1xyXG4gICAgIHN0YXRpYyBERUZBVUxUX1NBTVBMRV9TSVpFX0JZVEVTOm51bWJlciA9IDI7XHJcbiAgICAgcHJpdmF0ZSBidzpCaW5hcnlCeXRlV3JpdGVyO1xyXG4gICAgIHByaXZhdGUgZm9ybWF0OlBDTUF1ZGlvRm9ybWF0fG51bGw9bnVsbDtcclxuICAgICBwcml2YXRlIGRhdGFMZW5ndGg6bnVtYmVyfG51bGw9bnVsbDtcclxuICAgICBwcml2YXRlIHdvcmtlclVSTDogc3RyaW5nfG51bGw9bnVsbDtcclxuXHJcbiAgICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICB0aGlzLmJ3ID0gbmV3IEJpbmFyeUJ5dGVXcml0ZXIoKTtcclxuICAgICB9XHJcblxyXG4gICAgIC8qXHJcbiAgICAgICogIE1ldGhvZCB1c2VkIGFzIHdvcmtlciBjb2RlLlxyXG4gICAgICAqL1xyXG4gICAgIHdvcmtlckZ1bmN0aW9uKCkge1xyXG4gICAgICAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAobXNnOk1lc3NhZ2VFdmVudCkge1xyXG5cclxuICAgICAgICAgbGV0IGJ1Zkxlbj1tc2cuZGF0YS5mcmFtZUxlbmd0aCAqIG1zZy5kYXRhLmNocztcclxuICAgICAgICAgbGV0IHZhbFZpZXcgPSBuZXcgRGF0YVZpZXcobXNnLmRhdGEuYnVmLG1zZy5kYXRhLmJ1ZlBvcyk7XHJcblxyXG4gICAgICAgICBsZXQgYnVmUG9zID0gMDtcclxuICAgICAgICAgbGV0IGhEeW5JbnRSYW5nZSA9IDEgPDwgKG1zZy5kYXRhLnNhbXBsZVNpemVJbkJpdHMgLSAxKTtcclxuICAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBtc2cuZGF0YS5mcmFtZUxlbmd0aDsgcysrKSB7XHJcbiAgICAgICAgICAgLy8gaW50ZXJsZWF2ZWQgY2hhbm5lbCBkYXRhXHJcblxyXG4gICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBtc2cuZGF0YS5jaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgIGxldCBzcmNQb3M9KGNoKm1zZy5kYXRhLmZyYW1lTGVuZ3RoKStzO1xyXG4gICAgICAgICAgICAgbGV0IHZhbEZsdCA9IG1zZy5kYXRhLmF1ZGlvRGF0YVtzcmNQb3NdO1xyXG4gICAgICAgICAgICAgbGV0IHZhbEludCA9IE1hdGgucm91bmQodmFsRmx0ICogaER5bkludFJhbmdlKTtcclxuICAgICAgICAgICAgIHZhbFZpZXcuc2V0SW50MTYoYnVmUG9zLCB2YWxJbnQsIHRydWUpO1xyXG4gICAgICAgICAgICAgYnVmUG9zKz0yO1xyXG4gICAgICAgICAgIH1cclxuICAgICAgICAgfVxyXG4gICAgICAgICBwb3N0TWVzc2FnZSh7YnVmOm1zZy5kYXRhLmJ1Zn0sIFttc2cuZGF0YS5idWZdKTtcclxuICAgICAgICAgLy9zZWxmLmNsb3NlKClcclxuICAgICAgIH1cclxuICAgICB9XHJcblxyXG5cclxuICAgICB3cml0ZUZtdENodW5rKGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyKXtcclxuXHJcbiAgICAgICB0aGlzLmJ3LndyaXRlVWludDE2KFdhdkZpbGVGb3JtYXQuUENNLHRydWUpO1xyXG4gICAgICAgbGV0IGZyYW1lU2l6ZT1XYXZXcml0ZXIuREVGQVVMVF9TQU1QTEVfU0laRV9CWVRFUyphdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzOyAvLyBmaXhlZCAxNi1iaXQgZm9yIG5vd1xyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQxNihhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLHRydWUpO1xyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQzMihhdWRpb0J1ZmZlci5zYW1wbGVSYXRlLHRydWUpO1xyXG4gICAgICAgICAvLyBkd0F2Z0J5dGVzUGVyU2VjXHJcbiAgICAgICB0aGlzLmJ3LndyaXRlVWludDMyKGZyYW1lU2l6ZSphdWRpb0J1ZmZlci5zYW1wbGVSYXRlLHRydWUpO1xyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQxNihmcmFtZVNpemUsdHJ1ZSk7XHJcbiAgICAgICAvLyBzYW1wbGUgc2l6ZSBpbiBiaXRzIChQQ00gZm9ybWF0IG9ubHkpXHJcbiAgICAgICB0aGlzLmJ3LndyaXRlVWludDE2KFdhdldyaXRlci5ERUZBVUxUX1NBTVBMRV9TSVpFX0JZVEVTKjgsdHJ1ZSk7XHJcbiAgICAgfVxyXG5cclxuICAgICB3cml0ZURhdGFDaHVuayhhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcil7XHJcblxyXG4gICAgICAgbGV0IGNoRGF0YTA9YXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMCk7XHJcbiAgICAgICBsZXQgZGF0YUxlbj1jaERhdGEwLmxlbmd0aDtcclxuICAgICAgICBsZXQgaER5bkludFJhbmdlPTEgPDwgKChXYXZXcml0ZXIuREVGQVVMVF9TQU1QTEVfU0laRV9CWVRFUyo4KS0xKTtcclxuICAgICAgIGZvcihsZXQgcz0wO3M8ZGF0YUxlbjtzKyspIHtcclxuICAgICAgICAgLy8gaW50ZXJsZWF2ZWQgY2hhbm5lbCBkYXRhXHJcbiAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgbGV0IGNoRGF0YSA9IGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKTtcclxuICAgICAgICAgICBsZXQgdmFsRmx0PWNoRGF0YVtzXTtcclxuICAgICAgICAgICBsZXQgdmFsSW50PU1hdGgucm91bmQodmFsRmx0KmhEeW5JbnRSYW5nZSk7XHJcbiAgICAgICAgICAgdGhpcy5idy53cml0ZUludDE2KHZhbEludCx0cnVlKTtcclxuICAgICAgICAgfVxyXG4gICAgICAgfVxyXG5cclxuICAgICB9XHJcblxyXG4gICAgIHdyaXRlQ2h1bmtIZWFkZXIobmFtZTpzdHJpbmcsY2hrTGVuOm51bWJlcil7XHJcbiAgICAgICB0aGlzLmJ3LndyaXRlQXNjaWkobmFtZSk7XHJcbiAgICAgICB0aGlzLmJ3LndyaXRlVWludDMyKGNoa0xlbix0cnVlKTtcclxuICAgICB9XHJcblxyXG4gICAgIHdyaXRlQXN5bmMoYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIsY2FsbGJhY2s6ICh3YXZGaWxlRGF0YTpVaW50OEFycmF5KT0+IGFueSl7XHJcblxyXG4gICAgICAgbGV0IGRhdGFDaGtCeXRlTGVuPXRoaXMud3JpdGVIZWFkZXIoYXVkaW9CdWZmZXIpO1xyXG4gICAgICAgaWYgKCF0aGlzLndvcmtlclVSTCkge1xyXG4gICAgICAgICB0aGlzLndvcmtlclVSTCA9IFdvcmtlckhlbHBlci5idWlsZFdvcmtlckJsb2JVUkwodGhpcy53b3JrZXJGdW5jdGlvbilcclxuICAgICAgICB9XHJcbiAgICAgICBsZXQgd28gPSBuZXcgV29ya2VyKHRoaXMud29ya2VyVVJMKTtcclxuXHJcbiAgICAgICBsZXQgY2hzID0gYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscztcclxuXHJcbiAgICAgICBsZXQgZnJhbWVMZW5ndGggPSBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YSgwKS5sZW5ndGg7XHJcbiAgICAgICBsZXQgYWQgPSBuZXcgRmxvYXQzMkFycmF5KGNocyAqIGZyYW1lTGVuZ3RoKTtcclxuICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgYWQuc2V0KGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKSwgY2ggKiBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICB9XHJcbiAgICAgICAgIC8vIGVuc3VyZUNhcGFjaXR5IGJsb2NrcyAhISFcclxuICAgICAgIHRoaXMuYncuZW5zdXJlQ2FwYWNpdHkoZGF0YUNoa0J5dGVMZW4pO1xyXG4gICAgICAgd28ub25tZXNzYWdlID0gKG1lKSA9PiB7XHJcbiAgICAgICAgIGNhbGxiYWNrKG1lLmRhdGEuYnVmKTtcclxuICAgICAgICAgd28udGVybWluYXRlKCk7XHJcbiAgICAgICB9XHJcbiAgICAgICAvL1RPRE8gRml4ZWQgc2FtcGxlIHNpemUgb2YgMTYgYml0c1xyXG4gICAgICAgd28ucG9zdE1lc3NhZ2Uoe3NhbXBsZVNpemVJbkJpdHM6MTYsIGNoczogY2hzLCBmcmFtZUxlbmd0aDogZnJhbWVMZW5ndGgsIGF1ZGlvRGF0YTogYWQsYnVmOnRoaXMuYncuYnVmLGJ1ZlBvczp0aGlzLmJ3LnBvc30sIFthZC5idWZmZXIsdGhpcy5idy5idWZdKTtcclxuXHJcbiAgICAgfVxyXG5cclxuICAgICB3cml0ZShhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcik6VWludDhBcnJheXtcclxuICAgICAgIHRoaXMud3JpdGVIZWFkZXIoYXVkaW9CdWZmZXIpO1xyXG4gICAgICAgdGhpcy53cml0ZURhdGFDaHVuayhhdWRpb0J1ZmZlcik7XHJcbiAgICAgICByZXR1cm4gdGhpcy5idy5maW5pc2goKTtcclxuICAgICB9XHJcblxyXG5cclxuICAgICAgd3JpdGVIZWFkZXIoYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpOm51bWJlcntcclxuXHJcbiAgICAgICAgdGhpcy5idy53cml0ZUFzY2lpKFdhdkZpbGVGb3JtYXQuUklGRl9LRVkpO1xyXG4gICAgICAgIGxldCBkYXRhQ2hrQnl0ZUxlbj1hdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YSgwKS5sZW5ndGgqV2F2V3JpdGVyLkRFRkFVTFRfU0FNUExFX1NJWkVfQllURVMqYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICBsZXQgd2F2Q2h1bmtCeXRlTGVuPSg0KzQpKjMrMTYrZGF0YUNoa0J5dGVMZW47XHJcbiAgICAgICAgbGV0IHdhdkZpbGVEYXRhQnl0ZUxlbj13YXZDaHVua0J5dGVMZW4rODtcclxuXHJcbiAgICAgICAgdGhpcy5idy53cml0ZVVpbnQzMih3YXZDaHVua0J5dGVMZW4sdHJ1ZSk7IC8vIG11c3QgYmUgc2V0IHRvIGZpbGUgbGVuZ3RoLTggbGF0ZXJcclxuICAgICAgICB0aGlzLmJ3LndyaXRlQXNjaWkoV2F2RmlsZUZvcm1hdC5XQVZfS0VZKTtcclxuICAgICAgICB0aGlzLndyaXRlQ2h1bmtIZWFkZXIoJ2ZtdCAnLDE2KTtcclxuICAgICAgICB0aGlzLndyaXRlRm10Q2h1bmsoYXVkaW9CdWZmZXIpO1xyXG4gICAgICAgIHRoaXMud3JpdGVDaHVua0hlYWRlcignZGF0YScsZGF0YUNoa0J5dGVMZW4pO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ2hrQnl0ZUxlbjtcclxuICAgICAgfVxyXG5cclxuICAgfVxyXG5cclxuXHJcblxyXG4iXX0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F2d3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2ltcGwvd2F2d3JpdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBSTVDLE1BQU0sT0FBTyxTQUFTO0lBS3BCO1FBRFEsY0FBUyxHQUFjLElBQUksQ0FBQztRQUVsQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLEdBQWdCO1lBRXpDLE1BQU0sT0FBTyxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFM0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdDLDJCQUEyQjtnQkFFM0IsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFO29CQUN4QyxJQUFJLE1BQU0sR0FBQyxDQUFDLEVB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QUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0MsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQzs7QUF0SGMsbUNBQXlCLEdBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2F2RmlsZUZvcm1hdCB9IGZyb20gJy4vd2F2Zm9ybWF0J1xyXG5pbXBvcnQgeyBCaW5hcnlCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vaW8vQmluYXJ5V3JpdGVyJ1xyXG5pbXBvcnQge1dvcmtlckhlbHBlcn0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmRlY2xhcmUgZnVuY3Rpb24gcG9zdE1lc3NhZ2UgKG1lc3NhZ2U6YW55LCB0cmFuc2ZlcjpBcnJheTxhbnk+KTp2b2lkO1xyXG5cclxuXHJcbiAgIGV4cG9ydCBjbGFzcyBXYXZXcml0ZXIge1xyXG5cclxuICAgICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9TQU1QTEVfU0laRV9CWVRFUzpudW1iZXIgPSAyO1xyXG4gICAgIHByaXZhdGUgYnc6QmluYXJ5Qnl0ZVdyaXRlcjtcclxuICAgICBwcml2YXRlIHdvcmtlclVSTDogc3RyaW5nfG51bGw9bnVsbDtcclxuICAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgIHRoaXMuYncgPSBuZXcgQmluYXJ5Qnl0ZVdyaXRlcigpO1xyXG4gICAgIH1cclxuXHJcbiAgICAgLypcclxuICAgICAgKiAgTWV0aG9kIHVzZWQgYXMgd29ya2VyIGNvZGUuXHJcbiAgICAgICovXHJcbiAgICAgd29ya2VyRnVuY3Rpb24oKSB7XHJcbiAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtc2c6TWVzc2FnZUV2ZW50KSB7XHJcblxyXG4gICAgICAgICBjb25zdCB2YWxWaWV3ID0gbmV3IERhdGFWaWV3KG1zZy5kYXRhLmJ1Zixtc2cuZGF0YS5idWZQb3MpO1xyXG5cclxuICAgICAgICAgbGV0IGJ1ZlBvcyA9IDA7XHJcbiAgICAgICAgIGxldCBoRHluSW50UmFuZ2UgPSAxIDw8IChtc2cuZGF0YS5zYW1wbGVTaXplSW5CaXRzIC0gMSk7XHJcbiAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgbXNnLmRhdGEuZnJhbWVMZW5ndGg7IHMrKykge1xyXG4gICAgICAgICAgIC8vIGludGVybGVhdmVkIGNoYW5uZWwgZGF0YVxyXG5cclxuICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgbXNnLmRhdGEuY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICBsZXQgc3JjUG9zPShjaCptc2cuZGF0YS5mcmFtZUxlbmd0aCkrcztcclxuICAgICAgICAgICAgIGxldCB2YWxGbHQgPSBtc2cuZGF0YS5hdWRpb0RhdGFbc3JjUG9zXTtcclxuICAgICAgICAgICAgIGxldCB2YWxJbnQgPSBNYXRoLnJvdW5kKHZhbEZsdCAqIGhEeW5JbnRSYW5nZSk7XHJcbiAgICAgICAgICAgICB2YWxWaWV3LnNldEludDE2KGJ1ZlBvcywgdmFsSW50LCB0cnVlKTtcclxuICAgICAgICAgICAgIGJ1ZlBvcys9MjtcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgIH1cclxuICAgICAgICAgcG9zdE1lc3NhZ2Uoe2J1Zjptc2cuZGF0YS5idWZ9LCBbbXNnLmRhdGEuYnVmXSk7XHJcbiAgICAgICAgIC8vc2VsZi5jbG9zZSgpXHJcbiAgICAgICB9XHJcbiAgICAgfVxyXG5cclxuXHJcbiAgICAgd3JpdGVGbXRDaHVuayhhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcil7XHJcblxyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQxNihXYXZGaWxlRm9ybWF0LlBDTSx0cnVlKTtcclxuICAgICAgIGxldCBmcmFtZVNpemU9V2F2V3JpdGVyLkRFRkFVTFRfU0FNUExFX1NJWkVfQllURVMqYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVsczsgLy8gZml4ZWQgMTYtYml0IGZvciBub3dcclxuICAgICAgIHRoaXMuYncud3JpdGVVaW50MTYoYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyx0cnVlKTtcclxuICAgICAgIHRoaXMuYncud3JpdGVVaW50MzIoYXVkaW9CdWZmZXIuc2FtcGxlUmF0ZSx0cnVlKTtcclxuICAgICAgICAgLy8gZHdBdmdCeXRlc1BlclNlY1xyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQzMihmcmFtZVNpemUqYXVkaW9CdWZmZXIuc2FtcGxlUmF0ZSx0cnVlKTtcclxuICAgICAgIHRoaXMuYncud3JpdGVVaW50MTYoZnJhbWVTaXplLHRydWUpO1xyXG4gICAgICAgLy8gc2FtcGxlIHNpemUgaW4gYml0cyAoUENNIGZvcm1hdCBvbmx5KVxyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQxNihXYXZXcml0ZXIuREVGQVVMVF9TQU1QTEVfU0laRV9CWVRFUyo4LHRydWUpO1xyXG4gICAgIH1cclxuXHJcbiAgICAgd3JpdGVEYXRhQ2h1bmsoYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpe1xyXG5cclxuICAgICAgIGxldCBjaERhdGEwPWF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKDApO1xyXG4gICAgICAgbGV0IGRhdGFMZW49Y2hEYXRhMC5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGhEeW5JbnRSYW5nZT0xIDw8ICgoV2F2V3JpdGVyLkRFRkFVTFRfU0FNUExFX1NJWkVfQllURVMqOCktMSk7XHJcbiAgICAgICBmb3IobGV0IHM9MDtzPGRhdGFMZW47cysrKSB7XHJcbiAgICAgICAgIC8vIGludGVybGVhdmVkIGNoYW5uZWwgZGF0YVxyXG4gICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVsczsgY2grKykge1xyXG4gICAgICAgICAgIGxldCBjaERhdGEgPSBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCk7XHJcbiAgICAgICAgICAgbGV0IHZhbEZsdD1jaERhdGFbc107XHJcbiAgICAgICAgICAgbGV0IHZhbEludD1NYXRoLnJvdW5kKHZhbEZsdCpoRHluSW50UmFuZ2UpO1xyXG4gICAgICAgICAgIHRoaXMuYncud3JpdGVJbnQxNih2YWxJbnQsdHJ1ZSk7XHJcbiAgICAgICAgIH1cclxuICAgICAgIH1cclxuXHJcbiAgICAgfVxyXG5cclxuICAgICB3cml0ZUNodW5rSGVhZGVyKG5hbWU6c3RyaW5nLGNoa0xlbjpudW1iZXIpe1xyXG4gICAgICAgdGhpcy5idy53cml0ZUFzY2lpKG5hbWUpO1xyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQzMihjaGtMZW4sdHJ1ZSk7XHJcbiAgICAgfVxyXG5cclxuICAgICB3cml0ZUFzeW5jKGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyLGNhbGxiYWNrOiAod2F2RmlsZURhdGE6VWludDhBcnJheSk9PiBhbnkpe1xyXG5cclxuICAgICAgIGxldCBkYXRhQ2hrQnl0ZUxlbj10aGlzLndyaXRlSGVhZGVyKGF1ZGlvQnVmZmVyKTtcclxuICAgICAgIGlmICghdGhpcy53b3JrZXJVUkwpIHtcclxuICAgICAgICAgdGhpcy53b3JrZXJVUkwgPSBXb3JrZXJIZWxwZXIuYnVpbGRXb3JrZXJCbG9iVVJMKHRoaXMud29ya2VyRnVuY3Rpb24pXHJcbiAgICAgICAgfVxyXG4gICAgICAgbGV0IHdvID0gbmV3IFdvcmtlcih0aGlzLndvcmtlclVSTCk7XHJcblxyXG4gICAgICAgbGV0IGNocyA9IGF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7XHJcblxyXG4gICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMCkubGVuZ3RoO1xyXG4gICAgICAgbGV0IGFkID0gbmV3IEZsb2F0MzJBcnJheShjaHMgKiBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgIGFkLnNldChhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCksIGNoICogZnJhbWVMZW5ndGgpO1xyXG4gICAgICAgfVxyXG4gICAgICAgICAvLyBlbnN1cmVDYXBhY2l0eSBibG9ja3MgISEhXHJcbiAgICAgICB0aGlzLmJ3LmVuc3VyZUNhcGFjaXR5KGRhdGFDaGtCeXRlTGVuKTtcclxuICAgICAgIHdvLm9ubWVzc2FnZSA9IChtZSkgPT4ge1xyXG4gICAgICAgICBjYWxsYmFjayhtZS5kYXRhLmJ1Zik7XHJcbiAgICAgICAgIHdvLnRlcm1pbmF0ZSgpO1xyXG4gICAgICAgfVxyXG4gICAgICAgLy9UT0RPIEZpeGVkIHNhbXBsZSBzaXplIG9mIDE2IGJpdHNcclxuICAgICAgIHdvLnBvc3RNZXNzYWdlKHtzYW1wbGVTaXplSW5CaXRzOjE2LCBjaHM6IGNocywgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLCBhdWRpb0RhdGE6IGFkLGJ1Zjp0aGlzLmJ3LmJ1ZixidWZQb3M6dGhpcy5idy5wb3N9LCBbYWQuYnVmZmVyLHRoaXMuYncuYnVmXSk7XHJcblxyXG4gICAgIH1cclxuXHJcbiAgICAgd3JpdGUoYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpOlVpbnQ4QXJyYXl7XHJcbiAgICAgICB0aGlzLndyaXRlSGVhZGVyKGF1ZGlvQnVmZmVyKTtcclxuICAgICAgIHRoaXMud3JpdGVEYXRhQ2h1bmsoYXVkaW9CdWZmZXIpO1xyXG4gICAgICAgcmV0dXJuIHRoaXMuYncuZmluaXNoKCk7XHJcbiAgICAgfVxyXG5cclxuXHJcbiAgICAgIHdyaXRlSGVhZGVyKGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyKTpudW1iZXJ7XHJcbiAgICAgICAgdGhpcy5idy53cml0ZUFzY2lpKFdhdkZpbGVGb3JtYXQuUklGRl9LRVkpO1xyXG4gICAgICAgIGxldCBkYXRhQ2hrQnl0ZUxlbj0wO1xyXG4gICAgICAgIC8vY29uc3QgZGF0YUNoa0J5dGVMZW49YXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMCkubGVuZ3RoKldhdldyaXRlci5ERUZBVUxUX1NBTVBMRV9TSVpFX0JZVEVTKmF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICAgICAgY29uc3QgYWJDaHM9YXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICBpZihhYkNocz4wKXtcclxuICAgICAgICAgIGNvbnN0IGFiQ2gwPWF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKDApO1xyXG4gICAgICAgICAgZGF0YUNoa0J5dGVMZW49YWJDaDAubGVuZ3RoKldhdldyaXRlci5ERUZBVUxUX1NBTVBMRV9TSVpFX0JZVEVTKmFiQ2hzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3YXZDaHVua0J5dGVMZW49KDQrNCkqMysxNitkYXRhQ2hrQnl0ZUxlbjtcclxuICAgICAgICB0aGlzLmJ3LndyaXRlVWludDMyKHdhdkNodW5rQnl0ZUxlbix0cnVlKTsgLy8gbXVzdCBiZSBzZXQgdG8gZmlsZSBsZW5ndGgtOCBsYXRlclxyXG4gICAgICAgIHRoaXMuYncud3JpdGVBc2NpaShXYXZGaWxlRm9ybWF0LldBVl9LRVkpO1xyXG4gICAgICAgIHRoaXMud3JpdGVDaHVua0hlYWRlcignZm10ICcsMTYpO1xyXG4gICAgICAgIHRoaXMud3JpdGVGbXRDaHVuayhhdWRpb0J1ZmZlcik7XHJcbiAgICAgICAgdGhpcy53cml0ZUNodW5rSGVhZGVyKCdkYXRhJyxkYXRhQ2hrQnl0ZUxlbik7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDaGtCeXRlTGVuO1xyXG4gICAgICB9XHJcblxyXG4gICB9XHJcblxyXG5cclxuXHJcbiJdfQ==