speechrecorderng 3.6.0 → 3.8.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 (220) hide show
  1. package/esm2022/lib/action/action.mjs +73 -0
  2. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
  3. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
  4. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
  5. package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
  6. package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
  7. package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
  8. package/esm2022/lib/audio/capture/capture.mjs +855 -0
  9. package/esm2022/lib/audio/context.mjs +79 -0
  10. package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
  11. package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
  12. package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
  13. package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
  14. package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
  15. package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
  16. package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
  17. package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
  18. package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
  19. package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
  20. package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
  21. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  22. package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
  23. package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
  24. package/esm2022/lib/audio/playback/player.mjs +402 -0
  25. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
  26. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
  27. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
  28. package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
  29. package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
  30. package/esm2022/lib/audio/ui/container.mjs +414 -0
  31. package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
  32. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
  33. package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
  34. package/esm2022/lib/db/inddb.mjs +120 -0
  35. package/esm2022/lib/dsp/utils.mjs +48 -0
  36. package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
  37. package/esm2022/lib/io/BinaryWriter.mjs +74 -0
  38. package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
  39. package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
  40. package/esm2022/lib/math/complex.mjs +58 -0
  41. package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
  42. package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
  43. package/esm2022/lib/net/uploader.mjs +367 -0
  44. package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
  45. package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
  46. package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
  47. package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
  48. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
  49. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
  50. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
  51. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
  52. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
  53. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
  54. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
  55. package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
  56. package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
  57. package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
  58. package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
  59. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
  60. package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
  61. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
  62. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
  63. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
  64. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
  65. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
  66. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
  67. package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
  68. package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
  69. package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
  70. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
  71. package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
  72. package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
  73. package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
  74. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
  75. package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
  76. package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
  77. package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
  78. package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
  79. package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
  80. package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
  81. package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
  82. package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
  83. package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
  84. package/esm2022/lib/utils/ua-parser.mjs +190 -0
  85. package/esm2022/lib/utils/utils.mjs +105 -0
  86. package/esm2022/lib/utils/wake_lock.mjs +114 -0
  87. package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
  88. package/{esm2020 → esm2022}/public-api.mjs +33 -33
  89. package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
  90. package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
  91. package/fesm2022/speechrecorderng.mjs.map +1 -0
  92. package/index.d.ts +5 -5
  93. package/lib/action/action.d.ts +27 -27
  94. package/lib/audio/array_audio_buffer.d.ts +31 -31
  95. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
  96. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
  97. package/lib/audio/audio_data_holder.d.ts +84 -84
  98. package/lib/audio/audio_display.d.ts +36 -36
  99. package/lib/audio/audio_player.d.ts +47 -47
  100. package/lib/audio/capture/capture.d.ts +67 -67
  101. package/lib/audio/context.d.ts +6 -6
  102. package/lib/audio/dsp/level_measure.d.ts +60 -60
  103. package/lib/audio/format.d.ts +11 -11
  104. package/lib/audio/impl/wavformat.d.ts +5 -5
  105. package/lib/audio/impl/wavreader.d.ts +16 -16
  106. package/lib/audio/impl/wavwriter.d.ts +13 -13
  107. package/lib/audio/inddb_audio_buffer.d.ts +68 -68
  108. package/lib/audio/io/stream.d.ts +28 -28
  109. package/lib/audio/net_audio_buffer.d.ts +57 -57
  110. package/lib/audio/persistor.d.ts +29 -29
  111. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
  112. package/lib/audio/playback/audio_source_node.d.ts +10 -10
  113. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
  114. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
  115. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
  116. package/lib/audio/playback/player.d.ts +65 -65
  117. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
  118. package/lib/audio/ui/audio_display_control.d.ts +25 -25
  119. package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
  120. package/lib/audio/ui/audiosignal.d.ts +30 -30
  121. package/lib/audio/ui/common.d.ts +11 -11
  122. package/lib/audio/ui/container.d.ts +63 -63
  123. package/lib/audio/ui/livelevel.d.ts +60 -60
  124. package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
  125. package/lib/audio/ui/sonagram.d.ts +37 -37
  126. package/lib/db/inddb.d.ts +21 -21
  127. package/lib/dsp/utils.d.ts +19 -19
  128. package/lib/io/BinaryReader.d.ts +18 -18
  129. package/lib/io/BinaryWriter.d.ts +15 -15
  130. package/lib/io/stream.d.ts +59 -59
  131. package/lib/math/2d/geometry.d.ts +18 -18
  132. package/lib/math/complex.d.ts +17 -17
  133. package/lib/math/dft.d.ts +22 -22
  134. package/lib/media/utils.d.ts +3 -3
  135. package/lib/net/uploader.d.ts +81 -81
  136. package/lib/recorder_component.d.ts +16 -16
  137. package/lib/speechrecorder/project/project.d.ts +59 -59
  138. package/lib/speechrecorder/project/project.service.d.ts +21 -21
  139. package/lib/speechrecorder/recording.d.ts +51 -51
  140. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
  141. package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
  142. package/lib/speechrecorder/script/script.d.ts +80 -79
  143. package/lib/speechrecorder/script/script.service.d.ts +16 -16
  144. package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
  145. package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
  146. package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
  147. package/lib/speechrecorder/session/item.d.ts +12 -12
  148. package/lib/speechrecorder/session/progress.d.ts +17 -17
  149. package/lib/speechrecorder/session/prompting.d.ts +121 -121
  150. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
  151. package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
  152. package/lib/speechrecorder/session/recording_list.d.ts +24 -24
  153. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
  154. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
  155. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
  156. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
  157. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
  158. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
  159. package/lib/speechrecorder/session/session.d.ts +15 -15
  160. package/lib/speechrecorder/session/session.service.d.ts +20 -20
  161. package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
  162. package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
  163. package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
  164. package/lib/speechrecorder/spruploader.d.ts +11 -11
  165. package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
  166. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
  167. package/lib/speechrecorderng.component.d.ts +61 -61
  168. package/lib/speechrecorderng.module.d.ts +56 -56
  169. package/lib/spr.config.d.ts +17 -17
  170. package/lib/spr.module.version.d.ts +1 -1
  171. package/lib/ui/canvas_layer_comp.d.ts +13 -13
  172. package/lib/ui/message_dialog.d.ts +10 -10
  173. package/lib/ui/recordingitem_display.d.ts +84 -84
  174. package/lib/ui/responsive_component.d.ts +9 -9
  175. package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
  176. package/lib/utils/ua-parser.d.ts +43 -43
  177. package/lib/utils/utils.d.ts +19 -19
  178. package/lib/utils/wake_lock.d.ts +23 -23
  179. package/lib/utils/wake_lock_media.d.ts +1 -1
  180. package/package.json +17 -23
  181. package/public-api.d.ts +33 -33
  182. package/esm2020/lib/action/action.mjs +0 -73
  183. package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
  184. package/esm2020/lib/audio/capture/capture.mjs +0 -855
  185. package/esm2020/lib/audio/context.mjs +0 -79
  186. package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
  187. package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
  188. package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
  189. package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
  190. package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
  191. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  192. package/esm2020/lib/audio/playback/player.mjs +0 -402
  193. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  194. package/esm2020/lib/audio/ui/container.mjs +0 -414
  195. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  196. package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
  197. package/esm2020/lib/db/inddb.mjs +0 -120
  198. package/esm2020/lib/dsp/utils.mjs +0 -48
  199. package/esm2020/lib/io/BinaryWriter.mjs +0 -74
  200. package/esm2020/lib/math/complex.mjs +0 -58
  201. package/esm2020/lib/net/uploader.mjs +0 -367
  202. package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
  203. package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
  204. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
  205. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  206. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  207. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
  208. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
  209. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  210. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  211. package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
  212. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
  213. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  214. package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
  215. package/esm2020/lib/utils/ua-parser.mjs +0 -190
  216. package/esm2020/lib/utils/utils.mjs +0 -105
  217. package/esm2020/lib/utils/wake_lock.mjs +0 -114
  218. package/fesm2015/speechrecorderng.mjs +0 -17708
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. package/fesm2020/speechrecorderng.mjs.map +0 -1
@@ -1,554 +1,553 @@
1
- import { Component, ViewChild, Input, Output, EventEmitter, HostListener, HostBinding } from "@angular/core";
2
- import { SimpleTrafficLight } from "../startstopsignal/ui/simpletrafficlight";
3
- import { AudioDisplay } from "../../audio/audio_display";
4
- import { ResponsiveComponent } from "../../ui/responsive_component";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../project/project.service";
7
- import * as i2 from "@angular/cdk/layout";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "../../audio/audio_display";
10
- import * as i5 from "./progress";
11
- import * as i6 from "../startstopsignal/ui/simpletrafficlight";
12
- export class Recinstructions {
13
- displayText() {
14
- let riTxt = '';
15
- if (this.itemCount && this.selectedItemIdx) {
16
- riTxt = riTxt + this.selectedItemIdx + '/' + (this.itemCount - 1);
17
- }
18
- if (this.recinstructions) {
19
- riTxt = riTxt + ': ' + this.recinstructions;
20
- }
21
- return riTxt;
22
- }
23
- }
24
- Recinstructionsfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Recinstructions, deps: [], target: i0.ɵɵFactoryTarget.Component });
25
- Recinstructions.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: Recinstructions, selector: "spr-recinstructions", inputs: { recinstructions: "recinstructions", selectedItemIdx: "selectedItemIdx", itemCount: "itemCount" }, ngImport: i0, template: `
1
+ import { Component, ViewChild, Input, Output, EventEmitter, HostListener, HostBinding } from "@angular/core";
2
+ import { SimpleTrafficLight } from "../startstopsignal/ui/simpletrafficlight";
3
+ import { AudioDisplay } from "../../audio/audio_display";
4
+ import { ResponsiveComponent } from "../../ui/responsive_component";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../project/project.service";
7
+ import * as i2 from "@angular/cdk/layout";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "../../audio/audio_display";
10
+ import * as i5 from "./progress";
11
+ import * as i6 from "../startstopsignal/ui/simpletrafficlight";
12
+ export class Recinstructions {
13
+ displayText() {
14
+ let riTxt = '';
15
+ if (this.itemCount && this.selectedItemIdx) {
16
+ riTxt = riTxt + this.selectedItemIdx + '/' + (this.itemCount - 1);
17
+ }
18
+ if (this.recinstructions) {
19
+ riTxt = riTxt + ': ' + this.recinstructions;
20
+ }
21
+ return riTxt;
22
+ }
23
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: Recinstructions, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: Recinstructions, selector: "spr-recinstructions", inputs: { recinstructions: "recinstructions", selectedItemIdx: "selectedItemIdx", itemCount: "itemCount" }, ngImport: i0, template: `
26
25
 
27
26
  {{displayText()}}
28
- `, isInline: true, styles: [":host{justify-content:left;align-items:flex-start;background:white;text-align:left;font-size:1em;flex:0;width:100%}\n"] });
29
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Recinstructions, decorators: [{
30
- type: Component,
27
+ `, isInline: true, styles: [":host{justify-content:left;align-items:flex-start;background:white;text-align:left;font-size:1em;flex:0;width:100%}\n"] }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: Recinstructions, decorators: [{
30
+ type: Component,
31
31
  args: [{ selector: 'spr-recinstructions', template: `
32
32
 
33
33
  {{displayText()}}
34
- `, styles: [":host{justify-content:left;align-items:flex-start;background:white;text-align:left;font-size:1em;flex:0;width:100%}\n"] }]
35
- }], propDecorators: { recinstructions: [{
36
- type: Input
37
- }], selectedItemIdx: [{
38
- type: Input
39
- }], itemCount: [{
40
- type: Input
41
- }] } });
42
- export class Prompter {
43
- constructor(elRef, renderer, projectService) {
44
- this.elRef = elRef;
45
- this.renderer = renderer;
46
- this.projectService = projectService;
47
- this._promptMediaItems = null;
48
- this.prompterHeight = 0;
49
- this._text = null;
50
- this._src = null;
51
- this.currPromptChild = null;
52
- this.prompterStyleFill = false;
53
- }
54
- get text() {
55
- return this._text;
56
- }
57
- get src() {
58
- return this._src;
59
- }
60
- srcUrl() {
61
- if (this.projectName && this._src) {
62
- return this.projectService.projectResourceUrl(this.projectName, this._src);
63
- }
64
- return null;
65
- }
66
- width() {
67
- if (this.elRef) {
68
- if (this.elRef.nativeElement) {
69
- return this.elRef.nativeElement.clientWidth;
70
- }
71
- }
72
- return null;
73
- }
74
- height() {
75
- if (this.elRef) {
76
- if (this.elRef.nativeElement) {
77
- return this.elRef.nativeElement.clientHeight;
78
- }
79
- }
80
- return null;
81
- }
82
- appendTextElement(parentEl, txt) {
83
- let t = txt.text;
84
- let txtNd = this.renderer.createText(t);
85
- if (txt.decoration || txt.color) {
86
- let spEl = this.renderer.createElement('span');
87
- let styleStr = '';
88
- if (txt.decoration) {
89
- styleStr = styleStr + 'text-decoration: ' + txt.decoration + ';';
90
- }
91
- if (txt.color) {
92
- styleStr = styleStr + 'color: ' + txt.color + ';';
93
- }
94
- spEl.style = styleStr;
95
- this.renderer.appendChild(parentEl, spEl);
96
- this.renderer.appendChild(spEl, txtNd);
97
- }
98
- else {
99
- this.renderer.appendChild(parentEl, txtNd);
100
- }
101
- }
102
- set promptMediaItems(pMis) {
103
- this._promptMediaItems = pMis;
104
- if (this.currPromptChild != null) {
105
- this.renderer.removeChild(this.elRef.nativeElement, this.currPromptChild);
106
- }
107
- if (this._promptMediaItems && this._promptMediaItems.length == 1) {
108
- let mi = this._promptMediaItems[0];
109
- this.mimetype = 'text/plain';
110
- if (mi.mimetype) {
111
- this.mimetype = mi.mimetype.trim();
112
- }
113
- if (this.mimetype === 'text/plain') {
114
- this._text = mi.text;
115
- this._src = null;
116
- let prTxt = '';
117
- if (this._text) {
118
- prTxt = this._text;
119
- }
120
- this.currPromptChild = this.renderer.createText(prTxt);
121
- this.prompterStyleFill = false;
122
- this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild);
123
- }
124
- else if (this.mimetype === 'text/x-prompt') {
125
- //this.rendering=true
126
- this._text = null;
127
- this._src = null;
128
- this._blocks = new Array();
129
- let pd = mi.promptDoc;
130
- if (pd) {
131
- let pdBody = pd.body;
132
- if (pdBody) {
133
- this._blocks = pdBody.blocks;
134
- }
135
- }
136
- this.prompterStyleFill = false;
137
- this.currPromptChild = this.renderer.createElement('div');
138
- if (this._blocks) {
139
- for (let bi = 0; bi < this._blocks.length; bi++) {
140
- let bl = this._blocks[bi];
141
- if ('p' === bl.type) {
142
- let pBlEl = this.renderer.createElement('p');
143
- this.renderer.appendChild(this.currPromptChild, pBlEl);
144
- for (let ti = 0; ti < bl.texts.length; ti++) {
145
- let txt = bl.texts[ti];
146
- if (txt) {
147
- if ('text' === txt.type) {
148
- this.appendTextElement(pBlEl, txt);
149
- }
150
- else if ('font' === txt.type) {
151
- let spEl = this.renderer.createElement('span');
152
- let styleStr = '';
153
- if (txt.style) {
154
- styleStr = styleStr + 'font-style: ' + txt.style + ';';
155
- }
156
- if (txt.size) {
157
- styleStr = styleStr + 'font-size: ' + txt.size + ';';
158
- }
159
- if (txt.weight) {
160
- styleStr = styleStr + 'font-weight: ' + txt.weight + ';';
161
- }
162
- spEl.style = styleStr;
163
- this.renderer.appendChild(pBlEl, spEl);
164
- this.appendTextElement(spEl, txt.text);
165
- }
166
- else if ('linebreak' === txt.type) {
167
- let brEl = this.renderer.createElement('br');
168
- this.renderer.appendChild(pBlEl, brEl);
169
- }
170
- }
171
- }
172
- }
173
- }
174
- }
175
- this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild);
176
- //this.rendering=false
177
- }
178
- else if (this.mimetype.startsWith('image')) {
179
- this._text = null;
180
- this._src = mi.src;
181
- let promptImage = new Image();
182
- this.currPromptChild = promptImage;
183
- this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild);
184
- this.renderer.setStyle(this.currPromptChild, "max-width", "100%");
185
- this.renderer.setStyle(this.currPromptChild, "max-height", "100%");
186
- this.prompterStyleFill = true;
187
- // TODO vertical alignment
188
- // https://stackoverflow.com/questions/7273338/how-to-vertically-align-an-image-inside-a-div
189
- //console.log(promptImage.naturalWidth + "x"+promptImage.naturalHeight);
190
- promptImage.onload = (ev) => { };
191
- let srcUrl = this.srcUrl();
192
- if (srcUrl) {
193
- promptImage.src = srcUrl;
194
- }
195
- }
196
- }
197
- else {
198
- this._text = null;
199
- this._src = null;
200
- }
201
- }
202
- }
203
- Prompterfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Prompter, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.ProjectService }], target: i0.ɵɵFactoryTarget.Component });
204
- Prompter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: Prompter, selector: "app-sprprompter", inputs: { projectName: "projectName", prompterHeight: "prompterHeight", promptMediaItems: "promptMediaItems" }, host: { properties: { "class.fill": "this.prompterStyleFill" } }, ngImport: i0, template: `
34
+ `, styles: [":host{justify-content:left;align-items:flex-start;background:white;text-align:left;font-size:1em;flex:0;width:100%}\n"] }]
35
+ }], propDecorators: { recinstructions: [{
36
+ type: Input
37
+ }], selectedItemIdx: [{
38
+ type: Input
39
+ }], itemCount: [{
40
+ type: Input
41
+ }] } });
42
+ export class Prompter {
43
+ constructor(elRef, renderer, projectService) {
44
+ this.elRef = elRef;
45
+ this.renderer = renderer;
46
+ this.projectService = projectService;
47
+ this._promptMediaItems = null;
48
+ this.prompterHeight = 0;
49
+ this._text = null;
50
+ this._src = null;
51
+ this.currPromptChild = null;
52
+ this.prompterStyleFill = false;
53
+ }
54
+ get text() {
55
+ return this._text;
56
+ }
57
+ get src() {
58
+ return this._src;
59
+ }
60
+ srcUrl() {
61
+ if (this.projectName && this._src) {
62
+ return this.projectService.projectResourceUrl(this.projectName, this._src);
63
+ }
64
+ return null;
65
+ }
66
+ width() {
67
+ if (this.elRef) {
68
+ if (this.elRef.nativeElement) {
69
+ return this.elRef.nativeElement.clientWidth;
70
+ }
71
+ }
72
+ return null;
73
+ }
74
+ height() {
75
+ if (this.elRef) {
76
+ if (this.elRef.nativeElement) {
77
+ return this.elRef.nativeElement.clientHeight;
78
+ }
79
+ }
80
+ return null;
81
+ }
82
+ appendTextElement(parentEl, txt) {
83
+ let t = txt.text;
84
+ let txtNd = this.renderer.createText(t);
85
+ if (txt.decoration || txt.color) {
86
+ let spEl = this.renderer.createElement('span');
87
+ let styleStr = '';
88
+ if (txt.decoration) {
89
+ styleStr = styleStr + 'text-decoration: ' + txt.decoration + ';';
90
+ }
91
+ if (txt.color) {
92
+ styleStr = styleStr + 'color: ' + txt.color + ';';
93
+ }
94
+ spEl.style = styleStr;
95
+ this.renderer.appendChild(parentEl, spEl);
96
+ this.renderer.appendChild(spEl, txtNd);
97
+ }
98
+ else {
99
+ this.renderer.appendChild(parentEl, txtNd);
100
+ }
101
+ }
102
+ set promptMediaItems(pMis) {
103
+ this._promptMediaItems = pMis;
104
+ if (this.currPromptChild != null) {
105
+ this.renderer.removeChild(this.elRef.nativeElement, this.currPromptChild);
106
+ }
107
+ if (this._promptMediaItems && this._promptMediaItems.length == 1) {
108
+ let mi = this._promptMediaItems[0];
109
+ this.mimetype = 'text/plain';
110
+ if (mi.mimetype) {
111
+ this.mimetype = mi.mimetype.trim();
112
+ }
113
+ if (this.mimetype === 'text/plain') {
114
+ this._text = mi.text;
115
+ this._src = null;
116
+ let prTxt = '';
117
+ if (this._text) {
118
+ prTxt = this._text;
119
+ }
120
+ this.currPromptChild = this.renderer.createText(prTxt);
121
+ this.prompterStyleFill = false;
122
+ this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild);
123
+ }
124
+ else if (this.mimetype === 'text/x-prompt') {
125
+ //this.rendering=true
126
+ this._text = null;
127
+ this._src = null;
128
+ this._blocks = new Array();
129
+ let pd = mi.promptDoc;
130
+ if (pd) {
131
+ let pdBody = pd.body;
132
+ if (pdBody) {
133
+ this._blocks = pdBody.blocks;
134
+ }
135
+ }
136
+ this.prompterStyleFill = false;
137
+ this.currPromptChild = this.renderer.createElement('div');
138
+ if (this._blocks) {
139
+ for (let bi = 0; bi < this._blocks.length; bi++) {
140
+ let bl = this._blocks[bi];
141
+ if ('p' === bl.type) {
142
+ let pBlEl = this.renderer.createElement('p');
143
+ this.renderer.appendChild(this.currPromptChild, pBlEl);
144
+ for (let ti = 0; ti < bl.texts.length; ti++) {
145
+ let txt = bl.texts[ti];
146
+ if (txt) {
147
+ if ('text' === txt.type) {
148
+ this.appendTextElement(pBlEl, txt);
149
+ }
150
+ else if ('font' === txt.type) {
151
+ let spEl = this.renderer.createElement('span');
152
+ let styleStr = '';
153
+ if (txt.style) {
154
+ styleStr = styleStr + 'font-style: ' + txt.style + ';';
155
+ }
156
+ if (txt.size) {
157
+ styleStr = styleStr + 'font-size: ' + txt.size + ';';
158
+ }
159
+ if (txt.weight) {
160
+ styleStr = styleStr + 'font-weight: ' + txt.weight + ';';
161
+ }
162
+ spEl.style = styleStr;
163
+ this.renderer.appendChild(pBlEl, spEl);
164
+ this.appendTextElement(spEl, txt.text);
165
+ }
166
+ else if ('linebreak' === txt.type) {
167
+ let brEl = this.renderer.createElement('br');
168
+ this.renderer.appendChild(pBlEl, brEl);
169
+ }
170
+ }
171
+ }
172
+ }
173
+ }
174
+ }
175
+ this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild);
176
+ //this.rendering=false
177
+ }
178
+ else if (this.mimetype.startsWith('image')) {
179
+ this._text = null;
180
+ this._src = mi.src;
181
+ let promptImage = new Image();
182
+ this.currPromptChild = promptImage;
183
+ this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild);
184
+ this.renderer.setStyle(this.currPromptChild, "max-width", "100%");
185
+ this.renderer.setStyle(this.currPromptChild, "max-height", "100%");
186
+ this.prompterStyleFill = true;
187
+ // TODO vertical alignment
188
+ // https://stackoverflow.com/questions/7273338/how-to-vertically-align-an-image-inside-a-div
189
+ //console.log(promptImage.naturalWidth + "x"+promptImage.naturalHeight);
190
+ promptImage.onload = (ev) => { };
191
+ let srcUrl = this.srcUrl();
192
+ if (srcUrl) {
193
+ promptImage.src = srcUrl;
194
+ }
195
+ }
196
+ }
197
+ else {
198
+ this._text = null;
199
+ this._src = null;
200
+ }
201
+ }
202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: Prompter, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.ProjectService }], target: i0.ɵɵFactoryTarget.Component }); }
203
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: Prompter, selector: "app-sprprompter", inputs: { projectName: "projectName", prompterHeight: "prompterHeight", promptMediaItems: "promptMediaItems" }, host: { properties: { "class.fill": "this.prompterStyleFill" } }, ngImport: i0, template: `
205
204
 
206
205
  <!--<ng-template [ngIf]="text">{{text}}</ng-template>-->
207
206
  <!-- <img *ngIf="src" #promptImage [src]="srcUrl()" [height]="prompterHeight-20" /> -->
208
- `, isInline: true, styles: [":host{justify-content:center;align-items:center;background:white;text-align:center;line-height:1.2em;font-weight:700;flex:0 1}\n", ":host(.fill){flex:3;width:100%;height:100%;max-height:100%;max-width:100%;vertical-align:middle}\n"] });
209
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Prompter, decorators: [{
210
- type: Component,
207
+ `, isInline: true, styles: [":host{justify-content:center;align-items:center;background:white;text-align:center;line-height:1.2em;font-weight:700;flex:0 1}\n", ":host(.fill){flex:3;width:100%;height:100%;max-height:100%;max-width:100%;vertical-align:middle}\n"] }); }
208
+ }
209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: Prompter, decorators: [{
210
+ type: Component,
211
211
  args: [{ selector: 'app-sprprompter', template: `
212
212
 
213
213
  <!--<ng-template [ngIf]="text">{{text}}</ng-template>-->
214
214
  <!-- <img *ngIf="src" #promptImage [src]="srcUrl()" [height]="prompterHeight-20" /> -->
215
- `, styles: [":host{justify-content:center;align-items:center;background:white;text-align:center;line-height:1.2em;font-weight:700;flex:0 1}\n", ":host(.fill){flex:3;width:100%;height:100%;max-height:100%;max-width:100%;vertical-align:middle}\n"] }]
216
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ProjectService }]; }, propDecorators: { projectName: [{
217
- type: Input
218
- }], prompterHeight: [{
219
- type: Input
220
- }], prompterStyleFill: [{
221
- type: HostBinding,
222
- args: ['class.fill']
223
- }], promptMediaItems: [{
224
- type: Input
225
- }] } });
226
- export const VIRTUAL_HEIGHT = 600;
227
- export const DEFAULT_PROMPT_FONTSIZE = 48;
228
- export const MIN_FONT_SIZE = 6;
229
- export const FALLBACK_DEF_USER_AGENT_FONT_SIZE = 14;
230
- export class PromptContainer {
231
- constructor(elRef) {
232
- this.elRef = elRef;
233
- this._mediaitems = null;
234
- this.prompterHeight = VIRTUAL_HEIGHT;
235
- this.fontSizeChange = false;
236
- this.contentChecked = false;
237
- this.prDisplay = 'hidden';
238
- this.autoFontSize = false;
239
- }
240
- ngOnInit() {
241
- // fallback
242
- this.defaultFontSizePx = FALLBACK_DEF_USER_AGENT_FONT_SIZE;
243
- // try to parse default user agent font size (no comment about DOM API design ;) )
244
- this.defaultStyle = window.getComputedStyle(this.elRef.nativeElement);
245
- let defFontSizeStr = this.defaultStyle.fontSize;
246
- if (defFontSizeStr) {
247
- defFontSizeStr = defFontSizeStr.trim();
248
- if (defFontSizeStr.endsWith('px')) {
249
- // parseFloat ignores non number characters at the end (again no comment ;) )
250
- this.defaultFontSizePx = parseFloat(defFontSizeStr);
251
- //console.info("Default font size: "+this.defaultFontSizePx)
252
- }
253
- }
254
- this.contentChecked = false;
255
- }
256
- ngAfterContentChecked() {
257
- if (this.autoFontSize) {
258
- if (this.fontSizeChange) {
259
- //console.log("ngaftercontentchecked, call fontSizeToFit ");
260
- // check prompter size again
261
- this.fontSizeToFit();
262
- }
263
- else {
264
- // font size was checked, but we need to check again after angular content check
265
- if (!this.contentChecked) {
266
- this.contentChecked = true;
267
- //console.log("ngaftercontentchecked, not font size changed, call ");
268
- this.fontSizeToFit();
269
- }
270
- }
271
- }
272
- }
273
- set mediaitems(mediaitems) {
274
- this._mediaitems = mediaitems;
275
- let mimetype = null;
276
- if (this._mediaitems && this._mediaitems.length == 1) {
277
- let mi = this._mediaitems[0];
278
- mimetype = 'text/plain';
279
- if (mi.mimetype) {
280
- mimetype = mi.mimetype.trim();
281
- }
282
- if (mi.defaultVirtualViewBox) {
283
- this.prompterHeight = mi.defaultVirtualViewBox.height;
284
- }
285
- }
286
- else {
287
- this.prompterHeight = VIRTUAL_HEIGHT;
288
- }
289
- this.prompter.promptMediaItems = this._mediaitems;
290
- this.autoFontSize = (mimetype != null && mimetype.startsWith('text/'));
291
- if (this.autoFontSize) {
292
- this.fontSizeChange = true;
293
- this.contentChecked = false;
294
- this.prDisplay = 'hidden';
295
- this.layout();
296
- }
297
- }
298
- get mediaitems() {
299
- return this._mediaitems;
300
- }
301
- onResize(event) {
302
- //console.debug("onresize, call fontSizeToFit hook ");
303
- this.layout();
304
- }
305
- layout() {
306
- if (this.autoFontSize && this.elRef) {
307
- this.fontSizeChange = true;
308
- this.contentChecked = false;
309
- this.prDisplay = 'hidden';
310
- let elH = this.elRef.nativeElement.offsetHeight;
311
- // prompt text font size should scale according to prompt container height
312
- let scaledSize = Math.round((elH / this.prompterHeight) * DEFAULT_PROMPT_FONTSIZE);
313
- // min prompt font size is default user agent size
314
- let newSize = Math.max(scaledSize, this.defaultFontSizePx);
315
- if (this.fontSize !== newSize) {
316
- this.fontSize = newSize;
317
- }
318
- //console.log("layout, call fontSizeToFit hook ");
319
- window.setTimeout(() => this.fontSizeToFit());
320
- }
321
- }
322
- fontSizeToFit() {
323
- if (this.prompter) {
324
- let pW = this.prompter.width();
325
- let pH = this.prompter.height();
326
- if (this._mediaitems && this.elRef && pW && pH) {
327
- let nEl = this.elRef.nativeElement;
328
- //console.log("prompter: " + this.prompter.width() + "x" + this.prompter.height()+ " font size: "+this.fontSize)
329
- if (this.fontSize >= MIN_FONT_SIZE && (pW > nEl.offsetWidth || pH > nEl.offsetHeight)) {
330
- // prompter oversizes prompter container. Decrease font size.
331
- // set invisible during font size checks
332
- this.prDisplay = 'hidden';
333
- // decrease font size
334
- this.fontSize = this.fontSize - 1;
335
- // console.log("Decreased font size: "+this.fontSize )
336
- // Set flags
337
- this.fontSizeChange = true;
338
- this.contentChecked = false;
339
- // hook the next check
340
- window.setTimeout(() => this.fontSizeToFit());
341
- }
342
- else {
343
- // prompter fits in prompter container, font size should be fine
344
- //console.log("prDisplay: "+this.prDisplay)
345
- //if(this.contentChecked && ! this.fontSizeChange) {
346
- //console.log("Display!")
347
- // set prompter visible now
348
- this.prDisplay = 'visible';
349
- //}
350
- this.fontSizeChange = false;
351
- }
352
- //console.log("Prompt text width: "+textSize.width+" "+this.elRef.nativeElement.offsetWidth+"x"+this.elRef.nativeElement.offsetHeight)
353
- }
354
- }
355
- }
356
- }
357
- PromptContainerfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PromptContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
358
- PromptContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: PromptContainer, selector: "app-sprpromptcontainer", inputs: { projectName: "projectName", mediaitems: "mediaitems" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "prompter", first: true, predicate: Prompter, descendants: true, static: true }], ngImport: i0, template: `
215
+ `, styles: [":host{justify-content:center;align-items:center;background:white;text-align:center;line-height:1.2em;font-weight:700;flex:0 1}\n", ":host(.fill){flex:3;width:100%;height:100%;max-height:100%;max-width:100%;vertical-align:middle}\n"] }]
216
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ProjectService }], propDecorators: { projectName: [{
217
+ type: Input
218
+ }], prompterHeight: [{
219
+ type: Input
220
+ }], prompterStyleFill: [{
221
+ type: HostBinding,
222
+ args: ['class.fill']
223
+ }], promptMediaItems: [{
224
+ type: Input
225
+ }] } });
226
+ export const VIRTUAL_HEIGHT = 600;
227
+ export const DEFAULT_PROMPT_FONTSIZE = 48;
228
+ export const MIN_FONT_SIZE = 6;
229
+ export const FALLBACK_DEF_USER_AGENT_FONT_SIZE = 14;
230
+ export class PromptContainer {
231
+ constructor(elRef) {
232
+ this.elRef = elRef;
233
+ this._mediaitems = null;
234
+ this.prompterHeight = VIRTUAL_HEIGHT;
235
+ this.fontSizeChange = false;
236
+ this.contentChecked = false;
237
+ this.prDisplay = 'hidden';
238
+ this.autoFontSize = false;
239
+ }
240
+ ngOnInit() {
241
+ // fallback
242
+ this.defaultFontSizePx = FALLBACK_DEF_USER_AGENT_FONT_SIZE;
243
+ // try to parse default user agent font size (no comment about DOM API design ;) )
244
+ this.defaultStyle = window.getComputedStyle(this.elRef.nativeElement);
245
+ let defFontSizeStr = this.defaultStyle.fontSize;
246
+ if (defFontSizeStr) {
247
+ defFontSizeStr = defFontSizeStr.trim();
248
+ if (defFontSizeStr.endsWith('px')) {
249
+ // parseFloat ignores non number characters at the end (again no comment ;) )
250
+ this.defaultFontSizePx = parseFloat(defFontSizeStr);
251
+ //console.info("Default font size: "+this.defaultFontSizePx)
252
+ }
253
+ }
254
+ this.contentChecked = false;
255
+ }
256
+ ngAfterContentChecked() {
257
+ if (this.autoFontSize) {
258
+ if (this.fontSizeChange) {
259
+ //console.log("ngaftercontentchecked, call fontSizeToFit ");
260
+ // check prompter size again
261
+ this.fontSizeToFit();
262
+ }
263
+ else {
264
+ // font size was checked, but we need to check again after angular content check
265
+ if (!this.contentChecked) {
266
+ this.contentChecked = true;
267
+ //console.log("ngaftercontentchecked, not font size changed, call ");
268
+ this.fontSizeToFit();
269
+ }
270
+ }
271
+ }
272
+ }
273
+ set mediaitems(mediaitems) {
274
+ this._mediaitems = mediaitems;
275
+ let mimetype = null;
276
+ if (this._mediaitems && this._mediaitems.length == 1) {
277
+ let mi = this._mediaitems[0];
278
+ mimetype = 'text/plain';
279
+ if (mi.mimetype) {
280
+ mimetype = mi.mimetype.trim();
281
+ }
282
+ if (mi.defaultVirtualViewBox) {
283
+ this.prompterHeight = mi.defaultVirtualViewBox.height;
284
+ }
285
+ }
286
+ else {
287
+ this.prompterHeight = VIRTUAL_HEIGHT;
288
+ }
289
+ this.prompter.promptMediaItems = this._mediaitems;
290
+ this.autoFontSize = (mimetype != null && mimetype.startsWith('text/'));
291
+ if (this.autoFontSize) {
292
+ this.fontSizeChange = true;
293
+ this.contentChecked = false;
294
+ this.prDisplay = 'hidden';
295
+ this.layout();
296
+ }
297
+ }
298
+ get mediaitems() {
299
+ return this._mediaitems;
300
+ }
301
+ onResize(event) {
302
+ //console.debug("onresize, call fontSizeToFit hook ");
303
+ this.layout();
304
+ }
305
+ layout() {
306
+ if (this.autoFontSize && this.elRef) {
307
+ this.fontSizeChange = true;
308
+ this.contentChecked = false;
309
+ this.prDisplay = 'hidden';
310
+ let elH = this.elRef.nativeElement.offsetHeight;
311
+ // prompt text font size should scale according to prompt container height
312
+ let scaledSize = Math.round((elH / this.prompterHeight) * DEFAULT_PROMPT_FONTSIZE);
313
+ // min prompt font size is default user agent size
314
+ let newSize = Math.max(scaledSize, this.defaultFontSizePx);
315
+ if (this.fontSize !== newSize) {
316
+ this.fontSize = newSize;
317
+ }
318
+ //console.log("layout, call fontSizeToFit hook ");
319
+ window.setTimeout(() => this.fontSizeToFit());
320
+ }
321
+ }
322
+ fontSizeToFit() {
323
+ if (this.prompter) {
324
+ let pW = this.prompter.width();
325
+ let pH = this.prompter.height();
326
+ if (this._mediaitems && this.elRef && pW && pH) {
327
+ let nEl = this.elRef.nativeElement;
328
+ //console.log("prompter: " + this.prompter.width() + "x" + this.prompter.height()+ " font size: "+this.fontSize)
329
+ if (this.fontSize >= MIN_FONT_SIZE && (pW > nEl.offsetWidth || pH > nEl.offsetHeight)) {
330
+ // prompter oversizes prompter container. Decrease font size.
331
+ // set invisible during font size checks
332
+ this.prDisplay = 'hidden';
333
+ // decrease font size
334
+ this.fontSize = this.fontSize - 1;
335
+ // console.log("Decreased font size: "+this.fontSize )
336
+ // Set flags
337
+ this.fontSizeChange = true;
338
+ this.contentChecked = false;
339
+ // hook the next check
340
+ window.setTimeout(() => this.fontSizeToFit());
341
+ }
342
+ else {
343
+ // prompter fits in prompter container, font size should be fine
344
+ //console.log("prDisplay: "+this.prDisplay)
345
+ //if(this.contentChecked && ! this.fontSizeChange) {
346
+ //console.log("Display!")
347
+ // set prompter visible now
348
+ this.prDisplay = 'visible';
349
+ //}
350
+ this.fontSizeChange = false;
351
+ }
352
+ //console.log("Prompt text width: "+textSize.width+" "+this.elRef.nativeElement.offsetWidth+"x"+this.elRef.nativeElement.offsetHeight)
353
+ }
354
+ }
355
+ }
356
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PromptContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
357
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: PromptContainer, selector: "app-sprpromptcontainer", inputs: { projectName: "projectName", mediaitems: "mediaitems" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "prompter", first: true, predicate: Prompter, descendants: true, static: true }], ngImport: i0, template: `
359
358
  <app-sprprompter #prompter [projectName]="projectName" [promptMediaItems]="mediaitems" [style.font-size]="fontSize+'px'" [style.visibility]="prDisplay" [prompterHeight]="prompterHeight"></app-sprprompter>
360
- `, isInline: true, styles: [":host{flex:3;padding:10pt;height:100%;max-height:100%;justify-content:center;align-items:center;background:white;text-align:center;display:flex;flex-direction:column;min-height:0px;width:100%}\n"], dependencies: [{ kind: "component", type: Prompter, selector: "app-sprprompter", inputs: ["projectName", "prompterHeight", "promptMediaItems"] }] });
361
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PromptContainer, decorators: [{
362
- type: Component,
359
+ `, isInline: true, styles: [":host{flex:3;padding:10pt;height:100%;max-height:100%;justify-content:center;align-items:center;background:white;text-align:center;display:flex;flex-direction:column;min-height:0px;width:100%}\n"], dependencies: [{ kind: "component", type: Prompter, selector: "app-sprprompter", inputs: ["projectName", "prompterHeight", "promptMediaItems"] }] }); }
360
+ }
361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PromptContainer, decorators: [{
362
+ type: Component,
363
363
  args: [{ selector: 'app-sprpromptcontainer', template: `
364
364
  <app-sprprompter #prompter [projectName]="projectName" [promptMediaItems]="mediaitems" [style.font-size]="fontSize+'px'" [style.visibility]="prDisplay" [prompterHeight]="prompterHeight"></app-sprprompter>
365
- `, styles: [":host{flex:3;padding:10pt;height:100%;max-height:100%;justify-content:center;align-items:center;background:white;text-align:center;display:flex;flex-direction:column;min-height:0px;width:100%}\n"] }]
366
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { projectName: [{
367
- type: Input
368
- }], prompter: [{
369
- type: ViewChild,
370
- args: [Prompter, { static: true }]
371
- }], mediaitems: [{
372
- type: Input
373
- }], onResize: [{
374
- type: HostListener,
375
- args: ['window:resize', ['$event']]
376
- }] } });
377
- export class PromptingContainer {
378
- constructor(ref) {
379
- this.ref = ref;
380
- this.promptItem = null;
381
- this.showPrompt = false;
382
- this.startX = null;
383
- this.touchStartTimeStamp = null;
384
- }
385
- ngOnInit() {
386
- this.e = this.ref.nativeElement;
387
- }
388
- onTouchstart(ev) {
389
- //console.log("Touch start! ")
390
- if (!(this.transportActions.fwdAction.disabled &&
391
- this.transportActions.bwdAction.disabled &&
392
- this.transportActions.nextAction.disabled)) {
393
- let targetTouchesLen = ev.targetTouches.length;
394
- //for(let ti=0;ti<ev.targetTouches.length;ti++){
395
- //let t=ev.targetTouches.item(ti);
396
- // All x values are the same ??
397
- //console.log("Touch #"+ti+": pageX: "+t.pageX+" clientX: "+t.clientX+" screenX: "+t.screenX)
398
- //}
399
- if (targetTouchesLen == 1) {
400
- // single touch
401
- let t = ev.targetTouches.item(0);
402
- if (t) {
403
- this.startX = Math.round(t.screenX);
404
- this.touchStartTimeStamp = ev.timeStamp;
405
- this.e.style.transition = 'none';
406
- //console.log("Touch start x: "+this.startX)
407
- //ev.preventDefault();
408
- }
409
- }
410
- }
411
- }
412
- onTouchEnd(ev) {
413
- //console.log("Touch end!")
414
- // Reset offset shift
415
- if (!(this.transportActions.fwdAction.disabled && this.transportActions.bwdAction.disabled &&
416
- this.transportActions.nextAction.disabled)) {
417
- let changedTouchesLen = ev.changedTouches.length;
418
- //console.log(changedTouchesLen+" "+this.startX)
419
- if (changedTouchesLen == 1 && this.startX) {
420
- // single touch
421
- let t = ev.changedTouches.item(0);
422
- if (t) {
423
- let deltaX = Math.round(t.clientX - this.startX);
424
- let touchMoveSpeed = 0;
425
- if (this.touchStartTimeStamp) {
426
- touchMoveSpeed = deltaX / (ev.timeStamp - this.touchStartTimeStamp);
427
- }
428
- let futureDeltaX = deltaX + (800 * touchMoveSpeed);
429
- //console.log("DeltaX: " + deltaX + " Future deltaX: " + futureDeltaX + " width: " + this.e.offsetWidth)
430
- if (futureDeltaX > this.e.offsetWidth / 2) {
431
- //console.log("Swipe right detected!!")
432
- //this.swipedRight.emit()
433
- if (!this.transportActions.bwdAction.disabled) {
434
- this.transportActions.bwdAction.perform();
435
- }
436
- this.e.style.left = -this.e.offsetLeft + "px";
437
- }
438
- if (-futureDeltaX > this.e.offsetWidth / 2) {
439
- //console.log("Swipe left detected!!")
440
- this.e.style.left = -this.e.offsetLeft + "px";
441
- //this.swipedLeft.emit()
442
- if (!this.transportActions.nextAction.disabled) {
443
- this.transportActions.nextAction.perform();
444
- }
445
- else if (!this.transportActions.fwdAction.disabled) {
446
- this.transportActions.fwdAction.perform();
447
- }
448
- }
449
- else {
450
- }
451
- ev.preventDefault();
452
- }
453
- }
454
- // reset animated
455
- this.e.style.transition = "left 0.8s";
456
- }
457
- this.startX = null;
458
- this.touchStartTimeStamp = null;
459
- this.e.style.left = "0px";
460
- }
461
- onTouchMove(ev) {
462
- //console.log("Touch move!")
463
- if (!(this.transportActions.fwdAction.disabled && this.transportActions.bwdAction.disabled &&
464
- this.transportActions.nextAction.disabled)) {
465
- let targetTouchesLen = ev.targetTouches.length;
466
- if (targetTouchesLen == 1 && this.startX) {
467
- // single touch
468
- let t = ev.targetTouches.item(0);
469
- if (t) {
470
- let deltaX = Math.round(t.screenX - this.startX);
471
- this.e.style.left = deltaX + "px";
472
- // console.log("Touch move delta x: "+deltaX)
473
- }
474
- ev.preventDefault();
475
- }
476
- }
477
- }
478
- onTouchCancel(ev) {
479
- //console.log("Touch cancel!")
480
- this.e.style.left = "0px";
481
- //ev.preventDefault();
482
- }
483
- }
484
- PromptingContainerfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PromptingContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
485
- PromptingContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: PromptingContainer, selector: "app-sprpromptingcontainer", inputs: { projectName: "projectName", promptItem: "promptItem", showPrompt: "showPrompt", selectedItemIdx: "selectedItemIdx", itemCount: "itemCount", transportActions: "transportActions" }, host: { listeners: { "touchstart": "onTouchstart($event)", "touchend": "onTouchEnd($event)", "touchmove": "onTouchMove($event)", "touchcancel": "onTouchCancel($event)" } }, ngImport: i0, template: `
365
+ `, styles: [":host{flex:3;padding:10pt;height:100%;max-height:100%;justify-content:center;align-items:center;background:white;text-align:center;display:flex;flex-direction:column;min-height:0px;width:100%}\n"] }]
366
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { projectName: [{
367
+ type: Input
368
+ }], prompter: [{
369
+ type: ViewChild,
370
+ args: [Prompter, { static: true }]
371
+ }], mediaitems: [{
372
+ type: Input
373
+ }], onResize: [{
374
+ type: HostListener,
375
+ args: ['window:resize', ['$event']]
376
+ }] } });
377
+ export class PromptingContainer {
378
+ constructor(ref) {
379
+ this.ref = ref;
380
+ this.promptItem = null;
381
+ this.showPrompt = false;
382
+ this.startX = null;
383
+ this.touchStartTimeStamp = null;
384
+ }
385
+ ngOnInit() {
386
+ this.e = this.ref.nativeElement;
387
+ }
388
+ onTouchstart(ev) {
389
+ //console.log("Touch start! ")
390
+ if (!(this.transportActions.fwdAction.disabled &&
391
+ this.transportActions.bwdAction.disabled &&
392
+ this.transportActions.nextAction.disabled)) {
393
+ let targetTouchesLen = ev.targetTouches.length;
394
+ //for(let ti=0;ti<ev.targetTouches.length;ti++){
395
+ //let t=ev.targetTouches.item(ti);
396
+ // All x values are the same ??
397
+ //console.log("Touch #"+ti+": pageX: "+t.pageX+" clientX: "+t.clientX+" screenX: "+t.screenX)
398
+ //}
399
+ if (targetTouchesLen == 1) {
400
+ // single touch
401
+ let t = ev.targetTouches.item(0);
402
+ if (t) {
403
+ this.startX = Math.round(t.screenX);
404
+ this.touchStartTimeStamp = ev.timeStamp;
405
+ this.e.style.transition = 'none';
406
+ //console.log("Touch start x: "+this.startX)
407
+ //ev.preventDefault();
408
+ }
409
+ }
410
+ }
411
+ }
412
+ onTouchEnd(ev) {
413
+ //console.log("Touch end!")
414
+ // Reset offset shift
415
+ if (!(this.transportActions.fwdAction.disabled && this.transportActions.bwdAction.disabled &&
416
+ this.transportActions.nextAction.disabled)) {
417
+ let changedTouchesLen = ev.changedTouches.length;
418
+ //console.log(changedTouchesLen+" "+this.startX)
419
+ if (changedTouchesLen == 1 && this.startX) {
420
+ // single touch
421
+ let t = ev.changedTouches.item(0);
422
+ if (t) {
423
+ let deltaX = Math.round(t.clientX - this.startX);
424
+ let touchMoveSpeed = 0;
425
+ if (this.touchStartTimeStamp) {
426
+ touchMoveSpeed = deltaX / (ev.timeStamp - this.touchStartTimeStamp);
427
+ }
428
+ let futureDeltaX = deltaX + (800 * touchMoveSpeed);
429
+ //console.log("DeltaX: " + deltaX + " Future deltaX: " + futureDeltaX + " width: " + this.e.offsetWidth)
430
+ if (futureDeltaX > this.e.offsetWidth / 2) {
431
+ //console.log("Swipe right detected!!")
432
+ //this.swipedRight.emit()
433
+ if (!this.transportActions.bwdAction.disabled) {
434
+ this.transportActions.bwdAction.perform();
435
+ }
436
+ this.e.style.left = -this.e.offsetLeft + "px";
437
+ }
438
+ if (-futureDeltaX > this.e.offsetWidth / 2) {
439
+ //console.log("Swipe left detected!!")
440
+ this.e.style.left = -this.e.offsetLeft + "px";
441
+ //this.swipedLeft.emit()
442
+ if (!this.transportActions.nextAction.disabled) {
443
+ this.transportActions.nextAction.perform();
444
+ }
445
+ else if (!this.transportActions.fwdAction.disabled) {
446
+ this.transportActions.fwdAction.perform();
447
+ }
448
+ }
449
+ else {
450
+ }
451
+ ev.preventDefault();
452
+ }
453
+ }
454
+ // reset animated
455
+ this.e.style.transition = "left 0.8s";
456
+ }
457
+ this.startX = null;
458
+ this.touchStartTimeStamp = null;
459
+ this.e.style.left = "0px";
460
+ }
461
+ onTouchMove(ev) {
462
+ //console.log("Touch move!")
463
+ if (!(this.transportActions.fwdAction.disabled && this.transportActions.bwdAction.disabled &&
464
+ this.transportActions.nextAction.disabled)) {
465
+ let targetTouchesLen = ev.targetTouches.length;
466
+ if (targetTouchesLen == 1 && this.startX) {
467
+ // single touch
468
+ let t = ev.targetTouches.item(0);
469
+ if (t) {
470
+ let deltaX = Math.round(t.screenX - this.startX);
471
+ this.e.style.left = deltaX + "px";
472
+ // console.log("Touch move delta x: "+deltaX)
473
+ }
474
+ ev.preventDefault();
475
+ }
476
+ }
477
+ }
478
+ onTouchCancel(ev) {
479
+ //console.log("Touch cancel!")
480
+ this.e.style.left = "0px";
481
+ //ev.preventDefault();
482
+ }
483
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PromptingContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
484
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: PromptingContainer, selector: "app-sprpromptingcontainer", inputs: { projectName: "projectName", promptItem: "promptItem", showPrompt: "showPrompt", selectedItemIdx: "selectedItemIdx", itemCount: "itemCount", transportActions: "transportActions" }, host: { listeners: { "touchstart": "onTouchstart($event)", "touchend": "onTouchEnd($event)", "touchmove": "onTouchMove($event)", "touchcancel": "onTouchCancel($event)" } }, ngImport: i0, template: `
486
485
  <spr-recinstructions [selectedItemIdx]="selectedItemIdx" [itemCount]="itemCount"
487
486
  [recinstructions]="promptItem?.recinstructions?.recinstructions"></spr-recinstructions>
488
487
  <app-sprpromptcontainer [projectName]="projectName"
489
488
  [mediaitems]="showPrompt?(promptItem?promptItem.mediaitems:null):null"></app-sprpromptcontainer>
490
489
 
491
- `, isInline: true, styles: [":host{position:relative;flex:3;padding:10pt;justify-content:center;align-items:center;background:white;text-align:center;display:flex;flex-direction:column;min-height:0px}\n"], dependencies: [{ kind: "component", type: Recinstructions, selector: "spr-recinstructions", inputs: ["recinstructions", "selectedItemIdx", "itemCount"] }, { kind: "component", type: PromptContainer, selector: "app-sprpromptcontainer", inputs: ["projectName", "mediaitems"] }] });
492
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PromptingContainer, decorators: [{
493
- type: Component,
490
+ `, isInline: true, styles: [":host{position:relative;flex:3;padding:10pt;justify-content:center;align-items:center;background:white;text-align:center;display:flex;flex-direction:column;min-height:0px}\n"], dependencies: [{ kind: "component", type: Recinstructions, selector: "spr-recinstructions", inputs: ["recinstructions", "selectedItemIdx", "itemCount"] }, { kind: "component", type: PromptContainer, selector: "app-sprpromptcontainer", inputs: ["projectName", "mediaitems"] }] }); }
491
+ }
492
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PromptingContainer, decorators: [{
493
+ type: Component,
494
494
  args: [{ selector: 'app-sprpromptingcontainer', template: `
495
495
  <spr-recinstructions [selectedItemIdx]="selectedItemIdx" [itemCount]="itemCount"
496
496
  [recinstructions]="promptItem?.recinstructions?.recinstructions"></spr-recinstructions>
497
497
  <app-sprpromptcontainer [projectName]="projectName"
498
498
  [mediaitems]="showPrompt?(promptItem?promptItem.mediaitems:null):null"></app-sprpromptcontainer>
499
499
 
500
- `, styles: [":host{position:relative;flex:3;padding:10pt;justify-content:center;align-items:center;background:white;text-align:center;display:flex;flex-direction:column;min-height:0px}\n"] }]
501
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { projectName: [{
502
- type: Input
503
- }], promptItem: [{
504
- type: Input
505
- }], showPrompt: [{
506
- type: Input
507
- }], selectedItemIdx: [{
508
- type: Input
509
- }], itemCount: [{
510
- type: Input
511
- }], transportActions: [{
512
- type: Input
513
- }], onTouchstart: [{
514
- type: HostListener,
515
- args: ['touchstart', ['$event']]
516
- }], onTouchEnd: [{
517
- type: HostListener,
518
- args: ['touchend', ['$event']]
519
- }], onTouchMove: [{
520
- type: HostListener,
521
- args: ['touchmove', ['$event']]
522
- }], onTouchCancel: [{
523
- type: HostListener,
524
- args: ['touchcancel', ['$event']]
525
- }] } });
526
- export class Prompting extends ResponsiveComponent {
527
- constructor(bpo) {
528
- super(bpo);
529
- this.bpo = bpo;
530
- this.promptItem = null;
531
- this.showPrompt = false;
532
- this.items = undefined;
533
- this.enableDownload = false;
534
- this.audioSignalCollapsed = true;
535
- this.displayAudioClip = null;
536
- this.onItemSelect = new EventEmitter();
537
- this.onNextItem = new EventEmitter();
538
- this.onPrevItem = new EventEmitter();
539
- }
540
- itemSelect(rowIdx) {
541
- this.onItemSelect.emit(rowIdx);
542
- }
543
- nextItem() {
544
- this.onNextItem.emit();
545
- }
546
- prevItem() {
547
- this.onPrevItem.emit();
548
- }
549
- }
550
- Promptingfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Prompting, deps: [{ token: i2.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
551
- Prompting.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: Prompting, selector: "app-sprprompting", inputs: { projectName: "projectName", startStopSignalState: "startStopSignalState", promptItem: "promptItem", showPrompt: "showPrompt", items: "items", selectedItemIdx: "selectedItemIdx", transportActions: "transportActions", enableDownload: "enableDownload", audioSignalCollapsed: "audioSignalCollapsed", displayAudioClip: "displayAudioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", playStopAction: "playStopAction" }, outputs: { onItemSelect: "onItemSelect", onNextItem: "onNextItem", onPrevItem: "onPrevItem" }, viewQueries: [{ propertyName: "simpleTrafficLight", first: true, predicate: SimpleTrafficLight, descendants: true, static: true }, { propertyName: "audioDisplay", first: true, predicate: AudioDisplay, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
500
+ `, styles: [":host{position:relative;flex:3;padding:10pt;justify-content:center;align-items:center;background:white;text-align:center;display:flex;flex-direction:column;min-height:0px}\n"] }]
501
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { projectName: [{
502
+ type: Input
503
+ }], promptItem: [{
504
+ type: Input
505
+ }], showPrompt: [{
506
+ type: Input
507
+ }], selectedItemIdx: [{
508
+ type: Input
509
+ }], itemCount: [{
510
+ type: Input
511
+ }], transportActions: [{
512
+ type: Input
513
+ }], onTouchstart: [{
514
+ type: HostListener,
515
+ args: ['touchstart', ['$event']]
516
+ }], onTouchEnd: [{
517
+ type: HostListener,
518
+ args: ['touchend', ['$event']]
519
+ }], onTouchMove: [{
520
+ type: HostListener,
521
+ args: ['touchmove', ['$event']]
522
+ }], onTouchCancel: [{
523
+ type: HostListener,
524
+ args: ['touchcancel', ['$event']]
525
+ }] } });
526
+ export class Prompting extends ResponsiveComponent {
527
+ constructor(bpo) {
528
+ super(bpo);
529
+ this.bpo = bpo;
530
+ this.promptItem = null;
531
+ this.showPrompt = false;
532
+ this.items = undefined;
533
+ this.enableDownload = false;
534
+ this.audioSignalCollapsed = true;
535
+ this.displayAudioClip = null;
536
+ this.onItemSelect = new EventEmitter();
537
+ this.onNextItem = new EventEmitter();
538
+ this.onPrevItem = new EventEmitter();
539
+ }
540
+ itemSelect(rowIdx) {
541
+ this.onItemSelect.emit(rowIdx);
542
+ }
543
+ nextItem() {
544
+ this.onNextItem.emit();
545
+ }
546
+ prevItem() {
547
+ this.onPrevItem.emit();
548
+ }
549
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: Prompting, deps: [{ token: i2.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
550
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: Prompting, selector: "app-sprprompting", inputs: { projectName: "projectName", startStopSignalState: "startStopSignalState", promptItem: "promptItem", showPrompt: "showPrompt", items: "items", selectedItemIdx: "selectedItemIdx", transportActions: "transportActions", enableDownload: "enableDownload", audioSignalCollapsed: "audioSignalCollapsed", displayAudioClip: "displayAudioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", playStopAction: "playStopAction" }, outputs: { onItemSelect: "onItemSelect", onNextItem: "onNextItem", onPrevItem: "onPrevItem" }, viewQueries: [{ propertyName: "simpleTrafficLight", first: true, predicate: SimpleTrafficLight, descendants: true, static: true }, { propertyName: "audioDisplay", first: true, predicate: AudioDisplay, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
552
551
 
553
552
  <app-simpletrafficlight [status]="startStopSignalState"></app-simpletrafficlight>
554
553
  <app-sprpromptingcontainer [projectName]="projectName" [promptItem]="promptItem" [showPrompt]="showPrompt"
@@ -570,9 +569,10 @@ Prompting.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14
570
569
 
571
570
 
572
571
 
573
- `, isInline: true, styles: [":host{position:relative;margin:0;padding:0;background:lightgrey;width:100%;flex:1;min-height:0px;display:flex;flex-direction:row;flex-wrap:nowrap}\n", "app-simpletrafficlight{margin:10px;min-height:0px;z-index:3}\n", "app-sprprogress{z-index:3}\n", "div{display:none;position:absolute;z-index:5}\n", "div.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:5;box-sizing:border-box;background-color:#0000}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.AudioDisplay, selector: "app-audiodisplay", inputs: ["playStartAction", "playStopAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "audioData", "audioClip"] }, { kind: "component", type: i5.Progress, selector: "app-sprprogress", inputs: ["items", "selectedItemIdx", "enableDownload"], outputs: ["onRowSelect", "rowSelect", "onShowDoneAction", "clickDone", "onDownloadDoneAction", "clickDownloadDone"] }, { kind: "component", type: i6.SimpleTrafficLight, selector: "app-simpletrafficlight", inputs: ["status"] }, { kind: "component", type: PromptingContainer, selector: "app-sprpromptingcontainer", inputs: ["projectName", "promptItem", "showPrompt", "selectedItemIdx", "itemCount", "transportActions"] }] });
574
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Prompting, decorators: [{
575
- type: Component,
572
+ `, isInline: true, styles: [":host{position:relative;margin:0;padding:0;background:lightgrey;width:100%;flex:1;min-height:0px;display:flex;flex-direction:row;flex-wrap:nowrap}\n", "app-simpletrafficlight{margin:10px;min-height:0px;z-index:3}\n", "app-sprprogress{z-index:3}\n", "div{display:none;position:absolute;z-index:5}\n", "div.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:5;box-sizing:border-box;background-color:#0000}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.AudioDisplay, selector: "app-audiodisplay", inputs: ["playStartAction", "playStopAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "audioData", "audioClip"] }, { kind: "component", type: i5.Progress, selector: "app-sprprogress", inputs: ["items", "selectedItemIdx", "enableDownload"], outputs: ["onRowSelect", "rowSelect", "onShowDoneAction", "clickDone", "onDownloadDoneAction", "clickDownloadDone"] }, { kind: "component", type: i6.SimpleTrafficLight, selector: "app-simpletrafficlight", inputs: ["status"] }, { kind: "component", type: PromptingContainer, selector: "app-sprpromptingcontainer", inputs: ["projectName", "promptItem", "showPrompt", "selectedItemIdx", "itemCount", "transportActions"] }] }); }
573
+ }
574
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: Prompting, decorators: [{
575
+ type: Component,
576
576
  args: [{ selector: 'app-sprprompting', template: `
577
577
 
578
578
  <app-simpletrafficlight [status]="startStopSignalState"></app-simpletrafficlight>
@@ -595,46 +595,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
595
595
 
596
596
 
597
597
 
598
- `, styles: [":host{position:relative;margin:0;padding:0;background:lightgrey;width:100%;flex:1;min-height:0px;display:flex;flex-direction:row;flex-wrap:nowrap}\n", "app-simpletrafficlight{margin:10px;min-height:0px;z-index:3}\n", "app-sprprogress{z-index:3}\n", "div{display:none;position:absolute;z-index:5}\n", "div.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:5;box-sizing:border-box;background-color:#0000}\n"] }]
599
- }], ctorParameters: function () { return [{ type: i2.BreakpointObserver }]; }, propDecorators: { simpleTrafficLight: [{
600
- type: ViewChild,
601
- args: [SimpleTrafficLight, { static: true }]
602
- }], audioDisplay: [{
603
- type: ViewChild,
604
- args: [AudioDisplay, { static: true }]
605
- }], projectName: [{
606
- type: Input
607
- }], startStopSignalState: [{
608
- type: Input
609
- }], promptItem: [{
610
- type: Input
611
- }], showPrompt: [{
612
- type: Input
613
- }], items: [{
614
- type: Input
615
- }], selectedItemIdx: [{
616
- type: Input
617
- }], transportActions: [{
618
- type: Input
619
- }], enableDownload: [{
620
- type: Input
621
- }], audioSignalCollapsed: [{
622
- type: Input
623
- }], displayAudioClip: [{
624
- type: Input
625
- }], playStartAction: [{
626
- type: Input
627
- }], playSelectionAction: [{
628
- type: Input
629
- }], autoPlayOnSelectToggleAction: [{
630
- type: Input
631
- }], playStopAction: [{
632
- type: Input
633
- }], onItemSelect: [{
634
- type: Output
635
- }], onNextItem: [{
636
- type: Output
637
- }], onPrevItem: [{
638
- type: Output
639
- }] } });
640
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vcHJvbXB0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFJWixXQUFXLEVBRVosTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFNNUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7OztBQXdCbEUsTUFBTSxPQUFPLGVBQWU7SUFLMUIsV0FBVztRQUNULElBQUksS0FBSyxHQUFRLEVBQUUsQ0FBQztRQUNwQixJQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBQztZQUN4QyxLQUFLLEdBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxlQUFlLEdBQUMsR0FBRyxHQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6RDtRQUNELElBQUcsSUFBSSxDQUFDLGVBQWUsRUFBQztZQUN0QixLQUFLLEdBQUMsS0FBSyxHQUFDLElBQUksR0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzs2R0FkVSxlQUFlO2lHQUFmLGVBQWUsdUtBaEJoQjs7O0dBR1Q7NEZBYVUsZUFBZTtrQkFwQjNCLFNBQVM7K0JBRUUscUJBQXFCLFlBRXJCOzs7R0FHVDs4QkFjUSxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csU0FBUztz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QUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNoQyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIFZpZXdDaGlsZCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBFbGVtZW50UmVmLFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQge1NpbXBsZVRyYWZmaWNMaWdodH0gZnJvbSBcIi4uL3N0YXJ0c3RvcHNpZ25hbC91aS9zaW1wbGV0cmFmZmljbGlnaHRcIjtcclxuaW1wb3J0IHtTdGF0ZSBhcyBTdGFydFN0b3BTaWduYWxTdGF0ZX0gZnJvbSBcIi4uL3N0YXJ0c3RvcHNpZ25hbC9zdGFydHN0b3BzaWduYWxcIjtcclxuaW1wb3J0IHtJdGVtfSBmcm9tIFwiLi9pdGVtXCI7XHJcbmltcG9ydCB7QmxvY2ssIFRleHQsIE1lZGlhaXRlbSwgUHJvbXB0SXRlbX0gZnJvbSBcIi4uL3NjcmlwdC9zY3JpcHRcIjtcclxuaW1wb3J0IHtUcmFuc3BvcnRBY3Rpb25zfSBmcm9tIFwiLi9jb250cm9scGFuZWxcIjtcclxuaW1wb3J0IHtBY3Rpb259IGZyb20gXCIuLi8uLi9hY3Rpb24vYWN0aW9uXCI7XHJcbmltcG9ydCB7QXVkaW9EaXNwbGF5fSBmcm9tIFwiLi4vLi4vYXVkaW8vYXVkaW9fZGlzcGxheVwiO1xyXG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tIFwiLi4vcHJvamVjdC9wcm9qZWN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtSZXNwb25zaXZlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vdWkvcmVzcG9uc2l2ZV9jb21wb25lbnRcIjtcclxuaW1wb3J0IHtCcmVha3BvaW50T2JzZXJ2ZXJ9IGZyb20gXCJAYW5ndWxhci9jZGsvbGF5b3V0XCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnc3ByLXJlY2luc3RydWN0aW9ucycsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcblxyXG4gICAge3tkaXNwbGF5VGV4dCgpfX1cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcblxyXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0OyAvKiBhbGlnbiBob3Jpem9udGFsIGNlbnRlciAqL1xyXG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIGFsaWduIHZlcnRpY2FsICBjZW50ZXIgKi9cclxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGZvbnQtc2l6ZTogMWVtO1xyXG4gICAgZmxleDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gIH1cclxuICBgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVjaW5zdHJ1Y3Rpb25zIHtcclxuICBASW5wdXQoKSByZWNpbnN0cnVjdGlvbnM6IHN0cmluZ3xudWxsfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtSWR4OiBudW1iZXJ8bnVsbHx1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgaXRlbUNvdW50OiBudW1iZXJ8dW5kZWZpbmVkO1xyXG5cclxuICBkaXNwbGF5VGV4dCgpOnN0cmluZ3tcclxuICAgIGxldCByaVR4dDpzdHJpbmc9Jyc7XHJcbiAgICBpZih0aGlzLml0ZW1Db3VudCAmJiB0aGlzLnNlbGVjdGVkSXRlbUlkeCl7XHJcbiAgICAgIHJpVHh0PXJpVHh0K3RoaXMuc2VsZWN0ZWRJdGVtSWR4KycvJysodGhpcy5pdGVtQ291bnQtMSk7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLnJlY2luc3RydWN0aW9ucyl7XHJcbiAgICAgIHJpVHh0PXJpVHh0Kyc6ICcrdGhpcy5yZWNpbnN0cnVjdGlvbnM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmlUeHQ7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtc3BycHJvbXB0ZXInLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG5cclxuICAgIDwhLS08bmctdGVtcGxhdGUgW25nSWZdPVwidGV4dFwiPnt7dGV4dH19PC9uZy10ZW1wbGF0ZT4tLT5cclxuICAgIDwhLS0gPGltZyAqbmdJZj1cInNyY1wiICNwcm9tcHRJbWFnZSBbc3JjXT1cInNyY1VybCgpXCIgW2hlaWdodF09XCJwcm9tcHRlckhlaWdodC0yMFwiIC8+IC0tPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuXHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogYWxpZ24gaG9yaXpvbnRhbCBjZW50ZXIgKi9cclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIGFsaWduIHZlcnRpY2FsICBjZW50ZXIgKi9cclxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgLyogZm9udC1zaXplOiAyZW07ICovXHJcbiAgICBsaW5lLWhlaWdodDogMS4yZW07XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIC8qIFVzZSBvbmx5IG5hdHVyYWwgc2l6ZSBvZiB0aGUgcHJvbXB0ICovXHJcbiAgICAvKiBUaGUgcHJvbXB0ZXIgY29tcG5lbnQgdGhlbiBldHMgYWxpZ25lZCB2ZXJ0aWNhbGx5IGNlbnRlcmVkICovXHJcbiAgICBmbGV4OiAwIDE7XHJcblxyXG4gIH1gLCBgOmhvc3QoLmZpbGwpIHtcclxuICAgIC8qIFVzZSBhbGwgc3BhY2UgdG8gc2NhbGUgaW1hZ2VzICovXHJcbiAgICBmbGV4OiAzO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgLyogQSBzZXBhcmF0ZSBmbGV4IGNvbnRhaW5lciBtaWdodCBiZSBuZWNlc3NheXIgdG8gYWxpZ2huIGNlbnRlcmVkICovXHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvKiBUT0RPIGRvZXMgbm90IHdvcmssIGltYWdlIGlzIG5vdCB2ZXJ0aWNhbGx5IGNlbnRlcmVkICovXHJcbiAgfWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9tcHRlciB7XHJcbiAgQElucHV0KCkgcHJvamVjdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9wcm9tcHRNZWRpYUl0ZW1zOiBBcnJheTxNZWRpYWl0ZW0+fG51bGx8dW5kZWZpbmVkPW51bGxcclxuXHJcbiAgQElucHV0KCkgcHJvbXB0ZXJIZWlnaHQ6IG51bWJlcj0wO1xyXG4gIHByaXZhdGUgX3RleHQ6IHN0cmluZ3x1bmRlZmluZWR8bnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfc3JjOiBzdHJpbmd8dW5kZWZpbmVkfG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2Jsb2NrczogQXJyYXk8QmxvY2s+fHVuZGVmaW5lZDtcclxuICBtaW1ldHlwZSE6IHN0cmluZztcclxuICBwcml2YXRlIGN1cnJQcm9tcHRDaGlsZDogSFRNTEVsZW1lbnR8bnVsbCA9IG51bGw7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmlsbCcpIHB1YmxpYyBwcm9tcHRlclN0eWxlRmlsbCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHRleHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcclxuICB9XHJcblxyXG4gIGdldCBzcmMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3JjO1xyXG4gIH1cclxuXHJcbiAgc3JjVXJsKCk6IHN0cmluZ3xudWxse1xyXG4gICAgaWYgKHRoaXMucHJvamVjdE5hbWUgJiYgdGhpcy5fc3JjKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3RSZXNvdXJjZVVybCh0aGlzLnByb2plY3ROYW1lLCB0aGlzLl9zcmMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAgIHdpZHRoKCk6bnVtYmVyfG51bGx7XHJcbiAgICAgIGlmKHRoaXMuZWxSZWYpe1xyXG4gICAgICAgIGlmKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCl7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBoZWlnaHQoKTpudW1iZXJ8bnVsbHtcclxuICAgICAgICBpZih0aGlzLmVsUmVmKXtcclxuICAgICAgICAgICAgaWYodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBlbmRUZXh0RWxlbWVudChwYXJlbnRFbDpIVE1MRWxlbWVudCx0eHQ6VGV4dCl7XHJcbiAgICAgIGxldCB0OiBzdHJpbmcgPSA8c3RyaW5nPnR4dC50ZXh0XHJcbiAgICAgIGxldCB0eHROZCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh0KVxyXG4gICAgICBpZih0eHQuZGVjb3JhdGlvbiB8fCB0eHQuY29sb3Ipe1xyXG4gICAgICAgIGxldCBzcEVsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICBsZXQgc3R5bGVTdHI9JydcclxuICAgICAgICBpZih0eHQuZGVjb3JhdGlvbikge1xyXG4gICAgICAgICAgc3R5bGVTdHIgPSBzdHlsZVN0ciArJ3RleHQtZGVjb3JhdGlvbjogJyArIHR4dC5kZWNvcmF0aW9uKyc7J1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0eHQuY29sb3Ipe1xyXG4gICAgICAgICAgc3R5bGVTdHIgPSBzdHlsZVN0ciArJ2NvbG9yOiAnICsgdHh0LmNvbG9yKyc7J1xyXG4gICAgICAgIH1cclxuICAgICAgICBzcEVsLnN0eWxlPXN0eWxlU3RyXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnRFbCwgc3BFbClcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHNwRWwsIHR4dE5kKVxyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnRFbCwgdHh0TmQpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IHByb21wdE1lZGlhSXRlbXMocE1pczogQXJyYXk8TWVkaWFpdGVtPnxudWxsKSB7XHJcbiAgICB0aGlzLl9wcm9tcHRNZWRpYUl0ZW1zID0gcE1pc1xyXG4gICAgaWYgKHRoaXMuY3VyclByb21wdENoaWxkICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuY3VyclByb21wdENoaWxkKVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3Byb21wdE1lZGlhSXRlbXMgJiYgdGhpcy5fcHJvbXB0TWVkaWFJdGVtcy5sZW5ndGggPT0gMSkge1xyXG4gICAgICBsZXQgbWkgPSB0aGlzLl9wcm9tcHRNZWRpYUl0ZW1zWzBdXHJcbiAgICAgIHRoaXMubWltZXR5cGUgPSAndGV4dC9wbGFpbidcclxuICAgICAgaWYgKG1pLm1pbWV0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5taW1ldHlwZSA9IG1pLm1pbWV0eXBlLnRyaW0oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5taW1ldHlwZSA9PT0gJ3RleHQvcGxhaW4nKSB7XHJcbiAgICAgICAgdGhpcy5fdGV4dCA9IG1pLnRleHRcclxuICAgICAgICB0aGlzLl9zcmMgPSBudWxsO1xyXG4gICAgICAgIGxldCBwclR4dD0nJztcclxuICAgICAgICBpZih0aGlzLl90ZXh0KXtcclxuICAgICAgICAgIHByVHh0PXRoaXMuX3RleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VyclByb21wdENoaWxkID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHByVHh0KTtcclxuICAgICAgICB0aGlzLnByb21wdGVyU3R5bGVGaWxsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuY3VyclByb21wdENoaWxkKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm1pbWV0eXBlID09PSAndGV4dC94LXByb21wdCcpIHtcclxuICAgICAgICAvL3RoaXMucmVuZGVyaW5nPXRydWVcclxuICAgICAgICB0aGlzLl90ZXh0PW51bGw7XHJcbiAgICAgICAgdGhpcy5fc3JjPW51bGw7XHJcbiAgICAgICAgdGhpcy5fYmxvY2tzPW5ldyBBcnJheTxCbG9jaz4oKTtcclxuICAgICAgICBsZXQgcGQ9bWkucHJvbXB0RG9jXHJcbiAgICAgICAgaWYocGQpe1xyXG4gICAgICAgICAgbGV0IHBkQm9keT1wZC5ib2R5XHJcbiAgICAgICAgICBpZihwZEJvZHkpe1xyXG4gICAgICAgICAgICB0aGlzLl9ibG9ja3M9cGRCb2R5LmJsb2NrcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJvbXB0ZXJTdHlsZUZpbGwgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuY3VyclByb21wdENoaWxkID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICAgIGlmKHRoaXMuX2Jsb2Nrcykge1xyXG4gICAgICAgICAgZm9yIChsZXQgYmkgPSAwOyBiaSA8IHRoaXMuX2Jsb2Nrcy5sZW5ndGg7IGJpKyspIHtcclxuICAgICAgICAgICAgbGV0IGJsID0gdGhpcy5fYmxvY2tzW2JpXVxyXG4gICAgICAgICAgICBpZiAoJ3AnID09PSBibC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBCbEVsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdwJylcclxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuY3VyclByb21wdENoaWxkLCBwQmxFbClcclxuICAgICAgICAgICAgICBmb3IgKGxldCB0aSA9IDA7IHRpIDwgYmwudGV4dHMubGVuZ3RoOyB0aSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdHh0ID0gYmwudGV4dHNbdGldXHJcbiAgICAgICAgICAgICAgICBpZiAodHh0KSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICgndGV4dCcgPT09IHR4dC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRUZXh0RWxlbWVudChwQmxFbCwgdHh0KVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdmb250JyA9PT0gdHh0LnR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3BFbCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlU3RyID0gJydcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHh0LnN0eWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZVN0ciA9IHN0eWxlU3RyICsgJ2ZvbnQtc3R5bGU6ICcgKyB0eHQuc3R5bGUgKyAnOydcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR4dC5zaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZVN0ciA9IHN0eWxlU3RyICsgJ2ZvbnQtc2l6ZTogJyArIHR4dC5zaXplICsgJzsnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eHQud2VpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZVN0ciA9IHN0eWxlU3RyICsgJ2ZvbnQtd2VpZ2h0OiAnICsgdHh0LndlaWdodCArICc7J1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzcEVsLnN0eWxlID0gc3R5bGVTdHJcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHBCbEVsLCBzcEVsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVGV4dEVsZW1lbnQoc3BFbCwgPFRleHQ+dHh0LnRleHQpXHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ2xpbmVicmVhaycgPT09IHR4dC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyRWwgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2JyJylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHBCbEVsLCBickVsKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmN1cnJQcm9tcHRDaGlsZClcclxuICAgICAgICAvL3RoaXMucmVuZGVyaW5nPWZhbHNlXHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5taW1ldHlwZS5zdGFydHNXaXRoKCdpbWFnZScpKSB7XHJcbiAgICAgICAgdGhpcy5fdGV4dCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc3JjID0gbWkuc3JjXHJcbiAgICAgICAgbGV0IHByb21wdEltYWdlID0gbmV3IEltYWdlKClcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyUHJvbXB0Q2hpbGQgPSBwcm9tcHRJbWFnZVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmN1cnJQcm9tcHRDaGlsZClcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY3VyclByb21wdENoaWxkLCBcIm1heC13aWR0aFwiLCBcIjEwMCVcIilcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY3VyclByb21wdENoaWxkLCBcIm1heC1oZWlnaHRcIiwgXCIxMDAlXCIpXHJcbiAgICAgICAgdGhpcy5wcm9tcHRlclN0eWxlRmlsbCA9IHRydWVcclxuICAgICAgICAvLyBUT0RPIHZlcnRpY2FsIGFsaWdubWVudFxyXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzcyNzMzMzgvaG93LXRvLXZlcnRpY2FsbHktYWxpZ24tYW4taW1hZ2UtaW5zaWRlLWEtZGl2XHJcblxyXG4gICAgICAgIC8vY29uc29sZS5sb2cocHJvbXB0SW1hZ2UubmF0dXJhbFdpZHRoICsgXCJ4XCIrcHJvbXB0SW1hZ2UubmF0dXJhbEhlaWdodCk7XHJcbiAgICAgICAgcHJvbXB0SW1hZ2Uub25sb2FkID0gKGV2OiBFdmVudCkgPT4ge31cclxuICAgICAgICBsZXQgc3JjVXJsPXRoaXMuc3JjVXJsKCk7XHJcbiAgICAgICAgaWYoc3JjVXJsKSB7XHJcbiAgICAgICAgICBwcm9tcHRJbWFnZS5zcmMgPSBzcmNVcmw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdGV4dCA9IG51bGxcclxuICAgICAgdGhpcy5fc3JjID0gbnVsbFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFZJUlRVQUxfSEVJR0hUID0gNjAwO1xyXG5leHBvcnQgY29uc3QgREVGQVVMVF9QUk9NUFRfRk9OVFNJWkUgPSA0ODtcclxuZXhwb3J0IGNvbnN0IE1JTl9GT05UX1NJWkU9NjtcclxuZXhwb3J0IGNvbnN0IEZBTExCQUNLX0RFRl9VU0VSX0FHRU5UX0ZPTlRfU0laRSA9IDE0O1xyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLXNwcnByb21wdGNvbnRhaW5lcicsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YXBwLXNwcnByb21wdGVyICNwcm9tcHRlciBbcHJvamVjdE5hbWVdPVwicHJvamVjdE5hbWVcIiBbcHJvbXB0TWVkaWFJdGVtc109XCJtZWRpYWl0ZW1zXCIgW3N0eWxlLmZvbnQtc2l6ZV09XCJmb250U2l6ZSsncHgnXCIgW3N0eWxlLnZpc2liaWxpdHldPVwicHJEaXNwbGF5XCIgW3Byb21wdGVySGVpZ2h0XT1cInByb21wdGVySGVpZ2h0XCI+PC9hcHAtc3BycHJvbXB0ZXI+XHJcbiAgYFxyXG4gICxcclxuICBzdHlsZXM6IFtgOmhvc3Qge1xyXG5cclxuICAgIGZsZXg6IDM7IC8qIHRoZSBjb250YWluZXIgY29uc3VtZXMgYWxsIGF2YWlsYWJsZSBzcGFjZSAqL1xyXG4gICAgcGFkZGluZzogMTBwdDtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIG1heC1oZWlnaHQ6IDEwMCU7XHJcblxyXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IC8qIGFsaWduIGhvcml6b250YWwgY2VudGVyKi9cclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIGFsaWduIHZlcnRpY2FsIGNlbnRlciAqL1xyXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gIH1cclxuICBgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvbXB0Q29udGFpbmVyIGltcGxlbWVudHMgT25Jbml0LEFmdGVyQ29udGVudENoZWNrZWQge1xyXG4gIEBJbnB1dCgpIHByb2plY3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfbWVkaWFpdGVtczogQXJyYXk8TWVkaWFpdGVtPnxudWxsPW51bGw7XHJcblxyXG4gIHByb21wdGVySGVpZ2h0OiBudW1iZXIgPSBWSVJUVUFMX0hFSUdIVFxyXG4gIGZvbnRTaXplITogbnVtYmVyO1xyXG4gIGZvbnRTaXplQ2hhbmdlPWZhbHNlXHJcbiAgY29udGVudENoZWNrZWQ9ZmFsc2U7XHJcbiAgcHJEaXNwbGF5PSdoaWRkZW4nO1xyXG4gIGRlZmF1bHRTdHlsZSE6IENTU1N0eWxlRGVjbGFyYXRpb247XHJcbiAgZGVmYXVsdEZvbnRTaXplUHghOiBudW1iZXI7XHJcblxyXG4gIGF1dG9Gb250U2l6ZT1mYWxzZTtcclxuICBAVmlld0NoaWxkKFByb21wdGVyLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcm9tcHRlciE6IFByb21wdGVyO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOkVsZW1lbnRSZWYpe31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgLy8gZmFsbGJhY2tcclxuICAgIHRoaXMuZGVmYXVsdEZvbnRTaXplUHggPSBGQUxMQkFDS19ERUZfVVNFUl9BR0VOVF9GT05UX1NJWkU7XHJcbiAgICAvLyB0cnkgdG8gcGFyc2UgZGVmYXVsdCB1c2VyIGFnZW50IGZvbnQgc2l6ZSAobm8gY29tbWVudCBhYm91dCBET00gQVBJIGRlc2lnbiA7KSApXHJcbiAgICB0aGlzLmRlZmF1bHRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICBsZXQgZGVmRm9udFNpemVTdHIgPSB0aGlzLmRlZmF1bHRTdHlsZS5mb250U2l6ZTtcclxuICAgIGlmIChkZWZGb250U2l6ZVN0cikge1xyXG4gICAgICBkZWZGb250U2l6ZVN0ciA9IGRlZkZvbnRTaXplU3RyLnRyaW0oKTtcclxuICAgICAgaWYgKGRlZkZvbnRTaXplU3RyLmVuZHNXaXRoKCdweCcpKSB7XHJcbiAgICAgICAgLy8gcGFyc2VGbG9hdCBpZ25vcmVzIG5vbiBudW1iZXIgY2hhcmFjdGVycyBhdCB0aGUgZW5kIChhZ2FpbiBubyBjb21tZW50IDspIClcclxuICAgICAgICB0aGlzLmRlZmF1bHRGb250U2l6ZVB4ID0gcGFyc2VGbG9hdChkZWZGb250U2l6ZVN0cik7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuaW5mbyhcIkRlZmF1bHQgZm9udCBzaXplOiBcIit0aGlzLmRlZmF1bHRGb250U2l6ZVB4KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNvbnRlbnRDaGVja2VkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7XHJcbiAgICBpZih0aGlzLmF1dG9Gb250U2l6ZSkge1xyXG4gICAgICBpZiAodGhpcy5mb250U2l6ZUNoYW5nZSkge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJuZ2FmdGVyY29udGVudGNoZWNrZWQsIGNhbGwgZm9udFNpemVUb0ZpdCBcIik7XHJcbiAgICAgICAgLy8gY2hlY2sgcHJvbXB0ZXIgc2l6ZSBhZ2FpblxyXG4gICAgICAgIHRoaXMuZm9udFNpemVUb0ZpdCgpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZm9udCBzaXplIHdhcyBjaGVja2VkLCBidXQgd2UgbmVlZCB0byBjaGVjayBhZ2FpbiBhZnRlciBhbmd1bGFyIGNvbnRlbnQgY2hlY2tcclxuICAgICAgICBpZiAoIXRoaXMuY29udGVudENoZWNrZWQpIHtcclxuICAgICAgICAgIHRoaXMuY29udGVudENoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhcIm5nYWZ0ZXJjb250ZW50Y2hlY2tlZCwgbm90IGZvbnQgc2l6ZSBjaGFuZ2VkLCBjYWxsIFwiKTtcclxuICAgICAgICAgIHRoaXMuZm9udFNpemVUb0ZpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgQElucHV0KCkgc2V0IG1lZGlhaXRlbXMobWVkaWFpdGVtczpBcnJheTxNZWRpYWl0ZW0+fG51bGwpe1xyXG5cclxuICAgIHRoaXMuX21lZGlhaXRlbXMgPSBtZWRpYWl0ZW1zXHJcblxyXG4gICAgbGV0IG1pbWV0eXBlOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgICBpZiAodGhpcy5fbWVkaWFpdGVtcyAmJiB0aGlzLl9tZWRpYWl0ZW1zLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgIGxldCBtaSA9IHRoaXMuX21lZGlhaXRlbXNbMF1cclxuICAgICAgbWltZXR5cGUgPSAndGV4dC9wbGFpbidcclxuICAgICAgaWYgKG1pLm1pbWV0eXBlKSB7XHJcbiAgICAgICAgbWltZXR5cGUgPSBtaS5taW1ldHlwZS50cmltKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYobWkuZGVmYXVsdFZpcnR1YWxWaWV3Qm94KXtcclxuICAgICAgICB0aGlzLnByb21wdGVySGVpZ2h0PW1pLmRlZmF1bHRWaXJ0dWFsVmlld0JveC5oZWlnaHRcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMucHJvbXB0ZXJIZWlnaHQ9VklSVFVBTF9IRUlHSFRcclxuICAgIH1cclxuICAgIHRoaXMucHJvbXB0ZXIucHJvbXB0TWVkaWFJdGVtcz10aGlzLl9tZWRpYWl0ZW1zXHJcbiAgICB0aGlzLmF1dG9Gb250U2l6ZT0obWltZXR5cGUhPW51bGwgJiYgbWltZXR5cGUuc3RhcnRzV2l0aCgndGV4dC8nKSk7XHJcbiAgICBpZih0aGlzLmF1dG9Gb250U2l6ZSl7XHJcbiAgICAgICAgdGhpcy5mb250U2l6ZUNoYW5nZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jb250ZW50Q2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy5wckRpc3BsYXkgPSAnaGlkZGVuJ1xyXG4gICAgICAgIHRoaXMubGF5b3V0KClcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IG1lZGlhaXRlbXMoKTpBcnJheTxNZWRpYWl0ZW0+fG51bGx7XHJcbiAgICAgIHJldHVybiB0aGlzLl9tZWRpYWl0ZW1zO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIm9ucmVzaXplLCBjYWxsIGZvbnRTaXplVG9GaXQgaG9vayBcIik7XHJcbiAgICB0aGlzLmxheW91dCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsYXlvdXQoKSB7XHJcbiAgICBpZih0aGlzLmF1dG9Gb250U2l6ZSAmJiB0aGlzLmVsUmVmKSB7XHJcblxyXG4gICAgICB0aGlzLmZvbnRTaXplQ2hhbmdlPXRydWU7XHJcbiAgICAgIHRoaXMuY29udGVudENoZWNrZWQgPSBmYWxzZVxyXG4gICAgICB0aGlzLnByRGlzcGxheSA9ICdoaWRkZW4nXHJcbiAgICAgIGxldCBlbEggPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAvLyBwcm9tcHQgdGV4dCBmb250IHNpemUgc2hvdWxkIHNjYWxlIGFjY29yZGluZyB0byBwcm9tcHQgY29udGFpbmVyIGhlaWdodFxyXG4gICAgICBsZXQgc2NhbGVkU2l6ZSA9IE1hdGgucm91bmQoKGVsSCAvIHRoaXMucHJvbXB0ZXJIZWlnaHQpICogREVGQVVMVF9QUk9NUFRfRk9OVFNJWkUpO1xyXG5cclxuICAgICAgLy8gbWluIHByb21wdCBmb250IHNpemUgaXMgZGVmYXVsdCB1c2VyIGFnZW50IHNpemVcclxuICAgICAgbGV0IG5ld1NpemUgPSBNYXRoLm1heChzY2FsZWRTaXplLCB0aGlzLmRlZmF1bHRGb250U2l6ZVB4KTtcclxuICAgICAgaWYgKHRoaXMuZm9udFNpemUgIT09IG5ld1NpemUpIHtcclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gbmV3U2l6ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9jb25zb2xlLmxvZyhcImxheW91dCwgY2FsbCBmb250U2l6ZVRvRml0IGhvb2sgXCIpO1xyXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvbnRTaXplVG9GaXQoKSlcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBmb250U2l6ZVRvRml0KCl7XHJcbiAgICAgIGlmKHRoaXMucHJvbXB0ZXIpIHtcclxuICAgICAgICBsZXQgcFc9dGhpcy5wcm9tcHRlci53aWR0aCgpO1xyXG4gICAgICAgIGxldCBwSD10aGlzLnByb21wdGVyLmhlaWdodCgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9tZWRpYWl0ZW1zICYmIHRoaXMuZWxSZWYgJiYgcFcgJiYgcEgpIHtcclxuICAgICAgICAgIGxldCBuRWwgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJwcm9tcHRlcjogXCIgKyB0aGlzLnByb21wdGVyLndpZHRoKCkgKyBcInhcIiArIHRoaXMucHJvbXB0ZXIuaGVpZ2h0KCkrIFwiIGZvbnQgc2l6ZTogXCIrdGhpcy5mb250U2l6ZSlcclxuICAgICAgICAgIGlmICh0aGlzLmZvbnRTaXplID49IE1JTl9GT05UX1NJWkUgJiYgKHBXID4gbkVsLm9mZnNldFdpZHRoIHx8IHBIID4gbkVsLm9mZnNldEhlaWdodCkpIHtcclxuICAgICAgICAgICAgLy8gcHJvbXB0ZXIgb3ZlcnNpemVzIHByb21wdGVyIGNvbnRhaW5lci4gRGVjcmVhc2UgZm9udCBzaXplLlxyXG4gICAgICAgICAgICAvLyBzZXQgaW52aXNpYmxlIGR1cmluZyBmb250IHNpemUgY2hlY2tzXHJcbiAgICAgICAgICAgIHRoaXMucHJEaXNwbGF5ID0gJ2hpZGRlbidcclxuICAgICAgICAgICAgLy8gZGVjcmVhc2UgZm9udCBzaXplXHJcbiAgICAgICAgICAgIHRoaXMuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplIC0gMVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRlY3JlYXNlZCBmb250IHNpemU6IFwiK3RoaXMuZm9udFNpemUgKVxyXG4gICAgICAgICAgICAvLyBTZXQgZmxhZ3NcclxuICAgICAgICAgICAgdGhpcy5mb250U2l6ZUNoYW5nZSA9IHRydWVcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50Q2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIGhvb2sgdGhlIG5leHQgY2hlY2tcclxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb250U2l6ZVRvRml0KCkpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBwcm9tcHRlciBmaXRzIGluICBwcm9tcHRlciBjb250YWluZXIsIGZvbnQgc2l6ZSBzaG91bGQgYmUgZmluZVxyXG5cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInByRGlzcGxheTogXCIrdGhpcy5wckRpc3BsYXkpXHJcblxyXG4gICAgICAgICAgICAvL2lmKHRoaXMuY29udGVudENoZWNrZWQgJiYgISB0aGlzLmZvbnRTaXplQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJEaXNwbGF5IVwiKVxyXG4gICAgICAgICAgICAvLyBzZXQgcHJvbXB0ZXIgdmlzaWJsZSBub3dcclxuICAgICAgICAgICAgdGhpcy5wckRpc3BsYXkgPSAndmlzaWJsZSdcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIHRoaXMuZm9udFNpemVDaGFuZ2UgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlByb21wdCB0ZXh0IHdpZHRoOiBcIit0ZXh0U2l6ZS53aWR0aCtcIiBcIit0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgrXCJ4XCIrdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcHJwcm9tcHRpbmdjb250YWluZXInLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHNwci1yZWNpbnN0cnVjdGlvbnMgW3NlbGVjdGVkSXRlbUlkeF09XCJzZWxlY3RlZEl0ZW1JZHhcIiBbaXRlbUNvdW50XT1cIml0ZW1Db3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcmVjaW5zdHJ1Y3Rpb25zXT1cInByb21wdEl0ZW0/LnJlY2luc3RydWN0aW9ucz8ucmVjaW5zdHJ1Y3Rpb25zXCI+PC9zcHItcmVjaW5zdHJ1Y3Rpb25zPlxyXG4gICAgPGFwcC1zcHJwcm9tcHRjb250YWluZXIgW3Byb2plY3ROYW1lXT1cInByb2plY3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttZWRpYWl0ZW1zXT1cInNob3dQcm9tcHQ/KHByb21wdEl0ZW0/cHJvbXB0SXRlbS5tZWRpYWl0ZW1zOm51bGwpOm51bGxcIj48L2FwcC1zcHJwcm9tcHRjb250YWluZXI+XHJcblxyXG4gIGBcclxuICAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGZsZXg6IDM7IC8qIHRoZSBjb250YWluZXIgY29uc3VtZXMgYWxsIGF2YWlsYWJsZSBzcGFjZSAqL1xyXG4gICAgcGFkZGluZzogMTBwdDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBhbGlnbiBob3Jpem9udGFsIGNlbnRlciovXHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAvKiBhbGlnbiB2ZXJ0aWNhbCBjZW50ZXIgKi9cclxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9tcHRpbmdDb250YWluZXIge1xyXG4gIEBJbnB1dCgpIHByb2plY3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgcHJvbXB0SXRlbTogUHJvbXB0SXRlbXxudWxsPW51bGw7XHJcbiAgQElucHV0KCkgc2hvd1Byb21wdDogYm9vbGVhbj1mYWxzZTtcclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1JZHghOiBudW1iZXI7XHJcbiAgQElucHV0KCkgaXRlbUNvdW50OiBudW1iZXJ8dW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKSB0cmFuc3BvcnRBY3Rpb25zITogVHJhbnNwb3J0QWN0aW9ucztcclxuXHJcbiAgcHJpdmF0ZSBlITogSFRNTERpdkVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBzdGFydFg6IG51bWJlciB8IG51bGwgPSBudWxsXHJcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0VGltZVN0YW1wOiBudW1iZXIgfCBudWxsPW51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICB0eXBlIFRvdWNoU3RhcnQgPSB7fVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmUgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXHJcbiAgb25Ub3VjaHN0YXJ0KGV2OiBUb3VjaEV2ZW50IHwgYW55KSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKFwiVG91Y2ggc3RhcnQhIFwiKVxyXG4gICAgaWYgKCEodGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCAmJlxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkICYmXHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkKSkge1xyXG4gICAgICBsZXQgdGFyZ2V0VG91Y2hlc0xlbiA9IGV2LnRhcmdldFRvdWNoZXMubGVuZ3RoO1xyXG4gICAgICAvL2ZvcihsZXQgdGk9MDt0aTxldi50YXJnZXRUb3VjaGVzLmxlbmd0aDt0aSsrKXtcclxuICAgICAgLy9sZXQgdD1ldi50YXJnZXRUb3VjaGVzLml0ZW0odGkpO1xyXG4gICAgICAvLyBBbGwgeCB2YWx1ZXMgYXJlIHRoZSBzYW1lID8/XHJcbiAgICAgIC8vY29uc29sZS5sb2coXCJUb3VjaCAjXCIrdGkrXCI6IHBhZ2VYOiBcIit0LnBhZ2VYK1wiIGNsaWVudFg6IFwiK3QuY2xpZW50WCtcIiBzY3JlZW5YOiBcIit0LnNjcmVlblgpXHJcbiAgICAgIC8vfVxyXG4gICAgICBpZiAodGFyZ2V0VG91Y2hlc0xlbiA9PSAxKSB7XHJcbiAgICAgICAgLy8gc2luZ2xlIHRvdWNoXHJcbiAgICAgICAgbGV0IHQgPSBldi50YXJnZXRUb3VjaGVzLml0ZW0oMCk7XHJcbiAgICAgICAgaWYgKHQpIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRYID0gTWF0aC5yb3VuZCh0LnNjcmVlblgpO1xyXG4gICAgICAgICAgdGhpcy50b3VjaFN0YXJ0VGltZVN0YW1wID0gZXYudGltZVN0YW1wO1xyXG4gICAgICAgICAgdGhpcy5lLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XHJcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVG91Y2ggc3RhcnQgeDogXCIrdGhpcy5zdGFydFgpXHJcbiAgICAgICAgICAvL2V2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y2hFbmQoZXY6IFRvdWNoRXZlbnQgfCBhbnkpIHtcclxuICAgIC8vY29uc29sZS5sb2coXCJUb3VjaCBlbmQhXCIpXHJcbiAgICAvLyBSZXNldCBvZmZzZXQgc2hpZnRcclxuICAgIGlmICghKHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgJiYgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCAmJlxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCkpIHtcclxuXHJcbiAgICAgIGxldCBjaGFuZ2VkVG91Y2hlc0xlbiA9IGV2LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDtcclxuICAgICAgLy9jb25zb2xlLmxvZyhjaGFuZ2VkVG91Y2hlc0xlbitcIiBcIit0aGlzLnN0YXJ0WClcclxuICAgICAgaWYgKGNoYW5nZWRUb3VjaGVzTGVuID09IDEgJiYgdGhpcy5zdGFydFgpIHtcclxuICAgICAgICAvLyBzaW5nbGUgdG91Y2hcclxuICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzLml0ZW0oMCk7XHJcbiAgICAgICAgaWYgKHQpIHtcclxuICAgICAgICAgIGxldCBkZWx0YVggPSBNYXRoLnJvdW5kKHQuY2xpZW50WCAtIHRoaXMuc3RhcnRYKTtcclxuICAgICAgICAgIGxldCB0b3VjaE1vdmVTcGVlZCA9IDA7XHJcbiAgICAgICAgICBpZiAodGhpcy50b3VjaFN0YXJ0VGltZVN0YW1wKSB7XHJcbiAgICAgICAgICAgIHRvdWNoTW92ZVNwZWVkID0gZGVsdGFYIC8gKGV2LnRpbWVTdGFtcCAtIHRoaXMudG91Y2hTdGFydFRpbWVTdGFtcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgZnV0dXJlRGVsdGFYID0gZGVsdGFYICsgKDgwMCAqIHRvdWNoTW92ZVNwZWVkKTtcclxuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJEZWx0YVg6IFwiICsgZGVsdGFYICsgXCIgRnV0dXJlIGRlbHRhWDogXCIgKyBmdXR1cmVEZWx0YVggKyBcIiAgd2lkdGg6IFwiICsgdGhpcy5lLm9mZnNldFdpZHRoKVxyXG4gICAgICAgICAgaWYgKGZ1dHVyZURlbHRhWCA+IHRoaXMuZS5vZmZzZXRXaWR0aCAvIDIpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlN3aXBlIHJpZ2h0IGRldGVjdGVkISFcIilcclxuICAgICAgICAgICAgLy90aGlzLnN3aXBlZFJpZ2h0LmVtaXQoKVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmUuc3R5bGUubGVmdCA9IC10aGlzLmUub2Zmc2V0TGVmdCArIFwicHhcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICgtZnV0dXJlRGVsdGFYID4gdGhpcy5lLm9mZnNldFdpZHRoIC8gMikge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiU3dpcGUgbGVmdCBkZXRlY3RlZCEhXCIpXHJcbiAgICAgICAgICAgIHRoaXMuZS5zdHlsZS5sZWZ0ID0gLXRoaXMuZS5vZmZzZXRMZWZ0ICsgXCJweFwiO1xyXG4gICAgICAgICAgICAvL3RoaXMuc3dpcGVkTGVmdC5lbWl0KClcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlc2V0IGFuaW1hdGVkXHJcbiAgICAgIHRoaXMuZS5zdHlsZS50cmFuc2l0aW9uID0gXCJsZWZ0IDAuOHNcIjtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRYID0gbnVsbDtcclxuICAgIHRoaXMudG91Y2hTdGFydFRpbWVTdGFtcCA9IG51bGw7XHJcbiAgICB0aGlzLmUuc3R5bGUubGVmdCA9IFwiMHB4XCI7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y2hNb3ZlKGV2OiBUb3VjaEV2ZW50IHwgYW55KSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKFwiVG91Y2ggbW92ZSFcIilcclxuICAgIGlmICghKHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgJiYgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCAmJlxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCkpIHtcclxuICAgICAgbGV0IHRhcmdldFRvdWNoZXNMZW4gPSBldi50YXJnZXRUb3VjaGVzLmxlbmd0aDtcclxuICAgICAgaWYgKHRhcmdldFRvdWNoZXNMZW4gPT0gMSAmJiB0aGlzLnN0YXJ0WCkge1xyXG4gICAgICAgIC8vIHNpbmdsZSB0b3VjaFxyXG4gICAgICAgIGxldCB0ID0gZXYudGFyZ2V0VG91Y2hlcy5pdGVtKDApO1xyXG4gICAgICAgIGlmICh0KSB7XHJcbiAgICAgICAgICBsZXQgZGVsdGFYID0gTWF0aC5yb3VuZCh0LnNjcmVlblggLSB0aGlzLnN0YXJ0WCk7XHJcbiAgICAgICAgICB0aGlzLmUuc3R5bGUubGVmdCA9IGRlbHRhWCArIFwicHhcIjtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVG91Y2ggbW92ZSBkZWx0YSB4OiBcIitkZWx0YVgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgWyckZXZlbnQnXSlcclxuICBvblRvdWNoQ2FuY2VsKGV2OiBUb3VjaEV2ZW50IHwgYW55KSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKFwiVG91Y2ggY2FuY2VsIVwiKVxyXG4gICAgdGhpcy5lLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xyXG4gICAgLy9ldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtc3BycHJvbXB0aW5nJyxcclxuXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8YXBwLXNpbXBsZXRyYWZmaWNsaWdodCBbc3RhdHVzXT1cInN0YXJ0U3RvcFNpZ25hbFN0YXRlXCI+PC9hcHAtc2ltcGxldHJhZmZpY2xpZ2h0PlxyXG4gICAgPGFwcC1zcHJwcm9tcHRpbmdjb250YWluZXIgW3Byb2plY3ROYW1lXT1cInByb2plY3ROYW1lXCIgW3Byb21wdEl0ZW1dPVwicHJvbXB0SXRlbVwiIFtzaG93UHJvbXB0XT1cInNob3dQcm9tcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1Db3VudF09XCJpdGVtcz8ubGVuZ3RoXCIgW3NlbGVjdGVkSXRlbUlkeF09XCJzZWxlY3RlZEl0ZW1JZHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zcG9ydEFjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiPjwvYXBwLXNwcnByb21wdGluZ2NvbnRhaW5lcj5cclxuICAgIDxhcHAtc3BycHJvZ3Jlc3MgKm5nSWY9XCIhc2NyZWVuWHNcIiBbaXRlbXNdPVwiaXRlbXNcIiBbc2VsZWN0ZWRJdGVtSWR4XT1cInNlbGVjdGVkSXRlbUlkeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJpdGVtU2VsZWN0KCRldmVudClcIj48L2FwcC1zcHJwcm9ncmVzcz5cclxuICAgIDxkaXYgI2FzQ3QgW2NsYXNzLmFjdGl2ZV09XCIhYXVkaW9TaWduYWxDb2xsYXBzZWQgJiYgIXNjcmVlblhzXCI+XHJcblxyXG4gICAgICA8YXBwLWF1ZGlvZGlzcGxheSAjYXVkaW9TaWduYWxDb250YWluZXIgW2NsYXNzLmFjdGl2ZV09XCIhYXVkaW9TaWduYWxDb2xsYXBzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9DbGlwXT1cImRpc3BsYXlBdWRpb0NsaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0YXJ0QWN0aW9uXT1cInBsYXlTdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cInBsYXlTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJhdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cInBsYXlTdG9wQWN0aW9uXCI+PC9hcHAtYXVkaW9kaXNwbGF5PlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgYmFja2dyb3VuZDogbGlnaHRncmV5O1xyXG4gICAgd2lkdGg6IDEwMCU7IC8qIHVzZSBhbGwgaG9yaXpvbnRhbCBhdmFpbGFibGUgc3BhY2UgKi9cclxuICAgIGZsZXg6IDE7IC8qIC4uLiBhbmQgZmlsbCByZXN0IG9mIHZlcnRpY2FsIGF2YWlsYWJsZSBzcGFjZSAob3RoZXIgY29tcG9uZW50cyBoYXZlIGZsZXggMCkgKi9cclxuXHJcbiAgICAvKiBXb3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICBJZiB0aGUgcHJvZ3Jlc3MgdGFibGUgZ2V0cyBsb25nIChzY3JpcHQgd2l0aCBtYW55IGl0ZW1zKSBGRiBpbmNyZWFzZXMgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmZsb3cgcHJvZ3Jlc3NDb250YWluZXIgYW5kXHJcbiAgICB0aGUgd2hvbGUgYXBwIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwYWdlIGFueW1vcmUuIFRoZSBhcHAgb3ZlcmZsb3dzIGFuZCBzaG93cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBmb3IgdGhlIHdob2xlIGFwcC5cclxuICAgIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODYzNjgzMi9maXJlZm94LW92ZXJmbG93LXktbm90LXdvcmtpbmctd2l0aC1uZXN0ZWQtZmxleGJveFxyXG4gICAgKi9cclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgICBkaXNwbGF5OiBmbGV4OyAvKiBmbGV4IGNvbnRhaW5lcjogbGVmdCB0cmFmZmljIGxpZ2h0LCByaWdodCBwcm9tcHRlciAoY29udGFpbmVyKSAqL1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGZsZXgtd3JhcDogbm93cmFwOyAvKiB3cmFwIGNvdWxkIGNvbXBsZXRlbHkgZGVzdHJveSB0aGUgbGF5b3V0ICovXHJcbiAgfWAsIGBcclxuICAgIGFwcC1zaW1wbGV0cmFmZmljbGlnaHQge1xyXG4gICAgICBtYXJnaW46IDEwcHg7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuICAgICAgei1pbmRleDogMztcclxuICAgIH1cclxuICBgLCBgXHJcbiAgICBhcHAtc3BycHJvZ3Jlc3Mge1xyXG4gICAgICB6LWluZGV4OiAzO1xyXG4gICAgfVxyXG4gIGAsIGBcclxuICAgIGRpdiB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHJcblxyXG4gICAgICAvKiBoZWlnaHQ6IDUwJTsgKi9cclxuICAgICAgLyogd2lkdGg6IDEwMCU7ICovXHJcblxyXG4gICAgICAvKiBvdmVyZmxvdzogaGlkZGVuOyAqL1xyXG5cclxuICAgICAgLyogbWFyZ2luOiAyMHB4OyAqL1xyXG4gICAgICAvKiBib3JkZXI6IDIwcHg7ICovXHJcbiAgICAgIHotaW5kZXg6IDU7XHJcbiAgICAgIC8qYmFja2dyb3VuZC1jb2xvcjogcmVkOyAqL1xyXG4gICAgfWAsIGBcclxuICAgIGRpdi5hY3RpdmUge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIGJvdHRvbTogMHB4O1xyXG4gICAgICAvKmxlZnQ6IDBweDsgKi9cclxuXHJcbiAgICAgIGhlaWdodDogOTAlO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuXHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgICBwYWRkaW5nOiAwcHg7XHJcbiAgICAgIC8qIG1hcmdpbjogMjBweDsgKi9cclxuICAgICAgLyogYm9yZGVyOiAyMHB4OyAqL1xyXG4gICAgICB6LWluZGV4OiA1O1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApXHJcblxyXG4gICAgfWBcclxuICBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvbXB0aW5nIGV4dGVuZHMgUmVzcG9uc2l2ZUNvbXBvbmVudHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJwbzpCcmVha3BvaW50T2JzZXJ2ZXIpIHtcclxuICAgIHN1cGVyKGJwbyk7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKFNpbXBsZVRyYWZmaWNMaWdodCwgeyBzdGF0aWM6IHRydWUgfSkgc2ltcGxlVHJhZmZpY0xpZ2h0ITogU2ltcGxlVHJhZmZpY0xpZ2h0O1xyXG4gIEBWaWV3Q2hpbGQoQXVkaW9EaXNwbGF5LCB7IHN0YXRpYzogdHJ1ZSB9KSBhdWRpb0Rpc3BsYXkhOiBBdWRpb0Rpc3BsYXk7XHJcbiAgQElucHV0KCkgcHJvamVjdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzdGFydFN0b3BTaWduYWxTdGF0ZSE6IFN0YXJ0U3RvcFNpZ25hbFN0YXRlO1xyXG4gIEBJbnB1dCgpIHByb21wdEl0ZW06IFByb21wdEl0ZW0gfCBudWxsPW51bGw7XHJcbiAgQElucHV0KCkgc2hvd1Byb21wdDogYm9vbGVhbj1mYWxzZTtcclxuICBASW5wdXQoKSBpdGVtczogQXJyYXk8SXRlbT58dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1JZHghOiBudW1iZXI7XHJcbiAgQElucHV0KCkgdHJhbnNwb3J0QWN0aW9ucyE6IFRyYW5zcG9ydEFjdGlvbnM7XHJcbiAgQElucHV0KCkgZW5hYmxlRG93bmxvYWQ6IGJvb2xlYW49ZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGF1ZGlvU2lnbmFsQ29sbGFwc2VkOiBib29sZWFuPXRydWU7XHJcbiAgQElucHV0KCkgZGlzcGxheUF1ZGlvQ2xpcDogQXVkaW9DbGlwIHwgbnVsbD1udWxsO1xyXG4gIEBJbnB1dCgpIHBsYXlTdGFydEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBwbGF5U2VsZWN0aW9uQWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb246QWN0aW9uPGJvb2xlYW4+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBwbGF5U3RvcEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBAT3V0cHV0KCkgb25JdGVtU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIG9uTmV4dEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uUHJldkl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIGl0ZW1TZWxlY3Qocm93SWR4OiBudW1iZXIpIHtcclxuICAgIHRoaXMub25JdGVtU2VsZWN0LmVtaXQocm93SWR4KTtcclxuICB9XHJcblxyXG4gIG5leHRJdGVtKCkge1xyXG4gICAgdGhpcy5vbk5leHRJdGVtLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByZXZJdGVtKCkge1xyXG4gICAgdGhpcy5vblByZXZJdGVtLmVtaXQoKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
598
+ `, styles: [":host{position:relative;margin:0;padding:0;background:lightgrey;width:100%;flex:1;min-height:0px;display:flex;flex-direction:row;flex-wrap:nowrap}\n", "app-simpletrafficlight{margin:10px;min-height:0px;z-index:3}\n", "app-sprprogress{z-index:3}\n", "div{display:none;position:absolute;z-index:5}\n", "div.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:5;box-sizing:border-box;background-color:#0000}\n"] }]
599
+ }], ctorParameters: () => [{ type: i2.BreakpointObserver }], propDecorators: { simpleTrafficLight: [{
600
+ type: ViewChild,
601
+ args: [SimpleTrafficLight, { static: true }]
602
+ }], audioDisplay: [{
603
+ type: ViewChild,
604
+ args: [AudioDisplay, { static: true }]
605
+ }], projectName: [{
606
+ type: Input
607
+ }], startStopSignalState: [{
608
+ type: Input
609
+ }], promptItem: [{
610
+ type: Input
611
+ }], showPrompt: [{
612
+ type: Input
613
+ }], items: [{
614
+ type: Input
615
+ }], selectedItemIdx: [{
616
+ type: Input
617
+ }], transportActions: [{
618
+ type: Input
619
+ }], enableDownload: [{
620
+ type: Input
621
+ }], audioSignalCollapsed: [{
622
+ type: Input
623
+ }], displayAudioClip: [{
624
+ type: Input
625
+ }], playStartAction: [{
626
+ type: Input
627
+ }], playSelectionAction: [{
628
+ type: Input
629
+ }], autoPlayOnSelectToggleAction: [{
630
+ type: Input
631
+ }], playStopAction: [{
632
+ type: Input
633
+ }], onItemSelect: [{
634
+ type: Output
635
+ }], onNextItem: [{
636
+ type: Output
637
+ }], onPrevItem: [{
638
+ type: Output
639
+ }] } });
640
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vcHJvbXB0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFJWixXQUFXLEVBRVosTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFNNUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7OztBQXdCbEUsTUFBTSxPQUFPLGVBQWU7SUFLMUIsV0FBVztRQUNULElBQUksS0FBSyxHQUFRLEVBQUUsQ0FBQztRQUNwQixJQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBQztZQUN4QyxLQUFLLEdBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxlQUFlLEdBQUMsR0FBRyxHQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6RDtRQUNELElBQUcsSUFBSSxDQUFDLGVBQWUsRUFBQztZQUN0QixLQUFLLEdBQUMsS0FBSyxHQUFDLElBQUksR0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzhHQWRVLGVBQWU7a0dBQWYsZUFBZSx1S0FoQmhCOzs7R0FHVDs7MkZBYVUsZUFBZTtrQkFwQjNCLFNBQVM7K0JBRUUscUJBQXFCLFlBRXJCOzs7R0FHVDs4QkFjUSxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csU0FBUztz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QUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNoQyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIFZpZXdDaGlsZCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBFbGVtZW50UmVmLFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQge1NpbXBsZVRyYWZmaWNMaWdodH0gZnJvbSBcIi4uL3N0YXJ0c3RvcHNpZ25hbC91aS9zaW1wbGV0cmFmZmljbGlnaHRcIjtcclxuaW1wb3J0IHtTdGF0ZSBhcyBTdGFydFN0b3BTaWduYWxTdGF0ZX0gZnJvbSBcIi4uL3N0YXJ0c3RvcHNpZ25hbC9zdGFydHN0b3BzaWduYWxcIjtcclxuaW1wb3J0IHtJdGVtfSBmcm9tIFwiLi9pdGVtXCI7XHJcbmltcG9ydCB7QmxvY2ssIFRleHQsIE1lZGlhaXRlbSwgUHJvbXB0SXRlbX0gZnJvbSBcIi4uL3NjcmlwdC9zY3JpcHRcIjtcclxuaW1wb3J0IHtUcmFuc3BvcnRBY3Rpb25zfSBmcm9tIFwiLi9jb250cm9scGFuZWxcIjtcclxuaW1wb3J0IHtBY3Rpb259IGZyb20gXCIuLi8uLi9hY3Rpb24vYWN0aW9uXCI7XHJcbmltcG9ydCB7QXVkaW9EaXNwbGF5fSBmcm9tIFwiLi4vLi4vYXVkaW8vYXVkaW9fZGlzcGxheVwiO1xyXG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tIFwiLi4vcHJvamVjdC9wcm9qZWN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtSZXNwb25zaXZlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vdWkvcmVzcG9uc2l2ZV9jb21wb25lbnRcIjtcclxuaW1wb3J0IHtCcmVha3BvaW50T2JzZXJ2ZXJ9IGZyb20gXCJAYW5ndWxhci9jZGsvbGF5b3V0XCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnc3ByLXJlY2luc3RydWN0aW9ucycsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcblxyXG4gICAge3tkaXNwbGF5VGV4dCgpfX1cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcblxyXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0OyAvKiBhbGlnbiBob3Jpem9udGFsIGNlbnRlciAqL1xyXG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIGFsaWduIHZlcnRpY2FsICBjZW50ZXIgKi9cclxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGZvbnQtc2l6ZTogMWVtO1xyXG4gICAgZmxleDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gIH1cclxuICBgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVjaW5zdHJ1Y3Rpb25zIHtcclxuICBASW5wdXQoKSByZWNpbnN0cnVjdGlvbnM6IHN0cmluZ3xudWxsfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtSWR4OiBudW1iZXJ8bnVsbHx1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgaXRlbUNvdW50OiBudW1iZXJ8dW5kZWZpbmVkO1xyXG5cclxuICBkaXNwbGF5VGV4dCgpOnN0cmluZ3tcclxuICAgIGxldCByaVR4dDpzdHJpbmc9Jyc7XHJcbiAgICBpZih0aGlzLml0ZW1Db3VudCAmJiB0aGlzLnNlbGVjdGVkSXRlbUlkeCl7XHJcbiAgICAgIHJpVHh0PXJpVHh0K3RoaXMuc2VsZWN0ZWRJdGVtSWR4KycvJysodGhpcy5pdGVtQ291bnQtMSk7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLnJlY2luc3RydWN0aW9ucyl7XHJcbiAgICAgIHJpVHh0PXJpVHh0Kyc6ICcrdGhpcy5yZWNpbnN0cnVjdGlvbnM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmlUeHQ7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtc3BycHJvbXB0ZXInLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG5cclxuICAgIDwhLS08bmctdGVtcGxhdGUgW25nSWZdPVwidGV4dFwiPnt7dGV4dH19PC9uZy10ZW1wbGF0ZT4tLT5cclxuICAgIDwhLS0gPGltZyAqbmdJZj1cInNyY1wiICNwcm9tcHRJbWFnZSBbc3JjXT1cInNyY1VybCgpXCIgW2hlaWdodF09XCJwcm9tcHRlckhlaWdodC0yMFwiIC8+IC0tPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuXHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogYWxpZ24gaG9yaXpvbnRhbCBjZW50ZXIgKi9cclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIGFsaWduIHZlcnRpY2FsICBjZW50ZXIgKi9cclxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgLyogZm9udC1zaXplOiAyZW07ICovXHJcbiAgICBsaW5lLWhlaWdodDogMS4yZW07XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIC8qIFVzZSBvbmx5IG5hdHVyYWwgc2l6ZSBvZiB0aGUgcHJvbXB0ICovXHJcbiAgICAvKiBUaGUgcHJvbXB0ZXIgY29tcG5lbnQgdGhlbiBldHMgYWxpZ25lZCB2ZXJ0aWNhbGx5IGNlbnRlcmVkICovXHJcbiAgICBmbGV4OiAwIDE7XHJcblxyXG4gIH1gLCBgOmhvc3QoLmZpbGwpIHtcclxuICAgIC8qIFVzZSBhbGwgc3BhY2UgdG8gc2NhbGUgaW1hZ2VzICovXHJcbiAgICBmbGV4OiAzO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgLyogQSBzZXBhcmF0ZSBmbGV4IGNvbnRhaW5lciBtaWdodCBiZSBuZWNlc3NheXIgdG8gYWxpZ2huIGNlbnRlcmVkICovXHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvKiBUT0RPIGRvZXMgbm90IHdvcmssIGltYWdlIGlzIG5vdCB2ZXJ0aWNhbGx5IGNlbnRlcmVkICovXHJcbiAgfWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9tcHRlciB7XHJcbiAgQElucHV0KCkgcHJvamVjdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9wcm9tcHRNZWRpYUl0ZW1zOiBBcnJheTxNZWRpYWl0ZW0+fG51bGx8dW5kZWZpbmVkPW51bGxcclxuXHJcbiAgQElucHV0KCkgcHJvbXB0ZXJIZWlnaHQ6IG51bWJlcj0wO1xyXG4gIHByaXZhdGUgX3RleHQ6IHN0cmluZ3x1bmRlZmluZWR8bnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfc3JjOiBzdHJpbmd8dW5kZWZpbmVkfG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2Jsb2NrczogQXJyYXk8QmxvY2s+fHVuZGVmaW5lZDtcclxuICBtaW1ldHlwZSE6IHN0cmluZztcclxuICBwcml2YXRlIGN1cnJQcm9tcHRDaGlsZDogSFRNTEVsZW1lbnR8bnVsbCA9IG51bGw7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmlsbCcpIHB1YmxpYyBwcm9tcHRlclN0eWxlRmlsbCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHRleHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcclxuICB9XHJcblxyXG4gIGdldCBzcmMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3JjO1xyXG4gIH1cclxuXHJcbiAgc3JjVXJsKCk6IHN0cmluZ3xudWxse1xyXG4gICAgaWYgKHRoaXMucHJvamVjdE5hbWUgJiYgdGhpcy5fc3JjKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3RSZXNvdXJjZVVybCh0aGlzLnByb2plY3ROYW1lLCB0aGlzLl9zcmMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAgIHdpZHRoKCk6bnVtYmVyfG51bGx7XHJcbiAgICAgIGlmKHRoaXMuZWxSZWYpe1xyXG4gICAgICAgIGlmKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCl7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBoZWlnaHQoKTpudW1iZXJ8bnVsbHtcclxuICAgICAgICBpZih0aGlzLmVsUmVmKXtcclxuICAgICAgICAgICAgaWYodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBlbmRUZXh0RWxlbWVudChwYXJlbnRFbDpIVE1MRWxlbWVudCx0eHQ6VGV4dCl7XHJcbiAgICAgIGxldCB0OiBzdHJpbmcgPSA8c3RyaW5nPnR4dC50ZXh0XHJcbiAgICAgIGxldCB0eHROZCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh0KVxyXG4gICAgICBpZih0eHQuZGVjb3JhdGlvbiB8fCB0eHQuY29sb3Ipe1xyXG4gICAgICAgIGxldCBzcEVsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICBsZXQgc3R5bGVTdHI9JydcclxuICAgICAgICBpZih0eHQuZGVjb3JhdGlvbikge1xyXG4gICAgICAgICAgc3R5bGVTdHIgPSBzdHlsZVN0ciArJ3RleHQtZGVjb3JhdGlvbjogJyArIHR4dC5kZWNvcmF0aW9uKyc7J1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0eHQuY29sb3Ipe1xyXG4gICAgICAgICAgc3R5bGVTdHIgPSBzdHlsZVN0ciArJ2NvbG9yOiAnICsgdHh0LmNvbG9yKyc7J1xyXG4gICAgICAgIH1cclxuICAgICAgICBzcEVsLnN0eWxlPXN0eWxlU3RyXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnRFbCwgc3BFbClcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHNwRWwsIHR4dE5kKVxyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnRFbCwgdHh0TmQpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IHByb21wdE1lZGlhSXRlbXMocE1pczogQXJyYXk8TWVkaWFpdGVtPnxudWxsKSB7XHJcbiAgICB0aGlzLl9wcm9tcHRNZWRpYUl0ZW1zID0gcE1pc1xyXG4gICAgaWYgKHRoaXMuY3VyclByb21wdENoaWxkICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuY3VyclByb21wdENoaWxkKVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3Byb21wdE1lZGlhSXRlbXMgJiYgdGhpcy5fcHJvbXB0TWVkaWFJdGVtcy5sZW5ndGggPT0gMSkge1xyXG4gICAgICBsZXQgbWkgPSB0aGlzLl9wcm9tcHRNZWRpYUl0ZW1zWzBdXHJcbiAgICAgIHRoaXMubWltZXR5cGUgPSAndGV4dC9wbGFpbidcclxuICAgICAgaWYgKG1pLm1pbWV0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5taW1ldHlwZSA9IG1pLm1pbWV0eXBlLnRyaW0oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5taW1ldHlwZSA9PT0gJ3RleHQvcGxhaW4nKSB7XHJcbiAgICAgICAgdGhpcy5fdGV4dCA9IG1pLnRleHRcclxuICAgICAgICB0aGlzLl9zcmMgPSBudWxsO1xyXG4gICAgICAgIGxldCBwclR4dD0nJztcclxuICAgICAgICBpZih0aGlzLl90ZXh0KXtcclxuICAgICAgICAgIHByVHh0PXRoaXMuX3RleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VyclByb21wdENoaWxkID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHByVHh0KTtcclxuICAgICAgICB0aGlzLnByb21wdGVyU3R5bGVGaWxsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuY3VyclByb21wdENoaWxkKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm1pbWV0eXBlID09PSAndGV4dC94LXByb21wdCcpIHtcclxuICAgICAgICAvL3RoaXMucmVuZGVyaW5nPXRydWVcclxuICAgICAgICB0aGlzLl90ZXh0PW51bGw7XHJcbiAgICAgICAgdGhpcy5fc3JjPW51bGw7XHJcbiAgICAgICAgdGhpcy5fYmxvY2tzPW5ldyBBcnJheTxCbG9jaz4oKTtcclxuICAgICAgICBsZXQgcGQ9bWkucHJvbXB0RG9jXHJcbiAgICAgICAgaWYocGQpe1xyXG4gICAgICAgICAgbGV0IHBkQm9keT1wZC5ib2R5XHJcbiAgICAgICAgICBpZihwZEJvZHkpe1xyXG4gICAgICAgICAgICB0aGlzLl9ibG9ja3M9cGRCb2R5LmJsb2NrcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJvbXB0ZXJTdHlsZUZpbGwgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuY3VyclByb21wdENoaWxkID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICAgIGlmKHRoaXMuX2Jsb2Nrcykge1xyXG4gICAgICAgICAgZm9yIChsZXQgYmkgPSAwOyBiaSA8IHRoaXMuX2Jsb2Nrcy5sZW5ndGg7IGJpKyspIHtcclxuICAgICAgICAgICAgbGV0IGJsID0gdGhpcy5fYmxvY2tzW2JpXVxyXG4gICAgICAgICAgICBpZiAoJ3AnID09PSBibC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBCbEVsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdwJylcclxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuY3VyclByb21wdENoaWxkLCBwQmxFbClcclxuICAgICAgICAgICAgICBmb3IgKGxldCB0aSA9IDA7IHRpIDwgYmwudGV4dHMubGVuZ3RoOyB0aSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdHh0ID0gYmwudGV4dHNbdGldXHJcbiAgICAgICAgICAgICAgICBpZiAodHh0KSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICgndGV4dCcgPT09IHR4dC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRUZXh0RWxlbWVudChwQmxFbCwgdHh0KVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdmb250JyA9PT0gdHh0LnR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3BFbCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlU3RyID0gJydcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHh0LnN0eWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZVN0ciA9IHN0eWxlU3RyICsgJ2ZvbnQtc3R5bGU6ICcgKyB0eHQuc3R5bGUgKyAnOydcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR4dC5zaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZVN0ciA9IHN0eWxlU3RyICsgJ2ZvbnQtc2l6ZTogJyArIHR4dC5zaXplICsgJzsnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eHQud2VpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZVN0ciA9IHN0eWxlU3RyICsgJ2ZvbnQtd2VpZ2h0OiAnICsgdHh0LndlaWdodCArICc7J1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzcEVsLnN0eWxlID0gc3R5bGVTdHJcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHBCbEVsLCBzcEVsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVGV4dEVsZW1lbnQoc3BFbCwgPFRleHQ+dHh0LnRleHQpXHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ2xpbmVicmVhaycgPT09IHR4dC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyRWwgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2JyJylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHBCbEVsLCBickVsKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmN1cnJQcm9tcHRDaGlsZClcclxuICAgICAgICAvL3RoaXMucmVuZGVyaW5nPWZhbHNlXHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5taW1ldHlwZS5zdGFydHNXaXRoKCdpbWFnZScpKSB7XHJcbiAgICAgICAgdGhpcy5fdGV4dCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc3JjID0gbWkuc3JjXHJcbiAgICAgICAgbGV0IHByb21wdEltYWdlID0gbmV3IEltYWdlKClcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyUHJvbXB0Q2hpbGQgPSBwcm9tcHRJbWFnZVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmN1cnJQcm9tcHRDaGlsZClcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY3VyclByb21wdENoaWxkLCBcIm1heC13aWR0aFwiLCBcIjEwMCVcIilcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY3VyclByb21wdENoaWxkLCBcIm1heC1oZWlnaHRcIiwgXCIxMDAlXCIpXHJcbiAgICAgICAgdGhpcy5wcm9tcHRlclN0eWxlRmlsbCA9IHRydWVcclxuICAgICAgICAvLyBUT0RPIHZlcnRpY2FsIGFsaWdubWVudFxyXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzcyNzMzMzgvaG93LXRvLXZlcnRpY2FsbHktYWxpZ24tYW4taW1hZ2UtaW5zaWRlLWEtZGl2XHJcblxyXG4gICAgICAgIC8vY29uc29sZS5sb2cocHJvbXB0SW1hZ2UubmF0dXJhbFdpZHRoICsgXCJ4XCIrcHJvbXB0SW1hZ2UubmF0dXJhbEhlaWdodCk7XHJcbiAgICAgICAgcHJvbXB0SW1hZ2Uub25sb2FkID0gKGV2OiBFdmVudCkgPT4ge31cclxuICAgICAgICBsZXQgc3JjVXJsPXRoaXMuc3JjVXJsKCk7XHJcbiAgICAgICAgaWYoc3JjVXJsKSB7XHJcbiAgICAgICAgICBwcm9tcHRJbWFnZS5zcmMgPSBzcmNVcmw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdGV4dCA9IG51bGxcclxuICAgICAgdGhpcy5fc3JjID0gbnVsbFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFZJUlRVQUxfSEVJR0hUID0gNjAwO1xyXG5leHBvcnQgY29uc3QgREVGQVVMVF9QUk9NUFRfRk9OVFNJWkUgPSA0ODtcclxuZXhwb3J0IGNvbnN0IE1JTl9GT05UX1NJWkU9NjtcclxuZXhwb3J0IGNvbnN0IEZBTExCQUNLX0RFRl9VU0VSX0FHRU5UX0ZPTlRfU0laRSA9IDE0O1xyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLXNwcnByb21wdGNvbnRhaW5lcicsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YXBwLXNwcnByb21wdGVyICNwcm9tcHRlciBbcHJvamVjdE5hbWVdPVwicHJvamVjdE5hbWVcIiBbcHJvbXB0TWVkaWFJdGVtc109XCJtZWRpYWl0ZW1zXCIgW3N0eWxlLmZvbnQtc2l6ZV09XCJmb250U2l6ZSsncHgnXCIgW3N0eWxlLnZpc2liaWxpdHldPVwicHJEaXNwbGF5XCIgW3Byb21wdGVySGVpZ2h0XT1cInByb21wdGVySGVpZ2h0XCI+PC9hcHAtc3BycHJvbXB0ZXI+XHJcbiAgYFxyXG4gICxcclxuICBzdHlsZXM6IFtgOmhvc3Qge1xyXG5cclxuICAgIGZsZXg6IDM7IC8qIHRoZSBjb250YWluZXIgY29uc3VtZXMgYWxsIGF2YWlsYWJsZSBzcGFjZSAqL1xyXG4gICAgcGFkZGluZzogMTBwdDtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIG1heC1oZWlnaHQ6IDEwMCU7XHJcblxyXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IC8qIGFsaWduIGhvcml6b250YWwgY2VudGVyKi9cclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIGFsaWduIHZlcnRpY2FsIGNlbnRlciAqL1xyXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gIH1cclxuICBgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvbXB0Q29udGFpbmVyIGltcGxlbWVudHMgT25Jbml0LEFmdGVyQ29udGVudENoZWNrZWQge1xyXG4gIEBJbnB1dCgpIHByb2plY3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfbWVkaWFpdGVtczogQXJyYXk8TWVkaWFpdGVtPnxudWxsPW51bGw7XHJcblxyXG4gIHByb21wdGVySGVpZ2h0OiBudW1iZXIgPSBWSVJUVUFMX0hFSUdIVFxyXG4gIGZvbnRTaXplITogbnVtYmVyO1xyXG4gIGZvbnRTaXplQ2hhbmdlPWZhbHNlXHJcbiAgY29udGVudENoZWNrZWQ9ZmFsc2U7XHJcbiAgcHJEaXNwbGF5PSdoaWRkZW4nO1xyXG4gIGRlZmF1bHRTdHlsZSE6IENTU1N0eWxlRGVjbGFyYXRpb247XHJcbiAgZGVmYXVsdEZvbnRTaXplUHghOiBudW1iZXI7XHJcblxyXG4gIGF1dG9Gb250U2l6ZT1mYWxzZTtcclxuICBAVmlld0NoaWxkKFByb21wdGVyLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcm9tcHRlciE6IFByb21wdGVyO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOkVsZW1lbnRSZWYpe31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgLy8gZmFsbGJhY2tcclxuICAgIHRoaXMuZGVmYXVsdEZvbnRTaXplUHggPSBGQUxMQkFDS19ERUZfVVNFUl9BR0VOVF9GT05UX1NJWkU7XHJcbiAgICAvLyB0cnkgdG8gcGFyc2UgZGVmYXVsdCB1c2VyIGFnZW50IGZvbnQgc2l6ZSAobm8gY29tbWVudCBhYm91dCBET00gQVBJIGRlc2lnbiA7KSApXHJcbiAgICB0aGlzLmRlZmF1bHRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICBsZXQgZGVmRm9udFNpemVTdHIgPSB0aGlzLmRlZmF1bHRTdHlsZS5mb250U2l6ZTtcclxuICAgIGlmIChkZWZGb250U2l6ZVN0cikge1xyXG4gICAgICBkZWZGb250U2l6ZVN0ciA9IGRlZkZvbnRTaXplU3RyLnRyaW0oKTtcclxuICAgICAgaWYgKGRlZkZvbnRTaXplU3RyLmVuZHNXaXRoKCdweCcpKSB7XHJcbiAgICAgICAgLy8gcGFyc2VGbG9hdCBpZ25vcmVzIG5vbiBudW1iZXIgY2hhcmFjdGVycyBhdCB0aGUgZW5kIChhZ2FpbiBubyBjb21tZW50IDspIClcclxuICAgICAgICB0aGlzLmRlZmF1bHRGb250U2l6ZVB4ID0gcGFyc2VGbG9hdChkZWZGb250U2l6ZVN0cik7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuaW5mbyhcIkRlZmF1bHQgZm9udCBzaXplOiBcIit0aGlzLmRlZmF1bHRGb250U2l6ZVB4KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNvbnRlbnRDaGVja2VkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7XHJcbiAgICBpZih0aGlzLmF1dG9Gb250U2l6ZSkge1xyXG4gICAgICBpZiAodGhpcy5mb250U2l6ZUNoYW5nZSkge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJuZ2FmdGVyY29udGVudGNoZWNrZWQsIGNhbGwgZm9udFNpemVUb0ZpdCBcIik7XHJcbiAgICAgICAgLy8gY2hlY2sgcHJvbXB0ZXIgc2l6ZSBhZ2FpblxyXG4gICAgICAgIHRoaXMuZm9udFNpemVUb0ZpdCgpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZm9udCBzaXplIHdhcyBjaGVja2VkLCBidXQgd2UgbmVlZCB0byBjaGVjayBhZ2FpbiBhZnRlciBhbmd1bGFyIGNvbnRlbnQgY2hlY2tcclxuICAgICAgICBpZiAoIXRoaXMuY29udGVudENoZWNrZWQpIHtcclxuICAgICAgICAgIHRoaXMuY29udGVudENoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhcIm5nYWZ0ZXJjb250ZW50Y2hlY2tlZCwgbm90IGZvbnQgc2l6ZSBjaGFuZ2VkLCBjYWxsIFwiKTtcclxuICAgICAgICAgIHRoaXMuZm9udFNpemVUb0ZpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgQElucHV0KCkgc2V0IG1lZGlhaXRlbXMobWVkaWFpdGVtczpBcnJheTxNZWRpYWl0ZW0+fG51bGwpe1xyXG5cclxuICAgIHRoaXMuX21lZGlhaXRlbXMgPSBtZWRpYWl0ZW1zXHJcblxyXG4gICAgbGV0IG1pbWV0eXBlOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgICBpZiAodGhpcy5fbWVkaWFpdGVtcyAmJiB0aGlzLl9tZWRpYWl0ZW1zLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgIGxldCBtaSA9IHRoaXMuX21lZGlhaXRlbXNbMF1cclxuICAgICAgbWltZXR5cGUgPSAndGV4dC9wbGFpbidcclxuICAgICAgaWYgKG1pLm1pbWV0eXBlKSB7XHJcbiAgICAgICAgbWltZXR5cGUgPSBtaS5taW1ldHlwZS50cmltKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYobWkuZGVmYXVsdFZpcnR1YWxWaWV3Qm94KXtcclxuICAgICAgICB0aGlzLnByb21wdGVySGVpZ2h0PW1pLmRlZmF1bHRWaXJ0dWFsVmlld0JveC5oZWlnaHRcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMucHJvbXB0ZXJIZWlnaHQ9VklSVFVBTF9IRUlHSFRcclxuICAgIH1cclxuICAgIHRoaXMucHJvbXB0ZXIucHJvbXB0TWVkaWFJdGVtcz10aGlzLl9tZWRpYWl0ZW1zXHJcbiAgICB0aGlzLmF1dG9Gb250U2l6ZT0obWltZXR5cGUhPW51bGwgJiYgbWltZXR5cGUuc3RhcnRzV2l0aCgndGV4dC8nKSk7XHJcbiAgICBpZih0aGlzLmF1dG9Gb250U2l6ZSl7XHJcbiAgICAgICAgdGhpcy5mb250U2l6ZUNoYW5nZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jb250ZW50Q2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy5wckRpc3BsYXkgPSAnaGlkZGVuJ1xyXG4gICAgICAgIHRoaXMubGF5b3V0KClcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IG1lZGlhaXRlbXMoKTpBcnJheTxNZWRpYWl0ZW0+fG51bGx7XHJcbiAgICAgIHJldHVybiB0aGlzLl9tZWRpYWl0ZW1zO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIm9ucmVzaXplLCBjYWxsIGZvbnRTaXplVG9GaXQgaG9vayBcIik7XHJcbiAgICB0aGlzLmxheW91dCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsYXlvdXQoKSB7XHJcbiAgICBpZih0aGlzLmF1dG9Gb250U2l6ZSAmJiB0aGlzLmVsUmVmKSB7XHJcblxyXG4gICAgICB0aGlzLmZvbnRTaXplQ2hhbmdlPXRydWU7XHJcbiAgICAgIHRoaXMuY29udGVudENoZWNrZWQgPSBmYWxzZVxyXG4gICAgICB0aGlzLnByRGlzcGxheSA9ICdoaWRkZW4nXHJcbiAgICAgIGxldCBlbEggPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAvLyBwcm9tcHQgdGV4dCBmb250IHNpemUgc2hvdWxkIHNjYWxlIGFjY29yZGluZyB0byBwcm9tcHQgY29udGFpbmVyIGhlaWdodFxyXG4gICAgICBsZXQgc2NhbGVkU2l6ZSA9IE1hdGgucm91bmQoKGVsSCAvIHRoaXMucHJvbXB0ZXJIZWlnaHQpICogREVGQVVMVF9QUk9NUFRfRk9OVFNJWkUpO1xyXG5cclxuICAgICAgLy8gbWluIHByb21wdCBmb250IHNpemUgaXMgZGVmYXVsdCB1c2VyIGFnZW50IHNpemVcclxuICAgICAgbGV0IG5ld1NpemUgPSBNYXRoLm1heChzY2FsZWRTaXplLCB0aGlzLmRlZmF1bHRGb250U2l6ZVB4KTtcclxuICAgICAgaWYgKHRoaXMuZm9udFNpemUgIT09IG5ld1NpemUpIHtcclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gbmV3U2l6ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9jb25zb2xlLmxvZyhcImxheW91dCwgY2FsbCBmb250U2l6ZVRvRml0IGhvb2sgXCIpO1xyXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvbnRTaXplVG9GaXQoKSlcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBmb250U2l6ZVRvRml0KCl7XHJcbiAgICAgIGlmKHRoaXMucHJvbXB0ZXIpIHtcclxuICAgICAgICBsZXQgcFc9dGhpcy5wcm9tcHRlci53aWR0aCgpO1xyXG4gICAgICAgIGxldCBwSD10aGlzLnByb21wdGVyLmhlaWdodCgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9tZWRpYWl0ZW1zICYmIHRoaXMuZWxSZWYgJiYgcFcgJiYgcEgpIHtcclxuICAgICAgICAgIGxldCBuRWwgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJwcm9tcHRlcjogXCIgKyB0aGlzLnByb21wdGVyLndpZHRoKCkgKyBcInhcIiArIHRoaXMucHJvbXB0ZXIuaGVpZ2h0KCkrIFwiIGZvbnQgc2l6ZTogXCIrdGhpcy5mb250U2l6ZSlcclxuICAgICAgICAgIGlmICh0aGlzLmZvbnRTaXplID49IE1JTl9GT05UX1NJWkUgJiYgKHBXID4gbkVsLm9mZnNldFdpZHRoIHx8IHBIID4gbkVsLm9mZnNldEhlaWdodCkpIHtcclxuICAgICAgICAgICAgLy8gcHJvbXB0ZXIgb3ZlcnNpemVzIHByb21wdGVyIGNvbnRhaW5lci4gRGVjcmVhc2UgZm9udCBzaXplLlxyXG4gICAgICAgICAgICAvLyBzZXQgaW52aXNpYmxlIGR1cmluZyBmb250IHNpemUgY2hlY2tzXHJcbiAgICAgICAgICAgIHRoaXMucHJEaXNwbGF5ID0gJ2hpZGRlbidcclxuICAgICAgICAgICAgLy8gZGVjcmVhc2UgZm9udCBzaXplXHJcbiAgICAgICAgICAgIHRoaXMuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplIC0gMVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRlY3JlYXNlZCBmb250IHNpemU6IFwiK3RoaXMuZm9udFNpemUgKVxyXG4gICAgICAgICAgICAvLyBTZXQgZmxhZ3NcclxuICAgICAgICAgICAgdGhpcy5mb250U2l6ZUNoYW5nZSA9IHRydWVcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50Q2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIGhvb2sgdGhlIG5leHQgY2hlY2tcclxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb250U2l6ZVRvRml0KCkpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBwcm9tcHRlciBmaXRzIGluICBwcm9tcHRlciBjb250YWluZXIsIGZvbnQgc2l6ZSBzaG91bGQgYmUgZmluZVxyXG5cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInByRGlzcGxheTogXCIrdGhpcy5wckRpc3BsYXkpXHJcblxyXG4gICAgICAgICAgICAvL2lmKHRoaXMuY29udGVudENoZWNrZWQgJiYgISB0aGlzLmZvbnRTaXplQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJEaXNwbGF5IVwiKVxyXG4gICAgICAgICAgICAvLyBzZXQgcHJvbXB0ZXIgdmlzaWJsZSBub3dcclxuICAgICAgICAgICAgdGhpcy5wckRpc3BsYXkgPSAndmlzaWJsZSdcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIHRoaXMuZm9udFNpemVDaGFuZ2UgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlByb21wdCB0ZXh0IHdpZHRoOiBcIit0ZXh0U2l6ZS53aWR0aCtcIiBcIit0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgrXCJ4XCIrdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcHJwcm9tcHRpbmdjb250YWluZXInLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHNwci1yZWNpbnN0cnVjdGlvbnMgW3NlbGVjdGVkSXRlbUlkeF09XCJzZWxlY3RlZEl0ZW1JZHhcIiBbaXRlbUNvdW50XT1cIml0ZW1Db3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcmVjaW5zdHJ1Y3Rpb25zXT1cInByb21wdEl0ZW0/LnJlY2luc3RydWN0aW9ucz8ucmVjaW5zdHJ1Y3Rpb25zXCI+PC9zcHItcmVjaW5zdHJ1Y3Rpb25zPlxyXG4gICAgPGFwcC1zcHJwcm9tcHRjb250YWluZXIgW3Byb2plY3ROYW1lXT1cInByb2plY3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttZWRpYWl0ZW1zXT1cInNob3dQcm9tcHQ/KHByb21wdEl0ZW0/cHJvbXB0SXRlbS5tZWRpYWl0ZW1zOm51bGwpOm51bGxcIj48L2FwcC1zcHJwcm9tcHRjb250YWluZXI+XHJcblxyXG4gIGBcclxuICAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGZsZXg6IDM7IC8qIHRoZSBjb250YWluZXIgY29uc3VtZXMgYWxsIGF2YWlsYWJsZSBzcGFjZSAqL1xyXG4gICAgcGFkZGluZzogMTBwdDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBhbGlnbiBob3Jpem9udGFsIGNlbnRlciovXHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAvKiBhbGlnbiB2ZXJ0aWNhbCBjZW50ZXIgKi9cclxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9tcHRpbmdDb250YWluZXIge1xyXG4gIEBJbnB1dCgpIHByb2plY3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgcHJvbXB0SXRlbTogUHJvbXB0SXRlbXxudWxsPW51bGw7XHJcbiAgQElucHV0KCkgc2hvd1Byb21wdDogYm9vbGVhbj1mYWxzZTtcclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1JZHghOiBudW1iZXI7XHJcbiAgQElucHV0KCkgaXRlbUNvdW50OiBudW1iZXJ8dW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKSB0cmFuc3BvcnRBY3Rpb25zITogVHJhbnNwb3J0QWN0aW9ucztcclxuXHJcbiAgcHJpdmF0ZSBlITogSFRNTERpdkVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBzdGFydFg6IG51bWJlciB8IG51bGwgPSBudWxsXHJcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0VGltZVN0YW1wOiBudW1iZXIgfCBudWxsPW51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICB0eXBlIFRvdWNoU3RhcnQgPSB7fVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmUgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXHJcbiAgb25Ub3VjaHN0YXJ0KGV2OiBUb3VjaEV2ZW50IHwgYW55KSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKFwiVG91Y2ggc3RhcnQhIFwiKVxyXG4gICAgaWYgKCEodGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCAmJlxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkICYmXHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkKSkge1xyXG4gICAgICBsZXQgdGFyZ2V0VG91Y2hlc0xlbiA9IGV2LnRhcmdldFRvdWNoZXMubGVuZ3RoO1xyXG4gICAgICAvL2ZvcihsZXQgdGk9MDt0aTxldi50YXJnZXRUb3VjaGVzLmxlbmd0aDt0aSsrKXtcclxuICAgICAgLy9sZXQgdD1ldi50YXJnZXRUb3VjaGVzLml0ZW0odGkpO1xyXG4gICAgICAvLyBBbGwgeCB2YWx1ZXMgYXJlIHRoZSBzYW1lID8/XHJcbiAgICAgIC8vY29uc29sZS5sb2coXCJUb3VjaCAjXCIrdGkrXCI6IHBhZ2VYOiBcIit0LnBhZ2VYK1wiIGNsaWVudFg6IFwiK3QuY2xpZW50WCtcIiBzY3JlZW5YOiBcIit0LnNjcmVlblgpXHJcbiAgICAgIC8vfVxyXG4gICAgICBpZiAodGFyZ2V0VG91Y2hlc0xlbiA9PSAxKSB7XHJcbiAgICAgICAgLy8gc2luZ2xlIHRvdWNoXHJcbiAgICAgICAgbGV0IHQgPSBldi50YXJnZXRUb3VjaGVzLml0ZW0oMCk7XHJcbiAgICAgICAgaWYgKHQpIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRYID0gTWF0aC5yb3VuZCh0LnNjcmVlblgpO1xyXG4gICAgICAgICAgdGhpcy50b3VjaFN0YXJ0VGltZVN0YW1wID0gZXYudGltZVN0YW1wO1xyXG4gICAgICAgICAgdGhpcy5lLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XHJcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVG91Y2ggc3RhcnQgeDogXCIrdGhpcy5zdGFydFgpXHJcbiAgICAgICAgICAvL2V2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y2hFbmQoZXY6IFRvdWNoRXZlbnQgfCBhbnkpIHtcclxuICAgIC8vY29uc29sZS5sb2coXCJUb3VjaCBlbmQhXCIpXHJcbiAgICAvLyBSZXNldCBvZmZzZXQgc2hpZnRcclxuICAgIGlmICghKHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgJiYgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCAmJlxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCkpIHtcclxuXHJcbiAgICAgIGxldCBjaGFuZ2VkVG91Y2hlc0xlbiA9IGV2LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDtcclxuICAgICAgLy9jb25zb2xlLmxvZyhjaGFuZ2VkVG91Y2hlc0xlbitcIiBcIit0aGlzLnN0YXJ0WClcclxuICAgICAgaWYgKGNoYW5nZWRUb3VjaGVzTGVuID09IDEgJiYgdGhpcy5zdGFydFgpIHtcclxuICAgICAgICAvLyBzaW5nbGUgdG91Y2hcclxuICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzLml0ZW0oMCk7XHJcbiAgICAgICAgaWYgKHQpIHtcclxuICAgICAgICAgIGxldCBkZWx0YVggPSBNYXRoLnJvdW5kKHQuY2xpZW50WCAtIHRoaXMuc3RhcnRYKTtcclxuICAgICAgICAgIGxldCB0b3VjaE1vdmVTcGVlZCA9IDA7XHJcbiAgICAgICAgICBpZiAodGhpcy50b3VjaFN0YXJ0VGltZVN0YW1wKSB7XHJcbiAgICAgICAgICAgIHRvdWNoTW92ZVNwZWVkID0gZGVsdGFYIC8gKGV2LnRpbWVTdGFtcCAtIHRoaXMudG91Y2hTdGFydFRpbWVTdGFtcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgZnV0dXJlRGVsdGFYID0gZGVsdGFYICsgKDgwMCAqIHRvdWNoTW92ZVNwZWVkKTtcclxuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJEZWx0YVg6IFwiICsgZGVsdGFYICsgXCIgRnV0dXJlIGRlbHRhWDogXCIgKyBmdXR1cmVEZWx0YVggKyBcIiAgd2lkdGg6IFwiICsgdGhpcy5lLm9mZnNldFdpZHRoKVxyXG4gICAgICAgICAgaWYgKGZ1dHVyZURlbHRhWCA+IHRoaXMuZS5vZmZzZXRXaWR0aCAvIDIpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlN3aXBlIHJpZ2h0IGRldGVjdGVkISFcIilcclxuICAgICAgICAgICAgLy90aGlzLnN3aXBlZFJpZ2h0LmVtaXQoKVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmUuc3R5bGUubGVmdCA9IC10aGlzLmUub2Zmc2V0TGVmdCArIFwicHhcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICgtZnV0dXJlRGVsdGFYID4gdGhpcy5lLm9mZnNldFdpZHRoIC8gMikge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiU3dpcGUgbGVmdCBkZXRlY3RlZCEhXCIpXHJcbiAgICAgICAgICAgIHRoaXMuZS5zdHlsZS5sZWZ0ID0gLXRoaXMuZS5vZmZzZXRMZWZ0ICsgXCJweFwiO1xyXG4gICAgICAgICAgICAvL3RoaXMuc3dpcGVkTGVmdC5lbWl0KClcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlc2V0IGFuaW1hdGVkXHJcbiAgICAgIHRoaXMuZS5zdHlsZS50cmFuc2l0aW9uID0gXCJsZWZ0IDAuOHNcIjtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRYID0gbnVsbDtcclxuICAgIHRoaXMudG91Y2hTdGFydFRpbWVTdGFtcCA9IG51bGw7XHJcbiAgICB0aGlzLmUuc3R5bGUubGVmdCA9IFwiMHB4XCI7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y2hNb3ZlKGV2OiBUb3VjaEV2ZW50IHwgYW55KSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKFwiVG91Y2ggbW92ZSFcIilcclxuICAgIGlmICghKHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgJiYgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCAmJlxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCkpIHtcclxuICAgICAgbGV0IHRhcmdldFRvdWNoZXNMZW4gPSBldi50YXJnZXRUb3VjaGVzLmxlbmd0aDtcclxuICAgICAgaWYgKHRhcmdldFRvdWNoZXNMZW4gPT0gMSAmJiB0aGlzLnN0YXJ0WCkge1xyXG4gICAgICAgIC8vIHNpbmdsZSB0b3VjaFxyXG4gICAgICAgIGxldCB0ID0gZXYudGFyZ2V0VG91Y2hlcy5pdGVtKDApO1xyXG4gICAgICAgIGlmICh0KSB7XHJcbiAgICAgICAgICBsZXQgZGVsdGFYID0gTWF0aC5yb3VuZCh0LnNjcmVlblggLSB0aGlzLnN0YXJ0WCk7XHJcbiAgICAgICAgICB0aGlzLmUuc3R5bGUubGVmdCA9IGRlbHRhWCArIFwicHhcIjtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVG91Y2ggbW92ZSBkZWx0YSB4OiBcIitkZWx0YVgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgWyckZXZlbnQnXSlcclxuICBvblRvdWNoQ2FuY2VsKGV2OiBUb3VjaEV2ZW50IHwgYW55KSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKFwiVG91Y2ggY2FuY2VsIVwiKVxyXG4gICAgdGhpcy5lLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xyXG4gICAgLy9ldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtc3BycHJvbXB0aW5nJyxcclxuXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8YXBwLXNpbXBsZXRyYWZmaWNsaWdodCBbc3RhdHVzXT1cInN0YXJ0U3RvcFNpZ25hbFN0YXRlXCI+PC9hcHAtc2ltcGxldHJhZmZpY2xpZ2h0PlxyXG4gICAgPGFwcC1zcHJwcm9tcHRpbmdjb250YWluZXIgW3Byb2plY3ROYW1lXT1cInByb2plY3ROYW1lXCIgW3Byb21wdEl0ZW1dPVwicHJvbXB0SXRlbVwiIFtzaG93UHJvbXB0XT1cInNob3dQcm9tcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1Db3VudF09XCJpdGVtcz8ubGVuZ3RoXCIgW3NlbGVjdGVkSXRlbUlkeF09XCJzZWxlY3RlZEl0ZW1JZHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zcG9ydEFjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiPjwvYXBwLXNwcnByb21wdGluZ2NvbnRhaW5lcj5cclxuICAgIDxhcHAtc3BycHJvZ3Jlc3MgKm5nSWY9XCIhc2NyZWVuWHNcIiBbaXRlbXNdPVwiaXRlbXNcIiBbc2VsZWN0ZWRJdGVtSWR4XT1cInNlbGVjdGVkSXRlbUlkeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJpdGVtU2VsZWN0KCRldmVudClcIj48L2FwcC1zcHJwcm9ncmVzcz5cclxuICAgIDxkaXYgI2FzQ3QgW2NsYXNzLmFjdGl2ZV09XCIhYXVkaW9TaWduYWxDb2xsYXBzZWQgJiYgIXNjcmVlblhzXCI+XHJcblxyXG4gICAgICA8YXBwLWF1ZGlvZGlzcGxheSAjYXVkaW9TaWduYWxDb250YWluZXIgW2NsYXNzLmFjdGl2ZV09XCIhYXVkaW9TaWduYWxDb2xsYXBzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9DbGlwXT1cImRpc3BsYXlBdWRpb0NsaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0YXJ0QWN0aW9uXT1cInBsYXlTdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cInBsYXlTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJhdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cInBsYXlTdG9wQWN0aW9uXCI+PC9hcHAtYXVkaW9kaXNwbGF5PlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgYmFja2dyb3VuZDogbGlnaHRncmV5O1xyXG4gICAgd2lkdGg6IDEwMCU7IC8qIHVzZSBhbGwgaG9yaXpvbnRhbCBhdmFpbGFibGUgc3BhY2UgKi9cclxuICAgIGZsZXg6IDE7IC8qIC4uLiBhbmQgZmlsbCByZXN0IG9mIHZlcnRpY2FsIGF2YWlsYWJsZSBzcGFjZSAob3RoZXIgY29tcG9uZW50cyBoYXZlIGZsZXggMCkgKi9cclxuXHJcbiAgICAvKiBXb3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICBJZiB0aGUgcHJvZ3Jlc3MgdGFibGUgZ2V0cyBsb25nIChzY3JpcHQgd2l0aCBtYW55IGl0ZW1zKSBGRiBpbmNyZWFzZXMgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmZsb3cgcHJvZ3Jlc3NDb250YWluZXIgYW5kXHJcbiAgICB0aGUgd2hvbGUgYXBwIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwYWdlIGFueW1vcmUuIFRoZSBhcHAgb3ZlcmZsb3dzIGFuZCBzaG93cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBmb3IgdGhlIHdob2xlIGFwcC5cclxuICAgIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODYzNjgzMi9maXJlZm94LW92ZXJmbG93LXktbm90LXdvcmtpbmctd2l0aC1uZXN0ZWQtZmxleGJveFxyXG4gICAgKi9cclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgICBkaXNwbGF5OiBmbGV4OyAvKiBmbGV4IGNvbnRhaW5lcjogbGVmdCB0cmFmZmljIGxpZ2h0LCByaWdodCBwcm9tcHRlciAoY29udGFpbmVyKSAqL1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGZsZXgtd3JhcDogbm93cmFwOyAvKiB3cmFwIGNvdWxkIGNvbXBsZXRlbHkgZGVzdHJveSB0aGUgbGF5b3V0ICovXHJcbiAgfWAsIGBcclxuICAgIGFwcC1zaW1wbGV0cmFmZmljbGlnaHQge1xyXG4gICAgICBtYXJnaW46IDEwcHg7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuICAgICAgei1pbmRleDogMztcclxuICAgIH1cclxuICBgLCBgXHJcbiAgICBhcHAtc3BycHJvZ3Jlc3Mge1xyXG4gICAgICB6LWluZGV4OiAzO1xyXG4gICAgfVxyXG4gIGAsIGBcclxuICAgIGRpdiB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHJcblxyXG4gICAgICAvKiBoZWlnaHQ6IDUwJTsgKi9cclxuICAgICAgLyogd2lkdGg6IDEwMCU7ICovXHJcblxyXG4gICAgICAvKiBvdmVyZmxvdzogaGlkZGVuOyAqL1xyXG5cclxuICAgICAgLyogbWFyZ2luOiAyMHB4OyAqL1xyXG4gICAgICAvKiBib3JkZXI6IDIwcHg7ICovXHJcbiAgICAgIHotaW5kZXg6IDU7XHJcbiAgICAgIC8qYmFja2dyb3VuZC1jb2xvcjogcmVkOyAqL1xyXG4gICAgfWAsIGBcclxuICAgIGRpdi5hY3RpdmUge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIGJvdHRvbTogMHB4O1xyXG4gICAgICAvKmxlZnQ6IDBweDsgKi9cclxuXHJcbiAgICAgIGhlaWdodDogOTAlO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuXHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgICBwYWRkaW5nOiAwcHg7XHJcbiAgICAgIC8qIG1hcmdpbjogMjBweDsgKi9cclxuICAgICAgLyogYm9yZGVyOiAyMHB4OyAqL1xyXG4gICAgICB6LWluZGV4OiA1O1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApXHJcblxyXG4gICAgfWBcclxuICBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvbXB0aW5nIGV4dGVuZHMgUmVzcG9uc2l2ZUNvbXBvbmVudHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJwbzpCcmVha3BvaW50T2JzZXJ2ZXIpIHtcclxuICAgIHN1cGVyKGJwbyk7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKFNpbXBsZVRyYWZmaWNMaWdodCwgeyBzdGF0aWM6IHRydWUgfSkgc2ltcGxlVHJhZmZpY0xpZ2h0ITogU2ltcGxlVHJhZmZpY0xpZ2h0O1xyXG4gIEBWaWV3Q2hpbGQoQXVkaW9EaXNwbGF5LCB7IHN0YXRpYzogdHJ1ZSB9KSBhdWRpb0Rpc3BsYXkhOiBBdWRpb0Rpc3BsYXk7XHJcbiAgQElucHV0KCkgcHJvamVjdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzdGFydFN0b3BTaWduYWxTdGF0ZSE6IFN0YXJ0U3RvcFNpZ25hbFN0YXRlO1xyXG4gIEBJbnB1dCgpIHByb21wdEl0ZW06IFByb21wdEl0ZW0gfCBudWxsPW51bGw7XHJcbiAgQElucHV0KCkgc2hvd1Byb21wdDogYm9vbGVhbj1mYWxzZTtcclxuICBASW5wdXQoKSBpdGVtczogQXJyYXk8SXRlbT58dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1JZHghOiBudW1iZXI7XHJcbiAgQElucHV0KCkgdHJhbnNwb3J0QWN0aW9ucyE6IFRyYW5zcG9ydEFjdGlvbnM7XHJcbiAgQElucHV0KCkgZW5hYmxlRG93bmxvYWQ6IGJvb2xlYW49ZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGF1ZGlvU2lnbmFsQ29sbGFwc2VkOiBib29sZWFuPXRydWU7XHJcbiAgQElucHV0KCkgZGlzcGxheUF1ZGlvQ2xpcDogQXVkaW9DbGlwIHwgbnVsbD1udWxsO1xyXG4gIEBJbnB1dCgpIHBsYXlTdGFydEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBwbGF5U2VsZWN0aW9uQWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb246QWN0aW9uPGJvb2xlYW4+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBwbGF5U3RvcEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBAT3V0cHV0KCkgb25JdGVtU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIG9uTmV4dEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uUHJldkl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIGl0ZW1TZWxlY3Qocm93SWR4OiBudW1iZXIpIHtcclxuICAgIHRoaXMub25JdGVtU2VsZWN0LmVtaXQocm93SWR4KTtcclxuICB9XHJcblxyXG4gIG5leHRJdGVtKCkge1xyXG4gICAgdGhpcy5vbk5leHRJdGVtLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByZXZJdGVtKCkge1xyXG4gICAgdGhpcy5vblByZXZJdGVtLmVtaXQoKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==