speechrecorderng 3.0.0 → 3.3.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 (142) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +30 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12755 -9195
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +12652 -9101
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +8 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
  120. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  125. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  126. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  127. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  128. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  129. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  130. package/lib/speechrecorderng.component.d.ts +2 -1
  131. package/lib/spr.module.version.d.ts +1 -1
  132. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  133. package/lib/ui/message_dialog.d.ts +1 -1
  134. package/lib/ui/recordingitem_display.d.ts +3 -2
  135. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  136. package/lib/utils/ua-parser.d.ts +4 -1
  137. package/lib/utils/utils.d.ts +6 -0
  138. package/package.json +5 -4
  139. package/esm2020/lib/math/utils.mjs +0 -14
  140. package/esm2020/lib/utils/css_utils.mjs +0 -7
  141. package/lib/math/utils.d.ts +0 -3
  142. package/lib/utils/css_utils.d.ts +0 -3
@@ -1,5 +1,5 @@
1
1
  import { Component, ViewChild, HostListener, Output, Input, } from '@angular/core';
2
- import { AudioClipUIContainer } from '../ui/container';
2
+ import { AudioClipUIContainer } from './container';
3
3
  import { Action } from "../../action/action";
4
4
  import { Position, Dimension, Rectangle } from "../../math/2d/geometry";
5
5
  import * as i0 from "@angular/core";
