@rocketshow/designer 1.32.0 → 1.33.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 (339) hide show
  1. package/esm2022/lib/array-sort-pipe.mjs +30 -0
  2. package/esm2022/lib/designer.component.mjs +605 -0
  3. package/esm2022/lib/designer.module.mjs +183 -0
  4. package/esm2022/lib/designer.service.mjs +14 -0
  5. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +569 -0
  6. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
  7. package/esm2022/lib/effect/effect.component.mjs +174 -0
  8. package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
  9. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
  10. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
  11. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
  12. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
  13. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
  14. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
  15. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +160 -0
  16. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
  17. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
  18. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
  19. package/esm2022/lib/fixture/fixture.component.mjs +138 -0
  20. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
  21. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +589 -0
  22. package/esm2022/lib/intro/intro.component.mjs +95 -0
  23. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
  24. package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
  25. package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
  26. package/esm2022/lib/models/cached-fixture.mjs +6 -0
  27. package/esm2022/lib/models/color.mjs +8 -0
  28. package/esm2022/lib/models/composition.mjs +46 -0
  29. package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
  30. package/esm2022/lib/models/effect-curve.mjs +69 -0
  31. package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
  32. package/esm2022/lib/models/effect.mjs +12 -0
  33. package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
  34. package/esm2022/lib/models/fixture-capability.mjs +84 -0
  35. package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
  36. package/esm2022/lib/models/fixture-channel.mjs +24 -0
  37. package/esm2022/lib/models/fixture-mode.mjs +14 -0
  38. package/esm2022/lib/models/fixture-profile.mjs +70 -0
  39. package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
  40. package/esm2022/lib/models/fixture-wheel.mjs +15 -0
  41. package/esm2022/lib/models/fixture.mjs +40 -0
  42. package/esm2022/lib/models/preset-region-scene.mjs +8 -0
  43. package/esm2022/lib/models/preset.mjs +56 -0
  44. package/esm2022/lib/models/project.mjs +68 -0
  45. package/esm2022/lib/models/scene-playback-region.mjs +11 -0
  46. package/esm2022/lib/models/scene.mjs +27 -0
  47. package/esm2022/lib/models/universe.mjs +11 -0
  48. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
  49. package/esm2022/lib/preset/preset.component.mjs +131 -0
  50. package/esm2022/lib/preview/models/color-changer-3d.mjs +167 -0
  51. package/esm2022/lib/preview/models/fixture-3d.mjs +150 -0
  52. package/esm2022/lib/preview/models/moving-head-3d.mjs +243 -0
  53. package/esm2022/lib/preview/preview.component.mjs +212 -0
  54. package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
  55. package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
  56. package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
  57. package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
  58. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
  59. package/esm2022/lib/scene/scene.component.mjs +110 -0
  60. package/esm2022/lib/services/animation.service.mjs +16 -0
  61. package/esm2022/lib/services/config.service.mjs +27 -0
  62. package/esm2022/lib/services/effect.service.mjs +14 -0
  63. package/esm2022/lib/services/error-dialog.service.mjs +39 -0
  64. package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
  65. package/esm2022/lib/services/fixture.service.mjs +431 -0
  66. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
  67. package/esm2022/lib/services/intro.service.mjs +140 -0
  68. package/esm2022/lib/services/preset.service.mjs +400 -0
  69. package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
  70. package/esm2022/lib/services/preview.service.mjs +496 -0
  71. package/esm2022/lib/services/project-load.service.mjs +149 -0
  72. package/esm2022/lib/services/project.service.mjs +97 -0
  73. package/esm2022/lib/services/scene.service.mjs +164 -0
  74. package/esm2022/lib/services/timeline.service.mjs +726 -0
  75. package/esm2022/lib/services/universe.service.mjs +23 -0
  76. package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
  77. package/esm2022/lib/services/user.service.mjs +89 -0
  78. package/esm2022/lib/services/uuid.service.mjs +23 -0
  79. package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
  80. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +334 -0
  81. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
  82. package/esm2022/lib/timeline/timeline.component.mjs +418 -0
  83. package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
  84. package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
  85. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
  86. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
  87. package/esm2022/public_api.mjs +7 -0
  88. package/esm2022/rocketshow-designer.mjs +5 -0
  89. package/fesm2022/rocketshow-designer.mjs +10626 -0
  90. package/fesm2022/rocketshow-designer.mjs.map +1 -0
  91. package/index.d.ts +5 -0
  92. package/lib/array-sort-pipe.d.ts +3 -0
  93. package/lib/designer.component.d.ts +15 -12
  94. package/lib/designer.module.d.ts +54 -0
  95. package/lib/designer.service.d.ts +3 -0
  96. package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
  97. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
  98. package/lib/effect/effect.component.d.ts +3 -0
  99. package/lib/error-dialog/error-dialog.component.d.ts +3 -0
  100. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
  101. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
  102. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
  103. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
  104. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
  105. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
  106. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
  107. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
  108. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
  109. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
  110. package/lib/fixture/fixture.component.d.ts +3 -0
  111. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
  112. package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
  113. package/lib/intro/intro.component.d.ts +3 -0
  114. package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
  115. package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
  116. package/lib/preset/preset.component.d.ts +3 -0
  117. package/lib/preview/preview.component.d.ts +4 -4
  118. package/lib/project/project-browser/project-browser.component.d.ts +3 -0
  119. package/lib/project/project-import/project-import.component.d.ts +3 -0
  120. package/lib/project/project-save/project-save.component.d.ts +3 -0
  121. package/lib/project/project-share/project-share.component.d.ts +3 -0
  122. package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
  123. package/lib/scene/scene.component.d.ts +3 -0
  124. package/lib/services/animation.service.d.ts +3 -0
  125. package/lib/services/config.service.d.ts +3 -0
  126. package/lib/services/effect.service.d.ts +3 -0
  127. package/lib/services/error-dialog.service.d.ts +3 -0
  128. package/lib/services/fixture-pool.service.d.ts +3 -0
  129. package/lib/services/fixture.service.d.ts +3 -0
  130. package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
  131. package/lib/services/intro.service.d.ts +3 -0
  132. package/lib/services/preset.service.d.ts +3 -0
  133. package/lib/services/preview-mesh.service.d.ts +3 -0
  134. package/lib/services/preview.service.d.ts +4 -0
  135. package/lib/services/project-load.service.d.ts +3 -0
  136. package/lib/services/project.service.d.ts +3 -0
  137. package/lib/services/scene.service.d.ts +3 -0
  138. package/lib/services/timeline.service.d.ts +4 -1
  139. package/lib/services/universe.service.d.ts +3 -0
  140. package/lib/services/user-ensure-login.service.d.ts +3 -0
  141. package/lib/services/user.service.d.ts +3 -0
  142. package/lib/services/uuid.service.d.ts +3 -0
  143. package/lib/services/warning-dialog.service.d.ts +3 -0
  144. package/lib/timeline/composition-settings/composition-settings.component.d.ts +3 -0
  145. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
  146. package/lib/timeline/timeline.component.d.ts +3 -0
  147. package/lib/user/user-login/user-login.component.d.ts +3 -0
  148. package/lib/user/user-register/user-register.component.d.ts +3 -0
  149. package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
  150. package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
  151. package/package.json +20 -22
  152. package/rocketshow-designer-1.33.0.tgz +0 -0
  153. package/bundles/rocketshow-designer.umd.js +0 -9966
  154. package/bundles/rocketshow-designer.umd.js.map +0 -1
  155. package/bundles/rocketshow-designer.umd.min.js +0 -17
  156. package/bundles/rocketshow-designer.umd.min.js.map +0 -1
  157. package/esm2015/lib/array-sort-pipe.js +0 -28
  158. package/esm2015/lib/designer.component.js +0 -411
  159. package/esm2015/lib/designer.module.js +0 -117
  160. package/esm2015/lib/designer.service.js +0 -16
  161. package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
  162. package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
  163. package/esm2015/lib/effect/effect.component.js +0 -73
  164. package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
  165. package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
  166. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
  167. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
  168. package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
  169. package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
  170. package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
  171. package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
  172. package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
  173. package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
  174. package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
  175. package/esm2015/lib/fixture/fixture.component.js +0 -70
  176. package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
  177. package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
  178. package/esm2015/lib/intro/intro.component.js +0 -25
  179. package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
  180. package/esm2015/lib/models/cached-fixture-capability.js +0 -9
  181. package/esm2015/lib/models/cached-fixture-channel.js +0 -7
  182. package/esm2015/lib/models/cached-fixture.js +0 -6
  183. package/esm2015/lib/models/color.js +0 -8
  184. package/esm2015/lib/models/composition.js +0 -46
  185. package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
  186. package/esm2015/lib/models/effect-curve.js +0 -69
  187. package/esm2015/lib/models/effect-pan-tilt.js +0 -19
  188. package/esm2015/lib/models/effect.js +0 -12
  189. package/esm2015/lib/models/fixture-capability-value.js +0 -15
  190. package/esm2015/lib/models/fixture-capability.js +0 -84
  191. package/esm2015/lib/models/fixture-channel-value.js +0 -11
  192. package/esm2015/lib/models/fixture-channel.js +0 -24
  193. package/esm2015/lib/models/fixture-mode.js +0 -14
  194. package/esm2015/lib/models/fixture-profile.js +0 -70
  195. package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
  196. package/esm2015/lib/models/fixture-wheel.js +0 -15
  197. package/esm2015/lib/models/fixture.js +0 -40
  198. package/esm2015/lib/models/preset-region-scene.js +0 -8
  199. package/esm2015/lib/models/preset.js +0 -56
  200. package/esm2015/lib/models/project.js +0 -68
  201. package/esm2015/lib/models/scene-playback-region.js +0 -11
  202. package/esm2015/lib/models/scene.js +0 -27
  203. package/esm2015/lib/models/universe.js +0 -11
  204. package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
  205. package/esm2015/lib/preset/preset.component.js +0 -85
  206. package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
  207. package/esm2015/lib/preview/models/fixture-3d.js +0 -150
  208. package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
  209. package/esm2015/lib/preview/preview.component.js +0 -242
  210. package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
  211. package/esm2015/lib/project/project-import/project-import.component.js +0 -89
  212. package/esm2015/lib/project/project-save/project-save.component.js +0 -105
  213. package/esm2015/lib/project/project-share/project-share.component.js +0 -43
  214. package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
  215. package/esm2015/lib/scene/scene.component.js +0 -56
  216. package/esm2015/lib/services/animation.service.js +0 -17
  217. package/esm2015/lib/services/config.service.js +0 -28
  218. package/esm2015/lib/services/effect.service.js +0 -16
  219. package/esm2015/lib/services/error-dialog.service.js +0 -44
  220. package/esm2015/lib/services/fixture-pool.service.js +0 -34
  221. package/esm2015/lib/services/fixture.service.js +0 -443
  222. package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
  223. package/esm2015/lib/services/intro.service.js +0 -144
  224. package/esm2015/lib/services/preset.service.js +0 -416
  225. package/esm2015/lib/services/preview-mesh.service.js +0 -58
  226. package/esm2015/lib/services/preview.service.js +0 -500
  227. package/esm2015/lib/services/project-load.service.js +0 -171
  228. package/esm2015/lib/services/project.service.js +0 -113
  229. package/esm2015/lib/services/scene.service.js +0 -174
  230. package/esm2015/lib/services/timeline.service.js +0 -738
  231. package/esm2015/lib/services/universe.service.js +0 -24
  232. package/esm2015/lib/services/user-ensure-login.service.js +0 -44
  233. package/esm2015/lib/services/user.service.js +0 -93
  234. package/esm2015/lib/services/uuid.service.js +0 -25
  235. package/esm2015/lib/services/warning-dialog.service.js +0 -43
  236. package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
  237. package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
  238. package/esm2015/lib/timeline/timeline.component.js +0 -239
  239. package/esm2015/lib/user/user-login/user-login.component.js +0 -64
  240. package/esm2015/lib/user/user-register/user-register.component.js +0 -89
  241. package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
  242. package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
  243. package/esm2015/public_api.js +0 -7
  244. package/esm2015/rocketshow-designer.js +0 -61
  245. package/esm5/lib/array-sort-pipe.js +0 -31
  246. package/esm5/lib/designer.component.js +0 -468
  247. package/esm5/lib/designer.module.js +0 -120
  248. package/esm5/lib/designer.service.js +0 -17
  249. package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
  250. package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
  251. package/esm5/lib/effect/effect.component.js +0 -75
  252. package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
  253. package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
  254. package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
  255. package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
  256. package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
  257. package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
  258. package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
  259. package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
  260. package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
  261. package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
  262. package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
  263. package/esm5/lib/fixture/fixture.component.js +0 -71
  264. package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
  265. package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
  266. package/esm5/lib/intro/intro.component.js +0 -26
  267. package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
  268. package/esm5/lib/models/cached-fixture-capability.js +0 -11
  269. package/esm5/lib/models/cached-fixture-channel.js +0 -9
  270. package/esm5/lib/models/cached-fixture.js +0 -8
  271. package/esm5/lib/models/color.js +0 -10
  272. package/esm5/lib/models/composition.js +0 -60
  273. package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
  274. package/esm5/lib/models/effect-curve.js +0 -95
  275. package/esm5/lib/models/effect-pan-tilt.js +0 -24
  276. package/esm5/lib/models/effect.js +0 -14
  277. package/esm5/lib/models/fixture-capability-value.js +0 -17
  278. package/esm5/lib/models/fixture-capability.js +0 -86
  279. package/esm5/lib/models/fixture-channel-value.js +0 -13
  280. package/esm5/lib/models/fixture-channel.js +0 -38
  281. package/esm5/lib/models/fixture-mode.js +0 -16
  282. package/esm5/lib/models/fixture-profile.js +0 -114
  283. package/esm5/lib/models/fixture-wheel-slot.js +0 -28
  284. package/esm5/lib/models/fixture-wheel.js +0 -29
  285. package/esm5/lib/models/fixture.js +0 -42
  286. package/esm5/lib/models/preset-region-scene.js +0 -10
  287. package/esm5/lib/models/preset.js +0 -90
  288. package/esm5/lib/models/project.js +0 -122
  289. package/esm5/lib/models/scene-playback-region.js +0 -13
  290. package/esm5/lib/models/scene.js +0 -29
  291. package/esm5/lib/models/universe.js +0 -13
  292. package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
  293. package/esm5/lib/preset/preset.component.js +0 -86
  294. package/esm5/lib/preview/models/color-changer-3d.js +0 -194
  295. package/esm5/lib/preview/models/fixture-3d.js +0 -196
  296. package/esm5/lib/preview/models/moving-head-3d.js +0 -250
  297. package/esm5/lib/preview/preview.component.js +0 -280
  298. package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
  299. package/esm5/lib/project/project-import/project-import.component.js +0 -88
  300. package/esm5/lib/project/project-save/project-save.component.js +0 -120
  301. package/esm5/lib/project/project-share/project-share.component.js +0 -44
  302. package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
  303. package/esm5/lib/scene/scene.component.js +0 -57
  304. package/esm5/lib/services/animation.service.js +0 -18
  305. package/esm5/lib/services/config.service.js +0 -29
  306. package/esm5/lib/services/effect.service.js +0 -17
  307. package/esm5/lib/services/error-dialog.service.js +0 -46
  308. package/esm5/lib/services/fixture-pool.service.js +0 -36
  309. package/esm5/lib/services/fixture.service.js +0 -643
  310. package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
  311. package/esm5/lib/services/intro.service.js +0 -145
  312. package/esm5/lib/services/preset.service.js +0 -637
  313. package/esm5/lib/services/preview-mesh.service.js +0 -61
  314. package/esm5/lib/services/preview.service.js +0 -754
  315. package/esm5/lib/services/project-load.service.js +0 -185
  316. package/esm5/lib/services/project.service.js +0 -127
  317. package/esm5/lib/services/scene.service.js +0 -251
  318. package/esm5/lib/services/timeline.service.js +0 -845
  319. package/esm5/lib/services/universe.service.js +0 -36
  320. package/esm5/lib/services/user-ensure-login.service.js +0 -45
  321. package/esm5/lib/services/user.service.js +0 -95
  322. package/esm5/lib/services/uuid.service.js +0 -26
  323. package/esm5/lib/services/warning-dialog.service.js +0 -45
  324. package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
  325. package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
  326. package/esm5/lib/timeline/timeline.component.js +0 -243
  327. package/esm5/lib/user/user-login/user-login.component.js +0 -66
  328. package/esm5/lib/user/user-register/user-register.component.js +0 -91
  329. package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
  330. package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
  331. package/esm5/public_api.js +0 -7
  332. package/esm5/rocketshow-designer.js +0 -61
  333. package/fesm2015/rocketshow-designer.js +0 -7945
  334. package/fesm2015/rocketshow-designer.js.map +0 -1
  335. package/fesm5/rocketshow-designer.js +0 -9690
  336. package/fesm5/rocketshow-designer.js.map +0 -1
  337. package/rocketshow-designer-1.32.0.tgz +0 -0
  338. package/rocketshow-designer.d.ts +0 -60
  339. package/rocketshow-designer.metadata.json +0 -1
