speechrecorderng 2.21.4 → 2.22.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 (111) hide show
  1. package/{esm2015/lib/action/action.js → esm2020/lib/action/action.mjs} +0 -0
  2. package/{esm2015/lib/audio/audio_display.js → esm2020/lib/audio/audio_display.mjs} +5 -5
  3. package/esm2020/lib/audio/audio_player.mjs +276 -0
  4. package/esm2020/lib/audio/capture/capture.mjs +547 -0
  5. package/{esm2015/lib/audio/context.js → esm2020/lib/audio/context.mjs} +0 -0
  6. package/esm2020/lib/audio/dsp/level_measure.mjs +351 -0
  7. package/{esm2015/lib/audio/format.js → esm2020/lib/audio/format.mjs} +0 -0
  8. package/{esm2015/lib/audio/impl/wavformat.js → esm2020/lib/audio/impl/wavformat.mjs} +0 -0
  9. package/{esm2015/lib/audio/impl/wavwriter.js → esm2020/lib/audio/impl/wavwriter.mjs} +0 -0
  10. package/{esm2015/lib/audio/io/stream.js → esm2020/lib/audio/io/stream.mjs} +0 -0
  11. package/{esm2015/lib/audio/persistor.js → esm2020/lib/audio/persistor.mjs} +0 -0
  12. package/{esm2015/lib/audio/playback/player.js → esm2020/lib/audio/playback/player.mjs} +0 -0
  13. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +376 -0
  14. package/{esm2015/lib/audio/ui/audio_display_control.js → esm2020/lib/audio/ui/audio_display_control.mjs} +5 -5
  15. package/{esm2015/lib/audio/ui/audio_display_scroll_pane.js → esm2020/lib/audio/ui/audio_display_scroll_pane.mjs} +5 -5
  16. package/{esm2015/lib/audio/ui/audiosignal.js → esm2020/lib/audio/ui/audiosignal.mjs} +5 -5
  17. package/{esm2015/lib/audio/ui/common.js → esm2020/lib/audio/ui/common.mjs} +0 -0
  18. package/esm2020/lib/audio/ui/container.mjs +431 -0
  19. package/{esm2015/lib/audio/ui/livelevel.js → esm2020/lib/audio/ui/livelevel.mjs} +5 -5
  20. package/{esm2015/lib/audio/ui/scroll_pane_horizontal.js → esm2020/lib/audio/ui/scroll_pane_horizontal.mjs} +4 -4
  21. package/{esm2015/lib/audio/ui/sonagram.js → esm2020/lib/audio/ui/sonagram.mjs} +5 -5
  22. package/{esm2015/lib/dsp/utils.js → esm2020/lib/dsp/utils.mjs} +0 -0
  23. package/{esm2015/lib/io/BinaryWriter.js → esm2020/lib/io/BinaryWriter.mjs} +0 -0
  24. package/{esm2015/lib/io/stream.js → esm2020/lib/io/stream.mjs} +0 -0
  25. package/{esm2015/lib/math/2d/geometry.js → esm2020/lib/math/2d/geometry.mjs} +0 -0
  26. package/{esm2015/lib/math/complex.js → esm2020/lib/math/complex.mjs} +0 -0
  27. package/{esm2015/lib/math/dft.js → esm2020/lib/math/dft.mjs} +0 -0
  28. package/{esm2015/lib/math/utils.js → esm2020/lib/math/utils.mjs} +0 -0
  29. package/esm2020/lib/media/utils.mjs +14 -0
  30. package/esm2020/lib/net/uploader.mjs +246 -0
  31. package/{esm2015/lib/speechrecorder/project/project.js → esm2020/lib/speechrecorder/project/project.mjs} +0 -0
  32. package/{esm2015/lib/speechrecorder/project/project.service.js → esm2020/lib/speechrecorder/project/project.service.mjs} +4 -4
  33. package/esm2020/lib/speechrecorder/recording.mjs +54 -0
  34. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +246 -0
  35. package/{esm2015/lib/speechrecorder/script/script.js → esm2020/lib/speechrecorder/script/script.mjs} +2 -2
  36. package/{esm2015/lib/speechrecorder/script/script.service.js → esm2020/lib/speechrecorder/script/script.service.mjs} +4 -4
  37. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +1144 -0
  38. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +449 -0
  39. package/{esm2015/lib/speechrecorder/session/item.js → esm2020/lib/speechrecorder/session/item.mjs} +1 -1
  40. package/{esm2015/lib/speechrecorder/session/progress.js → esm2020/lib/speechrecorder/session/progress.mjs} +5 -5
  41. package/{esm2015/lib/speechrecorder/session/prompting.js → esm2020/lib/speechrecorder/session/prompting.mjs} +21 -21
  42. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +75 -0
  43. package/esm2020/lib/speechrecorder/session/recording_list.mjs +109 -0
  44. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +126 -0
  45. package/{esm2015/lib/speechrecorder/session/recordingfile/recording-file-navi.component.js → esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs} +5 -5
  46. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +168 -0
  47. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +415 -0
  48. package/{esm2015/lib/speechrecorder/session/recordingfile/recording-file.js → esm2020/lib/speechrecorder/session/recordingfile/recording-file.mjs} +1 -1
  49. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +251 -0
  50. package/{esm2015/lib/speechrecorder/session/session.js → esm2020/lib/speechrecorder/session/session.mjs} +0 -0
  51. package/{esm2015/lib/speechrecorder/session/session.service.js → esm2020/lib/speechrecorder/session/session.service.mjs} +4 -4
  52. package/{esm2015/lib/speechrecorder/session/session_finished_dialog.js → esm2020/lib/speechrecorder/session/session_finished_dialog.mjs} +4 -4
  53. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +1274 -0
  54. package/{esm2015/lib/speechrecorder/session/warning_bar.js → esm2020/lib/speechrecorder/session/warning_bar.mjs} +5 -5
  55. package/{esm2015/lib/speechrecorder/spruploader.js → esm2020/lib/speechrecorder/spruploader.mjs} +4 -4
  56. package/{esm2015/lib/speechrecorder/startstopsignal/startstopsignal.js → esm2020/lib/speechrecorder/startstopsignal/startstopsignal.mjs} +0 -0
  57. package/{esm2015/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.js → esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs} +5 -5
  58. package/esm2020/lib/speechrecorderng.component.mjs +427 -0
  59. package/{esm2015/lib/speechrecorderng.module.js → esm2020/lib/speechrecorderng.module.mjs} +12 -11
  60. package/{esm2015/lib/spr.config.js → esm2020/lib/spr.config.mjs} +4 -4
  61. package/{esm2015/lib/spr.module.version.js → esm2020/lib/spr.module.version.mjs} +2 -2
  62. package/{esm2015/lib/ui/canvas_layer_comp.js → esm2020/lib/ui/canvas_layer_comp.mjs} +4 -4
  63. package/{esm2015/lib/ui/message_dialog.js → esm2020/lib/ui/message_dialog.mjs} +4 -4
  64. package/{esm2015/lib/ui/recordingitem_display.js → esm2020/lib/ui/recordingitem_display.mjs} +9 -9
  65. package/{esm2015/lib/utils/css_utils.js → esm2020/lib/utils/css_utils.mjs} +0 -0
  66. package/{esm2015/lib/utils/scrollIntoViewToBottom.js → esm2020/lib/utils/scrollIntoViewToBottom.mjs} +4 -4
  67. package/{esm2015/lib/utils/ua-parser.js → esm2020/lib/utils/ua-parser.mjs} +0 -0
  68. package/{esm2015/lib/utils/utils.js → esm2020/lib/utils/utils.mjs} +0 -0
  69. package/esm2020/public-api.mjs +31 -0
  70. package/{esm2015/speechrecorderng.js → esm2020/speechrecorderng.mjs} +0 -0
  71. package/fesm2015/speechrecorderng.mjs +11991 -0
  72. package/fesm2015/speechrecorderng.mjs.map +1 -0
  73. package/{fesm2015/speechrecorderng.js → fesm2020/speechrecorderng.mjs} +1863 -285
  74. package/fesm2020/speechrecorderng.mjs.map +1 -0
  75. package/lib/media/utils.d.ts +3 -0
  76. package/lib/net/uploader.d.ts +4 -2
  77. package/lib/speechrecorder/recording.d.ts +14 -3
  78. package/lib/speechrecorder/recordings/recordings.service.d.ts +12 -5
  79. package/lib/speechrecorder/session/audiorecorder.d.ts +150 -0
  80. package/lib/speechrecorder/session/controlpanel.d.ts +2 -1
  81. package/lib/speechrecorder/session/item.d.ts +2 -2
  82. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +26 -0
  83. package/lib/speechrecorder/session/recording_list.d.ts +19 -0
  84. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +6 -2
  85. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +5 -4
  86. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +2 -2
  87. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +5 -3
  88. package/lib/speechrecorder/session/sessionmanager.d.ts +5 -5
  89. package/lib/speechrecorderng.module.d.ts +31 -28
  90. package/lib/spr.module.version.d.ts +1 -1
  91. package/package.json +33 -20
  92. package/public-api.d.ts +2 -1
  93. package/bundles/speechrecorderng.umd.js +0 -10146
  94. package/bundles/speechrecorderng.umd.js.map +0 -1
  95. package/esm2015/lib/audio/audio_player.js +0 -274
  96. package/esm2015/lib/audio/capture/capture.js +0 -544
  97. package/esm2015/lib/audio/dsp/level_measure.js +0 -356
  98. package/esm2015/lib/audio/ui/audio_canvas_layer_comp.js +0 -364
  99. package/esm2015/lib/audio/ui/container.js +0 -412
  100. package/esm2015/lib/net/uploader.js +0 -220
  101. package/esm2015/lib/speechrecorder/recording.js +0 -38
  102. package/esm2015/lib/speechrecorder/recordings/recordings.service.js +0 -173
  103. package/esm2015/lib/speechrecorder/session/controlpanel.js +0 -446
  104. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-meta.component.js +0 -83
  105. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.js +0 -163
  106. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-view.component.js +0 -386
  107. package/esm2015/lib/speechrecorder/session/recordingfile/recordingfile-service.js +0 -191
  108. package/esm2015/lib/speechrecorder/session/sessionmanager.js +0 -1271
  109. package/esm2015/lib/speechrecorderng.component.js +0 -423
  110. package/esm2015/public-api.js +0 -30
  111. package/fesm2015/speechrecorderng.js.map +0 -1