@@ -15,26 +15,24 @@ export class AudioDisplayScrollPane {
15
15
  this.spEl = this.ref.nativeElement;
16
16
  this.zoomInAction.onAction = (e) => {
17
17
  this.ac.fixFitToPanel = false;
18
- let oldXZoom = this.ac.currentXZoom();
18
+ const oldXZoom = this.ac.currentXZoom();
19
19
  if (oldXZoom === null) {
20
20
  return;
21
21
  }
22
- let newXzoom = oldXZoom * 2;
23
- this.ac.xZoom = newXzoom;
22
+ this.ac.xZoom = oldXZoom * 2;
24
23
  let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
25
24
  this.ac.clipBounds(cbr);
26
25
  this.zoomFitToPanelAction.disabled = false;
27
26
  };
28
27
  this.zoomOutAction.onAction = (e) => {
29
28
  this.ac.fixFitToPanel = false;
30
- let cbr1 = new Rectangle(new Position((this.spEl.scrollLeft / 2) - this.spEl.clientWidth, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
29
+ const cbr1 = new Rectangle(new Position((this.spEl.scrollLeft / 2) - this.spEl.clientWidth, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
31
30
  this.ac.clipBounds(cbr1);
32
31
  let oldXZoom = this.ac.currentXZoom();
33
32
  if (oldXZoom === null) {
34
33
  return;
35
34
  }
36
- let newXzoom = oldXZoom / 2;
37
- this.ac.xZoom = newXzoom;
35
+ this.ac.xZoom = oldXZoom / 2;
38
36
  let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
39
37
  this.ac.clipBounds(cbr);
40
38
  this.zoomFitToPanelAction.disabled = false;
@@ -56,10 +54,8 @@ export class AudioDisplayScrollPane {
56
54
  let sr = this.ac.audioData.sampleRate;
57
55
  let selFrLen = s.endFrame - s.startFrame;
58
56
  let selLenInSecs = selFrLen / sr;
59
- // calculate corresponding xZoom value
60
- let newXZoom = this.spEl.clientWidth / selLenInSecs;
61
- // apply xZoom
62
- this.ac.xZoom = newXZoom;
57
+ // calculate corresponding xZoom value and apply
58
+ this.ac.xZoom = this.spEl.clientWidth / selLenInSecs;
63
59
  // Move viewport to show selection
64
60
  let x1 = this.ac.frameToXPixelPosition(s.startFrame);
65
61
  if (x1 !== null) {
@@ -114,46 +110,19 @@ export class AudioDisplayScrollPane {
114
110
  this.ac.playFramePosition = framePos;
115
111
  }
116
112
  }
117
- AudioDisplayScrollPane.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AudioDisplayScrollPane, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
118
- AudioDisplayScrollPane.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: { audioClip: "audioClip" }, outputs: { zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomSelectedAction: "zoomSelectedAction", zoomFitToPanelAction: "zoomFitToPanelAction" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "ac", first: true, predicate: AudioClipUIContainer, descendants: true, static: true }], ngImport: i0, template: `
113
+ AudioDisplayScrollPane.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioDisplayScrollPane, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
114
+ AudioDisplayScrollPane.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: { audioClip: "audioClip" }, outputs: { zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomSelectedAction: "zoomSelectedAction", zoomFitToPanelAction: "zoomFitToPanelAction" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "ac", first: true, predicate: AudioClipUIContainer, descendants: true, static: true }], ngImport: i0, template: `
119
115
 
120
116
  <app-audio #audioSignalContainer (selectionEventEmitter)="selectionChanged($event)"></app-audio>
121
117
 
122
- `, isInline: true, styles: [":host{flex:2;width:100%;background:darkgray;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "app-audio{margin:0;padding:0;top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n"], components: [{ type: i1.AudioClipUIContainer, selector: "app-audio", inputs: ["audioData", "audioClip"], outputs: ["selectionEventEmitter"] }] });
123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AudioDisplayScrollPane, decorators: [{
118
+ `, isInline: true, styles: [":host{flex:2;width:100%;background:darkgray;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "app-audio{margin:0;padding:0;top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n"], dependencies: [{ kind: "component", type: i1.AudioClipUIContainer, selector: "app-audio", inputs: ["audioData", "audioClip"], outputs: ["selectionEventEmitter"] }] });
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioDisplayScrollPane, decorators: [{
124
120
  type: Component,
125
- args: [{
126
- selector: 'audio-display-scroll-pane',
127
- template: `
121
+ args: [{ selector: 'audio-display-scroll-pane', template: `
128
122
 
129
123
  <app-audio #audioSignalContainer (selectionEventEmitter)="selectionChanged($event)"></app-audio>
130
124
 
131
- `,
132
- styles: [
133
- `:host {
134
- flex: 2;
135
- width: 100%;
136
- background: darkgray;
137
- box-sizing: border-box;
138
- height: 100%;
139
- position: relative;
140
- overflow-x: scroll;
141
- overflow-y: auto;
142
- }`,
143
- `app-audio {
144
-
145
- margin: 0;
146
- padding: 0;
147
- top: 0;
148
- left: 0;
149
- width: 100%;
150
- height: 100%;
151
-
152
- /*position: absolute;*/
153
- box-sizing: border-box;
154
- }`
155
- ]
156
- }]
125
+ `, styles: [":host{flex:2;width:100%;background:darkgray;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "app-audio{margin:0;padding:0;top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n"] }]
157
126
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { zoomInAction: [{
158
127
  type: Output
159
128
  }], zoomOutAction: [{
@@ -174,4 +143,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
174
143
  }], audioClip: [{
175
144
  type: Input
176
145
  }] } });
177
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fZGlzcGxheV9zY3JvbGxfcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby91aS9hdWRpb19kaXNwbGF5X3Njcm9sbF9wYW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFBYyxNQUFNLEVBQUUsS0FBSyxHQUN4QyxNQUFNLGVBQWUsQ0FBQTtBQUd0QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7OztBQXVDckUsTUFBTSxPQUFPLHNCQUFzQjtJQWdCakMsWUFBcUIsR0FBZTtRQUFmLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFaMUIsaUJBQVksR0FBYyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxrQkFBYSxHQUFjLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLHVCQUFrQixHQUFjLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELHlCQUFvQixHQUFjLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZFLDRCQUF1QixHQUFjLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFTaEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUVuQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtZQUM3QixJ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Q0FBQyxRQUFRLENBQUM7Z0JBcUJyQyxTQUFTO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBPdXRwdXQsIElucHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcblxyXG5cclxuaW1wb3J0IHtBdWRpb0NsaXBVSUNvbnRhaW5lcn0gZnJvbSAnLi4vdWkvY29udGFpbmVyJ1xyXG5pbXBvcnQge0FjdGlvbn0gZnJvbSBcIi4uLy4uL2FjdGlvbi9hY3Rpb25cIjtcclxuaW1wb3J0IHtQb3NpdGlvbixEaW1lbnNpb24sIFJlY3RhbmdsZX0gZnJvbSBcIi4uLy4uL21hdGgvMmQvZ2VvbWV0cnlcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXAsIFNlbGVjdGlvbn0gZnJvbSBcIi4uL3BlcnNpc3RvclwiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJ9IGZyb20gXCIuLi9hcnJheV9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXVkaW8tZGlzcGxheS1zY3JvbGwtcGFuZScsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcblxyXG4gICAgPGFwcC1hdWRpbyAjYXVkaW9TaWduYWxDb250YWluZXIgKHNlbGVjdGlvbkV2ZW50RW1pdHRlcik9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIj48L2FwcC1hdWRpbz5cclxuXHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgIGA6aG9zdCB7XHJcbiAgICAgIGZsZXg6IDI7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBiYWNrZ3JvdW5kOiBkYXJrZ3JheTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcclxuICAgICAgb3ZlcmZsb3cteTogYXV0bztcclxuICAgIH1gLFxyXG4gICAgYGFwcC1hdWRpbyB7XHJcblxyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuXHJcbiAgICAvKnBvc2l0aW9uOiBhYnNvbHV0ZTsqL1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lIHtcclxuXHJcbiAgcHJpdmF0ZSBzcEVsITpIVE1MRWxlbWVudDtcclxuXHJcbiAgQE91dHB1dCgpIHpvb21JbkFjdGlvbjpBY3Rpb248dm9pZD49bmV3IEFjdGlvbignKycpO1xyXG4gIEBPdXRwdXQoKSB6b29tT3V0QWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKCctJyk7XHJcbiAgQE91dHB1dCgpIHpvb21TZWxlY3RlZEFjdGlvbjpBY3Rpb248dm9pZD49bmV3IEFjdGlvbihcIlNlbGVjdGVkXCIpO1xyXG4gIEBPdXRwdXQoKSB6b29tRml0VG9QYW5lbEFjdGlvbjpBY3Rpb248dm9pZD49bmV3IEFjdGlvbihcIkZpdCB0byBwYW5lbFwiKTtcclxuICB6b29tRml4Rml0VG9QYW5lbEFjdGlvbjpBY3Rpb248dm9pZD49bmV3IEFjdGlvbihcIkZpeCBmaXQgdG8gcGFuZWxcIik7XHJcblxyXG5cclxuICBAVmlld0NoaWxkKEF1ZGlvQ2xpcFVJQ29udGFpbmVyLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHByaXZhdGUgYWMhOiBBdWRpb0NsaXBVSUNvbnRhaW5lcjtcclxuXHJcblxyXG5cclxuICBjb25zdHJ1Y3RvciggcHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgICAgdGhpcy5zcEVsID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgIHRoaXMuem9vbUluQWN0aW9uLm9uQWN0aW9uID0gKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuYWMuZml4Rml0VG9QYW5lbCA9IGZhbHNlXHJcbiAgICAgICAgICBsZXQgb2xkWFpvb20gPSB0aGlzLmFjLmN1cnJlbnRYWm9vbSgpXHJcbiAgICAgICAgICBpZihvbGRYWm9vbSA9PT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IG5ld1h6b29tID0gb2xkWFpvb20gKiAyO1xyXG4gICAgICAgICAgdGhpcy5hYy54Wm9vbSA9IG5ld1h6b29tO1xyXG5cclxuICAgICAgICAgIGxldCBjYnIgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb3NpdGlvbih0aGlzLnNwRWwuc2Nyb2xsTGVmdCwgdGhpcy5zcEVsLnNjcm9sbFRvcCksIG5ldyBEaW1lbnNpb24odGhpcy5zcEVsLmNsaWVudFdpZHRoLCB0aGlzLnNwRWwuY2xpZW50SGVpZ2h0KSk7XHJcbiAgICAgICAgICB0aGlzLmFjLmNsaXBCb3VuZHMoY2JyKTtcclxuICAgICAgICAgIHRoaXMuem9vbUZpdFRvUGFuZWxBY3Rpb24uZGlzYWJsZWQ9ZmFsc2VcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnpvb21PdXRBY3Rpb24ub25BY3Rpb24gPSAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hYy5maXhGaXRUb1BhbmVsID0gZmFsc2VcclxuICAgICAgICAgIGxldCBjYnIxID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24oKHRoaXMuc3BFbC5zY3JvbGxMZWZ0IC8gMikgLSB0aGlzLnNwRWwuY2xpZW50V2lkdGgsIHRoaXMuc3BFbC5zY3JvbGxUb3ApLCBuZXcgRGltZW5zaW9uKHRoaXMuc3BFbC5jbGllbnRXaWR0aCwgdGhpcy5zcEVsLmNsaWVudEhlaWdodCkpO1xyXG4gICAgICAgICAgdGhpcy5hYy5jbGlwQm91bmRzKGNicjEpO1xyXG4gICAgICAgICAgbGV0IG9sZFhab29tID0gdGhpcy5hYy5jdXJyZW50WFpvb20oKVxyXG4gICAgICAgICAgaWYob2xkWFpvb20gPT09IG51bGwpe1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBuZXdYem9vbSA9IG9sZFhab29tIC8gMjtcclxuICAgICAgICAgIHRoaXMuYWMueFpvb20gPSBuZXdYem9vbTtcclxuXHJcbiAgICAgICAgICBsZXQgY2JyID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odGhpcy5zcEVsLnNjcm9sbExlZnQsIHRoaXMuc3BFbC5zY3JvbGxUb3ApLCBuZXcgRGltZW5zaW9uKHRoaXMuc3BFbC5jbGllbnRXaWR0aCwgdGhpcy5zcEVsLmNsaWVudEhlaWdodCkpO1xyXG4gICAgICAgICAgdGhpcy5hYy5jbGlwQm91bmRzKGNicik7XHJcbiAgICAgICAgICB0aGlzLnpvb21GaXRUb1BhbmVsQWN0aW9uLmRpc2FibGVkPWZhbHNlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuem9vbUZpdFRvUGFuZWxBY3Rpb24ub25BY3Rpb24gPSAoZSkgPT4ge1xyXG5cclxuICAgICAgICAgIHRoaXMuem9vbUZpdFRvUGFuZWxBY3Rpb24uZGlzYWJsZWQ9dHJ1ZVxyXG5cclxuICAgICAgICAgIC8vIHNldCBjb250YWluZXIgZGl2IHdpZHRoIHRvIHRoaXMgKHZpZXdwb3J0KSB3aWR0aFxyXG4gICAgICAgICAgdGhpcy5hYy5jZS5zdHlsZS53aWR0aD10aGlzLnNwRWwub2Zmc2V0V2lkdGgrJ3B4JztcclxuXHJcbiAgICAgICAgICB0aGlzLmFjLmZpeEZpdFRvUGFuZWw9dHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy56b29tU2VsZWN0ZWRBY3Rpb24ub25BY3Rpb24gPSAoZSkgPT4ge1xyXG4gICAgICAgICAgLy9hbGVydChcIm5vdCBpbXBsZW1lbnRlZCB5ZXRcIilcclxuXHJcbiAgICAgICAgICBsZXQgcyA9IHRoaXMuYWMuc2VsZWN0aW9uXHJcbiAgICAgICAgICBpZiAocykge1xyXG4gICAgICAgICAgICAgIC8vIHJlc2V0IGF1dG8gZml0IHRvIHBhbmVsIG1vZGVcclxuICAgICAgICAgICAgICB0aGlzLmFjLmZpeEZpdFRvUGFuZWwgPSBmYWxzZVxyXG5cclxuICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgc2VsZWN0aW9uIGxlbmd0aCBpbiBzZWNvbmRzXHJcbiAgICAgICAgICAgICAgaWYodGhpcy5hYy5hdWRpb0RhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHNyID0gdGhpcy5hYy5hdWRpb0RhdGEuc2FtcGxlUmF0ZTtcclxuICAgICAgICAgICAgICAgICAgbGV0IHNlbEZyTGVuID0gcy5lbmRGcmFtZSAtIHMuc3RhcnRGcmFtZTtcclxuICAgICAgICAgICAgICAgICAgbGV0IHNlbExlbkluU2VjcyA9IHNlbEZyTGVuIC8gc3I7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBjb3JyZXNwb25kaW5nIHhab29tIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgIGxldCBuZXdYWm9vbSA9IHRoaXMuc3BFbC5jbGllbnRXaWR0aCAvIHNlbExlbkluU2Vjc1xyXG4gICAgICAgICAgICAgICAgICAvLyBhcHBseSB4Wm9vbVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFjLnhab29tID0gbmV3WFpvb21cclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdmlld3BvcnQgdG8gc2hvdyBzZWxlY3Rpb25cclxuICAgICAgICAgICAgICAgICAgbGV0IHgxID0gdGhpcy5hYy5mcmFtZVRvWFBpeGVsUG9zaXRpb24ocy5zdGFydEZyYW1lKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHgxICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwRWwuc2Nyb2xsTGVmdCA9IHgxO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xpcEJvdW5kcygpXHJcbiAgICAgICAgICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgdXBkYXRlQ2xpcEJvdW5kcygpe1xyXG4gICAgbGV0IGNicj1uZXcgUmVjdGFuZ2xlKG5ldyBQb3NpdGlvbih0aGlzLnNwRWwuc2Nyb2xsTGVmdCx0aGlzLnNwRWwuc2Nyb2xsVG9wKSwgbmV3IERpbWVuc2lvbih0aGlzLnNwRWwuY2xpZW50V2lkdGgsdGhpcy5zcEVsLmNsaWVudEhlaWdodCkpO1xyXG4gICAgdGhpcy5hYy5jbGlwQm91bmRzKGNicik7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdzY3JvbGwnLCBbJyRldmVudCddKVxyXG4gIG9uU2Nyb2xsKHNlOiBFdmVudCkge1xyXG4gICAgIHRoaXMudXBkYXRlQ2xpcEJvdW5kcygpXHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQ2xpcEJvdW5kcygpXHJcbiAgfVxyXG5cclxuICBsYXlvdXQoKXtcclxuICAgICAgICAgIHRoaXMuYWMubGF5b3V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0aW9uQ2hhbmdlZChzOlNlbGVjdGlvbnwgbnVsbCl7XHJcbiAgICAgIHRoaXMuem9vbVNlbGVjdGVkQWN0aW9uLmRpc2FibGVkPShzPT1udWxsKVxyXG4gICAgfVxyXG5cclxuICBzZXQgYXVkaW9EYXRhKGF1ZGlvRGF0YTogQXVkaW9EYXRhSG9sZGVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy5hYy5hdWRpb0RhdGE9YXVkaW9EYXRhO1xyXG4gICAgICB0aGlzLnpvb21PdXRBY3Rpb24uZGlzYWJsZWQ9KCFhdWRpb0RhdGEpXHJcbiAgICAgIHRoaXMuem9vbUluQWN0aW9uLmRpc2FibGVkPSghYXVkaW9EYXRhKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYXVkaW9DbGlwKGF1ZGlvQ2xpcDogQXVkaW9DbGlwIHwgbnVsbCkge1xyXG5cclxuICAgIGxldCBhdWRpb0RhdGE6QXVkaW9EYXRhSG9sZGVyfG51bGw9bnVsbDtcclxuICAgIGxldCBzZWw6U2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICAgIGlmKGF1ZGlvQ2xpcCl7XHJcbiAgICAgIGF1ZGlvRGF0YT1hdWRpb0NsaXAuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICBzZWw9YXVkaW9DbGlwLnNlbGVjdGlvbjtcclxuICAgICAgYXVkaW9DbGlwLmFkZFNlbGVjdGlvbk9ic2VydmVyKChjbGlwKT0+e1xyXG4gICAgICAgIHRoaXMuem9vbVNlbGVjdGVkQWN0aW9uLmRpc2FibGVkPShjbGlwLnNlbGVjdGlvbj09bnVsbClcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQoc2VsKVxyXG4gICAgdGhpcy5hYy5hdWRpb0NsaXA9YXVkaW9DbGlwXHJcbiAgICB0aGlzLnpvb21PdXRBY3Rpb24uZGlzYWJsZWQ9KCFhdWRpb0RhdGEpXHJcbiAgICB0aGlzLnpvb21JbkFjdGlvbi5kaXNhYmxlZD0oIWF1ZGlvRGF0YSlcclxuICAgICAgd2luZG93LnNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgc2V0IHBsYXlGcmFtZVBvc2l0aW9uKGZyYW1lUG9zOm51bWJlcil7XHJcbiAgICB0aGlzLmFjLnBsYXlGcmFtZVBvc2l0aW9uPWZyYW1lUG9zO1xyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG4iXX0=
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fZGlzcGxheV9zY3JvbGxfcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby91aS9hdWRpb19kaXNwbGF5X3Njcm9sbF9wYW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFBYyxNQUFNLEVBQUUsS0FBSyxHQUN4QyxNQUFNLGVBQWUsQ0FBQTtBQUd0QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDaEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxRQUFRLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7QUFzQ3JFLE1BQU0sT0FBTyxzQkFBc0I7SUFnQmpDLFlBQXFCLEdBQWU7UUFBZixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBWjFCLGlCQUFZLEdBQWMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsa0JBQWEsR0FBYyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyx1QkFBa0IsR0FBYyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCx5QkFBb0IsR0FBYyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RSw0QkFBdUIsR0FBYyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBU2hFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFFbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7WUFDN0IsTUFB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QUFDLFNBQVMsR0FBQyxTQUFTLENBQUE7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNyQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBR0QsSUFBSSxpQkFBaUIsQ0FBQyxRQUFlO1FBQ25DLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEdBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7O29IQTdJVSxzQkFBc0I7d0dBQXRCLHNCQUFzQix3WUFXdEIsb0JBQW9CLDhEQXpDckI7Ozs7R0FJVDs0RkEwQlUsc0JBQXNCO2tCQWxDbEMsU0FBUzsrQkFFRSwyQkFBMkIsWUFFM0I7Ozs7R0FJVDtpR0E4QlMsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBS0MsRUFBRTtzQkFEVCxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpRmpELFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTWxDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcUJyQyxTQUFTO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBPdXRwdXQsIElucHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcblxyXG5cclxuaW1wb3J0IHtBdWRpb0NsaXBVSUNvbnRhaW5lcn0gZnJvbSAnLi9jb250YWluZXInXHJcbmltcG9ydCB7QWN0aW9ufSBmcm9tIFwiLi4vLi4vYWN0aW9uL2FjdGlvblwiO1xyXG5pbXBvcnQge1Bvc2l0aW9uLERpbWVuc2lvbiwgUmVjdGFuZ2xlfSBmcm9tIFwiLi4vLi4vbWF0aC8yZC9nZW9tZXRyeVwiO1xyXG5pbXBvcnQge0F1ZGlvQ2xpcCwgU2VsZWN0aW9ufSBmcm9tIFwiLi4vcGVyc2lzdG9yXCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmUnLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG5cclxuICAgIDxhcHAtYXVkaW8gI2F1ZGlvU2lnbmFsQ29udGFpbmVyIChzZWxlY3Rpb25FdmVudEVtaXR0ZXIpPVwic2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCI+PC9hcHAtYXVkaW8+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgOmhvc3Qge1xyXG4gICAgICBmbGV4OiAyO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgYmFja2dyb3VuZDogZGFya2dyYXk7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICBvdmVyZmxvdy14OiBzY3JvbGw7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICB9YCxcclxuICAgIGBhcHAtYXVkaW8ge1xyXG5cclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcblxyXG4gICAgLypwb3NpdGlvbjogYWJzb2x1dGU7Ki9cclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9EaXNwbGF5U2Nyb2xsUGFuZSB7XHJcblxyXG4gIHByaXZhdGUgc3BFbCE6SFRNTEVsZW1lbnQ7XHJcblxyXG4gIEBPdXRwdXQoKSB6b29tSW5BY3Rpb246QWN0aW9uPHZvaWQ+PW5ldyBBY3Rpb24oJysnKTtcclxuICBAT3V0cHV0KCkgem9vbU91dEFjdGlvbjpBY3Rpb248dm9pZD49bmV3IEFjdGlvbignLScpO1xyXG4gIEBPdXRwdXQoKSB6b29tU2VsZWN0ZWRBY3Rpb246QWN0aW9uPHZvaWQ+PW5ldyBBY3Rpb24oXCJTZWxlY3RlZFwiKTtcclxuICBAT3V0cHV0KCkgem9vbUZpdFRvUGFuZWxBY3Rpb246QWN0aW9uPHZvaWQ+PW5ldyBBY3Rpb24oXCJGaXQgdG8gcGFuZWxcIik7XHJcbiAgem9vbUZpeEZpdFRvUGFuZWxBY3Rpb246QWN0aW9uPHZvaWQ+PW5ldyBBY3Rpb24oXCJGaXggZml0IHRvIHBhbmVsXCIpO1xyXG5cclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb0NsaXBVSUNvbnRhaW5lciwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwcml2YXRlIGFjITogQXVkaW9DbGlwVUlDb250YWluZXI7XHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoIHByaXZhdGUgcmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuc3BFbCA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICB0aGlzLnpvb21JbkFjdGlvbi5vbkFjdGlvbiA9IChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFjLmZpeEZpdFRvUGFuZWwgPSBmYWxzZVxyXG4gICAgICAgICAgY29uc3Qgb2xkWFpvb20gPSB0aGlzLmFjLmN1cnJlbnRYWm9vbSgpXHJcbiAgICAgICAgICBpZihvbGRYWm9vbSA9PT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuYWMueFpvb20gPSBvbGRYWm9vbSAqIDI7XHJcbiAgICAgICAgICBsZXQgY2JyID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odGhpcy5zcEVsLnNjcm9sbExlZnQsIHRoaXMuc3BFbC5zY3JvbGxUb3ApLCBuZXcgRGltZW5zaW9uKHRoaXMuc3BFbC5jbGllbnRXaWR0aCwgdGhpcy5zcEVsLmNsaWVudEhlaWdodCkpO1xyXG4gICAgICAgICAgdGhpcy5hYy5jbGlwQm91bmRzKGNicik7XHJcbiAgICAgICAgICB0aGlzLnpvb21GaXRUb1BhbmVsQWN0aW9uLmRpc2FibGVkPWZhbHNlXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy56b29tT3V0QWN0aW9uLm9uQWN0aW9uID0gKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuYWMuZml4Rml0VG9QYW5lbCA9IGZhbHNlXHJcbiAgICAgICAgICBjb25zdCBjYnIxID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24oKHRoaXMuc3BFbC5zY3JvbGxMZWZ0IC8gMikgLSB0aGlzLnNwRWwuY2xpZW50V2lkdGgsIHRoaXMuc3BFbC5zY3JvbGxUb3ApLCBuZXcgRGltZW5zaW9uKHRoaXMuc3BFbC5jbGllbnRXaWR0aCwgdGhpcy5zcEVsLmNsaWVudEhlaWdodCkpO1xyXG4gICAgICAgICAgdGhpcy5hYy5jbGlwQm91bmRzKGNicjEpO1xyXG4gICAgICAgICAgbGV0IG9sZFhab29tID0gdGhpcy5hYy5jdXJyZW50WFpvb20oKVxyXG4gICAgICAgICAgaWYob2xkWFpvb20gPT09IG51bGwpe1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuYWMueFpvb20gPSBvbGRYWm9vbSAvIDI7XHJcblxyXG4gICAgICAgICAgbGV0IGNiciA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHRoaXMuc3BFbC5zY3JvbGxMZWZ0LCB0aGlzLnNwRWwuc2Nyb2xsVG9wKSwgbmV3IERpbWVuc2lvbih0aGlzLnNwRWwuY2xpZW50V2lkdGgsIHRoaXMuc3BFbC5jbGllbnRIZWlnaHQpKTtcclxuICAgICAgICAgIHRoaXMuYWMuY2xpcEJvdW5kcyhjYnIpO1xyXG4gICAgICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5kaXNhYmxlZD1mYWxzZVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnpvb21GaXRUb1BhbmVsQWN0aW9uLm9uQWN0aW9uID0gKGUpID0+IHtcclxuXHJcbiAgICAgICAgICB0aGlzLnpvb21GaXRUb1BhbmVsQWN0aW9uLmRpc2FibGVkPXRydWVcclxuXHJcbiAgICAgICAgICAvLyBzZXQgY29udGFpbmVyIGRpdiB3aWR0aCB0byB0aGlzICh2aWV3cG9ydCkgd2lkdGhcclxuICAgICAgICAgIHRoaXMuYWMuY2Uuc3R5bGUud2lkdGg9dGhpcy5zcEVsLm9mZnNldFdpZHRoKydweCc7XHJcblxyXG4gICAgICAgICAgdGhpcy5hYy5maXhGaXRUb1BhbmVsPXRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuem9vbVNlbGVjdGVkQWN0aW9uLm9uQWN0aW9uID0gKGUpID0+IHtcclxuICAgICAgICAgIC8vYWxlcnQoXCJub3QgaW1wbGVtZW50ZWQgeWV0XCIpXHJcblxyXG4gICAgICAgICAgbGV0IHMgPSB0aGlzLmFjLnNlbGVjdGlvblxyXG4gICAgICAgICAgaWYgKHMpIHtcclxuICAgICAgICAgICAgICAvLyByZXNldCBhdXRvIGZpdCB0byBwYW5lbCBtb2RlXHJcbiAgICAgICAgICAgICAgdGhpcy5hYy5maXhGaXRUb1BhbmVsID0gZmFsc2VcclxuXHJcbiAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHNlbGVjdGlvbiBsZW5ndGggaW4gc2Vjb25kc1xyXG4gICAgICAgICAgICAgIGlmKHRoaXMuYWMuYXVkaW9EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBzciA9IHRoaXMuYWMuYXVkaW9EYXRhLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBzZWxGckxlbiA9IHMuZW5kRnJhbWUgLSBzLnN0YXJ0RnJhbWU7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBzZWxMZW5JblNlY3MgPSBzZWxGckxlbiAvIHNyO1xyXG4gICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgY29ycmVzcG9uZGluZyB4Wm9vbSB2YWx1ZSBhbmQgYXBwbHlcclxuICAgICAgICAgICAgICAgICAgdGhpcy5hYy54Wm9vbSA9IHRoaXMuc3BFbC5jbGllbnRXaWR0aCAvIHNlbExlbkluU2VjcztcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdmlld3BvcnQgdG8gc2hvdyBzZWxlY3Rpb25cclxuICAgICAgICAgICAgICAgICAgbGV0IHgxID0gdGhpcy5hYy5mcmFtZVRvWFBpeGVsUG9zaXRpb24ocy5zdGFydEZyYW1lKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHgxICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwRWwuc2Nyb2xsTGVmdCA9IHgxO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xpcEJvdW5kcygpXHJcbiAgICAgICAgICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgdXBkYXRlQ2xpcEJvdW5kcygpe1xyXG4gICAgbGV0IGNicj1uZXcgUmVjdGFuZ2xlKG5ldyBQb3NpdGlvbih0aGlzLnNwRWwuc2Nyb2xsTGVmdCx0aGlzLnNwRWwuc2Nyb2xsVG9wKSwgbmV3IERpbWVuc2lvbih0aGlzLnNwRWwuY2xpZW50V2lkdGgsdGhpcy5zcEVsLmNsaWVudEhlaWdodCkpO1xyXG4gICAgdGhpcy5hYy5jbGlwQm91bmRzKGNicik7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdzY3JvbGwnLCBbJyRldmVudCddKVxyXG4gIG9uU2Nyb2xsKHNlOiBFdmVudCkge1xyXG4gICAgIHRoaXMudXBkYXRlQ2xpcEJvdW5kcygpXHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQ2xpcEJvdW5kcygpXHJcbiAgfVxyXG5cclxuICBsYXlvdXQoKXtcclxuICAgICAgICAgIHRoaXMuYWMubGF5b3V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0aW9uQ2hhbmdlZChzOlNlbGVjdGlvbnwgbnVsbCl7XHJcbiAgICAgIHRoaXMuem9vbVNlbGVjdGVkQWN0aW9uLmRpc2FibGVkPShzPT1udWxsKVxyXG4gICAgfVxyXG5cclxuICBzZXQgYXVkaW9EYXRhKGF1ZGlvRGF0YTogQXVkaW9EYXRhSG9sZGVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy5hYy5hdWRpb0RhdGE9YXVkaW9EYXRhO1xyXG4gICAgICB0aGlzLnpvb21PdXRBY3Rpb24uZGlzYWJsZWQ9KCFhdWRpb0RhdGEpXHJcbiAgICAgIHRoaXMuem9vbUluQWN0aW9uLmRpc2FibGVkPSghYXVkaW9EYXRhKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYXVkaW9DbGlwKGF1ZGlvQ2xpcDogQXVkaW9DbGlwIHwgbnVsbCkge1xyXG5cclxuICAgIGxldCBhdWRpb0RhdGE6QXVkaW9EYXRhSG9sZGVyfG51bGw9bnVsbDtcclxuICAgIGxldCBzZWw6U2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICAgIGlmKGF1ZGlvQ2xpcCl7XHJcbiAgICAgIGF1ZGlvRGF0YT1hdWRpb0NsaXAuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICBzZWw9YXVkaW9DbGlwLnNlbGVjdGlvbjtcclxuICAgICAgYXVkaW9DbGlwLmFkZFNlbGVjdGlvbk9ic2VydmVyKChjbGlwKT0+e1xyXG4gICAgICAgIHRoaXMuem9vbVNlbGVjdGVkQWN0aW9uLmRpc2FibGVkPShjbGlwLnNlbGVjdGlvbj09bnVsbClcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQoc2VsKVxyXG4gICAgdGhpcy5hYy5hdWRpb0NsaXA9YXVkaW9DbGlwXHJcbiAgICB0aGlzLnpvb21PdXRBY3Rpb24uZGlzYWJsZWQ9KCFhdWRpb0RhdGEpXHJcbiAgICB0aGlzLnpvb21JbkFjdGlvbi5kaXNhYmxlZD0oIWF1ZGlvRGF0YSlcclxuICAgICAgd2luZG93LnNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgc2V0IHBsYXlGcmFtZVBvc2l0aW9uKGZyYW1lUG9zOm51bWJlcil7XHJcbiAgICB0aGlzLmFjLnBsYXlGcmFtZVBvc2l0aW9uPWZyYW1lUG9zO1xyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG4iXX0=