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,64 +0,0 @@
1
- /**
2
- * Created by klausj on 17.06.2017.
3
- */
4
- import { Inject, Injectable } from '@angular/core';
5
- import { ApiType, SPEECHRECORDER_CONFIG } from "../../spr.config";
6
- import { UUID } from "../../utils/utils";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common/http";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "../../spr.config";
11
- export class ProjectService {
12
- static { this.PROJECT_API_CTX = 'project'; }
13
- constructor(http, platformLocation, config) {
14
- this.http = http;
15
- this.platformLocation = platformLocation;
16
- this.config = config;
17
- this.withCredentials = false;
18
- console.log("Base Href: " + platformLocation.getBaseHrefFromDOM());
19
- let apiEndPoint = '';
20
- if (config && config.apiEndPoint) {
21
- apiEndPoint = config.apiEndPoint;
22
- }
23
- if (apiEndPoint !== '') {
24
- apiEndPoint = apiEndPoint + '/';
25
- }
26
- if (config != null && config.withCredentials != null) {
27
- this.withCredentials = config.withCredentials;
28
- }
29
- this.projectCtxUrl = apiEndPoint + ProjectService.PROJECT_API_CTX;
30
- }
31
- appendRequestUUIDForDevelopmentServer(url) {
32
- let resUrl = url;
33
- if (this.config && this.config.apiType === ApiType.FILES) {
34
- // for development and demo
35
- // append UUID to make request URL unique to avoid localhost server caching
36
- resUrl = resUrl + '.json?requestUUID=' + UUID.generate();
37
- }
38
- return resUrl;
39
- }
40
- projectUrl(id) {
41
- let encPrjId = encodeURIComponent(id);
42
- return this.appendRequestUUIDForDevelopmentServer(this.projectCtxUrl + '/' + encPrjId);
43
- }
44
- projectResourceUrl(projectId, relResourcePath) {
45
- let encPrjId = encodeURIComponent(projectId);
46
- // Use encodeURI here since the relatice resource path from recording scripts is already a URI
47
- // encodeURIComponent function would encode the slashes and fetching the resource would fail
48
- let encRelResPath = encodeURI(relResourcePath);
49
- return this.projectCtxUrl + '/' + encPrjId + '/' + encRelResPath;
50
- }
51
- projectObservable(id) {
52
- let prjUrl = this.projectUrl(id);
53
- return this.http.get(prjUrl, { withCredentials: this.withCredentials });
54
- }
55
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ProjectService, deps: [{ token: i1.HttpClient }, { token: i2.PlatformLocation }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
56
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ProjectService }); }
57
- }
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ProjectService, decorators: [{
59
- type: Injectable
60
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.PlatformLocation }, { type: i3.SpeechRecorderConfig, decorators: [{
61
- type: Inject,
62
- args: [SPEECHRECORDER_CONFIG]
63
- }] }] });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7Ozs7O0FBT3ZDLE1BQU0sT0FBTyxjQUFjO2FBQ0Ysb0JBQWUsR0FBQyxTQUFTLEFBQVYsQ0FBVTtJQUloRCxZQUFvQixJQUFlLEVBQVMsZ0JBQWlDLEVBQXdDLE1BQTRCO1FBQTdILFNBQUksR0FBSixJQUFJLENBQVc7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBQXdDLFdBQU0sR0FBTixNQUFNLENBQXNCO1FBRmhJLG9CQUFlLEdBQVMsS0FBSyxDQUFDO1FBSTdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUVqRSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUE7UUFFcEIsSUFBRyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLFdBQVcsR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFHLFdBQVcsS0FBSyxFQUFFLEVBQUMsQ0FBQztZQUNyQixXQUFXLEdBQUMsV0FBVyxHQUFDLEdBQUcsQ0FBQTtRQUM3QixDQUFDO1FBQ0QsSUFBRyxNQUFNLElBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUUsSUFBSSxFQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGVBQWUsR0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO0lBRXBFLENBQUM7SUFFTyxxQ0FBcUMsQ0FBQyxHQUFVO1FBQ3RELElBQUksTUFBTSxHQUFDLEdBQUcsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekQsMkJBQTJCO1lBQzNCLDJFQUEyRTtZQUMzRSxNQUFNLEdBQUcsTUFBTSxHQUFHLG9CQUFvQixHQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQsVUFBVSxDQUFDLEVBQVM7UUFDbEIsSUFBSSxRQUFRLEdBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELGtCQUFrQixDQUFDLFNBQWlCLEVBQUMsZUFBc0I7UUFDekQsSUFBSSxRQUFRLEdBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsOEZBQThGO1FBQzlGLDRGQUE0RjtRQUM1RixJQUFJLGFBQWEsR0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsR0FBRyxRQUFRLEdBQUUsR0FBRyxHQUFDLGFBQWEsQ0FBQztJQUNoRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBUztRQUN6QixJQUFJLE1BQU0sR0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVUsTUFBTSxFQUFDLEVBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUMsQ0FBQyxDQUFBO0lBQy9FLENBQUM7K0dBbkRTLGNBQWMsNEVBSzZELHFCQUFxQjttSEFMaEcsY0FBYzs7NEZBQWQsY0FBYztrQkFEMUIsVUFBVTs7MEJBTXNFLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENyZWF0ZWQgYnkga2xhdXNqIG9uIDE3LjA2LjIwMTcuXHJcbiAqL1xyXG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtBcGlUeXBlLCBTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Byb2plY3R9IGZyb20gXCIuL3Byb2plY3RcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1BsYXRmb3JtTG9jYXRpb259IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuXHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUHJvamVjdFNlcnZpY2Uge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPSkVDVF9BUElfQ1RYPSdwcm9qZWN0J1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdEN0eFVybDpzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXRoQ3JlZGVudGlhbHM6Ym9vbGVhbj1mYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOkh0dHBDbGllbnQscHJpdmF0ZSBwbGF0Zm9ybUxvY2F0aW9uOlBsYXRmb3JtTG9jYXRpb24sQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByaXZhdGUgY29uZmlnPzpTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiQmFzZSBIcmVmOiBcIitwbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpKTtcclxuXHJcbiAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJ1xyXG5cclxuICAgIGlmKGNvbmZpZyAmJiBjb25maWcuYXBpRW5kUG9pbnQpIHtcclxuICAgICAgYXBpRW5kUG9pbnQ9Y29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgfVxyXG4gICAgaWYoYXBpRW5kUG9pbnQgIT09ICcnKXtcclxuICAgICAgYXBpRW5kUG9pbnQ9YXBpRW5kUG9pbnQrJy8nXHJcbiAgICB9XHJcbiAgICBpZihjb25maWchPW51bGwgJiYgY29uZmlnLndpdGhDcmVkZW50aWFscyE9bnVsbCl7XHJcbiAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzPWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9qZWN0Q3R4VXJsID0gYXBpRW5kUG9pbnQgKyBQcm9qZWN0U2VydmljZS5QUk9KRUNUX0FQSV9DVFg7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRSZXF1ZXN0VVVJREZvckRldmVsb3BtZW50U2VydmVyKHVybDpzdHJpbmcpOnN0cmluZ3tcclxuICAgIGxldCByZXNVcmw9dXJsO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZXNVcmwgPSByZXNVcmwgKyAnLmpzb24/cmVxdWVzdFVVSUQ9JytVVUlELmdlbmVyYXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzVXJsXHJcbiAgfVxyXG5cclxuICBwcm9qZWN0VXJsKGlkOnN0cmluZyk6c3RyaW5ne1xyXG4gICAgbGV0IGVuY1ByaklkPWVuY29kZVVSSUNvbXBvbmVudChpZCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRSZXF1ZXN0VVVJREZvckRldmVsb3BtZW50U2VydmVyKHRoaXMucHJvamVjdEN0eFVybCArICcvJyArIGVuY1ByaklkKTtcclxuICB9XHJcblxyXG4gIHByb2plY3RSZXNvdXJjZVVybChwcm9qZWN0SWQ6IHN0cmluZyxyZWxSZXNvdXJjZVBhdGg6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICBsZXQgZW5jUHJqSWQ9ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RJZCk7XHJcbiAgICAvLyBVc2UgZW5jb2RlVVJJIGhlcmUgc2luY2UgdGhlIHJlbGF0aWNlIHJlc291cmNlIHBhdGggZnJvbSByZWNvcmRpbmcgc2NyaXB0cyBpcyBhbHJlYWR5IGEgVVJJXHJcbiAgICAvLyBlbmNvZGVVUklDb21wb25lbnQgZnVuY3Rpb24gd291bGQgZW5jb2RlIHRoZSBzbGFzaGVzIGFuZCBmZXRjaGluZyB0aGUgcmVzb3VyY2Ugd291bGQgZmFpbFxyXG4gICAgbGV0IGVuY1JlbFJlc1BhdGg9ZW5jb2RlVVJJKHJlbFJlc291cmNlUGF0aCk7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0Q3R4VXJsICsgJy8nICsgZW5jUHJqSWQgKycvJytlbmNSZWxSZXNQYXRoO1xyXG4gIH1cclxuXHJcbiAgcHJvamVjdE9ic2VydmFibGUoaWQ6c3RyaW5nKTpPYnNlcnZhYmxlPFByb2plY3Q+e1xyXG4gICAgbGV0IHByalVybD10aGlzLnByb2plY3RVcmwoaWQpO1xyXG4gICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFByb2plY3Q+KHByalVybCx7d2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc30pXHJcbiAgIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=
@@ -1,124 +0,0 @@
1
- import { UUID } from '../utils/utils';
2
- export class RecordingFileDescriptorImpl {
3
- constructor() { }
4
- }
5
- export class RecordingFile {
6
- constructor(uuid, sessionId, audioDataHolder) {
7
- this.recordingFileId = null;
8
- this.uuid = null;
9
- this.serverPersisted = false;
10
- this.date = null;
11
- this._dateAsDateObj = null;
12
- this.startedDate = null;
13
- this._startedAsDateObj = null;
14
- this.audioDataHolder = null;
15
- this.session = null;
16
- this.channels = null;
17
- this.frames = null;
18
- this.samplerate = null;
19
- this.timeLength = null;
20
- this.editSampleRate = null;
21
- this.editStartFrame = null;
22
- this.editEndFrame = null;
23
- this.session = sessionId;
24
- this.audioDataHolder = audioDataHolder;
25
- if (audioDataHolder) {
26
- this.frames = audioDataHolder.frameLen;
27
- this.timeLength = audioDataHolder.duration;
28
- }
29
- this.uuid = uuid;
30
- }
31
- filenameString() {
32
- let fns = '';
33
- if (this.session) {
34
- fns += this.session;
35
- fns += '_';
36
- }
37
- fns += this.uuid;
38
- return fns;
39
- }
40
- equals(otherRecordingFile) {
41
- if (otherRecordingFile !== null) {
42
- if (otherRecordingFile === this) {
43
- return true;
44
- }
45
- if (otherRecordingFile.uuid === this.uuid) {
46
- return true;
47
- }
48
- }
49
- return false;
50
- }
51
- toString() {
52
- return 'Recording file: UUID: ' + this.uuid + ', session: ' + this.session;
53
- }
54
- }
55
- export class SprRecordingFile extends RecordingFile {
56
- constructor(sessionId, itemcode, version, audioDataHolder) {
57
- super(UUID.generate(), sessionId, audioDataHolder);
58
- this.session = sessionId;
59
- this.itemCode = itemcode;
60
- this.version = version;
61
- }
62
- recordingFileDone() {
63
- return (this.serverPersisted === true) || (this.audioDataHolder != null);
64
- }
65
- filenameString() {
66
- let fns = '';
67
- if (this.session) {
68
- fns += this.session;
69
- fns += '_';
70
- }
71
- if (this.itemCode) {
72
- fns += this.itemCode;
73
- fns += '_';
74
- }
75
- fns += this.uuid;
76
- return fns;
77
- }
78
- toString() {
79
- return 'Recording file: UUID: ' + this.uuid + ', session: ' + this.session + ', itemcode: ' + this.itemCode + ', version: ' + this.version + ', UUID: ' + this.uuid;
80
- }
81
- }
82
- export class RecordingFileUtils {
83
- static equals(recordinFile, otherRecordingFile) {
84
- if (recordinFile && otherRecordingFile) {
85
- if (otherRecordingFile === recordinFile) {
86
- return true;
87
- }
88
- if (otherRecordingFile.uuid === recordinFile.uuid) {
89
- return true;
90
- }
91
- }
92
- return false;
93
- }
94
- static setAudioData(rf, audioDataHolder) {
95
- rf.audioDataHolder = audioDataHolder;
96
- if (audioDataHolder) {
97
- if (rf.samplerate == null) {
98
- rf.samplerate = audioDataHolder.sampleRate;
99
- }
100
- if (rf.frames == null) {
101
- rf.frames = audioDataHolder.frameLen;
102
- }
103
- rf.timeLength = audioDataHolder.duration;
104
- }
105
- }
106
- static sampleCount(rf) {
107
- if (rf.audioDataHolder) {
108
- return rf.audioDataHolder.sampleCounts();
109
- }
110
- else {
111
- return 0;
112
- }
113
- }
114
- static expireAudioData(rf) {
115
- let expiredSamples = 0;
116
- if (rf && rf.audioDataHolder) {
117
- expiredSamples = rf.audioDataHolder.sampleCounts();
118
- rf.audioDataHolder.releaseAudioData();
119
- rf.audioDataHolder = null;
120
- }
121
- return expiredSamples;
122
- }
123
- }
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFlckMsTUFBTSxPQUFPLDJCQUEyQjtJQU10QyxnQkFBZSxDQUFDO0NBQ2pCO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFrQnhCLFlBQVksSUFBVyxFQUFDLFNBQXVCLEVBQUMsZUFBb0M7UUFqQnBGLG9CQUFlLEdBQTBCLElBQUksQ0FBQztRQUM5QyxTQUFJLEdBQWEsSUFBSSxDQUFDO1FBQ3RCLG9CQUFlLEdBQUMsS0FBSyxDQUFDO1FBQ3RCLFNBQUksR0FBYyxJQUFJLENBQUM7UUFDdkIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFDOUIsZ0JBQVcsR0FBYyxJQUFJLENBQUM7UUFDOUIsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ2xDLG9CQUFlLEdBQXNCLElBQUksQ0FBQztRQUMxQyxZQUFPLEdBQW9CLElBQUksQ0FBQztRQUNoQyxhQUFRLEdBQWEsSUFBSSxDQUFDO1FBQzFCLFdBQU0sR0FBYSxJQUFJLENBQUM7UUFDeEIsZUFBVSxHQUFhLElBQUksQ0FBQztRQUM1QixlQUFVLEdBQWEsSUFBSSxDQUFDO1FBQzVCLG1CQUFjLEdBQWEsSUFBSSxDQUFDO1FBQ2hDLG1CQUFjLEdBQWEsSUFBSSxDQUFBO1FBQy9CLGlCQUFZLEdBQWEsSUFBSSxDQUFBO1FBRzNCLElBQUksQ0FBQyxPQUFPLEdBQUMsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUMsZUFBZSxDQUFBO1FBQ3BDLElBQUcsZUFBZSxFQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQ3JDLElBQUksQ0FB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WyJpbXBvcnQgeyBVVUlEIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnXHJcbmltcG9ydCB7UHJvbXB0SXRlbX0gZnJvbSBcIi4vc2NyaXB0L3NjcmlwdFwiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uL2F1ZGlvL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG4vLyBUT0RPIEkgdGhpbmsgdGhlIGludGVyZmFjZS9jbGFzcyBzdHJ1Y3R1cmUgbmVlZHMgc29tZSByZWZhY3RvcmluZ1xyXG4vLyBUaGUgcXVlc3Rpb24gaW4gZ2VuZXJhbCBpcyBob3cgdG8gZmV0Y2ggYW4gb2JqZWN0IG9mIGEgY2xhc3MgKHdpdGggbWVtYmVyIG1ldGhvZHMpXHJcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUwNDUyNDMxL2FuZ3VsYXItNi1odHRwY2xpZW50LXJldHVybi1pbnN0YW5jZS1vZi1jbGFzc1xyXG4vLyBBbmd1bGFyIEhUVFBDbGllbnQgc2VlbXMgdG8gc2ltcGx5XHJcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ3NDk5MzI0L2FuZ3VsYXItNS1tb2RlbHMtaHR0cGNsaWVudC10eXBlLWNhc3RpbmdcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3Ige1xyXG4gIHJlY29yZGluZzpQcm9tcHRJdGVtO1xyXG4gIHZlcnNpb246bnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsIHtcclxuICByZWNvcmRpbmchOlByb21wdEl0ZW07XHJcbiAgdmVyc2lvbiE6bnVtYmVyO1xyXG4gIGZyYW1lcz86bnVtYmVyO1xyXG4gIHNhbXBsZXJhdGU/Om51bWJlcjtcclxuICBjaGFubmVscz86IG51bWJlcjtcclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRpbmdGaWxlIHtcclxuICByZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGw9IG51bGw7XHJcbiAgdXVpZDpzdHJpbmd8bnVsbD1udWxsO1xyXG4gIHNlcnZlclBlcnNpc3RlZD1mYWxzZTtcclxuICBkYXRlOiBzdHJpbmd8bnVsbD1udWxsO1xyXG4gIF9kYXRlQXNEYXRlT2JqOkRhdGV8bnVsbD1udWxsO1xyXG4gIHN0YXJ0ZWREYXRlOiBzdHJpbmd8bnVsbD1udWxsO1xyXG4gIF9zdGFydGVkQXNEYXRlT2JqPzpEYXRlfG51bGw9bnVsbDtcclxuICBhdWRpb0RhdGFIb2xkZXI6QXVkaW9EYXRhSG9sZGVyfG51bGw9bnVsbDtcclxuICBzZXNzaW9uOnN0cmluZ3xudW1iZXJ8bnVsbD1udWxsO1xyXG4gIGNoYW5uZWxzOm51bWJlcnxudWxsPW51bGw7XHJcbiAgZnJhbWVzOm51bWJlcnxudWxsPW51bGw7XHJcbiAgc2FtcGxlcmF0ZTpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHRpbWVMZW5ndGg6bnVtYmVyfG51bGw9bnVsbDtcclxuICBlZGl0U2FtcGxlUmF0ZTpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIGVkaXRTdGFydEZyYW1lOm51bWJlcnxudWxsPW51bGxcclxuICBlZGl0RW5kRnJhbWU6bnVtYmVyfG51bGw9bnVsbFxyXG5cclxuICBjb25zdHJ1Y3Rvcih1dWlkOnN0cmluZyxzZXNzaW9uSWQ6c3RyaW5nfG51bWJlcixhdWRpb0RhdGFIb2xkZXI6QXVkaW9EYXRhSG9sZGVyfG51bGwpIHtcclxuICAgIHRoaXMuc2Vzc2lvbj1zZXNzaW9uSWQ7XHJcbiAgICB0aGlzLmF1ZGlvRGF0YUhvbGRlcj1hdWRpb0RhdGFIb2xkZXJcclxuICAgIGlmKGF1ZGlvRGF0YUhvbGRlcil7XHJcbiAgICAgIHRoaXMuZnJhbWVzPWF1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgdGhpcy50aW1lTGVuZ3RoPWF1ZGlvRGF0YUhvbGRlci5kdXJhdGlvbjtcclxuICAgIH1cclxuICAgIHRoaXMudXVpZD11dWlkO1xyXG4gIH1cclxuXHJcbiAgZmlsZW5hbWVTdHJpbmcoKTpzdHJpbmd7XHJcbiAgICBsZXQgZm5zOnN0cmluZz0nJztcclxuICAgIGlmKHRoaXMuc2Vzc2lvbil7XHJcbiAgICAgIGZucys9dGhpcy5zZXNzaW9uO1xyXG4gICAgICBmbnMrPSdfJztcclxuICAgIH1cclxuICAgIGZucys9dGhpcy51dWlkO1xyXG4gICAgcmV0dXJuIGZucztcclxuICB9XHJcblxyXG4gIGVxdWFscyhvdGhlclJlY29yZGluZ0ZpbGU6UmVjb3JkaW5nRmlsZXxudWxsKTpib29sZWFue1xyXG4gICAgaWYob3RoZXJSZWNvcmRpbmdGaWxlIT09bnVsbCkge1xyXG4gICAgICBpZiAob3RoZXJSZWNvcmRpbmdGaWxlID09PSB0aGlzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG90aGVyUmVjb3JkaW5nRmlsZS51dWlkID09PSB0aGlzLnV1aWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTpzdHJpbmd7XHJcbiAgICByZXR1cm4gJ1JlY29yZGluZyBmaWxlOiBVVUlEOiAnK3RoaXMudXVpZCsnLCBzZXNzaW9uOiAnK3RoaXMuc2Vzc2lvbjtcclxuICB9XHJcblxyXG59XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFNwclJlY29yZGluZ0ZpbGUgZXh0ZW5kcyBSZWNvcmRpbmdGaWxlIGltcGxlbWVudHMgIFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ye1xyXG5cclxuICAgICAgaXRlbUNvZGU6c3RyaW5nO1xyXG5cclxuICAgICAgcmVjb3JkaW5nITpQcm9tcHRJdGVtO1xyXG4gICAgICB2ZXJzaW9uITpudW1iZXI7XHJcblxyXG4gICAgICBjb25zdHJ1Y3RvcihzZXNzaW9uSWQ6c3RyaW5nfG51bWJlcixpdGVtY29kZTpzdHJpbmcsdmVyc2lvbjpudW1iZXIsYXVkaW9EYXRhSG9sZGVyOkF1ZGlvRGF0YUhvbGRlcnxudWxsKSB7XHJcbiAgICAgICAgICBzdXBlcihVVUlELmdlbmVyYXRlKCksc2Vzc2lvbklkLGF1ZGlvRGF0YUhvbGRlcik7XHJcbiAgICAgICAgICB0aGlzLnNlc3Npb249c2Vzc2lvbklkO1xyXG4gICAgICAgICAgdGhpcy5pdGVtQ29kZT1pdGVtY29kZTtcclxuICAgICAgICAgIHRoaXMudmVyc2lvbj12ZXJzaW9uO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZWNvcmRpbmdGaWxlRG9uZSgpOmJvb2xlYW57XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZlclBlcnNpc3RlZD09PXRydWUpIHx8ICh0aGlzLmF1ZGlvRGF0YUhvbGRlciE9bnVsbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpbGVuYW1lU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgICAgIGxldCBmbnM6c3RyaW5nPScnO1xyXG4gICAgICAgIGlmKHRoaXMuc2Vzc2lvbil7XHJcbiAgICAgICAgICAgIGZucys9dGhpcy5zZXNzaW9uO1xyXG4gICAgICAgICAgICBmbnMrPSdfJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5pdGVtQ29kZSl7XHJcbiAgICAgICAgICBmbnMrPXRoaXMuaXRlbUNvZGU7XHJcbiAgICAgICAgICBmbnMrPSdfJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZm5zKz10aGlzLnV1aWQ7XHJcbiAgICAgICAgcmV0dXJuIGZucztcclxuICAgICAgfVxyXG5cclxuICAgICAgdG9TdHJpbmcoKTpzdHJpbmd7XHJcbiAgICAgICAgcmV0dXJuICdSZWNvcmRpbmcgZmlsZTogVVVJRDogJyt0aGlzLnV1aWQrJywgc2Vzc2lvbjogJyt0aGlzLnNlc3Npb24rJywgaXRlbWNvZGU6ICcrdGhpcy5pdGVtQ29kZSsnLCB2ZXJzaW9uOiAnK3RoaXMudmVyc2lvbisnLCBVVUlEOiAnK3RoaXMudXVpZDtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZVV0aWxze1xyXG5cclxuICAgICAgc3RhdGljIGVxdWFscyhyZWNvcmRpbkZpbGU6UmVjb3JkaW5nRmlsZXxudWxsLG90aGVyUmVjb3JkaW5nRmlsZTpSZWNvcmRpbmdGaWxlfG51bGwpOmJvb2xlYW57XHJcbiAgICAgICAgaWYocmVjb3JkaW5GaWxlICYmIG90aGVyUmVjb3JkaW5nRmlsZSl7XHJcbiAgICAgICAgICBpZiAob3RoZXJSZWNvcmRpbmdGaWxlID09PSByZWNvcmRpbkZpbGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAob3RoZXJSZWNvcmRpbmdGaWxlLnV1aWQgPT09IHJlY29yZGluRmlsZS51dWlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN0YXRpYyBzZXRBdWRpb0RhdGEocmY6UmVjb3JkaW5nRmlsZSxhdWRpb0RhdGFIb2xkZXI6QXVkaW9EYXRhSG9sZGVyfG51bGwpe1xyXG4gICAgICAgICAgcmYuYXVkaW9EYXRhSG9sZGVyPWF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgICAgIGlmKGF1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICAgICAgICBpZihyZi5zYW1wbGVyYXRlPT1udWxsKXtcclxuICAgICAgICAgICAgICByZi5zYW1wbGVyYXRlPWF1ZGlvRGF0YUhvbGRlci5zYW1wbGVSYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHJmLmZyYW1lcz09bnVsbCkge1xyXG4gICAgICAgICAgICAgIHJmLmZyYW1lcyA9IGF1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZi50aW1lTGVuZ3RoPWF1ZGlvRGF0YUhvbGRlci5kdXJhdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgc3RhdGljIHNhbXBsZUNvdW50KHJmOlJlY29yZGluZ0ZpbGUpOm51bWJlcntcclxuICAgICAgICBpZihyZi5hdWRpb0RhdGFIb2xkZXIpe1xyXG4gICAgICAgICAgcmV0dXJuIHJmLmF1ZGlvRGF0YUhvbGRlci5zYW1wbGVDb3VudHMoKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzdGF0aWMgZXhwaXJlQXVkaW9EYXRhKHJmOlJlY29yZGluZ0ZpbGUpOm51bWJlcntcclxuICAgICAgICBsZXQgZXhwaXJlZFNhbXBsZXM9MDtcclxuICAgICAgICBpZihyZiAmJiByZi5hdWRpb0RhdGFIb2xkZXIpe1xyXG4gICAgICAgICAgZXhwaXJlZFNhbXBsZXM9cmYuYXVkaW9EYXRhSG9sZGVyLnNhbXBsZUNvdW50cygpO1xyXG4gICAgICAgICAgcmYuYXVkaW9EYXRhSG9sZGVyLnJlbGVhc2VBdWRpb0RhdGEoKVxyXG4gICAgICAgICAgcmYuYXVkaW9EYXRhSG9sZGVyPW51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBleHBpcmVkU2FtcGxlcztcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuIl19
@@ -1,221 +0,0 @@
1
- var BasicRecordingService_1;
2
- import { __decorate, __param } from "tslib";
3
- import { HttpHeaders } from "@angular/common/http";
4
- import { Inject } from "@angular/core";
5
- import { ApiType, SPEECHRECORDER_CONFIG } from "../../spr.config";
6
- import { Observable } from "rxjs";
7
- import { NetAudioBuffer } from "../../audio/net_audio_buffer";
8
- import { UUID } from "../../utils/utils";
9
- import { WavReader } from "../../audio/impl/wavreader";
10
- import { AudioContextProvider } from "../../audio/context";
11
- export class ChunkDownload {
12
- get orgPCMAudioFormat() {
13
- return this._orgPCMAudioFormat;
14
- }
15
- get orgFrameLength() {
16
- return this._orgFrameLength;
17
- }
18
- get decodedAudioBuffer() {
19
- return this._decodedAudioBuffer;
20
- }
21
- constructor(_orgPCMAudioFormat, _orgFrameLength, _decodedAudioBuffer) {
22
- this._orgPCMAudioFormat = _orgPCMAudioFormat;
23
- this._orgFrameLength = _orgFrameLength;
24
- this._decodedAudioBuffer = _decodedAudioBuffer;
25
- }
26
- }
27
- let BasicRecordingService = class BasicRecordingService {
28
- static { BasicRecordingService_1 = this; }
29
- // iPad 9th generation, iOS 15.7.1, sometimes:
30
- // Failed to load resource: WebKit hat einen internen Fehler festgestellt
31
- // Firefox on Windows crashes
32
- static { this.DEFAULT_CHUNKED_DOWNLOAD_SECONDS = 10; }
33
- static { this.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES = 2880000 * 5; } // Default 5 minutes one channel at 48kHz
34
- constructor(http, config) {
35
- this.http = http;
36
- this.config = config;
37
- this._maxAutoNetMemStoreSamples = Number.MAX_SAFE_INTEGER;
38
- this.withCredentials = false;
39
- this.apiEndPoint = '';
40
- if (config && config.apiEndPoint) {
41
- this.apiEndPoint = config.apiEndPoint;
42
- }
43
- if (this.apiEndPoint !== '') {
44
- this.apiEndPoint = this.apiEndPoint + '/';
45
- }
46
- if (config != null && config.withCredentials != null) {
47
- this.withCredentials = config.withCredentials;
48
- }
49
- if (config && config.apiVersion > 1) {
50
- this._maxAutoNetMemStoreSamples = BasicRecordingService_1.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES;
51
- }
52
- }
53
- audioRequestByURL(audioBaseUrl, audioURLSearchParams) {
54
- let audioUrl = audioBaseUrl;
55
- if (this.config && this.config.apiType === ApiType.FILES) {
56
- // for development and demo
57
- audioUrl = audioUrl + '.wav';
58
- // append UUID to make request URL unique to avoid localhost server caching
59
- audioURLSearchParams.set('requestUUID', UUID.generate());
60
- //audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
61
- }
62
- audioUrl = audioUrl + '?' + audioURLSearchParams.toString();
63
- let headers = new HttpHeaders();
64
- headers = headers.set('Accept', 'audio/wav');
65
- return this.http.get(audioUrl, {
66
- headers: headers,
67
- observe: 'response',
68
- responseType: 'arraybuffer',
69
- withCredentials: this.withCredentials
70
- });
71
- }
72
- chunkAudioRequest(baseAudioUrl, startFrame = 0, frameLength) {
73
- let ausps = new URLSearchParams();
74
- ausps.set('startFrame', startFrame.toString());
75
- ausps.set('frameLength', frameLength.toString());
76
- if (this.config && this.config.apiType === ApiType.FILES) {
77
- // for development and demo
78
- // append UUID to make request URL unique to avoid localhost server caching
79
- //audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
80
- ausps.set('requestUUID', UUID.generate());
81
- }
82
- let obs = new Observable(observer => {
83
- this.audioRequestByURL(baseAudioUrl, ausps).subscribe({
84
- next: resp => {
85
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
86
- if (resp.body) {
87
- //console.debug("chunkAudioRequest: observer.closed: "+observer.closed);
88
- //console.debug("Audio file bytes: "+resp.body.byteLength);
89
- // Check original audio format
90
- let wr = new WavReader(resp.body);
91
- const pcmFmt = wr.readFormat();
92
- const orgFl = wr.frameLength();
93
- // if(pcmFmt){
94
- // console.debug("Original WAVE format of download chunk: "+pcmFmt);
95
- // }else{
96
- // console.error("Could not read WAVE format of original download chunk!");
97
- // }
98
- // if(orgFl){
99
- // console.debug("Original frame length of download chunk: "+orgFl);
100
- // }else{
101
- // console.error("Could not read WAVE format of original download chunk!");
102
- // }
103
- if (pcmFmt && orgFl) {
104
- AudioContextProvider.decodeAudioData(resp.body).then((ab) => {
105
- //console.debug("Decoded audio chunk frames: "+ab.length);
106
- let chDl = new ChunkDownload(pcmFmt, orgFl, ab);
107
- observer.next(chDl);
108
- observer.complete();
109
- }).catch(error => {
110
- //if(error instanceof HttpErrorResponse) {
111
- // if (error.status == 404) {
112
- // // Interpret not as an error, the file ist not recorded yet
113
- // observer.next(null);
114
- // observer.complete()
115
- // } else {
116
- // // all other states are errors
117
- console.error("Recordings service chunkAudioRequest error decoding audio data: " + error.name + ": " + error.message);
118
- observer.error(error);
119
- // }
120
- // }
121
- });
122
- }
123
- else {
124
- const errMsg = 'Could not parse audio header for format and/or frame length of download.';
125
- console.error(errMsg);
126
- observer.error(errMsg);
127
- }
128
- }
129
- else {
130
- const errMsg = 'Fetching audio file: response has no body';
131
- console.error(errMsg);
132
- observer.error(errMsg);
133
- }
134
- }, error: (error) => {
135
- // all other states are errors
136
- //const errMsg='Fetching audio file HTTP error: '+error;
137
- //console.error(errMsg);
138
- observer.error(error);
139
- //observer.complete();
140
- }
141
- });
142
- });
143
- return obs;
144
- }
145
- chunkAudioRequestToNetAudioBuffer(baseAudioUrl, startFrame = 0, orgSampleRate, seconds, frames) {
146
- //let audioUrl=baseAudioUrl+'?startFrame='+startFrame+'&frameLength='+frameLength;
147
- //let audioUrl=new URL(baseAudioUrl);
148
- // if(orgSampleRate!=null && frameLength%orgSampleRate>0){
149
- // const errMsg='frameLength must be equal or multiple of original samplerate.';
150
- // console.error(errMsg+' ('+frameLength+'%'+orgSampleRate+'=='+(frameLength%orgSampleRate)+')');
151
- // throw Error(errMsg)
152
- // }
153
- let frameLength = orgSampleRate * Math.round(seconds);
154
- let ausps = new URLSearchParams();
155
- ausps.set('startFrame', startFrame.toString());
156
- ausps.set('frameLength', frameLength.toString());
157
- if (this.config && this.config.apiType === ApiType.FILES) {
158
- // for development and demo
159
- // append UUID to make request URL unique to avoid localhost server caching
160
- //audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
161
- ausps.set('requestUUID', UUID.generate());
162
- }
163
- let obs = new Observable(subscriber => {
164
- this.audioRequestByURL(baseAudioUrl, ausps).subscribe({ next: (resp) => {
165
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
166
- if (resp.body) {
167
- //console.debug("chunkAudioRequestTonetAb: subscriber.closed: "+subscriber.closed);
168
- //console.debug("chunkAudioRequestTonetAb: Audio file bytes: "+resp.body.byteLength);
169
- AudioContextProvider.decodeAudioData(resp.body).then(ab => {
170
- //console.debug("chunkAudioRequestTonetAb: Decoded audio chunk frames for netAb: "+ab.length);
171
- //console.debug("chunkAudioRequestTonetAb: Create netAb ab from chunk ab...");
172
- if (frames === null) {
173
- subscriber.error(new Error('Could not get frame length from recording file object'));
174
- }
175
- else {
176
- let fl = frames;
177
- if (ab.sampleRate !== orgSampleRate) {
178
- if (orgSampleRate && frames) {
179
- fl = Math.round(ab.sampleRate * frames / orgSampleRate);
180
- //console.debug("Platform sr: "+ab.sampleRate+", file sr: "+orgSampleRate+", decoded/org frame length: "+fl+"/"+frames+", ab.length: "+ab.length);
181
- }
182
- }
183
- let nab = NetAudioBuffer.fromChunkAudioBuffer(this, baseAudioUrl, ab, fl, frameLength);
184
- //let rp=new ReadyProvider();
185
- //nab.readyProvider=rp;
186
- //rp.ready();
187
- nab.ready();
188
- if (nab.frameLen < frameLength) {
189
- //console.debug("chunkAudioRequestTonetAb: Built netAb ab from chunk ab: First chunk shorter tha frameLength ("+netAbAudioBuffer.frameLen+"<"+frameLength+"), assuming end of data, sealing netAb ab.");
190
- nab.seal();
191
- }
192
- subscriber.next(nab);
193
- subscriber.complete();
194
- }
195
- }).catch(error => {
196
- console.error('chunkAudioRequestToNetAb: error: ' + error);
197
- //if(error instanceof HttpErrorResponse) {
198
- subscriber.error(error);
199
- //}
200
- });
201
- }
202
- else {
203
- console.error('chunkAudioRequestToNetAb: Fetching audio file: response has no body');
204
- subscriber.error('chunkAudioRequestToNetAb: Fetching audio file: response has no body');
205
- }
206
- },
207
- error: (error) => {
208
- console.error('chunkAudioRequestToNetAb: error: ' + error);
209
- subscriber.error(error);
210
- //subscriber.complete();
211
- }
212
- });
213
- });
214
- return obs;
215
- }
216
- };
217
- BasicRecordingService = BasicRecordingService_1 = __decorate([
218
- __param(1, Inject(SPEECHRECORDER_CONFIG))
219
- ], BasicRecordingService);
220
- export { BasicRecordingService };
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfcmVjb3JkaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBYyxXQUFXLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFDN0UsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3RGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFckQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFekQsTUFBTSxPQUFPLGFBQWE7SUFDeEIsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFDRCxZQUFvQixrQkFBaUMsRUFBUyxlQUFzQixFQUFTLG1CQUErQjtRQUF4Ryx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQWU7UUFBUyxvQkFBZSxHQUFmLGVBQWUsQ0FBTztRQUFTLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBWTtJQUFFLENB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QUMsS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7d0JBQ3JGLFVBQVUsQ0FBQyxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztvQkFDNUYsQ0FBQztnQkFDTCxDQUFDO2dCQUNELEtBQUssRUFBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEdBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pELFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hCLHdCQUF3QjtnQkFDNUIsQ0FBQzthQUNKLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDOztBQXhNUSxxQkFBcUI7SUFVVyxXQUFBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0dBVjdELHFCQUFxQixDQTBNakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7SW5qZWN0fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0FwaVR5cGUsIFNQRUVDSFJFQ09SREVSX0NPTkZJRywgU3BlZWNoUmVjb3JkZXJDb25maWd9IGZyb20gXCIuLi8uLi9zcHIuY29uZmlnXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtOZXRBdWRpb0J1ZmZlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL25ldF9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtXYXZSZWFkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9pbXBsL3dhdnJlYWRlclwiO1xyXG5pbXBvcnQge1BDTUF1ZGlvRm9ybWF0fSBmcm9tIFwiLi4vLi4vYXVkaW8vZm9ybWF0XCI7XHJcbmltcG9ydCB7QXVkaW9Db250ZXh0UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9jb250ZXh0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2h1bmtEb3dubG9hZHtcclxuICBnZXQgb3JnUENNQXVkaW9Gb3JtYXQoKTogUENNQXVkaW9Gb3JtYXQge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ1BDTUF1ZGlvRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9yZ0ZyYW1lTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JnRnJhbWVMZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgZGVjb2RlZEF1ZGlvQnVmZmVyKCk6IEF1ZGlvQnVmZmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVkQXVkaW9CdWZmZXI7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX29yZ1BDTUF1ZGlvRm9ybWF0OlBDTUF1ZGlvRm9ybWF0LHByaXZhdGUgX29yZ0ZyYW1lTGVuZ3RoOm51bWJlcixwcml2YXRlIF9kZWNvZGVkQXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpe31cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2ljUmVjb3JkaW5nU2VydmljZXtcclxuICAvLyBpUGFkIDl0aCBnZW5lcmF0aW9uLCBpT1MgMTUuNy4xLCBzb21ldGltZXM6XHJcbiAgLy8gRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2U6IFdlYktpdCBoYXQgZWluZW4gaW50ZXJuZW4gRmVobGVyIGZlc3RnZXN0ZWxsdFxyXG4gIC8vIEZpcmVmb3ggb24gV2luZG93cyBjcmFzaGVzXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NIVU5LRURfRE9XTkxPQURfU0VDT05EUzpudW1iZXI9MTA7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01BWF9ORVRfQVVUT19NRU1fU1RPUkVfU0FNUExFUzpudW1iZXI9Mjg4MDAwMCo1OyAvLyBEZWZhdWx0IDUgbWludXRlcyBvbmUgY2hhbm5lbCBhdCA0OGtIelxyXG4gIHByb3RlY3RlZCBfbWF4QXV0b05ldE1lbVN0b3JlU2FtcGxlczpudW1iZXI9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XHJcbiAgICBwcm90ZWN0ZWQgYXBpRW5kUG9pbnQ6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCB3aXRoQ3JlZGVudGlhbHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCwgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByb3RlY3RlZCBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuYXBpRW5kUG9pbnQgPSAnJ1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICAgICAgICB0aGlzLmFwaUVuZFBvaW50ID0gY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5hcGlFbmRQb2ludCAhPT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy5hcGlFbmRQb2ludCA9IHRoaXMuYXBpRW5kUG9pbnQgKyAnLydcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNvbmZpZyAmJiBjb25maWcuYXBpVmVyc2lvbj4xKXtcclxuICAgICAgICAgIHRoaXMuX21heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXM9QmFzaWNSZWNvcmRpbmdTZXJ2aWNlLkRFRkFVTFRfTUFYX05FVF9BVVRPX01FTV9TVE9SRV9TQU1QTEVTO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYXVkaW9SZXF1ZXN0QnlVUkwoYXVkaW9CYXNlVXJsOnN0cmluZyxhdWRpb1VSTFNlYXJjaFBhcmFtczpVUkxTZWFyY2hQYXJhbXMpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+IHtcclxuICAgICAgICBsZXQgYXVkaW9Vcmw9YXVkaW9CYXNlVXJsO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAgICAgICBhdWRpb1VybD1hdWRpb1VybCsnLndhdic7XHJcbiAgICAgICAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICAgICAgICBhdWRpb1VSTFNlYXJjaFBhcmFtcy5zZXQoJ3JlcXVlc3RVVUlEJyxVVUlELmdlbmVyYXRlKCkpO1xyXG4gICAgICAgICAgICAvL2F1ZGlvVXJsID0gYXVkaW9VcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXVkaW9Vcmw9YXVkaW9VcmwrJz8nK2F1ZGlvVVJMU2VhcmNoUGFyYW1zLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXVkaW8vd2F2Jyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXVkaW9VcmwsIHtcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInLFxyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaHVua0F1ZGlvUmVxdWVzdChiYXNlQXVkaW9Vcmw6c3RyaW5nLHN0YXJ0RnJhbWU6bnVtYmVyPTAsZnJhbWVMZW5ndGg6bnVtYmVyKTogT2JzZXJ2YWJsZTxDaHVua0Rvd25sb2FkfG51bGw+IHtcclxuXHJcbiAgICAgICAgbGV0IGF1c3BzPW5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgICAgICBhdXNwcy5zZXQoJ3N0YXJ0RnJhbWUnLHN0YXJ0RnJhbWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgYXVzcHMuc2V0KCdmcmFtZUxlbmd0aCcsZnJhbWVMZW5ndGgudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgICAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICAgICAgICAvL2F1ZGlvVXJsID0gYXVkaW9VcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgICAgICAgICBhdXNwcy5zZXQoJ3JlcXVlc3RVVUlEJyxVVUlELmdlbmVyYXRlKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG9icz1uZXcgT2JzZXJ2YWJsZTxDaHVua0Rvd25sb2FkfG51bGw+KG9ic2VydmVyPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvUmVxdWVzdEJ5VVJMKGJhc2VBdWRpb1VybCxhdXNwcykuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxMyAoMTMuMC41KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdDogb2JzZXJ2ZXIuY2xvc2VkOiBcIitvYnNlcnZlci5jbG9zZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQXVkaW8gZmlsZSBieXRlczogXCIrcmVzcC5ib2R5LmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIG9yaWdpbmFsIGF1ZGlvIGZvcm1hdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdyID0gbmV3IFdhdlJlYWRlcihyZXNwLmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGNtRm10ID0gd3IucmVhZEZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JnRmwgPSB3ci5mcmFtZUxlbmd0aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYocGNtRm10KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5kZWJ1ZyhcIk9yaWdpbmFsIFdBVkUgZm9ybWF0IG9mIGRvd25sb2FkIGNodW5rOiBcIitwY21GbXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgcmVhZCBXQVZFIGZvcm1hdCBvZiBvcmlnaW5hbCBkb3dubG9hZCBjaHVuayFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihvcmdGbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoXCJPcmlnaW5hbCBmcmFtZSBsZW5ndGggb2YgZG93bmxvYWQgY2h1bms6IFwiK29yZ0ZsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IHJlYWQgV0FWRSBmb3JtYXQgb2Ygb3JpZ2luYWwgZG93bmxvYWQgY2h1bmshXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwY21GbXQgJiYgb3JnRmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Db250ZXh0UHJvdmlkZXIuZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSkudGhlbigoYWIpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRGVjb2RlZCBhdWRpbyBjaHVuayBmcmFtZXM6IFwiK2FiLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoRGwgPSBuZXcgQ2h1bmtEb3dubG9hZChwY21GbXQsIG9yZ0ZsLCBhYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChjaERsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZihlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgb2JzZXJ2ZXIuY29tcGxldGUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVjb3JkaW5ncyBzZXJ2aWNlIGNodW5rQXVkaW9SZXF1ZXN0IGVycm9yIGRlY29kaW5nIGF1ZGlvIGRhdGE6IFwiICsgZXJyb3IubmFtZSArIFwiOiBcIiArIGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gJ0NvdWxkIG5vdCBwYXJzZSBhdWRpbyBoZWFkZXIgZm9yIGZvcm1hdCBhbmQvb3IgZnJhbWUgbGVuZ3RoIG9mIGRvd25sb2FkLic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJNc2cgPSAnRmV0Y2hpbmcgYXVkaW8gZmlsZTogcmVzcG9uc2UgaGFzIG5vIGJvZHknO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBzdGF0ZXMgYXJlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBlcnJNc2c9J0ZldGNoaW5nIGF1ZGlvIGZpbGUgSFRUUCBlcnJvcjogJytlcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vYnNlcnZlci5jb21wbGV0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9icztcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIGNodW5rQXVkaW9SZXF1ZXN0VG9OZXRBdWRpb0J1ZmZlcihiYXNlQXVkaW9Vcmw6IHN0cmluZywgc3RhcnRGcmFtZTogbnVtYmVyID0gMCwgb3JnU2FtcGxlUmF0ZTogbnVtYmVyLCBzZWNvbmRzOm51bWJlcixmcmFtZXM6IG51bWJlciB8IG51bGwpOiBPYnNlcnZhYmxlPE5ldEF1ZGlvQnVmZmVyIHwgbnVsbD4ge1xyXG4gICAgICAgIC8vbGV0IGF1ZGlvVXJsPWJhc2VBdWRpb1VybCsnP3N0YXJ0RnJhbWU9JytzdGFydEZyYW1lKycmZnJhbWVMZW5ndGg9JytmcmFtZUxlbmd0aDtcclxuICAgICAgICAvL2xldCBhdWRpb1VybD1uZXcgVVJMKGJhc2VBdWRpb1VybCk7XHJcbiAgICAgICAgLy8gaWYob3JnU2FtcGxlUmF0ZSE9bnVsbCAmJiBmcmFtZUxlbmd0aCVvcmdTYW1wbGVSYXRlPjApe1xyXG4gICAgICAgIC8vICAgY29uc3QgZXJyTXNnPSdmcmFtZUxlbmd0aCBtdXN0IGJlIGVxdWFsIG9yIG11bHRpcGxlIG9mIG9yaWdpbmFsIHNhbXBsZXJhdGUuJztcclxuICAgICAgICAvLyAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKycgKCcrZnJhbWVMZW5ndGgrJyUnK29yZ1NhbXBsZVJhdGUrJz09JysoZnJhbWVMZW5ndGglb3JnU2FtcGxlUmF0ZSkrJyknKTtcclxuICAgICAgICAvLyAgIHRocm93IEVycm9yKGVyck1zZylcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgbGV0IGZyYW1lTGVuZ3RoOm51bWJlcj1vcmdTYW1wbGVSYXRlKk1hdGgucm91bmQoc2Vjb25kcyk7XHJcbiAgICAgICAgbGV0IGF1c3BzPW5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgICAgICBhdXNwcy5zZXQoJ3N0YXJ0RnJhbWUnLHN0YXJ0RnJhbWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgYXVzcHMuc2V0KCdmcmFtZUxlbmd0aCcsZnJhbWVMZW5ndGgudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgICAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICAgICAgICAvL2F1ZGlvVXJsID0gYXVkaW9VcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgICAgICAgICBhdXNwcy5zZXQoJ3JlcXVlc3RVVUlEJyxVVUlELmdlbmVyYXRlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgb2JzPW5ldyBPYnNlcnZhYmxlPE5ldEF1ZGlvQnVmZmVyfG51bGw+KHN1YnNjcmliZXI9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9SZXF1ZXN0QnlVUkwoYmFzZUF1ZGlvVXJsLGF1c3BzKS5zdWJzY3JpYmUoe25leHQ6KHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxMyAoMTMuMC41KVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwLmJvZHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBzdWJzY3JpYmVyLmNsb3NlZDogXCIrc3Vic2NyaWJlci5jbG9zZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdFRvbmV0QWI6IEF1ZGlvIGZpbGUgYnl0ZXM6IFwiK3Jlc3AuYm9keS5ieXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Db250ZXh0UHJvdmlkZXIuZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSkudGhlbihhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBEZWNvZGVkIGF1ZGlvIGNodW5rIGZyYW1lcyBmb3IgbmV0QWI6IFwiK2FiLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBDcmVhdGUgbmV0QWIgYWIgZnJvbSBjaHVuayBhYi4uLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtZXM9PT1udWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgZnJhbWUgbGVuZ3RoIGZyb20gcmVjb3JkaW5nIGZpbGUgb2JqZWN0JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZsID0gZnJhbWVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWIuc2FtcGxlUmF0ZSAhPT0gb3JnU2FtcGxlUmF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yZ1NhbXBsZVJhdGUgJiYgZnJhbWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmwgPSBNYXRoLnJvdW5kKGFiLnNhbXBsZVJhdGUgKiBmcmFtZXMgLyBvcmdTYW1wbGVSYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJQbGF0Zm9ybSBzcjogXCIrYWIuc2FtcGxlUmF0ZStcIiwgZmlsZSBzcjogXCIrb3JnU2FtcGxlUmF0ZStcIiwgZGVjb2RlZC9vcmcgZnJhbWUgbGVuZ3RoOiBcIitmbCtcIi9cIitmcmFtZXMrXCIsIGFiLmxlbmd0aDogXCIrYWIubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hYiA9IE5ldEF1ZGlvQnVmZmVyLmZyb21DaHVua0F1ZGlvQnVmZmVyKHRoaXMsYmFzZUF1ZGlvVXJsLCBhYiwgZmwsZnJhbWVMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBycD1uZXcgUmVhZHlQcm92aWRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25hYi5yZWFkeVByb3ZpZGVyPXJwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JwLnJlYWR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hYi5yZWFkeSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFiLmZyYW1lTGVuIDwgZnJhbWVMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogQnVpbHQgbmV0QWIgYWIgZnJvbSBjaHVuayBhYjogRmlyc3QgY2h1bmsgc2hvcnRlciB0aGEgZnJhbWVMZW5ndGggKFwiK25ldEFiQXVkaW9CdWZmZXIuZnJhbWVMZW4rXCI8XCIrZnJhbWVMZW5ndGgrXCIpLCBhc3N1bWluZyBlbmQgb2YgZGF0YSwgc2VhbGluZyBuZXRBYiBhYi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWIuc2VhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChuYWIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QWI6IGVycm9yOiAnK2Vycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignY2h1bmtBdWRpb1JlcXVlc3RUb05ldEFiOiBGZXRjaGluZyBhdWRpbyBmaWxlOiByZXNwb25zZSBoYXMgbm8gYm9keScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKCdjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QWI6IEZldGNoaW5nIGF1ZGlvIGZpbGU6IHJlc3BvbnNlIGhhcyBubyBib2R5Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOihlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NodW5rQXVkaW9SZXF1ZXN0VG9OZXRBYjogZXJyb3I6ICcrZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gb2JzO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=