speechrecorderng 3.10.13 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/speechrecorderng.mjs +204 -201
  3. package/fesm2022/speechrecorderng.mjs.map +1 -1
  4. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
  5. package/lib/spr.module.version.d.ts +1 -1
  6. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  7. package/lib/ui/responsive_component.d.ts +1 -1
  8. package/package.json +13 -15
  9. package/esm2022/lib/action/action.mjs +0 -73
  10. package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
  11. package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
  12. package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
  13. package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
  14. package/esm2022/lib/audio/audio_display.mjs +0 -118
  15. package/esm2022/lib/audio/audio_player.mjs +0 -238
  16. package/esm2022/lib/audio/capture/capture.mjs +0 -855
  17. package/esm2022/lib/audio/context.mjs +0 -79
  18. package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
  19. package/esm2022/lib/audio/format.mjs +0 -20
  20. package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
  21. package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
  22. package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
  23. package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
  24. package/esm2022/lib/audio/io/stream.mjs +0 -59
  25. package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
  26. package/esm2022/lib/audio/persistor.mjs +0 -81
  27. package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
  28. package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
  29. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  30. package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
  31. package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
  32. package/esm2022/lib/audio/playback/player.mjs +0 -402
  33. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  34. package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
  35. package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
  36. package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
  37. package/esm2022/lib/audio/ui/common.mjs +0 -19
  38. package/esm2022/lib/audio/ui/container.mjs +0 -414
  39. package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
  40. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  41. package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
  42. package/esm2022/lib/db/inddb.mjs +0 -120
  43. package/esm2022/lib/dsp/utils.mjs +0 -48
  44. package/esm2022/lib/environment/environment.defaults.mjs +0 -9
  45. package/esm2022/lib/io/BinaryReader.mjs +0 -93
  46. package/esm2022/lib/io/BinaryWriter.mjs +0 -80
  47. package/esm2022/lib/io/stream.mjs +0 -259
  48. package/esm2022/lib/math/2d/geometry.mjs +0 -28
  49. package/esm2022/lib/math/complex.mjs +0 -58
  50. package/esm2022/lib/math/dft.mjs +0 -196
  51. package/esm2022/lib/media/utils.mjs +0 -14
  52. package/esm2022/lib/net/uploader.mjs +0 -367
  53. package/esm2022/lib/recorder_component.mjs +0 -65
  54. package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
  55. package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
  56. package/esm2022/lib/speechrecorder/recording.mjs +0 -124
  57. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
  58. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  59. package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
  60. package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
  61. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  62. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
  63. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
  64. package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
  65. package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
  66. package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
  67. package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
  68. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  69. package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
  70. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
  71. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
  72. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
  73. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
  74. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
  75. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  76. package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
  77. package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
  78. package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
  79. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
  80. package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
  81. package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
  82. package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
  83. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  84. package/esm2022/lib/speechrecorderng.component.mjs +0 -392
  85. package/esm2022/lib/speechrecorderng.module.mjs +0 -97
  86. package/esm2022/lib/spr.config.mjs +0 -27
  87. package/esm2022/lib/spr.module.version.mjs +0 -2
  88. package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
  89. package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
  90. package/esm2022/lib/ui/message_dialog.mjs +0 -51
  91. package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
  92. package/esm2022/lib/ui/responsive_component.mjs +0 -24
  93. package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
  94. package/esm2022/lib/utils/ua-parser.mjs +0 -190
  95. package/esm2022/lib/utils/utils.mjs +0 -132
  96. package/esm2022/lib/utils/wake_lock.mjs +0 -114
  97. package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
  98. package/esm2022/public-api.mjs +0 -35
  99. package/esm2022/speechrecorderng.mjs +0 -5
