@rocketshow/designer 1.31.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 -9947
  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.31.0.tgz +0 -0
  338. package/rocketshow-designer.d.ts +0 -60
  339. package/rocketshow-designer.metadata.json +0 -1
@@ -1,144 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { Injectable } from '@angular/core';
3
- import { Subject } from 'rxjs';
4
- import { ConfigService } from './config.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./config.service";
7
- let IntroService = class IntroService {
8
- constructor(configService) {
9
- this.configService = configService;
10
- this.showIntro = false;
11
- this.activeStep = 'start';
12
- this.positionTopPercentage = 50;
13
- this.positionLeftPercentage = 50;
14
- this.stylePosition = 'top: calc(50% - 150px); left: calc(50% - 200px);';
15
- this.stepChanged = new Subject();
16
- }
17
- refresh() {
18
- // called, as soon as the config has been updated
19
- if (this.configService.intro) {
20
- if (localStorage.getItem('showIntro')) {
21
- this.showIntro = localStorage.getItem('showIntro') === 'true';
22
- }
23
- else {
24
- this.showIntro = true;
25
- }
26
- }
27
- }
28
- setShowIntro(value) {
29
- this.showIntro = value;
30
- if (value) {
31
- localStorage.setItem('showIntro', 'true');
32
- }
33
- else {
34
- localStorage.setItem('showIntro', 'false');
35
- }
36
- this.stepChanged.next();
37
- }
38
- reset() {
39
- this.activeStep = 'start';
40
- this.setShowIntro(true);
41
- this.stepChanged.next();
42
- }
43
- showStep(step) {
44
- if (!this.showIntro) {
45
- return false;
46
- }
47
- if (this.activeStep !== step) {
48
- return false;
49
- }
50
- return true;
51
- }
52
- next() {
53
- switch (this.activeStep) {
54
- case 'start':
55
- this.activeStep = 'preview';
56
- this.positionTopPercentage = 60;
57
- this.positionLeftPercentage = 40;
58
- break;
59
- case 'preview':
60
- this.activeStep = 'fixtures';
61
- this.positionTopPercentage = 40;
62
- this.positionLeftPercentage = 30;
63
- break;
64
- case 'fixtures':
65
- this.activeStep = 'presets';
66
- this.positionTopPercentage = 30;
67
- this.positionLeftPercentage = 50;
68
- break;
69
- case 'presets':
70
- this.activeStep = 'capabilities';
71
- this.positionTopPercentage = 50;
72
- this.positionLeftPercentage = 60;
73
- break;
74
- case 'capabilities':
75
- this.activeStep = 'scenes';
76
- this.positionTopPercentage = 50;
77
- this.positionLeftPercentage = 40;
78
- break;
79
- case 'scenes':
80
- this.activeStep = 'timeline';
81
- this.positionTopPercentage = 40;
82
- this.positionLeftPercentage = 50;
83
- break;
84
- case 'timeline':
85
- this.activeStep = 'finish';
86
- this.positionTopPercentage = 50;
87
- this.positionLeftPercentage = 50;
88
- break;
89
- }
90
- this.stepChanged.next();
91
- }
92
- back() {
93
- switch (this.activeStep) {
94
- case 'preview':
95
- this.activeStep = 'start';
96
- this.positionTopPercentage = 50;
97
- this.positionLeftPercentage = 50;
98
- break;
99
- case 'fixtures':
100
- this.activeStep = 'preview';
101
- this.positionTopPercentage = 60;
102
- this.positionLeftPercentage = 40;
103
- break;
104
- case 'presets':
105
- this.activeStep = 'fixtures';
106
- this.positionTopPercentage = 30;
107
- this.positionLeftPercentage = 50;
108
- break;
109
- case 'capabilities':
110
- this.activeStep = 'presets';
111
- this.positionTopPercentage = 40;
112
- this.positionLeftPercentage = 30;
113
- break;
114
- case 'scenes':
115
- this.activeStep = 'capabilities';
116
- this.positionTopPercentage = 50;
117
- this.positionLeftPercentage = 60;
118
- break;
119
- case 'timeline':
120
- this.activeStep = 'scenes';
121
- this.positionTopPercentage = 50;
122
- this.positionLeftPercentage = 40;
123
- break;
124
- case 'finish':
125
- this.activeStep = 'timeline';
126
- this.positionTopPercentage = 40;
127
- this.positionLeftPercentage = 50;
128
- break;
129
- }
130
- this.stepChanged.next();
131
- }
132
- };
133
- IntroService.ctorParameters = () => [
134
- { type: ConfigService }
135
- ];
136
- IntroService.ɵprov = i0.ɵɵdefineInjectable({ factory: function IntroService_Factory() { return new IntroService(i0.ɵɵinject(i1.ConfigService)); }, token: IntroService, providedIn: "root" });
137
- IntroService = __decorate([
138
- Injectable({
139
- providedIn: 'root',
140
- }),
141
- __metadata("design:paramtypes", [ConfigService])
142
- ], IntroService);
143
- export { IntroService };
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm8uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Byb2NrZXRzaG93L2Rlc2lnbmVyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2ludHJvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQUtqRCxJQUFhLFlBQVksR0FBekIsTUFBYSxZQUFZO0lBUXZCLFlBQW9CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBUGhELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZUFBVSxHQUFHLE9BQU8sQ0FBQztRQUNyQiwwQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDM0IsMkJBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLGtCQUFhLEdBQUcsa0RBQWtELENBQUM7UUFDbkUsZ0JBQVcsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVFLENBQUM7SUFFcEQsT0FBTztRQUNMLGlEQUFpRDtRQUNqRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFO1lBQzVCLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLE1BQU0sQ0FBQzthQUMvRDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzthQUN2QjtTQUNGO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFjO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksS0FBSyxFQUFFO1lBQ1QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUs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QztxQ0FTbUMsYUFBYTtHQVJyQyxZQUFZLENBb0l4QjtTQXBJWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY29uZmlnLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgSW50cm9TZXJ2aWNlIHtcbiAgc2hvd0ludHJvID0gZmFsc2U7XG4gIGFjdGl2ZVN0ZXAgPSAnc3RhcnQnO1xuICBwb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSA1MDtcbiAgcG9zaXRpb25MZWZ0UGVyY2VudGFnZSA9IDUwO1xuICBzdHlsZVBvc2l0aW9uID0gJ3RvcDogY2FsYyg1MCUgLSAxNTBweCk7IGxlZnQ6IGNhbGMoNTAlIC0gMjAwcHgpOyc7XG4gIHN0ZXBDaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UpIHt9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICAvLyBjYWxsZWQsIGFzIHNvb24gYXMgdGhlIGNvbmZpZyBoYXMgYmVlbiB1cGRhdGVkXG4gICAgaWYgKHRoaXMuY29uZmlnU2VydmljZS5pbnRybykge1xuICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaG93SW50cm8nKSkge1xuICAgICAgICB0aGlzLnNob3dJbnRybyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaG93SW50cm8nKSA9PT0gJ3RydWUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93SW50cm8gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFNob3dJbnRybyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd0ludHJvID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2hvd0ludHJvJywgJ3RydWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nob3dJbnRybycsICdmYWxzZScpO1xuICAgIH1cbiAgICB0aGlzLnN0ZXBDaGFuZ2VkLm5leHQoKTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuYWN0aXZlU3RlcCA9ICdzdGFydCc7XG4gICAgdGhpcy5zZXRTaG93SW50cm8odHJ1ZSk7XG4gICAgdGhpcy5zdGVwQ2hhbmdlZC5uZXh0KCk7XG4gIH1cblxuICBzaG93U3RlcChzdGVwOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2hvd0ludHJvKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RlcCAhPT0gc3RlcCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbmV4dCgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlU3RlcCkge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAncHJldmlldyc7XG4gICAgICAgIHRoaXMucG9zaXRpb25Ub3BQZXJjZW50YWdlID0gNjA7XG4gICAgICAgIHRoaXMucG9zaXRpb25MZWZ0UGVyY2VudGFnZSA9IDQwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ByZXZpZXcnOlxuICAgICAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAnZml4dHVyZXMnO1xuICAgICAgICB0aGlzLnBvc2l0aW9uVG9wUGVyY2VudGFnZSA9IDQwO1xuICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFBlcmNlbnRhZ2UgPSAzMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaXh0dXJlcyc6XG4gICAgICAgIHRoaXMuYWN0aXZlU3RlcCA9ICdwcmVzZXRzJztcbiAgICAgICAgdGhpcy5wb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSAzMDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxlZnRQZXJjZW50YWdlID0gNTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHJlc2V0cyc6XG4gICAgICAgIHRoaXMuYWN0aXZlU3RlcCA9ICdjYXBhYmlsaXRpZXMnO1xuICAgICAgICB0aGlzLnBvc2l0aW9uVG9wUGVyY2VudGFnZSA9IDUwO1xuICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFBlcmNlbnRhZ2UgPSA2MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjYXBhYmlsaXRpZXMnOlxuICAgICAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAnc2NlbmVzJztcbiAgICAgICAgdGhpcy5wb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSA1MDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxlZnRQZXJjZW50YWdlID0gNDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2NlbmVzJzpcbiAgICAgICAgdGhpcy5hY3RpdmVTdGVwID0gJ3RpbWVsaW5lJztcbiAgICAgICAgdGhpcy5wb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSA0MDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxlZnRQZXJjZW50YWdlID0gNTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGltZWxpbmUnOlxuICAgICAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAnZmluaXNoJztcbiAgICAgICAgdGhpcy5wb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSA1MDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxlZnRQZXJjZW50YWdlID0gNTA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuc3RlcENoYW5nZWQubmV4dCgpO1xuICB9XG5cbiAgYmFjaygpIHtcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlU3RlcCkge1xuICAgICAgY2FzZSAncHJldmlldyc6XG4gICAgICAgIHRoaXMuYWN0aXZlU3RlcCA9ICdzdGFydCc7XG4gICAgICAgIHRoaXMucG9zaXRpb25Ub3BQZXJjZW50YWdlID0gNTA7XG4gICAgICAgIHRoaXMucG9zaXRpb25MZWZ0UGVyY2VudGFnZSA9IDUwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpeHR1cmVzJzpcbiAgICAgICAgdGhpcy5hY3RpdmVTdGVwID0gJ3ByZXZpZXcnO1xuICAgICAgICB0aGlzLnBvc2l0aW9uVG9wUGVyY2VudGFnZSA9IDYwO1xuICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFBlcmNlbnRhZ2UgPSA0MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwcmVzZXRzJzpcbiAgICAgICAgdGhpcy5hY3RpdmVTdGVwID0gJ2ZpeHR1cmVzJztcbiAgICAgICAgdGhpcy5wb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSAzMDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxlZnRQZXJjZW50YWdlID0gNTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2FwYWJpbGl0aWVzJzpcbiAgICAgICAgdGhpcy5hY3RpdmVTdGVwID0gJ3ByZXNldHMnO1xuICAgICAgICB0aGlzLnBvc2l0aW9uVG9wUGVyY2VudGFnZSA9IDQwO1xuICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFBlcmNlbnRhZ2UgPSAzMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzY2VuZXMnOlxuICAgICAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAnY2FwYWJpbGl0aWVzJztcbiAgICAgICAgdGhpcy5wb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSA1MDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxlZnRQZXJjZW50YWdlID0gNjA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGltZWxpbmUnOlxuICAgICAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAnc2NlbmVzJztcbiAgICAgICAgdGhpcy5wb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSA1MDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxlZnRQZXJjZW50YWdlID0gNDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmluaXNoJzpcbiAgICAgICAgdGhpcy5hY3RpdmVTdGVwID0gJ3RpbWVsaW5lJztcbiAgICAgICAgdGhpcy5wb3NpdGlvblRvcFBlcmNlbnRhZ2UgPSA0MDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxlZnRQZXJjZW50YWdlID0gNTA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuc3RlcENoYW5nZWQubmV4dCgpO1xuICB9XG59XG4iXX0=
@@ -1,416 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { HttpClient } from '@angular/common/http';
3
- import { Injectable } from '@angular/core';
4
- import { Subject } from 'rxjs';
5
- import { FixtureCapabilityColor, FixtureCapabilityType } from '../models/fixture-capability';
6
- import { FixtureCapabilityValue } from '../models/fixture-capability-value';
7
- import { FixtureChannelValue } from '../models/fixture-channel-value';
8
- import { Preset } from '../models/preset';
9
- import { AnimationService } from './animation.service';
10
- import { ConfigService } from './config.service';
11
- import { EffectService } from './effect.service';
12
- import { FixtureService } from './fixture.service';
13
- import { ProjectService } from './project.service';
14
- import { UuidService } from './uuid.service';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "./effect.service";
17
- import * as i2 from "./uuid.service";
18
- import * as i3 from "./project.service";
19
- import * as i4 from "./fixture.service";
20
- import * as i5 from "./config.service";
21
- import * as i6 from "@angular/common/http";
22
- import * as i7 from "./animation.service";
23
- let PresetService = class PresetService {
24
- constructor(effectService, uuidService, projectService, fixtureService, configService, http, animationService) {
25
- this.effectService = effectService;
26
- this.uuidService = uuidService;
27
- this.projectService = projectService;
28
- this.fixtureService = fixtureService;
29
- this.configService = configService;
30
- this.http = http;
31
- this.animationService = animationService;
32
- // fires, when the current preview element has changed (scene/preset)
33
- this.previewSelectionChanged = new Subject();
34
- // fires, when the fixture selection has changed
35
- this.fixtureSelectionChanged = new Subject();
36
- // fires, when the fixture selection has changed for settings
37
- this.fixtureSelectionSettingsChanged = new Subject();
38
- // fires, when the selected color has changed. This is required,
39
- // because detectChanges is not enough to trigger different components.
40
- this.fixtureColorChanged = new Subject();
41
- this.liveChangePending = false;
42
- }
43
- getPresetByUuid(uuid) {
44
- for (const preset of this.projectService.project.presets) {
45
- if (preset.uuid === uuid) {
46
- return preset;
47
- }
48
- }
49
- }
50
- fixtureIsSelected(fixture, preset) {
51
- // is the passed fixture selected in the passed/currently selected preset?
52
- if (!preset) {
53
- if (this.selectedPreset) {
54
- preset = this.selectedPreset;
55
- }
56
- else {
57
- return false;
58
- }
59
- }
60
- for (const selectedFixtureUuid of preset.fixtureUuids) {
61
- if (selectedFixtureUuid === fixture.uuid) {
62
- return true;
63
- }
64
- }
65
- return false;
66
- }
67
- switchFixtureSelection(fixture) {
68
- if (!this.selectedPreset) {
69
- return;
70
- }
71
- // select all fixtures at the specified start channel or unselect them,
72
- // if already selected
73
- if (this.fixtureIsSelected(fixture)) {
74
- for (let i = this.selectedPreset.fixtureUuids.length - 1; i >= 0; i--) {
75
- const projectFixture = this.fixtureService.getFixtureByUuid(this.selectedPreset.fixtureUuids[i]);
76
- if (projectFixture.dmxFirstChannel === fixture.dmxFirstChannel) {
77
- this.selectedPreset.fixtureUuids.splice(i, 1);
78
- }
79
- }
80
- }
81
- else {
82
- for (const projectFixture of this.projectService.project.fixtures) {
83
- if (projectFixture.dmxFirstChannel === fixture.dmxFirstChannel) {
84
- this.selectedPreset.fixtureUuids.push(projectFixture.uuid);
85
- }
86
- }
87
- }
88
- }
89
- selectAllFixtures() {
90
- if (!this.selectedPreset) {
91
- return;
92
- }
93
- for (const fixture of this.projectService.project.fixtures) {
94
- if (!this.fixtureIsSelected(fixture)) {
95
- this.selectedPreset.fixtureUuids.push(fixture.uuid);
96
- }
97
- }
98
- }
99
- selectNoFixtures() {
100
- if (!this.selectedPreset) {
101
- return;
102
- }
103
- this.selectedPreset.fixtureUuids = [];
104
- }
105
- removeDeletedFixtures() {
106
- // after changing the configuration in the fixture pool, we might need to
107
- // delete some fixtures
108
- for (const preset of this.projectService.project.presets) {
109
- for (let i = preset.fixtureUuids.length - 1; i >= 0; i--) {
110
- const presetFixture = this.fixtureService.getFixtureByUuid(preset.fixtureUuids[i]);
111
- if (!presetFixture) {
112
- preset.fixtureUuids.splice(i, 1);
113
- }
114
- }
115
- }
116
- }
117
- updateFixtureSelection() {
118
- // after changing the configuration in the fixture pool, we might need to
119
- // select some more fixtures on the same channel as already selected ones
120
- for (const preset of this.projectService.project.presets) {
121
- for (let i = preset.fixtureUuids.length - 1; i >= 0; i--) {
122
- const presetFixture = this.fixtureService.getFixtureByUuid(preset.fixtureUuids[i]);
123
- for (const projectFixture of this.projectService.project.fixtures) {
124
- if (projectFixture.dmxFirstChannel === presetFixture.dmxFirstChannel && !this.fixtureIsSelected(projectFixture, preset)) {
125
- preset.fixtureUuids.push(projectFixture.uuid);
126
- }
127
- }
128
- }
129
- }
130
- }
131
- deleteCapabilityValue(preset, capabilityType, color, wheel, profileUuid) {
132
- for (let i = 0; i < preset.fixtureCapabilityValues.length; i++) {
133
- if (this.fixtureService.capabilitiesMatch(preset.fixtureCapabilityValues[i].type, capabilityType, preset.fixtureCapabilityValues[i].color, color, preset.fixtureCapabilityValues[i].wheel, wheel, preset.fixtureCapabilityValues[i].profileUuid, profileUuid)) {
134
- preset.fixtureCapabilityValues.splice(i, 1);
135
- return;
136
- }
137
- }
138
- }
139
- setCapabilityValue(preset, capabilityType, valuePercentage, slotNumber, color, wheel, profileUuid) {
140
- // Delete existant properties with this type and set the new value
141
- this.deleteCapabilityValue(preset, capabilityType, color, wheel, profileUuid);
142
- const fixtureCapabilityValue = new FixtureCapabilityValue();
143
- fixtureCapabilityValue.type = capabilityType;
144
- fixtureCapabilityValue.color = color;
145
- fixtureCapabilityValue.wheel = wheel;
146
- fixtureCapabilityValue.valuePercentage = valuePercentage;
147
- fixtureCapabilityValue.slotNumber = slotNumber;
148
- fixtureCapabilityValue.profileUuid = profileUuid;
149
- preset.fixtureCapabilityValues.push(fixtureCapabilityValue);
150
- }
151
- getCapabilityValue(preset, capabilityType, color, wheel, profileUuid) {
152
- for (const capabilityValue of preset.fixtureCapabilityValues) {
153
- if (this.fixtureService.capabilitiesMatch(capabilityValue.type, capabilityType, capabilityValue.color, color, capabilityValue.wheel, wheel, capabilityValue.profileUuid, profileUuid)) {
154
- return capabilityValue;
155
- }
156
- }
157
- return undefined;
158
- }
159
- deleteChannelValue(channelName, profileUuid) {
160
- for (let i = 0; i < this.selectedPreset.fixtureChannelValues.length; i++) {
161
- if (this.selectedPreset.fixtureChannelValues[i].channelName === channelName &&
162
- this.selectedPreset.fixtureChannelValues[i].profileUuid === profileUuid) {
163
- this.selectedPreset.fixtureChannelValues.splice(i, 1);
164
- return;
165
- }
166
- }
167
- }
168
- setChannelValue(channelName, profileUuid, value) {
169
- // Delete existant properties with this type and set the new value
170
- this.deleteChannelValue(channelName, profileUuid);
171
- const fixtureChannelValue = new FixtureChannelValue();
172
- fixtureChannelValue.channelName = channelName;
173
- fixtureChannelValue.profileUuid = profileUuid;
174
- fixtureChannelValue.value = value;
175
- this.selectedPreset.fixtureChannelValues.push(fixtureChannelValue);
176
- }
177
- getChannelValue(channelName, profileUuid) {
178
- for (const channelValue of this.selectedPreset.fixtureChannelValues) {
179
- if (channelValue.channelName === channelName && channelValue.profileUuid === profileUuid) {
180
- return channelValue.value;
181
- }
182
- }
183
- }
184
- getApproximatedColorWheelCapability(preset, cachedChannel) {
185
- // return an approximated wheel slot channel capability, if a color or a slot on a different
186
- // wheel has been selected
187
- let colorRed;
188
- let colorGreen;
189
- let colorBlue;
190
- let lowestDiff = Number.MAX_VALUE;
191
- let lowestDiffCapability;
192
- let capabilityValue;
193
- capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Red);
194
- if (capabilityValue) {
195
- colorRed = 255 * capabilityValue.valuePercentage;
196
- }
197
- capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Green);
198
- if (capabilityValue) {
199
- colorGreen = 255 * capabilityValue.valuePercentage;
200
- }
201
- capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Blue);
202
- if (capabilityValue) {
203
- colorBlue = 255 * capabilityValue.valuePercentage;
204
- }
205
- if (!colorRed && !colorGreen && !colorBlue) {
206
- // no color found -> search the first color wheel
207
- // TODO
208
- }
209
- if (colorRed !== undefined && colorGreen !== undefined && colorBlue !== undefined) {
210
- for (const capability of cachedChannel.capabilities) {
211
- if (capability.capability.slotNumber) {
212
- const mixedColor = this.fixtureService.getMixedWheelSlotColor(capability.wheel, capability.capability.slotNumber);
213
- if (mixedColor) {
214
- const diff = Math.abs(mixedColor.red - colorRed) + Math.abs(mixedColor.green - colorGreen) + Math.abs(mixedColor.blue - colorBlue);
215
- if (diff < lowestDiff) {
216
- lowestDiff = diff;
217
- lowestDiffCapability = capability;
218
- }
219
- }
220
- }
221
- }
222
- }
223
- return lowestDiffCapability;
224
- }
225
- hasCapabilityType(type) {
226
- // there is at least one channel with at least one intensity capability
227
- for (const fixtureUuid of this.selectedPreset.fixtureUuids) {
228
- const fixture = this.fixtureService.getCachedFixtureByUuid(fixtureUuid);
229
- for (const channel of fixture.channels) {
230
- if (channel.channel) {
231
- for (const capability of channel.capabilities) {
232
- if (capability.capability.type === type) {
233
- return true;
234
- }
235
- }
236
- }
237
- }
238
- }
239
- return false;
240
- }
241
- hasCapabilityDimmer() {
242
- return this.hasCapabilityType(FixtureCapabilityType.Intensity);
243
- }
244
- hasCapabilityColor() {
245
- // TODO optionally color temperature and color white (see stairville/mh-100)
246
- // one of the profiles has a color intensity
247
- if (this.hasCapabilityType(FixtureCapabilityType.ColorIntensity)) {
248
- return true;
249
- }
250
- return false;
251
- }
252
- hasCapabilityColorOrColorWheel() {
253
- // TODO optionally color temperature and color white (see stairville/mh-100)
254
- // one of the profiles has a color intensity
255
- if (this.hasCapabilityColor()) {
256
- return true;
257
- }
258
- // a color wheel is involved
259
- for (const fixtureUuid of this.selectedPreset.fixtureUuids) {
260
- const fixture = this.fixtureService.getCachedFixtureByUuid(fixtureUuid);
261
- for (const channel of fixture.channels) {
262
- if (channel.colorWheel) {
263
- return true;
264
- }
265
- }
266
- }
267
- return false;
268
- }
269
- hasCapabilityPanTilt() {
270
- let hasPan = false;
271
- let hasTilt = false;
272
- // there is at least one pan and one tilt channel
273
- if (this.hasCapabilityType(FixtureCapabilityType.Pan)) {
274
- hasPan = true;
275
- }
276
- if (this.hasCapabilityType(FixtureCapabilityType.Tilt)) {
277
- hasTilt = true;
278
- }
279
- if (hasPan && hasTilt) {
280
- return true;
281
- }
282
- return false;
283
- }
284
- selectPreset(index) {
285
- this.effectService.selectedEffect = undefined;
286
- this.selectedPreset = this.projectService.project.presets[index];
287
- this.projectService.project.selectedPresetUuid = this.projectService.project.presets[index].uuid;
288
- this.autoOpenFirstEffect();
289
- this.previewSelectionChanged.next();
290
- this.previewLive();
291
- }
292
- autoOpenFirstEffect() {
293
- // open the first effect, if the preset only has one
294
- if (this.selectedPreset && this.selectedPreset.effects.length === 1) {
295
- this.effectService.selectedEffect = this.selectedPreset.effects[0];
296
- }
297
- }
298
- addPreset(name) {
299
- const preset = new Preset();
300
- preset.uuid = this.uuidService.getUuid();
301
- preset.name = name || 'New Preset';
302
- // Insert the new preset before the highest currently selected preset
303
- let highestSelectedPresetIndex = 0;
304
- for (let i = 0; i < this.projectService.project.presets.length; i++) {
305
- if (this.selectedPreset === this.projectService.project.presets[i]) {
306
- highestSelectedPresetIndex = i;
307
- break;
308
- }
309
- }
310
- this.projectService.project.presets.splice(highestSelectedPresetIndex, 0, preset);
311
- this.selectPreset(highestSelectedPresetIndex);
312
- }
313
- getSelectedProfiles() {
314
- const profiles = [];
315
- if (!this.selectedPreset) {
316
- return profiles;
317
- }
318
- for (const fixtureUuid of this.selectedPreset.fixtureUuids) {
319
- const fixture = this.fixtureService.getFixtureByUuid(fixtureUuid);
320
- const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
321
- if (profiles.indexOf(profile) < 0) {
322
- profiles.push(profile);
323
- }
324
- }
325
- return profiles;
326
- }
327
- getSelectedProfileChannels(selectedProfiles) {
328
- const availableChannels = new Map();
329
- const calculatedProfileModes = new Map();
330
- for (const profile of selectedProfiles) {
331
- const modes = [];
332
- for (const fixtureUuid of this.selectedPreset.fixtureUuids) {
333
- const fixture = this.fixtureService.getCachedFixtureByUuid(fixtureUuid);
334
- if (modes.indexOf(fixture.mode) < 0) {
335
- modes.push(fixture.mode);
336
- }
337
- }
338
- calculatedProfileModes.set(profile, modes);
339
- }
340
- // calculate all required channels from the modes
341
- calculatedProfileModes.forEach((modes, profile) => {
342
- const profileChannels = [];
343
- for (const mode of modes) {
344
- const channels = this.fixtureService.getCachedChannels(profile, mode);
345
- for (const channel of channels) {
346
- // only add the channel, if no channel with the same name has already been added
347
- // (e.g. a fine channel)
348
- if (channel.channel && !profileChannels.find((c) => c.name === channel.name)) {
349
- profileChannels.push(channel);
350
- }
351
- }
352
- }
353
- availableChannels.set(profile, profileChannels);
354
- });
355
- return availableChannels;
356
- }
357
- previewLive(compositionName = '', positionMillis) {
358
- if (!this.configService.livePreview) {
359
- return;
360
- }
361
- // collect all changes and delay them to not flood the backend
362
- // (except play events. they need to be delivered always)
363
- if (this.livePreviewTimer && !compositionName) {
364
- this.liveChangePending = true;
365
- return;
366
- }
367
- let position = positionMillis;
368
- if (position === undefined) {
369
- position = Math.round(this.animationService.timeMillis);
370
- }
371
- this.http
372
- .post('preview?positionMillis=' + position + '&compositionName=' + compositionName, JSON.stringify(this.projectService.project))
373
- .subscribe();
374
- this.liveChangePending = false;
375
- if (!compositionName) {
376
- this.livePreviewTimer = setTimeout(() => {
377
- this.livePreviewTimer = undefined;
378
- if (this.liveChangePending) {
379
- this.http
380
- .post('preview?positionMillis=' + position + '&compositionName=' + compositionName, JSON.stringify(this.projectService.project))
381
- .subscribe();
382
- }
383
- }, 50);
384
- }
385
- }
386
- stopPreviewPlay() {
387
- if (!this.configService.livePreview) {
388
- return;
389
- }
390
- this.http.post('stop-preview-play', null).subscribe();
391
- }
392
- };
393
- PresetService.ctorParameters = () => [
394
- { type: EffectService },
395
- { type: UuidService },
396
- { type: ProjectService },
397
- { type: FixtureService },
398
- { type: ConfigService },
399
- { type: HttpClient },
400
- { type: AnimationService }
401
- ];
402
- PresetService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PresetService_Factory() { return new PresetService(i0.ɵɵinject(i1.EffectService), i0.ɵɵinject(i2.UuidService), i0.ɵɵinject(i3.ProjectService), i0.ɵɵinject(i4.FixtureService), i0.ɵɵinject(i5.ConfigService), i0.ɵɵinject(i6.HttpClient), i0.ɵɵinject(i7.AnimationService)); }, token: PresetService, providedIn: "root" });
403
- PresetService = __decorate([
404
- Injectable({
405
- providedIn: 'root',
406
- }),
407
- __metadata("design:paramtypes", [EffectService,
408
- UuidService,
409
- ProjectService,
410
- FixtureService,
411
- ConfigService,
412
- HttpClient,
413
- AnimationService])
414
- ], PresetService);
415
- export { PresetService };
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Acm9ja2V0c2hvdy9kZXNpZ25lci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcmVzZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkvQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUd0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBSzdDLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFtQnhCLFlBQ1UsYUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsSUFBZ0IsRUFDaEIsZ0JBQWtDO1FBTmxDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgs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LENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQy9ILFNBQVMsRUFBRSxDQUFDO2lCQUNoQjtZQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNSO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEQsQ0FBQztDQUNGLENBQUE7O1lBbGQwQixhQUFhO1lBQ2YsV0FBVztZQUNSLGNBQWM7WUFDZCxjQUFjO1lBQ2YsYUFBYTtZQUN0QixVQUFVO1lBQ0UsZ0JBQWdCOzs7QUExQmpDLGFBQWE7SUFIekIsVUFBVSxDQUFDO1FBQ1YsVUFBVSxFQUFFLE1BQU07S0FDbkIsQ0FBQztxQ0FxQnlCLGFBQWE7UUFDZixXQUFXO1FBQ1IsY0FBYztRQUNkLGNBQWM7UUFDZixhQUFhO1FBQ3RCLFVBQVU7UUFDRSxnQkFBZ0I7R0ExQmpDLGFBQWEsQ0FzZXpCO1NBdGVZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHkgfSBmcm9tICcuLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUtY2FwYWJpbGl0eSc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlQ2hhbm5lbCB9IGZyb20gJy4uL21vZGVscy9jYWNoZWQtZml4dHVyZS1jaGFubmVsJztcbmltcG9ydCB7IEZpeHR1cmUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZSc7XG5pbXBvcnQgeyBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLCBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IEZpeHR1cmVDYXBhYmlsaXR5VmFsdWUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1jYXBhYmlsaXR5LXZhbHVlJztcbmltcG9ydCB7IEZpeHR1cmVDaGFubmVsVmFsdWUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1jaGFubmVsLXZhbHVlJztcbmltcG9ydCB7IEZpeHR1cmVNb2RlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtbW9kZSc7XG5pbXBvcnQgeyBGaXh0dXJlUHJvZmlsZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLXByb2ZpbGUnO1xuaW1wb3J0IHsgUHJlc2V0IH0gZnJvbSAnLi4vbW9kZWxzL3ByZXNldCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9hbmltYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBFZmZlY3RTZXJ2aWNlIH0gZnJvbSAnLi9lZmZlY3Quc2VydmljZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4vZml4dHVyZS5zZXJ2aWNlJztcbmltcG9ydCB7IFByb2plY3RTZXJ2aWNlIH0gZnJvbSAnLi9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXVpZFNlcnZpY2UgfSBmcm9tICcuL3V1aWQuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBQcmVzZXRTZXJ2aWNlIHtcbiAgc2VsZWN0ZWRQcmVzZXQ6IFByZXNldDtcblxuICAvLyBmaXJlcywgd2hlbiB0aGUgY3VycmVudCBwcmV2aWV3IGVsZW1lbnQgaGFzIGNoYW5nZWQgKHNjZW5lL3ByZXNldClcbiAgcHJldmlld1NlbGVjdGlvbkNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIGZpcmVzLCB3aGVuIHRoZSBmaXh0dXJlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZFxuICBmaXh0dXJlU2VsZWN0aW9uQ2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gZmlyZXMsIHdoZW4gdGhlIGZpeHR1cmUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGZvciBzZXR0aW5nc1xuICBmaXh0dXJlU2VsZWN0aW9uU2V0dGluZ3NDaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBmaXJlcywgd2hlbiB0aGUgc2VsZWN0ZWQgY29sb3IgaGFzIGNoYW5nZWQuIFRoaXMgaXMgcmVxdWlyZWQsXG4gIC8vIGJlY2F1c2UgZGV0ZWN0Q2hhbmdlcyBpcyBub3QgZW5vdWdoIHRvIHRyaWdnZXIgZGlmZmVyZW50IGNvbXBvbmVudHMuXG4gIGZpeHR1cmVDb2xvckNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGxpdmVQcmV2aWV3VGltZXI6IGFueTtcbiAgbGl2ZUNoYW5nZVBlbmRpbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVmZmVjdFNlcnZpY2U6IEVmZmVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dWlkU2VydmljZTogVXVpZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXh0dXJlU2VydmljZTogRml4dHVyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGFuaW1hdGlvblNlcnZpY2U6IEFuaW1hdGlvblNlcnZpY2VcbiAgKSB7fVxuXG4gIGdldFByZXNldEJ5VXVpZCh1dWlkOiBzdHJpbmcpOiBQcmVzZXQge1xuICAgIGZvciAoY29uc3QgcHJlc2V0IG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzKSB7XG4gICAgICBpZiAocHJlc2V0LnV1aWQgPT09IHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIHByZXNldDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaXh0dXJlSXNTZWxlY3RlZChmaXh0dXJlOiBGaXh0dXJlLCBwcmVzZXQ/OiBQcmVzZXQpOiBib29sZWFuIHtcbiAgICAvLyBpcyB0aGUgcGFzc2VkIGZpeHR1cmUgc2VsZWN0ZWQgaW4gdGhlIHBhc3NlZC9jdXJyZW50bHkgc2VsZWN0ZWQgcHJlc2V0P1xuICAgIGlmICghcHJlc2V0KSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFByZXNldCkge1xuICAgICAgICBwcmVzZXQgPSB0aGlzLnNlbGVjdGVkUHJlc2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VsZWN0ZWRGaXh0dXJlVXVpZCBvZiBwcmVzZXQuZml4dHVyZVV1aWRzKSB7XG4gICAgICBpZiAoc2VsZWN0ZWRGaXh0dXJlVXVpZCA9PT0gZml4dHVyZS51dWlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaEZpeHR1cmVTZWxlY3Rpb24oZml4dHVyZTogRml4dHVyZSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFByZXNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNlbGVjdCBhbGwgZml4dHVyZXMgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBjaGFubmVsIG9yIHVuc2VsZWN0IHRoZW0sXG4gICAgLy8gaWYgYWxyZWFkeSBzZWxlY3RlZFxuICAgIGlmICh0aGlzLmZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlVXVpZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcHJvamVjdEZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldEZpeHR1cmVCeVV1aWQodGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlVXVpZHNbaV0pO1xuICAgICAgICBpZiAocHJvamVjdEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID09PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZVV1aWRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3RGaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlcykge1xuICAgICAgICBpZiAocHJvamVjdEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID09PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZVV1aWRzLnB1c2gocHJvamVjdEZpeHR1cmUudXVpZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZWxlY3RBbGxGaXh0dXJlcygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRQcmVzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzKSB7XG4gICAgICBpZiAoIXRoaXMuZml4dHVyZUlzU2VsZWN0ZWQoZml4dHVyZSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlVXVpZHMucHVzaChmaXh0dXJlLnV1aWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNlbGVjdE5vRml4dHVyZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUHJlc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlVXVpZHMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVEZWxldGVkRml4dHVyZXMoKSB7XG4gICAgLy8gYWZ0ZXIgY2hhbmdpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGZpeHR1cmUgcG9vbCwgd2UgbWlnaHQgbmVlZCB0b1xuICAgIC8vIGRlbGV0ZSBzb21lIGZpeHR1cmVzXG4gICAgZm9yIChjb25zdCBwcmVzZXQgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSBwcmVzZXQuZml4dHVyZVV1aWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHByZXNldEZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldEZpeHR1cmVCeVV1aWQocHJlc2V0LmZpeHR1cmVVdWlkc1tpXSk7XG4gICAgICAgIGlmICghcHJlc2V0Rml4dHVyZSkge1xuICAgICAgICAgIHByZXNldC5maXh0dXJlVXVpZHMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUZpeHR1cmVTZWxlY3Rpb24oKSB7XG4gICAgLy8gYWZ0ZXIgY2hhbmdpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGZpeHR1cmUgcG9vbCwgd2UgbWlnaHQgbmVlZCB0b1xuICAgIC8vIHNlbGVjdCBzb21lIG1vcmUgZml4dHVyZXMgb24gdGhlIHNhbWUgY2hhbm5lbCBhcyBhbHJlYWR5IHNlbGVjdGVkIG9uZXNcbiAgICBmb3IgKGNvbnN0IHByZXNldCBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0cykge1xuICAgICAgZm9yIChsZXQgaSA9IHByZXNldC5maXh0dXJlVXVpZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcHJlc2V0Rml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Rml4dHVyZUJ5VXVpZChwcmVzZXQuZml4dHVyZVV1aWRzW2ldKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9qZWN0Rml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgICAgICBpZiAocHJvamVjdEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID09PSBwcmVzZXRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAmJiAhdGhpcy5maXh0dXJlSXNTZWxlY3RlZChwcm9qZWN0Rml4dHVyZSwgcHJlc2V0KSkge1xuICAgICAgICAgICAgcHJlc2V0LmZpeHR1cmVVdWlkcy5wdXNoKHByb2plY3RGaXh0dXJlLnV1aWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZUNhcGFiaWxpdHlWYWx1ZShcbiAgICBwcmVzZXQ6IFByZXNldCxcbiAgICBjYXBhYmlsaXR5VHlwZTogRml4dHVyZUNhcGFiaWxpdHlUeXBlLFxuICAgIGNvbG9yPzogRml4dHVyZUNhcGFiaWxpdHlDb2xvcixcbiAgICB3aGVlbD86IHN0cmluZyxcbiAgICBwcm9maWxlVXVpZD86IHN0cmluZ1xuICApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXNldC5maXh0dXJlQ2FwYWJpbGl0eVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmNhcGFiaWxpdGllc01hdGNoKFxuICAgICAgICAgIHByZXNldC5maXh0dXJlQ2FwYWJpbGl0eVZhbHVlc1tpXS50eXBlLFxuICAgICAgICAgIGNhcGFiaWxpdHlUeXBlLFxuICAgICAgICAgIHByZXNldC5maXh0dXJlQ2FwYWJpbGl0eVZhbHVlc1tpXS5jb2xvcixcbiAgICAgICAgICBjb2xvcixcbiAgICAgICAgICBwcmVzZXQuZml4dHVyZUNhcGFiaWxpdHlWYWx1ZXNbaV0ud2hlZWwsXG4gICAgICAgICAgd2hlZWwsXG4gICAgICAgICAgcHJlc2V0LmZpeHR1cmVDYXBhYmlsaXR5VmFsdWVzW2ldLnByb2ZpbGVVdWlkLFxuICAgICAgICAgIHByb2ZpbGVVdWlkXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwcmVzZXQuZml4dHVyZUNhcGFiaWxpdHlWYWx1ZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0Q2FwYWJpbGl0eVZhbHVlKFxuICAgIHByZXNldDogUHJlc2V0LFxuICAgIGNhcGFiaWxpdHlUeXBlOiBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUsXG4gICAgdmFsdWVQZXJjZW50YWdlOiBudW1iZXIsXG4gICAgc2xvdE51bWJlcj86IG51bWJlcixcbiAgICBjb2xvcj86IEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IsXG4gICAgd2hlZWw/OiBzdHJpbmcsXG4gICAgcHJvZmlsZVV1aWQ/OiBzdHJpbmdcbiAgKSB7XG4gICAgLy8gRGVsZXRlIGV4aXN0YW50IHByb3BlcnRpZXMgd2l0aCB0aGlzIHR5cGUgYW5kIHNldCB0aGUgbmV3IHZhbHVlXG4gICAgdGhpcy5kZWxldGVDYXBhYmlsaXR5VmFsdWUocHJlc2V0LCBjYXBhYmlsaXR5VHlwZSwgY29sb3IsIHdoZWVsLCBwcm9maWxlVXVpZCk7XG5cbiAgICBjb25zdCBmaXh0dXJlQ2FwYWJpbGl0eVZhbHVlID0gbmV3IEZpeHR1cmVDYXBhYmlsaXR5VmFsdWUoKTtcbiAgICBmaXh0dXJlQ2FwYWJpbGl0eVZhbHVlLnR5cGUgPSBjYXBhYmlsaXR5VHlwZTtcbiAgICBmaXh0dXJlQ2FwYWJpbGl0eVZhbHVlLmNvbG9yID0gY29sb3I7XG4gICAgZml4dHVyZUNhcGFiaWxpdHlWYWx1ZS53aGVlbCA9IHdoZWVsO1xuICAgIGZpeHR1cmVDYXBhYmlsaXR5VmFsdWUudmFsdWVQZXJjZW50YWdlID0gdmFsdWVQZXJjZW50YWdlO1xuICAgIGZpeHR1cmVDYXBhYmlsaXR5VmFsdWUuc2xvdE51bWJlciA9IHNsb3ROdW1iZXI7XG4gICAgZml4dHVyZUNhcGFiaWxpdHlWYWx1ZS5wcm9maWxlVXVpZCA9IHByb2ZpbGVVdWlkO1xuXG4gICAgcHJlc2V0LmZpeHR1cmVDYXBhYmlsaXR5VmFsdWVzLnB1c2goZml4dHVyZUNhcGFiaWxpdHlWYWx1ZSk7XG4gIH1cblxuICBnZXRDYXBhYmlsaXR5VmFsdWUoXG4gICAgcHJlc2V0OiBQcmVzZXQsXG4gICAgY2FwYWJpbGl0eVR5cGU6IEZpeHR1cmVDYXBhYmlsaXR5VHlwZSxcbiAgICBjb2xvcj86IEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IsXG4gICAgd2hlZWw/OiBzdHJpbmcsXG4gICAgcHJvZmlsZVV1aWQ/OiBzdHJpbmdcbiAgKTogRml4dHVyZUNhcGFiaWxpdHlWYWx1ZSB7XG4gICAgZm9yIChjb25zdCBjYXBhYmlsaXR5VmFsdWUgb2YgcHJlc2V0LmZpeHR1cmVDYXBhYmlsaXR5VmFsdWVzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZml4dHVyZVNlcnZpY2UuY2FwYWJpbGl0aWVzTWF0Y2goXG4gICAgICAgICAgY2FwYWJpbGl0eVZhbHVlLnR5cGUsXG4gICAgICAgICAgY2FwYWJpbGl0eVR5cGUsXG4gICAgICAgICAgY2FwYWJpbGl0eVZhbHVlLmNvbG9yLFxuICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgIGNhcGFiaWxpdHlWYWx1ZS53aGVlbCxcbiAgICAgICAgICB3aGVlbCxcbiAgICAgICAgICBjYXBhYmlsaXR5VmFsdWUucHJvZmlsZVV1aWQsXG4gICAgICAgICAgcHJvZmlsZVV1aWRcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjYXBhYmlsaXR5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWxldGVDaGFubmVsVmFsdWUoY2hhbm5lbE5hbWU6IHN0cmluZywgcHJvZmlsZVV1aWQ6IHN0cmluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlQ2hhbm5lbFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVDaGFubmVsVmFsdWVzW2ldLmNoYW5uZWxOYW1lID09PSBjaGFubmVsTmFtZSAmJlxuICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVDaGFubmVsVmFsdWVzW2ldLnByb2ZpbGVVdWlkID09PSBwcm9maWxlVXVpZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZUNoYW5uZWxWYWx1ZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0Q2hhbm5lbFZhbHVlKGNoYW5uZWxOYW1lOiBzdHJpbmcsIHByb2ZpbGVVdWlkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpIHtcbiAgICAvLyBEZWxldGUgZXhpc3RhbnQgcHJvcGVydGllcyB3aXRoIHRoaXMgdHlwZSBhbmQgc2V0IHRoZSBuZXcgdmFsdWVcbiAgICB0aGlzLmRlbGV0ZUNoYW5uZWxWYWx1ZShjaGFubmVsTmFtZSwgcHJvZmlsZVV1aWQpO1xuXG4gICAgY29uc3QgZml4dHVyZUNoYW5uZWxWYWx1ZSA9IG5ldyBGaXh0dXJlQ2hhbm5lbFZhbHVlKCk7XG4gICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lO1xuICAgIGZpeHR1cmVDaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPSBwcm9maWxlVXVpZDtcbiAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gdmFsdWU7XG5cbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVDaGFubmVsVmFsdWVzLnB1c2goZml4dHVyZUNoYW5uZWxWYWx1ZSk7XG4gIH1cblxuICBnZXRDaGFubmVsVmFsdWUoY2hhbm5lbE5hbWU6IHN0cmluZywgcHJvZmlsZVV1aWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgZm9yIChjb25zdCBjaGFubmVsVmFsdWUgb2YgdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlQ2hhbm5lbFZhbHVlcykge1xuICAgICAgaWYgKGNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9PT0gY2hhbm5lbE5hbWUgJiYgY2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkID09PSBwcm9maWxlVXVpZCkge1xuICAgICAgICByZXR1cm4gY2hhbm5lbFZhbHVlLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEFwcHJveGltYXRlZENvbG9yV2hlZWxDYXBhYmlsaXR5KHByZXNldDogUHJlc2V0LCBjYWNoZWRDaGFubmVsOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCk6IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5IHtcbiAgICAvLyByZXR1cm4gYW4gYXBwcm94aW1hdGVkIHdoZWVsIHNsb3QgY2hhbm5lbCBjYXBhYmlsaXR5LCBpZiBhIGNvbG9yIG9yIGEgc2xvdCBvbiBhIGRpZmZlcmVudFxuICAgIC8vIHdoZWVsIGhhcyBiZWVuIHNlbGVjdGVkXG4gICAgbGV0IGNvbG9yUmVkOiBudW1iZXI7XG4gICAgbGV0IGNvbG9yR3JlZW46IG51bWJlcjtcbiAgICBsZXQgY29sb3JCbHVlOiBudW1iZXI7XG4gICAgbGV0IGxvd2VzdERpZmYgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIGxldCBsb3dlc3REaWZmQ2FwYWJpbGl0eTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHk7XG4gICAgbGV0IGNhcGFiaWxpdHlWYWx1ZTogRml4dHVyZUNhcGFiaWxpdHlWYWx1ZTtcblxuICAgIGNhcGFiaWxpdHlWYWx1ZSA9IHRoaXMuZ2V0Q2FwYWJpbGl0eVZhbHVlKHByZXNldCwgRml4dHVyZUNhcGFiaWxpdHlUeXBlLkNvbG9ySW50ZW5zaXR5LCBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLlJlZCk7XG4gICAgaWYgKGNhcGFiaWxpdHlWYWx1ZSkge1xuICAgICAgY29sb3JSZWQgPSAyNTUgKiBjYXBhYmlsaXR5VmFsdWUudmFsdWVQZXJjZW50YWdlO1xuICAgIH1cbiAgICBjYXBhYmlsaXR5VmFsdWUgPSB0aGlzLmdldENhcGFiaWxpdHlWYWx1ZShwcmVzZXQsIEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5Db2xvckludGVuc2l0eSwgRml4dHVyZUNhcGFiaWxpdHlDb2xvci5HcmVlbik7XG4gICAgaWYgKGNhcGFiaWxpdHlWYWx1ZSkge1xuICAgICAgY29sb3JHcmVlbiA9IDI1NSAqIGNhcGFiaWxpdHlWYWx1ZS52YWx1ZVBlcmNlbnRhZ2U7XG4gICAgfVxuICAgIGNhcGFiaWxpdHlWYWx1ZSA9IHRoaXMuZ2V0Q2FwYWJpbGl0eVZhbHVlKHByZXNldCwgRml4dHVyZUNhcGFiaWxpdHlUeXBlLkNvbG9ySW50ZW5zaXR5LCBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLkJsdWUpO1xuICAgIGlmIChjYXBhYmlsaXR5VmFsdWUpIHtcbiAgICAgIGNvbG9yQmx1ZSA9IDI1NSAqIGNhcGFiaWxpdHlWYWx1ZS52YWx1ZVBlcmNlbnRhZ2U7XG4gICAgfVxuXG4gICAgaWYgKCFjb2xvclJlZCAmJiAhY29sb3JHcmVlbiAmJiAhY29sb3JCbHVlKSB7XG4gICAgICAvLyBubyBjb2xvciBmb3VuZCAtPiBzZWFyY2ggdGhlIGZpcnN0IGNvbG9yIHdoZWVsXG4gICAgICAvLyBUT0RPXG4gICAgfVxuXG4gICAgaWYgKGNvbG9yUmVkICE9PSB1bmRlZmluZWQgJiYgY29sb3JHcmVlbiAhPT0gdW5kZWZpbmVkICYmIGNvbG9yQmx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2FjaGVkQ2hhbm5lbC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgaWYgKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5zbG90TnVtYmVyKSB7XG4gICAgICAgICAgY29uc3QgbWl4ZWRDb2xvciA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TWl4ZWRXaGVlbFNsb3RDb2xvcihjYXBhYmlsaXR5LndoZWVsLCBjYXBhYmlsaXR5LmNhcGFiaWxpdHkuc2xvdE51bWJlcik7XG4gICAgICAgICAgaWYgKG1peGVkQ29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPVxuICAgICAgICAgICAgICBNYXRoLmFicyhtaXhlZENvbG9yLnJlZCAtIGNvbG9yUmVkKSArIE1hdGguYWJzKG1peGVkQ29sb3IuZ3JlZW4gLSBjb2xvckdyZWVuKSArIE1hdGguYWJzKG1peGVkQ29sb3IuYmx1ZSAtIGNvbG9yQmx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChkaWZmIDwgbG93ZXN0RGlmZikge1xuICAgICAgICAgICAgICBsb3dlc3REaWZmID0gZGlmZjtcbiAgICAgICAgICAgICAgbG93ZXN0RGlmZkNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb3dlc3REaWZmQ2FwYWJpbGl0eTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQ2FwYWJpbGl0eVR5cGUodHlwZTogRml4dHVyZUNhcGFiaWxpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgLy8gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYW5uZWwgd2l0aCBhdCBsZWFzdCBvbmUgaW50ZW5zaXR5IGNhcGFiaWxpdHlcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVVdWlkIG9mIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZVV1aWRzKSB7XG4gICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRDYWNoZWRGaXh0dXJlQnlVdWlkKGZpeHR1cmVVdWlkKTtcbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBmaXh0dXJlLmNoYW5uZWxzKSB7XG4gICAgICAgIGlmIChjaGFubmVsLmNoYW5uZWwpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2hhbm5lbC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5LmNhcGFiaWxpdHkudHlwZSA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaGFzQ2FwYWJpbGl0eURpbW1lcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNDYXBhYmlsaXR5VHlwZShGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuSW50ZW5zaXR5KTtcbiAgfVxuXG4gIGhhc0NhcGFiaWxpdHlDb2xvcigpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPIG9wdGlvbmFsbHkgY29sb3IgdGVtcGVyYXR1cmUgYW5kIGNvbG9yIHdoaXRlIChzZWUgc3RhaXJ2aWxsZS9taC0xMDApXG5cbiAgICAvLyBvbmUgb2YgdGhlIHByb2ZpbGVzIGhhcyBhIGNvbG9yIGludGVuc2l0eVxuICAgIGlmICh0aGlzLmhhc0NhcGFiaWxpdHlUeXBlKEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5Db2xvckludGVuc2l0eSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhc0NhcGFiaWxpdHlDb2xvck9yQ29sb3JXaGVlbCgpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPIG9wdGlvbmFsbHkgY29sb3IgdGVtcGVyYXR1cmUgYW5kIGNvbG9yIHdoaXRlIChzZWUgc3RhaXJ2aWxsZS9taC0xMDApXG5cbiAgICAvLyBvbmUgb2YgdGhlIHByb2ZpbGVzIGhhcyBhIGNvbG9yIGludGVuc2l0eVxuICAgIGlmICh0aGlzLmhhc0NhcGFiaWxpdHlDb2xvcigpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBhIGNvbG9yIHdoZWVsIGlzIGludm9sdmVkXG4gICAgZm9yIChjb25zdCBmaXh0dXJlVXVpZCBvZiB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVVdWlkcykge1xuICAgICAgY29uc3QgZml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Q2FjaGVkRml4dHVyZUJ5VXVpZChmaXh0dXJlVXVpZCk7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgZml4dHVyZS5jaGFubmVscykge1xuICAgICAgICBpZiAoY2hhbm5lbC5jb2xvcldoZWVsKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoYXNDYXBhYmlsaXR5UGFuVGlsdCgpOiBib29sZWFuIHtcbiAgICBsZXQgaGFzUGFuID0gZmFsc2U7XG4gICAgbGV0IGhhc1RpbHQgPSBmYWxzZTtcblxuICAgIC8vIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwYW4gYW5kIG9uZSB0aWx0IGNoYW5uZWxcbiAgICBpZiAodGhpcy5oYXNDYXBhYmlsaXR5VHlwZShGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuUGFuKSkge1xuICAgICAgaGFzUGFuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNDYXBhYmlsaXR5VHlwZShGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuVGlsdCkpIHtcbiAgICAgIGhhc1RpbHQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChoYXNQYW4gJiYgaGFzVGlsdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2VsZWN0UHJlc2V0KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmVmZmVjdFNlcnZpY2Uuc2VsZWN0ZWRFZmZlY3QgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzW2luZGV4XTtcbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2VsZWN0ZWRQcmVzZXRVdWlkID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHNbaW5kZXhdLnV1aWQ7XG4gICAgdGhpcy5hdXRvT3BlbkZpcnN0RWZmZWN0KCk7XG4gICAgdGhpcy5wcmV2aWV3U2VsZWN0aW9uQ2hhbmdlZC5uZXh0KCk7XG4gICAgdGhpcy5wcmV2aWV3TGl2ZSgpO1xuICB9XG5cbiAgYXV0b09wZW5GaXJzdEVmZmVjdCgpIHtcbiAgICAvLyBvcGVuIHRoZSBmaXJzdCBlZmZlY3QsIGlmIHRoZSBwcmVzZXQgb25seSBoYXMgb25lXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRQcmVzZXQgJiYgdGhpcy5zZWxlY3RlZFByZXNldC5lZmZlY3RzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5lZmZlY3RTZXJ2aWNlLnNlbGVjdGVkRWZmZWN0ID0gdGhpcy5zZWxlY3RlZFByZXNldC5lZmZlY3RzWzBdO1xuICAgIH1cbiAgfVxuXG4gIGFkZFByZXNldChuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcHJlc2V0OiBQcmVzZXQgPSBuZXcgUHJlc2V0KCk7XG4gICAgcHJlc2V0LnV1aWQgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFV1aWQoKTtcbiAgICBwcmVzZXQubmFtZSA9IG5hbWUgfHwgJ05ldyBQcmVzZXQnO1xuXG4gICAgLy8gSW5zZXJ0IHRoZSBuZXcgcHJlc2V0IGJlZm9yZSB0aGUgaGlnaGVzdCBjdXJyZW50bHkgc2VsZWN0ZWQgcHJlc2V0XG4gICAgbGV0IGhpZ2hlc3RTZWxlY3RlZFByZXNldEluZGV4ID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUHJlc2V0ID09PSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0c1tpXSkge1xuICAgICAgICBoaWdoZXN0U2VsZWN0ZWRQcmVzZXRJbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzLnNwbGljZShoaWdoZXN0U2VsZWN0ZWRQcmVzZXRJbmRleCwgMCwgcHJlc2V0KTtcbiAgICB0aGlzLnNlbGVjdFByZXNldChoaWdoZXN0U2VsZWN0ZWRQcmVzZXRJbmRleCk7XG4gIH1cblxuICBnZXRTZWxlY3RlZFByb2ZpbGVzKCkge1xuICAgIGNvbnN0IHByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdID0gW107XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRQcmVzZXQpIHtcbiAgICAgIHJldHVybiBwcm9maWxlcztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVVdWlkIG9mIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZVV1aWRzKSB7XG4gICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRGaXh0dXJlQnlVdWlkKGZpeHR1cmVVdWlkKTtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCk7XG5cbiAgICAgIGlmIChwcm9maWxlcy5pbmRleE9mKHByb2ZpbGUpIDwgMCkge1xuICAgICAgICBwcm9maWxlcy5wdXNoKHByb2ZpbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9maWxlcztcbiAgfVxuXG4gIGdldFNlbGVjdGVkUHJvZmlsZUNoYW5uZWxzKHNlbGVjdGVkUHJvZmlsZXM6IEZpeHR1cmVQcm9maWxlW10pIHtcbiAgICBjb25zdCBhdmFpbGFibGVDaGFubmVsczogTWFwPEZpeHR1cmVQcm9maWxlLCBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdPiA9IG5ldyBNYXA8Rml4dHVyZVByb2ZpbGUsIENhY2hlZEZpeHR1cmVDaGFubmVsW10+KCk7XG5cbiAgICBjb25zdCBjYWxjdWxhdGVkUHJvZmlsZU1vZGVzID0gbmV3IE1hcDxGaXh0dXJlUHJvZmlsZSwgRml4dHVyZU1vZGVbXT4oKTtcbiAgICBmb3IgKGNvbnN0IHByb2ZpbGUgb2Ygc2VsZWN0ZWRQcm9maWxlcykge1xuICAgICAgY29uc3QgbW9kZXM6IEZpeHR1cmVNb2RlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZml4dHVyZVV1aWQgb2YgdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlVXVpZHMpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Q2FjaGVkRml4dHVyZUJ5VXVpZChmaXh0dXJlVXVpZCk7XG4gICAgICAgIGlmIChtb2Rlcy5pbmRleE9mKGZpeHR1cmUubW9kZSkgPCAwKSB7XG4gICAgICAgICAgbW9kZXMucHVzaChmaXh0dXJlLm1vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWxjdWxhdGVkUHJvZmlsZU1vZGVzLnNldChwcm9maWxlLCBtb2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFsbCByZXF1aXJlZCBjaGFubmVscyBmcm9tIHRoZSBtb2Rlc1xuICAgIGNhbGN1bGF0ZWRQcm9maWxlTW9kZXMuZm9yRWFjaCgobW9kZXM6IEZpeHR1cmVNb2RlW10sIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKSA9PiB7XG4gICAgICBjb25zdCBwcm9maWxlQ2hhbm5lbHM6IENhY2hlZEZpeHR1cmVDaGFubmVsW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbW9kZSBvZiBtb2Rlcykge1xuICAgICAgICBjb25zdCBjaGFubmVscyA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Q2FjaGVkQ2hhbm5lbHMocHJvZmlsZSwgbW9kZSk7XG4gICAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBjaGFubmVscykge1xuICAgICAgICAgIC8vIG9ubHkgYWRkIHRoZSBjaGFubmVsLCBpZiBubyBjaGFubmVsIHdpdGggdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkXG4gICAgICAgICAgLy8gKGUuZy4gYSBmaW5lIGNoYW5uZWwpXG4gICAgICAgICAgaWYgKGNoYW5uZWwuY2hhbm5lbCAmJiAhcHJvZmlsZUNoYW5uZWxzLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gY2hhbm5lbC5uYW1lKSkge1xuICAgICAgICAgICAgcHJvZmlsZUNoYW5uZWxzLnB1c2goY2hhbm5lbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhdmFpbGFibGVDaGFubmVscy5zZXQocHJvZmlsZSwgcHJvZmlsZUNoYW5uZWxzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhdmFpbGFibGVDaGFubmVscztcbiAgfVxuXG4gIHByZXZpZXdMaXZlKGNvbXBvc2l0aW9uTmFtZTogc3RyaW5nID0gJycsIHBvc2l0aW9uTWlsbGlzPzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ1NlcnZpY2UubGl2ZVByZXZpZXcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb2xsZWN0IGFsbCBjaGFuZ2VzIGFuZCBkZWxheSB0aGVtIHRvIG5vdCBmbG9vZCB0aGUgYmFja2VuZFxuICAgIC8vIChleGNlcHQgcGxheSBldmVudHMuIHRoZXkgbmVlZCB0byBiZSBkZWxpdmVyZWQgYWx3YXlzKVxuICAgIGlmICh0aGlzLmxpdmVQcmV2aWV3VGltZXIgJiYgIWNvbXBvc2l0aW9uTmFtZSkge1xuICAgICAgdGhpcy5saXZlQ2hhbmdlUGVuZGluZyA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBvc2l0aW9uID0gcG9zaXRpb25NaWxsaXM7XG5cbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcG9zaXRpb24gPSBNYXRoLnJvdW5kKHRoaXMuYW5pbWF0aW9uU2VydmljZS50aW1lTWlsbGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KCdwcmV2aWV3P3Bvc2l0aW9uTWlsbGlzPScgKyBwb3NpdGlvbiArICcmY29tcG9zaXRpb25OYW1lPScgKyBjb21wb3NpdGlvbk5hbWUsIEpTT04uc3RyaW5naWZ5KHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdCkpXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmxpdmVDaGFuZ2VQZW5kaW5nID0gZmFsc2U7XG5cbiAgICBpZiAoIWNvbXBvc2l0aW9uTmFtZSkge1xuICAgICAgdGhpcy5saXZlUHJldmlld1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubGl2ZVByZXZpZXdUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMubGl2ZUNoYW5nZVBlbmRpbmcpIHtcbiAgICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0KCdwcmV2aWV3P3Bvc2l0aW9uTWlsbGlzPScgKyBwb3NpdGlvbiArICcmY29tcG9zaXRpb25OYW1lPScgKyBjb21wb3NpdGlvbk5hbWUsIEpTT04uc3RyaW5naWZ5KHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDUwKTtcbiAgICB9XG4gIH1cblxuICBzdG9wUHJldmlld1BsYXkoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ1NlcnZpY2UubGl2ZVByZXZpZXcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmh0dHAucG9zdCgnc3RvcC1wcmV2aWV3LXBsYXknLCBudWxsKS5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19