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
@@ -8,8 +8,33 @@ import { BasicAudioCanvasLayerComponent } from "./audio_canvas_layer_comp";
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "./audiosignal";
10
10
  import * as i2 from "./sonagram";
11
- ;
12
- ;
11
+ /*
12
+ ResizeObserver not yet available in official Typescript declaration
13
+ Crreated declaration from IDL until its available.
14
+ See specs:
15
+ https://www.w3.org/TR/resize-observer
16
+
17
+ */
18
+ // interface ResizeObserverSize {
19
+ // readonly inlineSize:number;
20
+ // readonly blockSize:number;
21
+ // }
22
+ //
23
+ // declare interface ResizeObserverEntry{
24
+ // readonly target: Element;
25
+ // readonly contentRect: DOMRectReadOnly ;
26
+ // readonly borderBoxSize: Array<ResizeObserverSize> ;
27
+ // readonly contentBoxSize: Array<ResizeObserverSize> ;
28
+ // readonly devicePixelContentBoxSize: Array<ResizeObserverSize> ;
29
+ // }
30
+ //
31
+ // declare interface ResizeObserverCallback {
32
+ // (entries: Array<ResizeObserverEntry>, observer: ResizeObserver):void;
33
+ // }
34
+ //
35
+ // declare enum ResizeObserverBoxOptions {
36
+ // "border-box", "content-box", "device-pixel-content-box"
37
+ // };
13
38
  // // Declare Resizeobserver
14
39
  // declare class ResizeObserver{
15
40
  // constructor(callback: ResizeObserverCallback);
@@ -22,7 +47,7 @@ import * as i2 from "./sonagram";
22
47
  * The display elements are children of a virtual canvas. The virtual canvas makes it possible to have high zoom factors with very wide virtual audio displays.
23
48
  * Only the visible part of the virtual canvas is implemented as a browser canvas and therefore consuming memory.
24
49
  * The visible part has the same width as the viewport of the scroll pane parent.
25
- * The virtual canvas itself is implemented as a HTML div element.
50
+ * The virtual canvas itself is implemented as an HTML div element.
26
51
  * The layout of the component is updated on resize of the parent or changes of the zoom factor.
27
52
  */