@@ -1,364 +0,0 @@
1
- import { CanvasLayerComponent } from "../../ui/canvas_layer_comp";
2
- import { Selection } from '../persistor';
3
- import { EventEmitter, HostListener, Input, Output, ViewChild, Directive } from "@angular/core";
4
- import { Marker } from "./common";
5
- import * as i0 from "@angular/core";
6
- export class ViewSelection {
7
- constructor(_startX, _endX) {
8
- this._startX = _startX;
9
- this._endX = _endX;
10
- }
11
- get startX() {
12
- return this._startX;
13
- }
14
- get endX() {
15
- return this._endX;
16
- }
17
- width() {
18
- return this._endX - this._startX;
19
- }
20
- }
21
- export class BasicAudioCanvasLayerComponent extends CanvasLayerComponent {
22
- constructor() {
23
- super(...arguments);
24
- this._audioData = null;
25
- this._bgColor = 'white';
26
- this._selectColor = 'rgba(0%,0%,100%,25%)';
27
- }
28
- /**
29
- * Returns pixel position depending on current zoom setting.
30
- * @param framePos audio frame (sample) position
31
- */
32
- frameToXPixelPosition(framePos) {
33
- let pixelPos = null;
34
- if (this._audioData && this._audioData.numberOfChannels > 0) {
35
- let ch0 = this._audioData.getChannelData(0);
36
- let frameLength = ch0.length;
37
- let vw;
38
- if (this.bounds) {
39
- vw = this.bounds.dimension.width;
40
- }
41
- if (this.virtualDimension) {
42
- vw = this.virtualDimension.width;
43
- }
44
- if (vw !== undefined) {
45
- pixelPos = framePos * vw / frameLength;
46
- }
47
- }
48
- return pixelPos;
49
- }
50
- /**
51
- * Returns pixel position in view port (visible window of scroll pane).
52
- * @param framePos audio frame (sample) position
53
- */
54
- frameToViewPortXPixelPosition(framePos) {
55
- let pixelPos = this.frameToXPixelPosition(framePos);
56
- if (pixelPos != null) {
57
- let vPixelPos = this.toXViewPortPixelPosition(pixelPos);
58
- return vPixelPos;
59
- }
60
- else {
61
- return null;
62
- }
63
- }
64
- viewPortXPixelToFramePosition(xViewPortPixelPos) {
65
- let vpXramePos = null;
66
- if (this._audioData && this._audioData.numberOfChannels > 0) {
67
- let ch0 = this._audioData.getChannelData(0);
68
- let frameLength = ch0.length;
69
- let vw;
70
- if (this.bounds) {
71
- vw = this.bounds.dimension.width;
72
- }
73
- if (this.virtualDimension) {
74
- vw = this.virtualDimension.width;
75
- }
76
- if (vw !== undefined) {
77
- let xVirtualPixelPos = this.toXVirtualPixelPosition(xViewPortPixelPos);
78
- let framesPerPixel = frameLength / vw;
79
- let framePos = framesPerPixel * xVirtualPixelPos;
80
- if (framePos < 0) {
81
- framePos = 0;
82
- }
83
- if (framePos >= frameLength) {
84
- framePos = frameLength - 1;
85
- }
86
- vpXramePos = Math.round(framePos);
87
- }
88
- }
89
- return vpXramePos;
90
- }
91
- layoutBounds(bounds, virtualDimension, redraw) {
92
- this.bounds = bounds;
93
- this.virtualDimension = virtualDimension;
94
- //this.canvasLayers.forEach(cl=>{
95
- for (let ci = 0; ci < this.canvasLayers.length; ci++) {
96
- let cl = this.canvasLayers[ci];
97
- const leftStyle = bounds.position.left + 'px';
98
- const topStyle = bounds.position.top + 'px';
99
- cl.style.left = leftStyle;
100
- cl.style.top = topStyle;
101
- }
102
- if (bounds.dimension.width) {
103
- let intW = Math.round(bounds.dimension.width);
104
- if (redraw) {
105
- // Do not set width of background canvas (causes flicker on start render)
106
- for (let ci = 1; ci < this.canvasLayers.length; ci++) {
107
- let cl = this.canvasLayers[ci];
108
- cl.width = intW;
109
- }
110
- }
111
- let wStr = intW.toString() + 'px';
112
- for (let ci = 0; ci < this.canvasLayers.length; ci++) {
113
- let cl = this.canvasLayers[ci];
114
- cl.style.width = wStr;
115
- }
116
- }
117
- if (bounds.dimension.height) {
118
- let intH = Math.round(bounds.dimension.height);
119
- if (redraw) {
120
- // Do not set height of background canvas (causes flicker on start render)
121
- for (let ci = 1; ci < this.canvasLayers.length; ci++) {
122
- let cl = this.canvasLayers[ci];
123
- cl.height = intH;
124
- }
125
- }
126
- let hStr = intH + 'px';
127
- for (let ci = 0; ci < this.canvasLayers.length; ci++) {
128
- let cl = this.canvasLayers[ci];
129
- cl.style.height = hStr;
130
- }
131
- }
132
- //});
133
- }
134
- }
135
- BasicAudioCanvasLayerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: BasicAudioCanvasLayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
136
- BasicAudioCanvasLayerComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: BasicAudioCanvasLayerComponent, usesInheritance: true, ngImport: i0 });
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: BasicAudioCanvasLayerComponent, decorators: [{
138
- type: Directive
139
- }] });
140
- export class AudioCanvasLayerComponent extends BasicAudioCanvasLayerComponent {
141
- constructor() {
142
- super(...arguments);
143
- this._pointerPosition = null;
144
- this.selectStartX = null;
145
- this._selecting = null;
146
- this._selection = null;
147
- this.pointerPositionEventEmitter = new EventEmitter();
148
- this.selectingEventEmitter = new EventEmitter();
149
- this.selectedEventEmitter = new EventEmitter();
150
- }
151
- onMouseup(me) {
152
- this.selectionCommit(me);
153
- }
154
- layoutBounds(bounds, virtualDimension, redraw, clear = true) {
155
- super.layoutBounds(bounds, virtualDimension, redraw);
156
- if (redraw) {
157
- this.startDraw(clear);
158
- }
159
- }
160
- set pointerPosition(pointerPosition) {
161
- this._pointerPosition = pointerPosition;
162
- this.drawCursorLayer();
163
- }
164
- set selecting(selecting) {
165
- this._selecting = selecting;
166
- this.drawBg();
167
- this.drawCursorLayer();
168
- }
169
- get selecting() {
170
- return this._selecting;
171
- }
172
- set selection(selection) {
173
- this._selection = selection;
174
- this.selecting = null;
175
- this.drawBg();
176
- this.drawCursorLayer();
177
- }
178
- get selection() {
179
- return this._selection;
180
- }
181
- selectionStart(me) {
182
- this.selectStartX = me.offsetX;
183
- }
184
- selectionCommit(me) {
185
- let vs = null;
186
- if (this.selectStartX != null) {
187
- vs = new ViewSelection(this.selectStartX, me.offsetX);
188
- this.selectStartX = null;
189
- this.select(vs);
190
- }
191
- }
192
- updateCursorCanvas(me, showCursorPosition = true) {
193
- if (this.cursorCanvas) {
194
- let w = this.cursorCanvas.width;
195
- let h = this.cursorCanvas.height;
196
- let g = this.cursorCanvas.getContext("2d");
197
- // if (!showCursorPosition) {
198
- // this.selectStartX = null
199
- // this.selectingChange(null)
200
- // }
201
- if (me) {
202
- if (this.selectStartX) {
203
- this.pointerPositionChanged(null);
204
- this.selectingChange(new ViewSelection(this.selectStartX, me.offsetX));
205
- }
206
- else {
207
- if (showCursorPosition) {
208
- this.pointerPositionChanged(me.offsetX);
209
- }
210
- else {
211
- this.pointerPositionChanged(null);
212
- }
213
- }
214
- }
215
- }
216
- }
217
- pointerPositionChanged(xPosition) {
218
- let pointerPosition = undefined;
219
- if (xPosition) {
220
- pointerPosition = new Marker();
221
- let vpXPos = this.viewPortXPixelToFramePosition(xPosition);
222
- if (vpXPos != null) {
223
- pointerPosition.framePosition = vpXPos;
224
- }
225
- }
226
- this.pointerPositionEventEmitter.emit(pointerPosition);
227
- }
228
- selectingChange(viewSel) {
229
- let ns = undefined;
230
- if (viewSel) {
231
- let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX);
232
- let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX);
233
- if (this._audioData && frameStart != null && frameEnd != null) {
234
- ns = new Selection(this._audioData.sampleRate, frameStart, frameEnd);
235
- }
236
- }
237
- this.selectingEventEmitter.emit(ns);
238
- }
239
- select(viewSel) {
240
- let ns = undefined;
241
- if (viewSel) {
242
- let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX);
243
- let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX);
244
- if (this._audioData && frameStart != null && frameEnd != null) {
245
- ns = new Selection(this._audioData.sampleRate, frameStart, frameEnd);
246
- }
247
- }
248
- this.selectedEventEmitter.emit(ns);
249
- }
250
- viewSelection() {
251
- let vs = null;
252
- let s = null;
253
- if (this._selecting) {
254
- s = this._selecting;
255
- }
256
- else if (this._selection) {
257
- s = this._selection;
258
- }
259
- if (s) {
260
- let sf = s.startFrame;
261
- let ef = s.endFrame;
262
- let xs = this.frameToViewPortXPixelPosition(sf);
263
- let xe = this.frameToViewPortXPixelPosition(ef);
264
- if (xs != null && xe != null) {
265
- vs = new ViewSelection(xs, xe);
266
- }
267
- }
268
- return vs;
269
- }
270
- drawBg() {
271
- if (this.bgCanvas && this.bounds) {
272
- this.bgCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';
273
- this.bgCanvas.width = Math.round(this.bounds.dimension.width);
274
- this.bgCanvas.height = Math.round(this.bounds.dimension.height);
275
- let g1 = this.bgCanvas.getContext("2d");
276
- if (g1) {
277
- let w = this.bgCanvas.width;
278
- let h = this.bgCanvas.height;
279
- g1.clearRect(0, 0, w, h);
280
- if (this._bgColor) {
281
- g1.fillStyle = this._bgColor;
282
- g1.fillRect(0, 0, w, h);
283
- }
284
- let vs = this.viewSelection();
285
- if (vs) {
286
- g1.fillStyle = this._selectColor;
287
- g1.fillRect(vs.startX, 0, vs.width(), h);
288
- }
289
- }
290
- }
291
- }
292
- drawCursorLayer() {
293
- if (this.cursorCanvas) {
294
- let w = this.cursorCanvas.width;
295
- let h = this.cursorCanvas.height;
296
- let g = this.cursorCanvas.getContext("2d");
297
- if (g) {
298
- g.clearRect(0, 0, w, h);
299
- // let s:Selection=null;
300
- // if(this._selecting){
301
- // s=this._selecting
302
- // }else if(this._selection){
303
- // s=this._selection
304
- // }
305
- // if(s){
306
- // let sf=s.startFrame
307
- // let ef=s.endFrame
308
- // let xs=this.frameToViewPortXPixelPosition(sf)
309
- // let xe=this.frameToViewPortXPixelPosition(ef)
310
- // let sw=xe-xs
311
- // g.fillStyle = 'rgba(0%,0%,100%,25%)';
312
- // g.fillRect(xs,0,sw,h);
313
- // }
314
- if (this._pointerPosition) {
315
- let framePos = this._pointerPosition.framePosition;
316
- if (framePos) {
317
- let xViewPortPixelpos = this.frameToViewPortXPixelPosition(framePos);
318
- if (xViewPortPixelpos) {
319
- g.fillStyle = 'yellow';
320
- g.strokeStyle = 'yellow';
321
- g.beginPath();
322
- g.moveTo(xViewPortPixelpos, 0);
323
- g.lineTo(xViewPortPixelpos, h);
324
- g.closePath();
325
- g.stroke();
326
- if (this._audioData) {
327
- g.font = '14px sans-serif';
328
- g.fillStyle = 'yellow';
329
- g.fillText(framePos.toString(), xViewPortPixelpos + 2, 50);
330
- }
331
- }
332
- }
333
- }
334
- }
335
- }
336
- }
337
- }
338
- AudioCanvasLayerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: AudioCanvasLayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
339
- AudioCanvasLayerComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: AudioCanvasLayerComponent, inputs: { pointerPosition: "pointerPosition", selecting: "selecting", selection: "selection" }, outputs: { pointerPositionEventEmitter: "pointerPositionEventEmitter", selectingEventEmitter: "selectingEventEmitter", selectedEventEmitter: "selectedEventEmitter" }, host: { listeners: { "document:mouseup": "onMouseup($event)" } }, viewQueries: [{ propertyName: "bgCanvasRef", first: true, predicate: ["bg"], descendants: true, static: true }, { propertyName: "cursorCanvasRef", first: true, predicate: ["cursor"], descendants: true, static: true }], usesInheritance: true, ngImport: i0 });
340
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: AudioCanvasLayerComponent, decorators: [{
341
- type: Directive
342
- }], propDecorators: { bgCanvasRef: [{
343
- type: ViewChild,
344
- args: ['bg', { static: true }]
345
- }], cursorCanvasRef: [{
346
- type: ViewChild,
347
- args: ['cursor', { static: true }]
348
- }], onMouseup: [{
349
- type: HostListener,
350
- args: ['document:mouseup', ['$event']]
351
- }], pointerPosition: [{
352
- type: Input
353
- }], selecting: [{
354
- type: Input
355
- }], selection: [{
356
- type: Input
357
- }], pointerPositionEventEmitter: [{
358
- type: Output
359
- }], selectingEventEmitter: [{
360
- type: Output
361
- }], selectedEventEmitter: [{
362
- type: Output
363
- }] } });
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fY2FudmFzX2xheWVyX2NvbXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9fY2FudmFzX2xheWVyX2NvbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQzs7QUFJaEMsTUFBTSxPQUFPLGFBQWE7SUFheEIsWUFBb0IsT0FBYyxFQUFVLEtBQVk7UUFBcEMsWUFBTyxHQUFQLE9BQU8sQ0FBTztRQUFVLFVBQUssR0FBTCxLQUFLLENBQU87SUFBRSxDQUFDO0lBWjNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDaEMsQ0FBQztDQUdGO0FBR0QsTUFBTSxPQUFnQiw4QkFBK0IsU0FBUSxvQkFBb0I7SUFEakY7O1FBRVksZUFBVSxHQUFtQixJQUFJLENBQUM7UUFDbEMsYUFBUSxHQUFhLE9BQU8sQ0FBQztRQUM3QixpQkFBWSxHQUFDLHNCQUFzQixDQUFDO0tBaUgvQztJQS9HQzs7O09BR0c7SUFDSCxxQkFBcUIsQ0FBQyxRQUFnQjtRQUNsQyxJQUFJLFFBQVEsR0FBQyxJQUFJLENB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Q2FudmFzTGF5ZXJDb21wb25lbnR9IGZyb20gXCIuLi8uLi91aS9jYW52YXNfbGF5ZXJfY29tcFwiO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnLi4vcGVyc2lzdG9yJ1xyXG5pbXBvcnQgeyBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBEaXJlY3RpdmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge01hcmtlcn0gZnJvbSBcIi4vY29tbW9uXCI7XHJcbmltcG9ydCB7RGltZW5zaW9uLCBSZWN0YW5nbGV9IGZyb20gXCIuLi8uLi9tYXRoLzJkL2dlb21ldHJ5XCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXdTZWxlY3Rpb257XHJcbiAgZ2V0IHN0YXJ0WCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0WDtcclxuICB9XHJcblxyXG4gIGdldCBlbmRYKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kWDtcclxuICB9XHJcblxyXG4gIHdpZHRoKCk6bnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZFgtdGhpcy5fc3RhcnRYXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zdGFydFg6bnVtYmVyLCBwcml2YXRlIF9lbmRYOm51bWJlcil7fVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2ljQXVkaW9DYW52YXNMYXllckNvbXBvbmVudCBleHRlbmRzIENhbnZhc0xheWVyQ29tcG9uZW50IHtcclxuICBwcm90ZWN0ZWQgX2F1ZGlvRGF0YTogQXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG4gIHByb3RlY3RlZCBfYmdDb2xvcjpzdHJpbmd8bnVsbD0nd2hpdGUnO1xyXG4gIHByb3RlY3RlZCBfc2VsZWN0Q29sb3I9J3JnYmEoMCUsMCUsMTAwJSwyNSUpJztcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBwaXhlbCBwb3NpdGlvbiBkZXBlbmRpbmcgb24gY3VycmVudCB6b29tIHNldHRpbmcuXHJcbiAgICogQHBhcmFtIGZyYW1lUG9zIGF1ZGlvIGZyYW1lIChzYW1wbGUpIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgZnJhbWVUb1hQaXhlbFBvc2l0aW9uKGZyYW1lUG9zOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICAgbGV0IHBpeGVsUG9zPW51bGw7XHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGEgJiYgdGhpcy5fYXVkaW9EYXRhLm51bWJlck9mQ2hhbm5lbHMgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgY2gwID0gdGhpcy5fYXVkaW9EYXRhLmdldENoYW5uZWxEYXRhKDApO1xyXG4gICAgICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gY2gwLmxlbmd0aDtcclxuICAgICAgICAgIGxldCB2dztcclxuICAgICAgICAgIGlmKHRoaXMuYm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgdncgPSB0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsRGltZW5zaW9uKSB7XHJcbiAgICAgICAgICAgICAgdncgPSB0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZih2dyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgcGl4ZWxQb3MgPSBmcmFtZVBvcyAqIHZ3IC8gZnJhbWVMZW5ndGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIHJldHVybiBwaXhlbFBvcztcclxufVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHBpeGVsIHBvc2l0aW9uIGluIHZpZXcgcG9ydCAodmlzaWJsZSB3aW5kb3cgb2Ygc2Nyb2xsIHBhbmUpLlxyXG4gICAqIEBwYXJhbSBmcmFtZVBvcyBhdWRpbyBmcmFtZSAoc2FtcGxlKSBwb3NpdGlvblxyXG4gICAqL1xyXG4gIGZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKGZyYW1lUG9zOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGxldCBwaXhlbFBvcz10aGlzLmZyYW1lVG9YUGl4ZWxQb3NpdGlvbihmcmFtZVBvcyk7XHJcbiAgICBpZihwaXhlbFBvcyE9bnVsbCl7XHJcbiAgICAgIGxldCB2UGl4ZWxQb3MgPSB0aGlzLnRvWFZpZXdQb3J0UGl4ZWxQb3NpdGlvbihwaXhlbFBvcyk7XHJcbiAgICAgIHJldHVybiB2UGl4ZWxQb3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICAgdmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24oeFZpZXdQb3J0UGl4ZWxQb3M6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xyXG4gICAgICAgIGxldCB2cFhyYW1lUG9zPW51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YSAmJiB0aGlzLl9hdWRpb0RhdGEubnVtYmVyT2ZDaGFubmVscyA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGNoMCA9IHRoaXMuX2F1ZGlvRGF0YS5nZXRDaGFubmVsRGF0YSgwKTtcclxuICAgICAgICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gY2gwLmxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IHZ3O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ib3VuZHMpIHtcclxuICAgICAgICAgICAgICAgIHZ3PSB0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbERpbWVuc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdncgPSB0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodnchPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgeFZpcnR1YWxQaXhlbFBvcyA9IHRoaXMudG9YVmlydHVhbFBpeGVsUG9zaXRpb24oeFZpZXdQb3J0UGl4ZWxQb3MpXHJcbiAgICAgICAgICAgICAgICBsZXQgZnJhbWVzUGVyUGl4ZWwgPSBmcmFtZUxlbmd0aCAvIHZ3O1xyXG4gICAgICAgICAgICAgICAgbGV0IGZyYW1lUG9zID0gZnJhbWVzUGVyUGl4ZWwgKiB4VmlydHVhbFBpeGVsUG9zO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lUG9zIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lUG9zID0gMFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lUG9zID49IGZyYW1lTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVQb3MgPSBmcmFtZUxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZwWHJhbWVQb3MgPSBNYXRoLnJvdW5kKGZyYW1lUG9zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdnBYcmFtZVBvcztcclxuICAgIH1cclxuXHJcbiAgICBsYXlvdXRCb3VuZHMoYm91bmRzOlJlY3RhbmdsZSwgdmlydHVhbERpbWVuc2lvbjpEaW1lbnNpb24scmVkcmF3OiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIHRoaXMuYm91bmRzPWJvdW5kcztcclxuICAgICAgICB0aGlzLnZpcnR1YWxEaW1lbnNpb249dmlydHVhbERpbWVuc2lvbjtcclxuICAgICAgICAvL3RoaXMuY2FudmFzTGF5ZXJzLmZvckVhY2goY2w9PntcclxuICAgICAgICBmb3IobGV0IGNpPTA7Y2k8dGhpcy5jYW52YXNMYXllcnMubGVuZ3RoO2NpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICBjb25zdCBsZWZ0U3R5bGU9Ym91bmRzLnBvc2l0aW9uLmxlZnQrICdweCc7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvcFN0eWxlPWJvdW5kcy5wb3NpdGlvbi50b3AgKyAncHgnO1xyXG4gICAgICAgICAgICBjbC5zdHlsZS5sZWZ0ID0gbGVmdFN0eWxlO1xyXG4gICAgICAgICAgICBjbC5zdHlsZS50b3AgPSB0b3BTdHlsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJvdW5kcy5kaW1lbnNpb24ud2lkdGgpIHtcclxuICAgICAgICAgICAgbGV0IGludFc9TWF0aC5yb3VuZChib3VuZHMuZGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICAgICAgaWYgKHJlZHJhdykge1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCB3aWR0aCBvZiBiYWNrZ3JvdW5kIGNhbnZhcyAoY2F1c2VzIGZsaWNrZXIgb24gc3RhcnQgcmVuZGVyKVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBjaT0xO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsLndpZHRoID0gaW50VztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgd1N0ciA9IGludFcudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgICAgICAgIGZvcihsZXQgY2k9MDtjaTx0aGlzLmNhbnZhc0xheWVycy5sZW5ndGg7Y2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICAgICAgY2wuc3R5bGUud2lkdGggPSB3U3RyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChib3VuZHMuZGltZW5zaW9uLmhlaWdodCkge1xyXG4gICAgICAgICAgICBsZXQgaW50SD1NYXRoLnJvdW5kKGJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KVxyXG4gICAgICAgICAgICBpZiAocmVkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEbyBub3Qgc2V0IGhlaWdodCBvZiBiYWNrZ3JvdW5kIGNhbnZhcyAoY2F1c2VzIGZsaWNrZXIgb24gc3RhcnQgcmVuZGVyKVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBjaT0xO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsLmhlaWdodCA9IGludEg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGhTdHIgPSBpbnRIICsgJ3B4JztcclxuICAgICAgICAgICAgZm9yKGxldCBjaT0wO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2wgPSB0aGlzLmNhbnZhc0xheWVyc1tjaV07XHJcbiAgICAgICAgICAgICAgICBjbC5zdHlsZS5oZWlnaHQgPSBoU3RyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vfSk7XHJcblxyXG5cclxuICAgIH1cclxufVxyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IGV4dGVuZHMgQmFzaWNBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IHtcclxuICAgIF9wb2ludGVyUG9zaXRpb246TWFya2VyfG51bGw9bnVsbDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgc2VsZWN0U3RhcnRYOm51bWJlcnxudWxsPW51bGw7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnYmcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBiZ0NhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgICBiZ0NhbnZhcyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2N1cnNvcicsIHsgc3RhdGljOiB0cnVlIH0pIGN1cnNvckNhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgICBjdXJzb3JDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZXVwKG1lOiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbW1pdChtZSlcclxuICB9XHJcblxyXG4gICAgbGF5b3V0Qm91bmRzKGJvdW5kczpSZWN0YW5nbGUsIHZpcnR1YWxEaW1lbnNpb246RGltZW5zaW9uLHJlZHJhdzogYm9vbGVhbixjbGVhcjpib29sZWFuPXRydWUpIHtcclxuICAgICAgICBzdXBlci5sYXlvdXRCb3VuZHMoYm91bmRzLHZpcnR1YWxEaW1lbnNpb24scmVkcmF3KVxyXG4gICAgICAgIGlmIChyZWRyYXcpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFydERyYXcoY2xlYXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBzZXQgcG9pbnRlclBvc2l0aW9uKHBvaW50ZXJQb3NpdGlvbjpNYXJrZXJ8bnVsbCl7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlclBvc2l0aW9uPXBvaW50ZXJQb3NpdGlvblxyXG4gICAgICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICAgIH1cclxuXHJcbiAgICBfc2VsZWN0aW5nOiBTZWxlY3Rpb258bnVsbCA9bnVsbDtcclxuICAgIEBJbnB1dCgpIHNldCBzZWxlY3Rpbmcoc2VsZWN0aW5nOlNlbGVjdGlvbnwgbnVsbCl7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aW5nPXNlbGVjdGluZ1xyXG4gICAgICAgIHRoaXMuZHJhd0JnKClcclxuICAgICAgICB0aGlzLmRyYXdDdXJzb3JMYXllcigpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlbGVjdGluZygpOlNlbGVjdGlvbnxudWxse1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RpbmdcclxuICAgIH1cclxuXHJcbiAgICBfc2VsZWN0aW9uOiBTZWxlY3Rpb258bnVsbCA9bnVsbFxyXG4gICAgQElucHV0KCkgc2V0IHNlbGVjdGlvbihzZWxlY3Rpb246U2VsZWN0aW9ufG51bGwpe1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbj1zZWxlY3Rpb247XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpbmc9bnVsbDtcclxuICAgICAgICB0aGlzLmRyYXdCZygpXHJcbiAgICAgICAgdGhpcy5kcmF3Q3Vyc29yTGF5ZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3Rpb24oKTpTZWxlY3Rpb258bnVsbHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uXHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0aW9uU3RhcnQobWU6TW91c2VFdmVudCl7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RTdGFydFg9bWUub2Zmc2V0WDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3Rpb25Db21taXQobWU6TW91c2VFdmVudCl7XHJcbiAgICAgICAgbGV0IHZzOlZpZXdTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICAgIGlmKHRoaXMuc2VsZWN0U3RhcnRYIT1udWxsKSB7XHJcbiAgICAgICAgICB2cz1uZXcgVmlld1NlbGVjdGlvbih0aGlzLnNlbGVjdFN0YXJ0WCxtZS5vZmZzZXRYKVxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RTdGFydFg9bnVsbDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0KHZzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWJzdHJhY3Qgc3RhcnREcmF3KGNsZWFyOmJvb2xlYW4pOnZvaWQ7XHJcblxyXG4gICAgdXBkYXRlQ3Vyc29yQ2FudmFzKG1lOk1vdXNlRXZlbnQsc2hvd0N1cnNvclBvc2l0aW9uPXRydWUpe1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJzb3JDYW52YXMpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCB3ID0gdGhpcy5jdXJzb3JDYW52YXMud2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBoID0gdGhpcy5jdXJzb3JDYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgZyA9IHRoaXMuY3Vyc29yQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmICghc2hvd0N1cnNvclBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnNlbGVjdFN0YXJ0WCA9IG51bGxcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0aW5nQ2hhbmdlKG51bGwpXHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgaWYgKG1lKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RTdGFydFgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJQb3NpdGlvbkNoYW5nZWQobnVsbClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGluZ0NoYW5nZShuZXcgVmlld1NlbGVjdGlvbih0aGlzLnNlbGVjdFN0YXJ0WCwgbWUub2Zmc2V0WCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd0N1cnNvclBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRlclBvc2l0aW9uQ2hhbmdlZChtZS5vZmZzZXRYKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJQb3NpdGlvbkNoYW5nZWQobnVsbClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpIHBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TWFya2VyPigpO1xyXG4gICAgQE91dHB1dCgpIHNlbGVjdGluZ0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb24+KCk7XHJcblxyXG5cclxuICAgIHBvaW50ZXJQb3NpdGlvbkNoYW5nZWQoeFBvc2l0aW9uOm51bWJlcnwgbnVsbCl7XHJcbiAgICAgICAgbGV0IHBvaW50ZXJQb3NpdGlvbjpNYXJrZXJ8dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICAgICAgICBpZih4UG9zaXRpb24pe1xyXG4gICAgICAgICAgICBwb2ludGVyUG9zaXRpb249bmV3IE1hcmtlcigpO1xyXG4gICAgICAgICAgICBsZXQgdnBYUG9zPXRoaXMudmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24oeFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgaWYodnBYUG9zIT1udWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwb2ludGVyUG9zaXRpb24uZnJhbWVQb3NpdGlvbiA9dnBYUG9zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9pbnRlclBvc2l0aW9uRXZlbnRFbWl0dGVyLmVtaXQocG9pbnRlclBvc2l0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RpbmdDaGFuZ2Uodmlld1NlbDpWaWV3U2VsZWN0aW9ufCBudWxsKXtcclxuICAgICAgICBsZXQgbnM6U2VsZWN0aW9ufHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgICAgICAgaWYodmlld1NlbCkge1xyXG4gICAgICAgICAgICBsZXQgZnJhbWVTdGFydCA9IHRoaXMudmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24odmlld1NlbC5zdGFydFgpXHJcbiAgICAgICAgICAgIGxldCBmcmFtZUVuZCA9IHRoaXMudmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24odmlld1NlbC5lbmRYKVxyXG4gICAgICAgICAgICBpZih0aGlzLl9hdWRpb0RhdGEgJiYgZnJhbWVTdGFydCE9bnVsbCAmJiBmcmFtZUVuZCE9bnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbnMgPSBuZXcgU2VsZWN0aW9uKHRoaXMuX2F1ZGlvRGF0YS5zYW1wbGVSYXRlLCBmcmFtZVN0YXJ0LCBmcmFtZUVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RpbmdFdmVudEVtaXR0ZXIuZW1pdChucylcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3Qodmlld1NlbDpWaWV3U2VsZWN0aW9ufCBudWxsKXtcclxuICAgICAgICBsZXQgbnM6U2VsZWN0aW9ufHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgICAgICAgaWYodmlld1NlbCkge1xyXG4gICAgICAgICAgbGV0IGZyYW1lU3RhcnQgPSB0aGlzLnZpZXdQb3J0WFBpeGVsVG9GcmFtZVBvc2l0aW9uKHZpZXdTZWwuc3RhcnRYKVxyXG4gICAgICAgICAgbGV0IGZyYW1lRW5kID0gdGhpcy52aWV3UG9ydFhQaXhlbFRvRnJhbWVQb3NpdGlvbih2aWV3U2VsLmVuZFgpXHJcbiAgICAgICAgICAgIGlmKHRoaXMuX2F1ZGlvRGF0YSAmJiBmcmFtZVN0YXJ0IT1udWxsICYmIGZyYW1lRW5kIT1udWxsKSB7XHJcbiAgICAgICAgICAgICAgICBucyA9IG5ldyBTZWxlY3Rpb24odGhpcy5fYXVkaW9EYXRhLnNhbXBsZVJhdGUsIGZyYW1lU3RhcnQsIGZyYW1lRW5kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRXZlbnRFbWl0dGVyLmVtaXQobnMpXHJcbiAgICB9XHJcblxyXG4gICAgdmlld1NlbGVjdGlvbigpOlZpZXdTZWxlY3Rpb258bnVsbHtcclxuICAgICAgbGV0IHZzOlZpZXdTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICBsZXQgczpTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICBpZih0aGlzLl9zZWxlY3Rpbmcpe1xyXG4gICAgICAgIHM9dGhpcy5fc2VsZWN0aW5nXHJcbiAgICAgIH1lbHNlIGlmKHRoaXMuX3NlbGVjdGlvbil7XHJcbiAgICAgICAgcz10aGlzLl9zZWxlY3Rpb25cclxuICAgICAgfVxyXG4gICAgICBpZihzKXtcclxuICAgICAgICBsZXQgc2Y9cy5zdGFydEZyYW1lO1xyXG4gICAgICAgIGxldCBlZj1zLmVuZEZyYW1lO1xyXG4gICAgICAgIGxldCB4cz10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKHNmKVxyXG4gICAgICAgIGxldCB4ZT10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKGVmKVxyXG4gICAgICAgICAgaWYoeHMhPW51bGwgJiYgeGUhPW51bGwpIHtcclxuICAgICAgICAgICAgICB2cyA9IG5ldyBWaWV3U2VsZWN0aW9uKHhzLCB4ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdnM7XHJcbiAgICB9XHJcblxyXG5cclxuICBkcmF3QmcoKXtcclxuICAgICAgaWYodGhpcy5iZ0NhbnZhcyAmJiB0aGlzLmJvdW5kcykge1xyXG4gICAgICAgICAgdGhpcy5iZ0NhbnZhcy5zdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5wb3NpdGlvbi5sZWZ0KS50b1N0cmluZygpICsgJ3B4JztcclxuICAgICAgICAgIHRoaXMuYmdDYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLmJnQ2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLmhlaWdodCk7XHJcbiAgICAgICAgbGV0IGcxID0gdGhpcy5iZ0NhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgaWYgKGcxKSB7XHJcbiAgICAgICAgICBsZXQgdyA9IHRoaXMuYmdDYW52YXMud2lkdGg7XHJcbiAgICAgICAgICBsZXQgaCA9IHRoaXMuYmdDYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgICAgZzEuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAgICAgaWYodGhpcy5fYmdDb2xvcikge1xyXG4gICAgICAgICAgICBnMS5maWxsU3R5bGUgPSB0aGlzLl9iZ0NvbG9yO1xyXG4gICAgICAgICAgICBnMS5maWxsUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCB2cyA9IHRoaXMudmlld1NlbGVjdGlvbigpXHJcbiAgICAgICAgICBpZiAodnMpIHtcclxuICAgICAgICAgICAgZzEuZmlsbFN0eWxlID0gdGhpcy5fc2VsZWN0Q29sb3I7XHJcbiAgICAgICAgICAgIGcxLmZpbGxSZWN0KHZzLnN0YXJ0WCwgMCwgdnMud2lkdGgoKSwgaCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgfVxyXG4gICAgZHJhd0N1cnNvckxheWVyKCl7XHJcbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yQ2FudmFzKSB7XHJcbiAgICAgICAgICAgIGxldCB3ID0gdGhpcy5jdXJzb3JDYW52YXMud2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBoID0gdGhpcy5jdXJzb3JDYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgZyA9IHRoaXMuY3Vyc29yQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICAgICAgaWYoZykge1xyXG4gICAgICAgICAgICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgczpTZWxlY3Rpb249bnVsbDtcclxuICAgICAgICAgICAgICAgIC8vIGlmKHRoaXMuX3NlbGVjdGluZyl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcz10aGlzLl9zZWxlY3RpbmdcclxuICAgICAgICAgICAgICAgIC8vIH1lbHNlIGlmKHRoaXMuX3NlbGVjdGlvbil7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcz10aGlzLl9zZWxlY3Rpb25cclxuICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgIC8vIGlmKHMpe1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBzZj1zLnN0YXJ0RnJhbWVcclxuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgZWY9cy5lbmRGcmFtZVxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCB4cz10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKHNmKVxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCB4ZT10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKGVmKVxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBzdz14ZS14c1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGcuZmlsbFN0eWxlID0gJ3JnYmEoMCUsMCUsMTAwJSwyNSUpJztcclxuICAgICAgICAgICAgICAgIC8vICAgICBnLmZpbGxSZWN0KHhzLDAsc3csaCk7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5fcG9pbnRlclBvc2l0aW9uKXtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lUG9zPXRoaXMuX3BvaW50ZXJQb3NpdGlvbi5mcmFtZVBvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWVQb3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhWaWV3UG9ydFBpeGVscG9zID0gdGhpcy5mcmFtZVRvVmlld1BvcnRYUGl4ZWxQb3NpdGlvbihmcmFtZVBvcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhWaWV3UG9ydFBpeGVscG9zKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAneWVsbG93JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAneWVsbG93JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLm1vdmVUbyh4Vmlld1BvcnRQaXhlbHBvcywgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmxpbmVUbyh4Vmlld1BvcnRQaXhlbHBvcywgaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmNsb3NlUGF0aCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZm9udCA9ICcxNHB4IHNhbnMtc2VyaWYnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3llbGxvdyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5maWxsVGV4dChmcmFtZVBvcy50b1N0cmluZygpLCB4Vmlld1BvcnRQaXhlbHBvcyArIDIsIDUwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuIl19