@rocketshow/designer 1.32.0 → 1.35.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.
- package/assets/i18n/de.json +2 -1
- package/assets/i18n/en.json +2 -1
- package/esm2022/lib/array-sort-pipe.mjs +30 -0
- package/esm2022/lib/designer.component.mjs +672 -0
- package/esm2022/lib/designer.module.mjs +186 -0
- package/esm2022/lib/designer.service.mjs +14 -0
- package/esm2022/lib/dropzone/dropzone.component.mjs +93 -0
- package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +577 -0
- package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
- package/esm2022/lib/effect/effect.component.mjs +174 -0
- package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
- package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +162 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
- package/esm2022/lib/fixture/fixture.component.mjs +148 -0
- package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
- package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +643 -0
- package/esm2022/lib/intro/intro.component.mjs +95 -0
- package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
- package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
- package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
- package/esm2022/lib/models/cached-fixture.mjs +6 -0
- package/esm2022/lib/models/color.mjs +8 -0
- package/esm2022/lib/models/composition.mjs +46 -0
- package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
- package/esm2022/lib/models/effect-curve.mjs +69 -0
- package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
- package/esm2022/lib/models/effect.mjs +12 -0
- package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
- package/esm2022/lib/models/fixture-capability.mjs +84 -0
- package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
- package/esm2022/lib/models/fixture-channel.mjs +24 -0
- package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +27 -0
- package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +12 -0
- package/esm2022/lib/models/fixture-matrix.mjs +25 -0
- package/esm2022/lib/models/fixture-mode-channel.mjs +26 -0
- package/esm2022/lib/models/fixture-mode.mjs +17 -0
- package/esm2022/lib/models/fixture-physical.mjs +14 -0
- package/esm2022/lib/models/fixture-profile.mjs +85 -0
- package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
- package/esm2022/lib/models/fixture-wheel.mjs +15 -0
- package/esm2022/lib/models/fixture.mjs +40 -0
- package/esm2022/lib/models/preset-fixture.mjs +10 -0
- package/esm2022/lib/models/preset-region-scene.mjs +8 -0
- package/esm2022/lib/models/preset.mjs +65 -0
- package/esm2022/lib/models/project.mjs +78 -0
- package/esm2022/lib/models/scene-playback-region.mjs +11 -0
- package/esm2022/lib/models/scene.mjs +27 -0
- package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
- package/esm2022/lib/preset/preset.component.mjs +131 -0
- package/esm2022/lib/preview/models/color-changer-3d.mjs +64 -0
- package/esm2022/lib/preview/models/fixture-3d.mjs +274 -0
- package/esm2022/lib/preview/models/moving-head-3d.mjs +124 -0
- package/esm2022/lib/preview/preview.component.mjs +219 -0
- package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
- package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
- package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
- package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
- package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
- package/esm2022/lib/scene/scene.component.mjs +110 -0
- package/esm2022/lib/services/animation.service.mjs +16 -0
- package/esm2022/lib/services/config.service.mjs +28 -0
- package/esm2022/lib/services/effect.service.mjs +14 -0
- package/esm2022/lib/services/error-dialog.service.mjs +39 -0
- package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
- package/esm2022/lib/services/fixture.service.mjs +639 -0
- package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
- package/esm2022/lib/services/intro.service.mjs +140 -0
- package/esm2022/lib/services/preset.service.mjs +449 -0
- package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
- package/esm2022/lib/services/preview.service.mjs +497 -0
- package/esm2022/lib/services/project-load.service.mjs +209 -0
- package/esm2022/lib/services/project.service.mjs +93 -0
- package/esm2022/lib/services/scene.service.mjs +164 -0
- package/esm2022/lib/services/timeline.service.mjs +726 -0
- package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
- package/esm2022/lib/services/user.service.mjs +89 -0
- package/esm2022/lib/services/uuid.service.mjs +23 -0
- package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
- package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +304 -0
- package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
- package/esm2022/lib/timeline/timeline.component.mjs +418 -0
- package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
- package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
- package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
- package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
- package/esm2022/public_api.mjs +7 -0
- package/esm2022/rocketshow-designer.mjs +5 -0
- package/fesm2022/rocketshow-designer.mjs +11171 -0
- package/fesm2022/rocketshow-designer.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/array-sort-pipe.d.ts +3 -0
- package/lib/designer.component.d.ts +19 -16
- package/lib/designer.module.d.ts +55 -0
- package/lib/designer.service.d.ts +3 -0
- package/lib/dropzone/dropzone.component.d.ts +24 -0
- package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
- package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
- package/lib/effect/effect.component.d.ts +3 -0
- package/lib/error-dialog/error-dialog.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
- package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
- package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
- package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
- package/lib/fixture/fixture.component.d.ts +7 -3
- package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
- package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
- package/lib/intro/intro.component.d.ts +3 -0
- package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
- package/lib/models/cached-fixture.d.ts +1 -0
- package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +8 -0
- package/lib/models/fixture-matrix-pixel-group.d.ts +6 -0
- package/lib/models/fixture-matrix.d.ts +6 -0
- package/lib/models/fixture-mode-channel.d.ts +8 -0
- package/lib/models/fixture-mode.d.ts +3 -1
- package/lib/models/fixture-physical.d.ts +4 -0
- package/lib/models/fixture-profile.d.ts +5 -0
- package/lib/models/preset-fixture.d.ts +5 -0
- package/lib/models/preset.d.ts +2 -0
- package/lib/models/project.d.ts +3 -0
- package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
- package/lib/preset/preset.component.d.ts +3 -0
- package/lib/preview/models/color-changer-3d.d.ts +1 -11
- package/lib/preview/models/fixture-3d.d.ts +11 -0
- package/lib/preview/models/moving-head-3d.d.ts +1 -11
- package/lib/preview/preview.component.d.ts +4 -4
- package/lib/project/project-browser/project-browser.component.d.ts +3 -0
- package/lib/project/project-import/project-import.component.d.ts +3 -0
- package/lib/project/project-save/project-save.component.d.ts +3 -0
- package/lib/project/project-share/project-share.component.d.ts +3 -0
- package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
- package/lib/scene/scene.component.d.ts +3 -0
- package/lib/services/animation.service.d.ts +3 -0
- package/lib/services/config.service.d.ts +4 -0
- package/lib/services/effect.service.d.ts +3 -0
- package/lib/services/error-dialog.service.d.ts +3 -0
- package/lib/services/fixture-pool.service.d.ts +3 -0
- package/lib/services/fixture.service.d.ts +10 -2
- package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
- package/lib/services/intro.service.d.ts +3 -0
- package/lib/services/preset.service.d.ts +7 -2
- package/lib/services/preview-mesh.service.d.ts +3 -0
- package/lib/services/preview.service.d.ts +6 -4
- package/lib/services/project-load.service.d.ts +8 -1
- package/lib/services/project.service.d.ts +5 -3
- package/lib/services/scene.service.d.ts +3 -0
- package/lib/services/timeline.service.d.ts +3 -0
- package/lib/services/user-ensure-login.service.d.ts +3 -0
- package/lib/services/user.service.d.ts +3 -0
- package/lib/services/uuid.service.d.ts +3 -0
- package/lib/services/warning-dialog.service.d.ts +3 -0
- package/lib/timeline/composition-settings/composition-settings.component.d.ts +5 -1
- package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
- package/lib/timeline/timeline.component.d.ts +3 -0
- package/lib/user/user-login/user-login.component.d.ts +3 -0
- package/lib/user/user-register/user-register.component.d.ts +3 -0
- package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
- package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
- package/package.json +20 -22
- package/rocketshow-designer-1.35.0.tgz +0 -0
- package/bundles/rocketshow-designer.umd.js +0 -9966
- package/bundles/rocketshow-designer.umd.js.map +0 -1
- package/bundles/rocketshow-designer.umd.min.js +0 -17
- package/bundles/rocketshow-designer.umd.min.js.map +0 -1
- package/esm2015/lib/array-sort-pipe.js +0 -28
- package/esm2015/lib/designer.component.js +0 -411
- package/esm2015/lib/designer.module.js +0 -117
- package/esm2015/lib/designer.service.js +0 -16
- package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
- package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
- package/esm2015/lib/effect/effect.component.js +0 -73
- package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
- package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
- package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
- package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
- package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
- package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
- package/esm2015/lib/fixture/fixture.component.js +0 -70
- package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
- package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
- package/esm2015/lib/intro/intro.component.js +0 -25
- package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
- package/esm2015/lib/models/cached-fixture-capability.js +0 -9
- package/esm2015/lib/models/cached-fixture-channel.js +0 -7
- package/esm2015/lib/models/cached-fixture.js +0 -6
- package/esm2015/lib/models/color.js +0 -8
- package/esm2015/lib/models/composition.js +0 -46
- package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
- package/esm2015/lib/models/effect-curve.js +0 -69
- package/esm2015/lib/models/effect-pan-tilt.js +0 -19
- package/esm2015/lib/models/effect.js +0 -12
- package/esm2015/lib/models/fixture-capability-value.js +0 -15
- package/esm2015/lib/models/fixture-capability.js +0 -84
- package/esm2015/lib/models/fixture-channel-value.js +0 -11
- package/esm2015/lib/models/fixture-channel.js +0 -24
- package/esm2015/lib/models/fixture-mode.js +0 -14
- package/esm2015/lib/models/fixture-profile.js +0 -70
- package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
- package/esm2015/lib/models/fixture-wheel.js +0 -15
- package/esm2015/lib/models/fixture.js +0 -40
- package/esm2015/lib/models/preset-region-scene.js +0 -8
- package/esm2015/lib/models/preset.js +0 -56
- package/esm2015/lib/models/project.js +0 -68
- package/esm2015/lib/models/scene-playback-region.js +0 -11
- package/esm2015/lib/models/scene.js +0 -27
- package/esm2015/lib/models/universe.js +0 -11
- package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
- package/esm2015/lib/preset/preset.component.js +0 -85
- package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
- package/esm2015/lib/preview/models/fixture-3d.js +0 -150
- package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
- package/esm2015/lib/preview/preview.component.js +0 -242
- package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
- package/esm2015/lib/project/project-import/project-import.component.js +0 -89
- package/esm2015/lib/project/project-save/project-save.component.js +0 -105
- package/esm2015/lib/project/project-share/project-share.component.js +0 -43
- package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
- package/esm2015/lib/scene/scene.component.js +0 -56
- package/esm2015/lib/services/animation.service.js +0 -17
- package/esm2015/lib/services/config.service.js +0 -28
- package/esm2015/lib/services/effect.service.js +0 -16
- package/esm2015/lib/services/error-dialog.service.js +0 -44
- package/esm2015/lib/services/fixture-pool.service.js +0 -34
- package/esm2015/lib/services/fixture.service.js +0 -443
- package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
- package/esm2015/lib/services/intro.service.js +0 -144
- package/esm2015/lib/services/preset.service.js +0 -416
- package/esm2015/lib/services/preview-mesh.service.js +0 -58
- package/esm2015/lib/services/preview.service.js +0 -500
- package/esm2015/lib/services/project-load.service.js +0 -171
- package/esm2015/lib/services/project.service.js +0 -113
- package/esm2015/lib/services/scene.service.js +0 -174
- package/esm2015/lib/services/timeline.service.js +0 -738
- package/esm2015/lib/services/universe.service.js +0 -24
- package/esm2015/lib/services/user-ensure-login.service.js +0 -44
- package/esm2015/lib/services/user.service.js +0 -93
- package/esm2015/lib/services/uuid.service.js +0 -25
- package/esm2015/lib/services/warning-dialog.service.js +0 -43
- package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
- package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
- package/esm2015/lib/timeline/timeline.component.js +0 -239
- package/esm2015/lib/user/user-login/user-login.component.js +0 -64
- package/esm2015/lib/user/user-register/user-register.component.js +0 -89
- package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
- package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
- package/esm2015/public_api.js +0 -7
- package/esm2015/rocketshow-designer.js +0 -61
- package/esm5/lib/array-sort-pipe.js +0 -31
- package/esm5/lib/designer.component.js +0 -468
- package/esm5/lib/designer.module.js +0 -120
- package/esm5/lib/designer.service.js +0 -17
- package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
- package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
- package/esm5/lib/effect/effect.component.js +0 -75
- package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
- package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
- package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
- package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
- package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
- package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
- package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
- package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
- package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
- package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
- package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
- package/esm5/lib/fixture/fixture.component.js +0 -71
- package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
- package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
- package/esm5/lib/intro/intro.component.js +0 -26
- package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
- package/esm5/lib/models/cached-fixture-capability.js +0 -11
- package/esm5/lib/models/cached-fixture-channel.js +0 -9
- package/esm5/lib/models/cached-fixture.js +0 -8
- package/esm5/lib/models/color.js +0 -10
- package/esm5/lib/models/composition.js +0 -60
- package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
- package/esm5/lib/models/effect-curve.js +0 -95
- package/esm5/lib/models/effect-pan-tilt.js +0 -24
- package/esm5/lib/models/effect.js +0 -14
- package/esm5/lib/models/fixture-capability-value.js +0 -17
- package/esm5/lib/models/fixture-capability.js +0 -86
- package/esm5/lib/models/fixture-channel-value.js +0 -13
- package/esm5/lib/models/fixture-channel.js +0 -38
- package/esm5/lib/models/fixture-mode.js +0 -16
- package/esm5/lib/models/fixture-profile.js +0 -114
- package/esm5/lib/models/fixture-wheel-slot.js +0 -28
- package/esm5/lib/models/fixture-wheel.js +0 -29
- package/esm5/lib/models/fixture.js +0 -42
- package/esm5/lib/models/preset-region-scene.js +0 -10
- package/esm5/lib/models/preset.js +0 -90
- package/esm5/lib/models/project.js +0 -122
- package/esm5/lib/models/scene-playback-region.js +0 -13
- package/esm5/lib/models/scene.js +0 -29
- package/esm5/lib/models/universe.js +0 -13
- package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
- package/esm5/lib/preset/preset.component.js +0 -86
- package/esm5/lib/preview/models/color-changer-3d.js +0 -194
- package/esm5/lib/preview/models/fixture-3d.js +0 -196
- package/esm5/lib/preview/models/moving-head-3d.js +0 -250
- package/esm5/lib/preview/preview.component.js +0 -280
- package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
- package/esm5/lib/project/project-import/project-import.component.js +0 -88
- package/esm5/lib/project/project-save/project-save.component.js +0 -120
- package/esm5/lib/project/project-share/project-share.component.js +0 -44
- package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
- package/esm5/lib/scene/scene.component.js +0 -57
- package/esm5/lib/services/animation.service.js +0 -18
- package/esm5/lib/services/config.service.js +0 -29
- package/esm5/lib/services/effect.service.js +0 -17
- package/esm5/lib/services/error-dialog.service.js +0 -46
- package/esm5/lib/services/fixture-pool.service.js +0 -36
- package/esm5/lib/services/fixture.service.js +0 -643
- package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
- package/esm5/lib/services/intro.service.js +0 -145
- package/esm5/lib/services/preset.service.js +0 -637
- package/esm5/lib/services/preview-mesh.service.js +0 -61
- package/esm5/lib/services/preview.service.js +0 -754
- package/esm5/lib/services/project-load.service.js +0 -185
- package/esm5/lib/services/project.service.js +0 -127
- package/esm5/lib/services/scene.service.js +0 -251
- package/esm5/lib/services/timeline.service.js +0 -845
- package/esm5/lib/services/universe.service.js +0 -36
- package/esm5/lib/services/user-ensure-login.service.js +0 -45
- package/esm5/lib/services/user.service.js +0 -95
- package/esm5/lib/services/uuid.service.js +0 -26
- package/esm5/lib/services/warning-dialog.service.js +0 -45
- package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
- package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
- package/esm5/lib/timeline/timeline.component.js +0 -243
- package/esm5/lib/user/user-login/user-login.component.js +0 -66
- package/esm5/lib/user/user-register/user-register.component.js +0 -91
- package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
- package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
- package/esm5/public_api.js +0 -7
- package/esm5/rocketshow-designer.js +0 -61
- package/fesm2015/rocketshow-designer.js +0 -7945
- package/fesm2015/rocketshow-designer.js.map +0 -1
- package/fesm5/rocketshow-designer.js +0 -9690
- package/fesm5/rocketshow-designer.js.map +0 -1
- package/lib/models/universe.d.ts +0 -8
- package/lib/services/universe.service.d.ts +0 -6
- package/rocketshow-designer-1.32.0.tgz +0 -0
- package/rocketshow-designer.d.ts +0 -60
- package/rocketshow-designer.metadata.json +0 -1
|
@@ -1,643 +0,0 @@
|
|
|
1
|
-
import { __assign, __decorate, __metadata, __values } from "tslib";
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
-
import { ToastrService } from 'ngx-toastr';
|
|
6
|
-
import { forkJoin, of } from 'rxjs';
|
|
7
|
-
import { map } from 'rxjs/operators';
|
|
8
|
-
import { CachedFixture } from '../models/cached-fixture';
|
|
9
|
-
import { CachedFixtureCapability } from '../models/cached-fixture-capability';
|
|
10
|
-
import { CachedFixtureChannel } from '../models/cached-fixture-channel';
|
|
11
|
-
import { Color } from '../models/color';
|
|
12
|
-
import { Fixture } from '../models/fixture';
|
|
13
|
-
import { FixtureProfile } from '../models/fixture-profile';
|
|
14
|
-
import { FixtureWheelSlotType } from '../models/fixture-wheel-slot';
|
|
15
|
-
import { ProjectService } from './project.service';
|
|
16
|
-
import { UuidService } from './uuid.service';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
import * as i1 from "@angular/common/http";
|
|
19
|
-
import * as i2 from "./project.service";
|
|
20
|
-
import * as i3 from "@ngx-translate/core";
|
|
21
|
-
import * as i4 from "ngx-toastr";
|
|
22
|
-
import * as i5 from "./uuid.service";
|
|
23
|
-
var FixtureService = /** @class */ (function () {
|
|
24
|
-
function FixtureService(http, projectService, translateService, toastrService, uuidService) {
|
|
25
|
-
this.http = http;
|
|
26
|
-
this.projectService = projectService;
|
|
27
|
-
this.translateService = translateService;
|
|
28
|
-
this.toastrService = toastrService;
|
|
29
|
-
this.uuidService = uuidService;
|
|
30
|
-
this.cachedFixtures = [];
|
|
31
|
-
// is the side-tab settings currently selected?
|
|
32
|
-
this.settingsSelection = false;
|
|
33
|
-
this.selectedSettingsFixtures = [];
|
|
34
|
-
}
|
|
35
|
-
FixtureService.prototype.getFixtureByUuid = function (uuid) {
|
|
36
|
-
var e_1, _a;
|
|
37
|
-
try {
|
|
38
|
-
for (var _b = __values(this.projectService.project.fixtures), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
39
|
-
var fixture = _c.value;
|
|
40
|
-
if (fixture.uuid === uuid) {
|
|
41
|
-
return fixture;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
46
|
-
finally {
|
|
47
|
-
try {
|
|
48
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
49
|
-
}
|
|
50
|
-
finally { if (e_1) throw e_1.error; }
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
FixtureService.prototype.getCachedFixtureByUuid = function (uuid) {
|
|
54
|
-
var e_2, _a;
|
|
55
|
-
try {
|
|
56
|
-
for (var _b = __values(this.cachedFixtures), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
57
|
-
var fixture = _c.value;
|
|
58
|
-
if (fixture.fixture.uuid === uuid) {
|
|
59
|
-
return fixture;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
64
|
-
finally {
|
|
65
|
-
try {
|
|
66
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
67
|
-
}
|
|
68
|
-
finally { if (e_2) throw e_2.error; }
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
// Get all profiles to search for (only metadata)
|
|
72
|
-
FixtureService.prototype.getSearchProfiles = function () {
|
|
73
|
-
return this.http.get('fixtures').pipe(map(function (response) {
|
|
74
|
-
var e_3, _a;
|
|
75
|
-
var searchProfiles = [];
|
|
76
|
-
try {
|
|
77
|
-
for (var response_1 = __values(response), response_1_1 = response_1.next(); !response_1_1.done; response_1_1 = response_1.next()) {
|
|
78
|
-
var profile = response_1_1.value;
|
|
79
|
-
searchProfiles.push(new FixtureProfile(profile));
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
83
|
-
finally {
|
|
84
|
-
try {
|
|
85
|
-
if (response_1_1 && !response_1_1.done && (_a = response_1.return)) _a.call(response_1);
|
|
86
|
-
}
|
|
87
|
-
finally { if (e_3) throw e_3.error; }
|
|
88
|
-
}
|
|
89
|
-
return searchProfiles;
|
|
90
|
-
}));
|
|
91
|
-
};
|
|
92
|
-
FixtureService.prototype.getProfileByUuid = function (uuid) {
|
|
93
|
-
var e_4, _a;
|
|
94
|
-
try {
|
|
95
|
-
for (var _b = __values(this.projectService.project.fixtureProfiles), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
96
|
-
var fixtureProfile = _c.value;
|
|
97
|
-
if (fixtureProfile.uuid === uuid) {
|
|
98
|
-
return fixtureProfile;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
103
|
-
finally {
|
|
104
|
-
try {
|
|
105
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
106
|
-
}
|
|
107
|
-
finally { if (e_4) throw e_4.error; }
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
FixtureService.prototype.loadProfileByUuid = function (uuid) {
|
|
111
|
-
var _this = this;
|
|
112
|
-
var loadedProfile = this.getProfileByUuid(uuid);
|
|
113
|
-
if (loadedProfile) {
|
|
114
|
-
// This profile is already loaded
|
|
115
|
-
return of(undefined);
|
|
116
|
-
}
|
|
117
|
-
// Load the metadata and the profile
|
|
118
|
-
return forkJoin([this.http.get('fixtures?uuid=' + encodeURI(uuid)), this.http.get('fixture?uuid=' + encodeURI(uuid))]).pipe(map(function (result) {
|
|
119
|
-
var mergedData = __assign(__assign({}, result[0][0]), result[1]);
|
|
120
|
-
var fixtureProfile = new FixtureProfile(mergedData);
|
|
121
|
-
_this.projectService.project.fixtureProfiles.push(fixtureProfile);
|
|
122
|
-
}));
|
|
123
|
-
};
|
|
124
|
-
FixtureService.prototype.getRotationAngleDeg = function (value) {
|
|
125
|
-
// convert a rotation angle value into degrees
|
|
126
|
-
if (value.endsWith('deg')) {
|
|
127
|
-
return Number.parseInt(value.replace('deg', ''));
|
|
128
|
-
}
|
|
129
|
-
else if (value.endsWith('%')) {
|
|
130
|
-
var perc = Number.parseInt(value.replace('%', ''));
|
|
131
|
-
return (perc / 100) * 360;
|
|
132
|
-
}
|
|
133
|
-
return undefined;
|
|
134
|
-
};
|
|
135
|
-
FixtureService.prototype.getWheelSlotColors = function (wheel, slotNumber) {
|
|
136
|
-
var e_5, _a;
|
|
137
|
-
var colors = [];
|
|
138
|
-
var wheelSlots = this.getWheelSlots(wheel, slotNumber);
|
|
139
|
-
try {
|
|
140
|
-
for (var wheelSlots_1 = __values(wheelSlots), wheelSlots_1_1 = wheelSlots_1.next(); !wheelSlots_1_1.done; wheelSlots_1_1 = wheelSlots_1.next()) {
|
|
141
|
-
var slot = wheelSlots_1_1.value;
|
|
142
|
-
if (slot.colors && slot.colors.length > 0) {
|
|
143
|
-
colors = colors.concat(slot.colors);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
148
|
-
finally {
|
|
149
|
-
try {
|
|
150
|
-
if (wheelSlots_1_1 && !wheelSlots_1_1.done && (_a = wheelSlots_1.return)) _a.call(wheelSlots_1);
|
|
151
|
-
}
|
|
152
|
-
finally { if (e_5) throw e_5.error; }
|
|
153
|
-
}
|
|
154
|
-
return colors;
|
|
155
|
-
};
|
|
156
|
-
FixtureService.prototype.getMixedWheelSlotColor = function (wheel, slotNumber) {
|
|
157
|
-
var e_6, _a;
|
|
158
|
-
var colors = this.getWheelSlotColors(wheel, slotNumber);
|
|
159
|
-
var colorsRgb = [];
|
|
160
|
-
if (colors.length === 0) {
|
|
161
|
-
return undefined;
|
|
162
|
-
}
|
|
163
|
-
try {
|
|
164
|
-
for (var colors_1 = __values(colors), colors_1_1 = colors_1.next(); !colors_1_1.done; colors_1_1 = colors_1.next()) {
|
|
165
|
-
var color = colors_1_1.value;
|
|
166
|
-
colorsRgb.push(this.hexToRgb(color));
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
170
|
-
finally {
|
|
171
|
-
try {
|
|
172
|
-
if (colors_1_1 && !colors_1_1.done && (_a = colors_1.return)) _a.call(colors_1);
|
|
173
|
-
}
|
|
174
|
-
finally { if (e_6) throw e_6.error; }
|
|
175
|
-
}
|
|
176
|
-
return this.mixColors(colorsRgb);
|
|
177
|
-
};
|
|
178
|
-
FixtureService.prototype.componentToHex = function (c) {
|
|
179
|
-
var hex = c.toString(16);
|
|
180
|
-
return hex.length === 1 ? '0' + hex : hex;
|
|
181
|
-
};
|
|
182
|
-
FixtureService.prototype.rgbToHex = function (r, g, b) {
|
|
183
|
-
return '#' + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b);
|
|
184
|
-
};
|
|
185
|
-
FixtureService.prototype.hexToRgb = function (hex) {
|
|
186
|
-
// expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
|
|
187
|
-
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
|
|
188
|
-
hex = hex.replace(shorthandRegex, function (m, r, g, b) {
|
|
189
|
-
return r + r + g + g + b + b;
|
|
190
|
-
});
|
|
191
|
-
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
192
|
-
return result ? new Color(parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)) : null;
|
|
193
|
-
};
|
|
194
|
-
FixtureService.prototype.mixColors = function (colors) {
|
|
195
|
-
var e_7, _a;
|
|
196
|
-
// mix an array of rgb-colors containing r, g, b values to a new color
|
|
197
|
-
var r = 0;
|
|
198
|
-
var g = 0;
|
|
199
|
-
var b = 0;
|
|
200
|
-
try {
|
|
201
|
-
for (var colors_2 = __values(colors), colors_2_1 = colors_2.next(); !colors_2_1.done; colors_2_1 = colors_2.next()) {
|
|
202
|
-
var color = colors_2_1.value;
|
|
203
|
-
r += color.red;
|
|
204
|
-
g += color.green;
|
|
205
|
-
b += color.blue;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
209
|
-
finally {
|
|
210
|
-
try {
|
|
211
|
-
if (colors_2_1 && !colors_2_1.done && (_a = colors_2.return)) _a.call(colors_2);
|
|
212
|
-
}
|
|
213
|
-
finally { if (e_7) throw e_7.error; }
|
|
214
|
-
}
|
|
215
|
-
r /= colors.length;
|
|
216
|
-
g /= colors.length;
|
|
217
|
-
b /= colors.length;
|
|
218
|
-
return new Color(r, g, b);
|
|
219
|
-
};
|
|
220
|
-
FixtureService.prototype.wheelHasSlotType = function (wheel, slotType) {
|
|
221
|
-
var e_8, _a;
|
|
222
|
-
try {
|
|
223
|
-
for (var _b = __values(wheel.slots), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
224
|
-
var slot = _c.value;
|
|
225
|
-
if (slot.type === slotType) {
|
|
226
|
-
return true;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
231
|
-
finally {
|
|
232
|
-
try {
|
|
233
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
234
|
-
}
|
|
235
|
-
finally { if (e_8) throw e_8.error; }
|
|
236
|
-
}
|
|
237
|
-
return false;
|
|
238
|
-
};
|
|
239
|
-
FixtureService.prototype.getWheelByName = function (profile, wheelName) {
|
|
240
|
-
for (var property in profile.wheels) {
|
|
241
|
-
if (property === wheelName) {
|
|
242
|
-
return profile.wheels[property];
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
// wheel not found
|
|
246
|
-
return undefined;
|
|
247
|
-
};
|
|
248
|
-
FixtureService.prototype.getWheelSlots = function (wheel, slotNumber) {
|
|
249
|
-
// return one slot or two slots, if they are mixed (e.g. slor number 2.5 returns the slots 2 and 3)
|
|
250
|
-
var slots = [];
|
|
251
|
-
if (!wheel) {
|
|
252
|
-
return slots;
|
|
253
|
-
}
|
|
254
|
-
if (slotNumber - Math.floor(slotNumber) > 0) {
|
|
255
|
-
// two slots are set
|
|
256
|
-
var number = Math.floor(slotNumber);
|
|
257
|
-
slots.push(wheel.slots[number - 1]);
|
|
258
|
-
if (number >= 0 && number < wheel.slots.length) {
|
|
259
|
-
slots.push(wheel.slots[number]);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
// only one slot is set
|
|
264
|
-
slots.push(wheel.slots[slotNumber - 1]);
|
|
265
|
-
}
|
|
266
|
-
return slots;
|
|
267
|
-
};
|
|
268
|
-
FixtureService.prototype.getModeByFixture = function (profile, fixture) {
|
|
269
|
-
var e_9, _a;
|
|
270
|
-
try {
|
|
271
|
-
for (var _b = __values(profile.modes), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
272
|
-
var mode = _c.value;
|
|
273
|
-
if (mode.shortName) {
|
|
274
|
-
if (mode.shortName === fixture.modeShortName) {
|
|
275
|
-
return mode;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
if (mode.name === fixture.modeShortName) {
|
|
280
|
-
return mode;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
286
|
-
finally {
|
|
287
|
-
try {
|
|
288
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
289
|
-
}
|
|
290
|
-
finally { if (e_9) throw e_9.error; }
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
FixtureService.prototype.getFixtureCapability = function (capability, channelName, profile) {
|
|
294
|
-
var cachedFixtureCapability = new CachedFixtureCapability();
|
|
295
|
-
cachedFixtureCapability.capability = capability;
|
|
296
|
-
if (capability.slotNumber) {
|
|
297
|
-
// there is a wheel connected to this capability
|
|
298
|
-
if (typeof capability.wheel === 'string') {
|
|
299
|
-
cachedFixtureCapability.wheelName = capability.wheel;
|
|
300
|
-
}
|
|
301
|
-
else if (Array.isArray(capability.wheel)) {
|
|
302
|
-
cachedFixtureCapability.wheelName = capability.wheel[0];
|
|
303
|
-
}
|
|
304
|
-
else {
|
|
305
|
-
cachedFixtureCapability.wheelName = channelName;
|
|
306
|
-
}
|
|
307
|
-
cachedFixtureCapability.wheel = this.getWheelByName(profile, cachedFixtureCapability.wheelName);
|
|
308
|
-
cachedFixtureCapability.wheelSlots = this.getWheelSlots(cachedFixtureCapability.wheel, capability.slotNumber);
|
|
309
|
-
cachedFixtureCapability.wheelIsColor = this.wheelHasSlotType(cachedFixtureCapability.wheel, FixtureWheelSlotType.Color);
|
|
310
|
-
}
|
|
311
|
-
if (cachedFixtureCapability.capability.dmxRange && cachedFixtureCapability.capability.dmxRange.length === 2) {
|
|
312
|
-
cachedFixtureCapability.centerValue = Math.floor((cachedFixtureCapability.capability.dmxRange[0] + cachedFixtureCapability.capability.dmxRange[1]) / 2);
|
|
313
|
-
}
|
|
314
|
-
return cachedFixtureCapability;
|
|
315
|
-
};
|
|
316
|
-
FixtureService.prototype.getCapabilitiesByChannel = function (fixtureChannel, channelName, profile) {
|
|
317
|
-
var e_10, _a;
|
|
318
|
-
var capabilites = [];
|
|
319
|
-
if (fixtureChannel.capability) {
|
|
320
|
-
capabilites.push(this.getFixtureCapability(fixtureChannel.capability, channelName, profile));
|
|
321
|
-
}
|
|
322
|
-
else if (fixtureChannel.capabilities) {
|
|
323
|
-
try {
|
|
324
|
-
for (var _b = __values(fixtureChannel.capabilities), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
325
|
-
var capability = _c.value;
|
|
326
|
-
capabilites.push(this.getFixtureCapability(capability, channelName, profile));
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
330
|
-
finally {
|
|
331
|
-
try {
|
|
332
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
333
|
-
}
|
|
334
|
-
finally { if (e_10) throw e_10.error; }
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return capabilites;
|
|
338
|
-
};
|
|
339
|
-
FixtureService.prototype.getMaxValueByChannel = function (fixtureChannel) {
|
|
340
|
-
return Math.pow(256, 1 + fixtureChannel.fineChannelAliases.length) - 1;
|
|
341
|
-
};
|
|
342
|
-
FixtureService.prototype.getDefaultValueByChannel = function (fixtureChannel) {
|
|
343
|
-
if (!fixtureChannel.defaultValue) {
|
|
344
|
-
return undefined;
|
|
345
|
-
}
|
|
346
|
-
if (isNaN(fixtureChannel.defaultValue) && fixtureChannel.defaultValue.endsWith('%')) {
|
|
347
|
-
// percentage value
|
|
348
|
-
var percentage = Number.parseInt(fixtureChannel.defaultValue.replace('%', ''));
|
|
349
|
-
var maxValue = this.getMaxValueByChannel(fixtureChannel);
|
|
350
|
-
return (maxValue / 100) * percentage;
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
// DMX value
|
|
354
|
-
return Number.parseInt(fixtureChannel.defaultValue);
|
|
355
|
-
}
|
|
356
|
-
};
|
|
357
|
-
FixtureService.prototype.getColorWheelByChannel = function (channel, profile) {
|
|
358
|
-
var e_11, _a;
|
|
359
|
-
try {
|
|
360
|
-
for (var _b = __values(channel.capabilities), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
361
|
-
var channelCapability = _c.value;
|
|
362
|
-
if (channelCapability.wheelIsColor) {
|
|
363
|
-
return channelCapability.wheel;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
|
368
|
-
finally {
|
|
369
|
-
try {
|
|
370
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
371
|
-
}
|
|
372
|
-
finally { if (e_11) throw e_11.error; }
|
|
373
|
-
}
|
|
374
|
-
return undefined;
|
|
375
|
-
};
|
|
376
|
-
// private channelInList(channels: CachedFixtureChannel[], name: string): boolean {
|
|
377
|
-
// for (let channel of channels) {
|
|
378
|
-
// if (channel.channelName === name) {
|
|
379
|
-
// return true;
|
|
380
|
-
// }
|
|
381
|
-
// }
|
|
382
|
-
// return false;
|
|
383
|
-
// }
|
|
384
|
-
FixtureService.prototype.getChannelByName = function (fixture, channelName) {
|
|
385
|
-
var e_12, _a;
|
|
386
|
-
try {
|
|
387
|
-
for (var _b = __values(fixture.channels), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
388
|
-
var channel = _c.value;
|
|
389
|
-
if ((channel.name && channel.name === channelName) ||
|
|
390
|
-
(channel.channel && channel.channel.fineChannelAliases.indexOf(channelName) > -1)) {
|
|
391
|
-
return channel;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
catch (e_12_1) { e_12 = { error: e_12_1 }; }
|
|
396
|
-
finally {
|
|
397
|
-
try {
|
|
398
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
399
|
-
}
|
|
400
|
-
finally { if (e_12) throw e_12.error; }
|
|
401
|
-
}
|
|
402
|
-
return undefined;
|
|
403
|
-
};
|
|
404
|
-
FixtureService.prototype.getCachedChannels = function (profile, mode) {
|
|
405
|
-
var e_13, _a, e_14, _b;
|
|
406
|
-
var channels = [];
|
|
407
|
-
if (!mode) {
|
|
408
|
-
return channels;
|
|
409
|
-
}
|
|
410
|
-
try {
|
|
411
|
-
for (var _c = __values(Object.keys(profile.availableChannels)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
412
|
-
var availableChannelName = _d.value;
|
|
413
|
-
var availableChannel = profile.availableChannels[availableChannelName];
|
|
414
|
-
try {
|
|
415
|
-
for (var _e = (e_14 = void 0, __values(mode.channels)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
416
|
-
var channel = _f.value;
|
|
417
|
-
// check for string channel. It can get creepy for matrix modes
|
|
418
|
-
if (typeof channel === 'string') {
|
|
419
|
-
var modeChannel = channel;
|
|
420
|
-
// don't check the fine channels. only add the coarse channel.
|
|
421
|
-
if (modeChannel === availableChannelName) {
|
|
422
|
-
var cachedFixtureChannel = new CachedFixtureChannel();
|
|
423
|
-
cachedFixtureChannel.channel = availableChannel;
|
|
424
|
-
cachedFixtureChannel.name = availableChannelName;
|
|
425
|
-
cachedFixtureChannel.capabilities = this.getCapabilitiesByChannel(cachedFixtureChannel.channel, availableChannelName, profile);
|
|
426
|
-
var defaultValue = this.getDefaultValueByChannel(cachedFixtureChannel.channel);
|
|
427
|
-
if (defaultValue) {
|
|
428
|
-
cachedFixtureChannel.defaultValue = defaultValue;
|
|
429
|
-
}
|
|
430
|
-
cachedFixtureChannel.maxValue = this.getMaxValueByChannel(cachedFixtureChannel.channel);
|
|
431
|
-
cachedFixtureChannel.colorWheel = this.getColorWheelByChannel(cachedFixtureChannel, profile);
|
|
432
|
-
channels.push(cachedFixtureChannel);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
else {
|
|
436
|
-
// null may be passed as a placeholder for an undefined channel
|
|
437
|
-
channels.push(new CachedFixtureChannel());
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
catch (e_14_1) { e_14 = { error: e_14_1 }; }
|
|
442
|
-
finally {
|
|
443
|
-
try {
|
|
444
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
445
|
-
}
|
|
446
|
-
finally { if (e_14) throw e_14.error; }
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
catch (e_13_1) { e_13 = { error: e_13_1 }; }
|
|
451
|
-
finally {
|
|
452
|
-
try {
|
|
453
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
454
|
-
}
|
|
455
|
-
finally { if (e_13) throw e_13.error; }
|
|
456
|
-
}
|
|
457
|
-
return channels;
|
|
458
|
-
};
|
|
459
|
-
FixtureService.prototype.updateCachedFixtures = function () {
|
|
460
|
-
var e_15, _a;
|
|
461
|
-
// calculate some frequently used values as a cache to save cpu time
|
|
462
|
-
// afterwards
|
|
463
|
-
this.cachedFixtures = [];
|
|
464
|
-
try {
|
|
465
|
-
for (var _b = __values(this.projectService.project.fixtures), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
466
|
-
var fixture = _c.value;
|
|
467
|
-
var cachedFixture = new CachedFixture();
|
|
468
|
-
cachedFixture.fixture = fixture;
|
|
469
|
-
cachedFixture.profile = this.getProfileByUuid(fixture.profileUuid);
|
|
470
|
-
cachedFixture.mode = this.getModeByFixture(cachedFixture.profile, fixture);
|
|
471
|
-
cachedFixture.channels = this.getCachedChannels(cachedFixture.profile, cachedFixture.mode);
|
|
472
|
-
this.cachedFixtures.push(cachedFixture);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
catch (e_15_1) { e_15 = { error: e_15_1 }; }
|
|
476
|
-
finally {
|
|
477
|
-
try {
|
|
478
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
479
|
-
}
|
|
480
|
-
finally { if (e_15) throw e_15.error; }
|
|
481
|
-
}
|
|
482
|
-
};
|
|
483
|
-
FixtureService.prototype.capabilitiesMatch = function (type1, type2, color1, color2, wheel1, wheel2, profileUuid1, profileUuid2) {
|
|
484
|
-
// checks, whether two provided capapabilities match
|
|
485
|
-
return (type1 === type2 &&
|
|
486
|
-
(!color1 || color1 === color2) &&
|
|
487
|
-
(!wheel1 || wheel1 === wheel2) &&
|
|
488
|
-
(!profileUuid1 || profileUuid1 === profileUuid2));
|
|
489
|
-
};
|
|
490
|
-
FixtureService.prototype.settingsFixtureIsSelected = function (fixture) {
|
|
491
|
-
var e_16, _a;
|
|
492
|
-
try {
|
|
493
|
-
for (var _b = __values(this.selectedSettingsFixtures), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
494
|
-
var selectedFixture = _c.value;
|
|
495
|
-
if (selectedFixture === fixture) {
|
|
496
|
-
return true;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
catch (e_16_1) { e_16 = { error: e_16_1 }; }
|
|
501
|
-
finally {
|
|
502
|
-
try {
|
|
503
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
504
|
-
}
|
|
505
|
-
finally { if (e_16) throw e_16.error; }
|
|
506
|
-
}
|
|
507
|
-
return false;
|
|
508
|
-
};
|
|
509
|
-
FixtureService.prototype.switchSettingsFixtureSelection = function (fixture) {
|
|
510
|
-
if (this.settingsFixtureIsSelected(fixture)) {
|
|
511
|
-
this.selectedSettingsFixtures.splice(this.selectedSettingsFixtures.indexOf(fixture), 1);
|
|
512
|
-
}
|
|
513
|
-
else {
|
|
514
|
-
this.selectedSettingsFixtures.push(fixture);
|
|
515
|
-
}
|
|
516
|
-
};
|
|
517
|
-
FixtureService.prototype.getFixtureIconClass = function (profile) {
|
|
518
|
-
if (!profile) {
|
|
519
|
-
return '';
|
|
520
|
-
}
|
|
521
|
-
if (profile.categories.length === 0) {
|
|
522
|
-
return '';
|
|
523
|
-
}
|
|
524
|
-
if (!profile.categories[0]) {
|
|
525
|
-
return '';
|
|
526
|
-
}
|
|
527
|
-
return profile.categories[0].replace(' ', '-').toLocaleLowerCase();
|
|
528
|
-
};
|
|
529
|
-
FixtureService.prototype.updateProfiles = function () {
|
|
530
|
-
return this.http.post('update-profiles', null);
|
|
531
|
-
};
|
|
532
|
-
FixtureService.prototype.getNextFreeDmxChannel = function (fixturePool, neededChannels) {
|
|
533
|
-
var e_17, _a;
|
|
534
|
-
// get the next free space for this fixture
|
|
535
|
-
var freeChannels = 0;
|
|
536
|
-
for (var i = 0; i < 512; i++) {
|
|
537
|
-
var occupiedChannels = 0;
|
|
538
|
-
try {
|
|
539
|
-
for (var fixturePool_1 = (e_17 = void 0, __values(fixturePool)), fixturePool_1_1 = fixturePool_1.next(); !fixturePool_1_1.done; fixturePool_1_1 = fixturePool_1.next()) {
|
|
540
|
-
var fixture = fixturePool_1_1.value;
|
|
541
|
-
var mode = this.getModeByFixture(this.getProfileByUuid(fixture.profileUuid), fixture);
|
|
542
|
-
if (i >= fixture.dmxFirstChannel && i < fixture.dmxFirstChannel + mode.channels.length) {
|
|
543
|
-
// this channel is already occupied by a fixture -> move forward to the end of the fixture
|
|
544
|
-
if (mode.channels.length > occupiedChannels) {
|
|
545
|
-
occupiedChannels = mode.channels.length - (i - fixture.dmxFirstChannel);
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
catch (e_17_1) { e_17 = { error: e_17_1 }; }
|
|
551
|
-
finally {
|
|
552
|
-
try {
|
|
553
|
-
if (fixturePool_1_1 && !fixturePool_1_1.done && (_a = fixturePool_1.return)) _a.call(fixturePool_1);
|
|
554
|
-
}
|
|
555
|
-
finally { if (e_17) throw e_17.error; }
|
|
556
|
-
}
|
|
557
|
-
if (occupiedChannels > 0) {
|
|
558
|
-
i += occupiedChannels - 1;
|
|
559
|
-
freeChannels = 0;
|
|
560
|
-
}
|
|
561
|
-
else {
|
|
562
|
-
freeChannels++;
|
|
563
|
-
}
|
|
564
|
-
if (freeChannels === neededChannels) {
|
|
565
|
-
return i - freeChannels + 1;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
// no free space left for the needed channels
|
|
569
|
-
return -1;
|
|
570
|
-
};
|
|
571
|
-
FixtureService.prototype.addFixture = function (profile, fixturePool) {
|
|
572
|
-
var e_18, _a;
|
|
573
|
-
var _this = this;
|
|
574
|
-
var fixture = new Fixture();
|
|
575
|
-
fixture.uuid = this.uuidService.getUuid();
|
|
576
|
-
fixture.profileUuid = profile.uuid;
|
|
577
|
-
fixture.name = profile.name;
|
|
578
|
-
if (profile.modes && profile.modes.length > 0) {
|
|
579
|
-
fixture.modeShortName = profile.modes[0].shortName;
|
|
580
|
-
}
|
|
581
|
-
// add the same mode as an existing fixture, if available
|
|
582
|
-
var existingModeShortName;
|
|
583
|
-
try {
|
|
584
|
-
for (var fixturePool_2 = __values(fixturePool), fixturePool_2_1 = fixturePool_2.next(); !fixturePool_2_1.done; fixturePool_2_1 = fixturePool_2.next()) {
|
|
585
|
-
var existingFixture = fixturePool_2_1.value;
|
|
586
|
-
var existingProfile = this.getProfileByUuid(existingFixture.profileUuid);
|
|
587
|
-
if (existingProfile === profile) {
|
|
588
|
-
existingModeShortName = existingFixture.modeShortName;
|
|
589
|
-
break;
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
catch (e_18_1) { e_18 = { error: e_18_1 }; }
|
|
594
|
-
finally {
|
|
595
|
-
try {
|
|
596
|
-
if (fixturePool_2_1 && !fixturePool_2_1.done && (_a = fixturePool_2.return)) _a.call(fixturePool_2);
|
|
597
|
-
}
|
|
598
|
-
finally { if (e_18) throw e_18.error; }
|
|
599
|
-
}
|
|
600
|
-
if (existingModeShortName) {
|
|
601
|
-
fixture.modeShortName = existingModeShortName;
|
|
602
|
-
}
|
|
603
|
-
else {
|
|
604
|
-
fixture.modeShortName = profile.modes[0].shortName || profile.modes[0].name;
|
|
605
|
-
}
|
|
606
|
-
var mode = this.getModeByFixture(this.getProfileByUuid(fixture.profileUuid), fixture);
|
|
607
|
-
var firstChannel = this.getNextFreeDmxChannel(fixturePool, mode.channels.length);
|
|
608
|
-
if (firstChannel >= 0) {
|
|
609
|
-
fixture.dmxFirstChannel = firstChannel;
|
|
610
|
-
fixturePool.push(fixture);
|
|
611
|
-
return fixture;
|
|
612
|
-
}
|
|
613
|
-
else {
|
|
614
|
-
// no free space anymore
|
|
615
|
-
var msg_1 = 'designer.fixture-pool.no-free-space';
|
|
616
|
-
var title_1 = 'designer.fixture-pool.no-free-space-title';
|
|
617
|
-
this.translateService.get([msg_1, title_1]).subscribe(function (result) {
|
|
618
|
-
_this.toastrService.error(result[msg_1], result[title_1]);
|
|
619
|
-
});
|
|
620
|
-
}
|
|
621
|
-
};
|
|
622
|
-
FixtureService.ctorParameters = function () { return [
|
|
623
|
-
{ type: HttpClient },
|
|
624
|
-
{ type: ProjectService },
|
|
625
|
-
{ type: TranslateService },
|
|
626
|
-
{ type: ToastrService },
|
|
627
|
-
{ type: UuidService }
|
|
628
|
-
]; };
|
|
629
|
-
FixtureService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FixtureService_Factory() { return new FixtureService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.ProjectService), i0.ɵɵinject(i3.TranslateService), i0.ɵɵinject(i4.ToastrService), i0.ɵɵinject(i5.UuidService)); }, token: FixtureService, providedIn: "root" });
|
|
630
|
-
FixtureService = __decorate([
|
|
631
|
-
Injectable({
|
|
632
|
-
providedIn: 'root',
|
|
633
|
-
}),
|
|
634
|
-
__metadata("design:paramtypes", [HttpClient,
|
|
635
|
-
ProjectService,
|
|
636
|
-
TranslateService,
|
|
637
|
-
ToastrService,
|
|
638
|
-
UuidService])
|
|
639
|
-
], FixtureService);
|
|
640
|
-
return FixtureService;
|
|
641
|
-
}());
|
|
642
|
-
export { FixtureService };
|
|
643
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHJvY2tldHNob3cvZGVzaWduZXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvZml4dHVyZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsT0FBTyxFQUFvQixvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFLN0M7SUFRRSx3QkFDVSxJQUFnQixFQUNoQixjQUE4QixFQUM5QixnQkFBa0MsRUFDbEMsYUFBNEIsRUFDNUIsV0FBd0I7UUFKeEIsU0FBSSxH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QUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDO3lDQVVnQixVQUFVO1lBQ0EsY0FBYztZQUNaLGdCQUFnQjtZQUNuQixhQUFhO1lBQ2YsV0FBVztPQWJ2QixjQUFjLENBOGUxQjt5QkFyZ0JEO0NBcWdCQyxBQTllRCxJQThlQztTQTllWSxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZSB9IGZyb20gJy4uL21vZGVscy9jYWNoZWQtZml4dHVyZSc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eSB9IGZyb20gJy4uL21vZGVscy9jYWNoZWQtZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlLWNoYW5uZWwnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tb2RlbHMvY29sb3InO1xuaW1wb3J0IHsgRml4dHVyZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlJztcbmltcG9ydCB7IEZpeHR1cmVDYXBhYmlsaXR5LCBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLCBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtY2hhbm5lbCc7XG5pbXBvcnQgeyBGaXh0dXJlTW9kZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLW1vZGUnO1xuaW1wb3J0IHsgRml4dHVyZVByb2ZpbGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1wcm9maWxlJztcbmltcG9ydCB7IEZpeHR1cmVXaGVlbCB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLXdoZWVsJztcbmltcG9ydCB7IEZpeHR1cmVXaGVlbFNsb3QsIEZpeHR1cmVXaGVlbFNsb3RUeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtd2hlZWwtc2xvdCc7XG5pbXBvcnQgeyBQcm9qZWN0U2VydmljZSB9IGZyb20gJy4vcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFV1aWRTZXJ2aWNlIH0gZnJvbSAnLi91dWlkLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRml4dHVyZVNlcnZpY2Uge1xuICBjYWNoZWRGaXh0dXJlczogQ2FjaGVkRml4dHVyZVtdID0gW107XG5cbiAgLy8gaXMgdGhlIHNpZGUtdGFiIHNldHRpbmdzIGN1cnJlbnRseSBzZWxlY3RlZD9cbiAgc2V0dGluZ3NTZWxlY3Rpb24gPSBmYWxzZTtcblxuICBzZWxlY3RlZFNldHRpbmdzRml4dHVyZXM6IEZpeHR1cmVbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFV1aWRTZXJ2aWNlXG4gICkge31cblxuICBnZXRGaXh0dXJlQnlVdWlkKHV1aWQ6IHN0cmluZyk6IEZpeHR1cmUge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgIGlmIChmaXh0dXJlLnV1aWQgPT09IHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FjaGVkRml4dHVyZUJ5VXVpZCh1dWlkOiBzdHJpbmcpOiBDYWNoZWRGaXh0dXJlIHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5jYWNoZWRGaXh0dXJlcykge1xuICAgICAgaWYgKGZpeHR1cmUuZml4dHVyZS51dWlkID09PSB1dWlkKSB7XG4gICAgICAgIHJldHVybiBmaXh0dXJlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBhbGwgcHJvZmlsZXMgdG8gc2VhcmNoIGZvciAob25seSBtZXRhZGF0YSlcbiAgZ2V0U2VhcmNoUHJvZmlsZXMoKTogT2JzZXJ2YWJsZTxGaXh0dXJlUHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ2ZpeHR1cmVzJykucGlwZShcbiAgICAgIG1hcCgocmVzcG9uc2U6IG9iamVjdFtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9maWxlIG9mIHJlc3BvbnNlKSB7XG4gICAgICAgICAgc2VhcmNoUHJvZmlsZXMucHVzaChuZXcgRml4dHVyZVByb2ZpbGUocHJvZmlsZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlYXJjaFByb2ZpbGVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UHJvZmlsZUJ5VXVpZCh1dWlkOiBzdHJpbmcpOiBGaXh0dXJlUHJvZmlsZSB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlUHJvZmlsZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzKSB7XG4gICAgICBpZiAoZml4dHVyZVByb2ZpbGUudXVpZCA9PT0gdXVpZCkge1xuICAgICAgICByZXR1cm4gZml4dHVyZVByb2ZpbGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZFByb2ZpbGVCeVV1aWQodXVpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZGVkUHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZCh1dWlkKTtcblxuICAgIGlmIChsb2FkZWRQcm9maWxlKSB7XG4gICAgICAvLyBUaGlzIHByb2ZpbGUgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8vIExvYWQgdGhlIG1ldGFkYXRhIGFuZCB0aGUgcHJvZmlsZVxuICAgIHJldHVybiBmb3JrSm9pbihbdGhpcy5odHRwLmdldCgnZml4dHVyZXM/dXVpZD0nICsgZW5jb2RlVVJJKHV1aWQpKSwgdGhpcy5odHRwLmdldCgnZml4dHVyZT91dWlkPScgKyBlbmNvZGVVUkkodXVpZCkpXSkucGlwZShcbiAgICAgIG1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnN0IG1lcmdlZERhdGEgPSB7IC4uLnJlc3VsdFswXVswXSwgLi4ucmVzdWx0WzFdIH07XG4gICAgICAgIGNvbnN0IGZpeHR1cmVQcm9maWxlID0gbmV3IEZpeHR1cmVQcm9maWxlKG1lcmdlZERhdGEpO1xuICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzLnB1c2goZml4dHVyZVByb2ZpbGUpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0Um90YXRpb25BbmdsZURlZyh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBjb252ZXJ0IGEgcm90YXRpb24gYW5nbGUgdmFsdWUgaW50byBkZWdyZWVzXG4gICAgaWYgKHZhbHVlLmVuZHNXaXRoKCdkZWcnKSkge1xuICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludCh2YWx1ZS5yZXBsYWNlKCdkZWcnLCAnJykpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgY29uc3QgcGVyYyA9IE51bWJlci5wYXJzZUludCh2YWx1ZS5yZXBsYWNlKCclJywgJycpKTtcbiAgICAgIHJldHVybiAocGVyYyAvIDEwMCkgKiAzNjA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFdoZWVsU2xvdENvbG9ycyh3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGNvbG9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3aGVlbFNsb3RzID0gdGhpcy5nZXRXaGVlbFNsb3RzKHdoZWVsLCBzbG90TnVtYmVyKTtcblxuICAgIGZvciAoY29uc3Qgc2xvdCBvZiB3aGVlbFNsb3RzKSB7XG4gICAgICBpZiAoc2xvdC5jb2xvcnMgJiYgc2xvdC5jb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xvcnMgPSBjb2xvcnMuY29uY2F0KHNsb3QuY29sb3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZ2V0TWl4ZWRXaGVlbFNsb3RDb2xvcih3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBDb2xvciB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5nZXRXaGVlbFNsb3RDb2xvcnMod2hlZWwsIHNsb3ROdW1iZXIpO1xuICAgIGNvbnN0IGNvbG9yc1JnYjogQ29sb3JbXSA9IFtdO1xuXG4gICAgaWYgKGNvbG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb2xvciBvZiBjb2xvcnMpIHtcbiAgICAgIGNvbG9yc1JnYi5wdXNoKHRoaXMuaGV4VG9SZ2IoY29sb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5taXhDb2xvcnMoY29sb3JzUmdiKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcG9uZW50VG9IZXgoYzogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBoZXggPSBjLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/ICcwJyArIGhleCA6IGhleDtcbiAgfVxuXG4gIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIycgKyB0aGlzLmNvbXBvbmVudFRvSGV4KHIpICsgdGhpcy5jb21wb25lbnRUb0hleChnKSArIHRoaXMuY29tcG9uZW50VG9IZXgoYik7XG4gIH1cblxuICBoZXhUb1JnYihoZXg6IHN0cmluZyk6IENvbG9yIHtcbiAgICAvLyBleHBhbmQgc2hvcnRoYW5kIGZvcm0gKGUuZy4gXCIwM0ZcIikgdG8gZnVsbCBmb3JtIChlLmcuIFwiMDAzM0ZGXCIpXG4gICAgY29uc3Qgc2hvcnRoYW5kUmVnZXggPSAvXiM/KFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pJC9pO1xuICAgIGhleCA9IGhleC5yZXBsYWNlKHNob3J0aGFuZFJlZ2V4LCAobSwgciwgZywgYikgPT4ge1xuICAgICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYjtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuICAgIHJldHVybiByZXN1bHQgPyBuZXcgQ29sb3IocGFyc2VJbnQocmVzdWx0WzFdLCAxNiksIHBhcnNlSW50KHJlc3VsdFsyXSwgMTYpLCBwYXJzZUludChyZXN1bHRbM10sIDE2KSkgOiBudWxsO1xuICB9XG5cbiAgbWl4Q29sb3JzKGNvbG9yczogQ29sb3JbXSk6IENvbG9yIHtcbiAgICAvLyBtaXggYW4gYXJyYXkgb2YgcmdiLWNvbG9ycyBjb250YWluaW5nIHIsIGcsIGIgdmFsdWVzIHRvIGEgbmV3IGNvbG9yXG4gICAgbGV0IHIgPSAwO1xuICAgIGxldCBnID0gMDtcbiAgICBsZXQgYiA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIGNvbG9ycykge1xuICAgICAgciArPSBjb2xvci5yZWQ7XG4gICAgICBnICs9IGNvbG9yLmdyZWVuO1xuICAgICAgYiArPSBjb2xvci5ibHVlO1xuICAgIH1cblxuICAgIHIgLz0gY29sb3JzLmxlbmd0aDtcbiAgICBnIC89IGNvbG9ycy5sZW5ndGg7XG4gICAgYiAvPSBjb2xvcnMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIG5ldyBDb2xvcihyLCBnLCBiKTtcbiAgfVxuXG4gIHdoZWVsSGFzU2xvdFR5cGUod2hlZWw6IEZpeHR1cmVXaGVlbCwgc2xvdFR5cGU6IEZpeHR1cmVXaGVlbFNsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzbG90IG9mIHdoZWVsLnNsb3RzKSB7XG4gICAgICBpZiAoc2xvdC50eXBlID09PSBzbG90VHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRXaGVlbEJ5TmFtZShwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgd2hlZWxOYW1lOiBzdHJpbmcpOiBGaXh0dXJlV2hlZWwge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvZmlsZS53aGVlbHMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gd2hlZWxOYW1lKSB7XG4gICAgICAgIHJldHVybiBwcm9maWxlLndoZWVsc1twcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gd2hlZWwgbm90IGZvdW5kXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2hlZWxTbG90cyh3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBGaXh0dXJlV2hlZWxTbG90W10ge1xuICAgIC8vIHJldHVybiBvbmUgc2xvdCBvciB0d28gc2xvdHMsIGlmIHRoZXkgYXJlIG1peGVkIChlLmcuIHNsb3IgbnVtYmVyIDIuNSByZXR1cm5zIHRoZSBzbG90cyAyIGFuZCAzKVxuICAgIGNvbnN0IHNsb3RzOiBGaXh0dXJlV2hlZWxTbG90W10gPSBbXTtcblxuICAgIGlmICghd2hlZWwpIHtcbiAgICAgIHJldHVybiBzbG90cztcbiAgICB9XG5cbiAgICBpZiAoc2xvdE51bWJlciAtIE1hdGguZmxvb3Ioc2xvdE51bWJlcikgPiAwKSB7XG4gICAgICAvLyB0d28gc2xvdHMgYXJlIHNldFxuICAgICAgY29uc3QgbnVtYmVyID0gTWF0aC5mbG9vcihzbG90TnVtYmVyKTtcbiAgICAgIHNsb3RzLnB1c2god2hlZWwuc2xvdHNbbnVtYmVyIC0gMV0pO1xuICAgICAgaWYgKG51bWJlciA+PSAwICYmIG51bWJlciA8IHdoZWVsLnNsb3RzLmxlbmd0aCkge1xuICAgICAgICBzbG90cy5wdXNoKHdoZWVsLnNsb3RzW251bWJlcl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IG9uZSBzbG90IGlzIHNldFxuICAgICAgc2xvdHMucHVzaCh3aGVlbC5zbG90c1tzbG90TnVtYmVyIC0gMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzbG90cztcbiAgfVxuXG4gIGdldE1vZGVCeUZpeHR1cmUocHJvZmlsZTogRml4dHVyZVByb2ZpbGUsIGZpeHR1cmU6IEZpeHR1cmUpOiBGaXh0dXJlTW9kZSB7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHByb2ZpbGUubW9kZXMpIHtcbiAgICAgIGlmIChtb2RlLnNob3J0TmFtZSkge1xuICAgICAgICBpZiAobW9kZS5zaG9ydE5hbWUgPT09IGZpeHR1cmUubW9kZVNob3J0TmFtZSkge1xuICAgICAgICAgIHJldHVybiBtb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobW9kZS5uYW1lID09PSBmaXh0dXJlLm1vZGVTaG9ydE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gbW9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rml4dHVyZUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogRml4dHVyZUNhcGFiaWxpdHksIGNoYW5uZWxOYW1lOiBzdHJpbmcsIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHkge1xuICAgIGNvbnN0IGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5ID0gbmV3IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7XG4gICAgaWYgKGNhcGFiaWxpdHkuc2xvdE51bWJlcikge1xuICAgICAgLy8gdGhlcmUgaXMgYSB3aGVlbCBjb25uZWN0ZWQgdG8gdGhpcyBjYXBhYmlsaXR5XG4gICAgICBpZiAodHlwZW9mIGNhcGFiaWxpdHkud2hlZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsTmFtZSA9IGNhcGFiaWxpdHkud2hlZWwgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNhcGFiaWxpdHkud2hlZWwpKSB7XG4gICAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsTmFtZSA9IGNhcGFiaWxpdHkud2hlZWxbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbE5hbWUgPSBjaGFubmVsTmFtZTtcbiAgICAgIH1cbiAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsID0gdGhpcy5nZXRXaGVlbEJ5TmFtZShwcm9maWxlLCBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbE5hbWUpO1xuICAgICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkud2hlZWxTbG90cyA9IHRoaXMuZ2V0V2hlZWxTbG90cyhjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbCwgY2FwYWJpbGl0eS5zbG90TnVtYmVyKTtcbiAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsSXNDb2xvciA9IHRoaXMud2hlZWxIYXNTbG90VHlwZShjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbCwgRml4dHVyZVdoZWVsU2xvdFR5cGUuQ29sb3IpO1xuICAgIH1cbiAgICBpZiAoY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZSAmJiBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlLmxlbmd0aCA9PT0gMikge1xuICAgICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2VudGVyVmFsdWUgPSBNYXRoLmZsb29yKFxuICAgICAgICAoY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVswXSArIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMV0pIC8gMlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYXBhYmlsaXRpZXNCeUNoYW5uZWwoXG4gICAgZml4dHVyZUNoYW5uZWw6IEZpeHR1cmVDaGFubmVsLFxuICAgIGNoYW5uZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvZmlsZTogRml4dHVyZVByb2ZpbGVcbiAgKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHlbXSB7XG4gICAgY29uc3QgY2FwYWJpbGl0ZXM6IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5W10gPSBbXTtcblxuICAgIGlmIChmaXh0dXJlQ2hhbm5lbC5jYXBhYmlsaXR5KSB7XG4gICAgICBjYXBhYmlsaXRlcy5wdXNoKHRoaXMuZ2V0Rml4dHVyZUNhcGFiaWxpdHkoZml4dHVyZUNoYW5uZWwuY2FwYWJpbGl0eSwgY2hhbm5lbE5hbWUsIHByb2ZpbGUpKTtcbiAgICB9IGVsc2UgaWYgKGZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgICBjYXBhYmlsaXRlcy5wdXNoKHRoaXMuZ2V0Rml4dHVyZUNhcGFiaWxpdHkoY2FwYWJpbGl0eSwgY2hhbm5lbE5hbWUsIHByb2ZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2FwYWJpbGl0ZXM7XG4gIH1cblxuICBwcml2YXRlIGdldE1heFZhbHVlQnlDaGFubmVsKGZpeHR1cmVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDI1NiwgMSArIGZpeHR1cmVDaGFubmVsLmZpbmVDaGFubmVsQWxpYXNlcy5sZW5ndGgpIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlQnlDaGFubmVsKGZpeHR1cmVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCk6IG51bWJlciB7XG4gICAgaWYgKCFmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKGZpeHR1cmVDaGFubmVsLmRlZmF1bHRWYWx1ZSBhcyBhbnkpICYmIChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAvLyBwZXJjZW50YWdlIHZhbHVlXG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gTnVtYmVyLnBhcnNlSW50KChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKS5yZXBsYWNlKCclJywgJycpKTtcbiAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5nZXRNYXhWYWx1ZUJ5Q2hhbm5lbChmaXh0dXJlQ2hhbm5lbCk7XG4gICAgICByZXR1cm4gKG1heFZhbHVlIC8gMTAwKSAqIHBlcmNlbnRhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERNWCB2YWx1ZVxuICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbG9yV2hlZWxCeUNoYW5uZWwoY2hhbm5lbDogQ2FjaGVkRml4dHVyZUNoYW5uZWwsIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKTogRml4dHVyZVdoZWVsIHtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWxDYXBhYmlsaXR5IG9mIGNoYW5uZWwuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBpZiAoY2hhbm5lbENhcGFiaWxpdHkud2hlZWxJc0NvbG9yKSB7XG4gICAgICAgIHJldHVybiBjaGFubmVsQ2FwYWJpbGl0eS53aGVlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBjaGFubmVsSW5MaXN0KGNoYW5uZWxzOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gICBmb3IgKGxldCBjaGFubmVsIG9mIGNoYW5uZWxzKSB7XG4gIC8vICAgICBpZiAoY2hhbm5lbC5jaGFubmVsTmFtZSA9PT0gbmFtZSkge1xuICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICByZXR1cm4gZmFsc2U7XG4gIC8vIH1cblxuICBnZXRDaGFubmVsQnlOYW1lKGZpeHR1cmU6IENhY2hlZEZpeHR1cmUsIGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCB7XG4gICAgZm9yIChjb25zdCBjaGFubmVsIG9mIGZpeHR1cmUuY2hhbm5lbHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNoYW5uZWwubmFtZSAmJiBjaGFubmVsLm5hbWUgPT09IGNoYW5uZWxOYW1lKSB8fFxuICAgICAgICAoY2hhbm5lbC5jaGFubmVsICYmIGNoYW5uZWwuY2hhbm5lbC5maW5lQ2hhbm5lbEFsaWFzZXMuaW5kZXhPZihjaGFubmVsTmFtZSkgPiAtMSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gY2hhbm5lbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Q2FjaGVkQ2hhbm5lbHMocHJvZmlsZTogRml4dHVyZVByb2ZpbGUsIG1vZGU6IEZpeHR1cmVNb2RlKTogQ2FjaGVkRml4dHVyZUNoYW5uZWxbXSB7XG4gICAgY29uc3QgY2hhbm5lbHM6IENhY2hlZEZpeHR1cmVDaGFubmVsW10gPSBbXTtcblxuICAgIGlmICghbW9kZSkge1xuICAgICAgcmV0dXJuIGNoYW5uZWxzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXZhaWxhYmxlQ2hhbm5lbE5hbWUgb2YgT2JqZWN0LmtleXMocHJvZmlsZS5hdmFpbGFibGVDaGFubmVscykpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZUNoYW5uZWw6IEZpeHR1cmVDaGFubmVsID0gcHJvZmlsZS5hdmFpbGFibGVDaGFubmVsc1thdmFpbGFibGVDaGFubmVsTmFtZV07XG5cbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBtb2RlLmNoYW5uZWxzKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciBzdHJpbmcgY2hhbm5lbC4gSXQgY2FuIGdldCBjcmVlcHkgZm9yIG1hdHJpeCBtb2Rlc1xuICAgICAgICBpZiAodHlwZW9mIGNoYW5uZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgbW9kZUNoYW5uZWw6IHN0cmluZyA9IGNoYW5uZWwgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgLy8gZG9uJ3QgY2hlY2sgdGhlIGZpbmUgY2hhbm5lbHMuIG9ubHkgYWRkIHRoZSBjb2Fyc2UgY2hhbm5lbC5cbiAgICAgICAgICBpZiAobW9kZUNoYW5uZWwgPT09IGF2YWlsYWJsZUNoYW5uZWxOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWRGaXh0dXJlQ2hhbm5lbCA9IG5ldyBDYWNoZWRGaXh0dXJlQ2hhbm5lbCgpO1xuICAgICAgICAgICAgY2FjaGVkRml4dHVyZUNoYW5uZWwuY2hhbm5lbCA9IGF2YWlsYWJsZUNoYW5uZWw7XG4gICAgICAgICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5uYW1lID0gYXZhaWxhYmxlQ2hhbm5lbE5hbWU7XG4gICAgICAgICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jYXBhYmlsaXRpZXMgPSB0aGlzLmdldENhcGFiaWxpdGllc0J5Q2hhbm5lbChjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jaGFubmVsLCBhdmFpbGFibGVDaGFubmVsTmFtZSwgcHJvZmlsZSk7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZUJ5Q2hhbm5lbChjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jaGFubmVsKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgY2FjaGVkRml4dHVyZUNoYW5uZWwuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FjaGVkRml4dHVyZUNoYW5uZWwubWF4VmFsdWUgPSB0aGlzLmdldE1heFZhbHVlQnlDaGFubmVsKGNhY2hlZEZpeHR1cmVDaGFubmVsLmNoYW5uZWwpO1xuICAgICAgICAgICAgY2FjaGVkRml4dHVyZUNoYW5uZWwuY29sb3JXaGVlbCA9IHRoaXMuZ2V0Q29sb3JXaGVlbEJ5Q2hhbm5lbChjYWNoZWRGaXh0dXJlQ2hhbm5lbCwgcHJvZmlsZSk7XG4gICAgICAgICAgICBjaGFubmVscy5wdXNoKGNhY2hlZEZpeHR1cmVDaGFubmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbnVsbCBtYXkgYmUgcGFzc2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGFuIHVuZGVmaW5lZCBjaGFubmVsXG4gICAgICAgICAgY2hhbm5lbHMucHVzaChuZXcgQ2FjaGVkRml4dHVyZUNoYW5uZWwoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbHM7XG4gIH1cblxuICB1cGRhdGVDYWNoZWRGaXh0dXJlcygpIHtcbiAgICAvLyBjYWxjdWxhdGUgc29tZSBmcmVxdWVudGx5IHVzZWQgdmFsdWVzIGFzIGEgY2FjaGUgdG8gc2F2ZSBjcHUgdGltZVxuICAgIC8vIGFmdGVyd2FyZHNcbiAgICB0aGlzLmNhY2hlZEZpeHR1cmVzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBjYWNoZWRGaXh0dXJlID0gbmV3IENhY2hlZEZpeHR1cmUoKTtcblxuICAgICAgY2FjaGVkRml4dHVyZS5maXh0dXJlID0gZml4dHVyZTtcbiAgICAgIGNhY2hlZEZpeHR1cmUucHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICAgIGNhY2hlZEZpeHR1cmUubW9kZSA9IHRoaXMuZ2V0TW9kZUJ5Rml4dHVyZShjYWNoZWRGaXh0dXJlLnByb2ZpbGUsIGZpeHR1cmUpO1xuICAgICAgY2FjaGVkRml4dHVyZS5jaGFubmVscyA9IHRoaXMuZ2V0Q2FjaGVkQ2hhbm5lbHMoY2FjaGVkRml4dHVyZS5wcm9maWxlLCBjYWNoZWRGaXh0dXJlLm1vZGUpO1xuXG4gICAgICB0aGlzLmNhY2hlZEZpeHR1cmVzLnB1c2goY2FjaGVkRml4dHVyZSk7XG4gICAgfVxuICB9XG5cbiAgY2FwYWJpbGl0aWVzTWF0Y2goXG4gICAgdHlwZTE6IEZpeHR1cmVDYXBhYmlsaXR5VHlwZSxcbiAgICB0eXBlMjogRml4dHVyZUNhcGFiaWxpdHlUeXBlLFxuICAgIGNvbG9yMTogRml4dHVyZUNhcGFiaWxpdHlDb2xvcixcbiAgICBjb2xvcjI6IEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IsXG4gICAgd2hlZWwxOiBzdHJpbmcsXG4gICAgd2hlZWwyOiBzdHJpbmcsXG4gICAgcHJvZmlsZVV1aWQxOiBzdHJpbmcsXG4gICAgcHJvZmlsZVV1aWQyOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gY2hlY2tzLCB3aGV0aGVyIHR3byBwcm92aWRlZCBjYXBhcGFiaWxpdGllcyBtYXRjaFxuICAgIHJldHVybiAoXG4gICAgICB0eXBlMSA9PT0gdHlwZTIgJiZcbiAgICAgICghY29sb3IxIHx8IGNvbG9yMSA9PT0gY29sb3IyKSAmJlxuICAgICAgKCF3aGVlbDEgfHwgd2hlZWwxID09PSB3aGVlbDIpICYmXG4gICAgICAoIXByb2ZpbGVVdWlkMSB8fCBwcm9maWxlVXVpZDEgPT09IHByb2ZpbGVVdWlkMilcbiAgICApO1xuICB9XG5cbiAgc2V0dGluZ3NGaXh0dXJlSXNTZWxlY3RlZChmaXh0dXJlOiBGaXh0dXJlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzZWxlY3RlZEZpeHR1cmUgb2YgdGhpcy5zZWxlY3RlZFNldHRpbmdzRml4dHVyZXMpIHtcbiAgICAgIGlmIChzZWxlY3RlZEZpeHR1cmUgPT09IGZpeHR1cmUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3dpdGNoU2V0dGluZ3NGaXh0dXJlU2VsZWN0aW9uKGZpeHR1cmU6IEZpeHR1cmUpIHtcbiAgICBpZiAodGhpcy5zZXR0aW5nc0ZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmUpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2V0dGluZ3NGaXh0dXJlcy5zcGxpY2UodGhpcy5zZWxlY3RlZFNldHRpbmdzRml4dHVyZXMuaW5kZXhPZihmaXh0dXJlKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZXR0aW5nc0ZpeHR1cmVzLnB1c2goZml4dHVyZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Rml4dHVyZUljb25DbGFzcyhwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSk6IHN0cmluZyB7XG4gICAgaWYgKCFwcm9maWxlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChwcm9maWxlLmNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICghcHJvZmlsZS5jYXRlZ29yaWVzWzBdKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBwcm9maWxlLmNhdGVnb3JpZXNbMF0ucmVwbGFjZSgnICcsICctJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgfVxuXG4gIHVwZGF0ZVByb2ZpbGVzKCkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCgndXBkYXRlLXByb2ZpbGVzJywgbnVsbCk7XG4gIH1cblxuICBnZXROZXh0RnJlZURteENoYW5uZWwoZml4dHVyZVBvb2w6IEZpeHR1cmVbXSwgbmVlZGVkQ2hhbm5lbHM6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gZ2V0IHRoZSBuZXh0IGZyZWUgc3BhY2UgZm9yIHRoaXMgZml4dHVyZVxuICAgIGxldCBmcmVlQ2hhbm5lbHMgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1MTI7IGkrKykge1xuICAgICAgbGV0IG9jY3VwaWVkQ2hhbm5lbHMgPSAwO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZVBvb2wpIHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZ2V0TW9kZUJ5Rml4dHVyZSh0aGlzLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCksIGZpeHR1cmUpO1xuXG4gICAgICAgIGlmIChpID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGkgPCBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIG1vZGUuY2hhbm5lbHMubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdGhpcyBjaGFubmVsIGlzIGFscmVhZHkgb2NjdXBpZWQgYnkgYSBmaXh0dXJlIC0+IG1vdmUgZm9yd2FyZCB0byB0aGUgZW5kIG9mIHRoZSBmaXh0dXJlXG4gICAgICAgICAgaWYgKG1vZGUuY2hhbm5lbHMubGVuZ3RoID4gb2NjdXBpZWRDaGFubmVscykge1xuICAgICAgICAgICAgb2NjdXBpZWRDaGFubmVscyA9IG1vZGUuY2hhbm5lbHMubGVuZ3RoIC0gKGkgLSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvY2N1cGllZENoYW5uZWxzID4gMCkge1xuICAgICAgICBpICs9IG9jY3VwaWVkQ2hhbm5lbHMgLSAxO1xuICAgICAgICBmcmVlQ2hhbm5lbHMgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJlZUNoYW5uZWxzKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcmVlQ2hhbm5lbHMgPT09IG5lZWRlZENoYW5uZWxzKSB7XG4gICAgICAgIHJldHVybiBpIC0gZnJlZUNoYW5uZWxzICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBmcmVlIHNwYWNlIGxlZnQgZm9yIHRoZSBuZWVkZWQgY2hhbm5lbHNcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBhZGRGaXh0dXJlKHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlLCBmaXh0dXJlUG9vbDogRml4dHVyZVtdKTogRml4dHVyZSB7XG4gICAgY29uc3QgZml4dHVyZSA9IG5ldyBGaXh0dXJlKCk7XG5cbiAgICBmaXh0dXJlLnV1aWQgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFV1aWQoKTtcbiAgICBmaXh0dXJlLnByb2ZpbGVVdWlkID0gcHJvZmlsZS51dWlkO1xuICAgIGZpeHR1cmUubmFtZSA9IHByb2ZpbGUubmFtZTtcblxuICAgIGlmIChwcm9maWxlLm1vZGVzICYmIHByb2ZpbGUubW9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZml4dHVyZS5tb2RlU2hvcnROYW1lID0gcHJvZmlsZS5tb2Rlc1swXS5zaG9ydE5hbWU7XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBzYW1lIG1vZGUgYXMgYW4gZXhpc3RpbmcgZml4dHVyZSwgaWYgYXZhaWxhYmxlXG4gICAgbGV0IGV4aXN0aW5nTW9kZVNob3J0TmFtZTogc3RyaW5nO1xuICAgIGZvciAoY29uc3QgZXhpc3RpbmdGaXh0dXJlIG9mIGZpeHR1cmVQb29sKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1Byb2ZpbGUgPSB0aGlzLmdldFByb2ZpbGVCeVV1aWQoZXhpc3RpbmdGaXh0dXJlLnByb2ZpbGVVdWlkKTtcblxuICAgICAgaWYgKGV4aXN0aW5nUHJvZmlsZSA9PT0gcHJvZmlsZSkge1xuICAgICAgICBleGlzdGluZ01vZGVTaG9ydE5hbWUgPSBleGlzdGluZ0ZpeHR1cmUubW9kZVNob3J0TmFtZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nTW9kZVNob3J0TmFtZSkge1xuICAgICAgZml4dHVyZS5tb2RlU2hvcnROYW1lID0gZXhpc3RpbmdNb2RlU2hvcnROYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaXh0dXJlLm1vZGVTaG9ydE5hbWUgPSBwcm9maWxlLm1vZGVzWzBdLnNob3J0TmFtZSB8fCBwcm9maWxlLm1vZGVzWzBdLm5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuZ2V0TW9kZUJ5Rml4dHVyZSh0aGlzLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCksIGZpeHR1cmUpO1xuICAgIGNvbnN0IGZpcnN0Q2hhbm5lbCA9IHRoaXMuZ2V0TmV4dEZyZWVEbXhDaGFubmVsKGZpeHR1cmVQb29sLCBtb2RlLmNoYW5uZWxzLmxlbmd0aCk7XG5cbiAgICBpZiAoZmlyc3RDaGFubmVsID49IDApIHtcbiAgICAgIGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gZmlyc3RDaGFubmVsO1xuICAgICAgZml4dHVyZVBvb2wucHVzaChmaXh0dXJlKTtcbiAgICAgIHJldHVybiBmaXh0dXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBubyBmcmVlIHNwYWNlIGFueW1vcmVcbiAgICAgIGNvbnN0IG1zZyA9ICdkZXNpZ25lci5maXh0dXJlLXBvb2wubm8tZnJlZS1zcGFjZSc7XG4gICAgICBjb25zdCB0aXRsZSA9ICdkZXNpZ25lci5maXh0dXJlLXBvb2wubm8tZnJlZS1zcGFjZS10aXRsZSc7XG5cbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IocmVzdWx0W21zZ10sIHJlc3VsdFt0aXRsZV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|