28
53
  export class AudioClipUIContainer extends BasicAudioCanvasLayerComponent {
@@ -72,7 +97,7 @@ export class AudioClipUIContainer extends BasicAudioCanvasLayerComponent {
72
97
  }
73
98
  ngAfterViewInit() {
74
99
  this.layout();
75
- let heightListener = new MutationObserver((mrs, mo) => {
100
+ const heightListener = new MutationObserver((mrs, mo) => {
76
101
  let layout = false;
77
102
  mrs.forEach((mr) => {
78
103
  if (!this.userAction && 'attributes' === mr.type && ('class' === mr.attributeName || 'style' === mr.attributeName)) {
@@ -86,7 +111,7 @@ export class AudioClipUIContainer extends BasicAudioCanvasLayerComponent {
86
111
  });
87
112
  heightListener.observe(this.ce, { attributes: true, childList: true, characterData: true });
88
113
  heightListener.observe(this.dc, { attributes: true, childList: true, characterData: true });
89
- let resizeObserver = new ResizeObserver((entries, obs) => {
114
+ const resizeObserver = new ResizeObserver((entries, obs) => {
90
115
  //console.log("Resize observed:");
91
116
  entries.forEach((e) => {
92
117
  //console.log(e.contentRect.width+"x"+e.contentRect.height);
@@ -147,12 +172,7 @@ export class AudioClipUIContainer extends BasicAudioCanvasLayerComponent {
147
172
  }
148
173
  dividerCursorPosition(e, show) {
149
174
  if (this.dc) {
150
- const w = this.dc.width;
151
- const h = this.dc.height;
152
- const g = this.dc.getContext('2d');
153
- const pp = this.canvasMousePos(this.dc, e);
154
- const offX = e.offsetX - this.dc.offsetLeft;
155
- const offY = e.offsetY - this.dc.offsetTop;
175
+ this.canvasMousePos(this.dc, e);
156
176
  }
157
177
  }
158
178
  dividerDrag(e) {
@@ -238,8 +258,8 @@ export class AudioClipUIContainer extends BasicAudioCanvasLayerComponent {
238
258
  this.dc.style.left = vbLeftStyl;
239
259
  }
240
260
  // top position
241
- const dTop = asH;
242
- const dTopStr = dTop + 'px';
261
+ //const dTop = asH;
262
+ const dTopStr = asH + 'px';
243
263
  if (this.dc.style.top != dTopStr) {
244
264
  this.dc.style.top = dTopStr;
245
265
  }
@@ -344,62 +364,25 @@ export class AudioClipUIContainer extends BasicAudioCanvasLayerComponent {
344
364
  }
345
365
  }
346
366
  AudioClipUIContainer.DIVIDER_PIXEL_SIZE = 10;
347
- AudioClipUIContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AudioClipUIContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
348
- AudioClipUIContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: AudioClipUIContainer, selector: "app-audio", inputs: { audioData: "audioData", audioClip: "audioClip" }, outputs: { selectionEventEmitter: "selectionEventEmitter" }, host: { listeners: { "window:resize": "onResize($event)", "document:mouseup": "onMouseup($event)", "document:mousemove": "onMousemove($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["divider"], descendants: true, static: true }, { propertyName: "ceRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "as", first: true, predicate: AudioSignal, descendants: true, static: true }, { propertyName: "so", first: true, predicate: Sonagram, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
367
+ AudioClipUIContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioClipUIContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
368
+ AudioClipUIContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioClipUIContainer, selector: "app-audio", inputs: { audioData: "audioData", audioClip: "audioClip" }, outputs: { selectionEventEmitter: "selectionEventEmitter" }, host: { listeners: { "window:resize": "onResize($event)", "document:mouseup": "onMouseup($event)", "document:mousemove": "onMousemove($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["divider"], descendants: true, static: true }, { propertyName: "ceRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "as", first: true, predicate: AudioSignal, descendants: true, static: true }, { propertyName: "so", first: true, predicate: Sonagram, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
349
369
  <div #virtualCanvas>
350
370
  <canvas #divider (mousedown)="mousedown($event)" (mouseover)="mouseover($event)"
351
371
  (mouseleave)="mouseleave($event)" height="10"></canvas>
352
372
  <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
353
373
  <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
354
374
  </div>
355
- `, isInline: true, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;zIndex:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;zIndex:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;zIndex:1;transform:none}\n"], components: [{ type: i1.AudioSignal, selector: "audio-signal" }, { type: i2.Sonagram, selector: "audio-sonagram" }] });
356
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AudioClipUIContainer, decorators: [{
375
+ `, isInline: true, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;zIndex:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;zIndex:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;zIndex:1;transform:none}\n"], dependencies: [{ kind: "component", type: i1.AudioSignal, selector: "audio-signal" }, { kind: "component", type: i2.Sonagram, selector: "audio-sonagram" }] });
376
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioClipUIContainer, decorators: [{
357
377
  type: Component,
358
- args: [{
359
- selector: 'app-audio',
360
- template: `
378
+ args: [{ selector: 'app-audio', template: `
361
379
  <div #virtualCanvas>
362
380
  <canvas #divider (mousedown)="mousedown($event)" (mouseover)="mouseover($event)"
363
381
  (mouseleave)="mouseleave($event)" height="10"></canvas>
364
382
  <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
365
383
  <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
366
384
  </div>
367
- `,
368
- styles: [`div {
369
-
370
- margin: 0;
371
- padding: 0;
372
- top: 0;
373
- left: 0;
374
- width: 100%;
375
- height: 100%;
376
- position: relative; /* TODO container div position must not be 'static' (default) to act as reference for the canvases */
377
- box-sizing: border-box;
378
- transform: none;
379
- overflow: hidden;
380
- }`, `canvas{
381
- top: 0;
382
- left: 0;
383
- width: 0;
384
- height: 0;
385
- cursor: ns-resize;
386
- position: absolute;
387
- zIndex: 1;
388
- transform: none;
389
- }`, `audio-signal {
390
- top: 0;
391
- left: 0;
392
- position: absolute;
393
- zIndex: 1;
394
- transform: none;
395
- }`, `audio-sonagram {
396
- top: 0;
397
- left: 0;
398
- position: absolute;
399
- zIndex: 1;
400
- transform: none;
401
- }`]
402
- }]
385
+ `, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;zIndex:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;zIndex:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;zIndex:1;transform:none}\n"] }]
403
386
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { canvasRef: [{
404
387
  type: ViewChild,
405
388
  args: ['divider', { static: true }]
@@ -428,4 +411,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
428
411
  }], audioClip: [{
429
412
  type: Input
430
413
  }] } });
431
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ3NCLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFDN0UsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ25DLE9BQU8sRUFBUyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFFdEMsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFleEUsQ0FBQztBQWdCRCxDQUFDO0FBRUYsNEJBQTRCO0FBQzVCLGdDQUFnQztBQUNoQyxtREFBbUQ7QUFDbkQsdUVBQXVFO0FBQ3ZFLG1DQUFtQztBQUNuQywwQkFBMEI7QUFDMUIsSUFBSTtBQUVKOzs7Ozs7O0dBT0c7QUFnREgsTUFBTSxPQUFPLG9CQUFxQixTQUFRLDhCQUE4QjtJQTBEdEUsWUFBb0IsR0FBZTtRQUNqQyxLQUFLLEVBQUUsQ0FBQTtRQURXLFFBQUcsR0FBSCxHQUFHLENBQVk7UUF6QzNCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ3pDLFlBQU8sR0FBYyxJQUFJLENBQUM7UUFDMUIsY0FBUyxHQUFpQixJQUFJLENBQUM7UUFDL0IsY0FBUyxHQUFpQixJQUFJLENBQUM7UUFDckIsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUN4RCx1QkFB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LFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0QsRUFBRTtzQkFBeEMsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU0zQixxQkFBcUI7c0JBQTlCLE1BQU07Z0JBK0VQLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBb0J6QyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBWTVDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkE4TjFDLFNBQVM7c0JBRFosS0FBSztnQkFlRixTQUFTO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQge0F1ZGlvU2lnbmFsfSBmcm9tICcuL2F1ZGlvc2lnbmFsJ1xyXG5pbXBvcnQge1NvbmFncmFtfSBmcm9tICcuL3NvbmFncmFtJ1xyXG5pbXBvcnQge01hcmtlciwgUG9pbnR9IGZyb20gJy4vY29tbW9uJ1xyXG5cclxuaW1wb3J0IHtDb21wb25lbnQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7UG9zaXRpb24sRGltZW5zaW9uLCBSZWN0YW5nbGV9IGZyb20gXCIuLi8uLi9tYXRoLzJkL2dlb21ldHJ5XCI7XHJcbmltcG9ydCB7QXVkaW9DbGlwLFNlbGVjdGlvbn0gZnJvbSBcIi4uL3BlcnNpc3RvclwiO1xyXG5pbXBvcnQge0Jhc2ljQXVkaW9DYW52YXNMYXllckNvbXBvbmVudH0gZnJvbSBcIi4vYXVkaW9fY2FudmFzX2xheWVyX2NvbXBcIjtcclxuaW1wb3J0IHtFbGVtZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXJcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5cclxuLypcclxuICBSZXNpemVPYnNlcnZlciBub3QgeWV0IGF2YWlsYWJsZSBpbiBvZmZpY2lhbCBUeXBlc2NyaXB0IGRlY2xhcmF0aW9uXHJcbiAgQ3JyZWF0ZWQgZGVjbGFyYXRpb24gZnJvbSBJREwgdW50aWwgaXRzIGF2YWlsYWJsZS5cclxuICBTZWUgc3BlY3M6XHJcbiAgaHR0cHM6Ly93d3cudzMub3JnL1RSL3Jlc2l6ZS1vYnNlcnZlclxyXG5cclxuICovXHJcblxyXG5pbnRlcmZhY2UgUmVzaXplT2JzZXJ2ZXJTaXplIHtcclxuICByZWFkb25seSBpbmxpbmVTaXplOm51bWJlcjtcclxuICByZWFkb25seSBibG9ja1NpemU6bnVtYmVyO1xyXG59O1xyXG5cclxuZGVjbGFyZSBpbnRlcmZhY2UgUmVzaXplT2JzZXJ2ZXJFbnRyeXtcclxuICByZWFkb25seSB0YXJnZXQ6IEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgY29udGVudFJlY3Q6IERPTVJlY3RSZWFkT25seSA7XHJcbiAgcmVhZG9ubHkgYm9yZGVyQm94U2l6ZTogQXJyYXk8UmVzaXplT2JzZXJ2ZXJTaXplPiA7XHJcbiAgcmVhZG9ubHkgY29udGVudEJveFNpemU6IEFycmF5PFJlc2l6ZU9ic2VydmVyU2l6ZT4gO1xyXG4gIHJlYWRvbmx5IGRldmljZVBpeGVsQ29udGVudEJveFNpemU6IEFycmF5PFJlc2l6ZU9ic2VydmVyU2l6ZT4gO1xyXG59XHJcblxyXG5kZWNsYXJlIGludGVyZmFjZSBSZXNpemVPYnNlcnZlckNhbGxiYWNrIHtcclxuICAoZW50cmllczogQXJyYXk8UmVzaXplT2JzZXJ2ZXJFbnRyeT4sIG9ic2VydmVyOiBSZXNpemVPYnNlcnZlcik6dm9pZDtcclxufVxyXG5cclxuZGVjbGFyZSBlbnVtIFJlc2l6ZU9ic2VydmVyQm94T3B0aW9ucyB7XHJcbiAgXCJib3JkZXItYm94XCIsIFwiY29udGVudC1ib3hcIiwgXCJkZXZpY2UtcGl4ZWwtY29udGVudC1ib3hcIlxyXG59O1xyXG5cclxuLy8gLy8gRGVjbGFyZSBSZXNpemVvYnNlcnZlclxyXG4vLyBkZWNsYXJlIGNsYXNzIFJlc2l6ZU9ic2VydmVye1xyXG4vLyAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBSZXNpemVPYnNlcnZlckNhbGxiYWNrKTtcclxuLy8gICBvYnNlcnZlOiAoZWw6RWxlbWVudCxvcHRzOiBSZXNpemVPYnNlcnZlckJveE9wdGlvbnMgfCBudWxsKT0+dm9pZDtcclxuLy8gICB1bm9ic2VydmU6IChlbDpFbGVtZW50KT0+dm9pZDtcclxuLy8gICBkaXNjb25uZWN0OiAoKT0+dm9pZDtcclxuLy8gfVxyXG5cclxuLypcclxuICogQ29udGFpbmVyIGNvbXBvbmVudCBmb3IgYXVkaW8gZGlzcGxheS5cclxuICogVGhlIGRpc3BsYXkgZWxlbWVudHMgYXJlIGNoaWxkcmVuIG9mIGEgdmlydHVhbCBjYW52YXMuIFRoZSB2aXJ0dWFsIGNhbnZhcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlIGhpZ2ggem9vbSBmYWN0b3JzIHdpdGggdmVyeSB3aWRlIHZpcnR1YWwgYXVkaW8gZGlzcGxheXMuXHJcbiAqIE9ubHkgdGhlIHZpc2libGUgcGFydCBvZiB0aGUgdmlydHVhbCBjYW52YXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBicm93c2VyIGNhbnZhcyBhbmQgdGhlcmVmb3JlIGNvbnN1bWluZyBtZW1vcnkuXHJcbiAqIFRoZSB2aXNpYmxlIHBhcnQgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIHRoZSB2aWV3cG9ydCBvZiB0aGUgc2Nyb2xsIHBhbmUgcGFyZW50LlxyXG4gKiBUaGUgdmlydHVhbCBjYW52YXMgaXRzZWxmIGlzIGltcGxlbWVudGVkIGFzIGEgSFRNTCBkaXYgZWxlbWVudC5cclxuICogVGhlIGxheW91dCBvZiB0aGUgY29tcG9uZW50IGlzIHVwZGF0ZWQgb24gcmVzaXplIG9mIHRoZSBwYXJlbnQgb3IgY2hhbmdlcyBvZiB0aGUgem9vbSBmYWN0b3IuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtYXVkaW8nLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2ICN2aXJ0dWFsQ2FudmFzPlxyXG4gICAgPGNhbnZhcyAjZGl2aWRlciAobW91c2Vkb3duKT1cIm1vdXNlZG93bigkZXZlbnQpXCIgKG1vdXNlb3Zlcik9XCJtb3VzZW92ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlbGVhdmUoJGV2ZW50KVwiIGhlaWdodD1cIjEwXCI+PC9jYW52YXM+XHJcbiAgICA8YXVkaW8tc2lnbmFsIFtwb2ludGVyUG9zaXRpb25dPVwicG9pbnRlclwiIFtzZWxlY3RpbmddPVwic2VsZWN0aW5nXCIgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIiAocG9pbnRlclBvc2l0aW9uRXZlbnRFbWl0dGVyKT1cInBvaW50ZXJQb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiIChzZWxlY3RpbmdFdmVudEVtaXR0ZXIpPVwic2VsZWN0aW5nQ2hhbmdlZCgkZXZlbnQpXCIgKHNlbGVjdGVkRXZlbnRFbWl0dGVyKT1cInNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KVwiPjwvYXVkaW8tc2lnbmFsPlxyXG4gICAgPGF1ZGlvLXNvbmFncmFtIFtwb2ludGVyUG9zaXRpb25dPVwicG9pbnRlclwiIFtzZWxlY3RpbmddPVwic2VsZWN0aW5nXCIgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIiAocG9pbnRlclBvc2l0aW9uRXZlbnRFbWl0dGVyKT1cInBvaW50ZXJQb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiIChzZWxlY3RpbmdFdmVudEVtaXR0ZXIpPVwic2VsZWN0aW5nQ2hhbmdlZCgkZXZlbnQpXCIgKHNlbGVjdGVkRXZlbnRFbWl0dGVyKT1cInNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KVwiPjwvYXVkaW8tc29uYWdyYW0+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlczogW2BkaXYge1xyXG5cclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIFRPRE8gY29udGFpbmVyIGRpdiBwb3NpdGlvbiBtdXN0IG5vdCBiZSAnc3RhdGljJyAoZGVmYXVsdCkgdG8gYWN0IGFzIHJlZmVyZW5jZSBmb3IgdGhlIGNhbnZhc2VzICovXHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9YCwgYGNhbnZhc3tcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMDtcclxuICAgIGhlaWdodDogMDtcclxuICAgIGN1cnNvcjogbnMtcmVzaXplO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgekluZGV4OiAxO1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gIH1gLCBgYXVkaW8tc2lnbmFsIHtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6SW5kZXg6IDE7XHJcbiAgICB0cmFuc2Zvcm06IG5vbmU7XHJcbiAgfWAsIGBhdWRpby1zb25hZ3JhbSB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgekluZGV4OiAxO1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvQ2xpcFVJQ29udGFpbmVyIGV4dGVuZHMgQmFzaWNBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXR7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIERJVklERVJfUElYRUxfU0laRSA9IDEwO1xyXG5cclxuICBwYXJlbnRFOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgLy8gRGl2aWRlciBjYW52YXNcclxuICBAVmlld0NoaWxkKCdkaXZpZGVyJywgeyBzdGF0aWM6IHRydWUgfSkgY2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBkYyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG5cclxuICAvLyBWaXJ0dWFsIGNvbnRhaW5lclxyXG4gIEBWaWV3Q2hpbGQoJ3ZpcnR1YWxDYW52YXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjZVJlZiE6IEVsZW1lbnRSZWY7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb1NpZ25hbCwgeyBzdGF0aWM6IHRydWUgfSkgYXMhOiBBdWRpb1NpZ25hbDtcclxuICBAVmlld0NoaWxkKFNvbmFncmFtLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbyE6IFNvbmFncmFtO1xyXG5cclxuICBwcml2YXRlIF9hdWRpb0NsaXA6QXVkaW9DbGlwIHwgbnVsbD1udWxsO1xyXG4gIHBvaW50ZXI6IE1hcmtlcnxudWxsPW51bGw7XHJcbiAgc2VsZWN0aW5nOiBTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gIHNlbGVjdGlvbjogU2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb24+KCk7XHJcbiAgcHJpdmF0ZSBfcGxheUZyYW1lUG9zaXRpb246IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkcmFnU3RhcnRNb3VzZVk6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0WTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkaXZpZGVyUG9zaXRpb24gPSAwLjU7XHJcblxyXG4gIHVzZXJBY3Rpb249ZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3hab29tOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gcGl4ZWxzIHBlciBzZWNvbmRcclxuXHJcbiAgZ2V0IHhab29tKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3hab29tO1xyXG4gIH1cclxuXHJcbiAgc2V0IHhab29tKHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XHJcbiAgICB0aGlzLnVzZXJBY3Rpb249dHJ1ZTtcclxuICAgIHRoaXMuX3hab29tID0gdmFsdWU7XHJcbiAgICB0aGlzLmxheW91dCgpXHJcbiAgICB0aGlzLnVzZXJBY3Rpb249ZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBpZiB0cnVlIHRoZSBjb21wbGV0ZSBhdWRpbyBmaWxlIGlzIHNob3duLCB0aGUgZGlzcGxheSBmaXRzIHRvIHRoZSB2aXNpYmxlIHBhbmVsLCB0aGUgeC16b29tIGZhY3RvciBpcyB2YXJpYWJsZSwgdGhpcyBpcyB0aGUgZGVmYXVsdFxyXG4gIHByaXZhdGUgX2ZpeEZpdFRvUGFuZWwgPSB0cnVlO1xyXG5cclxuICBzZXQgZml4Rml0VG9QYW5lbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZml4Rml0VG9QYW5lbCA9IHZhbHVlO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIC8vIHdlIGRvbid0IG5lZWQgIGNsaXAgYm91bmRzXHJcbiAgICAgIHRoaXMuYm91bmRzPW51bGw7XHJcbiAgICAgIHRoaXMuX3hab29tID0gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGhvbGQgY3VycmVudCB6b29tIHZhbHVlXHJcbiAgICAgIC8vdGhpcy5feFpvb209dGhpcy5jZS5vZmZzZXRXaWR0aC90aGlzLl9hdWRpb0RhdGEuZHVyYXRpb247XHJcbiAgICB9XHJcbiAgICB0aGlzLmxheW91dCgpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5wYXJlbnRFID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jZSA9IHRoaXMuY2VSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuZGMgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICAgIGxldCBoZWlnaHRMaXN0ZW5lciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtcnM6IEFycmF5PE11dGF0aW9uUmVjb3JkPiwgbW86IE11dGF0aW9uT2JzZXJ2ZXIpID0+IHtcclxuXHJcbiAgICAgIGxldCBsYXlvdXQ9ZmFsc2U7XHJcbiAgICAgIG1ycy5mb3JFYWNoKChtcjogTXV0YXRpb25SZWNvcmQpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlckFjdGlvbiAmJiAnYXR0cmlidXRlcycgPT09IG1yLnR5cGUgJiYgKCdjbGFzcycgPT09IG1yLmF0dHJpYnV0ZU5hbWUgfHwgJ3N0eWxlJyA9PT0gbXIuYXR0cmlidXRlTmFtZSkpIHtcclxuICAgICAgICAgIGxheW91dD10cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmKGxheW91dCl7XHJcbiAgICAgICAgLy8gcmUtbGF5b3V0IHJlcXVpcmVkXHJcbiAgICAgICAgdGhpcy5sYXlvdXQoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBoZWlnaHRMaXN0ZW5lci5vYnNlcnZlKHRoaXMuY2UsIHthdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWV9KTtcclxuICAgIGhlaWdodExpc3RlbmVyLm9ic2VydmUodGhpcy5kYywge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZX0pO1xyXG5cclxuICAgIGxldCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcyxvYnMpID0+IHtcclxuICAgICAgLy9jb25zb2xlLmxvZyhcIlJlc2l6ZSBvYnNlcnZlZDpcIik7XHJcbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoZSk9PntcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGUuY29udGVudFJlY3Qud2lkdGgrXCJ4XCIrZS5jb250ZW50UmVjdC5oZWlnaHQpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuY2UpO1xyXG5cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gIG9uUmVzaXplKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIG1vdXNlb3ZlcihtZTogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5kaXZpZGVyQ3Vyc29yUG9zaXRpb24obWUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgbW91c2VsZWF2ZShtZTogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5kaXZpZGVyQ3Vyc29yUG9zaXRpb24obWUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIG1vdXNlZG93bihtZTogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5kcmFnU3RhcnRNb3VzZVkgPSBtZS5jbGllbnRZO1xyXG4gICAgdGhpcy5kcmFnU3RhcnRZID0gdGhpcy5kYy5vZmZzZXRUb3A7XHJcbiAgICB0aGlzLmRyYWdTdGFydE1vdXNlWSA9IG1lLmNsaWVudFk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNldXAobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRyYWdTdGFydFkgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnVzZXJBY3Rpb249dHJ1ZTtcclxuICAgICAgdGhpcy5kaXZpZGVyRHJhZyhtZSk7XHJcbiAgICAgIHRoaXMubGF5b3V0KGZhbHNlKTtcclxuICAgICAgdGhpcy5kcmFnU3RhcnRZID0gbnVsbDtcclxuICAgICAgdGhpcy51c2VyQWN0aW9uPWZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlbW92ZShtZTogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZHJhZ1N0YXJ0WSAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj10cnVlO1xyXG4gICAgICB0aGlzLmRpdmlkZXJEcmFnKG1lKTtcclxuICAgICAgdGhpcy5sYXlvdXRTY2FsZWQoKTtcclxuICAgICAgdGhpcy51c2VyQWN0aW9uPXRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwb2ludGVyUG9zaXRpb25DaGFuZ2VkKHBwOk1hcmtlcil7XHJcbiAgICB0aGlzLnBvaW50ZXI9cHBcclxuICB9XHJcblxyXG4gIHNlbGVjdGluZ0NoYW5nZWQoczpTZWxlY3Rpb258IG51bGwpe1xyXG4gICAgdGhpcy5zZWxlY3Rpbmc9c1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0aW9uQ2hhbmdlZChzOlNlbGVjdGlvbil7XHJcbiAgICB0aGlzLnNlbGVjdGlvbj1zXHJcbiAgICBpZih0aGlzLl9hdWRpb0NsaXApe1xyXG4gICAgICB0aGlzLl9hdWRpb0NsaXAuc2VsZWN0aW9uPXNcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0aW9uRXZlbnRFbWl0dGVyLmVtaXQodGhpcy5zZWxlY3Rpb24pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbnZhc01vdXNlUG9zKGM6IEhUTUxDYW52YXNFbGVtZW50LCBlOiBNb3VzZUV2ZW50KTogUG9pbnQge1xyXG4gICAgY29uc3QgY3IgPSBjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgeCA9IGUueCAtIGNyLmxlZnQ7XHJcbiAgICBjb25zdCB5ID0gZS55IC0gY3IudG9wO1xyXG4gICAgcmV0dXJuIG5ldyBQb2ludCh4LHkpO1xyXG4gIH1cclxuXHJcbiAgZGl2aWRlckN1cnNvclBvc2l0aW9uKGU6IE1vdXNlRXZlbnQsIHNob3c6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmRjKSB7XHJcblxyXG4gICAgICBjb25zdCB3ID0gdGhpcy5kYy53aWR0aDtcclxuICAgICAgY29uc3QgaCA9IHRoaXMuZGMuaGVpZ2h0O1xyXG4gICAgICBjb25zdCBnID0gdGhpcy5kYy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgY29uc3QgcHAgPSB0aGlzLmNhbnZhc01vdXNlUG9zKHRoaXMuZGMsIGUpO1xyXG4gICAgICBjb25zdCBvZmZYID0gZS5vZmZzZXRYIC0gdGhpcy5kYy5vZmZzZXRMZWZ0O1xyXG4gICAgICBjb25zdCBvZmZZID0gZS5vZmZzZXRZIC0gdGhpcy5kYy5vZmZzZXRUb3A7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGl2aWRlckRyYWcoZTogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZGMgJiYgdGhpcy5kcmFnU3RhcnRNb3VzZVkgJiYgdGhpcy5kcmFnU3RhcnRZKSB7XHJcblxyXG4gICAgICBjb25zdCBkcmFnT2Zmc2V0ID0gZS5jbGllbnRZIC0gdGhpcy5kcmFnU3RhcnRNb3VzZVk7XHJcbiAgICAgIGNvbnN0IGNlSGVpZ2h0ID0gdGhpcy5jZS5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgbmV3VG9wID0gKHRoaXMuZHJhZ1N0YXJ0WSArIGRyYWdPZmZzZXQpO1xyXG4gICAgICBpZiAobmV3VG9wIDwgMCkge1xyXG4gICAgICAgIG5ld1RvcCA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld1RvcCA+IGNlSGVpZ2h0IC0gQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFKSB7XHJcbiAgICAgICAgbmV3VG9wID0gY2VIZWlnaHQgLSBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kYy5zdHlsZS50b3AgPSBuZXdUb3AudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgIHRoaXMuZGl2aWRlclBvc2l0aW9uID0gKHRoaXMuZGMub2Zmc2V0VG9wICsgQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFIC8gMikgLyBjZUhlaWdodDtcclxuICAgICAgaWYgKHRoaXMuZGl2aWRlclBvc2l0aW9uID4gMS4wKSB7XHJcbiAgICAgICAgdGhpcy5kaXZpZGVyUG9zaXRpb24gPSAxLjA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGl2aWRlclBvc2l0aW9uIDwgMC4wKSB7XHJcbiAgICAgICAgdGhpcy5kaXZpZGVyUG9zaXRpb24gPSAwLjA7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kcmF3RGl2aWRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGRyYXdEaXZpZGVyKCkge1xyXG4gICAgY29uc3QgdyA9IHRoaXMuZGMud2lkdGg7XHJcbiAgICBjb25zdCBoID0gdGhpcy5kYy5oZWlnaHQ7XHJcbiAgICBjb25zdCBnID0gdGhpcy5kYy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgaWYgKGcgJiYgdz4xMCAmJiBoPj0xKSB7XHJcbiAgICAgIGcuZmlsbFN0eWxlID0gJ3doaXRlJztcclxuICAgICAgZy5maWxsUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgZy5maWxsU3R5bGUgPSAnYmxhY2snO1xyXG4gICAgICBnLmZpbGxSZWN0KDUsIDUsIHcgLSAxMCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGlwQm91bmRzKGNsaXBCb3VuZHM6IFJlY3RhbmdsZSkge1xyXG4gICAgdGhpcy5ib3VuZHMgPSBjbGlwQm91bmRzO1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGN1cnJlbnRYWm9vbSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGxldCB4eiA9IHRoaXMuX3hab29tO1xyXG4gICAgaWYgKHh6PT1udWxsICYmIHRoaXMuX2F1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICBsZXQgb3cgPSB0aGlzLmNlLm9mZnNldFdpZHRoO1xyXG4gICAgICBpZiAob3cgPCAxKSB7XHJcbiAgICAgICAgLy8gYXQgbGVhc3Qgb25lIHBpeGVsIHdpZHRoIHRvIGF2b2lkIHgtem9vbSB6ZXJvIHZhbHVlc1xyXG4gICAgICAgIG93ID0gMTtcclxuICAgICAgfVxyXG4gICAgICB4eiA9IG93IC8gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmR1cmF0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHh6O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbGF5b3V0KGNsZWFyOiBib29sZWFuLCByZWRyYXc6IGJvb2xlYW4pIHtcclxuICAgIGxldCBjZUJjciA9IHRoaXMuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgY29uc3QgY2VCY3JJbnRXID0gTWF0aC5mbG9vcihjZUJjci53aWR0aCk7XHJcbiAgICBjb25zdCBjZUJjckludEggPSBNYXRoLmZsb29yKGNlQmNyLmhlaWdodCk7XHJcblxyXG4gICAgLy8gaGVpZ2h0IGF2YWlsYWJsZSBmb3IgcGx1Z2lucyAoYXVkaW9zaWduYWwgYW5kIHNvbmFncmFtKVxyXG4gICAgbGV0IHBzSCA9IGNlQmNySW50SCAtIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRTtcclxuICAgIGlmIChwc0ggPCAwKSB7XHJcbiAgICAgIHBzSCA9IDA7XHJcbiAgICB9XHJcbiAgICAvLyBhdWRpbyBzaWduYWwgaGVpZ2h0XHJcbiAgICBjb25zdCBhc0ggPSBNYXRoLnJvdW5kKHBzSCAqIHRoaXMuZGl2aWRlclBvc2l0aW9uKTtcclxuXHJcbiAgICAvLyBzb25hZ3JhbSBoZWlnaHQgKHJlc3Q6IGF2YWlsYWJsZSBoZWlnaHQgbWludXMgZGl2aWRlciBoZWlnaHQgbWludXMgYXVkaW9zaWduYWwgaGVpZ2h0KVxyXG4gICAgbGV0IHNvSCA9IGNlQmNySW50SCAtIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSAtIGFzSDtcclxuICAgIGlmIChzb0ggPCAwKSB7XHJcbiAgICAgIHNvSCA9IDA7XHJcbiAgICB9XHJcblxyXG4gIC8vIHNvbmFncmFtIHRvcCBwb3NpdGlvblxyXG4gICAgY29uc3Qgc29Ub3AgPSBhc0ggKyBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkU7XHJcblxyXG4gICAgLy8gVmlzaWJsZSBib3VuZHNcclxuICAgIC8vIGxlZnQgcG9zaXRpb25cclxuICAgIGxldCB2YkxlZnQgPSAwO1xyXG4gICAgLy8gd2lkdGhcclxuICAgIGxldCB2YldpZHRoID0gY2VCY3JJbnRXO1xyXG4gICAgaWYgKCF0aGlzLl9maXhGaXRUb1BhbmVsICYmIHRoaXMuYm91bmRzKSB7XHJcbiAgICAgIHZiTGVmdCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCk7XHJcbiAgICAgIHZiV2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGl2aWRlclxyXG4gICAgLy8gbGVmdCBwb3NpdGlvblxyXG4gICAgbGV0IHZiTGVmdFN0eWwgPSB2YkxlZnQgKyAncHgnO1xyXG4gICAgaWYgKHRoaXMuZGMuc3R5bGUubGVmdCAhPSB2YkxlZnRTdHlsKSB7XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUubGVmdCA9IHZiTGVmdFN0eWw7XHJcbiAgICB9XHJcbiAgICAvLyB0b3AgcG9zaXRpb25cclxuICAgIGNvbnN0IGRUb3AgPSBhc0g7XHJcbiAgICBjb25zdCBkVG9wU3RyID0gZFRvcCArICdweCc7XHJcbiAgICBpZiAodGhpcy5kYy5zdHlsZS50b3AgIT0gZFRvcFN0cikge1xyXG4gICAgICB0aGlzLmRjLnN0eWxlLnRvcCA9IGRUb3BTdHI7XHJcbiAgICB9XHJcbiAgICAvLyB3aWR0aFxyXG4gICAgbGV0IHZiV2lkdGhTdHlsZSA9IHZiV2lkdGggKyAncHgnO1xyXG4gICAgaWYgKHRoaXMuZGMuc3R5bGUud2lkdGggIT0gdmJXaWR0aFN0eWxlKSB7XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUud2lkdGggPSB2YldpZHRoU3R5bGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kYy53aWR0aCAhPSB2YldpZHRoKSB7XHJcbiAgICAgIHRoaXMuZGMud2lkdGggPSB2YldpZHRoO1xyXG4gICAgfVxyXG4gICAgLy8gaGVpZ2h0XHJcbiAgICBpZih0aGlzLmRjLmhlaWdodCE9QXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFKSB7XHJcbiAgICAgIHRoaXMuZGMuaGVpZ2h0ID0gQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFO1xyXG5cclxuICAgIH1cclxuICAgIGxldCBkaXZQaXhlbFNpemVTdHlsZT1BdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkUudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICBpZih0aGlzLmRjLnN0eWxlLmhlaWdodCE9ZGl2UGl4ZWxTaXplU3R5bGUpIHtcclxuICAgICAgdGhpcy5kYy5zdHlsZS5oZWlnaHQgPSBkaXZQaXhlbFNpemVTdHlsZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRyYXdEaXZpZGVyKCk7XHJcblxyXG5cclxuICAgIC8vIFZpcnR1YWwgZGltZW5zaW9uLCBvbmx5IHdpZHRoIGlzIHVzZWRcclxuICAgIGxldCB2aXJ0dWFsRGltID0gbmV3IERpbWVuc2lvbihjZUJjckludFcsIDApXHJcblxyXG4gICAgLy8gVmlzaWJsZSBib3VuZHMgb2YgY29udGFpbmVyXHJcbiAgICBsZXQgYnIgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb3NpdGlvbih2YkxlZnQsIDApLCBuZXcgRGltZW5zaW9uKHZiV2lkdGgsIGNlQmNySW50SCkpO1xyXG5cclxuICAgIC8vIFNldCBjb250YWluZXIgYm91bmRzXHJcbiAgICB0aGlzLmxheW91dEJvdW5kcyhiciwgdmlydHVhbERpbSwgZmFsc2UpO1xyXG5cclxuICAgIC8vIFZpc2libGUgYm91bmRzIG9mIGF1ZGlvc2lnbmFsXHJcbiAgICBsZXQgYXNSID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odmJMZWZ0LCAwKSwgbmV3IERpbWVuc2lvbih2YldpZHRoLCBhc0gpKTtcclxuXHJcbiAgICAvLyBTZXQgYXVkaW9zaWduYWwgYm91bmRzXHJcbiAgICB0aGlzLmFzLmxheW91dEJvdW5kcyhhc1IsIHZpcnR1YWxEaW0sIHJlZHJhdywgY2xlYXIpO1xyXG5cclxuICAgIC8vIFZpc2libGUgYm91bmRzIG9mIHNvbmFncmFtXHJcbiAgICBsZXQgc29SID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odmJMZWZ0LCBzb1RvcCksIG5ldyBEaW1lbnNpb24odmJXaWR0aCwgc29IKSk7XHJcblxyXG4gICAgLy8gU2V0IHNvbmFncmFtIGJvdW5kc1xyXG4gICAgdGhpcy5zby5sYXlvdXRCb3VuZHMoc29SLCB2aXJ0dWFsRGltLCByZWRyYXcsIGNsZWFyKTtcclxuICB9XHJcblxyXG4gIGxheW91dFNjYWxlZCgpIHtcclxuICAgIHRoaXMuX2xheW91dChmYWxzZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgbGF5b3V0KGNsZWFyPXRydWUpIHtcclxuXHJcbiAgICBpZih0aGlzLmNlICYmIHRoaXMuZGMpIHtcclxuICAgICAgY29uc3QgY2xpZW50Vz10aGlzLmNlLmNsaWVudFdpZHRoO1xyXG4gICAgICBpZih0aGlzLl9hdWRpb0RhdGFIb2xkZXIpe1xyXG4gICAgICAgIGlmKHRoaXMuX2ZpeEZpdFRvUGFuZWwpIHtcclxuICAgICAgICAgIC8vIFNldCB0aGUgdmlydHVhbCBjYW52YXMgd2lkdGggdG8gdGhlIHZpc2libGUgd2lkdGhcclxuICAgICAgICAgIGlmKHRoaXMuY2Uuc3R5bGUud2lkdGghPScxMDAlJykge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwic2V0IHdpZHRoIHRvIDEwMCVcIik7XHJcbiAgICAgICAgICAgIHRoaXMuY2Uuc3R5bGUud2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBpZiAodGhpcy5feFpvb20pIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSB2aXJ0dWFsIGNhbnZhcyB3aWR0aCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSB1c2VyIHNlbGVjdGVkIHhab29tIHZhbHVlXHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NsVyA9IE1hdGgucm91bmQoIHRoaXMuX3hab29tKnRoaXMuX2F1ZGlvRGF0YUhvbGRlcj8uZHVyYXRpb24gKTtcclxuICAgICAgICAgICAgdGhpcy5jZS5zdHlsZS53aWR0aCA9IG5ld0NsVyArICdweCc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHZpcnR1YWwgY2FudmFzIHdpZHRoIHRvIHRoZSB2aXNpYmxlIHdpZHRoIG9ubHlcclxuICAgICAgICAgICAgdGhpcy5jZS5zdHlsZS53aWR0aCA9IGNsaWVudFcgKyAncHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9sYXlvdXQoY2xlYXIsdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBhdWRpb0RhdGEoYXVkaW9EYXRhSG9sZGVyOiBBdWRpb0RhdGFIb2xkZXIgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9hdWRpb0NsaXA9bnVsbFxyXG4gICAgdGhpcy5fYXVkaW9EYXRhSG9sZGVyPWF1ZGlvRGF0YUhvbGRlcjtcclxuICAgIHRoaXMuYXMuc2V0RGF0YShhdWRpb0RhdGFIb2xkZXIpO1xyXG4gICAgdGhpcy5zby5zZXREYXRhKGF1ZGlvRGF0YUhvbGRlcik7XHJcbiAgICB0aGlzLmxheW91dCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1ZGlvRGF0YSgpOkF1ZGlvRGF0YUhvbGRlcnxudWxse1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1ZGlvRGF0YUhvbGRlclxyXG4gIH1cclxuXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGF1ZGlvQ2xpcChhdWRpb0NsaXA6IEF1ZGlvQ2xpcCB8IG51bGwpIHtcclxuICAgIHRoaXMuX2F1ZGlvQ2xpcD1hdWRpb0NsaXBcclxuICAgICAgbGV0IGF1ZGlvRGF0YTpBdWRpb0RhdGFIb2xkZXJ8bnVsbD1udWxsO1xyXG4gICAgbGV0IHNlbDpTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICBpZihhdWRpb0NsaXApIHtcclxuICAgICAgICBhdWRpb0RhdGEgPSBhdWRpb0NsaXAuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICAgIGlmICh0aGlzLl9hdWRpb0NsaXApIHtcclxuICAgICAgICAgIHRoaXMuX2F1ZGlvQ2xpcC5hZGRTZWxlY3Rpb25PYnNlcnZlcigoY2xpcCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGNsaXAuc2VsZWN0aW9uXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsPWF1ZGlvQ2xpcC5zZWxlY3Rpb247XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fYXVkaW9EYXRhSG9sZGVyID0gYXVkaW9EYXRhO1xyXG4gICAgICB0aGlzLmFzLnNldERhdGEodGhpcy5fYXVkaW9EYXRhSG9sZGVyKTtcclxuICAgICAgdGhpcy5zby5zZXREYXRhKHRoaXMuX2F1ZGlvRGF0YUhvbGRlcik7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW5nPW51bGxcclxuICAgICAgdGhpcy5zZWxlY3Rpb249c2VsXHJcbiAgICB0aGlzLmxheW91dCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYXlGcmFtZVBvc2l0aW9uKCk6IG51bWJlciB8bnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGxheUZyYW1lUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBzZXQgcGxheUZyYW1lUG9zaXRpb24ocGxheUZyYW1lUG9zaXRpb246IG51bWJlcnxudWxsKSB7XHJcbiAgICB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbiA9IHBsYXlGcmFtZVBvc2l0aW9uO1xyXG4gICAgdGhpcy5hcy5wbGF5RnJhbWVQb3NpdGlvbiA9IHBsYXlGcmFtZVBvc2l0aW9uO1xyXG4gICAgdGhpcy5zby5wbGF5RnJhbWVQb3NpdGlvbiA9IHBsYXlGcmFtZVBvc2l0aW9uO1xyXG4gIH1cclxufVxyXG5cclxuIl19
414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ3NCLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFDN0UsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ25DLE9BQU8sRUFBUyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFFdEMsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFHekU7Ozs7OztHQU1HO0FBRUgsaUNBQWlDO0FBQ2pDLGdDQUFnQztBQUNoQywrQkFBK0I7QUFDL0IsSUFBSTtBQUNKLEVBQUU7QUFDRix5Q0FBeUM7QUFDekMsOEJBQThCO0FBQzlCLDRDQUE0QztBQUM1Qyx3REFBd0Q7QUFDeEQseURBQXlEO0FBQ3pELG9FQUFvRTtBQUNwRSxJQUFJO0FBQ0osRUFBRTtBQUNGLDZDQUE2QztBQUM3QywwRUFBMEU7QUFDMUUsSUFBSTtBQUNKLEVBQUU7QUFDRiwwQ0FBMEM7QUFDMUMsNERBQTREO0FBQzVELEtBQUs7QUFFTCw0QkFBNEI7QUFDNUIsZ0NBQWdDO0FBQ2hDLG1EQUFtRDtBQUNuRCx1RUFBdUU7QUFDdkUsbUNBQW1DO0FBQ25DLDBCQUEwQjtBQUMxQixJQUFJO0FBRUo7Ozs7Ozs7R0FPRztBQStDSCxNQUFNLE9BQU8sb0JBQXFC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QUFDO2dCQVk1QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBc04xQyxTQUFTO3NCQURaLEtBQUs7Z0JBZUYsU0FBUztzQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtBdWRpb1NpZ25hbH0gZnJvbSAnLi9hdWRpb3NpZ25hbCdcclxuaW1wb3J0IHtTb25hZ3JhbX0gZnJvbSAnLi9zb25hZ3JhbSdcclxuaW1wb3J0IHtNYXJrZXIsIFBvaW50fSBmcm9tICcuL2NvbW1vbidcclxuXHJcbmltcG9ydCB7Q29tcG9uZW50LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1Bvc2l0aW9uLERpbWVuc2lvbiwgUmVjdGFuZ2xlfSBmcm9tIFwiLi4vLi4vbWF0aC8yZC9nZW9tZXRyeVwiO1xyXG5pbXBvcnQge0F1ZGlvQ2xpcCxTZWxlY3Rpb259IGZyb20gXCIuLi9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtCYXNpY0F1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnR9IGZyb20gXCIuL2F1ZGlvX2NhbnZhc19sYXllcl9jb21wXCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbi8qXHJcbiAgUmVzaXplT2JzZXJ2ZXIgbm90IHlldCBhdmFpbGFibGUgaW4gb2ZmaWNpYWwgVHlwZXNjcmlwdCBkZWNsYXJhdGlvblxyXG4gIENycmVhdGVkIGRlY2xhcmF0aW9uIGZyb20gSURMIHVudGlsIGl0cyBhdmFpbGFibGUuXHJcbiAgU2VlIHNwZWNzOlxyXG4gIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9yZXNpemUtb2JzZXJ2ZXJcclxuXHJcbiAqL1xyXG5cclxuLy8gaW50ZXJmYWNlIFJlc2l6ZU9ic2VydmVyU2l6ZSB7XHJcbi8vICAgcmVhZG9ubHkgaW5saW5lU2l6ZTpudW1iZXI7XHJcbi8vICAgcmVhZG9ubHkgYmxvY2tTaXplOm51bWJlcjtcclxuLy8gfVxyXG4vL1xyXG4vLyBkZWNsYXJlIGludGVyZmFjZSBSZXNpemVPYnNlcnZlckVudHJ5e1xyXG4vLyAgIHJlYWRvbmx5IHRhcmdldDogRWxlbWVudDtcclxuLy8gICByZWFkb25seSBjb250ZW50UmVjdDogRE9NUmVjdFJlYWRPbmx5IDtcclxuLy8gICByZWFkb25seSBib3JkZXJCb3hTaXplOiBBcnJheTxSZXNpemVPYnNlcnZlclNpemU+IDtcclxuLy8gICByZWFkb25seSBjb250ZW50Qm94U2l6ZTogQXJyYXk8UmVzaXplT2JzZXJ2ZXJTaXplPiA7XHJcbi8vICAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZTogQXJyYXk8UmVzaXplT2JzZXJ2ZXJTaXplPiA7XHJcbi8vIH1cclxuLy9cclxuLy8gZGVjbGFyZSBpbnRlcmZhY2UgUmVzaXplT2JzZXJ2ZXJDYWxsYmFjayB7XHJcbi8vICAgKGVudHJpZXM6IEFycmF5PFJlc2l6ZU9ic2VydmVyRW50cnk+LCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIpOnZvaWQ7XHJcbi8vIH1cclxuLy9cclxuLy8gZGVjbGFyZSBlbnVtIFJlc2l6ZU9ic2VydmVyQm94T3B0aW9ucyB7XHJcbi8vICAgXCJib3JkZXItYm94XCIsIFwiY29udGVudC1ib3hcIiwgXCJkZXZpY2UtcGl4ZWwtY29udGVudC1ib3hcIlxyXG4vLyB9O1xyXG5cclxuLy8gLy8gRGVjbGFyZSBSZXNpemVvYnNlcnZlclxyXG4vLyBkZWNsYXJlIGNsYXNzIFJlc2l6ZU9ic2VydmVye1xyXG4vLyAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBSZXNpemVPYnNlcnZlckNhbGxiYWNrKTtcclxuLy8gICBvYnNlcnZlOiAoZWw6RWxlbWVudCxvcHRzOiBSZXNpemVPYnNlcnZlckJveE9wdGlvbnMgfCBudWxsKT0+dm9pZDtcclxuLy8gICB1bm9ic2VydmU6IChlbDpFbGVtZW50KT0+dm9pZDtcclxuLy8gICBkaXNjb25uZWN0OiAoKT0+dm9pZDtcclxuLy8gfVxyXG5cclxuLypcclxuICogQ29udGFpbmVyIGNvbXBvbmVudCBmb3IgYXVkaW8gZGlzcGxheS5cclxuICogVGhlIGRpc3BsYXkgZWxlbWVudHMgYXJlIGNoaWxkcmVuIG9mIGEgdmlydHVhbCBjYW52YXMuIFRoZSB2aXJ0dWFsIGNhbnZhcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlIGhpZ2ggem9vbSBmYWN0b3JzIHdpdGggdmVyeSB3aWRlIHZpcnR1YWwgYXVkaW8gZGlzcGxheXMuXHJcbiAqIE9ubHkgdGhlIHZpc2libGUgcGFydCBvZiB0aGUgdmlydHVhbCBjYW52YXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBicm93c2VyIGNhbnZhcyBhbmQgdGhlcmVmb3JlIGNvbnN1bWluZyBtZW1vcnkuXHJcbiAqIFRoZSB2aXNpYmxlIHBhcnQgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIHRoZSB2aWV3cG9ydCBvZiB0aGUgc2Nyb2xsIHBhbmUgcGFyZW50LlxyXG4gKiBUaGUgdmlydHVhbCBjYW52YXMgaXRzZWxmIGlzIGltcGxlbWVudGVkIGFzIGFuIEhUTUwgZGl2IGVsZW1lbnQuXHJcbiAqIFRoZSBsYXlvdXQgb2YgdGhlIGNvbXBvbmVudCBpcyB1cGRhdGVkIG9uIHJlc2l6ZSBvZiB0aGUgcGFyZW50IG9yIGNoYW5nZXMgb2YgdGhlIHpvb20gZmFjdG9yLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiAjdmlydHVhbENhbnZhcz5cclxuICAgIDxjYW52YXMgI2RpdmlkZXIgKG1vdXNlZG93bik9XCJtb3VzZWRvd24oJGV2ZW50KVwiIChtb3VzZW92ZXIpPVwibW91c2VvdmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZWxlYXZlKCRldmVudClcIiBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgPGF1ZGlvLXNpZ25hbCBbcG9pbnRlclBvc2l0aW9uXT1cInBvaW50ZXJcIiBbc2VsZWN0aW5nXT1cInNlbGVjdGluZ1wiIFtzZWxlY3Rpb25dPVwic2VsZWN0aW9uXCIgKHBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlcik9XCJwb2ludGVyUG9zaXRpb25DaGFuZ2VkKCRldmVudClcIiAoc2VsZWN0aW5nRXZlbnRFbWl0dGVyKT1cInNlbGVjdGluZ0NoYW5nZWQoJGV2ZW50KVwiIChzZWxlY3RlZEV2ZW50RW1pdHRlcik9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIj48L2F1ZGlvLXNpZ25hbD5cclxuICAgIDxhdWRpby1zb25hZ3JhbSBbcG9pbnRlclBvc2l0aW9uXT1cInBvaW50ZXJcIiBbc2VsZWN0aW5nXT1cInNlbGVjdGluZ1wiIFtzZWxlY3Rpb25dPVwic2VsZWN0aW9uXCIgKHBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlcik9XCJwb2ludGVyUG9zaXRpb25DaGFuZ2VkKCRldmVudClcIiAoc2VsZWN0aW5nRXZlbnRFbWl0dGVyKT1cInNlbGVjdGluZ0NoYW5nZWQoJGV2ZW50KVwiIChzZWxlY3RlZEV2ZW50RW1pdHRlcik9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIj48L2F1ZGlvLXNvbmFncmFtPlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgZGl2IHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIFRPRE8gY29udGFpbmVyIGRpdiBwb3NpdGlvbiBtdXN0IG5vdCBiZSAnc3RhdGljJyAoZGVmYXVsdCkgdG8gYWN0IGFzIHJlZmVyZW5jZSBmb3IgdGhlIGNhbnZhc2VzICovXHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9YCwgYGNhbnZhc3tcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMDtcclxuICAgIGhlaWdodDogMDtcclxuICAgIGN1cnNvcjogbnMtcmVzaXplO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgekluZGV4OiAxO1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gIH1gLCBgYXVkaW8tc2lnbmFsIHtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6SW5kZXg6IDE7XHJcbiAgICB0cmFuc2Zvcm06IG5vbmU7XHJcbiAgfWAsIGBhdWRpby1zb25hZ3JhbSB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgekluZGV4OiAxO1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvQ2xpcFVJQ29udGFpbmVyIGV4dGVuZHMgQmFzaWNBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXR7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIERJVklERVJfUElYRUxfU0laRSA9IDEwO1xyXG5cclxuICBwYXJlbnRFOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgLy8gRGl2aWRlciBjYW52YXNcclxuICBAVmlld0NoaWxkKCdkaXZpZGVyJywgeyBzdGF0aWM6IHRydWUgfSkgY2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBkYyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG5cclxuICAvLyBWaXJ0dWFsIGNvbnRhaW5lclxyXG4gIEBWaWV3Q2hpbGQoJ3ZpcnR1YWxDYW52YXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjZVJlZiE6IEVsZW1lbnRSZWY7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb1NpZ25hbCwgeyBzdGF0aWM6IHRydWUgfSkgYXMhOiBBdWRpb1NpZ25hbDtcclxuICBAVmlld0NoaWxkKFNvbmFncmFtLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbyE6IFNvbmFncmFtO1xyXG5cclxuICBwcml2YXRlIF9hdWRpb0NsaXA6QXVkaW9DbGlwIHwgbnVsbD1udWxsO1xyXG4gIHBvaW50ZXI6IE1hcmtlcnxudWxsPW51bGw7XHJcbiAgc2VsZWN0aW5nOiBTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gIHNlbGVjdGlvbjogU2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb24+KCk7XHJcbiAgcHJpdmF0ZSBfcGxheUZyYW1lUG9zaXRpb246IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkcmFnU3RhcnRNb3VzZVk6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0WTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkaXZpZGVyUG9zaXRpb24gPSAwLjU7XHJcblxyXG4gIHVzZXJBY3Rpb249ZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3hab29tOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gcGl4ZWxzIHBlciBzZWNvbmRcclxuXHJcbiAgZ2V0IHhab29tKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3hab29tO1xyXG4gIH1cclxuXHJcbiAgc2V0IHhab29tKHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XHJcbiAgICB0aGlzLnVzZXJBY3Rpb249dHJ1ZTtcclxuICAgIHRoaXMuX3hab29tID0gdmFsdWU7XHJcbiAgICB0aGlzLmxheW91dCgpXHJcbiAgICB0aGlzLnVzZXJBY3Rpb249ZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBpZiB0cnVlIHRoZSBjb21wbGV0ZSBhdWRpbyBmaWxlIGlzIHNob3duLCB0aGUgZGlzcGxheSBmaXRzIHRvIHRoZSB2aXNpYmxlIHBhbmVsLCB0aGUgeC16b29tIGZhY3RvciBpcyB2YXJpYWJsZSwgdGhpcyBpcyB0aGUgZGVmYXVsdFxyXG4gIHByaXZhdGUgX2ZpeEZpdFRvUGFuZWwgPSB0cnVlO1xyXG5cclxuICBzZXQgZml4Rml0VG9QYW5lbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZml4Rml0VG9QYW5lbCA9IHZhbHVlO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIC8vIHdlIGRvbid0IG5lZWQgIGNsaXAgYm91bmRzXHJcbiAgICAgIHRoaXMuYm91bmRzPW51bGw7XHJcbiAgICAgIHRoaXMuX3hab29tID0gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGhvbGQgY3VycmVudCB6b29tIHZhbHVlXHJcbiAgICAgIC8vdGhpcy5feFpvb209dGhpcy5jZS5vZmZzZXRXaWR0aC90aGlzLl9hdWRpb0RhdGEuZHVyYXRpb247XHJcbiAgICB9XHJcbiAgICB0aGlzLmxheW91dCgpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5wYXJlbnRFID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jZSA9IHRoaXMuY2VSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuZGMgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICAgIGNvbnN0IGhlaWdodExpc3RlbmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG1yczogQXJyYXk8TXV0YXRpb25SZWNvcmQ+LCBtbzogTXV0YXRpb25PYnNlcnZlcikgPT4ge1xyXG5cclxuICAgICAgbGV0IGxheW91dD1mYWxzZTtcclxuICAgICAgbXJzLmZvckVhY2goKG1yOiBNdXRhdGlvblJlY29yZCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyQWN0aW9uICYmICdhdHRyaWJ1dGVzJyA9PT0gbXIudHlwZSAmJiAoJ2NsYXNzJyA9PT0gbXIuYXR0cmlidXRlTmFtZSB8fCAnc3R5bGUnID09PSBtci5hdHRyaWJ1dGVOYW1lKSkge1xyXG4gICAgICAgICAgbGF5b3V0PXRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYobGF5b3V0KXtcclxuICAgICAgICAvLyByZS1sYXlvdXQgcmVxdWlyZWRcclxuICAgICAgICB0aGlzLmxheW91dChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGhlaWdodExpc3RlbmVyLm9ic2VydmUodGhpcy5jZSwge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZX0pO1xyXG4gICAgaGVpZ2h0TGlzdGVuZXIub2JzZXJ2ZSh0aGlzLmRjLCB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XHJcblxyXG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMsb2JzKSA9PiB7XHJcbiAgICAgIC8vY29uc29sZS5sb2coXCJSZXNpemUgb2JzZXJ2ZWQ6XCIpO1xyXG4gICAgICBlbnRyaWVzLmZvckVhY2goKGUpPT57XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhlLmNvbnRlbnRSZWN0LndpZHRoK1wieFwiK2UuY29udGVudFJlY3QuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNlKTtcclxuXHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBtb3VzZW92ZXIobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZGl2aWRlckN1cnNvclBvc2l0aW9uKG1lLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIG1vdXNlbGVhdmUobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZGl2aWRlckN1cnNvclBvc2l0aW9uKG1lLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBtb3VzZWRvd24obWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0TW91c2VZID0gbWUuY2xpZW50WTtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IHRoaXMuZGMub2Zmc2V0VG9wO1xyXG4gICAgdGhpcy5kcmFnU3RhcnRNb3VzZVkgPSBtZS5jbGllbnRZO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZXVwKG1lOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5kcmFnU3RhcnRZICE9IG51bGwpIHtcclxuICAgICAgdGhpcy51c2VyQWN0aW9uPXRydWU7XHJcbiAgICAgIHRoaXMuZGl2aWRlckRyYWcobWUpO1xyXG4gICAgICB0aGlzLmxheW91dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IG51bGw7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj1mYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZW1vdmUobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRyYWdTdGFydFkgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnVzZXJBY3Rpb249dHJ1ZTtcclxuICAgICAgdGhpcy5kaXZpZGVyRHJhZyhtZSk7XHJcbiAgICAgIHRoaXMubGF5b3V0U2NhbGVkKCk7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj10cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcG9pbnRlclBvc2l0aW9uQ2hhbmdlZChwcDpNYXJrZXIpe1xyXG4gICAgdGhpcy5wb2ludGVyPXBwXHJcbiAgfVxyXG5cclxuICBzZWxlY3RpbmdDaGFuZ2VkKHM6U2VsZWN0aW9ufCBudWxsKXtcclxuICAgIHRoaXMuc2VsZWN0aW5nPXNcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZWQoczpTZWxlY3Rpb24pe1xyXG4gICAgdGhpcy5zZWxlY3Rpb249c1xyXG4gICAgaWYodGhpcy5fYXVkaW9DbGlwKXtcclxuICAgICAgdGhpcy5fYXVkaW9DbGlwLnNlbGVjdGlvbj1zXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGlvbkV2ZW50RW1pdHRlci5lbWl0KHRoaXMuc2VsZWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNNb3VzZVBvcyhjOiBIVE1MQ2FudmFzRWxlbWVudCwgZTogTW91c2VFdmVudCk6IFBvaW50IHtcclxuICAgIGNvbnN0IGNyID0gYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHggPSBlLnggLSBjci5sZWZ0O1xyXG4gICAgY29uc3QgeSA9IGUueSAtIGNyLnRvcDtcclxuICAgIHJldHVybiBuZXcgUG9pbnQoeCx5KTtcclxuICB9XHJcblxyXG4gIGRpdmlkZXJDdXJzb3JQb3NpdGlvbihlOiBNb3VzZUV2ZW50LCBzaG93OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5kYykge1xyXG4gICAgICB0aGlzLmNhbnZhc01vdXNlUG9zKHRoaXMuZGMsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGl2aWRlckRyYWcoZTogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZGMgJiYgdGhpcy5kcmFnU3RhcnRNb3VzZVkgJiYgdGhpcy5kcmFnU3RhcnRZKSB7XHJcblxyXG4gICAgICBjb25zdCBkcmFnT2Zmc2V0ID0gZS5jbGllbnRZIC0gdGhpcy5kcmFnU3RhcnRNb3VzZVk7XHJcbiAgICAgIGNvbnN0IGNlSGVpZ2h0ID0gdGhpcy5jZS5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgbmV3VG9wID0gKHRoaXMuZHJhZ1N0YXJ0WSArIGRyYWdPZmZzZXQpO1xyXG4gICAgICBpZiAobmV3VG9wIDwgMCkge1xyXG4gICAgICAgIG5ld1RvcCA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld1RvcCA+IGNlSGVpZ2h0IC0gQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFKSB7XHJcbiAgICAgICAgbmV3VG9wID0gY2VIZWlnaHQgLSBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kYy5zdHlsZS50b3AgPSBuZXdUb3AudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgIHRoaXMuZGl2aWRlclBvc2l0aW9uID0gKHRoaXMuZGMub2Zmc2V0VG9wICsgQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFIC8gMikgLyBjZUhlaWdodDtcclxuICAgICAgaWYgKHRoaXMuZGl2aWRlclBvc2l0aW9uID4gMS4wKSB7XHJcbiAgICAgICAgdGhpcy5kaXZpZGVyUG9zaXRpb24gPSAxLjA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGl2aWRlclBvc2l0aW9uIDwgMC4wKSB7XHJcbiAgICAgICAgdGhpcy5kaXZpZGVyUG9zaXRpb24gPSAwLjA7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kcmF3RGl2aWRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGRyYXdEaXZpZGVyKCkge1xyXG4gICAgY29uc3QgdyA9IHRoaXMuZGMud2lkdGg7XHJcbiAgICBjb25zdCBoID0gdGhpcy5kYy5oZWlnaHQ7XHJcbiAgICBjb25zdCBnID0gdGhpcy5kYy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgaWYgKGcgJiYgdz4xMCAmJiBoPj0xKSB7XHJcbiAgICAgIGcuZmlsbFN0eWxlID0gJ3doaXRlJztcclxuICAgICAgZy5maWxsUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgZy5maWxsU3R5bGUgPSAnYmxhY2snO1xyXG4gICAgICBnLmZpbGxSZWN0KDUsIDUsIHcgLSAxMCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGlwQm91bmRzKGNsaXBCb3VuZHM6IFJlY3RhbmdsZSkge1xyXG4gICAgdGhpcy5ib3VuZHMgPSBjbGlwQm91bmRzO1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGN1cnJlbnRYWm9vbSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGxldCB4eiA9IHRoaXMuX3hab29tO1xyXG4gICAgaWYgKHh6PT1udWxsICYmIHRoaXMuX2F1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICBsZXQgb3cgPSB0aGlzLmNlLm9mZnNldFdpZHRoO1xyXG4gICAgICBpZiAob3cgPCAxKSB7XHJcbiAgICAgICAgLy8gYXQgbGVhc3Qgb25lIHBpeGVsIHdpZHRoIHRvIGF2b2lkIHgtem9vbSB6ZXJvIHZhbHVlc1xyXG4gICAgICAgIG93ID0gMTtcclxuICAgICAgfVxyXG4gICAgICB4eiA9IG93IC8gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmR1cmF0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHh6O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbGF5b3V0KGNsZWFyOiBib29sZWFuLCByZWRyYXc6IGJvb2xlYW4pIHtcclxuICAgIGxldCBjZUJjciA9IHRoaXMuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgY29uc3QgY2VCY3JJbnRXID0gTWF0aC5mbG9vcihjZUJjci53aWR0aCk7XHJcbiAgICBjb25zdCBjZUJjckludEggPSBNYXRoLmZsb29yKGNlQmNyLmhlaWdodCk7XHJcblxyXG4gICAgLy8gaGVpZ2h0IGF2YWlsYWJsZSBmb3IgcGx1Z2lucyAoYXVkaW9zaWduYWwgYW5kIHNvbmFncmFtKVxyXG4gICAgbGV0IHBzSCA9IGNlQmNySW50SCAtIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRTtcclxuICAgIGlmIChwc0ggPCAwKSB7XHJcbiAgICAgIHBzSCA9IDA7XHJcbiAgICB9XHJcbiAgICAvLyBhdWRpbyBzaWduYWwgaGVpZ2h0XHJcbiAgICBjb25zdCBhc0ggPSBNYXRoLnJvdW5kKHBzSCAqIHRoaXMuZGl2aWRlclBvc2l0aW9uKTtcclxuXHJcbiAgICAvLyBzb25hZ3JhbSBoZWlnaHQgKHJlc3Q6IGF2YWlsYWJsZSBoZWlnaHQgbWludXMgZGl2aWRlciBoZWlnaHQgbWludXMgYXVkaW9zaWduYWwgaGVpZ2h0KVxyXG4gICAgbGV0IHNvSCA9IGNlQmNySW50SCAtIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSAtIGFzSDtcclxuICAgIGlmIChzb0ggPCAwKSB7XHJcbiAgICAgIHNvSCA9IDA7XHJcbiAgICB9XHJcblxyXG4gIC8vIHNvbmFncmFtIHRvcCBwb3NpdGlvblxyXG4gICAgY29uc3Qgc29Ub3AgPSBhc0ggKyBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkU7XHJcblxyXG4gICAgLy8gVmlzaWJsZSBib3VuZHNcclxuICAgIC8vIGxlZnQgcG9zaXRpb25cclxuICAgIGxldCB2YkxlZnQgPSAwO1xyXG4gICAgLy8gd2lkdGhcclxuICAgIGxldCB2YldpZHRoID0gY2VCY3JJbnRXO1xyXG4gICAgaWYgKCF0aGlzLl9maXhGaXRUb1BhbmVsICYmIHRoaXMuYm91bmRzKSB7XHJcbiAgICAgIHZiTGVmdCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCk7XHJcbiAgICAgIHZiV2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGl2aWRlclxyXG4gICAgLy8gbGVmdCBwb3NpdGlvblxyXG4gICAgbGV0IHZiTGVmdFN0eWwgPSB2YkxlZnQgKyAncHgnO1xyXG4gICAgaWYgKHRoaXMuZGMuc3R5bGUubGVmdCAhPSB2YkxlZnRTdHlsKSB7XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUubGVmdCA9IHZiTGVmdFN0eWw7XHJcbiAgICB9XHJcbiAgICAvLyB0b3AgcG9zaXRpb25cclxuICAgIC8vY29uc3QgZFRvcCA9IGFzSDtcclxuICAgIGNvbnN0IGRUb3BTdHIgPSBhc0ggKyAncHgnO1xyXG4gICAgaWYgKHRoaXMuZGMuc3R5bGUudG9wICE9IGRUb3BTdHIpIHtcclxuICAgICAgdGhpcy5kYy5zdHlsZS50b3AgPSBkVG9wU3RyO1xyXG4gICAgfVxyXG4gICAgLy8gd2lkdGhcclxuICAgIGxldCB2YldpZHRoU3R5bGUgPSB2YldpZHRoICsgJ3B4JztcclxuICAgIGlmICh0aGlzLmRjLnN0eWxlLndpZHRoICE9IHZiV2lkdGhTdHlsZSkge1xyXG4gICAgICB0aGlzLmRjLnN0eWxlLndpZHRoID0gdmJXaWR0aFN0eWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGMud2lkdGggIT0gdmJXaWR0aCkge1xyXG4gICAgICB0aGlzLmRjLndpZHRoID0gdmJXaWR0aDtcclxuICAgIH1cclxuICAgIC8vIGhlaWdodFxyXG4gICAgaWYodGhpcy5kYy5oZWlnaHQhPUF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSkge1xyXG4gICAgICB0aGlzLmRjLmhlaWdodCA9IEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRTtcclxuXHJcbiAgICB9XHJcbiAgICBsZXQgZGl2UGl4ZWxTaXplU3R5bGU9QXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgaWYodGhpcy5kYy5zdHlsZS5oZWlnaHQhPWRpdlBpeGVsU2l6ZVN0eWxlKSB7XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUuaGVpZ2h0ID0gZGl2UGl4ZWxTaXplU3R5bGU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kcmF3RGl2aWRlcigpO1xyXG5cclxuXHJcbiAgICAvLyBWaXJ0dWFsIGRpbWVuc2lvbiwgb25seSB3aWR0aCBpcyB1c2VkXHJcbiAgICBsZXQgdmlydHVhbERpbSA9IG5ldyBEaW1lbnNpb24oY2VCY3JJbnRXLCAwKVxyXG5cclxuICAgIC8vIFZpc2libGUgYm91bmRzIG9mIGNvbnRhaW5lclxyXG4gICAgbGV0IGJyID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odmJMZWZ0LCAwKSwgbmV3IERpbWVuc2lvbih2YldpZHRoLCBjZUJjckludEgpKTtcclxuXHJcbiAgICAvLyBTZXQgY29udGFpbmVyIGJvdW5kc1xyXG4gICAgdGhpcy5sYXlvdXRCb3VuZHMoYnIsIHZpcnR1YWxEaW0sIGZhbHNlKTtcclxuXHJcbiAgICAvLyBWaXNpYmxlIGJvdW5kcyBvZiBhdWRpb3NpZ25hbFxyXG4gICAgbGV0IGFzUiA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHZiTGVmdCwgMCksIG5ldyBEaW1lbnNpb24odmJXaWR0aCwgYXNIKSk7XHJcblxyXG4gICAgLy8gU2V0IGF1ZGlvc2lnbmFsIGJvdW5kc1xyXG4gICAgdGhpcy5hcy5sYXlvdXRCb3VuZHMoYXNSLCB2aXJ0dWFsRGltLCByZWRyYXcsIGNsZWFyKTtcclxuXHJcbiAgICAvLyBWaXNpYmxlIGJvdW5kcyBvZiBzb25hZ3JhbVxyXG4gICAgbGV0IHNvUiA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHZiTGVmdCwgc29Ub3ApLCBuZXcgRGltZW5zaW9uKHZiV2lkdGgsIHNvSCkpO1xyXG5cclxuICAgIC8vIFNldCBzb25hZ3JhbSBib3VuZHNcclxuICAgIHRoaXMuc28ubGF5b3V0Qm91bmRzKHNvUiwgdmlydHVhbERpbSwgcmVkcmF3LCBjbGVhcik7XHJcbiAgfVxyXG5cclxuICBsYXlvdXRTY2FsZWQoKSB7XHJcbiAgICB0aGlzLl9sYXlvdXQoZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGxheW91dChjbGVhcj10cnVlKSB7XHJcblxyXG4gICAgaWYodGhpcy5jZSAmJiB0aGlzLmRjKSB7XHJcbiAgICAgIGNvbnN0IGNsaWVudFc9dGhpcy5jZS5jbGllbnRXaWR0aDtcclxuICAgICAgaWYodGhpcy5fYXVkaW9EYXRhSG9sZGVyKXtcclxuICAgICAgICBpZih0aGlzLl9maXhGaXRUb1BhbmVsKSB7XHJcbiAgICAgICAgICAvLyBTZXQgdGhlIHZpcnR1YWwgY2FudmFzIHdpZHRoIHRvIHRoZSB2aXNpYmxlIHdpZHRoXHJcbiAgICAgICAgICBpZih0aGlzLmNlLnN0eWxlLndpZHRoIT0nMTAwJScpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInNldCB3aWR0aCB0byAxMDAlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNlLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3hab29tKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgdmlydHVhbCBjYW52YXMgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdXNlciBzZWxlY3RlZCB4Wm9vbSB2YWx1ZVxyXG4gICAgICAgICAgICBjb25zdCBuZXdDbFcgPSBNYXRoLnJvdW5kKCB0aGlzLl94Wm9vbSp0aGlzLl9hdWRpb0RhdGFIb2xkZXI/LmR1cmF0aW9uICk7XHJcbiAgICAgICAgICAgIHRoaXMuY2Uuc3R5bGUud2lkdGggPSBuZXdDbFcgKyAncHgnO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSB2aXJ0dWFsIGNhbnZhcyB3aWR0aCB0byB0aGUgdmlzaWJsZSB3aWR0aCBvbmx5XHJcbiAgICAgICAgICAgIHRoaXMuY2Uuc3R5bGUud2lkdGggPSBjbGllbnRXICsgJ3B4JztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbGF5b3V0KGNsZWFyLHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYXVkaW9EYXRhKGF1ZGlvRGF0YUhvbGRlcjogQXVkaW9EYXRhSG9sZGVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fYXVkaW9DbGlwPW51bGxcclxuICAgIHRoaXMuX2F1ZGlvRGF0YUhvbGRlcj1hdWRpb0RhdGFIb2xkZXI7XHJcbiAgICB0aGlzLmFzLnNldERhdGEoYXVkaW9EYXRhSG9sZGVyKTtcclxuICAgIHRoaXMuc28uc2V0RGF0YShhdWRpb0RhdGFIb2xkZXIpO1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGdldCBhdWRpb0RhdGEoKTpBdWRpb0RhdGFIb2xkZXJ8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0RhdGFIb2xkZXJcclxuICB9XHJcblxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBhdWRpb0NsaXAoYXVkaW9DbGlwOiBBdWRpb0NsaXAgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9hdWRpb0NsaXA9YXVkaW9DbGlwXHJcbiAgICAgIGxldCBhdWRpb0RhdGE6QXVkaW9EYXRhSG9sZGVyfG51bGw9bnVsbDtcclxuICAgIGxldCBzZWw6U2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICAgICAgaWYoYXVkaW9DbGlwKSB7XHJcbiAgICAgICAgYXVkaW9EYXRhID0gYXVkaW9DbGlwLmF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgICBpZiAodGhpcy5fYXVkaW9DbGlwKSB7XHJcbiAgICAgICAgICB0aGlzLl9hdWRpb0NsaXAuYWRkU2VsZWN0aW9uT2JzZXJ2ZXIoKGNsaXApID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBjbGlwLnNlbGVjdGlvblxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbD1hdWRpb0NsaXAuc2VsZWN0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2F1ZGlvRGF0YUhvbGRlciA9IGF1ZGlvRGF0YTtcclxuICAgICAgdGhpcy5hcy5zZXREYXRhKHRoaXMuX2F1ZGlvRGF0YUhvbGRlcik7XHJcbiAgICAgIHRoaXMuc28uc2V0RGF0YSh0aGlzLl9hdWRpb0RhdGFIb2xkZXIpO1xyXG4gICAgICB0aGlzLnNlbGVjdGluZz1udWxsXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uPXNlbFxyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGdldCBwbGF5RnJhbWVQb3NpdGlvbigpOiBudW1iZXIgfG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBsYXlGcmFtZVBvc2l0aW9uKHBsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbCkge1xyXG4gICAgdGhpcy5fcGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICAgIHRoaXMuYXMucGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICAgIHRoaXMuc28ucGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==