@@ -1,14 +0,0 @@
1
- export class MediaUtils {
2
- static toMediaTime(timeInSeconds) {
3
- let rest = timeInSeconds;
4
- let hours = Math.floor(timeInSeconds / 3600);
5
- rest -= hours * 3600;
6
- let minutes = Math.floor(rest / 60);
7
- rest -= minutes * 60;
8
- let seconds = Math.floor(rest);
9
- rest -= seconds;
10
- let millis = Math.round(rest * 1000);
11
- return hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + ':' + seconds.toString().padStart(2, '0') + '.' + millis.toString().padStart(3, '0');
12
- }
13
- }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbWVkaWEvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0ksTUFBTSxPQUFPLFVBQVU7SUFFbkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFvQjtRQUNuQyxJQUFJLElBQUksR0FBQyxhQUFhLENBQUM7UUFDdkIsSUFBSSxLQUFLLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxJQUFFLEtBQUssR0FBQyxJQUFJLENBQUM7UUFDakIsSUFBSSxPQUFPLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsSUFBSSxJQUFFLE9BQU8sR0FBQyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLElBQUUsT0FBTyxDQUFDO1FBQ2QsSUFBSSxNQUFNLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsR0FBQyxHQUFHLEdBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUMsR0FBRyxDQUFDLEdBQUMsR0FBRyxHQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxHQUFDLEdBQUcsR0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNoSyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuICAgIGV4cG9ydCBjbGFzcyBNZWRpYVV0aWxzIHtcclxuXHJcbiAgICAgICAgc3RhdGljIHRvTWVkaWFUaW1lKHRpbWVJblNlY29uZHM6bnVtYmVyKTpzdHJpbmd7XHJcbiAgICAgICAgICAgIGxldCByZXN0PXRpbWVJblNlY29uZHM7XHJcbiAgICAgICAgICAgIGxldCBob3Vycz1NYXRoLmZsb29yKHRpbWVJblNlY29uZHMvMzYwMCk7XHJcbiAgICAgICAgICAgIHJlc3QtPWhvdXJzKjM2MDA7XHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzPU1hdGguZmxvb3IocmVzdC82MCk7XHJcbiAgICAgICAgICAgIHJlc3QtPW1pbnV0ZXMqNjA7XHJcbiAgICAgICAgICAgIGxldCBzZWNvbmRzPU1hdGguZmxvb3IocmVzdCk7XHJcbiAgICAgICAgICAgIHJlc3QtPXNlY29uZHM7XHJcbiAgICAgICAgICAgIGxldCBtaWxsaXM9TWF0aC5yb3VuZChyZXN0KjEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCcwJykrJzonK21pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCcwJykrJzonK3NlY29uZHMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCcwJykrJy4nK21pbGxpcy50b1N0cmluZygpLnBhZFN0YXJ0KDMsJzAnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiJdfQ==
@@ -1,367 +0,0 @@
1
- import { timeout } from 'rxjs/operators';
2
- // state of an upload
3
- export var UploadStatus;
4
- (function (UploadStatus) {
5
- UploadStatus[UploadStatus["IDLE"] = 1] = "IDLE";
6
- UploadStatus[UploadStatus["UPLOADING"] = 2] = "UPLOADING";
7
- UploadStatus[UploadStatus["ABORT"] = 3] = "ABORT";
8
- UploadStatus[UploadStatus["DONE"] = 0] = "DONE";
9
- UploadStatus[UploadStatus["ERR"] = -1] = "ERR";
10
- })(UploadStatus || (UploadStatus = {}));
11
- // state of the uploader
12
- // TRY_UPLOADING is uploading state after an error (for example if disconnected from server)
13
- export var UploaderStatus;
14
- (function (UploaderStatus) {
15
- UploaderStatus[UploaderStatus["DONE"] = 0] = "DONE";
16
- UploaderStatus[UploaderStatus["UPLOADING"] = 1] = "UPLOADING";
17
- UploaderStatus[UploaderStatus["TRY_UPLOADING"] = 2] = "TRY_UPLOADING";
18
- UploaderStatus[UploaderStatus["NEXT"] = 3] = "NEXT";
19
- UploaderStatus[UploaderStatus["ERR"] = -1] = "ERR";
20
- })(UploaderStatus || (UploaderStatus = {}));
21
- export class UploaderStatusChangeEvent {
22
- constructor(sizeQueued, sizeDone, status) {
23
- this._sizeQueued = sizeQueued;
24
- this._sizeDone = sizeDone;
25
- this._status = status;
26
- }
27
- get sizeQueued() {
28
- return this._sizeQueued;
29
- }
30
- get sizeDone() {
31
- return this._sizeDone;
32
- }
33
- sizeInQueue() {
34
- return this._sizeQueued - this._sizeDone;
35
- }
36
- get status() {
37
- return this._status;
38
- }
39
- uploadDone() {
40
- return (this._sizeDone >= this._sizeQueued);
41
- }
42
- percentDone() {
43
- if (this._sizeQueued == 0) {
44
- // no data queued, we are "done"
45
- return 100;
46
- }
47
- let percent = Math.floor(this._sizeDone * 100 / this._sizeQueued);
48
- //console.log("Upload status: queued: "+this._sizeQueued+", done: "+this._sizeDone+", "+percent+"%")
49
- return percent;
50
- }
51
- }
52
- export class Upload {
53
- get serverPersistable() {
54
- return this._serverPersistable;
55
- }
56
- constructor(blob, url, _serverPersistable = null) {
57
- this._serverPersistable = _serverPersistable;
58
- this.onDone = null;
59
- this.toString = () => {
60
- let s = `Upload: Status: ${this.status}, URL: ${this._url}`;
61
- if (this._data instanceof Blob) {
62
- s = s + `, Size: ${this._data.size}`;
63
- }
64
- else if (this._data instanceof FormData) {
65
- // TODO (iterate through parts ??)
66
- }
67
- return s;
68
- };
69
- this._data = blob;
70
- this._url = url;
71
- this.status = UploadStatus.IDLE;
72
- }
73
- get url() {
74
- return this._url;
75
- }
76
- get data() {
77
- return this._data;
78
- }
79
- done() {
80
- this.status = UploadStatus.DONE;
81
- //console.debug("Single upload done.");
82
- if (this._serverPersistable) {
83
- this._serverPersistable.serverPersisted = true;
84
- //console.debug("Single upload set server persisted: "+this.serverPersistable);
85
- }
86
- else {
87
- //console.debug("Server persistable not set.");
88
- }
89
- if (this.onDone) {
90
- this.onDone(this);
91
- }
92
- }
93
- }
94
- export class UploadHolder {
95
- constructor() {
96
- this.onUploadSet = null;
97
- this._upload = null;
98
- }
99
- get upload() {
100
- return this._upload;
101
- }
102
- set upload(value) {
103
- this._upload = value;
104
- if (this._upload && this.onUploadSet) {
105
- this.onUploadSet(this._upload);
106
- }
107
- }
108
- }
109
- export class UploadSet {
110
- constructor() {
111
- this.uploads = new Array();
112
- this._complete = false;
113
- this._onDone = null;
114
- }
115
- add(upload) {
116
- if (this._complete) {
117
- throw new Error('Cannot add upload to upload set. Upload set already complete.');
118
- }
119
- if (upload instanceof UploadHolder) {
120
- upload.onUploadSet = (upl) => {
121
- upl.onDone = () => {
122
- this.checkUploadStates();
123
- };
124
- this.checkUploadStates();
125
- };
126
- }
127
- this.uploads.push(upload);
128
- }
129
- complete() {
130
- // Mark set as complete
131
- this._complete = true;
132
- // add listeners to each upload
133
- for (let upl of this.uploads) {
134
- if (upl instanceof Upload) {
135
- upl.onDone = (upl) => {
136
- this.checkUploadStates();
137
- };
138
- }
139
- else if (upl instanceof UploadHolder) {
140
- if (upl.upload) {
141
- upl.upload.onDone = (upl) => {
142
- this.checkUploadStates();
143
- };
144
- }
145
- }
146
- }
147
- // check immediately if already done
148
- this.checkUploadStates();
149
- }
150
- set onDone(value) {
151
- this._onDone = value;
152
- this.checkUploadStates();
153
- }
154
- checkUploadStates() {
155
- //console.debug("Check upload state...")
156
- if (this._complete) {
157
- if (this._onDone) {
158
- for (let upl of this.uploads) {
159
- if (upl instanceof Upload) {
160
- if (UploadStatus.DONE !== upl.status) {
161
- // At least this upload is not yet done
162
- // Do nothing
163
- //console.debug("Check upload state: Upload not done.")
164
- return;
165
- }
166
- }
167
- else if (upl instanceof UploadHolder) {
168
- if (upl.upload) {
169
- if (UploadStatus.DONE !== upl.upload.status) {
170
- // At least this upload is not yet done
171
- // Do nothing
172
- //console.debug("Check upload state: Upload (holder) not done.")
173
- return;
174
- }
175
- }
176
- else {
177
- // The actual upload is not yet set
178
- //console.debug("Check upload state: Upload (holder): upload not yet set.")
179
- return;
180
- }
181
- }
182
- }
183
- // set is complete and all upload parts are done, call done callback
184
- //console.debug("Check upload state: All done.")
185
- this._onDone(this);
186
- }
187
- }
188
- }
189
- }
190
- export class Uploader {
191
- constructor(http, withCredentials = false) {
192
- this.http = http;
193
- this.withCredentials = withCredentials;
194
- this.POST_MIN_TIMEOUT = 120000; // 2min plus ...
195
- this.POST_TIMEOUT_PER_KB = 1000; // ... 1s per kB
196
- this.RETRY_DELAY = 30000; // retry every 30s
197
- this.DEBUG_DELAY = 0;
198
- //DEBUG_DELAY:number=0;
199
- this.status = UploaderStatus.DONE;
200
- this.listener = null;
201
- this._sizeQueued = 0;
202
- this._sizeDone = 0;
203
- this.retryTimerRunning = false;
204
- this.retryTimerId = null;
205
- this.te = new TextEncoder();
206
- this.que = new Array();
207
- }
208
- dataSize(dt) {
209
- let si = 0;
210
- if (dt instanceof Blob) {
211
- si = dt.size;
212
- }
213
- else if (dt instanceof FormData) {
214
- dt.forEach((v, k) => {
215
- if (v instanceof File) {
216
- si += v.size;
217
- }
218
- else if (typeof v === 'string') {
219
- // encode to UTF-8 to get upload size
220
- si += this.te.encode().length;
221
- }
222
- });
223
- }
224
- return si;
225
- }
226
- uploadDone(ul) {
227
- ul.done();
228
- // remove upload from queue
229
- for (let i = 0; i < this.que.length; i++) {
230
- if (this.que[i] === ul) {
231
- // found, remove
232
- this.que.splice(i, 1);
233
- let ulSize = this.dataSize(ul.data);
234
- this._sizeDone += ulSize;
235
- break;
236
- }
237
- }
238
- // set to done for now...
239
- this.status = UploaderStatus.NEXT;
240
- // continue
241
- this.process();
242
- }
243
- startUpload(ul) {
244
- ul.status = UploadStatus.UPLOADING;
245
- if (UploaderStatus.ERR === this.status) {
246
- this.status = UploaderStatus.TRY_UPLOADING;
247
- }
248
- else {
249
- this.status = UploaderStatus.UPLOADING;
250
- }
251
- let dSize = this.dataSize(ul.data);
252
- let timeoutForDataSize = dSize * this.POST_TIMEOUT_PER_KB / 1000;
253
- let timeoVal = Math.round(this.POST_MIN_TIMEOUT + timeoutForDataSize);
254
- // pipe(timeout()) is not the same as xhr.timeout
255
- let uploadedUpload = null;
256
- //console.debug("Post upload: "+ul)
257
- this.http.post(ul.url, ul.data, { withCredentials: this.withCredentials }).pipe(timeout(timeoVal)).subscribe({
258
- next: (data) => {
259
- uploadedUpload = ul;
260
- //console.debug('Next method called for upload: '+uploadedUpload)
261
- },
262
- error: (err) => {
263
- if (err.error instanceof Error) {
264
- // A client-side or network error occurred. Handle it accordingly.
265
- console.error('Upload error occurred:', err.error.message);
266
- }
267
- else {
268
- // The backend returned an unsuccessful response code.
269
- // The response body may contain clues as to what went wrong,
270
- console.error(`Upload error: Server returned code ${err.status}`);
271
- }
272
- this.processError(ul);
273
- }, complete: () => {
274
- //console.debug('Upload complete method called')
275
- if (uploadedUpload) {
276
- if (this.DEBUG_DELAY > 0) {
277
- window.setTimeout(() => {
278
- this.uploadDone(ul);
279
- }, this.DEBUG_DELAY);
280
- }
281
- else {
282
- this.uploadDone(uploadedUpload);
283
- }
284
- }
285
- else {
286
- console.error('Upload post complete, but upload not set in next method!');
287
- }
288
- }
289
- });
290
- }
291
- processError(ul) {
292
- //console.debug("Process upload error...")
293
- ul.status = UploadStatus.ERR;
294
- this.status = UploaderStatus.ERR;
295
- let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);
296
- if (this.listener) {
297
- this.listener(ue);
298
- }
299
- // set retry timer
300
- this.retryTimerId = window.setTimeout(() => {
301
- this.retryTimerRunning = false;
302
- //console.debug("Upload retry timer expired. Continue processing...")
303
- this.process();
304
- }, this.RETRY_DELAY);
305
- this.retryTimerRunning = true;
306
- //console.debug("Started upload retry timer "+this.RETRY_DELAY+"ms ...")
307
- }
308
- process() {
309
- // clear retry timer if set
310
- if (this.retryTimerRunning) {
311
- if (this.retryTimerId) {
312
- window.clearTimeout(this.retryTimerId);
313
- }
314
- this.retryTimerRunning = false;
315
- //console.debug("Cleared retry timer.")
316
- }
317
- let pul = null;
318
- //console.debug("Uploader status: "+this.status)
319
- let s = this.que.length;
320
- //console.debug(s+" uploads are in the queue.")
321
- if (s > 0 && UploaderStatus.UPLOADING != this.status && UploaderStatus.TRY_UPLOADING != this.status) {
322
- for (let i = 0; i < s; i++) {
323
- let ul = this.que[i];
324
- //console.log("Upload "+ul+" status:"+ul.status)
325
- if (ul.status === UploadStatus.IDLE) {
326
- //console.log("Upload "+ul+" startUpload")
327
- this.startUpload(ul);
328
- pul = ul;
329
- break;
330
- }
331
- }
332
- if (!pul) {
333
- //console.log("Check ERR uploads...")
334
- // now failed uploads
335
- //console.debug("No regular upload found. Looking for error state uploads.")
336
- for (let i = 0; i < s; i++) {
337
- let ul = this.que[i];
338
- //console.log("Upload "+ul+" status:"+ul.status)
339
- if (ul.status === UploadStatus.ERR) {
340
- //console.log("Upload (ERR) "+ul+" startUpload")
341
- //console.debug("Start error state upload "+ul)
342
- this.startUpload(ul);
343
- pul = ul;
344
- break;
345
- }
346
- }
347
- }
348
- }
349
- if (s == 0) {
350
- //console.debug("Upload done.")
351
- this.status = UploaderStatus.DONE;
352
- }
353
- let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);
354
- if (this.listener) {
355
- this.listener(ue);
356
- }
357
- }
358
- queueUpload(ul) {
359
- if (ul) {
360
- let ulSize = this.dataSize(ul.data);
361
- this.que.push(ul);
362
- this._sizeQueued += ulSize;
363
- this.process();
364
- }
365
- }
366
- }
367
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbmV0L3VwbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVJLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV4QyxxQkFBcUI7QUFDckIsTUFBTSxDQUFOLElBQVksWUFBc0U7QUFBbEYsV0FBWSxZQUFZO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLHlEQUFhLENBQUE7SUFBRyxpREFBUyxDQUFBO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLDhDQUFRLENBQUE7QUFBQSxDQUFDLEVBQXRFLFlBQVksS0FBWixZQUFZLFFBQTBEO0FBRWxGLHdCQUF3QjtBQUN4Qiw0RkFBNEY7QUFDNUYsTUFBTSxDQUFOLElBQVksY0FBK0U7QUFBM0YsV0FBWSxjQUFjO0lBQUcsbURBQVEsQ0FBQTtJQUFFLDZEQUFhLENBQUE7SUFBRSxxRUFBaUIsQ0FBQTtJQUFDLG1EQUFRLENBQUE7SUFBRSxrREFBUSxDQUFBO0FBQUEsQ0FBQyxFQUEvRSxjQUFjLEtBQWQsY0FBYyxRQUFpRTtBQUUzRixNQUFNLE9BQU8seUJBQXlCO0lBTWxDLFlBQVksVUFBa0IsRUFBRSxRQUFnQixFQUFFLE1BQXNCO1FBQ3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVU7UUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEIsZ0NBQWdDO1lBQ2hDLE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLG9HQUFvRztRQUNwRyxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0NBRUo7QUFFRCxNQUFNLE9BQU8sTUFBTTtJQUVqQixJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBUUMsWUFBWSxJQUFrQixFQUFFLEdBQVUsRUFBUyxxQkFBMEMsSUFBSTtRQUE5Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTRCO1FBRmpHLFdBQU0sR0FBZ0MsSUFBSSxDQUFDO1FBZ0N0QyxhQUFRLEdBQUcsR0FBWSxFQUFFO1lBQzlCLElBQUksQ0FBQyxHQUFDLG1CQUFtQixJQUFJLENBQUMsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxRCxJQUFHLElBQUksQ0FBQyxLQUFLLFlBQVksSUFBSSxFQUFDLENBQUM7Z0JBQzNCLENBQUMsR0FBQyxDQUFDLEdBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JDLENBQUM7aUJBQUssSUFBRyxJQUFJLENBQUMsS0FBSyxZQUFhLFFBQVEsRUFBQyxDQUFDO2dCQUN2QyxrQ0FBa0M7WUFDckMsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFBO1FBckNLLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUk7UUFDQSxJQUFJLENBQUMsTUFBTSxHQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDOUIsdUNBQXVDO1FBQ3ZDLElBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDL0MsK0VBQStFO1FBQ2pGLENBQUM7YUFBSSxDQUFDO1lBQ0osK0NBQStDO1FBQ2pELENBQUM7UUFDRCxJQUFHLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNMLENBQUM7Q0FhSjtBQUVELE1BQU0sT0FBTyxZQUFZO0lBQXpCO1FBRUUsZ0JBQVcsR0FBOEIsSUFBSSxDQUFDO1FBWXRDLFlBQU8sR0FBYSxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQVhDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBb0I7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUVGO0FBRUQsTUFBTSxPQUFPLFNBQVM7SUFBdEI7UUFFVSxZQUFPLEdBQTZCLElBQUksS0FBSyxFQUF1QixDQUFDO1FBQ3JFLGNBQVMsR0FBQyxLQUFLLENBQUM7UUFFaEIsWUFBTyxHQUFvQyxJQUFJLENBQUM7SUFnRjFELENBQUM7SUE5RUMsR0FBRyxDQUFDLE1BQTBCO1FBQzVCLElBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQTtRQUNsRixDQUFDO1FBQ0QsSUFBRyxNQUFNLFlBQVksWUFBWSxFQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLFdBQVcsR0FBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO2dCQUN4QixHQUFHLENBQUMsTUFBTSxHQUFDLEdBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQyxDQUFBO2dCQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLENBQUMsQ0FBQTtRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QixDQUFDO0lBRUQsUUFBUTtRQUNOLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFDLElBQUksQ0FBQztRQUVwQiwrQkFBK0I7UUFDL0IsS0FBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUM7WUFDM0IsSUFBRyxHQUFHLFlBQVksTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNCLENBQUMsQ0FBQTtZQUNILENBQUM7aUJBQUssSUFBRyxHQUFHLFlBQVksWUFBWSxFQUFDLENBQUM7Z0JBQ3BDLElBQUcsR0FBRyxDQUFDLE1BQU0sRUFBQyxDQUFDO29CQUNiLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQ2xDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUMzQixDQUFDLENBQUE7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUE4QztRQUN2RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLHdDQUF3QztRQUN4QyxJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQztZQUVqQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDaEIsS0FBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUM7b0JBQzNCLElBQUcsR0FBRyxZQUFZLE1BQU0sRUFBRSxDQUFDO3dCQUN6QixJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDOzRCQUNyQyx1Q0FBdUM7NEJBQ3ZDLGFBQWE7NEJBQ2IsdURBQXVEOzRCQUN2RCxPQUFPO3dCQUNULENBQUM7b0JBQ0gsQ0FBQzt5QkFBSyxJQUFHLEdBQUcsWUFBWSxZQUFZLEVBQUMsQ0FBQzt3QkFDcEMsSUFBRyxHQUFHLENBQUMsTUFBTSxFQUFDLENBQUM7NEJBQ2IsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0NBQzVDLHVDQUF1QztnQ0FDdkMsYUFBYTtnQ0FDYixnRUFBZ0U7Z0NBQ2hFLE9BQU87NEJBQ1QsQ0FBQzt3QkFDSCxDQUFDOzZCQUFJLENBQUM7NEJBQ0osbUNBQW1DOzRCQUNuQywyRUFBMkU7NEJBQzNFLE9BQU87d0JBQ1QsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBQ0Qsb0VBQW9FO2dCQUNwRSxnREFBZ0Q7Z0JBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFNRCxNQUFNLE9BQU8sUUFBUTtJQWtCakIsWUFBb0IsSUFBZ0IsRUFBVSxrQkFBMkIsS0FBSztRQUExRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBakI5RSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsQ0FBQyxnQkFBZ0I7UUFDM0Msd0JBQW1CLEdBQUcsSUFBSSxDQUFDLENBQUUsZ0JBQWdCO1FBRTdDLGdCQUFXLEdBQVcsS0FBSyxDQUFDLENBQUMsa0JBQWtCO1FBQy9DLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLHVCQUF1QjtRQUNmLFdBQU0sR0FBbUIsY0FBYyxDQUFDLElBQUksQ0FBQztRQUVyRCxhQUFRLEdBQXFELElBQUksQ0FBQztRQUMxRCxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBRXRCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFFbkMsT0FBRSxHQUFhLElBQUksV0FBVyxFQUFFLENBQUM7UUFHckMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQ25DLENBQUM7SUFFTyxRQUFRLENBQUMsRUFBZ0I7UUFDN0IsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDO1FBQ1QsSUFBRyxFQUFFLFlBQVksSUFBSSxFQUFDLENBQUM7WUFDbkIsRUFBRSxHQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDZixDQUFDO2FBQUssSUFBRyxFQUFFLFlBQWEsUUFBUSxFQUFDLENBQUM7WUFDOUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsRUFBRTtnQkFDZCxJQUFHLENBQUMsWUFBWSxJQUFJLEVBQUMsQ0FBQztvQkFDbEIsRUFBRSxJQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2YsQ0FBQztxQkFBSyxJQUFHLE9BQU8sQ0FBQyxLQUFJLFFBQVEsRUFBQyxDQUFDO29CQUMzQixxQ0FBcUM7b0JBQ3JDLEVBQUUsSUFBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztnQkFDakMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVRLFVBQVUsQ0FBQyxFQUFTO1FBRXpCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVWLDJCQUEyQjtRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ3JCLGdCQUFnQjtnQkFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUM7Z0JBQ3pCLE1BQU07WUFDVixDQUFDO1FBQ0wsQ0FBQztRQUNELHlCQUF5QjtRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDbEMsV0FBVztRQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sV0FBVyxDQUFDLEVBQVM7UUFFekIsRUFBRSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQ25DLElBQUksY0FBYyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDO1FBQy9DLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1FBQzNDLENBQUM7UUFFRCxJQUFJLEtBQUssR0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLGtCQUFrQixHQUFDLEtBQUssR0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUMsSUFBSSxDQUFDO1FBQzNELElBQUksUUFBUSxHQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDeEUsaURBQWlEO1FBRW5ELElBQUksY0FBYyxHQUFhLElBQUksQ0FBQztRQUNsQyxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLENBQUMsSUFBSSxFQUFDLEVBQUMsZUFBZSxFQUFDLElBQUksQ0FBQyxlQUFlLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ25HO1lBQ0ksSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFDLEVBQUU7Z0JBRVYsY0FBYyxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsaUVBQWlFO1lBQ3JFLENBQUM7WUFDQyxLQUFLLEVBQUMsQ0FBQyxHQUFzQixFQUFFLEVBQUU7Z0JBQy9CLElBQUksR0FBRyxDQUFDLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztvQkFDN0Isa0VBQWtFO29CQUNsRSxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9ELENBQUM7cUJBQU0sQ0FBQztvQkFDSixzREFBc0Q7b0JBQ3RELDZEQUE2RDtvQkFDN0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN6QixDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDZCxnREFBZ0Q7Z0JBQ2hELElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ2pCLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3hCLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3pCLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFBO29CQUNuQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDSixPQUFPLENBQUMsS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUE7Z0JBQzdFLENBQUM7WUFDTCxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLFlBQVksQ0FBQyxFQUFTO1FBQzFCLDBDQUEwQztRQUMxQyxFQUFFLENBQUMsTUFBTSxHQUFDLFlBQVksQ0FBQyxHQUFHLENBQUE7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDO1FBRWpDLElBQUksRUFBRSxHQUFHLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLFlBQVksR0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUMsS0FBSyxDQUFDO1lBQzdCLHFFQUFxRTtZQUNyRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyQixJQUFJLENBQUMsaUJBQWlCLEdBQUMsSUFBSSxDQUFDO1FBQzVCLHdFQUF3RTtJQUM1RSxDQUFDO0lBRUssT0FBTztRQUNiLDJCQUEyQjtRQUMzQixJQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBQyxDQUFDO1lBQ3ZCLElBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNuQixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUMxQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFDLEtBQUssQ0FBQTtZQUM1Qix1Q0FBdUM7UUFDekMsQ0FBQztRQUVELElBQUksR0FBRyxHQUFrQixJQUFJLENBQUM7UUFFOUIsZ0RBQWdEO1FBRWhELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3hCLCtDQUErQztRQUUvQyxJQUFJLENBQUMsR0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRWxHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckIsZ0RBQWdEO2dCQUNoRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNwQywwQ0FBMEM7b0JBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3JCLEdBQUcsR0FBRyxFQUFFLENBQUM7b0JBQ1QsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxxQ0FBcUM7Z0JBQ3JDLHFCQUFxQjtnQkFDckIsNEVBQTRFO2dCQUM1RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzNCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JCLGdEQUFnRDtvQkFDaEQsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbkMsZ0RBQWdEO3dCQUNoRCwrQ0FBK0M7d0JBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3JCLEdBQUcsR0FBRyxFQUFFLENBQUM7d0JBQ1QsTUFBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUcsQ0FBQyxJQUFFLENBQUMsRUFBQyxDQUFDO1lBQ1AsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUMsY0FBYyxDQUFDLElBQUksQ0FBQTtRQUNqQyxDQUFDO1FBQ0QsSUFBSSxFQUFFLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFQyxXQUFXLENBQUMsRUFBVTtRQUNsQixJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ0wsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuICAgIGltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbiAgICBpbXBvcnQgeyB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcblxyXG4gICAgLy8gc3RhdGUgb2YgYW4gdXBsb2FkXHJcbiAgICBleHBvcnQgZW51bSBVcGxvYWRTdGF0dXMge0lETEUgPSAxLCBVUExPQURJTkcgPSAyLCAgQUJPUlQgPSAzLCBET05FID0gMCwgRVJSID0gLTF9XHJcblxyXG4gICAgLy8gc3RhdGUgb2YgdGhlIHVwbG9hZGVyXHJcbiAgICAvLyBUUllfVVBMT0FESU5HIGlzIHVwbG9hZGluZyBzdGF0ZSBhZnRlciBhbiBlcnJvciAoZm9yIGV4YW1wbGUgaWYgZGlzY29ubmVjdGVkIGZyb20gc2VydmVyKVxyXG4gICAgZXhwb3J0IGVudW0gVXBsb2FkZXJTdGF0dXMgeyBET05FID0gMCwgVVBMT0FESU5HID0gMSwgVFJZX1VQTE9BRElORyA9IDIsTkVYVCA9IDMsIEVSUiA9IC0xfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50IHtcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9zaXplUXVldWVkOm51bWJlcjtcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9zaXplRG9uZTpudW1iZXI7XHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfc3RhdHVzOiBVcGxvYWRlclN0YXR1cztcclxuXHJcblxyXG4gICAgICAgIGNvbnN0cnVjdG9yKHNpemVRdWV1ZWQ6IG51bWJlciwgc2l6ZURvbmU6IG51bWJlciwgc3RhdHVzOiBVcGxvYWRlclN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLl9zaXplUXVldWVkID0gc2l6ZVF1ZXVlZDtcclxuICAgICAgICAgICAgdGhpcy5fc2l6ZURvbmUgPSBzaXplRG9uZTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHNpemVRdWV1ZWQoKTpudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZVF1ZXVlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBzaXplRG9uZSgpOm51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplRG9uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNpemVJblF1ZXVlKCl7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZVF1ZXVlZC10aGlzLl9zaXplRG9uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBzdGF0dXMoKTogVXBsb2FkZXJTdGF0dXMge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdXBsb2FkRG9uZSgpOiBib29sZWFuIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9zaXplRG9uZSA+PSB0aGlzLl9zaXplUXVldWVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBlcmNlbnREb25lKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zaXplUXVldWVkID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEgcXVldWVkLCB3ZSBhcmUgXCJkb25lXCJcclxuICAgICAgICAgICAgICAgIHJldHVybiAxMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHBlcmNlbnQgPSBNYXRoLmZsb29yKHRoaXMuX3NpemVEb25lICogMTAwIC8gdGhpcy5fc2l6ZVF1ZXVlZCk7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJVcGxvYWQgc3RhdHVzOiBxdWV1ZWQ6IFwiK3RoaXMuX3NpemVRdWV1ZWQrXCIsIGRvbmU6IFwiK3RoaXMuX3NpemVEb25lK1wiLCBcIitwZXJjZW50K1wiJVwiKVxyXG4gICAgICAgICAgICByZXR1cm4gcGVyY2VudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBVcGxvYWQge1xyXG5cclxuICAgICAgZ2V0IHNlcnZlclBlcnNpc3RhYmxlKCk6IFNlcnZlclBlcnNpc3RhYmxlIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZlclBlcnNpc3RhYmxlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2RhdGE6QmxvYnxGb3JtRGF0YTtcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF91cmw6c3RyaW5nO1xyXG5cclxuICAgICAgICBzdGF0dXM6IFVwbG9hZFN0YXR1cztcclxuICAgICAgICBvbkRvbmU6KCh1cGxvYWQ6VXBsb2FkKT0+dm9pZCkgfCBudWxsPW51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0cnVjdG9yKGJsb2I6QmxvYnxGb3JtRGF0YSwgdXJsOnN0cmluZyxwcml2YXRlIF9zZXJ2ZXJQZXJzaXN0YWJsZTpTZXJ2ZXJQZXJzaXN0YWJsZXxudWxsPW51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGJsb2I7XHJcbiAgICAgICAgICAgIHRoaXMuX3VybCA9IHVybDtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBVcGxvYWRTdGF0dXMuSURMRTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCB1cmwoKTpzdHJpbmcge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IGRhdGEoKTpCbG9ifEZvcm1EYXRhIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb25lKCl7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzPVVwbG9hZFN0YXR1cy5ET05FO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTaW5nbGUgdXBsb2FkIGRvbmUuXCIpO1xyXG4gICAgICAgICAgICBpZih0aGlzLl9zZXJ2ZXJQZXJzaXN0YWJsZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3NlcnZlclBlcnNpc3RhYmxlLnNlcnZlclBlcnNpc3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2luZ2xlIHVwbG9hZCBzZXQgc2VydmVyIHBlcnNpc3RlZDogXCIrdGhpcy5zZXJ2ZXJQZXJzaXN0YWJsZSk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNlcnZlciBwZXJzaXN0YWJsZSBub3Qgc2V0LlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLm9uRG9uZSl7XHJcbiAgICAgICAgICAgICAgdGhpcy5vbkRvbmUodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIHB1YmxpYyB0b1N0cmluZyA9ICgpIDogc3RyaW5nID0+IHtcclxuICAgICAgICBsZXQgcz1gVXBsb2FkOiBTdGF0dXM6ICR7dGhpcy5zdGF0dXN9LCBVUkw6ICR7dGhpcy5fdXJsfWA7XHJcbiAgICAgICAgaWYodGhpcy5fZGF0YSBpbnN0YW5jZW9mIEJsb2Ipe1xyXG4gICAgICAgICAgICBzPXMrYCwgU2l6ZTogJHt0aGlzLl9kYXRhLnNpemV9YDtcclxuICAgICAgICB9ZWxzZSBpZih0aGlzLl9kYXRhIGluc3RhbmNlb2YgIEZvcm1EYXRhKXtcclxuICAgICAgICAgICAvLyBUT0RPIChpdGVyYXRlIHRocm91Z2ggcGFydHMgPz8pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFVwbG9hZEhvbGRlcntcclxuXHJcbiAgICAgIG9uVXBsb2FkU2V0OigodXBsb2FkOlVwbG9hZCk9PnZvaWQpfG51bGw9bnVsbDtcclxuXHJcbiAgICAgIGdldCB1cGxvYWQoKTogVXBsb2FkIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2V0IHVwbG9hZCh2YWx1ZTogVXBsb2FkIHwgbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3VwbG9hZCA9IHZhbHVlO1xyXG4gICAgICAgIGlmKHRoaXMuX3VwbG9hZCAmJiB0aGlzLm9uVXBsb2FkU2V0KXtcclxuICAgICAgICAgIHRoaXMub25VcGxvYWRTZXQodGhpcy5fdXBsb2FkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcHJpdmF0ZSBfdXBsb2FkOlVwbG9hZHxudWxsPW51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFVwbG9hZFNldHtcclxuXHJcbiAgICAgIHByaXZhdGUgdXBsb2FkczogQXJyYXk8VXBsb2FkfFVwbG9hZEhvbGRlcj49bmV3IEFycmF5PFVwbG9hZHxVcGxvYWRIb2xkZXI+KCk7XHJcbiAgICAgIHByaXZhdGUgX2NvbXBsZXRlPWZhbHNlO1xyXG5cclxuICAgICAgcHJpdmF0ZSBfb25Eb25lOigodXBsb2FkU2V0OlVwbG9hZFNldCk9PnZvaWQpfG51bGw9bnVsbDtcclxuXHJcbiAgICAgIGFkZCh1cGxvYWQ6VXBsb2FkfFVwbG9hZEhvbGRlcil7XHJcbiAgICAgICAgaWYodGhpcy5fY29tcGxldGUpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCB1cGxvYWQgdG8gdXBsb2FkIHNldC4gVXBsb2FkIHNldCBhbHJlYWR5IGNvbXBsZXRlLicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHVwbG9hZCBpbnN0YW5jZW9mIFVwbG9hZEhvbGRlcil7XHJcbiAgICAgICAgICB1cGxvYWQub25VcGxvYWRTZXQ9KHVwbCk9PntcclxuICAgICAgICAgICAgdXBsLm9uRG9uZT0oKT0+e1xyXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tVcGxvYWRTdGF0ZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrVXBsb2FkU3RhdGVzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBsb2Fkcy5wdXNoKHVwbG9hZCk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb21wbGV0ZSgpe1xyXG4gICAgICAgIC8vIE1hcmsgc2V0IGFzIGNvbXBsZXRlXHJcbiAgICAgICAgdGhpcy5fY29tcGxldGU9dHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGxpc3RlbmVycyB0byBlYWNoIHVwbG9hZFxyXG4gICAgICAgIGZvcihsZXQgdXBsIG9mIHRoaXMudXBsb2Fkcyl7XHJcbiAgICAgICAgICBpZih1cGwgaW5zdGFuY2VvZiBVcGxvYWQpIHtcclxuICAgICAgICAgICAgdXBsLm9uRG9uZSA9ICh1cGw6IFVwbG9hZCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tVcGxvYWRTdGF0ZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2UgaWYodXBsIGluc3RhbmNlb2YgVXBsb2FkSG9sZGVyKXtcclxuICAgICAgICAgICAgaWYodXBsLnVwbG9hZCl7XHJcbiAgICAgICAgICAgICAgdXBsLnVwbG9hZC5vbkRvbmUgPSAodXBsOiBVcGxvYWQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tVcGxvYWRTdGF0ZXMoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGltbWVkaWF0ZWx5IGlmIGFscmVhZHkgZG9uZVxyXG4gICAgICAgIHRoaXMuY2hlY2tVcGxvYWRTdGF0ZXMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2V0IG9uRG9uZSh2YWx1ZTogKCh1cGxvYWRTZXQ6IFVwbG9hZFNldCkgPT4gdm9pZCkgfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fb25Eb25lID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5jaGVja1VwbG9hZFN0YXRlcygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwcml2YXRlIGNoZWNrVXBsb2FkU3RhdGVzKCl7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2hlY2sgdXBsb2FkIHN0YXRlLi4uXCIpXHJcbiAgICAgICAgaWYodGhpcy5fY29tcGxldGUpe1xyXG5cclxuICAgICAgICAgIGlmKHRoaXMuX29uRG9uZSkge1xyXG4gICAgICAgICAgICBmb3IobGV0IHVwbCBvZiB0aGlzLnVwbG9hZHMpe1xyXG4gICAgICAgICAgICAgIGlmKHVwbCBpbnN0YW5jZW9mIFVwbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFVwbG9hZFN0YXR1cy5ET05FICE9PSB1cGwuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIEF0IGxlYXN0IHRoaXMgdXBsb2FkIGlzIG5vdCB5ZXQgZG9uZVxyXG4gICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nXHJcbiAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNoZWNrIHVwbG9hZCBzdGF0ZTogVXBsb2FkIG5vdCBkb25lLlwiKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2UgaWYodXBsIGluc3RhbmNlb2YgVXBsb2FkSG9sZGVyKXtcclxuICAgICAgICAgICAgICAgIGlmKHVwbC51cGxvYWQpe1xyXG4gICAgICAgICAgICAgICAgICBpZiAoVXBsb2FkU3RhdHVzLkRPTkUgIT09IHVwbC51cGxvYWQuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgbGVhc3QgdGhpcyB1cGxvYWQgaXMgbm90IHlldCBkb25lXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNoZWNrIHVwbG9hZCBzdGF0ZTogVXBsb2FkIChob2xkZXIpIG5vdCBkb25lLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgdXBsb2FkIGlzIG5vdCB5ZXQgc2V0XHJcbiAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNoZWNrIHVwbG9hZCBzdGF0ZTogVXBsb2FkIChob2xkZXIpOiB1cGxvYWQgbm90IHlldCBzZXQuXCIpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2V0IGlzIGNvbXBsZXRlIGFuZCBhbGwgdXBsb2FkIHBhcnRzIGFyZSBkb25lLCBjYWxsIGRvbmUgY2FsbGJhY2tcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2hlY2sgdXBsb2FkIHN0YXRlOiBBbGwgZG9uZS5cIilcclxuICAgICAgICAgICAgdGhpcy5fb25Eb25lKHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2VydmVyUGVyc2lzdGFibGV7XHJcbiAgICAgICAgc2VydmVyUGVyc2lzdGVkOmJvb2xlYW47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFVwbG9hZGVyIHtcclxuICAgICAgICBQT1NUX01JTl9USU1FT1VUID0gMTIwMDAwOyAvLyAybWluIHBsdXMgLi4uXHJcbiAgICAgICAgUE9TVF9USU1FT1VUX1BFUl9LQiA9IDEwMDA7ICAvLyAuLi4gMXMgcGVyIGtCXHJcblxyXG4gICAgICAgIFJFVFJZX0RFTEFZOiBudW1iZXIgPSAzMDAwMDsgLy8gcmV0cnkgZXZlcnkgMzBzXHJcbiAgICAgICAgREVCVUdfREVMQVk6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy9ERUJVR19ERUxBWTpudW1iZXI9MDtcclxuICAgICAgICBwcml2YXRlIHN0YXR1czogVXBsb2FkZXJTdGF0dXMgPSBVcGxvYWRlclN0YXR1cy5ET05FO1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcXVlOiBBcnJheTxVcGxvYWQ+O1xyXG4gICAgICAgIGxpc3RlbmVyOiAoKHVlOiBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHByaXZhdGUgX3NpemVRdWV1ZWQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgcHJpdmF0ZSBfc2l6ZURvbmU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIHByaXZhdGUgcmV0cnlUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICBwcml2YXRlIHJldHJ5VGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIHByaXZhdGUgdGU6VGV4dEVuY29kZXI9bmV3IFRleHRFbmNvZGVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSB3aXRoQ3JlZGVudGlhbHM6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnF1ZSA9IG5ldyBBcnJheTxVcGxvYWQ+KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIGRhdGFTaXplKGR0OkJsb2J8Rm9ybURhdGEpe1xyXG4gICAgICAgICAgICBsZXQgc2k9MDtcclxuICAgICAgICAgICAgaWYoZHQgaW5zdGFuY2VvZiBCbG9iKXtcclxuICAgICAgICAgICAgICAgIHNpPWR0LnNpemU7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGR0IGluc3RhbmNlb2YgIEZvcm1EYXRhKXtcclxuICAgICAgICAgICAgICAgIGR0LmZvckVhY2goKHYsayk9PntcclxuICAgICAgICAgICAgICAgICAgICBpZih2IGluc3RhbmNlb2YgRmlsZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpKz12LnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHYgPT09J3N0cmluZycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmNvZGUgdG8gVVRGLTggdG8gZ2V0IHVwbG9hZCBzaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpKz0gdGhpcy50ZS5lbmNvZGUoKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc2k7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlICB1cGxvYWREb25lKHVsOlVwbG9hZCkge1xyXG5cclxuICAgICAgICAgICAgdWwuZG9uZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIHVwbG9hZCBmcm9tIHF1ZXVlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5xdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZVtpXSA9PT0gdWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCwgcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWUuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1bFNpemUgPSB0aGlzLmRhdGFTaXplKHVsLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NpemVEb25lICs9IHVsU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzZXQgdG8gZG9uZSBmb3Igbm93Li4uXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuTkVYVDtcclxuICAgICAgICAgICAgLy8gY29udGludWVcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIHN0YXJ0VXBsb2FkKHVsOlVwbG9hZCkge1xyXG5cclxuICAgICAgICAgICAgdWwuc3RhdHVzID0gVXBsb2FkU3RhdHVzLlVQTE9BRElORztcclxuICAgICAgICAgICAgaWYgKFVwbG9hZGVyU3RhdHVzLkVSUiA9PT0gdGhpcy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuVFJZX1VQTE9BRElORztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuVVBMT0FESU5HO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZFNpemU9dGhpcy5kYXRhU2l6ZSh1bC5kYXRhKTtcclxuICAgICAgICAgICAgbGV0IHRpbWVvdXRGb3JEYXRhU2l6ZT1kU2l6ZSp0aGlzLlBPU1RfVElNRU9VVF9QRVJfS0IvMTAwMDtcclxuICAgICAgICAgICAgbGV0IHRpbWVvVmFsOm51bWJlcj1NYXRoLnJvdW5kKHRoaXMuUE9TVF9NSU5fVElNRU9VVCt0aW1lb3V0Rm9yRGF0YVNpemUpXHJcbiAgICAgICAgICAgIC8vIHBpcGUodGltZW91dCgpKSBpcyBub3QgdGhlIHNhbWUgYXMgeGhyLnRpbWVvdXRcclxuXHJcbiAgICAgICAgICBsZXQgdXBsb2FkZWRVcGxvYWQ6VXBsb2FkfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUG9zdCB1cGxvYWQ6IFwiK3VsKVxyXG4gICAgICAgICAgICB0aGlzLmh0dHAucG9zdCh1bC51cmwsdWwuZGF0YSx7d2l0aENyZWRlbnRpYWxzOnRoaXMud2l0aENyZWRlbnRpYWxzfSkucGlwZSh0aW1lb3V0KHRpbWVvVmFsKSkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IChkYXRhKT0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWRlZFVwbG9hZCA9IHVsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ05leHQgbWV0aG9kIGNhbGxlZCBmb3IgdXBsb2FkOiAnK3VwbG9hZGVkVXBsb2FkKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAsIGVycm9yOihlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjbGllbnQtc2lkZSBvciBuZXR3b3JrIGVycm9yIG9jY3VycmVkLiBIYW5kbGUgaXQgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVcGxvYWQgZXJyb3Igb2NjdXJyZWQ6JywgZXJyLmVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhY2tlbmQgcmV0dXJuZWQgYW4gdW5zdWNjZXNzZnVsIHJlc3BvbnNlIGNvZGUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVzcG9uc2UgYm9keSBtYXkgY29udGFpbiBjbHVlcyBhcyB0byB3aGF0IHdlbnQgd3JvbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBVcGxvYWQgZXJyb3I6IFNlcnZlciByZXR1cm5lZCBjb2RlICR7ZXJyLnN0YXR1c31gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcih1bClcclxuICAgICAgICAgICAgICAgICAgICB9LCBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ1VwbG9hZCBjb21wbGV0ZSBtZXRob2QgY2FsbGVkJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwbG9hZGVkVXBsb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ERUJVR19ERUxBWSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRG9uZSh1bCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5ERUJVR19ERUxBWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRG9uZSh1cGxvYWRlZFVwbG9hZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwbG9hZCBwb3N0IGNvbXBsZXRlLCBidXQgdXBsb2FkIG5vdCBzZXQgaW4gbmV4dCBtZXRob2QhJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBwcm9jZXNzRXJyb3IodWw6VXBsb2FkKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlByb2Nlc3MgdXBsb2FkIGVycm9yLi4uXCIpXHJcbiAgICAgICAgICAgIHVsLnN0YXR1cz1VcGxvYWRTdGF0dXMuRVJSXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuRVJSO1xyXG5cclxuICAgICAgICAgICAgbGV0IHVlID0gbmV3IFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQodGhpcy5fc2l6ZVF1ZXVlZCwgdGhpcy5fc2l6ZURvbmUsIHRoaXMuc3RhdHVzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIodWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgcmV0cnkgdGltZXJcclxuICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVySWQ9d2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz1mYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZCByZXRyeSB0aW1lciBleHBpcmVkLiBDb250aW51ZSBwcm9jZXNzaW5nLi4uXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MoKTtcclxuICAgICAgICAgICAgfSwgdGhpcy5SRVRSWV9ERUxBWSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJldHJ5VGltZXJSdW5uaW5nPXRydWU7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0YXJ0ZWQgdXBsb2FkIHJldHJ5IHRpbWVyIFwiK3RoaXMuUkVUUllfREVMQVkrXCJtcyAuLi5cIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICBwcml2YXRlIHByb2Nlc3MoKSB7XHJcbiAgICAgICAgLy8gY2xlYXIgcmV0cnkgdGltZXIgaWYgc2V0XHJcbiAgICAgICAgaWYodGhpcy5yZXRyeVRpbWVyUnVubmluZyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMucmV0cnlUaW1lcklkKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmV0cnlUaW1lcklkKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJldHJ5VGltZXJSdW5uaW5nPWZhbHNlXHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJDbGVhcmVkIHJldHJ5IHRpbWVyLlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHB1bDogVXBsb2FkIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZGVyIHN0YXR1czogXCIrdGhpcy5zdGF0dXMpXHJcblxyXG4gICAgICAgIGxldCBzID0gdGhpcy5xdWUubGVuZ3RoO1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhzK1wiIHVwbG9hZHMgYXJlIGluIHRoZSBxdWV1ZS5cIilcclxuXHJcbiAgICAgICAgaWYgKHM+MCAmJiBVcGxvYWRlclN0YXR1cy5VUExPQURJTkcgIT0gdGhpcy5zdGF0dXMgJiYgVXBsb2FkZXJTdGF0dXMuVFJZX1VQTE9BRElORyAhPSB0aGlzLnN0YXR1cykge1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgczsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB1bCA9IHRoaXMucXVlW2ldO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVXBsb2FkIFwiK3VsK1wiIHN0YXR1czpcIit1bC5zdGF0dXMpXHJcbiAgICAgICAgICAgIGlmICh1bC5zdGF0dXMgPT09IFVwbG9hZFN0YXR1cy5JRExFKSB7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCBcIit1bCtcIiBzdGFydFVwbG9hZFwiKVxyXG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRVcGxvYWQodWwpO1xyXG4gICAgICAgICAgICAgIHB1bCA9IHVsO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXB1bCkge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiQ2hlY2sgRVJSIHVwbG9hZHMuLi5cIilcclxuICAgICAgICAgICAgLy8gbm93IGZhaWxlZCB1cGxvYWRzXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk5vIHJlZ3VsYXIgdXBsb2FkIGZvdW5kLiBMb29raW5nIGZvciBlcnJvciBzdGF0ZSB1cGxvYWRzLlwiKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHM7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxldCB1bCA9IHRoaXMucXVlW2ldO1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJVcGxvYWQgXCIrdWwrXCIgc3RhdHVzOlwiK3VsLnN0YXR1cylcclxuICAgICAgICAgICAgICBpZiAodWwuc3RhdHVzID09PSBVcGxvYWRTdGF0dXMuRVJSKSB7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVXBsb2FkIChFUlIpIFwiK3VsK1wiIHN0YXJ0VXBsb2FkXCIpXHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdGFydCBlcnJvciBzdGF0ZSB1cGxvYWQgXCIrdWwpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VXBsb2FkKHVsKTtcclxuICAgICAgICAgICAgICAgIHB1bCA9IHVsO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHM9PTApe1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiVXBsb2FkIGRvbmUuXCIpXHJcbiAgICAgICAgICB0aGlzLnN0YXR1cz1VcGxvYWRlclN0YXR1cy5ET05FXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB1ZSA9IG5ldyBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KHRoaXMuX3NpemVRdWV1ZWQsIHRoaXMuX3NpemVEb25lLCB0aGlzLnN0YXR1cyk7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgIHRoaXMubGlzdGVuZXIodWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgICBxdWV1ZVVwbG9hZCh1bDogVXBsb2FkKSB7XHJcbiAgICAgICAgICAgIGlmICh1bCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHVsU2l6ZSA9IHRoaXMuZGF0YVNpemUodWwuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZS5wdXNoKHVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NpemVRdWV1ZWQgKz0gdWxTaXplO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuIl19
@@ -1,65 +0,0 @@
1
- import { SprDb } from "./db/inddb";
2
- import { Observable } from "rxjs";
3
- import { PersistentAudioStorageTarget } from "./audio/inddb_audio_buffer";
4
- export class RecorderComponent {
5
- constructor(uploader) {
6
- this.uploader = uploader;
7
- this.dataSaved = true;
8
- this._persistentAudioStorageTarget = null;
9
- }
10
- printStorageInfos() {
11
- // Safari seems not to support the estimate function.
12
- if (navigator.storage && navigator.storage.estimate instanceof Function) {
13
- navigator.storage.estimate().then((se) => {
14
- console.info("Estimated storage usage: " + se.usage + ", quota: " + se.quota);
15
- }).catch((err) => "Could not get get storage infos: " + err.message);
16
- }
17
- else {
18
- console.info("User agent does not support storage manager estimate function.");
19
- }
20
- }
21
- prepare(persistentAudioStorage = false) {
22
- if (persistentAudioStorage) {
23
- this.printStorageInfos();
24
- }
25
- return new Observable(subscriber => {
26
- if (persistentAudioStorage) {
27
- SprDb.prepare().subscribe({
28
- next: (db) => {
29
- this._persistentAudioStorageTarget = new PersistentAudioStorageTarget(db, SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
30
- //let delCnt=0;
31
- this._persistentAudioStorageTarget.deleteAll().subscribe({
32
- next: () => {
33
- //delCnt++;
34
- subscriber.next();
35
- },
36
- complete: () => {
37
- //console.info('Storage info after deletion of all ('+delCnt+') entries:');
38
- console.info('Persistent audio storage object store cleared.');
39
- this.printStorageInfos();
40
- subscriber.complete();
41
- },
42
- error: (err) => {
43
- subscriber.error(err);
44
- }
45
- });
46
- window.addEventListener('beforeunload', (e) => {
47
- if (this._persistentAudioStorageTarget) {
48
- // Delete on page leave. Di not register callbacks to prevent page leave blocking
49
- this._persistentAudioStorageTarget.deleteAll().subscribe();
50
- }
51
- });
52
- },
53
- error: (err) => {
54
- subscriber.error(err);
55
- }
56
- });
57
- }
58
- else {
59
- subscriber.next();
60
- subscriber.complete();
61
- }
62
- });
63
- }
64
- }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkZXJfY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3JlY29yZGVyX2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFReEUsTUFBTSxPQUFnQixpQkFBaUI7SUFLbkMsWUFBc0IsUUFBK0I7UUFBL0IsYUFBUSxHQUFSLFFBQVEsQ0FBdUI7UUFIckQsY0FBUyxHQUFZLElBQUksQ0FBQztRQUVoQixrQ0FBNkIsR0FBbUMsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFekQsaUJBQWlCO1FBQ2YscURBQXFEO1FBQ3JELElBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsWUFBWSxRQUFRLEVBQUUsQ0FBQztZQUN2RSxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsV0FBVyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLG1DQUFtQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RSxDQUFDO2FBQUksQ0FBQztZQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNqRixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxzQkFBc0IsR0FBQyxLQUFLO1FBRWhDLElBQUcsc0JBQXNCLEVBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNqQyxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7b0JBQ3hCLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO3dCQUNYLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLDRCQUE0QixDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQzt3QkFDeEgsZUFBZTt3QkFDZixJQUFJLENBQUMsNkJBQTZCLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDOzRCQUN2RCxJQUFJLEVBQUMsR0FBRSxFQUFFO2dDQUNQLFdBQVc7Z0NBQ1gsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUNwQixDQUFDOzRCQUNELFFBQVEsRUFBQyxHQUFFLEVBQUU7Z0NBQ1gsMkVBQTJFO2dDQUMzRSxPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7Z0NBQy9ELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dDQUN6QixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQ3hCLENBQUM7NEJBQ0QsS0FBSyxFQUFDLENBQUMsR0FBRyxFQUFDLEVBQUU7Z0NBQ1gsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDeEIsQ0FBQzt5QkFFRixDQUFDLENBQUM7d0JBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFFOzRCQUN4QyxJQUFHLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dDQUNwQyxpRkFBaUY7Z0NBQ2pGLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDL0QsQ0FBQzt3QkFDTCxDQUFDLENBQUMsQ0FBQztvQkFFTCxDQUFDO29CQUNELEtBQUssRUFBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO3dCQUNYLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3hCLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBSSxDQUFDO2dCQUNKLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNGLENBQUM7Q0FJSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U3BlZWNoUmVjb3JkZXJVcGxvYWRlcn0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTcHJEYn0gZnJvbSBcIi4vZGIvaW5kZGJcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXR9IGZyb20gXCIuL2F1ZGlvL2luZGRiX2F1ZGlvX2J1ZmZlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHlTdGF0ZVByb3ZpZGVyIHtcclxuICAgIHJlYWR5KCk6Ym9vbGVhbjtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWNvcmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIFJlYWR5U3RhdGVQcm92aWRlcntcclxuXHJcbiAgICBkYXRhU2F2ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHByb3RlY3RlZCBfcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldDpQZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0fG51bGw9bnVsbDtcclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB1cGxvYWRlcjpTcGVlY2hSZWNvcmRlclVwbG9hZGVyKSB7fVxyXG5cclxuICAgIHByaW50U3RvcmFnZUluZm9zKCl7XHJcbiAgICAgIC8vIFNhZmFyaSBzZWVtcyBub3QgdG8gc3VwcG9ydCB0aGUgZXN0aW1hdGUgZnVuY3Rpb24uXHJcbiAgICAgIGlmKG5hdmlnYXRvci5zdG9yYWdlICYmIG5hdmlnYXRvci5zdG9yYWdlLmVzdGltYXRlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgICBuYXZpZ2F0b3Iuc3RvcmFnZS5lc3RpbWF0ZSgpLnRoZW4oKHNlKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJFc3RpbWF0ZWQgc3RvcmFnZSB1c2FnZTogXCIgKyBzZS51c2FnZSArIFwiLCBxdW90YTogXCIgKyBzZS5xdW90YSk7XHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4gXCJDb3VsZCBub3QgZ2V0IGdldCBzdG9yYWdlIGluZm9zOiBcIiArIGVyci5tZXNzYWdlKTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKFwiVXNlciBhZ2VudCBkb2VzIG5vdCBzdXBwb3J0IHN0b3JhZ2UgbWFuYWdlciBlc3RpbWF0ZSBmdW5jdGlvbi5cIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcmVwYXJlKHBlcnNpc3RlbnRBdWRpb1N0b3JhZ2U9ZmFsc2UpOk9ic2VydmFibGU8dm9pZD57XHJcblxyXG4gICAgICAgIGlmKHBlcnNpc3RlbnRBdWRpb1N0b3JhZ2Upe1xyXG4gICAgICAgICAgICB0aGlzLnByaW50U3RvcmFnZUluZm9zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7XHJcbiAgICAgICAgaWYgKHBlcnNpc3RlbnRBdWRpb1N0b3JhZ2UpIHtcclxuICAgICAgICAgIFNwckRiLnByZXBhcmUoKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAoZGIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0ID0gbmV3IFBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQoZGIsIFNwckRiLlJFQ09SRElOR19GSUxFX0NBQ0hFX09CSkVDVF9TVE9SRV9OQU1FKTtcclxuICAgICAgICAgICAgICAvL2xldCBkZWxDbnQ9MDtcclxuICAgICAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0LmRlbGV0ZUFsbCgpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OigpPT57XHJcbiAgICAgICAgICAgICAgICAgIC8vZGVsQ250Kys7XHJcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOigpPT57XHJcbiAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5pbmZvKCdTdG9yYWdlIGluZm8gYWZ0ZXIgZGVsZXRpb24gb2YgYWxsICgnK2RlbENudCsnKSBlbnRyaWVzOicpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1BlcnNpc3RlbnQgYXVkaW8gc3RvcmFnZSBvYmplY3Qgc3RvcmUgY2xlYXJlZC4nKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wcmludFN0b3JhZ2VJbmZvcygpO1xyXG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6KGVycik9PntcclxuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsKGUpPT57XHJcbiAgICAgICAgICAgICAgICAgIGlmKHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBvbiBwYWdlIGxlYXZlLiBEaSBub3QgcmVnaXN0ZXIgY2FsbGJhY2tzIHRvIHByZXZlbnQgcGFnZSBsZWF2ZSBibG9ja2luZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldC5kZWxldGVBbGwoKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6KGVycik9PntcclxuICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IHJlYWR5KCk6Ym9vbGVhbjtcclxuICAgIGFic3RyYWN0IGdldCBzY3JlZW5Mb2NrZWQoKTpib29sZWFuO1xyXG59XHJcblxyXG4iXX0=
@@ -1,54 +0,0 @@
1
- export var ConstraintType;
2
- (function (ConstraintType) {
3
- ConstraintType["Exact"] = "EXACT";
4
- ConstraintType["Ideal"] = "IDEAL";
5
- })(ConstraintType || (ConstraintType = {}));
6
- ;
7
- export var Platform;
8
- (function (Platform) {
9
- Platform["Linux"] = "LINUX";
10
- Platform["macOS"] = "MACOS";
11
- Platform["Windows"] = "WINDOWS";
12
- Platform["Android"] = "ANDROID";
13
- })(Platform || (Platform = {}));
14
- export var BrowserBase;
15
- (function (BrowserBase) {
16
- BrowserBase["Chromium"] = "CHROMIUM";
17
- })(BrowserBase || (BrowserBase = {}));
18
- ;
19
- export var Browser;
20
- (function (Browser) {
21
- Browser["Firefox"] = "FIREFOX";
22
- Browser["Chromium"] = "CHROMIUM";
23
- Browser["Chrome"] = "CHROME";
24
- Browser["Edge"] = "EDGE";
25
- Browser["Opera"] = "OPERA";
26
- })(Browser || (Browser = {}));
27
- export var AudioStorageType;
28
- (function (AudioStorageType) {
29
- AudioStorageType["MEM_ENTIRE"] = "MEM_ENTIRE";
30
- AudioStorageType["MEM_CHUNKED"] = "MEM_CHUNKED";
31
- AudioStorageType["DB_CHUNKED"] = "DB_CHUNKED";
32
- AudioStorageType["NET_CHUNKED"] = "NET_CHUNKED";
33
- AudioStorageType["MEM_ENTIRE_AUTO_NET_CHUNKED"] = "MEM_ENTIRE_AUTO_NET_CHUNKED";
34
- AudioStorageType["MEM_CHUNKED_AUTO_NET_CHUNKED"] = "MEM_CHUNKED_AUTO_NET_CHUNKED";
35
- })(AudioStorageType || (AudioStorageType = {}));
36
- export var AudioStorageFormatEncoding;
37
- (function (AudioStorageFormatEncoding) {
38
- AudioStorageFormatEncoding["PCM_SIGNED"] = "PCM_SIGNED";
39
- AudioStorageFormatEncoding["PCM_FLOAT"] = "PCM_FLOAT";
40
- })(AudioStorageFormatEncoding || (AudioStorageFormatEncoding = {}));
41
- export class ProjectUtil {
42
- static { this.DEFAULT_AUDIO_CHANNEL_COUNT = 2; }
43
- static audioChannelCount(project) {
44
- let chs = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
45
- if (project.mediaCaptureFormat) {
46
- chs = project.mediaCaptureFormat.audioChannelCount;
47
- }
48
- else if (project.audioFormat) {
49
- chs = project.audioFormat.channels;
50
- }
51
- return chs;
52
- }
53
- }
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9wcm9qZWN0L3Byb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE1BQU0sQ0FBTixJQUFZLGNBQTRDO0FBQXhELFdBQVksY0FBYztJQUFFLGlDQUFhLENBQUE7SUFBQyxpQ0FBYSxDQUFBO0FBQUEsQ0FBQyxFQUE1QyxjQUFjLEtBQWQsY0FBYyxRQUE4QjtBQUFBLENBQUM7QUFFekQsTUFBTSxDQUFOLElBQVksUUFBMEU7QUFBdEYsV0FBWSxRQUFRO0lBQUUsMkJBQWEsQ0FBQTtJQUFDLDJCQUFhLENBQUE7SUFBQywrQkFBaUIsQ0FBQTtJQUFDLCtCQUFpQixDQUFBO0FBQUEsQ0FBQyxFQUExRSxRQUFRLEtBQVIsUUFBUSxRQUFrRTtBQUN0RixNQUFNLENBQU4sSUFBWSxXQUFpQztBQUE3QyxXQUFZLFdBQVc7SUFBRSxvQ0FBbUIsQ0FBQTtBQUFBLENBQUMsRUFBakMsV0FBVyxLQUFYLFdBQVcsUUFBc0I7QUFBQSxDQUFDO0FBQzlDLE1BQU0sQ0FBTixJQUFZLE9BQXlGO0FBQXJHLFdBQVksT0FBTztJQUFFLDhCQUFpQixDQUFBO0lBQUMsZ0NBQW1CLENBQUE7SUFBQyw0QkFBZSxDQUFBO0lBQUMsd0JBQVcsQ0FBQTtJQUFDLDBCQUFhLENBQUE7QUFBQSxDQUFDLEVBQXpGLE9BQU8sS0FBUCxPQUFPLFFBQWtGO0FBRXJHLE1BQU0sQ0FBTixJQUFZLGdCQU9YO0FBUEQsV0FBWSxnQkFBZ0I7SUFDMUIsNkNBQXVCLENBQUE7SUFDdkIsK0NBQXlCLENBQUE7SUFDekIsNkNBQXVCLENBQUE7SUFDdkIsK0NBQXlCLENBQUE7SUFDekIsK0VBQXlELENBQUE7SUFDekQsaUZBQTJELENBQUE7QUFDN0QsQ0FBQyxFQVBXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFPM0I7QUFFRCxNQUFNLENBQU4sSUFBWSwwQkFHWDtBQUhELFdBQVksMEJBQTBCO0lBQ3BDLHVEQUF1QixDQUFBO0lBQ3ZCLHFEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR3JDO0FBK0JELE1BQU0sT0FBTyxXQUFXO2FBRUMsZ0NBQTJCLEdBQUMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFlO1FBQ3RDLElBQUksR0FBRyxHQUFDLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQztRQUNoRCxJQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBQyxDQUFDO1lBQzdCLEdBQUcsR0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUM7UUFDbkQsQ0FBQzthQUFLLElBQUcsT0FBTyxDQUFDLFdBQVcsRUFBQyxDQUFDO1lBQzVCLEdBQUcsR0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTYW1wbGVTaXplfSBmcm9tIFwiLi4vLi4vYXVkaW8vaW1wbC93YXZ3cml0ZXJcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9Gb3JtYXQge1xyXG4gIGNoYW5uZWxzOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFDYXB0dXJlRm9ybWF0IHtcclxuICBhdWRpb0NoYW5uZWxDb3VudDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvRGV2aWNlIHtcclxuICBuYW1lIDogc3RyaW5nLFxyXG4gIHBsYXliYWNrIDogYm9vbGVhbixcclxuICByZWdleCA6IGJvb2xlYW5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBlbnVtIENvbnN0cmFpbnRUeXBlIHtFeGFjdD0nRVhBQ1QnLElkZWFsPSdJREVBTCd9O1xyXG5cclxuZXhwb3J0IGVudW0gUGxhdGZvcm0ge0xpbnV4PSdMSU5VWCcsbWFjT1M9J01BQ09TJyxXaW5kb3dzPSdXSU5ET1dTJyxBbmRyb2lkPSdBTkRST0lEJ31cclxuZXhwb3J0IGVudW0gQnJvd3NlckJhc2Uge0Nocm9taXVtPSdDSFJPTUlVTSd9O1xyXG5leHBvcnQgZW51bSBCcm93c2VyIHtGaXJlZm94PSdGSVJFRk9YJyxDaHJvbWl1bT0nQ0hST01JVU0nLENocm9tZT0nQ0hST01FJyxFZGdlPSdFREdFJyxPcGVyYT0nT1BFUkEnfVxyXG5cclxuZXhwb3J0IGVudW0gQXVkaW9TdG9yYWdlVHlwZSB7XHJcbiAgTUVNX0VOVElSRT0nTUVNX0VOVElSRScsXHJcbiAgTUVNX0NIVU5LRUQ9J01FTV9DSFVOS0VEJyxcclxuICBEQl9DSFVOS0VEPSdEQl9DSFVOS0VEJyxcclxuICBORVRfQ0hVTktFRD0nTkVUX0NIVU5LRUQnLFxyXG4gIE1FTV9FTlRJUkVfQVVUT19ORVRfQ0hVTktFRD0nTUVNX0VOVElSRV9BVVRPX05FVF9DSFVOS0VEJyxcclxuICBNRU1fQ0hVTktFRF9BVVRPX05FVF9DSFVOS0VEPSdNRU1fQ0hVTktFRF9BVVRPX05FVF9DSFVOS0VEJ1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBBdWRpb1N0b3JhZ2VGb3JtYXRFbmNvZGluZyB7XHJcbiAgUENNX1NJR05FRD0nUENNX1NJR05FRCcsXHJcbiAgUENNX0ZMT0FUPSdQQ01fRkxPQVQnLFxyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZWRpYVN0b3JhZ2VGb3JtYXQge1xyXG4gIGF1ZGlvRW5jb2Rpbmc/OkF1ZGlvU3RvcmFnZUZvcm1hdEVuY29kaW5nO1xyXG4gIGF1ZGlvUENNc2FtcGxlU2l6ZUluQml0cz86IFNhbXBsZVNpemU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0dhaW5Db250cm9sQ29uZmlnIHtcclxuICB2YWx1ZTogYm9vbGVhbixcclxuICAvL2NvbnN0cmFpbnRUeXBlIDogQ29uc3RyYWludFR5cGUsXHJcbiAgcGxhdGZvcm06IFBsYXRmb3JtLFxyXG4gIC8vYnJvd3NlckJhc2U6QnJvd3NlckJhc2UsXHJcbiAgLy9icm93c2VyOkJyb3dzZXJcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0IHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcmVjb3JkaW5nRGV2aWNlV2FrZUxvY2s/OmJvb2xlYW4sXHJcbiAgYXVkaW9Gb3JtYXQ/OiBBdWRpb0Zvcm1hdCxcclxuICBtZWRpYUNhcHR1cmVGb3JtYXQ/OiBNZWRpYUNhcHR1cmVGb3JtYXQsXHJcbiAgYXV0b0dhaW5Db250cm9sQ29uZmlncz86QXJyYXk8QXV0b0dhaW5Db250cm9sQ29uZmlnPixcclxuICBhbGxvd0VjaG9DYW5jZWxsYXRpb24/OmJvb2xlYW4sXHJcbiAgYXVkaW9EZXZpY2VzPzogQXJyYXk8QXVkaW9EZXZpY2U+LFxyXG4gIGNodW5rZWRSZWNvcmRpbmc/OiBib29sZWFuLFxyXG4gIGNsaWVudEF1ZGlvU3RvcmFnZVR5cGU/OkF1ZGlvU3RvcmFnZVR5cGUsXHJcbiAgbWVkaWFTdG9yYWdlRm9ybWF0PzpNZWRpYVN0b3JhZ2VGb3JtYXQsXHJcbiAgc2hvd1Nlc3Npb25Db21wbGV0ZU1lc3NhZ2U/OmJvb2xlYW47XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgUHJvamVjdFV0aWwge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQVVESU9fQ0hBTk5FTF9DT1VOVD0yO1xyXG5cclxuICBzdGF0aWMgYXVkaW9DaGFubmVsQ291bnQocHJvamVjdDpQcm9qZWN0KTogbnVtYmVye1xyXG4gICAgbGV0IGNocz1Qcm9qZWN0VXRpbC5ERUZBVUxUX0FVRElPX0NIQU5ORUxfQ09VTlQ7XHJcbiAgICBpZihwcm9qZWN0Lm1lZGlhQ2FwdHVyZUZvcm1hdCl7XHJcbiAgICAgIGNocz1wcm9qZWN0Lm1lZGlhQ2FwdHVyZUZvcm1hdC5hdWRpb0NoYW5uZWxDb3VudDtcclxuICAgIH1lbHNlIGlmKHByb2plY3QuYXVkaW9Gb3JtYXQpe1xyXG4gICAgICBjaHM9cHJvamVjdC5hdWRpb0Zvcm1hdC5jaGFubmVscztcclxuICAgIH1cclxuICAgIHJldHVybiBjaHM7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG4iXX0=