@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
|
@@ -0,0 +1,643 @@
|
|
|
1
|
+
import { Component, HostListener } from '@angular/core';
|
|
2
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
3
|
+
import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
|
|
4
|
+
import { ToastrService } from 'ngx-toastr';
|
|
5
|
+
import { Subject } from 'rxjs';
|
|
6
|
+
import { catchError, finalize } from 'rxjs/operators';
|
|
7
|
+
import { Fixture } from '../models/fixture';
|
|
8
|
+
import { ConfigService } from '../services/config.service';
|
|
9
|
+
import { FixtureService } from '../services/fixture.service';
|
|
10
|
+
import { PresetService } from '../services/preset.service';
|
|
11
|
+
import { PreviewService } from '../services/preview.service';
|
|
12
|
+
import { ProjectService } from '../services/project.service';
|
|
13
|
+
import { UuidService } from '../services/uuid.service';
|
|
14
|
+
import { FixturePoolCreateFromFileComponent } from './fixture-pool-create-from-file/fixture-pool-create-from-file.component';
|
|
15
|
+
import { PresetFixture } from '../models/preset-fixture';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "ngx-bootstrap/modal";
|
|
18
|
+
import * as i2 from "../services/fixture.service";
|
|
19
|
+
import * as i3 from "../services/uuid.service";
|
|
20
|
+
import * as i4 from "../services/project.service";
|
|
21
|
+
import * as i5 from "../services/preview.service";
|
|
22
|
+
import * as i6 from "@ngx-translate/core";
|
|
23
|
+
import * as i7 from "ngx-toastr";
|
|
24
|
+
import * as i8 from "../services/preset.service";
|
|
25
|
+
import * as i9 from "../services/config.service";
|
|
26
|
+
import * as i10 from "@angular/common";
|
|
27
|
+
import * as i11 from "@angular/forms";
|
|
28
|
+
import * as i12 from "ngx-bootstrap/popover";
|
|
29
|
+
import * as i13 from "ngx-sortablejs-plus";
|
|
30
|
+
import * as i14 from "../array-sort-pipe";
|
|
31
|
+
function FixturePoolComponent_a_15_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
i0.ɵɵelementStart(0, "a", 44)(1, "p", 45);
|
|
33
|
+
i0.ɵɵelement(2, "i", 46);
|
|
34
|
+
i0.ɵɵelementEnd()();
|
|
35
|
+
} }
|
|
36
|
+
function FixturePoolComponent_div_16_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
38
|
+
i0.ɵɵelementStart(0, "div", 47)(1, "div", 5)(2, "div", 48)(3, "p", 49);
|
|
39
|
+
i0.ɵɵelement(4, "span");
|
|
40
|
+
i0.ɵɵtext(5);
|
|
41
|
+
i0.ɵɵelementEnd()();
|
|
42
|
+
i0.ɵɵelementStart(6, "div", 50)(7, "a", 51);
|
|
43
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_div_16_Template_a_click_7_listener() { const profile_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.addFixture(profile_r2); return i0.ɵɵresetView(false); });
|
|
44
|
+
i0.ɵɵelement(8, "i", 19);
|
|
45
|
+
i0.ɵɵelementEnd()()()();
|
|
46
|
+
} if (rf & 2) {
|
|
47
|
+
const profile_r2 = ctx.$implicit;
|
|
48
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
49
|
+
i0.ɵɵadvance(4);
|
|
50
|
+
i0.ɵɵclassMapInterpolate1("icon-", ctx_r2.fixtureService.getFixtureIconClass(profile_r2), " mr-1");
|
|
51
|
+
i0.ɵɵadvance();
|
|
52
|
+
i0.ɵɵtextInterpolate2(" ", profile_r2.manufacturerName, " - ", profile_r2.name, " ");
|
|
53
|
+
} }
|
|
54
|
+
function FixturePoolComponent_button_27_i_1_Template(rf, ctx) { if (rf & 1) {
|
|
55
|
+
i0.ɵɵelement(0, "i", 55);
|
|
56
|
+
} }
|
|
57
|
+
function FixturePoolComponent_button_27_i_2_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
+
i0.ɵɵelement(0, "i", 56);
|
|
59
|
+
} }
|
|
60
|
+
function FixturePoolComponent_button_27_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
62
|
+
i0.ɵɵelementStart(0, "button", 52);
|
|
63
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_button_27_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.updateProfiles(); return i0.ɵɵresetView(false); });
|
|
64
|
+
i0.ɵɵtemplate(1, FixturePoolComponent_button_27_i_1_Template, 1, 0, "i", 53)(2, FixturePoolComponent_button_27_i_2_Template, 1, 0, "i", 54);
|
|
65
|
+
i0.ɵɵtext(3);
|
|
66
|
+
i0.ɵɵpipe(4, "translate");
|
|
67
|
+
i0.ɵɵelementEnd();
|
|
68
|
+
} if (rf & 2) {
|
|
69
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
70
|
+
i0.ɵɵproperty("disabled", ctx_r2.updatingProfiles);
|
|
71
|
+
i0.ɵɵadvance();
|
|
72
|
+
i0.ɵɵproperty("ngIf", ctx_r2.updatingProfiles);
|
|
73
|
+
i0.ɵɵadvance();
|
|
74
|
+
i0.ɵɵproperty("ngIf", !ctx_r2.updatingProfiles);
|
|
75
|
+
i0.ɵɵadvance();
|
|
76
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 4, "designer.fixture-pool.update-profiles"), " ");
|
|
77
|
+
} }
|
|
78
|
+
function FixturePoolComponent_div_47_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
80
|
+
i0.ɵɵelementStart(0, "div", 57);
|
|
81
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_div_47_Template_div_click_0_listener() { const fixture_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectFixture(fixture_r6)); });
|
|
82
|
+
i0.ɵɵelementStart(1, "div", 5)(2, "div", 58);
|
|
83
|
+
i0.ɵɵelement(3, "i", 59);
|
|
84
|
+
i0.ɵɵelementEnd();
|
|
85
|
+
i0.ɵɵelementStart(4, "div", 60)(5, "p", 49);
|
|
86
|
+
i0.ɵɵelement(6, "span");
|
|
87
|
+
i0.ɵɵtext(7);
|
|
88
|
+
i0.ɵɵelementEnd()();
|
|
89
|
+
i0.ɵɵelementStart(8, "div", 61)(9, "a", 51);
|
|
90
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_div_47_Template_a_click_9_listener() { const fixture_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.removeFixture(fixture_r6); return i0.ɵɵresetView(false); });
|
|
91
|
+
i0.ɵɵelement(10, "i", 62);
|
|
92
|
+
i0.ɵɵelementEnd()()()();
|
|
93
|
+
} if (rf & 2) {
|
|
94
|
+
const fixture_r6 = ctx.$implicit;
|
|
95
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
96
|
+
i0.ɵɵclassProp("active", fixture_r6 == ctx_r2.selectedFixture);
|
|
97
|
+
i0.ɵɵadvance(6);
|
|
98
|
+
i0.ɵɵclassMapInterpolate1("icon-", ctx_r2.fixtureService.getFixtureIconClass(ctx_r2.fixtureService.getProfileByUuid(fixture_r6.profileUuid)), " mr-1");
|
|
99
|
+
i0.ɵɵadvance();
|
|
100
|
+
i0.ɵɵtextInterpolate1("", fixture_r6.name, " ");
|
|
101
|
+
} }
|
|
102
|
+
function FixturePoolComponent_div_64_Template(rf, ctx) { if (rf & 1) {
|
|
103
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
104
|
+
i0.ɵɵelementStart(0, "div", 63);
|
|
105
|
+
i0.ɵɵlistener("mousedown", function FixturePoolComponent_div_64_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.channelMouseDown($event)); })("mouseover", function FixturePoolComponent_div_64_Template_div_mouseover_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.channelMouseOver($event)); });
|
|
106
|
+
i0.ɵɵelementStart(1, "div", 64)(2, "div", 65)(3, "small");
|
|
107
|
+
i0.ɵɵtext(4, "\u00A0");
|
|
108
|
+
i0.ɵɵelementEnd()()()();
|
|
109
|
+
} if (rf & 2) {
|
|
110
|
+
const i_r8 = ctx.index;
|
|
111
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
112
|
+
i0.ɵɵclassProp("dmx-channel-occupied", ctx_r2.channelOccupied(i_r8))("dmx-channel-occupied-start", ctx_r2.channelOccupiedStart(i_r8))("dmx-channel-occupied-end", ctx_r2.channelOccupiedEnd(i_r8))("dmx-channel-selected", ctx_r2.channelSelected(i_r8))("dmx-channel-overlapped", ctx_r2.channelOverlapped(i_r8));
|
|
113
|
+
i0.ɵɵpropertyInterpolate("popover", i_r8 + 1);
|
|
114
|
+
i0.ɵɵattribute("data-index", i_r8);
|
|
115
|
+
i0.ɵɵadvance();
|
|
116
|
+
i0.ɵɵclassProp("dmx-channel-text-visible", ctx_r2.showChannelNumbers);
|
|
117
|
+
i0.ɵɵattribute("data-index", i_r8);
|
|
118
|
+
i0.ɵɵadvance();
|
|
119
|
+
i0.ɵɵattribute("data-index", i_r8);
|
|
120
|
+
i0.ɵɵadvance();
|
|
121
|
+
i0.ɵɵattribute("data-index", i_r8);
|
|
122
|
+
} }
|
|
123
|
+
function FixturePoolComponent_div_66_option_13_Template(rf, ctx) { if (rf & 1) {
|
|
124
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
125
|
+
i0.ɵɵtext(1);
|
|
126
|
+
i0.ɵɵpipe(2, "translate");
|
|
127
|
+
i0.ɵɵelementEnd();
|
|
128
|
+
} if (rf & 2) {
|
|
129
|
+
const mode_r10 = ctx.$implicit;
|
|
130
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
131
|
+
i0.ɵɵproperty("ngValue", mode_r10.shortName || mode_r10.name);
|
|
132
|
+
i0.ɵɵadvance();
|
|
133
|
+
i0.ɵɵtextInterpolate3(" ", mode_r10.name, " - ", ctx_r2.fixtureService.getModeChannelCount(ctx_r2.selectedFixtureProfile, mode_r10), " ", i0.ɵɵpipeBind1(2, 4, "designer.fixture-pool.channels"), " ");
|
|
134
|
+
} }
|
|
135
|
+
function FixturePoolComponent_div_66_option_20_Template(rf, ctx) { if (rf & 1) {
|
|
136
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
137
|
+
i0.ɵɵtext(1);
|
|
138
|
+
i0.ɵɵelementEnd();
|
|
139
|
+
} if (rf & 2) {
|
|
140
|
+
const i_r11 = ctx.index;
|
|
141
|
+
i0.ɵɵproperty("ngValue", i_r11);
|
|
142
|
+
i0.ɵɵadvance();
|
|
143
|
+
i0.ɵɵtextInterpolate1(" ", i_r11 + 1, " ");
|
|
144
|
+
} }
|
|
145
|
+
function FixturePoolComponent_div_66_Template(rf, ctx) { if (rf & 1) {
|
|
146
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
147
|
+
i0.ɵɵelementStart(0, "div")(1, "div", 20)(2, "label", 66);
|
|
148
|
+
i0.ɵɵtext(3);
|
|
149
|
+
i0.ɵɵpipe(4, "translate");
|
|
150
|
+
i0.ɵɵelementEnd();
|
|
151
|
+
i0.ɵɵelementStart(5, "div", 67)(6, "input", 68);
|
|
152
|
+
i0.ɵɵtwoWayListener("ngModelChange", function FixturePoolComponent_div_66_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedFixture.name, $event) || (ctx_r2.selectedFixture.name = $event); return i0.ɵɵresetView($event); });
|
|
153
|
+
i0.ɵɵelementEnd()()();
|
|
154
|
+
i0.ɵɵelementStart(7, "div", 20)(8, "label", 69);
|
|
155
|
+
i0.ɵɵtext(9);
|
|
156
|
+
i0.ɵɵpipe(10, "translate");
|
|
157
|
+
i0.ɵɵelementEnd();
|
|
158
|
+
i0.ɵɵelementStart(11, "div", 67)(12, "select", 70);
|
|
159
|
+
i0.ɵɵlistener("ngModelChange", function FixturePoolComponent_div_66_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectedFixture.modeShortName = $event); });
|
|
160
|
+
i0.ɵɵtemplate(13, FixturePoolComponent_div_66_option_13_Template, 3, 6, "option", 71);
|
|
161
|
+
i0.ɵɵelementEnd()()();
|
|
162
|
+
i0.ɵɵelementStart(14, "div", 20)(15, "label", 69);
|
|
163
|
+
i0.ɵɵtext(16);
|
|
164
|
+
i0.ɵɵpipe(17, "translate");
|
|
165
|
+
i0.ɵɵelementEnd();
|
|
166
|
+
i0.ɵɵelementStart(18, "div", 67)(19, "select", 70);
|
|
167
|
+
i0.ɵɵlistener("ngModelChange", function FixturePoolComponent_div_66_Template_select_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectedFixture.dmxFirstChannel = $event); });
|
|
168
|
+
i0.ɵɵtemplate(20, FixturePoolComponent_div_66_option_20_Template, 2, 2, "option", 71);
|
|
169
|
+
i0.ɵɵelementEnd()()();
|
|
170
|
+
i0.ɵɵelementStart(21, "div", 20);
|
|
171
|
+
i0.ɵɵelement(22, "label", 69);
|
|
172
|
+
i0.ɵɵelementStart(23, "div", 67)(24, "button", 43);
|
|
173
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_div_66_Template_button_click_24_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.addCopy(ctx_r2.selectedFixture)); });
|
|
174
|
+
i0.ɵɵtext(25);
|
|
175
|
+
i0.ɵɵpipe(26, "translate");
|
|
176
|
+
i0.ɵɵelementEnd()()()();
|
|
177
|
+
} if (rf & 2) {
|
|
178
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
179
|
+
i0.ɵɵadvance(3);
|
|
180
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 9, "designer.fixture-pool.fixture-name"));
|
|
181
|
+
i0.ɵɵadvance(3);
|
|
182
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedFixture.name);
|
|
183
|
+
i0.ɵɵadvance(3);
|
|
184
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(10, 11, "designer.fixture-pool.mode"));
|
|
185
|
+
i0.ɵɵadvance(3);
|
|
186
|
+
i0.ɵɵproperty("ngModel", ctx_r2.selectedFixture.modeShortName);
|
|
187
|
+
i0.ɵɵadvance();
|
|
188
|
+
i0.ɵɵproperty("ngForOf", ctx_r2.selectedFixtureProfile.modes);
|
|
189
|
+
i0.ɵɵadvance(3);
|
|
190
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(17, 13, "designer.fixture-pool.first-channel"));
|
|
191
|
+
i0.ɵɵadvance(3);
|
|
192
|
+
i0.ɵɵproperty("ngModel", ctx_r2.selectedFixture.dmxFirstChannel);
|
|
193
|
+
i0.ɵɵadvance();
|
|
194
|
+
i0.ɵɵproperty("ngForOf", ctx_r2.dmxChannels);
|
|
195
|
+
i0.ɵɵadvance(5);
|
|
196
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 15, "designer.fixture.add-copy"), " ");
|
|
197
|
+
} }
|
|
198
|
+
export class FixturePoolComponent {
|
|
199
|
+
constructor(bsModalRef, fixtureService, uuidService, projectService, previewService, translateService, toastrService, presetService, configService, modalService) {
|
|
200
|
+
this.bsModalRef = bsModalRef;
|
|
201
|
+
this.fixtureService = fixtureService;
|
|
202
|
+
this.uuidService = uuidService;
|
|
203
|
+
this.projectService = projectService;
|
|
204
|
+
this.previewService = previewService;
|
|
205
|
+
this.translateService = translateService;
|
|
206
|
+
this.toastrService = toastrService;
|
|
207
|
+
this.presetService = presetService;
|
|
208
|
+
this.configService = configService;
|
|
209
|
+
this.modalService = modalService;
|
|
210
|
+
this.loadingProfiles = false;
|
|
211
|
+
this.dmxChannels = [];
|
|
212
|
+
this.showChannelNumbers = false;
|
|
213
|
+
this.onClose = new Subject();
|
|
214
|
+
this.fixturePool = [...this.projectService.project.fixtures];
|
|
215
|
+
if (this.fixturePool.length > 0) {
|
|
216
|
+
this.selectFixture(this.fixturePool[0]);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
ngOnInit() {
|
|
220
|
+
for (let i = 0; i < 512; i++) {
|
|
221
|
+
this.dmxChannels.push(0);
|
|
222
|
+
}
|
|
223
|
+
this.loadProfiles();
|
|
224
|
+
}
|
|
225
|
+
loadProfiles() {
|
|
226
|
+
this.loadingProfiles = true;
|
|
227
|
+
this.fixtureService.getSearchProfiles().subscribe((profiles) => {
|
|
228
|
+
this.profiles = profiles;
|
|
229
|
+
this.filterProfiles();
|
|
230
|
+
this.loadingProfiles = false;
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
selectFixture(fixture) {
|
|
234
|
+
this.selectedFixtureProfile = undefined;
|
|
235
|
+
if (fixture) {
|
|
236
|
+
this.selectedFixtureProfile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
|
|
237
|
+
}
|
|
238
|
+
this.selectedFixture = fixture;
|
|
239
|
+
}
|
|
240
|
+
filterProfiles() {
|
|
241
|
+
if (!this.searchExpression || !this.profiles) {
|
|
242
|
+
this.filteredProfiles = this.profiles;
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
this.filteredProfiles = [];
|
|
246
|
+
const keywords = this.searchExpression.split(' ');
|
|
247
|
+
for (const profile of this.profiles) {
|
|
248
|
+
let foundKeywords = 0;
|
|
249
|
+
for (const keyword of keywords) {
|
|
250
|
+
if (profile.uuid.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
|
|
251
|
+
profile.name.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
|
|
252
|
+
profile.manufacturerName.toLowerCase().indexOf(keyword.toLowerCase()) !== -1) {
|
|
253
|
+
foundKeywords++;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (foundKeywords === keywords.length) {
|
|
257
|
+
this.filteredProfiles.push(profile);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
addFixture(searchProfile) {
|
|
262
|
+
// Load the profile details, if not already done. There is only a
|
|
263
|
+
// minimal profile passed from the search.
|
|
264
|
+
this.fixtureService.loadProfileByUuid(searchProfile.uuid).subscribe(() => {
|
|
265
|
+
const profile = this.fixtureService.getProfileByUuid(searchProfile.uuid);
|
|
266
|
+
const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);
|
|
267
|
+
if (newFixture) {
|
|
268
|
+
this.selectFixture(newFixture);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
addCopy(originalFixture) {
|
|
273
|
+
const fixture = new Fixture();
|
|
274
|
+
fixture.uuid = this.uuidService.getUuid();
|
|
275
|
+
fixture.profileUuid = originalFixture.profileUuid;
|
|
276
|
+
fixture.name = originalFixture.name;
|
|
277
|
+
fixture.modeShortName = originalFixture.modeShortName;
|
|
278
|
+
fixture.dmxFirstChannel = originalFixture.dmxFirstChannel;
|
|
279
|
+
fixture.dmxUniverseUuid = originalFixture.dmxUniverseUuid;
|
|
280
|
+
this.fixturePool.push(fixture);
|
|
281
|
+
this.selectFixture(fixture);
|
|
282
|
+
}
|
|
283
|
+
removeFixture(fixture) {
|
|
284
|
+
for (let i = 0; i < this.fixturePool.length; i++) {
|
|
285
|
+
if (this.fixturePool[i].uuid === fixture.uuid) {
|
|
286
|
+
if (this.selectedFixture === this.fixturePool[i]) {
|
|
287
|
+
this.selectFixture(undefined);
|
|
288
|
+
}
|
|
289
|
+
this.fixturePool.splice(i, 1);
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (!this.selectedFixture && this.fixturePool && this.fixturePool.length > 0) {
|
|
294
|
+
this.selectFixture((this.selectedFixture = this.fixturePool[0]));
|
|
295
|
+
}
|
|
296
|
+
// remove unused profiles
|
|
297
|
+
for (let i = 0; i < this.projectService.project.fixtureProfiles.length; i++) {
|
|
298
|
+
let profileUsed = false;
|
|
299
|
+
for (const fixtureInPool of this.fixturePool) {
|
|
300
|
+
if (fixtureInPool.profileUuid === this.projectService.project.fixtureProfiles[i].uuid) {
|
|
301
|
+
profileUsed = true;
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (!profileUsed) {
|
|
306
|
+
this.projectService.project.fixtureProfiles.splice(i, 1);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
channelOccupied(index) {
|
|
311
|
+
for (const fixture of this.fixturePool) {
|
|
312
|
+
const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
|
|
313
|
+
const mode = this.fixtureService.getModeByFixture(profile, fixture);
|
|
314
|
+
const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
|
|
315
|
+
if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + channelCount) {
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
channelOccupiedStart(index) {
|
|
322
|
+
for (const fixture of this.fixturePool) {
|
|
323
|
+
if (index === fixture.dmxFirstChannel) {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
channelOccupiedEnd(index) {
|
|
330
|
+
for (const fixture of this.fixturePool) {
|
|
331
|
+
const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
|
|
332
|
+
const mode = this.fixtureService.getModeByFixture(profile, fixture);
|
|
333
|
+
const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
|
|
334
|
+
if (index === fixture.dmxFirstChannel + channelCount - 1) {
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
channelOverlapped(index) {
|
|
341
|
+
let occupiedFixture;
|
|
342
|
+
for (const fixture of this.fixturePool) {
|
|
343
|
+
const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
|
|
344
|
+
const mode = this.fixtureService.getModeByFixture(profile, fixture);
|
|
345
|
+
const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
|
|
346
|
+
if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + channelCount) {
|
|
347
|
+
if (occupiedFixture) {
|
|
348
|
+
if (occupiedFixture.dmxFirstChannel !== fixture.dmxFirstChannel || occupiedFixture.modeShortName !== fixture.modeShortName) {
|
|
349
|
+
// fixtures are allowed to overlap, if they start at the same channel and
|
|
350
|
+
// use the same mode. otherwise it's not allowed.
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
occupiedFixture = fixture;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
channelMouseDown(event) {
|
|
362
|
+
// start dragging
|
|
363
|
+
const selectedIndex = event.target.dataset.index;
|
|
364
|
+
let newSelectedFixture;
|
|
365
|
+
// find a dragging fixture and select it, but don't change the selection, if the
|
|
366
|
+
// currently selected fixture might also be selected (on overlapped fixtures)
|
|
367
|
+
for (const fixture of this.fixturePool) {
|
|
368
|
+
const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
|
|
369
|
+
const mode = this.fixtureService.getModeByFixture(profile, fixture);
|
|
370
|
+
const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
|
|
371
|
+
if (selectedIndex >= fixture.dmxFirstChannel && selectedIndex <= fixture.dmxFirstChannel + channelCount - 1) {
|
|
372
|
+
if (this.selectedFixture === fixture) {
|
|
373
|
+
newSelectedFixture = fixture;
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
if (!newSelectedFixture) {
|
|
377
|
+
newSelectedFixture = fixture;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (newSelectedFixture) {
|
|
382
|
+
if (newSelectedFixture !== this.selectedFixture) {
|
|
383
|
+
this.selectFixture(newSelectedFixture);
|
|
384
|
+
}
|
|
385
|
+
this.channelDragFixture = newSelectedFixture;
|
|
386
|
+
this.channelDragOffset = selectedIndex - newSelectedFixture.dmxFirstChannel;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
channelSelected(index) {
|
|
390
|
+
if (!this.selectedFixture) {
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
if (index >= this.selectedFixture.dmxFirstChannel) {
|
|
394
|
+
const profile = this.fixtureService.getProfileByUuid(this.selectedFixture.profileUuid);
|
|
395
|
+
const mode = this.fixtureService.getModeByFixture(profile, this.selectedFixture);
|
|
396
|
+
const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
|
|
397
|
+
if (index < this.selectedFixture.dmxFirstChannel + channelCount) {
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
// register mouse up globally (e.g. also outside the DMX mapping)
|
|
404
|
+
mouseUp(event) {
|
|
405
|
+
// finish dragging
|
|
406
|
+
this.channelDragFixture = undefined;
|
|
407
|
+
this.channelDragOffset = undefined;
|
|
408
|
+
}
|
|
409
|
+
channelMouseOver(event) {
|
|
410
|
+
if (!this.channelDragFixture) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
// perform dragging
|
|
414
|
+
const selectedIndex = event.target.dataset.index;
|
|
415
|
+
const profile = this.fixtureService.getProfileByUuid(this.channelDragFixture.profileUuid);
|
|
416
|
+
const mode = this.fixtureService.getModeByFixture(profile, this.selectedFixture);
|
|
417
|
+
const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
|
|
418
|
+
if (selectedIndex - this.channelDragOffset >= 0 && selectedIndex - this.channelDragOffset + channelCount - 1 <= 511) {
|
|
419
|
+
this.channelDragFixture.dmxFirstChannel = selectedIndex - this.channelDragOffset;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
ok() {
|
|
423
|
+
// don't allow OK if overlapping fixtures exist
|
|
424
|
+
for (let i = 0; i < this.dmxChannels.length; i++) {
|
|
425
|
+
if (this.channelOverlapped(i)) {
|
|
426
|
+
const msg = 'designer.fixture-pool.channel-occupied';
|
|
427
|
+
const title = 'designer.fixture-pool.channel-occupied-title';
|
|
428
|
+
this.translateService.get([msg, title]).subscribe((result) => {
|
|
429
|
+
this.toastrService.error(result[msg], result[title]);
|
|
430
|
+
});
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
this.projectService.project.fixtures = this.fixturePool;
|
|
435
|
+
// remove deleted fixtures from preset fixtures
|
|
436
|
+
for (let i = this.projectService.project.presetFixtures.length - 1; i >= 0; i--) {
|
|
437
|
+
let found = false;
|
|
438
|
+
const presetFixture = this.projectService.project.presetFixtures[i];
|
|
439
|
+
for (let fixture of this.projectService.project.fixtures) {
|
|
440
|
+
if (presetFixture.fixtureUuid === fixture.uuid) {
|
|
441
|
+
found = true;
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (!found) {
|
|
446
|
+
this.projectService.project.presetFixtures.splice(i, 1);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
// add the new fixtures to the preset fixtures
|
|
450
|
+
for (let fixture of this.projectService.project.fixtures) {
|
|
451
|
+
let found = false;
|
|
452
|
+
for (let presetFixture of this.projectService.project.presetFixtures) {
|
|
453
|
+
if (presetFixture.fixtureUuid === fixture.uuid) {
|
|
454
|
+
found = true;
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (!found) {
|
|
459
|
+
const pixelKeys = this.fixtureService.fixtureGetUniquePixelKeys(fixture);
|
|
460
|
+
if (pixelKeys.length > 0) {
|
|
461
|
+
for (let pixelKey of pixelKeys) {
|
|
462
|
+
const presetFixture = new PresetFixture();
|
|
463
|
+
presetFixture.fixtureUuid = fixture.uuid;
|
|
464
|
+
presetFixture.pixelKey = pixelKey;
|
|
465
|
+
this.projectService.project.presetFixtures.push(presetFixture);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
const presetFixture = new PresetFixture();
|
|
470
|
+
presetFixture.fixtureUuid = fixture.uuid;
|
|
471
|
+
this.projectService.project.presetFixtures.push(presetFixture);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
this.fixtureService.updateCachedFixtures();
|
|
476
|
+
this.presetService.removeDeletedFixtures();
|
|
477
|
+
this.previewService.updateFixtureSetup();
|
|
478
|
+
this.presetService.updateFixtureSelection();
|
|
479
|
+
this.presetService.fixtureSelectionChanged.next();
|
|
480
|
+
this.presetService.previewLive();
|
|
481
|
+
this.onClose.next(1);
|
|
482
|
+
this.bsModalRef.hide();
|
|
483
|
+
}
|
|
484
|
+
cancel() {
|
|
485
|
+
this.onClose.next(2);
|
|
486
|
+
this.bsModalRef.hide();
|
|
487
|
+
}
|
|
488
|
+
updateProfiles() {
|
|
489
|
+
this.updatingProfiles = true;
|
|
490
|
+
// TODO
|
|
491
|
+
this.fixtureService
|
|
492
|
+
.updateProfiles()
|
|
493
|
+
.pipe(finalize(() => {
|
|
494
|
+
this.updatingProfiles = false;
|
|
495
|
+
}), catchError(() => {
|
|
496
|
+
const msg = 'designer.fixture-pool.profiles-update-error';
|
|
497
|
+
const title = 'designer.fixture-pool.profiles-update-error-title';
|
|
498
|
+
this.translateService.get([msg, title]).subscribe((result) => {
|
|
499
|
+
this.toastrService.error(result[msg], result[title]);
|
|
500
|
+
});
|
|
501
|
+
return undefined;
|
|
502
|
+
}))
|
|
503
|
+
.subscribe(() => {
|
|
504
|
+
this.loadProfiles();
|
|
505
|
+
const msg = 'designer.fixture-pool.profiles-updated';
|
|
506
|
+
const title = 'designer.fixture-pool.profiles-updated-title';
|
|
507
|
+
this.translateService.get([msg, title]).subscribe((result) => {
|
|
508
|
+
this.toastrService.success(result[msg], result[title]);
|
|
509
|
+
});
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
createFixtureFromProfileFile() {
|
|
513
|
+
const bsModalRef = this.modalService.show(FixturePoolCreateFromFileComponent, { keyboard: true, ignoreBackdropClick: false });
|
|
514
|
+
bsModalRef.content.onClose.subscribe((profile) => {
|
|
515
|
+
const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);
|
|
516
|
+
this.selectFixture(newFixture);
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
handleKeyboardEvent(event) {
|
|
520
|
+
this.ok();
|
|
521
|
+
}
|
|
522
|
+
static { this.ɵfac = function FixturePoolComponent_Factory(t) { return new (t || FixturePoolComponent)(i0.ɵɵdirectiveInject(i1.BsModalRef), i0.ɵɵdirectiveInject(i2.FixtureService), i0.ɵɵdirectiveInject(i3.UuidService), i0.ɵɵdirectiveInject(i4.ProjectService), i0.ɵɵdirectiveInject(i5.PreviewService), i0.ɵɵdirectiveInject(i6.TranslateService), i0.ɵɵdirectiveInject(i7.ToastrService), i0.ɵɵdirectiveInject(i8.PresetService), i0.ɵɵdirectiveInject(i9.ConfigService), i0.ɵɵdirectiveInject(i1.BsModalService)); }; }
|
|
523
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FixturePoolComponent, selectors: [["lib-app-fixture-pool"]], hostBindings: function FixturePoolComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
524
|
+
i0.ɵɵlistener("mouseup", function FixturePoolComponent_mouseup_HostBindingHandler($event) { return ctx.mouseUp($event); }, false, i0.ɵɵresolveWindow)("keydown.enter", function FixturePoolComponent_keydown_enter_HostBindingHandler($event) { return ctx.handleKeyboardEvent($event); }, false, i0.ɵɵresolveDocument);
|
|
525
|
+
} }, decls: 74, vars: 37, consts: [[1, "modal-header"], [1, "modal-title", "pull-left"], ["type", "button", "aria-label", "Close", 1, "close", "pull-right", 3, "click"], ["aria-hidden", "true"], [1, "modal-body"], [1, "row"], [1, "col-6"], ["type", "text", "id", "searchSet", 1, "form-control", "input-block", "mb-3", 3, "input", "placeholder"], [1, "card", "border-secondary", "w-100", 2, "height", "200px"], [1, "card-body", "p-0", "w-100"], [1, "list-group", "list-group-flush", "w-100"], ["class", "list-group-item flex-column align-items-start d-flex", 4, "ngIf"], ["class", "list-group-item", 4, "ngFor", "ngForOf"], [1, "d-inline-block", "mb-0", "mt-2"], ["href", "https://open-fixture-library.org/", "target", "_blank"], ["href", "https://open-fixture-library.org/fixture-editor", "target", "_blank", "role", "button", 1, "mt-2", "btn", "btn-secondary", "btn-sm", "float-right"], ["aria-hidden", "true", 1, "fa", "fa-file-o"], ["type", "button", "class", "mr-2 mt-2 btn btn-secondary btn-sm float-right", "role", "button", 3, "disabled", "click", 4, "ngIf"], ["type", "button", "role", "button", 1, "btn", "btn-secondary", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-plus"], [1, "form-group", "row"], [1, "col-lg-4", "col-form-label"], [1, "col-lg-8"], [1, "custom-select"], [1, "card", "border-secondary", 2, "height", "235px"], [1, "card-body", "p-0"], [1, "list-group", "list-group-flush", 3, "sortablejs"], ["class", "list-group-item", "style", "cursor: pointer", 3, "active", "click", 4, "ngFor", "ngForOf"], [1, "row", "mt-3"], [1, "col"], ["id", "myTab", "role", "tablist", 1, "nav", "nav-tabs", "mb-4"], [1, "nav-item"], ["id", "sets-tab", "data-toggle", "tab", "href", "#dmx", "role", "tab", 1, "nav-link", "active"], ["aria-hidden", "true", 1, "icon-ola"], ["id", "compositions-tab", "data-toggle", "tab", "href", "#settings", "role", "tab", 1, "nav-link"], ["aria-hidden", "true", 1, "fa", "fa-cog"], ["id", "myTabContent", 1, "tab-content"], ["id", "dmx", "role", "tabpanel", 1, "tab-pane", "show", "active"], ["class", "dmx-channel", "placement", "top", "triggers", "mouseenter:mouseleave", 3, "dmx-channel-occupied", "dmx-channel-occupied-start", "dmx-channel-occupied-end", "dmx-channel-selected", "dmx-channel-overlapped", "popover", "mousedown", "mouseover", 4, "ngFor", "ngForOf"], ["id", "settings", "role", "tabpanel", 1, "tab-pane"], [4, "ngIf"], [1, "modal-footer"], ["href", "#", "role", "button", 1, "mr-3", "my-auto", 3, "click"], ["type", "button", 1, "btn", "btn-primary", 3, "click"], [1, "list-group-item", "flex-column", "align-items-start", "d-flex"], [1, "mb-0", "mx-auto"], [1, "fa", "fa-spinner", "fa-pulse", "fa-fw"], [1, "list-group-item"], [1, "col-10", "col-auto", "my-auto", "pl-2"], [1, "mb-0"], [1, "col-2", "my-auto"], ["href", "#", "role", "button", 1, "btn", "btn-primary", "btn-sm", "float-right", 3, "click"], ["type", "button", "role", "button", 1, "mr-2", "mt-2", "btn", "btn-secondary", "btn-sm", "float-right", 3, "click", "disabled"], ["class", "fa fa-spinner fa-pulse fa-fw", "aria-hidden", "true", 4, "ngIf"], ["class", "fa fa-download fa-fw", "aria-hidden", "true", 4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-pulse", "fa-fw"], ["aria-hidden", "true", 1, "fa", "fa-download", "fa-fw"], [1, "list-group-item", 2, "cursor", "pointer", 3, "click"], [1, "col-auto", "list-sort-handle", "my-auto", 2, "cursor", "move", "cursor", "-webkit-grabbing"], ["aria-hidden", "true", 1, "fa", "fa-bars"], [1, "col-auto", "flex-grow", "pl-0", "my-auto"], [1, "col-auto", "my-auto"], ["aria-hidden", "true", 1, "fa", "fa-minus"], ["placement", "top", "triggers", "mouseenter:mouseleave", 1, "dmx-channel", 3, "mousedown", "mouseover", "popover"], [1, "d-flex", "w-100", "dmx-channel-text"], [1, "m-auto", 2, "font-size", "11px"], ["for", "fixtureName", 1, "col-lg-3", "col-form-label"], [1, "col-lg-9"], ["type", "text", "maxlength", "200", "id", "fixtureName", 1, "form-control", 3, "ngModelChange", "ngModel"], [1, "col-lg-3", "col-form-label"], [1, "custom-select", 3, "ngModelChange", "ngModel"], [3, "ngValue", 4, "ngFor", "ngForOf"], [3, "ngValue"]], template: function FixturePoolComponent_Template(rf, ctx) { if (rf & 1) {
|
|
526
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "h4", 1);
|
|
527
|
+
i0.ɵɵtext(2);
|
|
528
|
+
i0.ɵɵpipe(3, "translate");
|
|
529
|
+
i0.ɵɵelementEnd();
|
|
530
|
+
i0.ɵɵelementStart(4, "button", 2);
|
|
531
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_4_listener() { ctx.cancel(); return false; });
|
|
532
|
+
i0.ɵɵelementStart(5, "span", 3);
|
|
533
|
+
i0.ɵɵtext(6, "\u00D7");
|
|
534
|
+
i0.ɵɵelementEnd()()();
|
|
535
|
+
i0.ɵɵelementStart(7, "div", 4)(8, "div", 5)(9, "div", 6)(10, "input", 7);
|
|
536
|
+
i0.ɵɵpipe(11, "translate");
|
|
537
|
+
i0.ɵɵlistener("input", function FixturePoolComponent_Template_input_input_10_listener($event) { ctx.searchExpression = $event.target.value; return ctx.filterProfiles(); });
|
|
538
|
+
i0.ɵɵelementEnd();
|
|
539
|
+
i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "div", 10);
|
|
540
|
+
i0.ɵɵtemplate(15, FixturePoolComponent_a_15_Template, 3, 0, "a", 11)(16, FixturePoolComponent_div_16_Template, 9, 5, "div", 12);
|
|
541
|
+
i0.ɵɵpipe(17, "sort");
|
|
542
|
+
i0.ɵɵelementEnd()()();
|
|
543
|
+
i0.ɵɵelementStart(18, "div")(19, "p", 13);
|
|
544
|
+
i0.ɵɵtext(20, " Powered by the ");
|
|
545
|
+
i0.ɵɵelementStart(21, "a", 14);
|
|
546
|
+
i0.ɵɵtext(22, "Open Fixture Library");
|
|
547
|
+
i0.ɵɵelementEnd()();
|
|
548
|
+
i0.ɵɵelementStart(23, "a", 15);
|
|
549
|
+
i0.ɵɵelement(24, "i", 16);
|
|
550
|
+
i0.ɵɵtext(25);
|
|
551
|
+
i0.ɵɵpipe(26, "translate");
|
|
552
|
+
i0.ɵɵelementEnd();
|
|
553
|
+
i0.ɵɵtemplate(27, FixturePoolComponent_button_27_Template, 5, 6, "button", 17);
|
|
554
|
+
i0.ɵɵelementEnd()();
|
|
555
|
+
i0.ɵɵelementStart(28, "div", 6)(29, "div", 5)(30, "div", 6)(31, "button", 18);
|
|
556
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_31_listener() { return ctx.createFixtureFromProfileFile(); });
|
|
557
|
+
i0.ɵɵelement(32, "i", 19);
|
|
558
|
+
i0.ɵɵtext(33);
|
|
559
|
+
i0.ɵɵpipe(34, "translate");
|
|
560
|
+
i0.ɵɵelementEnd()();
|
|
561
|
+
i0.ɵɵelementStart(35, "div", 6)(36, "div", 20)(37, "label", 21);
|
|
562
|
+
i0.ɵɵtext(38);
|
|
563
|
+
i0.ɵɵpipe(39, "translate");
|
|
564
|
+
i0.ɵɵelementEnd();
|
|
565
|
+
i0.ɵɵelementStart(40, "div", 22)(41, "select", 23)(42, "option");
|
|
566
|
+
i0.ɵɵtext(43, "Universe 1");
|
|
567
|
+
i0.ɵɵelementEnd()()()()()();
|
|
568
|
+
i0.ɵɵelementStart(44, "div", 24)(45, "div", 25)(46, "div", 26);
|
|
569
|
+
i0.ɵɵtemplate(47, FixturePoolComponent_div_47_Template, 11, 6, "div", 27);
|
|
570
|
+
i0.ɵɵelementEnd()()()()();
|
|
571
|
+
i0.ɵɵelementStart(48, "div", 28)(49, "div", 29)(50, "ul", 30)(51, "li", 31)(52, "a", 32);
|
|
572
|
+
i0.ɵɵelement(53, "i", 33);
|
|
573
|
+
i0.ɵɵtext(54);
|
|
574
|
+
i0.ɵɵpipe(55, "translate");
|
|
575
|
+
i0.ɵɵelementEnd()();
|
|
576
|
+
i0.ɵɵelementStart(56, "li", 31)(57, "a", 34);
|
|
577
|
+
i0.ɵɵelement(58, "i", 35);
|
|
578
|
+
i0.ɵɵtext(59);
|
|
579
|
+
i0.ɵɵpipe(60, "translate");
|
|
580
|
+
i0.ɵɵelementEnd()()();
|
|
581
|
+
i0.ɵɵelementStart(61, "div", 36)(62, "div", 37)(63, "div");
|
|
582
|
+
i0.ɵɵtemplate(64, FixturePoolComponent_div_64_Template, 5, 17, "div", 38);
|
|
583
|
+
i0.ɵɵelementEnd()();
|
|
584
|
+
i0.ɵɵelementStart(65, "div", 39);
|
|
585
|
+
i0.ɵɵtemplate(66, FixturePoolComponent_div_66_Template, 27, 17, "div", 40);
|
|
586
|
+
i0.ɵɵelementEnd()()()()();
|
|
587
|
+
i0.ɵɵelementStart(67, "div", 41)(68, "a", 42);
|
|
588
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_Template_a_click_68_listener() { ctx.cancel(); return false; });
|
|
589
|
+
i0.ɵɵtext(69);
|
|
590
|
+
i0.ɵɵpipe(70, "translate");
|
|
591
|
+
i0.ɵɵelementEnd();
|
|
592
|
+
i0.ɵɵelementStart(71, "button", 43);
|
|
593
|
+
i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_71_listener() { return ctx.ok(); });
|
|
594
|
+
i0.ɵɵtext(72);
|
|
595
|
+
i0.ɵɵpipe(73, "translate");
|
|
596
|
+
i0.ɵɵelementEnd()();
|
|
597
|
+
} if (rf & 2) {
|
|
598
|
+
i0.ɵɵadvance(2);
|
|
599
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 16, "designer.fixture-pool.title"));
|
|
600
|
+
i0.ɵɵadvance(8);
|
|
601
|
+
i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(11, 18, "designer.fixture-pool.search-profiles"));
|
|
602
|
+
i0.ɵɵadvance(5);
|
|
603
|
+
i0.ɵɵproperty("ngIf", ctx.loadingProfiles);
|
|
604
|
+
i0.ɵɵadvance();
|
|
605
|
+
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind2(17, 20, ctx.filteredProfiles, "uuid"));
|
|
606
|
+
i0.ɵɵadvance(9);
|
|
607
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 23, "designer.fixture-pool.add-profile"), " ");
|
|
608
|
+
i0.ɵɵadvance(2);
|
|
609
|
+
i0.ɵɵproperty("ngIf", ctx.configService.localProfiles);
|
|
610
|
+
i0.ɵɵadvance(6);
|
|
611
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(34, 25, "designer.fixture-pool.create-fixture-from-profile-file"), " ");
|
|
612
|
+
i0.ɵɵadvance(5);
|
|
613
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(39, 27, "designer.fixture-pool.universe"));
|
|
614
|
+
i0.ɵɵadvance(8);
|
|
615
|
+
i0.ɵɵproperty("sortablejs", ctx.fixturePool);
|
|
616
|
+
i0.ɵɵadvance();
|
|
617
|
+
i0.ɵɵproperty("ngForOf", ctx.fixturePool);
|
|
618
|
+
i0.ɵɵadvance(7);
|
|
619
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(55, 29, "designer.fixture-pool.dmx"), " ");
|
|
620
|
+
i0.ɵɵadvance(5);
|
|
621
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(60, 31, "designer.fixture-pool.settings"), " ");
|
|
622
|
+
i0.ɵɵadvance(5);
|
|
623
|
+
i0.ɵɵproperty("ngForOf", ctx.dmxChannels);
|
|
624
|
+
i0.ɵɵadvance(2);
|
|
625
|
+
i0.ɵɵproperty("ngIf", ctx.selectedFixture && ctx.selectedFixtureProfile);
|
|
626
|
+
i0.ɵɵadvance(3);
|
|
627
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(70, 33, "designer.misc.cancel"), " ");
|
|
628
|
+
i0.ɵɵadvance(3);
|
|
629
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(73, 35, "designer.misc.ok"));
|
|
630
|
+
} }, dependencies: [i10.NgForOf, i10.NgIf, i11.NgSelectOption, i11.ɵNgSelectMultipleOption, i11.DefaultValueAccessor, i11.SelectControlValueAccessor, i11.NgControlStatus, i11.MaxLengthValidator, i11.NgModel, i12.PopoverDirective, i13.SortablejsDirective, i6.TranslatePipe, i14.ArraySortPipe], styles: [".list-group-item[_ngcontent-%COMP%]{padding:.3rem 1.25rem}.dmx-channel[_ngcontent-%COMP%]{display:flex;float:left;width:28px;border:1px solid white;margin-left:-1px;margin-bottom:-1px;padding-bottom:2px}.dmx-channel-occupied[_ngcontent-%COMP%]{background-color:#63462e;border-left:none;border-right:none;cursor:move}.dmx-channel-occupied-start[_ngcontent-%COMP%]{border-left:1px solid white;border-top-left-radius:8px;border-bottom-left-radius:8px}.dmx-channel-occupied-end[_ngcontent-%COMP%]{border-right:1px solid white;border-top-right-radius:8px;border-bottom-right-radius:8px}.dmx-channel-selected[_ngcontent-%COMP%]{background-color:#fd7e14}.dmx-channel-overlapped[_ngcontent-%COMP%]{background-color:red;border:1px solid red;cursor:move}.card[_ngcontent-%COMP%]{overflow:auto}"] }); }
|
|
631
|
+
}
|
|
632
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixturePoolComponent, [{
|
|
633
|
+
type: Component,
|
|
634
|
+
args: [{ selector: 'lib-app-fixture-pool', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{ 'designer.fixture-pool.title' | translate }}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel(); (false)\">\n <span aria-hidden=\"true\">×</span>\n </button>\n</div>\n<div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-6\">\n <!-- Search for profiles -->\n <input\n type=\"text\"\n class=\"form-control input-block mb-3\"\n id=\"searchSet\"\n placeholder=\"{{ 'designer.fixture-pool.search-profiles' | translate }}\"\n (input)=\"searchExpression = $event.target.value; filterProfiles()\"\n />\n\n <!-- Profiles -->\n <div class=\"card border-secondary w-100\" style=\"height: 200px\">\n <div class=\"card-body p-0 w-100\">\n <div class=\"list-group list-group-flush w-100\">\n <a *ngIf=\"loadingProfiles\" class=\"list-group-item flex-column align-items-start d-flex\">\n <p class=\"mb-0 mx-auto\">\n <i class=\"fa fa-spinner fa-pulse fa-fw\"></i>\n </p>\n </a>\n\n <div class=\"list-group-item\" *ngFor=\"let profile of filteredProfiles | sort : 'uuid'\">\n <div class=\"row\">\n <div class=\"col-10 col-auto my-auto pl-2\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(profile) }} mr-1\"></span> {{ profile.manufacturerName }} -\n {{ profile.name }}\n </p>\n </div>\n <div class=\"col-2 my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"addFixture(profile); (false)\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div>\n <p class=\"d-inline-block mb-0 mt-2\">\n Powered by the <a href=\"https://open-fixture-library.org/\" target=\"_blank\">Open Fixture Library</a>\n </p>\n <a\n class=\"mt-2 btn btn-secondary btn-sm float-right\"\n href=\"https://open-fixture-library.org/fixture-editor\"\n target=\"_blank\"\n role=\"button\"\n >\n <i class=\"fa fa-file-o\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.add-profile' | translate }}\n </a>\n <button\n *ngIf=\"configService.localProfiles\"\n type=\"button\"\n class=\"mr-2 mt-2 btn btn-secondary btn-sm float-right\"\n (click)=\"updateProfiles(); (false)\"\n [disabled]=\"updatingProfiles\"\n role=\"button\"\n >\n <i *ngIf=\"updatingProfiles\" class=\"fa fa-spinner fa-pulse fa-fw\" aria-hidden=\"true\"></i>\n <i *ngIf=\"!updatingProfiles\" class=\"fa fa-download fa-fw\" aria-hidden=\"true\"></i>\n {{ 'designer.fixture-pool.update-profiles' | translate }}\n </button>\n </div>\n </div>\n <div class=\"col-6\">\n <div class=\"row\">\n <!-- Add fixture from local profile -->\n <div class=\"col-6\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"createFixtureFromProfileFile()\" role=\"button\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.create-fixture-from-profile-file' | translate }}\n </button>\n </div>\n\n <!-- Universe -->\n <div class=\"col-6\">\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.fixture-pool.universe' | translate }}</label>\n <div class=\"col-lg-8\">\n <select class=\"custom-select\">\n <option>Universe 1</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixtures -->\n <div class=\"card border-secondary\" style=\"height: 235px\">\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\" [sortablejs]=\"fixturePool\">\n <div\n class=\"list-group-item\"\n *ngFor=\"let fixture of fixturePool\"\n [class.active]=\"fixture == selectedFixture\"\n (click)=\"selectFixture(fixture)\"\n style=\"cursor: pointer\"\n >\n <div class=\"row\">\n <div class=\"col-auto list-sort-handle my-auto\" style=\"cursor: move; cursor: -webkit-grabbing\">\n <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"col-auto flex-grow pl-0 my-auto\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(fixtureService.getProfileByUuid(fixture.profileUuid)) }} mr-1\">\n </span\n >{{ fixture.name }}\n </p>\n </div>\n <div class=\"col-auto my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"removeFixture(fixture); (false)\">\n <i class=\"fa fa-minus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col\">\n <!-- Tab navigation -->\n <ul class=\"nav nav-tabs mb-4\" id=\"myTab\" role=\"tablist\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\" id=\"sets-tab\" data-toggle=\"tab\" href=\"#dmx\" role=\"tab\">\n <i class=\"icon-ola\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.dmx' | translate }}\n </a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\" id=\"compositions-tab\" data-toggle=\"tab\" href=\"#settings\" role=\"tab\">\n <i class=\"fa fa-cog\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.settings' | translate }}\n </a>\n </li>\n </ul>\n\n <!-- Tab content -->\n <div class=\"tab-content\" id=\"myTabContent\">\n <!-- DMX universe overview-->\n <div class=\"tab-pane show active\" id=\"dmx\" role=\"tabpanel\">\n <!-- Show all channel numbers -->\n <!-- <div class=\"form-group row\">\n <div class=\"col-auto flex-grow\"></div>\n <div class=\"col-lg-3 d-flex\">\n <div class=\"form-check my-auto ml-auto\">\n <input type=\"checkbox\" class=\"form-check-input\" id=\"showChannelNumbers\" [ngModel]=\"showChannelNumbers\"\n (ngModelChange)=\"showChannelNumbers = $event\">\n <label class=\"form-check-label\" for=\"showChannelNumbers\">Show channels</label>\n </div>\n </div>\n </div> -->\n\n <!-- List of DMX channels -->\n <div>\n <div\n *ngFor=\"let channel of dmxChannels; let i = index\"\n class=\"dmx-channel\"\n [class.dmx-channel-occupied]=\"channelOccupied(i)\"\n [class.dmx-channel-occupied-start]=\"channelOccupiedStart(i)\"\n [class.dmx-channel-occupied-end]=\"channelOccupiedEnd(i)\"\n [class.dmx-channel-selected]=\"channelSelected(i)\"\n [class.dmx-channel-overlapped]=\"channelOverlapped(i)\"\n (mousedown)=\"channelMouseDown($event)\"\n (mouseover)=\"channelMouseOver($event)\"\n [attr.data-index]=\"i\"\n popover=\"{{ i + 1 }}\"\n placement=\"top\"\n triggers=\"mouseenter:mouseleave\"\n >\n <div class=\"d-flex w-100 dmx-channel-text\" [attr.data-index]=\"i\" [class.dmx-channel-text-visible]=\"showChannelNumbers\">\n <div class=\"m-auto\" style=\"font-size: 11px\" [attr.data-index]=\"i\"><small [attr.data-index]=\"i\"> </small></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixture settings -->\n <div class=\"tab-pane\" id=\"settings\" role=\"tabpanel\">\n <div *ngIf=\"selectedFixture && selectedFixtureProfile\">\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\" for=\"fixtureName\">{{ 'designer.fixture-pool.fixture-name' | translate }}</label>\n <div class=\"col-lg-9\">\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"selectedFixture.name\" maxlength=\"200\" id=\"fixtureName\" />\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.mode' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.modeShortName\"\n (ngModelChange)=\"selectedFixture.modeShortName = $event\"\n >\n <option *ngFor=\"let mode of selectedFixtureProfile.modes\" [ngValue]=\"mode.shortName || mode.name\">\n {{ mode.name }}\n - {{ fixtureService.getModeChannelCount(selectedFixtureProfile, mode) }}\n {{ 'designer.fixture-pool.channels' | translate }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.first-channel' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.dmxFirstChannel\"\n (ngModelChange)=\"selectedFixture.dmxFirstChannel = $event\"\n >\n <option *ngFor=\"let channel of dmxChannels; let i = index\" [ngValue]=\"i\">\n {{ i + 1 }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\"></label>\n <div class=\"col-lg-9\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addCopy(selectedFixture)\">\n {{ 'designer.fixture.add-copy' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal-footer\">\n <a class=\"mr-3 my-auto\" href=\"#\" role=\"button\" (click)=\"cancel(); (false)\">\n {{ 'designer.misc.cancel' | translate }}\n </a>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"ok()\">{{ 'designer.misc.ok' | translate }}</button>\n</div>\n", styles: [".list-group-item{padding:.3rem 1.25rem}.dmx-channel{display:flex;float:left;width:28px;border:1px solid white;margin-left:-1px;margin-bottom:-1px;padding-bottom:2px}.dmx-channel-occupied{background-color:#63462e;border-left:none;border-right:none;cursor:move}.dmx-channel-occupied-start{border-left:1px solid white;border-top-left-radius:8px;border-bottom-left-radius:8px}.dmx-channel-occupied-end{border-right:1px solid white;border-top-right-radius:8px;border-bottom-right-radius:8px}.dmx-channel-selected{background-color:#fd7e14}.dmx-channel-overlapped{background-color:red;border:1px solid red;cursor:move}.card{overflow:auto}\n"] }]
|
|
635
|
+
}], () => [{ type: i1.BsModalRef }, { type: i2.FixtureService }, { type: i3.UuidService }, { type: i4.ProjectService }, { type: i5.PreviewService }, { type: i6.TranslateService }, { type: i7.ToastrService }, { type: i8.PresetService }, { type: i9.ConfigService }, { type: i1.BsModalService }], { mouseUp: [{
|
|
636
|
+
type: HostListener,
|
|
637
|
+
args: ['window:mouseup', ['$event']]
|
|
638
|
+
}], handleKeyboardEvent: [{
|
|
639
|
+
type: HostListener,
|
|
640
|
+
args: ['document:keydown.enter', ['$event']]
|
|
641
|
+
}] }); })();
|
|
642
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FixturePoolComponent, { className: "FixturePoolComponent" }); })();
|
|
643
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1wb29sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvZml4dHVyZS1wb29sL2ZpeHR1cmUtcG9vbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL2ZpeHR1cmUtcG9vbC9maXh0dXJlLXBvb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUVBQXlFLENBQUM7QUFDN0gs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RUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBclp2QyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsUmVmLCBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaXh0dXJlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZVByb2ZpbGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1wcm9maWxlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJlc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJldmlld1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcmV2aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXVpZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRml4dHVyZVBvb2xDcmVhdGVGcm9tRmlsZUNvbXBvbmVudCB9IGZyb20gJy4vZml4dHVyZS1wb29sLWNyZWF0ZS1mcm9tLWZpbGUvZml4dHVyZS1wb29sLWNyZWF0ZS1mcm9tLWZpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IFByZXNldEZpeHR1cmUgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0LWZpeHR1cmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYXBwLWZpeHR1cmUtcG9vbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maXh0dXJlLXBvb2wuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maXh0dXJlLXBvb2wuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGaXh0dXJlUG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcHJvZmlsZXM6IEZpeHR1cmVQcm9maWxlW107XG4gIHB1YmxpYyBmaWx0ZXJlZFByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdO1xuICBwdWJsaWMgbG9hZGluZ1Byb2ZpbGVzID0gZmFsc2U7XG5cbiAgcHVibGljIGZpeHR1cmVQb29sOiBGaXh0dXJlW107XG5cbiAgcHVibGljIGRteENoYW5uZWxzOiBudW1iZXJbXSA9IFtdO1xuICBwdWJsaWMgc2VsZWN0ZWRGaXh0dXJlOiBGaXh0dXJlO1xuICBwdWJsaWMgc2VsZWN0ZWRGaXh0dXJlUHJvZmlsZTogRml4dHVyZVByb2ZpbGU7XG4gIHB1YmxpYyBzaG93Q2hhbm5lbE51bWJlcnMgPSBmYWxzZTtcbiAgcHVibGljIGNoYW5uZWxEcmFnRml4dHVyZTogRml4dHVyZTtcbiAgcHVibGljIGNoYW5uZWxEcmFnT2Zmc2V0OiBudW1iZXI7XG5cbiAgcHVibGljIG9uQ2xvc2U6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIHNlYXJjaEV4cHJlc3Npb246IHN0cmluZztcblxuICBwdWJsaWMgdXBkYXRpbmdQcm9maWxlczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYnNNb2RhbFJlZjogQnNNb2RhbFJlZixcbiAgICBwdWJsaWMgZml4dHVyZVNlcnZpY2U6IEZpeHR1cmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFV1aWRTZXJ2aWNlLFxuICAgIHB1YmxpYyBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcmV2aWV3U2VydmljZTogUHJldmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIHByZXNldFNlcnZpY2U6IFByZXNldFNlcnZpY2UsXG4gICAgcHVibGljIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZml4dHVyZVBvb2wgPSBbLi4udGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzXTtcblxuICAgIGlmICh0aGlzLmZpeHR1cmVQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZSh0aGlzLmZpeHR1cmVQb29sWzBdKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDUxMjsgaSsrKSB7XG4gICAgICB0aGlzLmRteENoYW5uZWxzLnB1c2goMCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkUHJvZmlsZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFByb2ZpbGVzKCkge1xuICAgIHRoaXMubG9hZGluZ1Byb2ZpbGVzID0gdHJ1ZTtcblxuICAgIHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0U2VhcmNoUHJvZmlsZXMoKS5zdWJzY3JpYmUoKHByb2ZpbGVzKSA9PiB7XG4gICAgICB0aGlzLnByb2ZpbGVzID0gcHJvZmlsZXM7XG4gICAgICB0aGlzLmZpbHRlclByb2ZpbGVzKCk7XG4gICAgICB0aGlzLmxvYWRpbmdQcm9maWxlcyA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0Rml4dHVyZShmaXh0dXJlOiBGaXh0dXJlKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVQcm9maWxlID0gdW5kZWZpbmVkO1xuICAgIGlmIChmaXh0dXJlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZVByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0gZml4dHVyZTtcbiAgfVxuXG4gIGZpbHRlclByb2ZpbGVzKCkge1xuICAgIGlmICghdGhpcy5zZWFyY2hFeHByZXNzaW9uIHx8ICF0aGlzLnByb2ZpbGVzKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUHJvZmlsZXMgPSB0aGlzLnByb2ZpbGVzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRQcm9maWxlcyA9IFtdO1xuXG4gICAgY29uc3Qga2V5d29yZHMgPSB0aGlzLnNlYXJjaEV4cHJlc3Npb24uc3BsaXQoJyAnKTtcblxuICAgIGZvciAoY29uc3QgcHJvZmlsZSBvZiB0aGlzLnByb2ZpbGVzKSB7XG4gICAgICBsZXQgZm91bmRLZXl3b3JkcyA9IDA7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBrZXl3b3Jkcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvZmlsZS51dWlkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkpICE9PSAtMSB8fFxuICAgICAgICAgIHByb2ZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoa2V5d29yZC50b0xvd2VyQ2FzZSgpKSAhPT0gLTEgfHxcbiAgICAgICAgICBwcm9maWxlLm1hbnVmYWN0dXJlck5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGtleXdvcmQudG9Mb3dlckNhc2UoKSkgIT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIGZvdW5kS2V5d29yZHMrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmRLZXl3b3JkcyA9PT0ga2V5d29yZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRQcm9maWxlcy5wdXNoKHByb2ZpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZEZpeHR1cmUoc2VhcmNoUHJvZmlsZTogRml4dHVyZVByb2ZpbGUpIHtcbiAgICAvLyBMb2FkIHRoZSBwcm9maWxlIGRldGFpbHMsIGlmIG5vdCBhbHJlYWR5IGRvbmUuIFRoZXJlIGlzIG9ubHkgYVxuICAgIC8vIG1pbmltYWwgcHJvZmlsZSBwYXNzZWQgZnJvbSB0aGUgc2VhcmNoLlxuICAgIHRoaXMuZml4dHVyZVNlcnZpY2UubG9hZFByb2ZpbGVCeVV1aWQoc2VhcmNoUHJvZmlsZS51dWlkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0UHJvZmlsZUJ5VXVpZChzZWFyY2hQcm9maWxlLnV1aWQpO1xuICAgICAgY29uc3QgbmV3Rml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuYWRkRml4dHVyZShwcm9maWxlLCB0aGlzLmZpeHR1cmVQb29sKTtcbiAgICAgIGlmIChuZXdGaXh0dXJlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZShuZXdGaXh0dXJlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFkZENvcHkob3JpZ2luYWxGaXh0dXJlOiBGaXh0dXJlKSB7XG4gICAgY29uc3QgZml4dHVyZSA9IG5ldyBGaXh0dXJlKCk7XG5cbiAgICBmaXh0dXJlLnV1aWQgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFV1aWQoKTtcbiAgICBmaXh0dXJlLnByb2ZpbGVVdWlkID0gb3JpZ2luYWxGaXh0dXJlLnByb2ZpbGVVdWlkO1xuICAgIGZpeHR1cmUubmFtZSA9IG9yaWdpbmFsRml4dHVyZS5uYW1lO1xuICAgIGZpeHR1cmUubW9kZVNob3J0TmFtZSA9IG9yaWdpbmFsRml4dHVyZS5tb2RlU2hvcnROYW1lO1xuICAgIGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gb3JpZ2luYWxGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbDtcbiAgICBmaXh0dXJlLmRteFVuaXZlcnNlVXVpZCA9IG9yaWdpbmFsRml4dHVyZS5kbXhVbml2ZXJzZVV1aWQ7XG5cbiAgICB0aGlzLmZpeHR1cmVQb29sLnB1c2goZml4dHVyZSk7XG4gICAgdGhpcy5zZWxlY3RGaXh0dXJlKGZpeHR1cmUpO1xuICB9XG5cbiAgcmVtb3ZlRml4dHVyZShmaXh0dXJlOiBGaXh0dXJlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpeHR1cmVQb29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5maXh0dXJlUG9vbFtpXS51dWlkID09PSBmaXh0dXJlLnV1aWQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlID09PSB0aGlzLmZpeHR1cmVQb29sW2ldKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXh0dXJlUG9vbC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZEZpeHR1cmUgJiYgdGhpcy5maXh0dXJlUG9vbCAmJiB0aGlzLmZpeHR1cmVQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZSgodGhpcy5zZWxlY3RlZEZpeHR1cmUgPSB0aGlzLmZpeHR1cmVQb29sWzBdKSk7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHVudXNlZCBwcm9maWxlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVQcm9maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHByb2ZpbGVVc2VkID0gZmFsc2U7XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUluUG9vbCBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICAgIGlmIChmaXh0dXJlSW5Qb29sLnByb2ZpbGVVdWlkID09PSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzW2ldLnV1aWQpIHtcbiAgICAgICAgICBwcm9maWxlVXNlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFwcm9maWxlVXNlZCkge1xuICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFubmVsT2NjdXBpZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCBmaXh0dXJlKTtcbiAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUNoYW5uZWxDb3VudChwcm9maWxlLCBtb2RlKTtcblxuICAgICAgaWYgKGluZGV4ID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGluZGV4IDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBjaGFubmVsQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hhbm5lbE9jY3VwaWVkU3RhcnQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICBpZiAoaW5kZXggPT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoYW5uZWxPY2N1cGllZEVuZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCk7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQnlGaXh0dXJlKHByb2ZpbGUsIGZpeHR1cmUpO1xuICAgICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQ2hhbm5lbENvdW50KHByb2ZpbGUsIG1vZGUpO1xuXG4gICAgICBpZiAoaW5kZXggPT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgY2hhbm5lbENvdW50IC0gMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjaGFubmVsT3ZlcmxhcHBlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgbGV0IG9jY3VwaWVkRml4dHVyZTogRml4dHVyZTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCBmaXh0dXJlKTtcbiAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUNoYW5uZWxDb3VudChwcm9maWxlLCBtb2RlKTtcblxuICAgICAgaWYgKGluZGV4ID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGluZGV4IDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBjaGFubmVsQ291bnQpIHtcbiAgICAgICAgaWYgKG9jY3VwaWVkRml4dHVyZSkge1xuICAgICAgICAgIGlmIChvY2N1cGllZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICE9PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCB8fCBvY2N1cGllZEZpeHR1cmUubW9kZVNob3J0TmFtZSAhPT0gZml4dHVyZS5tb2RlU2hvcnROYW1lKSB7XG4gICAgICAgICAgICAvLyBmaXh0dXJlcyBhcmUgYWxsb3dlZCB0byBvdmVybGFwLCBpZiB0aGV5IHN0YXJ0IGF0IHRoZSBzYW1lIGNoYW5uZWwgYW5kXG4gICAgICAgICAgICAvLyB1c2UgdGhlIHNhbWUgbW9kZS4gb3RoZXJ3aXNlIGl0J3Mgbm90IGFsbG93ZWQuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2NjdXBpZWRGaXh0dXJlID0gZml4dHVyZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoYW5uZWxNb3VzZURvd24oZXZlbnQ6IGFueSkge1xuICAgIC8vIHN0YXJ0IGRyYWdnaW5nXG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmluZGV4O1xuICAgIGxldCBuZXdTZWxlY3RlZEZpeHR1cmU6IEZpeHR1cmU7XG5cbiAgICAvLyBmaW5kIGEgZHJhZ2dpbmcgZml4dHVyZSBhbmQgc2VsZWN0IGl0LCBidXQgZG9uJ3QgY2hhbmdlIHRoZSBzZWxlY3Rpb24sIGlmIHRoZVxuICAgIC8vIGN1cnJlbnRseSBzZWxlY3RlZCBmaXh0dXJlIG1pZ2h0IGFsc28gYmUgc2VsZWN0ZWQgKG9uIG92ZXJsYXBwZWQgZml4dHVyZXMpXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCk7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQnlGaXh0dXJlKHByb2ZpbGUsIGZpeHR1cmUpO1xuICAgICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQ2hhbm5lbENvdW50KHByb2ZpbGUsIG1vZGUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAmJiBzZWxlY3RlZEluZGV4IDw9IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgY2hhbm5lbENvdW50IC0gMSkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpeHR1cmUgPT09IGZpeHR1cmUpIHtcbiAgICAgICAgICBuZXdTZWxlY3RlZEZpeHR1cmUgPSBmaXh0dXJlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXdTZWxlY3RlZEZpeHR1cmUpIHtcbiAgICAgICAgICBuZXdTZWxlY3RlZEZpeHR1cmUgPSBmaXh0dXJlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld1NlbGVjdGVkRml4dHVyZSkge1xuICAgICAgaWYgKG5ld1NlbGVjdGVkRml4dHVyZSAhPT0gdGhpcy5zZWxlY3RlZEZpeHR1cmUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlKG5ld1NlbGVjdGVkRml4dHVyZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2hhbm5lbERyYWdGaXh0dXJlID0gbmV3U2VsZWN0ZWRGaXh0dXJlO1xuICAgICAgdGhpcy5jaGFubmVsRHJhZ09mZnNldCA9IHNlbGVjdGVkSW5kZXggLSBuZXdTZWxlY3RlZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5uZWxTZWxlY3RlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRml4dHVyZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpbmRleCA+PSB0aGlzLnNlbGVjdGVkRml4dHVyZS5kbXhGaXJzdENoYW5uZWwpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQodGhpcy5zZWxlY3RlZEZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCB0aGlzLnNlbGVjdGVkRml4dHVyZSk7XG4gICAgICBjb25zdCBjaGFubmVsQ291bnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVDaGFubmVsQ291bnQocHJvZmlsZSwgbW9kZSk7XG5cbiAgICAgIGlmIChpbmRleCA8IHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIGNoYW5uZWxDb3VudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyByZWdpc3RlciBtb3VzZSB1cCBnbG9iYWxseSAoZS5nLiBhbHNvIG91dHNpZGUgdGhlIERNWCBtYXBwaW5nKVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIG1vdXNlVXAoZXZlbnQ6IGFueSkge1xuICAgIC8vIGZpbmlzaCBkcmFnZ2luZ1xuICAgIHRoaXMuY2hhbm5lbERyYWdGaXh0dXJlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGFubmVsTW91c2VPdmVyKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbERyYWdGaXh0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcGVyZm9ybSBkcmFnZ2luZ1xuICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBldmVudC50YXJnZXQuZGF0YXNldC5pbmRleDtcbiAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKHRoaXMuY2hhbm5lbERyYWdGaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICBjb25zdCBtb2RlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQnlGaXh0dXJlKHByb2ZpbGUsIHRoaXMuc2VsZWN0ZWRGaXh0dXJlKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVDaGFubmVsQ291bnQocHJvZmlsZSwgbW9kZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJbmRleCAtIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgPj0gMCAmJiBzZWxlY3RlZEluZGV4IC0gdGhpcy5jaGFubmVsRHJhZ09mZnNldCArIGNoYW5uZWxDb3VudCAtIDEgPD0gNTExKSB7XG4gICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPSBzZWxlY3RlZEluZGV4IC0gdGhpcy5jaGFubmVsRHJhZ09mZnNldDtcbiAgICB9XG4gIH1cblxuICBvaygpIHtcbiAgICAvLyBkb24ndCBhbGxvdyBPSyBpZiBvdmVybGFwcGluZyBmaXh0dXJlcyBleGlzdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kbXhDaGFubmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hhbm5lbE92ZXJsYXBwZWQoaSkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5jaGFubmVsLW9jY3VwaWVkJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLmNoYW5uZWwtb2NjdXBpZWQtdGl0bGUnO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVQb29sO1xuXG4gICAgLy8gcmVtb3ZlIGRlbGV0ZWQgZml4dHVyZXMgZnJvbSBwcmVzZXQgZml4dHVyZXNcbiAgICBmb3IgKGxldCBpID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHByZXNldEZpeHR1cmUgPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0Rml4dHVyZXNbaV07XG4gICAgICBmb3IgKGxldCBmaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlcykge1xuICAgICAgICBpZiAocHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCA9PT0gZml4dHVyZS51dWlkKSB7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBuZXcgZml4dHVyZXMgdG8gdGhlIHByZXNldCBmaXh0dXJlc1xuICAgIGZvciAobGV0IGZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzKSB7XG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IHByZXNldEZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzKSB7XG4gICAgICAgIGlmIChwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkID09PSBmaXh0dXJlLnV1aWQpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgY29uc3QgcGl4ZWxLZXlzID0gdGhpcy5maXh0dXJlU2VydmljZS5maXh0dXJlR2V0VW5pcXVlUGl4ZWxLZXlzKGZpeHR1cmUpO1xuICAgICAgICBpZiAocGl4ZWxLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKGxldCBwaXhlbEtleSBvZiBwaXhlbEtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNldEZpeHR1cmUgPSBuZXcgUHJlc2V0Rml4dHVyZSgpO1xuICAgICAgICAgICAgcHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCA9IGZpeHR1cmUudXVpZDtcbiAgICAgICAgICAgIHByZXNldEZpeHR1cmUucGl4ZWxLZXkgPSBwaXhlbEtleTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcy5wdXNoKHByZXNldEZpeHR1cmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwcmVzZXRGaXh0dXJlID0gbmV3IFByZXNldEZpeHR1cmUoKTtcbiAgICAgICAgICBwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkID0gZml4dHVyZS51dWlkO1xuICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcy5wdXNoKHByZXNldEZpeHR1cmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maXh0dXJlU2VydmljZS51cGRhdGVDYWNoZWRGaXh0dXJlcygpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5yZW1vdmVEZWxldGVkRml4dHVyZXMoKTtcbiAgICB0aGlzLnByZXZpZXdTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVTZXR1cCgpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS51cGRhdGVGaXh0dXJlU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLmZpeHR1cmVTZWxlY3Rpb25DaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcblxuICAgIHRoaXMub25DbG9zZS5uZXh0KDEpO1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5vbkNsb3NlLm5leHQoMik7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVByb2ZpbGVzKCkge1xuICAgIHRoaXMudXBkYXRpbmdQcm9maWxlcyA9IHRydWU7XG5cbiAgICAvLyBUT0RPXG4gICAgdGhpcy5maXh0dXJlU2VydmljZVxuICAgICAgLnVwZGF0ZVByb2ZpbGVzKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGluZ1Byb2ZpbGVzID0gZmFsc2U7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZS1lcnJvcic7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZS1lcnJvci10aXRsZSc7XG5cbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZFByb2ZpbGVzKCk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5wcm9maWxlcy11cGRhdGVkJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZWQtdGl0bGUnO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zdWNjZXNzKHJlc3VsdFttc2ddLCByZXN1bHRbdGl0bGVdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUZpeHR1cmVGcm9tUHJvZmlsZUZpbGUoKSB7XG4gICAgY29uc3QgYnNNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coRml4dHVyZVBvb2xDcmVhdGVGcm9tRmlsZUNvbXBvbmVudCwgeyBrZXlib2FyZDogdHJ1ZSwgaWdub3JlQmFja2Ryb3BDbGljazogZmFsc2UgfSk7XG4gICAgKGJzTW9kYWxSZWYuY29udGVudCBhcyBGaXh0dXJlUG9vbENyZWF0ZUZyb21GaWxlQ29tcG9uZW50KS5vbkNsb3NlLnN1YnNjcmliZSgocHJvZmlsZTogRml4dHVyZVByb2ZpbGUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0ZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmFkZEZpeHR1cmUocHJvZmlsZSwgdGhpcy5maXh0dXJlUG9vbCk7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3Rml4dHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogYW55KSB7XG4gICAgdGhpcy5vaygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIHB1bGwtbGVmdFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudGl0bGUnIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZSBwdWxsLXJpZ2h0XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNhbmNlbCgpOyAoZmFsc2UpXCI+XG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgIDwhLS0gU2VhcmNoIGZvciBwcm9maWxlcyAtLT5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LWJsb2NrIG1iLTNcIlxuICAgICAgICBpZD1cInNlYXJjaFNldFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5zZWFyY2gtcHJvZmlsZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGlucHV0KT1cInNlYXJjaEV4cHJlc3Npb24gPSAkZXZlbnQudGFyZ2V0LnZhbHVlOyBmaWx0ZXJQcm9maWxlcygpXCJcbiAgICAgIC8+XG5cbiAgICAgIDwhLS0gUHJvZmlsZXMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItc2Vjb25kYXJ5IHctMTAwXCIgc3R5bGU9XCJoZWlnaHQ6IDIwMHB4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0wIHctMTAwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaCB3LTEwMFwiPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJsb2FkaW5nUHJvZmlsZXNcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1zdGFydCBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIG14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtcHVsc2UgZmEtZndcIj48L2k+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBwcm9maWxlIG9mIGZpbHRlcmVkUHJvZmlsZXMgfCBzb3J0IDogJ3V1aWQnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwIGNvbC1hdXRvIG15LWF1dG8gcGwtMlwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi17eyBmaXh0dXJlU2VydmljZS5nZXRGaXh0dXJlSWNvbkNsYXNzKHByb2ZpbGUpIH19IG1yLTFcIj48L3NwYW4+IHt7IHByb2ZpbGUubWFudWZhY3R1cmVyTmFtZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgIHt7IHByb2ZpbGUubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBteS1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gZmxvYXQtcmlnaHRcIiBocmVmPVwiI1wiIHJvbGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkRml4dHVyZShwcm9maWxlKTsgKGZhbHNlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8cCBjbGFzcz1cImQtaW5saW5lLWJsb2NrIG1iLTAgbXQtMlwiPlxuICAgICAgICAgIFBvd2VyZWQgYnkgdGhlIDxhIGhyZWY9XCJodHRwczovL29wZW4tZml4dHVyZS1saWJyYXJ5Lm9yZy9cIiB0YXJnZXQ9XCJfYmxhbmtcIj5PcGVuIEZpeHR1cmUgTGlicmFyeTwvYT5cbiAgICAgICAgPC9wPlxuICAgICAgICA8YVxuICAgICAgICAgIGNsYXNzPVwibXQtMiBidG4gYnRuLXNlY29uZGFyeSBidG4tc20gZmxvYXQtcmlnaHRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL29wZW4tZml4dHVyZS1saWJyYXJ5Lm9yZy9maXh0dXJlLWVkaXRvclwiXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmFkZC1wcm9maWxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2E+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cImNvbmZpZ1NlcnZpY2UubG9jYWxQcm9maWxlc1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtci0yIG10LTIgYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtIGZsb2F0LXJpZ2h0XCJcbiAgICAgICAgICAoY2xpY2spPVwidXBkYXRlUHJvZmlsZXMoKTsgKGZhbHNlKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInVwZGF0aW5nUHJvZmlsZXNcIlxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgKm5nSWY9XCJ1cGRhdGluZ1Byb2ZpbGVzXCIgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXB1bHNlIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIDxpICpuZ0lmPVwiIXVwZGF0aW5nUHJvZmlsZXNcIiBjbGFzcz1cImZhIGZhLWRvd25sb2FkIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIHt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudXBkYXRlLXByb2ZpbGVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8IS0tIEFkZCBmaXh0dXJlIGZyb20gbG9jYWwgcHJvZmlsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJjcmVhdGVGaXh0dXJlRnJvbVByb2ZpbGVGaWxlKClcIiByb2xlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IHt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuY3JlYXRlLWZpeHR1cmUtZnJvbS1wcm9maWxlLWZpbGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVW5pdmVyc2UgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWxnLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLnVuaXZlcnNlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLThcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPlVuaXZlcnNlIDE8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGaXh0dXJlcyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1zZWNvbmRhcnlcIiBzdHlsZT1cImhlaWdodDogMjM1cHhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgW3NvcnRhYmxlanNdPVwiZml4dHVyZVBvb2xcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZml4dHVyZSBvZiBmaXh0dXJlUG9vbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZml4dHVyZSA9PSBzZWxlY3RlZEZpeHR1cmVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Rml4dHVyZShmaXh0dXJlKVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBsaXN0LXNvcnQtaGFuZGxlIG15LWF1dG9cIiBzdHlsZT1cImN1cnNvcjogbW92ZTsgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhcnNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGZsZXgtZ3JvdyBwbC0wIG15LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24te3sgZml4dHVyZVNlcnZpY2UuZ2V0Rml4dHVyZUljb25DbGFzcyhmaXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpKSB9fSBtci0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+e3sgZml4dHVyZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIG15LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBmbG9hdC1yaWdodFwiIGhyZWY9XCIjXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJyZW1vdmVGaXh0dXJlKGZpeHR1cmUpOyAoZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbWludXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICA8IS0tIFRhYiBuYXZpZ2F0aW9uIC0tPlxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIG1iLTRcIiBpZD1cIm15VGFiXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgICAgICA8YSBjbGFzcz1cIm5hdi1saW5rIGFjdGl2ZVwiIGlkPVwic2V0cy10YWJcIiBkYXRhLXRvZ2dsZT1cInRhYlwiIGhyZWY9XCIjZG14XCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uLW9sYVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5kbXgnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIiBpZD1cImNvbXBvc2l0aW9ucy10YWJcIiBkYXRhLXRvZ2dsZT1cInRhYlwiIGhyZWY9XCIjc2V0dGluZ3NcIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5zZXR0aW5ncycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuXG4gICAgICA8IS0tIFRhYiBjb250ZW50IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgaWQ9XCJteVRhYkNvbnRlbnRcIj5cbiAgICAgICAgPCEtLSBETVggdW5pdmVyc2Ugb3ZlcnZpZXctLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1wYW5lIHNob3cgYWN0aXZlXCIgaWQ9XCJkbXhcIiByb2xlPVwidGFicGFuZWxcIj5cbiAgICAgICAgICA8IS0tIFNob3cgYWxsIGNoYW5uZWwgbnVtYmVycyAtLT5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGZsZXgtZ3Jvd1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGQtZmxleFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBteS1hdXRvIG1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgaWQ9XCJzaG93Q2hhbm5lbE51bWJlcnNcIiBbbmdNb2RlbF09XCJzaG93Q2hhbm5lbE51bWJlcnNcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2hvd0NoYW5uZWxOdW1iZXJzID0gJGV2ZW50XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNob3dDaGFubmVsTnVtYmVyc1wiPlNob3cgY2hhbm5lbHM8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gTGlzdCBvZiBETVggY2hhbm5lbHMgLS0+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoYW5uZWwgb2YgZG14Q2hhbm5lbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImRteC1jaGFubmVsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW9jY3VwaWVkXT1cImNoYW5uZWxPY2N1cGllZChpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kbXgtY2hhbm5lbC1vY2N1cGllZC1zdGFydF09XCJjaGFubmVsT2NjdXBpZWRTdGFydChpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kbXgtY2hhbm5lbC1vY2N1cGllZC1lbmRdPVwiY2hhbm5lbE9jY3VwaWVkRW5kKGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLXNlbGVjdGVkXT1cImNoYW5uZWxTZWxlY3RlZChpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kbXgtY2hhbm5lbC1vdmVybGFwcGVkXT1cImNoYW5uZWxPdmVybGFwcGVkKGkpXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJjaGFubmVsTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAobW91c2VvdmVyKT1cImNoYW5uZWxNb3VzZU92ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiXG4gICAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyBpICsgMSB9fVwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgIHRyaWdnZXJzPVwibW91c2VlbnRlcjptb3VzZWxlYXZlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBkbXgtY2hhbm5lbC10ZXh0XCIgW2F0dHIuZGF0YS1pbmRleF09XCJpXCIgW2NsYXNzLmRteC1jaGFubmVsLXRleHQtdmlzaWJsZV09XCJzaG93Q2hhbm5lbE51bWJlcnNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1hdXRvXCIgc3R5bGU9XCJmb250LXNpemU6IDExcHhcIiBbYXR0ci5kYXRhLWluZGV4XT1cImlcIj48c21hbGwgW2F0dHIuZGF0YS1pbmRleF09XCJpXCI+Jm5ic3A7PC9zbWFsbD48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGaXh0dXJlIHNldHRpbmdzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmVcIiBpZD1cInNldHRpbmdzXCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRml4dHVyZSAmJiBzZWxlY3RlZEZpeHR1cmVQcm9maWxlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWxnLTMgY29sLWZvcm0tbGFiZWxcIiBmb3I9XCJmaXh0dXJlTmFtZVwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuZml4dHVyZS1uYW1lJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpeHR1cmUubmFtZVwiIG1heGxlbmd0aD1cIjIwMFwiIGlkPVwiZml4dHVyZU5hbWVcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWxnLTMgY29sLWZvcm0tbGFiZWxcIj57eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLm1vZGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy05XCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRml4dHVyZS5tb2RlU2hvcnROYW1lXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlbGVjdGVkRml4dHVyZS5tb2RlU2hvcnROYW1lID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtb2RlIG9mIHNlbGVjdGVkRml4dHVyZVByb2ZpbGUubW9kZXNcIiBbbmdWYWx1ZV09XCJtb2RlLnNob3J0TmFtZSB8fCBtb2RlLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbW9kZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIC0ge3sgZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUNoYW5uZWxDb3VudChzZWxlY3RlZEZpeHR1cmVQcm9maWxlLCBtb2RlKSB9fVxuICAgICAgICAgICAgICAgICAgICB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmNoYW5uZWxzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuZmlyc3QtY2hhbm5lbCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTlcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjaGFubmVsIG9mIGRteENoYW5uZWxzOyBsZXQgaSA9IGluZGV4XCIgW25nVmFsdWVdPVwiaVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpICsgMSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZENvcHkoc2VsZWN0ZWRGaXh0dXJlKVwiPlxuICAgICAgICAgICAgICAgICAge3sgJ2Rlc2lnbmVyLmZpeHR1cmUuYWRkLWNvcHknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gIDxhIGNsYXNzPVwibXItMyBteS1hdXRvXCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbCgpOyAoZmFsc2UpXCI+XG4gICAge3sgJ2Rlc2lnbmVyLm1pc2MuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9rKClcIj57eyAnZGVzaWduZXIubWlzYy5vaycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbjwvZGl2PlxuIl19
|