@@ -1,845 +0,0 @@
1
- import { __decorate, __metadata, __values } from "tslib";
2
- import { HttpClient } from '@angular/common/http';
3
- import { Injectable } from '@angular/core';
4
- import { Subject, timer } from 'rxjs';
5
- import { map } from 'rxjs/operators';
6
- import WaveSurfer from 'wavesurfer.js';
7
- import CursorPlugin from 'wavesurfer.js/dist/plugin/wavesurfer.cursor.min.js';
8
- import RegionsPlugin from 'wavesurfer.js/dist/plugin/wavesurfer.regions.min.js';
9
- import TimeLinePlugin from 'wavesurfer.js/dist/plugin/wavesurfer.timeline.min.js';
10
- import { guess } from 'web-audio-beat-detector';
11
- import { PresetRegionScene } from '../models/preset-region-scene';
12
- import { ScenePlaybackRegion } from '../models/scene-playback-region';
13
- import { ConfigService } from './config.service';
14
- import { PresetService } from './preset.service';
15
- import { ProjectService } from './project.service';
16
- import { SceneService } from './scene.service';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "./scene.service";
19
- import * as i2 from "./preset.service";
20
- import * as i3 from "./project.service";
21
- import * as i4 from "@angular/common/http";
22
- import * as i5 from "./config.service";
23
- var TimelineService = /** @class */ (function () {
24
- function TimelineService(sceneService, presetService, projectService, http, configService) {
25
- var _this = this;
26
- this.sceneService = sceneService;
27
- this.presetService = presetService;
28
- this.projectService = projectService;
29
- this.http = http;
30
- this.configService = configService;
31
- this.playState = 'paused';
32
- this.zoom = 0;
33
- this.timelineClicking = false;
34
- this.intensity = 0.2;
35
- this.intensitySelectedScene = 0.4;
36
- this.intensityHighlighted = 0.8;
37
- this.waveSurferReady = new Subject();
38
- this.detectChanges = new Subject();
39
- // can we add new compositions based on an external pool and
40
- // should new compositions not available in this pool be added there?
41
- this.externalCompositionsAvailable = false;
42
- this.loadingAudioFile = false;
43
- this.presetService.previewSelectionChanged.subscribe(function () {
44
- _this.selectedPlaybackRegion = undefined;
45
- _this.updateRegionSelection();
46
- });
47
- this.sceneService.sceneDeleted.subscribe(function () {
48
- _this.redrawAllRegions();
49
- });
50
- this.sceneService.sceneSelected.subscribe(function () {
51
- _this.redrawAllRegions();
52
- });
53
- }
54
- TimelineService.prototype.redrawAllRegions = function () {
55
- var e_1, _a;
56
- // remove all regions from wavesurver
57
- if (this.waveSurfer) {
58
- try {
59
- for (var _b = __values(Object.keys(this.waveSurfer.regions.list)), _c = _b.next(); !_c.done; _c = _b.next()) {
60
- var key = _c.value;
61
- var region = this.waveSurfer.regions.list[key];
62
- region.remove();
63
- }
64
- }
65
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
66
- finally {
67
- try {
68
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
69
- }
70
- finally { if (e_1) throw e_1.error; }
71
- }
72
- }
73
- // draw all regions
74
- this.drawAllRegions();
75
- };
76
- TimelineService.prototype.pad = function (num, size) {
77
- if (!num) {
78
- num = 0;
79
- }
80
- var padded = num.toString();
81
- while (padded.length < size) {
82
- padded = '0' + padded;
83
- }
84
- return padded;
85
- };
86
- TimelineService.prototype.msToTime = function (millis, includeMillis) {
87
- if (includeMillis === void 0) { includeMillis = true; }
88
- var ms = Math.round(millis % 1000);
89
- var seconds = Math.floor(((millis % 360000) % 60000) / 1000);
90
- var minutes = Math.floor((millis % 3600000) / 60000);
91
- if (includeMillis) {
92
- return this.pad(minutes, 2) + ':' + this.pad(seconds, 2) + '.' + this.pad(ms, 3);
93
- }
94
- else {
95
- return this.pad(minutes, 2) + ':' + this.pad(seconds, 2);
96
- }
97
- };
98
- TimelineService.prototype.updateCurrentTime = function () {
99
- var _this = this;
100
- if (!this.waveSurfer) {
101
- return;
102
- }
103
- // display the current time
104
- this.currentTime = this.msToTime(this.waveSurfer.getCurrentTime() * 1000);
105
- if (!this.waveSurfer.timeline.drawer) {
106
- return;
107
- }
108
- // draw the current cursor on the timeline
109
- // TODO redrawing the timeline each update is way to expensive.
110
- // maybe as a better solution use an element, like the cursor inside Wavesurfer to
111
- // display the progress?
112
- var x = 0;
113
- var duration = this.waveSurfer.backend.getDuration();
114
- var width = this.waveSurfer.params.fillParent && !this.waveSurfer.params.scrollParent
115
- ? this.waveSurfer.timeline.drawer.getWidth()
116
- : this.waveSurfer.timeline.drawer.wrapper.scrollWidth * this.waveSurfer.params.pixelRatio;
117
- x = (width / duration) * this.waveSurfer.getCurrentTime() - 2;
118
- // update the timeline canvas
119
- this.waveSurfer.timeline.render();
120
- // draw the cursor on the timeline
121
- this.waveSurfer.timeline.canvases.forEach(function (canvas, i) {
122
- var leftOffset = i * _this.waveSurfer.timeline.maxCanvasWidth;
123
- var ctx = canvas.getContext('2d');
124
- ctx.fillStyle = '#fd7e14';
125
- ctx.beginPath();
126
- ctx.moveTo(x - 12 - leftOffset, 20);
127
- ctx.lineTo(x + 12 - leftOffset, 20);
128
- ctx.lineTo(x - leftOffset, 45);
129
- ctx.fill();
130
- });
131
- };
132
- TimelineService.prototype.startTimeUpdater = function () {
133
- var _this = this;
134
- this.stopTimeUpdater();
135
- var timeUpdater = timer(0, 40);
136
- this.timeUpdateSubscription = timeUpdater.subscribe(function () {
137
- _this.updateCurrentTime();
138
- });
139
- };
140
- TimelineService.prototype.stopTimeUpdater = function () {
141
- if (this.timeUpdateSubscription) {
142
- this.timeUpdateSubscription.unsubscribe();
143
- }
144
- };
145
- TimelineService.prototype.formatTimeCallback = function (seconds, pxPerSec) {
146
- if (this.selectedComposition.gridType === 'musical') {
147
- return Math.round(seconds / this.selectedComposition.timeSignatureUpper / (60 / this.selectedComposition.beatsPerMinute));
148
- }
149
- else {
150
- // calculate minutes and seconds from seconds count
151
- var minutes = parseInt((seconds / 60), 10);
152
- seconds = parseInt((seconds % 60), 10);
153
- // fill up seconds with zeroes
154
- var secondsStr = seconds < 10 ? '0' + seconds : seconds;
155
- return minutes + ":" + secondsStr;
156
- }
157
- };
158
- TimelineService.prototype.timeInterval = function (pxPerSec) {
159
- if (this.selectedComposition.gridType === 'musical') {
160
- var interval = 60 / this.selectedComposition.beatsPerMinute / this.selectedComposition.gridResolution;
161
- if (pxPerSec < 40) {
162
- return interval * 4;
163
- }
164
- else if (pxPerSec < 80) {
165
- return interval * 2;
166
- }
167
- return interval;
168
- }
169
- else {
170
- if (pxPerSec >= 25) {
171
- return 1;
172
- }
173
- else if (pxPerSec * 5 >= 25) {
174
- return 5;
175
- }
176
- else if (pxPerSec * 15 >= 25) {
177
- return 15;
178
- }
179
- return Math.ceil(0.5 / pxPerSec) * 60;
180
- }
181
- };
182
- TimelineService.prototype.primaryLabelInterval = function (pxPerSec) {
183
- if (this.selectedComposition.gridType === 'musical') {
184
- var interval = this.selectedComposition.timeSignatureUpper * this.selectedComposition.gridResolution;
185
- return interval;
186
- }
187
- else {
188
- if (pxPerSec >= 25) {
189
- return 10;
190
- }
191
- else if (pxPerSec * 5 >= 25) {
192
- return 6;
193
- }
194
- else if (pxPerSec * 15 >= 25) {
195
- return 4;
196
- }
197
- return 4;
198
- }
199
- };
200
- TimelineService.prototype.secondaryLabelInterval = function (pxPerSec) {
201
- if (this.selectedComposition.gridType === 'musical') {
202
- return 0;
203
- }
204
- else {
205
- if (pxPerSec >= 25) {
206
- return 5;
207
- }
208
- else if (pxPerSec * 5 >= 25) {
209
- return 2;
210
- }
211
- else if (pxPerSec * 15 >= 25) {
212
- return 2;
213
- }
214
- return 2;
215
- }
216
- };
217
- TimelineService.prototype.seeekWithTimeline = function (e) {
218
- var _this = this;
219
- // taken from wavesurfer -> drawer -> handleEvent
220
- var clientX = e.targetTouches ? e.targetTouches[0].clientX : e.clientX;
221
- var bbox = this.waveSurfer.timeline.wrapper.getBoundingClientRect();
222
- var nominalWidth = this.waveSurfer.timeline.drawer.width;
223
- var parentWidth = this.waveSurfer.timeline.drawer.getWidth();
224
- var progress;
225
- if (!this.waveSurfer.timeline.drawer.params.fillParent && nominalWidth < parentWidth) {
226
- progress =
227
- (this.waveSurfer.timeline.drawer.params.rtl ? bbox.right - clientX : clientX - bbox.left) *
228
- (this.waveSurfer.timeline.drawer.params.pixelRatio / nominalWidth) || 0;
229
- if (progress > 1) {
230
- progress = 1;
231
- }
232
- }
233
- else {
234
- progress =
235
- ((this.waveSurfer.timeline.drawer.params.rtl ? bbox.right - clientX : clientX - bbox.left) +
236
- this.waveSurfer.timeline.wrapper.scrollLeft) /
237
- this.waveSurfer.timeline.wrapper.scrollWidth || 0;
238
- }
239
- progress = Math.max(progress, 0);
240
- setTimeout(function () {
241
- _this.waveSurfer.seekTo(progress);
242
- _this.detectChanges.next();
243
- _this.presetService.previewLive(_this.selectedComposition.name, Math.round(_this.waveSurfer.getCurrentTime() * 1000));
244
- }, 0);
245
- };
246
- TimelineService.prototype.applyZoom = function (zoom) {
247
- var _this = this;
248
- if (zoom < 0 || zoom > 200) {
249
- return;
250
- }
251
- this.zoom = zoom;
252
- if (this.waveSurfer) {
253
- setTimeout(function () {
254
- _this.waveSurfer.zoom(_this.zoom);
255
- _this.updateCurrentTime();
256
- }, 0);
257
- }
258
- };
259
- TimelineService.prototype.isWaveSurferReady = function () {
260
- if (!this.waveSurfer) {
261
- return false;
262
- }
263
- if (!this.waveSurfer.isReady) {
264
- return false;
265
- }
266
- return true;
267
- };
268
- TimelineService.prototype.addRegion = function (waveSurferRegion) {
269
- if (!this.isWaveSurferReady()) {
270
- return;
271
- }
272
- if (!this.sceneService.selectedScenes || this.sceneService.selectedScenes.length !== 1) {
273
- return;
274
- }
275
- if (!this.selectedComposition) {
276
- return;
277
- }
278
- var scenePlaybackRegion = new ScenePlaybackRegion();
279
- scenePlaybackRegion.sceneUuid = this.sceneService.selectedScenes[0].uuid;
280
- if (waveSurferRegion) {
281
- scenePlaybackRegion.startMillis = waveSurferRegion.start * 1000;
282
- scenePlaybackRegion.endMillis = waveSurferRegion.end * 1000;
283
- }
284
- else {
285
- scenePlaybackRegion.startMillis = (this.waveSurfer.getDuration() * 1000) / 3;
286
- scenePlaybackRegion.endMillis = ((this.waveSurfer.getDuration() * 1000) / 3) * 2;
287
- }
288
- this.selectedComposition.scenePlaybackRegions.push(scenePlaybackRegion);
289
- this.selectedPlaybackRegion = scenePlaybackRegion;
290
- if (waveSurferRegion) {
291
- waveSurferRegion.color =
292
- 'rgba(' +
293
- this.hexToRgb(this.sceneService.selectedScenes[0].color).r +
294
- ', ' +
295
- this.hexToRgb(this.sceneService.selectedScenes[0].color).g +
296
- ', ' +
297
- this.hexToRgb(this.sceneService.selectedScenes[0].color).b +
298
- ', ' +
299
- this.intensityHighlighted +
300
- ')';
301
- waveSurferRegion.attributes.selectable = true;
302
- this.connectRegion(waveSurferRegion, this.sceneService.selectedScenes[0], scenePlaybackRegion);
303
- this.updateRegionSelection();
304
- }
305
- else {
306
- this.drawRegion(scenePlaybackRegion, this.sceneService.selectedScenes[0]);
307
- }
308
- this.presetService.previewLive();
309
- };
310
- TimelineService.prototype.getSnapToGridInterval = function () {
311
- if (this.selectedComposition.snapToGrid) {
312
- return 60 / this.selectedComposition.beatsPerMinute / this.selectedComposition.gridResolution;
313
- }
314
- return undefined;
315
- };
316
- TimelineService.prototype.getSnapToGridOffset = function () {
317
- return this.selectedComposition.gridOffsetMillis / 1000;
318
- };
319
- TimelineService.prototype.deleteSelectedComposition = function () {
320
- this.projectService.project.compositions.splice(this.selectedCompositionIndex, 1);
321
- this.selectedComposition = undefined;
322
- this.selectedCompositionIndex = undefined;
323
- this.destroyWaveSurfer();
324
- if (this.projectService.project.compositions.length > 0) {
325
- this.selectCompositionIndex(0);
326
- }
327
- };
328
- TimelineService.prototype.destroyWaveSurfer = function () {
329
- this.duration = undefined;
330
- this.loadingAudioFile = false;
331
- if (this.waveSurfer) {
332
- this.waveSurfer.destroy();
333
- this.waveSurfer = undefined;
334
- }
335
- };
336
- TimelineService.prototype.createWaveSurfer = function () {
337
- var _this = this;
338
- this.destroyWaveSurfer();
339
- if (!this.selectedComposition.audioFileName) {
340
- return;
341
- }
342
- this.loadingAudioFile = true;
343
- setTimeout(function () {
344
- _this.waveSurfer = WaveSurfer.create({
345
- container: '#waveform',
346
- waveColor: 'white',
347
- progressColor: 'white',
348
- // barWidth: 2,
349
- height: 1,
350
- interact: false,
351
- // Use for timelines without sound. Wave will be displayed
352
- // wrong, but should work for a dummy audio without any waves.
353
- // duration: 400,
354
- plugins: [
355
- CursorPlugin.create({
356
- // showTime: true,
357
- opacity: 1,
358
- color: '#fd7e14',
359
- hideOnBlur: false /* don't show/hide the cursor on the wave (only on the timeline) */,
360
- }),
361
- RegionsPlugin.create({
362
- dragSelection: {
363
- slop: 5,
364
- },
365
- color: '#fff',
366
- snapToGridInterval: _this.getSnapToGridInterval(),
367
- snapToGridOffset: _this.getSnapToGridOffset(),
368
- }),
369
- TimeLinePlugin.create({
370
- container: '#waveform-timeline',
371
- primaryFontColor: '#fff',
372
- secondaryFontColor: '#fff',
373
- offset: _this.getSnapToGridOffset(),
374
- formatTimeCallback: _this.formatTimeCallback.bind(_this),
375
- timeInterval: _this.timeInterval.bind(_this),
376
- primaryLabelInterval: _this.primaryLabelInterval.bind(_this),
377
- secondaryLabelInterval: _this.secondaryLabelInterval.bind(_this),
378
- }),
379
- ],
380
- });
381
- var audioFileName;
382
- if (_this.configService.enableMediaLibrary) {
383
- // the file name is also used for the real file name
384
- audioFileName = 'file/get?name=' + _this.selectedComposition.audioFileName + '&type=AUDIO';
385
- }
386
- else {
387
- // the composition uuid and extension is used as the file name
388
- audioFileName =
389
- 'composition-files/?file=' +
390
- _this.selectedComposition.uuid +
391
- '.' +
392
- _this.selectedComposition.audioFileName.substr(_this.selectedComposition.audioFileName.lastIndexOf('.') + 1);
393
- }
394
- _this.waveSurfer.load(_this.configService.restUrl + audioFileName);
395
- _this.waveSurfer.on('ready', function () {
396
- setTimeout(function () {
397
- // try guessing the bpm and offset from the file, if necessary
398
- if (_this.selectedComposition.tempoGuessed) {
399
- // we already guessed the BPM of this file --> don't do it again
400
- _this.loadingAudioFile = false;
401
- }
402
- else {
403
- // we have not yet guessed the BPM --> do it now
404
- _this.selectedComposition.tempoGuessed = true;
405
- guess(_this.waveSurfer.backend.buffer)
406
- .then(function (_a) {
407
- var bpm = _a.bpm, offset = _a.offset;
408
- // the bpm and offset could be guessed
409
- _this.selectedComposition.beatsPerMinute = bpm;
410
- _this.selectedComposition.gridOffsetMillis = offset * 1000;
411
- _this.loadingAudioFile = false;
412
- })
413
- .catch(function (err) {
414
- // something went wrong
415
- console.error('Could not detect the BPM from the audio file', err);
416
- _this.loadingAudioFile = false;
417
- });
418
- }
419
- _this.duration = _this.msToTime(_this.waveSurfer.getDuration() * 1000);
420
- _this.drawAllRegions();
421
- // scroll wavesurfer in sync with the timeline
422
- _this.waveSurfer.timeline.wrapper.addEventListener('scroll', function () {
423
- _this.waveSurfer.drawer.wrapper.scrollLeft = _this.waveSurfer.timeline.wrapper.scrollLeft;
424
- // Set the scroll position of the timeline to the same position as the wavesurfer,
425
- // because the timeline is larger than wavesurfer and might get out of sync.
426
- // This way, if wavesurfer cannot scroll any further, we reset the position
427
- // of the timeline as well.
428
- _this.waveSurfer.timeline.wrapper.scrollLeft = _this.waveSurfer.drawer.wrapper.scrollLeft;
429
- });
430
- // display the cursor also on the timeline
431
- _this.waveSurfer.timeline.wrapper.addEventListener('mouseenter', function () {
432
- _this.waveSurfer.cursor.showCursor();
433
- });
434
- _this.waveSurfer.timeline.wrapper.addEventListener('mouseleave', function () {
435
- _this.waveSurfer.cursor.hideCursor();
436
- });
437
- _this.waveSurfer.timeline.wrapper.addEventListener('mousemove', function (e) {
438
- var bbox = _this.waveSurfer.container.getBoundingClientRect();
439
- var x = e.clientX - bbox.left;
440
- _this.waveSurfer.cursor.updateCursorPosition(x, 0);
441
- });
442
- // hide the cursor on the wave initially. in combination with the param hideOnBlur = false,
443
- // it will never be displayed on the wave now. we handle it on the timeline only.
444
- _this.waveSurfer.cursor.hideCursor();
445
- // seek on timeline-click
446
- _this.waveSurfer.timeline.wrapper.addEventListener('mousedown', function (e) {
447
- _this.timelineClicking = true;
448
- _this.seeekWithTimeline(e);
449
- });
450
- _this.waveSurfer.timeline.wrapper.addEventListener('mousemove', function (e) {
451
- if (_this.timelineClicking) {
452
- _this.seeekWithTimeline(e);
453
- }
454
- });
455
- _this.waveSurfer.timeline.wrapper.addEventListener('mouseup', function (e) {
456
- _this.timelineClicking = false;
457
- });
458
- _this.updateCurrentTime();
459
- _this.detectChanges.next();
460
- _this.waveSurferReady.next();
461
- }, 0);
462
- });
463
- _this.waveSurfer.on('error', function (error) {
464
- // could not load the composition --> delete it
465
- // (this may occur, when the composition has been deleted but the project is not saved afterwards)
466
- _this.deleteSelectedComposition();
467
- });
468
- _this.waveSurfer.on('seek', function () {
469
- _this.updateCurrentTime();
470
- });
471
- _this.waveSurfer.on('play', function () {
472
- _this.startTimeUpdater();
473
- });
474
- _this.waveSurfer.on('pause', function () {
475
- _this.stopTimeUpdater();
476
- });
477
- _this.waveSurfer.on('region-created', function (region) {
478
- // region created by selection or programmatically
479
- if (_this.sceneService.selectedScenes && _this.sceneService.selectedScenes.length === 1) {
480
- if (!region.data.handled) {
481
- _this.addRegion(region);
482
- }
483
- }
484
- else {
485
- if (!region.data.handled) {
486
- region.remove();
487
- }
488
- }
489
- });
490
- _this.waveSurfer.on('region-updated', function (region) {
491
- _this.detectChanges.next();
492
- _this.presetService.previewLive();
493
- });
494
- }, 0);
495
- };
496
- TimelineService.prototype.hexToRgb = function (hex) {
497
- var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
498
- return result
499
- ? {
500
- r: parseInt(result[1], 16),
501
- g: parseInt(result[2], 16),
502
- b: parseInt(result[3], 16),
503
- }
504
- : null;
505
- };
506
- TimelineService.prototype.updateRegionSelection = function () {
507
- var e_2, _a;
508
- if (!this.waveSurfer) {
509
- return;
510
- }
511
- try {
512
- for (var _b = __values(Object.keys(this.waveSurfer.regions.list)), _c = _b.next(); !_c.done; _c = _b.next()) {
513
- var key = _c.value;
514
- var region = this.waveSurfer.regions.list[key];
515
- // if no scene is set, the region is not valid (e.g. has been created, while
516
- // no scene has been selected and remove did not work properly)
517
- if (region.scene) {
518
- var intensity = this.intensity;
519
- region.drag = false;
520
- region.resize = false;
521
- region.attributes.selectable = false;
522
- if (this.sceneService.sceneIsSelected(region.scene)) {
523
- intensity = this.intensitySelectedScene;
524
- region.drag = true;
525
- region.resize = true;
526
- region.attributes.selectable = true;
527
- }
528
- region.attributes.selected = false;
529
- if (this.selectedPlaybackRegion && this.selectedPlaybackRegion === region.scenePlaybackRegion) {
530
- intensity = this.intensityHighlighted;
531
- region.attributes.selected = true;
532
- }
533
- region.color =
534
- 'rgba(' +
535
- this.hexToRgb(region.scene.color).r +
536
- ', ' +
537
- this.hexToRgb(region.scene.color).g +
538
- ', ' +
539
- this.hexToRgb(region.scene.color).b +
540
- ', ' +
541
- intensity +
542
- ')';
543
- region.updateRender();
544
- }
545
- }
546
- }
547
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
548
- finally {
549
- try {
550
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
551
- }
552
- finally { if (e_2) throw e_2.error; }
553
- }
554
- };
555
- TimelineService.prototype.updateSelectedRegion = function () {
556
- var e_3, _a;
557
- if (!this.waveSurfer) {
558
- return;
559
- }
560
- if (!this.selectedPlaybackRegion) {
561
- return;
562
- }
563
- try {
564
- for (var _b = __values(Object.keys(this.waveSurfer.regions.list)), _c = _b.next(); !_c.done; _c = _b.next()) {
565
- var key = _c.value;
566
- var region = this.waveSurfer.regions.list[key];
567
- if (this.selectedPlaybackRegion === region.scenePlaybackRegion) {
568
- region.start = this.selectedPlaybackRegion.startMillis / 1000;
569
- region.end = this.selectedPlaybackRegion.endMillis / 1000;
570
- region.updateRender();
571
- break;
572
- }
573
- }
574
- }
575
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
576
- finally {
577
- try {
578
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
579
- }
580
- finally { if (e_3) throw e_3.error; }
581
- }
582
- };
583
- TimelineService.prototype.setSelectedRegion = function (scenePlaybackRegion) {
584
- if (this.selectedPlaybackRegion && this.selectedPlaybackRegion === scenePlaybackRegion) {
585
- // No update required
586
- return;
587
- }
588
- if (scenePlaybackRegion) {
589
- this.selectedPlaybackRegion = scenePlaybackRegion;
590
- }
591
- this.updateRegionSelection();
592
- };
593
- TimelineService.prototype.getRegionSnapToGridValue = function (value) {
594
- // the regions should snap to a grid
595
- var offset = this.getSnapToGridOffset() || 0;
596
- var interval = this.getSnapToGridInterval() || 0;
597
- return Math.round((value - offset) / interval) * interval + offset;
598
- };
599
- TimelineService.prototype.connectRegion = function (waveSurferRegion, scene, scenePlaybackRegion, preset) {
600
- var _this = this;
601
- waveSurferRegion.scenePlaybackRegion = scenePlaybackRegion;
602
- waveSurferRegion.scene = scene;
603
- waveSurferRegion.preset = preset;
604
- waveSurferRegion.on('click', function (event) {
605
- if (_this.sceneService.sceneIsSelected(scene)) {
606
- _this.setSelectedRegion(scenePlaybackRegion);
607
- }
608
- });
609
- waveSurferRegion.on('update', function () {
610
- _this.setSelectedRegion(scenePlaybackRegion);
611
- if (_this.selectedComposition.snapToGrid) {
612
- // update the regions boundaries. they may not snap to grid, if it has been
613
- // disabled during creation of the region but activated afterwards.
614
- waveSurferRegion.start = _this.getRegionSnapToGridValue(waveSurferRegion.start);
615
- waveSurferRegion.end = _this.getRegionSnapToGridValue(waveSurferRegion.end);
616
- }
617
- scenePlaybackRegion.startMillis = waveSurferRegion.start * 1000;
618
- scenePlaybackRegion.endMillis = waveSurferRegion.end * 1000;
619
- });
620
- };
621
- TimelineService.prototype.drawRegion = function (scenePlaybackRegion, scene) {
622
- // draw the regions of the currently selected scene
623
- if (!this.isWaveSurferReady()) {
624
- return;
625
- }
626
- // add the playback region
627
- var waveSurferRegion = this.waveSurfer.addRegion({
628
- start: scenePlaybackRegion.startMillis / 1000,
629
- end: scenePlaybackRegion.endMillis / 1000,
630
- color: '#fff',
631
- data: { handled: true },
632
- });
633
- this.connectRegion(waveSurferRegion, scene, scenePlaybackRegion);
634
- // TODO show the all presets
635
- // for (let presetUuid of scene.presetUuids) {
636
- // const preset = this.presetService.getPresetByUuid(presetUuid);
637
- // let waveSurferRegion = this.timelineService.waveSurfer.addRegion({
638
- // start: (scenePlaybackRegion.startMillis + (preset.startMillis ? preset.startMillis : 0)) / 1000,
639
- // end: (scenePlaybackRegion.startMillis
640
- // + (preset.endMillis ? preset.endMillis : scenePlaybackRegion.endMillis - scenePlaybackRegion.startMillis)) / 1000,
641
- // color: '#fff',
642
- // data: { handled: true },
643
- // // TODO
644
- // attributes: {
645
- // preset: true,
646
- // name: 'Preset 1'
647
- // }
648
- // });
649
- // this.connectRegion(waveSurferRegion, scene, scenePlaybackRegion, preset);
650
- // }
651
- this.updateRegionSelection();
652
- };
653
- TimelineService.prototype.removeRegion = function () {
654
- var e_4, _a;
655
- if (!this.selectedPlaybackRegion) {
656
- return;
657
- }
658
- if (this.sceneService.selectedScenes.length !== 1) {
659
- return;
660
- }
661
- for (var i = 0; i < this.selectedComposition.scenePlaybackRegions.length; i++) {
662
- if (this.selectedComposition.scenePlaybackRegions[i] === this.selectedPlaybackRegion) {
663
- try {
664
- // remove the region from wavesurfer
665
- for (var _b = (e_4 = void 0, __values(Object.keys(this.waveSurfer.regions.list))), _c = _b.next(); !_c.done; _c = _b.next()) {
666
- var key = _c.value;
667
- var region = this.waveSurfer.regions.list[key];
668
- if (region.scenePlaybackRegion === this.selectedPlaybackRegion) {
669
- region.remove();
670
- }
671
- }
672
- }
673
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
674
- finally {
675
- try {
676
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
677
- }
678
- finally { if (e_4) throw e_4.error; }
679
- }
680
- this.selectedPlaybackRegion = undefined;
681
- this.selectedComposition.scenePlaybackRegions.splice(i, 1);
682
- return;
683
- }
684
- }
685
- this.presetService.previewLive();
686
- };
687
- TimelineService.prototype.getPresetsInTime = function (timeMillis) {
688
- var e_5, _a, e_6, _b;
689
- // Return all presets which should be active during the specified time
690
- var activePresets = [];
691
- for (var sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {
692
- var scene = this.projectService.project.scenes[sceneIndex];
693
- try {
694
- for (var _c = (e_5 = void 0, __values(this.selectedComposition.scenePlaybackRegions)), _d = _c.next(); !_d.done; _d = _c.next()) {
695
- var region = _d.value;
696
- if (region.sceneUuid === scene.uuid) {
697
- for (var presetIndex = this.projectService.project.presets.length - 1; presetIndex >= 0; presetIndex--) {
698
- try {
699
- for (var _e = (e_6 = void 0, __values(scene.presetUuids)), _f = _e.next(); !_f.done; _f = _e.next()) {
700
- var presetUuid = _f.value;
701
- if (presetUuid === this.projectService.project.presets[presetIndex].uuid) {
702
- var preset = this.presetService.getPresetByUuid(presetUuid);
703
- if (preset) {
704
- var presetStartMillis = preset.startMillis === undefined ? region.startMillis : region.startMillis + preset.startMillis;
705
- var presetEndMillis = preset.endMillis === undefined ? region.endMillis : region.startMillis + preset.endMillis;
706
- // extend the running time, if fading is done outside the boundaries
707
- presetStartMillis -= preset.fadeInPre ? preset.fadeInMillis : 0;
708
- presetEndMillis += preset.fadeOutPost ? preset.fadeOutMillis : 0;
709
- if (presetStartMillis <= timeMillis && presetEndMillis >= timeMillis) {
710
- activePresets.push(new PresetRegionScene(preset, region, scene));
711
- }
712
- }
713
- }
714
- }
715
- }
716
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
717
- finally {
718
- try {
719
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
720
- }
721
- finally { if (e_6) throw e_6.error; }
722
- }
723
- }
724
- }
725
- }
726
- }
727
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
728
- finally {
729
- try {
730
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
731
- }
732
- finally { if (e_5) throw e_5.error; }
733
- }
734
- }
735
- return activePresets;
736
- };
737
- TimelineService.prototype.drawAllRegions = function () {
738
- var e_7, _a, e_8, _b;
739
- if (!this.selectedComposition) {
740
- return;
741
- }
742
- // draw the regions in the same order as their corresponding scenes, but draw
743
- // the selected ones last, to make sure they're always clickable.
744
- for (var sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {
745
- var scene = this.projectService.project.scenes[sceneIndex];
746
- if (!this.sceneService.sceneIsSelected(scene)) {
747
- try {
748
- for (var _c = (e_7 = void 0, __values(this.selectedComposition.scenePlaybackRegions)), _d = _c.next(); !_d.done; _d = _c.next()) {
749
- var scenePlaybackRegion = _d.value;
750
- if (scenePlaybackRegion.sceneUuid === scene.uuid) {
751
- this.drawRegion(scenePlaybackRegion, scene);
752
- }
753
- }
754
- }
755
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
756
- finally {
757
- try {
758
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
759
- }
760
- finally { if (e_7) throw e_7.error; }
761
- }
762
- }
763
- }
764
- // draw all selected scenes afterwards
765
- for (var sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {
766
- var scene = this.projectService.project.scenes[sceneIndex];
767
- if (this.sceneService.sceneIsSelected(scene)) {
768
- try {
769
- for (var _e = (e_8 = void 0, __values(this.selectedComposition.scenePlaybackRegions)), _f = _e.next(); !_f.done; _f = _e.next()) {
770
- var scenePlaybackRegion = _f.value;
771
- if (scenePlaybackRegion.sceneUuid === scene.uuid) {
772
- this.drawRegion(scenePlaybackRegion, scene);
773
- }
774
- }
775
- }
776
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
777
- finally {
778
- try {
779
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
780
- }
781
- finally { if (e_8) throw e_8.error; }
782
- }
783
- }
784
- }
785
- };
786
- TimelineService.prototype.updateGrid = function () {
787
- if (this.waveSurferReady) {
788
- this.waveSurfer.timeline.params.offset = this.getSnapToGridOffset();
789
- this.waveSurfer.regions.params.snapToGridInterval = this.getSnapToGridInterval();
790
- this.waveSurfer.regions.params.snapToGridOffset = this.getSnapToGridOffset();
791
- }
792
- this.updateCurrentTime();
793
- };
794
- TimelineService.prototype.getExternalCompositionNames = function () {
795
- // get available compositions from an external pool (e.g. Rocket Show)
796
- return this.http.get('composition/list').pipe(map(function (response) {
797
- var e_9, _a;
798
- var compositionNames = [];
799
- try {
800
- for (var response_1 = __values(response), response_1_1 = response_1.next(); !response_1_1.done; response_1_1 = response_1.next()) {
801
- var responseComposition = response_1_1.value;
802
- compositionNames.push(responseComposition.name);
803
- }
804
- }
805
- catch (e_9_1) { e_9 = { error: e_9_1 }; }
806
- finally {
807
- try {
808
- if (response_1_1 && !response_1_1.done && (_a = response_1.return)) _a.call(response_1);
809
- }
810
- finally { if (e_9) throw e_9.error; }
811
- }
812
- return compositionNames;
813
- }));
814
- };
815
- TimelineService.prototype.selectCompositionIndex = function (index) {
816
- this.selectedComposition = this.projectService.project.compositions[index];
817
- this.selectedCompositionIndex = index;
818
- this.projectService.project.selectedCompositionUuid = this.selectedComposition.uuid;
819
- this.createWaveSurfer();
820
- // required to trigger timeline.component.resize()
821
- this.waveSurferReady.next();
822
- this.applyZoom(0);
823
- };
824
- TimelineService.ctorParameters = function () { return [
825
- { type: SceneService },
826
- { type: PresetService },
827
- { type: ProjectService },
828
- { type: HttpClient },
829
- { type: ConfigService }
830
- ]; };
831
- TimelineService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TimelineService_Factory() { return new TimelineService(i0.ɵɵinject(i1.SceneService), i0.ɵɵinject(i2.PresetService), i0.ɵɵinject(i3.ProjectService), i0.ɵɵinject(i4.HttpClient), i0.ɵɵinject(i5.ConfigService)); }, token: TimelineService, providedIn: "root" });
832
- TimelineService = __decorate([
833
- Injectable({
834
- providedIn: 'root',
835
- }),
836
- __metadata("design:paramtypes", [SceneService,
837
- PresetService,
838
- ProjectService,
839
- HttpClient,
840
- ConfigService])
841
- ], TimelineService);
842
- return TimelineService;
843
- }());
844
- export { TimelineService };
845
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Byb2NrZXRzaG93L2Rlc2lnbmVyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3RpbWVsaW5lLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxVQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sWUFBWSxNQUFNLG9EQUFvRCxDQUFDO0FBQzlFLE9BQU8sYUFBYSxNQUFNLHFEQUFxRCxDQUFDO0FBQ2hGLE9BQU8sY0FBYyxNQUFNLHNEQUFzRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUdoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFLL0M7SUEwQkUseUJBQ1UsWUFBMEIsRUFDMUIsYUFBNEIsRUFDNUIsY0FBOEIsRUFDOUIsSUFBZ0IsRUFDaEIsYUFBNEI7UUFMdEMsaUJBaUJDO1FBaEJTLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdB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QWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IFdhdmVTdXJmZXIgZnJvbSAnd2F2ZXN1cmZlci5qcyc7XG5pbXBvcnQgQ3Vyc29yUGx1Z2luIGZyb20gJ3dhdmVzdXJmZXIuanMvZGlzdC9wbHVnaW4vd2F2ZXN1cmZlci5jdXJzb3IubWluLmpzJztcbmltcG9ydCBSZWdpb25zUGx1Z2luIGZyb20gJ3dhdmVzdXJmZXIuanMvZGlzdC9wbHVnaW4vd2F2ZXN1cmZlci5yZWdpb25zLm1pbi5qcyc7XG5pbXBvcnQgVGltZUxpbmVQbHVnaW4gZnJvbSAnd2F2ZXN1cmZlci5qcy9kaXN0L3BsdWdpbi93YXZlc3VyZmVyLnRpbWVsaW5lLm1pbi5qcyc7XG5pbXBvcnQgeyBndWVzcyB9IGZyb20gJ3dlYi1hdWRpby1iZWF0LWRldGVjdG9yJztcbmltcG9ydCB7IENvbXBvc2l0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2NvbXBvc2l0aW9uJztcbmltcG9ydCB7IFByZXNldCB9IGZyb20gJy4uL21vZGVscy9wcmVzZXQnO1xuaW1wb3J0IHsgUHJlc2V0UmVnaW9uU2NlbmUgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0LXJlZ2lvbi1zY2VuZSc7XG5pbXBvcnQgeyBTY2VuZSB9IGZyb20gJy4uL21vZGVscy9zY2VuZSc7XG5pbXBvcnQgeyBTY2VuZVBsYXliYWNrUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3NjZW5lLXBsYXliYWNrLXJlZ2lvbic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi9wcmVzZXQuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9qZWN0U2VydmljZSB9IGZyb20gJy4vcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFNjZW5lU2VydmljZSB9IGZyb20gJy4vc2NlbmUuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lbGluZVNlcnZpY2Uge1xuICBwdWJsaWMgd2F2ZVN1cmZlcjogV2F2ZVN1cmZlcjtcbiAgcHVibGljIHBsYXlTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gIHB1YmxpYyB6b29tID0gMDtcbiAgcHJpdmF0ZSB0aW1lVXBkYXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjdXJyZW50VGltZTogc3RyaW5nO1xuICBwcml2YXRlIHRpbWVsaW5lQ2xpY2tpbmcgPSBmYWxzZTtcbiAgcHVibGljIHNlbGVjdGVkUGxheWJhY2tSZWdpb246IFNjZW5lUGxheWJhY2tSZWdpb247XG4gIHByaXZhdGUgaW50ZW5zaXR5ID0gMC4yO1xuICBwcml2YXRlIGludGVuc2l0eVNlbGVjdGVkU2NlbmUgPSAwLjQ7XG4gIHByaXZhdGUgaW50ZW5zaXR5SGlnaGxpZ2h0ZWQgPSAwLjg7XG4gIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgd2F2ZVN1cmZlclJlYWR5OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHVibGljIGRldGVjdENoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8vIHRoZSBjdXJyZW50IGNvbXBvc2l0aW9uXG4gIHB1YmxpYyBzZWxlY3RlZENvbXBvc2l0aW9uOiBDb21wb3NpdGlvbjtcbiAgcHVibGljIHNlbGVjdGVkQ29tcG9zaXRpb25JbmRleDogbnVtYmVyO1xuXG4gIC8vIGNhbiB3ZSBhZGQgbmV3IGNvbXBvc2l0aW9ucyBiYXNlZCBvbiBhbiBleHRlcm5hbCBwb29sIGFuZFxuICAvLyBzaG91bGQgbmV3IGNvbXBvc2l0aW9ucyBub3QgYXZhaWxhYmxlIGluIHRoaXMgcG9vbCBiZSBhZGRlZCB0aGVyZT9cbiAgcHVibGljIGV4dGVybmFsQ29tcG9zaXRpb25zQXZhaWxhYmxlID0gZmFsc2U7XG5cbiAgcHVibGljIGxvYWRpbmdBdWRpb0ZpbGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJlc2V0U2VydmljZTogUHJlc2V0U2VydmljZSxcbiAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3U2VsZWN0aW9uQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZFBsYXliYWNrUmVnaW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy51cGRhdGVSZWdpb25TZWxlY3Rpb24oKTtcbiAgICB9KTtcbiAgICB0aGlzLnNjZW5lU2VydmljZS5zY2VuZURlbGV0ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVkcmF3QWxsUmVnaW9ucygpO1xuICAgIH0pO1xuICAgIHRoaXMuc2NlbmVTZXJ2aWNlLnNjZW5lU2VsZWN0ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVkcmF3QWxsUmVnaW9ucygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRyYXdBbGxSZWdpb25zKCkge1xuICAgIC8vIHJlbW92ZSBhbGwgcmVnaW9ucyBmcm9tIHdhdmVzdXJ2ZXJcbiAgICBpZiAodGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLndhdmVTdXJmZXIucmVnaW9ucy5saXN0KSkge1xuICAgICAgICBjb25zdCByZWdpb246IGFueSA9IHRoaXMud2F2ZVN1cmZlci5yZWdpb25zLmxpc3Rba2V5XTtcbiAgICAgICAgcmVnaW9uLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRyYXcgYWxsIHJlZ2lvbnNcbiAgICB0aGlzLmRyYXdBbGxSZWdpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIHBhZChudW06IG51bWJlciwgc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIW51bSkge1xuICAgICAgbnVtID0gMDtcbiAgICB9XG5cbiAgICBsZXQgcGFkZGVkOiBzdHJpbmcgPSBudW0udG9TdHJpbmcoKTtcbiAgICB3aGlsZSAocGFkZGVkLmxlbmd0aCA8IHNpemUpIHtcbiAgICAgIHBhZGRlZCA9ICcwJyArIHBhZGRlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFkZGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBtc1RvVGltZShtaWxsaXM6IG51bWJlciwgaW5jbHVkZU1pbGxpczogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1zOiBudW1iZXIgPSBNYXRoLnJvdW5kKG1pbGxpcyAlIDEwMDApO1xuICAgIGNvbnN0IHNlY29uZHM6IG51bWJlciA9IE1hdGguZmxvb3IoKChtaWxsaXMgJSAzNjAwMDApICUgNjAwMDApIC8gMTAwMCk7XG4gICAgY29uc3QgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigobWlsbGlzICUgMzYwMDAwMCkgLyA2MDAwMCk7XG5cbiAgICBpZiAoaW5jbHVkZU1pbGxpcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFkKG1pbnV0ZXMsIDIpICsgJzonICsgdGhpcy5wYWQoc2Vjb25kcywgMikgKyAnLicgKyB0aGlzLnBhZChtcywgMyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZChtaW51dGVzLCAyKSArICc6JyArIHRoaXMucGFkKHNlY29uZHMsIDIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ3VycmVudFRpbWUoKSB7XG4gICAgaWYgKCF0aGlzLndhdmVTdXJmZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkaXNwbGF5IHRoZSBjdXJyZW50IHRpbWVcbiAgICB0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy5tc1RvVGltZSh0aGlzLndhdmVTdXJmZXIuZ2V0Q3VycmVudFRpbWUoKSAqIDEwMDApO1xuXG4gICAgaWYgKCF0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZHJhdyB0aGUgY3VycmVudCBjdXJzb3Igb24gdGhlIHRpbWVsaW5lXG4gICAgLy8gVE9ETyByZWRyYXdpbmcgdGhlIHRpbWVsaW5lIGVhY2ggdXBkYXRlIGlzIHdheSB0byBleHBlbnNpdmUuXG4gICAgLy8gbWF5YmUgYXMgYSBiZXR0ZXIgc29sdXRpb24gdXNlIGFuIGVsZW1lbnQsIGxpa2UgdGhlIGN1cnNvciBpbnNpZGUgV2F2ZXN1cmZlciB0b1xuICAgIC8vIGRpc3BsYXkgdGhlIHByb2dyZXNzP1xuICAgIGxldCB4ID0gMDtcbiAgICBjb25zdCBkdXJhdGlvbjogbnVtYmVyID0gdGhpcy53YXZlU3VyZmVyLmJhY2tlbmQuZ2V0RHVyYXRpb24oKTtcbiAgICBjb25zdCB3aWR0aDogbnVtYmVyID1cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5wYXJhbXMuZmlsbFBhcmVudCAmJiAhdGhpcy53YXZlU3VyZmVyLnBhcmFtcy5zY3JvbGxQYXJlbnRcbiAgICAgICAgPyB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLmdldFdpZHRoKClcbiAgICAgICAgOiB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLndyYXBwZXIuc2Nyb2xsV2lkdGggKiB0aGlzLndhdmVTdXJmZXIucGFyYW1zLnBpeGVsUmF0aW87XG5cbiAgICB4ID0gKHdpZHRoIC8gZHVyYXRpb24pICogdGhpcy53YXZlU3VyZmVyLmdldEN1cnJlbnRUaW1lKCkgLSAyO1xuXG4gICAgLy8gdXBkYXRlIHRoZSB0aW1lbGluZSBjYW52YXNcbiAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUucmVuZGVyKCk7XG5cbiAgICAvLyBkcmF3IHRoZSBjdXJzb3Igb24gdGhlIHRpbWVsaW5lXG4gICAgdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLmNhbnZhc2VzLmZvckVhY2goKGNhbnZhcywgaSkgPT4ge1xuICAgICAgY29uc3QgbGVmdE9mZnNldCA9IGkgKiB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUubWF4Q2FudmFzV2lkdGg7XG5cbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICBjdHguZmlsbFN0eWxlID0gJyNmZDdlMTQnO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4Lm1vdmVUbyh4IC0gMTIgLSBsZWZ0T2Zmc2V0LCAyMCk7XG4gICAgICBjdHgubGluZVRvKHggKyAxMiAtIGxlZnRPZmZzZXQsIDIwKTtcbiAgICAgIGN0eC5saW5lVG8oeCAtIGxlZnRPZmZzZXQsIDQ1KTtcbiAgICAgIGN0eC5maWxsKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGltZVVwZGF0ZXIoKSB7XG4gICAgdGhpcy5zdG9wVGltZVVwZGF0ZXIoKTtcblxuICAgIGNvbnN0IHRpbWVVcGRhdGVyID0gdGltZXIoMCwgNDApO1xuICAgIHRoaXMudGltZVVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRpbWVVcGRhdGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRUaW1lKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BUaW1lVXBkYXRlcigpIHtcbiAgICBpZiAodGhpcy50aW1lVXBkYXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnRpbWVVcGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lQ2FsbGJhY2soc2Vjb25kczogbnVtYmVyLCBweFBlclNlYzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5ncmlkVHlwZSA9PT0gJ211c2ljYWwnKSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChzZWNvbmRzIC8gdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnRpbWVTaWduYXR1cmVVcHBlciAvICg2MCAvIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5iZWF0c1Blck1pbnV0ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjYWxjdWxhdGUgbWludXRlcyBhbmQgc2Vjb25kcyBmcm9tIHNlY29uZHMgY291bnRcbiAgICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUludCgoc2Vjb25kcyAvIDYwKSBhcyBhbnksIDEwKTtcbiAgICAgIHNlY29uZHMgPSBwYXJzZUludCgoc2Vjb25kcyAlIDYwKSBhcyBhbnksIDEwKTtcblxuICAgICAgLy8gZmlsbCB1cCBzZWNvbmRzIHdpdGggemVyb2VzXG4gICAgICBjb25zdCBzZWNvbmRzU3RyID0gc2Vjb25kcyA8IDEwID8gJzAnICsgc2Vjb25kcyA6IHNlY29uZHM7XG4gICAgICByZXR1cm4gYCR7bWludXRlc306JHtzZWNvbmRzU3RyfWA7XG4gICAgfVxuICB9XG5cbiAgdGltZUludGVydmFsKHB4UGVyU2VjOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLmdyaWRUeXBlID09PSAnbXVzaWNhbCcpIHtcbiAgICAgIGNvbnN0IGludGVydmFsID0gNjAgLyB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uYmVhdHNQZXJNaW51dGUgLyB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uZ3JpZFJlc29sdXRpb247XG5cbiAgICAgIGlmIChweFBlclNlYyA8IDQwKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbCAqIDQ7XG4gICAgICB9IGVsc2UgaWYgKHB4UGVyU2VjIDwgODApIHtcbiAgICAgICAgcmV0dXJuIGludGVydmFsICogMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGludGVydmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHhQZXJTZWMgPj0gMjUpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKHB4UGVyU2VjICogNSA+PSAyNSkge1xuICAgICAgICByZXR1cm4gNTtcbiAgICAgIH0gZWxzZSBpZiAocHhQZXJTZWMgKiAxNSA+PSAyNSkge1xuICAgICAgICByZXR1cm4gMTU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBNYXRoLmNlaWwoMC41IC8gcHhQZXJTZWMpICogNjA7XG4gICAgfVxuICB9XG5cbiAgcHJpbWFyeUxhYmVsSW50ZXJ2YWwocHhQZXJTZWM6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uZ3JpZFR5cGUgPT09ICdtdXNpY2FsJykge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24udGltZVNpZ25hdHVyZVVwcGVyICogdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLmdyaWRSZXNvbHV0aW9uO1xuXG4gICAgICByZXR1cm4gaW50ZXJ2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChweFBlclNlYyA+PSAyNSkge1xuICAgICAgICByZXR1cm4gMTA7XG4gICAgICB9IGVsc2UgaWYgKHB4UGVyU2VjICogNSA+PSAyNSkge1xuICAgICAgICByZXR1cm4gNjtcbiAgICAgIH0gZWxzZSBpZiAocHhQZXJTZWMgKiAxNSA+PSAyNSkge1xuICAgICAgICByZXR1cm4gNDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICB9XG5cbiAgc2Vjb25kYXJ5TGFiZWxJbnRlcnZhbChweFBlclNlYzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5ncmlkVHlwZSA9PT0gJ211c2ljYWwnKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHB4UGVyU2VjID49IDI1KSB7XG4gICAgICAgIHJldHVybiA1O1xuICAgICAgfSBlbHNlIGlmIChweFBlclNlYyAqIDUgPj0gMjUpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgICB9IGVsc2UgaWYgKHB4UGVyU2VjICogMTUgPj0gMjUpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgICB9XG4gICAgICByZXR1cm4gMjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlZWVrV2l0aFRpbWVsaW5lKGU6IGFueSkge1xuICAgIC8vIHRha2VuIGZyb20gd2F2ZXN1cmZlciAtPiBkcmF3ZXIgLT4gaGFuZGxlRXZlbnRcbiAgICBjb25zdCBjbGllbnRYID0gZS50YXJnZXRUb3VjaGVzID8gZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFggOiBlLmNsaWVudFg7XG4gICAgY29uc3QgYmJveCA9IHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3Qgbm9taW5hbFdpZHRoID0gdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLmRyYXdlci53aWR0aDtcbiAgICBjb25zdCBwYXJlbnRXaWR0aCA9IHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS5kcmF3ZXIuZ2V0V2lkdGgoKTtcblxuICAgIGxldCBwcm9ncmVzczogbnVtYmVyO1xuXG4gICAgaWYgKCF0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLnBhcmFtcy5maWxsUGFyZW50ICYmIG5vbWluYWxXaWR0aCA8IHBhcmVudFdpZHRoKSB7XG4gICAgICBwcm9ncmVzcyA9XG4gICAgICAgICh0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLnBhcmFtcy5ydGwgPyBiYm94LnJpZ2h0IC0gY2xpZW50WCA6IGNsaWVudFggLSBiYm94LmxlZnQpICpcbiAgICAgICAgICAodGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLmRyYXdlci5wYXJhbXMucGl4ZWxSYXRpbyAvIG5vbWluYWxXaWR0aCkgfHwgMDtcblxuICAgICAgaWYgKHByb2dyZXNzID4gMSkge1xuICAgICAgICBwcm9ncmVzcyA9IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyZXNzID1cbiAgICAgICAgKCh0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLnBhcmFtcy5ydGwgPyBiYm94LnJpZ2h0IC0gY2xpZW50WCA6IGNsaWVudFggLSBiYm94LmxlZnQpICtcbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5zY3JvbGxMZWZ0KSAvXG4gICAgICAgICAgdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLndyYXBwZXIuc2Nyb2xsV2lkdGggfHwgMDtcbiAgICB9XG5cbiAgICBwcm9ncmVzcyA9IE1hdGgubWF4KHByb2dyZXNzLCAwKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YXZlU3VyZmVyLnNlZWtUbyhwcm9ncmVzcyk7XG4gICAgICB0aGlzLmRldGVjdENoYW5nZXMubmV4dCgpO1xuICAgICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5uYW1lLCBNYXRoLnJvdW5kKHRoaXMud2F2ZVN1cmZlci5nZXRDdXJyZW50VGltZSgpICogMTAwMCkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgYXBwbHlab29tKHpvb206IGFueSkge1xuICAgIGlmICh6b29tIDwgMCB8fCB6b29tID4gMjAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy56b29tID0gem9vbTtcbiAgICBpZiAodGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy53YXZlU3VyZmVyLnpvb20odGhpcy56b29tKTtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50VGltZSgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1dhdmVTdXJmZXJSZWFkeSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMud2F2ZVN1cmZlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53YXZlU3VyZmVyLmlzUmVhZHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFkZFJlZ2lvbih3YXZlU3VyZmVyUmVnaW9uPzogYW55KSB7XG4gICAgaWYgKCF0aGlzLmlzV2F2ZVN1cmZlclJlYWR5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2NlbmVTZXJ2aWNlLnNlbGVjdGVkU2NlbmVzIHx8IHRoaXMuc2NlbmVTZXJ2aWNlLnNlbGVjdGVkU2NlbmVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVQbGF5YmFja1JlZ2lvbjogU2NlbmVQbGF5YmFja1JlZ2lvbiA9IG5ldyBTY2VuZVBsYXliYWNrUmVnaW9uKCk7XG4gICAgc2NlbmVQbGF5YmFja1JlZ2lvbi5zY2VuZVV1aWQgPSB0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lc1swXS51dWlkO1xuXG4gICAgaWYgKHdhdmVTdXJmZXJSZWdpb24pIHtcbiAgICAgIHNjZW5lUGxheWJhY2tSZWdpb24uc3RhcnRNaWxsaXMgPSB3YXZlU3VyZmVyUmVnaW9uLnN0YXJ0ICogMTAwMDtcbiAgICAgIHNjZW5lUGxheWJhY2tSZWdpb24uZW5kTWlsbGlzID0gd2F2ZVN1cmZlclJlZ2lvbi5lbmQgKiAxMDAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2VuZVBsYXliYWNrUmVnaW9uLnN0YXJ0TWlsbGlzID0gKHRoaXMud2F2ZVN1cmZlci5nZXREdXJhdGlvbigpICogMTAwMCkgLyAzO1xuICAgICAgc2NlbmVQbGF5YmFja1JlZ2lvbi5lbmRNaWxsaXMgPSAoKHRoaXMud2F2ZVN1cmZlci5nZXREdXJhdGlvbigpICogMTAwMCkgLyAzKSAqIDI7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnNjZW5lUGxheWJhY2tSZWdpb25zLnB1c2goc2NlbmVQbGF5YmFja1JlZ2lvbik7XG5cbiAgICB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPSBzY2VuZVBsYXliYWNrUmVnaW9uO1xuXG4gICAgaWYgKHdhdmVTdXJmZXJSZWdpb24pIHtcbiAgICAgIHdhdmVTdXJmZXJSZWdpb24uY29sb3IgPVxuICAgICAgICAncmdiYSgnICtcbiAgICAgICAgdGhpcy5oZXhUb1JnYih0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lc1swXS5jb2xvcikuciArXG4gICAgICAgICcsICcgK1xuICAgICAgICB0aGlzLmhleFRvUmdiKHRoaXMuc2NlbmVTZXJ2aWNlLnNlbGVjdGVkU2NlbmVzWzBdLmNvbG9yKS5nICtcbiAgICAgICAgJywgJyArXG4gICAgICAgIHRoaXMuaGV4VG9SZ2IodGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXNbMF0uY29sb3IpLmIgK1xuICAgICAgICAnLCAnICtcbiAgICAgICAgdGhpcy5pbnRlbnNpdHlIaWdobGlnaHRlZCArXG4gICAgICAgICcpJztcbiAgICAgIHdhdmVTdXJmZXJSZWdpb24uYXR0cmlidXRlcy5zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29ubmVjdFJlZ2lvbih3YXZlU3VyZmVyUmVnaW9uLCB0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lc1swXSwgc2NlbmVQbGF5YmFja1JlZ2lvbik7XG4gICAgICB0aGlzLnVwZGF0ZVJlZ2lvblNlbGVjdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYXdSZWdpb24oc2NlbmVQbGF5YmFja1JlZ2lvbiwgdGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXNbMF0pO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTbmFwVG9HcmlkSW50ZXJ2YWwoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnNuYXBUb0dyaWQpIHtcbiAgICAgIHJldHVybiA2MCAvIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5iZWF0c1Blck1pbnV0ZSAvIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5ncmlkUmVzb2x1dGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTbmFwVG9HcmlkT2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5ncmlkT2Zmc2V0TWlsbGlzIC8gMTAwMDtcbiAgfVxuXG4gIGRlbGV0ZVNlbGVjdGVkQ29tcG9zaXRpb24oKSB7XG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmNvbXBvc2l0aW9ucy5zcGxpY2UodGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uSW5kZXgsIDEpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb25JbmRleCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlc3Ryb3lXYXZlU3VyZmVyKCk7XG4gICAgaWYgKHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5jb21wb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RDb21wb3NpdGlvbkluZGV4KDApO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lXYXZlU3VyZmVyKCkge1xuICAgIHRoaXMuZHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sb2FkaW5nQXVkaW9GaWxlID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICB0aGlzLndhdmVTdXJmZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy53YXZlU3VyZmVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVdhdmVTdXJmZXIoKSB7XG4gICAgdGhpcy5kZXN0cm95V2F2ZVN1cmZlcigpO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uYXVkaW9GaWxlTmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZ0F1ZGlvRmlsZSA9IHRydWU7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2F2ZVN1cmZlciA9IFdhdmVTdXJmZXIuY3JlYXRlKHtcbiAgICAgICAgY29udGFpbmVyOiAnI3dhdmVmb3JtJyxcbiAgICAgICAgd2F2ZUNvbG9yOiAnd2hpdGUnLFxuICAgICAgICBwcm9ncmVzc0NvbG9yOiAnd2hpdGUnLFxuICAgICAgICAvLyBiYXJXaWR0aDogMixcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICBpbnRlcmFjdDogZmFsc2UsXG4gICAgICAgIC8vIFVzZSBmb3IgdGltZWxpbmVzIHdpdGhvdXQgc291bmQuIFdhdmUgd2lsbCBiZSBkaXNwbGF5ZWRcbiAgICAgICAgLy8gd3JvbmcsIGJ1dCBzaG91bGQgd29yayBmb3IgYSBkdW1teSBhdWRpbyB3aXRob3V0IGFueSB3YXZlcy5cbiAgICAgICAgLy8gZHVyYXRpb246IDQwMCxcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgIEN1cnNvclBsdWdpbi5jcmVhdGUoe1xuICAgICAgICAgICAgLy8gc2hvd1RpbWU6IHRydWUsXG4gICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgY29sb3I6ICcjZmQ3ZTE0JyxcbiAgICAgICAgICAgIGhpZGVPbkJsdXI6IGZhbHNlIC8qIGRvbid0IHNob3cvaGlkZSB0aGUgY3Vyc29yIG9uIHRoZSB3YXZlIChvbmx5IG9uIHRoZSB0aW1lbGluZSkgKi8sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgUmVnaW9uc1BsdWdpbi5jcmVhdGUoe1xuICAgICAgICAgICAgZHJhZ1NlbGVjdGlvbjoge1xuICAgICAgICAgICAgICBzbG9wOiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICAgICAgICBzbmFwVG9HcmlkSW50ZXJ2YWw6IHRoaXMuZ2V0U25hcFRvR3JpZEludGVydmFsKCksXG4gICAgICAgICAgICBzbmFwVG9HcmlkT2Zmc2V0OiB0aGlzLmdldFNuYXBUb0dyaWRPZmZzZXQoKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBUaW1lTGluZVBsdWdpbi5jcmVhdGUoe1xuICAgICAgICAgICAgY29udGFpbmVyOiAnI3dhdmVmb3JtLXRpbWVsaW5lJyxcbiAgICAgICAgICAgIHByaW1hcnlGb250Q29sb3I6ICcjZmZmJyxcbiAgICAgICAgICAgIHNlY29uZGFyeUZvbnRDb2xvcjogJyNmZmYnLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLmdldFNuYXBUb0dyaWRPZmZzZXQoKSxcbiAgICAgICAgICAgIGZvcm1hdFRpbWVDYWxsYmFjazogdGhpcy5mb3JtYXRUaW1lQ2FsbGJhY2suYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRpbWVJbnRlcnZhbDogdGhpcy50aW1lSW50ZXJ2YWwuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHByaW1hcnlMYWJlbEludGVydmFsOiB0aGlzLnByaW1hcnlMYWJlbEludGVydmFsLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzZWNvbmRhcnlMYWJlbEludGVydmFsOiB0aGlzLnNlY29uZGFyeUxhYmVsSW50ZXJ2YWwuYmluZCh0aGlzKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgYXVkaW9GaWxlTmFtZTogc3RyaW5nO1xuXG4gICAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmVuYWJsZU1lZGlhTGlicmFyeSkge1xuICAgICAgICAvLyB0aGUgZmlsZSBuYW1lIGlzIGFsc28gdXNlZCBmb3IgdGhlIHJlYWwgZmlsZSBuYW1lXG4gICAgICAgIGF1ZGlvRmlsZU5hbWUgPSAnZmlsZS9nZXQ/bmFtZT0nICsgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLmF1ZGlvRmlsZU5hbWUgKyAnJnR5cGU9QVVESU8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlIGNvbXBvc2l0aW9uIHV1aWQgYW5kIGV4dGVuc2lvbiBpcyB1c2VkIGFzIHRoZSBmaWxlIG5hbWVcbiAgICAgICAgYXVkaW9GaWxlTmFtZSA9XG4gICAgICAgICAgJ2NvbXBvc2l0aW9uLWZpbGVzLz9maWxlPScgK1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi51dWlkICtcbiAgICAgICAgICAnLicgK1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5hdWRpb0ZpbGVOYW1lLnN1YnN0cih0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uYXVkaW9GaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5sb2FkKHRoaXMuY29uZmlnU2VydmljZS5yZXN0VXJsICsgYXVkaW9GaWxlTmFtZSk7XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHRyeSBndWVzc2luZyB0aGUgYnBtIGFuZCBvZmZzZXQgZnJvbSB0aGUgZmlsZSwgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi50ZW1wb0d1ZXNzZWQpIHtcbiAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZ3Vlc3NlZCB0aGUgQlBNIG9mIHRoaXMgZmlsZSAtLT4gZG9uJ3QgZG8gaXQgYWdhaW5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0F1ZGlvRmlsZSA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIG5vdCB5ZXQgZ3Vlc3NlZCB0aGUgQlBNIC0tPiBkbyBpdCBub3dcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi50ZW1wb0d1ZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgZ3Vlc3ModGhpcy53YXZlU3VyZmVyLmJhY2tlbmQuYnVmZmVyKVxuICAgICAgICAgICAgICAudGhlbigoeyBicG0sIG9mZnNldCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIGJwbSBhbmQgb2Zmc2V0IGNvdWxkIGJlIGd1ZXNzZWRcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uYmVhdHNQZXJNaW51dGUgPSBicG07XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLmdyaWRPZmZzZXRNaWxsaXMgPSBvZmZzZXQgKiAxMDAwO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0F1ZGlvRmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGRldGVjdCB0aGUgQlBNIGZyb20gdGhlIGF1ZGlvIGZpbGUnLCBlcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0F1ZGlvRmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gdGhpcy5tc1RvVGltZSh0aGlzLndhdmVTdXJmZXIuZ2V0RHVyYXRpb24oKSAqIDEwMDApO1xuICAgICAgICAgIHRoaXMuZHJhd0FsbFJlZ2lvbnMoKTtcblxuICAgICAgICAgIC8vIHNjcm9sbCB3YXZlc3VyZmVyIGluIHN5bmMgd2l0aCB0aGUgdGltZWxpbmVcbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndhdmVTdXJmZXIuZHJhd2VyLndyYXBwZXIuc2Nyb2xsTGVmdCA9IHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS53cmFwcGVyLnNjcm9sbExlZnQ7XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSB0aW1lbGluZSB0byB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgd2F2ZXN1cmZlcixcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHRpbWVsaW5lIGlzIGxhcmdlciB0aGFuIHdhdmVzdXJmZXIgYW5kIG1pZ2h0IGdldCBvdXQgb2Ygc3luYy5cbiAgICAgICAgICAgIC8vIFRoaXMgd2F5LCBpZiB3YXZlc3VyZmVyIGNhbm5vdCBzY3JvbGwgYW55IGZ1cnRoZXIsIHdlIHJlc2V0IHRoZSBwb3NpdGlvblxuICAgICAgICAgICAgLy8gb2YgdGhlIHRpbWVsaW5lIGFzIHdlbGwuXG4gICAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5zY3JvbGxMZWZ0ID0gdGhpcy53YXZlU3VyZmVyLmRyYXdlci53cmFwcGVyLnNjcm9sbExlZnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBjdXJzb3IgYWxzbyBvbiB0aGUgdGltZWxpbmVcbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53YXZlU3VyZmVyLmN1cnNvci5zaG93Q3Vyc29yKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2F2ZVN1cmZlci5jdXJzb3IuaGlkZUN1cnNvcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJib3ggPSB0aGlzLndhdmVTdXJmZXIuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgeCA9IGUuY2xpZW50WCAtIGJib3gubGVmdDtcbiAgICAgICAgICAgIHRoaXMud2F2ZVN1cmZlci5jdXJzb3IudXBkYXRlQ3Vyc29yUG9zaXRpb24oeCwgMCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBoaWRlIHRoZSBjdXJzb3Igb24gdGhlIHdhdmUgaW5pdGlhbGx5LiBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBwYXJhbSBoaWRlT25CbHVyID0gZmFsc2UsXG4gICAgICAgICAgLy8gaXQgd2lsbCBuZXZlciBiZSBkaXNwbGF5ZWQgb24gdGhlIHdhdmUgbm93LiB3ZSBoYW5kbGUgaXQgb24gdGhlIHRpbWVsaW5lIG9ubHkuXG4gICAgICAgICAgdGhpcy53YXZlU3VyZmVyLmN1cnNvci5oaWRlQ3Vyc29yKCk7XG5cbiAgICAgICAgICAvLyBzZWVrIG9uIHRpbWVsaW5lLWNsaWNrXG4gICAgICAgICAgdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aW1lbGluZUNsaWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2VlZWtXaXRoVGltZWxpbmUoZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lbGluZUNsaWNraW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VlZWtXaXRoVGltZWxpbmUoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aW1lbGluZUNsaWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRUaW1lKCk7XG5cbiAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMubmV4dCgpO1xuICAgICAgICAgIHRoaXMud2F2ZVN1cmZlclJlYWR5Lm5leHQoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy53YXZlU3VyZmVyLm9uKCdlcnJvcicsIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIC8vIGNvdWxkIG5vdCBsb2FkIHRoZSBjb21wb3NpdGlvbiAtLT4gZGVsZXRlIGl0XG4gICAgICAgIC8vICh0aGlzIG1heSBvY2N1ciwgd2hlbiB0aGUgY29tcG9zaXRpb24gaGFzIGJlZW4gZGVsZXRlZCBidXQgdGhlIHByb2plY3QgaXMgbm90IHNhdmVkIGFmdGVyd2FyZHMpXG4gICAgICAgIHRoaXMuZGVsZXRlU2VsZWN0ZWRDb21wb3NpdGlvbigpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5vbignc2VlaycsICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50VGltZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5vbigncGxheScsICgpID0+IHtcbiAgICAgICAgdGhpcy5zdGFydFRpbWVVcGRhdGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy53YXZlU3VyZmVyLm9uKCdwYXVzZScsICgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9wVGltZVVwZGF0ZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLndhdmVTdXJmZXIub24oJ3JlZ2lvbi1jcmVhdGVkJywgKHJlZ2lvbikgPT4ge1xuICAgICAgICAvLyByZWdpb24gY3JlYXRlZCBieSBzZWxlY3Rpb24gb3IgcHJvZ3JhbW1hdGljYWxseVxuICAgICAgICBpZiAodGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXMgJiYgdGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKCFyZWdpb24uZGF0YS5oYW5kbGVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJlZ2lvbihyZWdpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXJlZ2lvbi5kYXRhLmhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJlZ2lvbi5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLndhdmVTdXJmZXIub24oJ3JlZ2lvbi11cGRhdGVkJywgKHJlZ2lvbjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGhleFRvUmdiKGhleDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleCk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICAgICAgPyB7XG4gICAgICAgICAgcjogcGFyc2VJbnQocmVzdWx0WzFdLCAxNiksXG4gICAgICAgICAgZzogcGFyc2VJbnQocmVzdWx0WzJdLCAxNiksXG4gICAgICAgICAgYjogcGFyc2VJbnQocmVzdWx0WzNdLCAxNiksXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUmVnaW9uU2VsZWN0aW9uKCkge1xuICAgIGlmICghdGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy53YXZlU3VyZmVyLnJlZ2lvbnMubGlzdCkpIHtcbiAgICAgIGNvbnN0IHJlZ2lvbjogYW55ID0gdGhpcy53YXZlU3VyZmVyLnJlZ2lvbnMubGlzdFtrZXldO1xuXG4gICAgICAvLyBpZiBubyBzY2VuZSBpcyBzZXQsIHRoZSByZWdpb24gaXMgbm90IHZhbGlkIChlLmcuIGhhcyBiZWVuIGNyZWF0ZWQsIHdoaWxlXG4gICAgICAvLyBubyBzY2VuZSBoYXMgYmVlbiBzZWxlY3RlZCBhbmQgcmVtb3ZlIGRpZCBub3Qgd29yayBwcm9wZXJseSlcbiAgICAgIGlmIChyZWdpb24uc2NlbmUpIHtcbiAgICAgICAgbGV0IGludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG4gICAgICAgIHJlZ2lvbi5kcmFnID0gZmFsc2U7XG4gICAgICAgIHJlZ2lvbi5yZXNpemUgPSBmYWxzZTtcbiAgICAgICAgcmVnaW9uLmF0dHJpYnV0ZXMuc2VsZWN0YWJsZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnNjZW5lU2VydmljZS5zY2VuZUlzU2VsZWN0ZWQocmVnaW9uLnNjZW5lKSkge1xuICAgICAgICAgIGludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5U2VsZWN0ZWRTY2VuZTtcbiAgICAgICAgICByZWdpb24uZHJhZyA9IHRydWU7XG4gICAgICAgICAgcmVnaW9uLnJlc2l6ZSA9IHRydWU7XG4gICAgICAgICAgcmVnaW9uLmF0dHJpYnV0ZXMuc2VsZWN0YWJsZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpb24uYXR0cmlidXRlcy5zZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gJiYgdGhpcy5zZWxlY3RlZFBsYXliYWNrUmVnaW9uID09PSByZWdpb24uc2NlbmVQbGF5YmFja1JlZ2lvbikge1xuICAgICAgICAgIGludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5SGlnaGxpZ2h0ZWQ7XG4gICAgICAgICAgcmVnaW9uLmF0dHJpYnV0ZXMuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaW9uLmNvbG9yID1cbiAgICAgICAgICAncmdiYSgnICtcbiAgICAgICAgICB0aGlzLmhleFRvUmdiKHJlZ2lvbi5zY2VuZS5jb2xvcikuciArXG4gICAgICAgICAgJywgJyArXG4gICAgICAgICAgdGhpcy5oZXhUb1JnYihyZWdpb24uc2NlbmUuY29sb3IpLmcgK1xuICAgICAgICAgICcsICcgK1xuICAgICAgICAgIHRoaXMuaGV4VG9SZ2IocmVnaW9uLnNjZW5lLmNvbG9yKS5iICtcbiAgICAgICAgICAnLCAnICtcbiAgICAgICAgICBpbnRlbnNpdHkgK1xuICAgICAgICAgICcpJztcbiAgICAgICAgcmVnaW9uLnVwZGF0ZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNlbGVjdGVkUmVnaW9uKCkge1xuICAgIGlmICghdGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLndhdmVTdXJmZXIucmVnaW9ucy5saXN0KSkge1xuICAgICAgY29uc3QgcmVnaW9uOiBhbnkgPSB0aGlzLndhdmVTdXJmZXIucmVnaW9ucy5saXN0W2tleV07XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPT09IHJlZ2lvbi5zY2VuZVBsYXliYWNrUmVnaW9uKSB7XG4gICAgICAgIHJlZ2lvbi5zdGFydCA9IHRoaXMuc2VsZWN0ZWRQbGF5YmFja1JlZ2lvbi5zdGFydE1pbGxpcyAvIDEwMDA7XG4gICAgICAgIHJlZ2lvbi5lbmQgPSB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24uZW5kTWlsbGlzIC8gMTAwMDtcbiAgICAgICAgcmVnaW9uLnVwZGF0ZVJlbmRlcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNlbGVjdGVkUmVnaW9uKHNjZW5lUGxheWJhY2tSZWdpb24/OiBTY2VuZVBsYXliYWNrUmVnaW9uKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRQbGF5YmFja1JlZ2lvbiAmJiB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPT09IHNjZW5lUGxheWJhY2tSZWdpb24pIHtcbiAgICAgIC8vIE5vIHVwZGF0ZSByZXF1aXJlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY2VuZVBsYXliYWNrUmVnaW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPSBzY2VuZVBsYXliYWNrUmVnaW9uO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUmVnaW9uU2VsZWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlZ2lvblNuYXBUb0dyaWRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyB0aGUgcmVnaW9ucyBzaG91bGQgc25hcCB0byBhIGdyaWRcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmdldFNuYXBUb0dyaWRPZmZzZXQoKSB8fCAwO1xuICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5nZXRTbmFwVG9HcmlkSW50ZXJ2YWwoKSB8fCAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh2YWx1ZSAtIG9mZnNldCkgLyBpbnRlcnZhbCkgKiBpbnRlcnZhbCArIG9mZnNldDtcbiAgfVxuXG4gIHByaXZhdGUgY29ubmVjdFJlZ2lvbih3YXZlU3VyZmVyUmVnaW9uOiBhbnksIHNjZW5lOiBTY2VuZSwgc2NlbmVQbGF5YmFja1JlZ2lvbjogU2NlbmVQbGF5YmFja1JlZ2lvbiwgcHJlc2V0PzogUHJlc2V0KSB7XG4gICAgd2F2ZVN1cmZlclJlZ2lvbi5zY2VuZVBsYXliYWNrUmVnaW9uID0gc2NlbmVQbGF5YmFja1JlZ2lvbjtcbiAgICB3YXZlU3VyZmVyUmVnaW9uLnNjZW5lID0gc2NlbmU7XG4gICAgd2F2ZVN1cmZlclJlZ2lvbi5wcmVzZXQgPSBwcmVzZXQ7XG5cbiAgICB3YXZlU3VyZmVyUmVnaW9uLm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2NlbmVTZXJ2aWNlLnNjZW5lSXNTZWxlY3RlZChzY2VuZSkpIHtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZFJlZ2lvbihzY2VuZVBsYXliYWNrUmVnaW9uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdhdmVTdXJmZXJSZWdpb24ub24oJ3VwZGF0ZScsICgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRSZWdpb24oc2NlbmVQbGF5YmFja1JlZ2lvbik7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnNuYXBUb0dyaWQpIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSByZWdpb25zIGJvdW5kYXJpZXMuIHRoZXkgbWF5IG5vdCBzbmFwIHRvIGdyaWQsIGlmIGl0IGhhcyBiZWVuXG4gICAgICAgIC8vIGRpc2FibGVkIGR1cmluZyBjcmVhdGlvbiBvZiB0aGUgcmVnaW9uIGJ1dCBhY3RpdmF0ZWQgYWZ0ZXJ3YXJkcy5cbiAgICAgICAgd2F2ZVN1cmZlclJlZ2lvbi5zdGFydCA9IHRoaXMuZ2V0UmVnaW9uU25hcFRvR3JpZFZhbHVlKHdhdmVTdXJmZXJSZWdpb24uc3RhcnQpO1xuICAgICAgICB3YXZlU3VyZmVyUmVnaW9uLmVuZCA9IHRoaXMuZ2V0UmVnaW9uU25hcFRvR3JpZFZhbHVlKHdhdmVTdXJmZXJSZWdpb24uZW5kKTtcbiAgICAgIH1cbiAgICAgIHNjZW5lUGxheWJhY2tSZWdpb24uc3RhcnRNaWxsaXMgPSB3YXZlU3VyZmVyUmVnaW9uLnN0YXJ0ICogMTAwMDtcbiAgICAgIHNjZW5lUGxheWJhY2tSZWdpb24uZW5kTWlsbGlzID0gd2F2ZVN1cmZlclJlZ2lvbi5lbmQgKiAxMDAwO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3UmVnaW9uKHNjZW5lUGxheWJhY2tSZWdpb246IFNjZW5lUGxheWJhY2tSZWdpb24sIHNjZW5lOiBTY2VuZSkge1xuICAgIC8vIGRyYXcgdGhlIHJlZ2lvbnMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzY2VuZVxuICAgIGlmICghdGhpcy5pc1dhdmVTdXJmZXJSZWFkeSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBwbGF5YmFjayByZWdpb25cbiAgICBjb25zdCB3YXZlU3VyZmVyUmVnaW9uID0gdGhpcy53YXZlU3VyZmVyLmFkZFJlZ2lvbih7XG4gICAgICBzdGFydDogc2NlbmVQbGF5YmFja1JlZ2lvbi5zdGFydE1pbGxpcyAvIDEwMDAsXG4gICAgICBlbmQ6IHNjZW5lUGxheWJhY2tSZWdpb24uZW5kTWlsbGlzIC8gMTAwMCxcbiAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICBkYXRhOiB7IGhhbmRsZWQ6IHRydWUgfSxcbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3RSZWdpb24od2F2ZVN1cmZlclJlZ2lvbiwgc2NlbmUsIHNjZW5lUGxheWJhY2tSZWdpb24pO1xuXG4gICAgLy8gVE9ETyBzaG93IHRoZSBhbGwgcHJlc2V0c1xuICAgIC8vIGZvciAobGV0IHByZXNldFV1aWQgb2Ygc2NlbmUucHJlc2V0VXVpZHMpIHtcbiAgICAvLyAgIGNvbnN0IHByZXNldCA9IHRoaXMucHJlc2V0U2VydmljZS5nZXRQcmVzZXRCeVV1aWQocHJlc2V0VXVpZCk7XG5cbiAgICAvLyAgIGxldCB3YXZlU3VyZmVyUmVnaW9uID0gdGhpcy50aW1lbGluZVNlcnZpY2Uud2F2ZVN1cmZlci5hZGRSZWdpb24oe1xuICAgIC8vICAgICBzdGFydDogKHNjZW5lUGxheWJhY2tSZWdpb24uc3RhcnRNaWxsaXMgKyAocHJlc2V0LnN0YXJ0TWlsbGlzID8gcHJlc2V0LnN0YXJ0TWlsbGlzIDogMCkpIC8gMTAwMCxcbiAgICAvLyAgICAgZW5kOiAoc2NlbmVQbGF5YmFja1JlZ2lvbi5zdGFydE1pbGxpc1xuICAgIC8vICAgICAgICsgKHByZXNldC5lbmRNaWxsaXMgPyBwcmVzZXQuZW5kTWlsbGlzIDogc2NlbmVQbGF5YmFja1JlZ2lvbi5lbmRNaWxsaXMgLSBzY2VuZVBsYXliYWNrUmVnaW9uLnN0YXJ0TWlsbGlzKSkgLyAxMDAwLFxuICAgIC8vICAgICBjb2xvcjogJyNmZmYnLFxuICAgIC8vICAgICBkYXRhOiB7IGhhbmRsZWQ6IHRydWUgfSxcbiAgICAvLyAgICAgLy8gVE9ET1xuICAgIC8vICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgLy8gICAgICAgcHJlc2V0OiB0cnVlLFxuICAgIC8vICAgICAgIG5hbWU6ICdQcmVzZXQgMSdcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLmNvbm5lY3RSZWdpb24od2F2ZVN1cmZlclJlZ2lvbiwgc2NlbmUsIHNjZW5lUGxheWJhY2tSZWdpb24sIHByZXNldCk7XG4gICAgLy8gfVxuXG4gICAgdGhpcy51cGRhdGVSZWdpb25TZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHJlbW92ZVJlZ2lvbigpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRQbGF5YmFja1JlZ2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9uc1tpXSA9PT0gdGhpcy5zZWxlY3RlZFBsYXliYWNrUmVnaW9uKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgcmVnaW9uIGZyb20gd2F2ZXN1cmZlclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLndhdmVTdXJmZXIucmVnaW9ucy5saXN0KSkge1xuICAgICAgICAgIGNvbnN0IHJlZ2lvbjogYW55ID0gdGhpcy53YXZlU3VyZmVyLnJlZ2lvbnMubGlzdFtrZXldO1xuXG4gICAgICAgICAgaWYgKHJlZ2lvbi5zY2VuZVBsYXliYWNrUmVnaW9uID09PSB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24pIHtcbiAgICAgICAgICAgIHJlZ2lvbi5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9ucy5zcGxpY2UoaSwgMSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICB9XG5cbiAgZ2V0UHJlc2V0c0luVGltZSh0aW1lTWlsbGlzOiBudW1iZXIpOiBQcmVzZXRSZWdpb25TY2VuZVtdIHtcbiAgICAvLyBSZXR1cm4gYWxsIHByZXNldHMgd2hpY2ggc2hvdWxkIGJlIGFjdGl2ZSBkdXJpbmcgdGhlIHNwZWNpZmllZCB0aW1lXG4gICAgY29uc3QgYWN0aXZlUHJlc2V0czogUHJlc2V0UmVnaW9uU2NlbmVbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgc2NlbmVJbmRleCA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXMubGVuZ3RoIC0gMTsgc2NlbmVJbmRleCA+PSAwOyBzY2VuZUluZGV4LS0pIHtcbiAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNjZW5lc1tzY2VuZUluZGV4XTtcblxuICAgICAgZm9yIChjb25zdCByZWdpb24gb2YgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnNjZW5lUGxheWJhY2tSZWdpb25zKSB7XG4gICAgICAgIGlmIChyZWdpb24uc2NlbmVVdWlkID09PSBzY2VuZS51dWlkKSB7XG4gICAgICAgICAgZm9yIChsZXQgcHJlc2V0SW5kZXggPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0cy5sZW5ndGggLSAxOyBwcmVzZXRJbmRleCA+PSAwOyBwcmVzZXRJbmRleC0tKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByZXNldFV1aWQgb2Ygc2NlbmUucHJlc2V0VXVpZHMpIHtcbiAgICAgICAgICAgICAgaWYgKHByZXNldFV1aWQgPT09IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzW3ByZXNldEluZGV4XS51dWlkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlc2V0ID0gdGhpcy5wcmVzZXRTZXJ2aWNlLmdldFByZXNldEJ5VXVpZChwcmVzZXRVdWlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChwcmVzZXQpIHtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVzZXRTdGFydE1pbGxpcyA9IHByZXNldC5zdGFydE1pbGxpcyA9PT0gdW5kZWZpbmVkID8gcmVnaW9uLnN0YXJ0TWlsbGlzIDogcmVnaW9uLnN0YXJ0TWlsbGlzICsgcHJlc2V0LnN0YXJ0TWlsbGlzO1xuICAgICAgICAgICAgICAgICAgbGV0IHByZXNldEVuZE1pbGxpcyA9IHByZXNldC5lbmRNaWxsaXMgPT09IHVuZGVmaW5lZCA/IHJlZ2lvbi5lbmRNaWxsaXMgOiByZWdpb24uc3RhcnRNaWxsaXMgKyBwcmVzZXQuZW5kTWlsbGlzO1xuXG4gICAgICAgICAgICAgICAgICAvLyBleHRlbmQgdGhlIHJ1bm5pbmcgdGltZSwgaWYgZmFkaW5nIGlzIGRvbmUgb3V0c2lkZSB0aGUgYm91bmRhcmllc1xuICAgICAgICAgICAgICAgICAgcHJlc2V0U3RhcnRNaWxsaXMgLT0gcHJlc2V0LmZhZGVJblByZSA/IHByZXNldC5mYWRlSW5NaWxsaXMgOiAwO1xuICAgICAgICAgICAgICAgICAgcHJlc2V0RW5kTWlsbGlzICs9IHByZXNldC5mYWRlT3V0UG9zdCA/IHByZXNldC5mYWRlT3V0TWlsbGlzIDogMDtcblxuICAgICAgICAgICAgICAgICAgaWYgKHByZXNldFN0YXJ0TWlsbGlzIDw9IHRpbWVNaWxsaXMgJiYgcHJlc2V0RW5kTWlsbGlzID49IHRpbWVNaWxsaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlUHJlc2V0cy5wdXNoKG5ldyBQcmVzZXRSZWdpb25TY2VuZShwcmVzZXQsIHJlZ2lvbiwgc2NlbmUpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aXZlUHJlc2V0cztcbiAgfVxuXG4gIGRyYXdBbGxSZWdpb25zKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZHJhdyB0aGUgcmVnaW9ucyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVpciBjb3JyZXNwb25kaW5nIHNjZW5lcywgYnV0IGRyYXdcbiAgICAvLyB0aGUgc2VsZWN0ZWQgb25lcyBsYXN0LCB0byBtYWtlIHN1cmUgdGhleSdyZSBhbHdheXMgY2xpY2thYmxlLlxuICAgIGZvciAobGV0IHNjZW5lSW5kZXggPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzLmxlbmd0aCAtIDE7IHNjZW5lSW5kZXggPj0gMDsgc2NlbmVJbmRleC0tKSB7XG4gICAgICBjb25zdCBzY2VuZSA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXNbc2NlbmVJbmRleF07XG4gICAgICBpZiAoIXRoaXMuc2NlbmVTZXJ2aWNlLnNjZW5lSXNTZWxlY3RlZChzY2VuZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBzY2VuZVBsYXliYWNrUmVnaW9uIG9mIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9ucykge1xuICAgICAgICAgIGlmIChzY2VuZVBsYXliYWNrUmVnaW9uLnNjZW5lVXVpZCA9PT0gc2NlbmUudXVpZCkge1xuICAgICAgICAgICAgdGhpcy5kcmF3UmVnaW9uKHNjZW5lUGxheWJhY2tSZWdpb24sIHNjZW5lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkcmF3IGFsbCBzZWxlY3RlZCBzY2VuZXMgYWZ0ZXJ3YXJkc1xuICAgIGZvciAobGV0IHNjZW5lSW5kZXggPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzLmxlbmd0aCAtIDE7IHNjZW5lSW5kZXggPj0gMDsgc2NlbmVJbmRleC0tKSB7XG4gICAgICBjb25zdCBzY2VuZSA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXNbc2NlbmVJbmRleF07XG5cbiAgICAgIGlmICh0aGlzLnNjZW5lU2VydmljZS5zY2VuZUlzU2VsZWN0ZWQoc2NlbmUpKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NlbmVQbGF5YmFja1JlZ2lvbiBvZiB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uc2NlbmVQbGF5YmFja1JlZ2lvbnMpIHtcbiAgICAgICAgICBpZiAoc2NlbmVQbGF5YmFja1JlZ2lvbi5zY2VuZVV1aWQgPT09IHNjZW5lLnV1aWQpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd1JlZ2lvbihzY2VuZVBsYXliYWNrUmVnaW9uLCBzY2VuZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlR3JpZCgpIHtcbiAgICBpZiAodGhpcy53YXZlU3VyZmVyUmVhZHkpIHtcbiAgICAgIHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS5wYXJhbXMub2Zmc2V0ID0gdGhpcy5nZXRTbmFwVG9HcmlkT2Zmc2V0KCk7XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5yZWdpb25zLnBhcmFtcy5zbmFwVG9HcmlkSW50ZXJ2YWwgPSB0aGlzLmdldFNuYXBUb0dyaWRJbnRlcnZhbCgpO1xuICAgICAgdGhpcy53YXZlU3VyZmVyLnJlZ2lvbnMucGFyYW1zLnNuYXBUb0dyaWRPZmZzZXQgPSB0aGlzLmdldFNuYXBUb0dyaWRPZmZzZXQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDdXJyZW50VGltZSgpO1xuICB9XG5cbiAgZ2V0RXh0ZXJuYWxDb21wb3NpdGlvbk5hbWVzKCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICAvLyBnZXQgYXZhaWxhYmxlIGNvbXBvc2l0aW9ucyBmcm9tIGFuIGV4dGVybmFsIHBvb2wgKGUuZy4gUm9ja2V0IFNob3cpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ2NvbXBvc2l0aW9uL2xpc3QnKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZTogb2JqZWN0W10pID0+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25OYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlQ29tcG9zaXRpb24gb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgICBjb21wb3NpdGlvbk5hbWVzLnB1c2goKHJlc3BvbnNlQ29tcG9zaXRpb24gYXMgYW55KS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbk5hbWVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2VsZWN0Q29tcG9zaXRpb25JbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmNvbXBvc2l0aW9uc1tpbmRleF07XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2VsZWN0ZWRDb21wb3NpdGlvblV1aWQgPSB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24udXVpZDtcbiAgICB0aGlzLmNyZWF0ZVdhdmVTdXJmZXIoKTtcblxuICAgIC8vIHJlcXVpcmVkIHRvIHRyaWdnZXIgdGltZWxpbmUuY29tcG9uZW50LnJlc2l6ZSgpXG4gICAgdGhpcy53YXZlU3VyZmVyUmVhZHkubmV4dCgpO1xuXG4gICAgdGhpcy5hcHBseVpvb20oMCk7XG4gIH1cbn1cbiJdfQ==