angular-three-soba 1.14.0 → 2.0.0-beta.10
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/README.md +2 -2
- package/abstractions/billboard/billboard.d.ts +28 -0
- package/abstractions/detailed/detailed.d.ts +26 -0
- package/abstractions/edges/edges.d.ts +34 -0
- package/abstractions/grid/grid.d.ts +50 -0
- package/abstractions/index.d.ts +6 -11
- package/abstractions/text/text.d.ts +82 -0
- package/abstractions/text-3d/text-3d.d.ts +81 -0
- package/cameras/{lib/camera → camera}/camera-content.d.ts +2 -2
- package/cameras/camera/camera.d.ts +26 -0
- package/cameras/cube-camera/cube-camera.d.ts +69 -0
- package/cameras/index.d.ts +4 -4
- package/cameras/orthographic-camera/orthographic-camera.d.ts +37 -0
- package/cameras/{lib/perspective-camera → perspective-camera}/perspective-camera.d.ts +10 -1
- package/controls/index.d.ts +1 -1
- package/controls/orbit-controls/orbit-controls.d.ts +54 -0
- package/esm2022/abstractions/angular-three-soba-abstractions.mjs +1 -1
- package/esm2022/abstractions/billboard/billboard.mjs +74 -0
- package/esm2022/abstractions/detailed/detailed.mjs +64 -0
- package/esm2022/abstractions/edges/edges.mjs +88 -0
- package/esm2022/abstractions/grid/grid.mjs +180 -0
- package/esm2022/abstractions/index.mjs +7 -12
- package/esm2022/abstractions/text/text.mjs +274 -0
- package/esm2022/abstractions/text-3d/text-3d.mjs +165 -0
- package/esm2022/angular-three-soba.mjs +1 -1
- package/esm2022/cameras/angular-three-soba-cameras.mjs +1 -1
- package/esm2022/cameras/camera/camera-content.mjs +20 -0
- package/esm2022/cameras/camera/camera.mjs +77 -0
- package/esm2022/cameras/cube-camera/cube-camera.mjs +161 -0
- package/esm2022/cameras/index.mjs +5 -5
- package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +102 -0
- package/esm2022/cameras/perspective-camera/perspective-camera.mjs +46 -0
- package/esm2022/controls/angular-three-soba-controls.mjs +1 -1
- package/esm2022/controls/index.mjs +2 -2
- package/esm2022/controls/orbit-controls/orbit-controls.mjs +181 -0
- package/esm2022/index.mjs +1 -1
- package/esm2022/loaders/angular-three-soba-loaders.mjs +1 -1
- package/esm2022/loaders/gltf-loader/gltf-loader.mjs +30 -0
- package/esm2022/loaders/index.mjs +5 -6
- package/esm2022/loaders/loader/loader.mjs +138 -0
- package/esm2022/loaders/progress/progress.mjs +45 -0
- package/esm2022/loaders/texture-loader/texture-loader.mjs +28 -0
- package/esm2022/materials/angular-three-soba-materials.mjs +1 -1
- package/esm2022/materials/index.mjs +7 -6
- package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +82 -0
- package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +367 -0
- package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +171 -0
- package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +278 -0
- package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +68 -0
- package/esm2022/materials/point-material/point-material.mjs +46 -0
- package/esm2022/misc/angular-three-soba-misc.mjs +1 -1
- package/esm2022/misc/animations/animations.mjs +59 -0
- package/esm2022/misc/bake-shadows/bake-shadows.mjs +24 -0
- package/esm2022/misc/caustics/caustics.mjs +387 -0
- package/esm2022/misc/decal/decal.mjs +187 -0
- package/esm2022/misc/depth-buffer/depth-buffer.mjs +44 -0
- package/esm2022/misc/example/example.mjs +160 -0
- package/esm2022/misc/fbo/fbo.mjs +47 -0
- package/esm2022/misc/html/html-wrapper.mjs +478 -0
- package/esm2022/misc/html/html.mjs +304 -0
- package/esm2022/misc/index.mjs +14 -5
- package/esm2022/misc/sampler/sampler.mjs +142 -0
- package/esm2022/misc/shadow/shadow.mjs +111 -0
- package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
- package/esm2022/misc/trail/trail.mjs +209 -0
- package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
- package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
- package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
- package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
- package/esm2022/modifiers/index.mjs +2 -0
- package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
- package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
- package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
- package/esm2022/performances/index.mjs +6 -0
- package/esm2022/performances/points/points-input.mjs +64 -0
- package/esm2022/performances/points/points.mjs +329 -0
- package/esm2022/performances/points/position-point.mjs +54 -0
- package/esm2022/performances/segments/segment-object.mjs +9 -0
- package/esm2022/performances/segments/segments.mjs +182 -0
- package/esm2022/shaders/angular-three-soba-shaders.mjs +1 -1
- package/esm2022/shaders/blur-pass/blur-pass.mjs +61 -0
- package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
- package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
- package/esm2022/shaders/convolution-material/convolution-material.mjs +94 -0
- package/esm2022/shaders/discard-material/discard-material.mjs +3 -0
- package/esm2022/shaders/grid-material/grid-material.mjs +77 -0
- package/esm2022/shaders/index.mjs +18 -15
- package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +56 -0
- package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +223 -0
- package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +170 -0
- package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +268 -0
- package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +37 -0
- package/esm2022/shaders/shader-material/shader-material.mjs +34 -0
- package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +25 -0
- package/esm2022/shaders/sparkles-material/sparkles-material.mjs +33 -0
- package/esm2022/shaders/spot-light-material/spot-light-material.mjs +86 -0
- package/esm2022/shaders/star-field-material/star-field-material.mjs +33 -0
- package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
- package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +267 -0
- package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +108 -0
- package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +206 -0
- package/esm2022/staging/angular-three-soba-staging.mjs +1 -1
- package/esm2022/staging/backdrop/backdrop.mjs +77 -0
- package/esm2022/staging/bb-anchor/bb-anchor.mjs +70 -0
- package/esm2022/staging/bounds/bounds.mjs +308 -0
- package/esm2022/staging/camera-shake/camera-shake.mjs +123 -0
- package/esm2022/staging/center/center.mjs +163 -0
- package/esm2022/staging/cloud/cloud.mjs +158 -0
- package/esm2022/staging/contact-shadows/contact-shadows.mjs +246 -0
- package/esm2022/staging/environment/assets.mjs +13 -0
- package/esm2022/staging/environment/environment-cube.mjs +47 -0
- package/esm2022/staging/environment/environment-ground.mjs +41 -0
- package/esm2022/staging/environment/environment-input.mjs +119 -0
- package/esm2022/staging/environment/environment-map.mjs +53 -0
- package/esm2022/staging/environment/environment-portal.mjs +113 -0
- package/esm2022/staging/environment/environment.mjs +61 -0
- package/esm2022/staging/environment/utils.mjs +105 -0
- package/esm2022/staging/float/float.mjs +94 -0
- package/esm2022/staging/index.mjs +22 -18
- package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
- package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
- package/esm2022/staging/sky/sky.mjs +119 -0
- package/esm2022/staging/sparkles/sparkles.mjs +164 -0
- package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
- package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
- package/esm2022/staging/spot-light/spot-light-input.mjs +84 -0
- package/esm2022/staging/spot-light/spot-light.mjs +81 -0
- package/esm2022/staging/spot-light/volumetric-mesh.mjs +98 -0
- package/esm2022/staging/stage/stage.mjs +388 -0
- package/esm2022/staging/stars/stars.mjs +147 -0
- package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
- package/esm2022/staging/wireframe/wireframe.mjs +224 -0
- package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
- package/esm2022/utils/content/content.mjs +15 -0
- package/esm2022/utils/index.mjs +2 -0
- package/fesm2022/angular-three-soba-abstractions.mjs +668 -1882
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +279 -232
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +104 -69
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +177 -164
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +630 -482
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +2248 -122
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
- package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
- package/fesm2022/angular-three-soba-performances.mjs +697 -0
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
- package/fesm2022/angular-three-soba-shaders.mjs +554 -209
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +3231 -2852
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-utils.mjs +22 -0
- package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
- package/fesm2022/angular-three-soba.mjs.map +1 -1
- package/loaders/gltf-loader/gltf-loader.d.ts +10 -0
- package/loaders/index.d.ts +4 -5
- package/loaders/loader/loader.d.ts +33 -0
- package/loaders/progress/progress.d.ts +9 -0
- package/loaders/texture-loader/texture-loader.d.ts +7 -0
- package/materials/index.d.ts +6 -5
- package/materials/mesh-distort-material/mesh-distort-material.d.ts +40 -0
- package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +99 -0
- package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +62 -0
- package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +107 -0
- package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +29 -0
- package/materials/point-material/point-material.d.ts +24 -0
- package/metadata.json +1 -0
- package/misc/animations/animations.d.ts +15 -0
- package/misc/{lib/bake-shadows → bake-shadows}/bake-shadows.d.ts +2 -5
- package/misc/caustics/caustics.d.ts +87 -0
- package/misc/decal/decal.d.ts +49 -0
- package/misc/depth-buffer/depth-buffer.d.ts +9 -0
- package/misc/example/example.d.ts +81 -0
- package/misc/{lib/fbo → fbo}/fbo.d.ts +4 -2
- package/misc/html/html-wrapper.d.ts +559 -0
- package/misc/html/html.d.ts +214 -0
- package/misc/index.d.ts +13 -4
- package/misc/sampler/sampler.d.ts +67 -0
- package/misc/shadow/shadow.d.ts +37 -0
- package/misc/stats-gl/stats-gl.d.ts +24 -0
- package/misc/trail/trail.d.ts +57 -0
- package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
- package/misc/trail-texture/trail-texture.d.ts +50 -0
- package/modifiers/README.md +3 -0
- package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
- package/modifiers/index.d.ts +1 -0
- package/package.json +38 -27
- package/performances/README.md +3 -0
- package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
- package/{performance/lib/adaptive → performances/adaptive-events}/adaptive-events.d.ts +5 -6
- package/performances/index.d.ts +5 -0
- package/performances/points/points-input.d.ts +32 -0
- package/performances/points/points.d.ts +92 -0
- package/performances/points/position-point.d.ts +11 -0
- package/performances/segments/segment-object.d.ts +7 -0
- package/performances/segments/segments.d.ts +124 -0
- package/shaders/{lib/blur-pass → blur-pass}/blur-pass.d.ts +2 -2
- package/shaders/grid-material/grid-material.d.ts +37 -0
- package/shaders/index.d.ts +17 -14
- package/shaders/{lib/mesh-distort-material → mesh-distort-material}/mesh-distort-material.d.ts +147 -2
- package/shaders/{lib/mesh-transmission-material → mesh-transmission-material}/mesh-transmission-material.d.ts +1 -1
- package/shaders/{lib/mesh-wobble-material → mesh-wobble-material}/mesh-wobble-material.d.ts +1 -0
- package/shaders/{lib/shader-material → shader-material}/shader-material.d.ts +2 -2
- package/shaders/soft-shadow-material/soft-shadow-material.d.ts +19 -0
- package/shaders/sparkles-material/sparkles-material.d.ts +17 -0
- package/shaders/spot-light-material/spot-light-material.d.ts +13 -0
- package/shaders/star-field-material/star-field-material.d.ts +13 -0
- package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
- package/staging/accumulative-shadows/accumulative-shadows.d.ts +146 -0
- package/staging/{lib/accumulative-shadows → accumulative-shadows}/progressive-light-map.d.ts +2 -2
- package/staging/accumulative-shadows/randomized-lights.d.ts +90 -0
- package/staging/backdrop/backdrop.d.ts +30 -0
- package/staging/bb-anchor/bb-anchor.d.ts +27 -0
- package/staging/bounds/bounds.d.ts +134 -0
- package/staging/camera-shake/camera-shake.d.ts +43 -0
- package/staging/center/center.d.ts +70 -0
- package/staging/cloud/cloud.d.ts +51 -0
- package/staging/contact-shadows/contact-shadows.d.ts +70 -0
- package/staging/{lib/environment → environment}/assets.d.ts +9 -9
- package/staging/environment/environment-cube.d.ts +15 -0
- package/staging/environment/environment-ground.d.ts +13 -0
- package/staging/environment/environment-input.d.ts +68 -0
- package/staging/environment/environment-map.d.ts +16 -0
- package/staging/environment/environment-portal.d.ts +18 -0
- package/staging/{lib/environment → environment}/environment.d.ts +2 -6
- package/staging/environment/utils.d.ts +7 -0
- package/staging/float/float.d.ts +31 -0
- package/staging/index.d.ts +21 -17
- package/staging/matcap-texture/matcap-texture.d.ts +13 -0
- package/staging/normal-texture/normal-texture.d.ts +16 -0
- package/staging/sky/sky.d.ts +48 -0
- package/staging/sparkles/sparkles.d.ts +63 -0
- package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
- package/staging/spot-light/shadow-mesh.d.ts +37 -0
- package/staging/spot-light/spot-light-input.d.ts +38 -0
- package/staging/spot-light/spot-light.d.ts +39 -0
- package/staging/spot-light/volumetric-mesh.d.ts +24 -0
- package/staging/stage/stage.d.ts +130 -0
- package/staging/stars/stars.d.ts +45 -0
- package/staging/wireframe/wireframe-input.d.ts +65 -0
- package/staging/wireframe/wireframe.d.ts +28 -0
- package/utils/README.md +3 -0
- package/utils/content/content.d.ts +8 -0
- package/utils/index.d.ts +1 -0
- package/web-types.json +1 -0
- package/abstractions/lib/billboard/billboard.d.ts +0 -14
- package/abstractions/lib/catmull-rom-line/catmull-rom-line.d.ts +0 -15
- package/abstractions/lib/cubic-bezier-line/cubic-bezier-line.d.ts +0 -15
- package/abstractions/lib/edges/edges.d.ts +0 -18
- package/abstractions/lib/gizmo-helper/gizmo-helper.d.ts +0 -41
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -16
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -24
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -14
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -15
- package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -28
- package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -21
- package/abstractions/lib/line/line-input.d.ts +0 -19
- package/abstractions/lib/line/line.d.ts +0 -21
- package/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -19
- package/abstractions/lib/text/text.d.ts +0 -21
- package/abstractions/lib/text-3d/text-3d.d.ts +0 -39
- package/assets/default-spot-light-shadow.glsl +0 -10
- package/cameras/lib/camera/camera.d.ts +0 -19
- package/cameras/lib/cube-camera/cube-camera.d.ts +0 -27
- package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +0 -17
- package/controls/lib/orbit-controls/orbit-controls.d.ts +0 -27
- package/esm2022/abstractions/lib/billboard/billboard.mjs +0 -74
- package/esm2022/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +0 -120
- package/esm2022/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +0 -99
- package/esm2022/abstractions/lib/edges/edges.mjs +0 -96
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-helper.mjs +0 -213
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -92
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -184
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -46
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -134
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -195
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -267
- package/esm2022/abstractions/lib/line/line-input.mjs +0 -76
- package/esm2022/abstractions/lib/line/line.mjs +0 -133
- package/esm2022/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
- package/esm2022/abstractions/lib/text/text.mjs +0 -115
- package/esm2022/abstractions/lib/text-3d/text-3d.mjs +0 -145
- package/esm2022/cameras/lib/camera/camera-content.mjs +0 -21
- package/esm2022/cameras/lib/camera/camera.mjs +0 -75
- package/esm2022/cameras/lib/cube-camera/cube-camera.mjs +0 -131
- package/esm2022/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -93
- package/esm2022/cameras/lib/perspective-camera/perspective-camera.mjs +0 -47
- package/esm2022/controls/lib/orbit-controls/orbit-controls.mjs +0 -147
- package/esm2022/loaders/lib/cube-texture-loader/cube-texture-loader.mjs +0 -10
- package/esm2022/loaders/lib/gltf-loader/gltf-loader.mjs +0 -32
- package/esm2022/loaders/lib/loader/loader.mjs +0 -134
- package/esm2022/loaders/lib/progress/progress.mjs +0 -39
- package/esm2022/loaders/lib/texture-loader/texture-loader.mjs +0 -19
- package/esm2022/materials/lib/mesh-distort-material/mesh-distort-material.mjs +0 -75
- package/esm2022/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -328
- package/esm2022/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -158
- package/esm2022/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -238
- package/esm2022/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
- package/esm2022/misc/lib/animations/animations.mjs +0 -52
- package/esm2022/misc/lib/bake-shadows/bake-shadows.mjs +0 -26
- package/esm2022/misc/lib/depth-buffer/depth-buffer.mjs +0 -39
- package/esm2022/misc/lib/fbo/fbo.mjs +0 -39
- package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
- package/esm2022/performance/index.mjs +0 -5
- package/esm2022/performance/lib/adaptive/adaptive-dpr.mjs +0 -47
- package/esm2022/performance/lib/adaptive/adaptive-events.mjs +0 -37
- package/esm2022/performance/lib/detailed/detailed.mjs +0 -54
- package/esm2022/performance/lib/stats/stats.mjs +0 -80
- package/esm2022/shaders/lib/blur-pass/blur-pass.mjs +0 -61
- package/esm2022/shaders/lib/caustics-material/caustics-material.mjs +0 -128
- package/esm2022/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +0 -33
- package/esm2022/shaders/lib/convolution-material/convolution-material.mjs +0 -94
- package/esm2022/shaders/lib/discard-material/discard-material.mjs +0 -3
- package/esm2022/shaders/lib/mesh-distort-material/mesh-distort-material.mjs +0 -55
- package/esm2022/shaders/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
- package/esm2022/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -169
- package/esm2022/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
- package/esm2022/shaders/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
- package/esm2022/shaders/lib/shader-material/shader-material.mjs +0 -34
- package/esm2022/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +0 -33
- package/esm2022/shaders/lib/spot-light-material/spot-light-material.mjs +0 -86
- package/esm2022/shaders/lib/star-field-material/star-field-material.mjs +0 -32
- package/esm2022/staging/lib/accumulative-shadows/accumulative-shadows.mjs +0 -249
- package/esm2022/staging/lib/accumulative-shadows/progressive-light-map.mjs +0 -108
- package/esm2022/staging/lib/accumulative-shadows/randomized-lights.mjs +0 -201
- package/esm2022/staging/lib/bounds/bounds.mjs +0 -284
- package/esm2022/staging/lib/camera-shake/camera-shake.mjs +0 -122
- package/esm2022/staging/lib/caustics/caustics.mjs +0 -364
- package/esm2022/staging/lib/center/center.mjs +0 -143
- package/esm2022/staging/lib/cloud/cloud.mjs +0 -160
- package/esm2022/staging/lib/contact-shadows/contact-shadows.mjs +0 -228
- package/esm2022/staging/lib/environment/assets.mjs +0 -13
- package/esm2022/staging/lib/environment/environment-cube.mjs +0 -41
- package/esm2022/staging/lib/environment/environment-ground.mjs +0 -67
- package/esm2022/staging/lib/environment/environment-inputs.mjs +0 -87
- package/esm2022/staging/lib/environment/environment-map.mjs +0 -39
- package/esm2022/staging/lib/environment/environment-portal.mjs +0 -111
- package/esm2022/staging/lib/environment/environment.mjs +0 -165
- package/esm2022/staging/lib/environment/utils.mjs +0 -70
- package/esm2022/staging/lib/float/float.mjs +0 -77
- package/esm2022/staging/lib/sky/sky.mjs +0 -109
- package/esm2022/staging/lib/sparkles/sparkles.mjs +0 -210
- package/esm2022/staging/lib/spot-light/common.mjs +0 -42
- package/esm2022/staging/lib/spot-light/shadow-mesh-input.mjs +0 -51
- package/esm2022/staging/lib/spot-light/spot-light-input.mjs +0 -62
- package/esm2022/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +0 -74
- package/esm2022/staging/lib/spot-light/spot-light-shadow-shader.mjs +0 -126
- package/esm2022/staging/lib/spot-light/spot-light-shadow.mjs +0 -63
- package/esm2022/staging/lib/spot-light/spot-light.mjs +0 -117
- package/esm2022/staging/lib/spot-light/volumetric-mesh.mjs +0 -86
- package/esm2022/staging/lib/stage/stage.mjs +0 -368
- package/esm2022/staging/lib/stars/stars.mjs +0 -140
- package/fesm2022/angular-three-soba-performance.mjs +0 -210
- package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
- package/loaders/lib/cube-texture-loader/cube-texture-loader.d.ts +0 -3
- package/loaders/lib/gltf-loader/gltf-loader.d.ts +0 -8
- package/loaders/lib/loader/loader.d.ts +0 -26
- package/loaders/lib/progress/progress.d.ts +0 -16
- package/loaders/lib/texture-loader/texture-loader.d.ts +0 -5
- package/materials/lib/mesh-distort-material/mesh-distort-material.d.ts +0 -24
- package/materials/lib/mesh-reflector-material/mesh-reflector-material.d.ts +0 -41
- package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +0 -28
- package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +0 -46
- package/materials/lib/mesh-wobble-material/mesh-wobble-material.d.ts +0 -14
- package/misc/lib/animations/animations.d.ts +0 -13
- package/misc/lib/depth-buffer/depth-buffer.d.ts +0 -7
- package/performance/README.md +0 -3
- package/performance/index.d.ts +0 -4
- package/performance/lib/adaptive/adaptive-dpr.d.ts +0 -11
- package/performance/lib/detailed/detailed.d.ts +0 -13
- package/performance/lib/stats/stats.d.ts +0 -15
- package/plugin/README.md +0 -11
- package/plugin/generators.json +0 -19
- package/plugin/package.json +0 -9
- package/plugin/src/generators/init/compat.d.ts +0 -2
- package/plugin/src/generators/init/compat.js +0 -6
- package/plugin/src/generators/init/compat.js.map +0 -1
- package/plugin/src/generators/init/init.d.ts +0 -4
- package/plugin/src/generators/init/init.js +0 -22
- package/plugin/src/generators/init/init.js.map +0 -1
- package/plugin/src/generators/init/schema.json +0 -6
- package/plugin/src/index.d.ts +0 -1
- package/plugin/src/index.js +0 -6
- package/plugin/src/index.js.map +0 -1
- package/shaders/lib/soft-shadow-material/soft-shadow-material.d.ts +0 -10
- package/shaders/lib/spot-light-material/spot-light-material.d.ts +0 -4
- package/shaders/lib/star-field-material/star-field-material.d.ts +0 -3
- package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +0 -58
- package/staging/lib/accumulative-shadows/randomized-lights.d.ts +0 -42
- package/staging/lib/bounds/bounds.d.ts +0 -48
- package/staging/lib/camera-shake/camera-shake.d.ts +0 -28
- package/staging/lib/caustics/caustics.d.ts +0 -47
- package/staging/lib/center/center.d.ts +0 -40
- package/staging/lib/cloud/cloud.d.ts +0 -23
- package/staging/lib/contact-shadows/contact-shadows.d.ts +0 -29
- package/staging/lib/environment/environment-cube.d.ts +0 -11
- package/staging/lib/environment/environment-ground.d.ts +0 -9
- package/staging/lib/environment/environment-inputs.d.ts +0 -28
- package/staging/lib/environment/environment-map.d.ts +0 -10
- package/staging/lib/environment/environment-portal.d.ts +0 -15
- package/staging/lib/environment/utils.d.ts +0 -8
- package/staging/lib/float/float.d.ts +0 -16
- package/staging/lib/sky/sky.d.ts +0 -20
- package/staging/lib/sparkles/sparkles.d.ts +0 -29
- package/staging/lib/spot-light/common.d.ts +0 -3
- package/staging/lib/spot-light/shadow-mesh-input.d.ts +0 -14
- package/staging/lib/spot-light/spot-light-input.d.ts +0 -16
- package/staging/lib/spot-light/spot-light-shadow-no-shader.d.ts +0 -14
- package/staging/lib/spot-light/spot-light-shadow-shader.d.ts +0 -25
- package/staging/lib/spot-light/spot-light-shadow.d.ts +0 -6
- package/staging/lib/spot-light/spot-light.d.ts +0 -17
- package/staging/lib/spot-light/volumetric-mesh.d.ts +0 -15
- package/staging/lib/stage/stage.d.ts +0 -87
- package/staging/lib/stars/stars.d.ts +0 -20
- /package/shaders/{lib/caustics-material → caustics}/caustics-material.d.ts +0 -0
- /package/shaders/{lib/caustics-projection-material → caustics}/caustics-projection-material.d.ts +0 -0
- /package/shaders/{lib/convolution-material → convolution-material}/convolution-material.d.ts +0 -0
- /package/shaders/{lib/discard-material → discard-material}/discard-material.d.ts +0 -0
- /package/shaders/{lib/mesh-reflector-material → mesh-reflector-material}/mesh-reflector-material.d.ts +0 -0
- /package/shaders/{lib/mesh-refraction-material → mesh-refraction-material}/mesh-refraction-material.d.ts +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { Component, computed, CUSTOM_ELEMENTS_SCHEMA, effect, forwardRef, Input, untracked, } from '@angular/core';
|
|
2
|
+
import { createInjectionToken, extend, getLocalState, injectBeforeRender, injectNgtRef, injectNgtStore, signalStore, } from 'angular-three';
|
|
3
|
+
import { SoftShadowMaterial } from 'angular-three-soba/shaders';
|
|
4
|
+
import { Group, Mesh, PlaneGeometry } from 'three';
|
|
5
|
+
import { ProgressiveLightMap } from './progressive-light-map';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
extend({ Group, SoftShadowMaterial, Mesh, PlaneGeometry });
|
|
8
|
+
export const [injectNgtsAccumulativeShadowsApi, provideNgtsAccumulativeShadowsApi] = createInjectionToken((shadows) => shadows.api, { isRoot: false, deps: [forwardRef(() => NgtsAccumulativeShadows)] });
|
|
9
|
+
export class NgtsAccumulativeShadows {
|
|
10
|
+
/** How many frames it can render, more yields cleaner results but takes more time, 40 */
|
|
11
|
+
set _frames(frames) {
|
|
12
|
+
this.inputs.set({ frames });
|
|
13
|
+
}
|
|
14
|
+
/** If frames === Infinity blend controls the refresh ratio, 100 */
|
|
15
|
+
set _blend(blend) {
|
|
16
|
+
this.inputs.set({ blend });
|
|
17
|
+
}
|
|
18
|
+
/** Can limit the amount of frames rendered if frames === Infinity, usually to get some performance back once a movable scene has settled, Infinity */
|
|
19
|
+
set _limit(limit) {
|
|
20
|
+
this.inputs.set({ limit });
|
|
21
|
+
}
|
|
22
|
+
/** Scale of the plane, */
|
|
23
|
+
set _scale(scale) {
|
|
24
|
+
this.inputs.set({ scale });
|
|
25
|
+
}
|
|
26
|
+
/** Temporal accumulates shadows over time which is more performant but has a visual regression over instant results, false */
|
|
27
|
+
set _temporal(temporal) {
|
|
28
|
+
this.inputs.set({ temporal });
|
|
29
|
+
}
|
|
30
|
+
/** Opacity of the plane, 1 */
|
|
31
|
+
set _opacity(opacity) {
|
|
32
|
+
this.inputs.set({ opacity });
|
|
33
|
+
}
|
|
34
|
+
/** Discards alpha pixels, 0.65 */
|
|
35
|
+
set _alphaTest(alphaTest) {
|
|
36
|
+
this.inputs.set({ alphaTest });
|
|
37
|
+
}
|
|
38
|
+
/** Shadow color, black */
|
|
39
|
+
set _color(color) {
|
|
40
|
+
this.inputs.set({ color });
|
|
41
|
+
}
|
|
42
|
+
/** Colorblend, how much colors turn to black, 0 is black, 2 */
|
|
43
|
+
set _colorBlend(colorBlend) {
|
|
44
|
+
this.inputs.set({ colorBlend });
|
|
45
|
+
}
|
|
46
|
+
/** Buffer resolution, 1024 */
|
|
47
|
+
set _resolution(resolution) {
|
|
48
|
+
this.inputs.set({ resolution });
|
|
49
|
+
}
|
|
50
|
+
/** Texture tonemapping */
|
|
51
|
+
set _toneMapped(toneMapped) {
|
|
52
|
+
this.inputs.set({ toneMapped });
|
|
53
|
+
}
|
|
54
|
+
constructor() {
|
|
55
|
+
this.inputs = signalStore({
|
|
56
|
+
frames: 40,
|
|
57
|
+
limit: Infinity,
|
|
58
|
+
blend: 20,
|
|
59
|
+
scale: 10,
|
|
60
|
+
opacity: 1,
|
|
61
|
+
alphaTest: 0.75,
|
|
62
|
+
color: 'black',
|
|
63
|
+
colorBlend: 2,
|
|
64
|
+
resolution: 1024,
|
|
65
|
+
toneMapped: true,
|
|
66
|
+
temporal: false,
|
|
67
|
+
});
|
|
68
|
+
this.nullTraverse = () => null;
|
|
69
|
+
this.Math = Math;
|
|
70
|
+
this.accumulativeShadowsRef = injectNgtRef();
|
|
71
|
+
this.meshRef = injectNgtRef();
|
|
72
|
+
this.store = injectNgtStore();
|
|
73
|
+
this.gl = this.store.select('gl');
|
|
74
|
+
this.scene = this.store.select('scene');
|
|
75
|
+
this.camera = this.store.select('camera');
|
|
76
|
+
this.invalidate = this.store.select('invalidate');
|
|
77
|
+
this.resolution = this.inputs.select('resolution');
|
|
78
|
+
this.alphaTest = this.inputs.select('alphaTest');
|
|
79
|
+
this.opacity = this.inputs.select('opacity');
|
|
80
|
+
this.temporal = this.inputs.select('temporal');
|
|
81
|
+
this.blend = this.inputs.select('blend');
|
|
82
|
+
this.frames = this.inputs.select('frames');
|
|
83
|
+
this.pLM = computed(() => new ProgressiveLightMap(untracked(this.gl), untracked(this.scene), this.resolution()));
|
|
84
|
+
this.scale = this.inputs.select('scale');
|
|
85
|
+
this.toneMapped = this.inputs.select('toneMapped');
|
|
86
|
+
this.color = this.inputs.select('color');
|
|
87
|
+
this.colorBlend = this.inputs.select('colorBlend');
|
|
88
|
+
this.map = computed(() => this.pLM().progressiveLightMap2.texture);
|
|
89
|
+
this.api = computed(() => {
|
|
90
|
+
const [pLM, alphaTest, opacity, camera, temporal, blend, frames] = [
|
|
91
|
+
this.pLM(),
|
|
92
|
+
this.alphaTest(),
|
|
93
|
+
this.opacity(),
|
|
94
|
+
this.camera(),
|
|
95
|
+
this.temporal(),
|
|
96
|
+
this.blend(),
|
|
97
|
+
this.frames(),
|
|
98
|
+
];
|
|
99
|
+
const api = {
|
|
100
|
+
lights: new Map(),
|
|
101
|
+
temporal,
|
|
102
|
+
frames: Math.max(2, frames),
|
|
103
|
+
blend: Math.max(2, frames === Infinity ? blend : frames),
|
|
104
|
+
count: 0,
|
|
105
|
+
getMesh: () => this.meshRef.nativeElement,
|
|
106
|
+
reset: () => {
|
|
107
|
+
if (!this.meshRef.nativeElement)
|
|
108
|
+
return;
|
|
109
|
+
// Clear buffers, reset opacities, set frame count to 0
|
|
110
|
+
pLM.clear();
|
|
111
|
+
const material = this.meshRef.nativeElement.material;
|
|
112
|
+
material.opacity = 0;
|
|
113
|
+
material.alphaTest = 0;
|
|
114
|
+
api.count = 0;
|
|
115
|
+
},
|
|
116
|
+
update: (frames = 1) => {
|
|
117
|
+
if (!this.meshRef.nativeElement)
|
|
118
|
+
return;
|
|
119
|
+
// Adapt the opacity-blend ratio to the number of frames
|
|
120
|
+
const material = this.meshRef.nativeElement.material;
|
|
121
|
+
if (!api.temporal) {
|
|
122
|
+
material.opacity = opacity;
|
|
123
|
+
material.alphaTest = alphaTest;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
material.opacity = Math.min(opacity, material.opacity + opacity / api.blend);
|
|
127
|
+
material.alphaTest = Math.min(alphaTest, material.alphaTest + alphaTest / api.blend);
|
|
128
|
+
}
|
|
129
|
+
// Switch accumulative lights on
|
|
130
|
+
this.accumulativeShadowsRef.nativeElement.visible = true;
|
|
131
|
+
// Collect scene lights and meshes
|
|
132
|
+
pLM.prepare();
|
|
133
|
+
// Update the lightmap and the accumulative lights
|
|
134
|
+
for (let i = 0; i < frames; i++) {
|
|
135
|
+
api.lights.forEach((light) => light().update());
|
|
136
|
+
pLM.update(camera, api.blend);
|
|
137
|
+
}
|
|
138
|
+
// Switch lights off
|
|
139
|
+
this.accumulativeShadowsRef.nativeElement.visible = false;
|
|
140
|
+
// Restore lights and meshes
|
|
141
|
+
pLM.finish();
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
return api;
|
|
145
|
+
});
|
|
146
|
+
this.configure();
|
|
147
|
+
this.resetAndUpdate();
|
|
148
|
+
this.beforeRender();
|
|
149
|
+
}
|
|
150
|
+
configure() {
|
|
151
|
+
effect(() => {
|
|
152
|
+
const [pLM, mesh] = [this.pLM(), this.meshRef.nativeElement];
|
|
153
|
+
if (!mesh)
|
|
154
|
+
return;
|
|
155
|
+
pLM.configure(mesh);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
resetAndUpdate() {
|
|
159
|
+
effect(() => {
|
|
160
|
+
const [, , mesh] = [
|
|
161
|
+
this.inputs.state(),
|
|
162
|
+
getLocalState(untracked(this.scene)).objects(),
|
|
163
|
+
this.meshRef.nativeElement,
|
|
164
|
+
];
|
|
165
|
+
if (!mesh)
|
|
166
|
+
return;
|
|
167
|
+
const api = untracked(this.api);
|
|
168
|
+
// Reset internals, buffers, ...
|
|
169
|
+
api.reset();
|
|
170
|
+
// Update lightmap
|
|
171
|
+
if (!api.temporal && api.frames !== Infinity)
|
|
172
|
+
api.update(api.blend);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
beforeRender() {
|
|
176
|
+
injectBeforeRender(() => {
|
|
177
|
+
const [api, limit] = [this.api(), this.inputs.get('limit')];
|
|
178
|
+
if ((api.temporal || api.frames === Infinity) && api.count < api.frames && api.count < limit) {
|
|
179
|
+
this.invalidate();
|
|
180
|
+
api.update();
|
|
181
|
+
api.count++;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsAccumulativeShadows, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
186
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtsAccumulativeShadows, isStandalone: true, selector: "ngts-accumulative-shadows", inputs: { accumulativeShadowsRef: "accumulativeShadowsRef", _frames: ["frames", "_frames"], _blend: ["blend", "_blend"], _limit: ["limit", "_limit"], _scale: ["scale", "_scale"], _temporal: ["temporal", "_temporal"], _opacity: ["opacity", "_opacity"], _alphaTest: ["alphaTest", "_alphaTest"], _color: ["color", "_color"], _colorBlend: ["colorBlend", "_colorBlend"], _resolution: ["resolution", "_resolution"], _toneMapped: ["toneMapped", "_toneMapped"] }, providers: [provideNgtsAccumulativeShadowsApi()], ngImport: i0, template: `
|
|
187
|
+
<ngt-group ngtCompound>
|
|
188
|
+
<ngt-group [traverse]="nullTraverse" [ref]="accumulativeShadowsRef">
|
|
189
|
+
<ng-content />
|
|
190
|
+
</ngt-group>
|
|
191
|
+
<ngt-mesh [receiveShadow]="true" [ref]="meshRef" [scale]="scale()" [rotation]="[-Math.PI / 2, 0, 0]">
|
|
192
|
+
<ngt-plane-geometry />
|
|
193
|
+
<ngt-soft-shadow-material
|
|
194
|
+
[transparent]="true"
|
|
195
|
+
[depthWrite]="false"
|
|
196
|
+
[toneMapped]="toneMapped()"
|
|
197
|
+
[color]="color()"
|
|
198
|
+
[blend]="colorBlend()"
|
|
199
|
+
[map]="map()"
|
|
200
|
+
/>
|
|
201
|
+
</ngt-mesh>
|
|
202
|
+
</ngt-group>
|
|
203
|
+
`, isInline: true }); }
|
|
204
|
+
}
|
|
205
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsAccumulativeShadows, decorators: [{
|
|
206
|
+
type: Component,
|
|
207
|
+
args: [{
|
|
208
|
+
selector: 'ngts-accumulative-shadows',
|
|
209
|
+
standalone: true,
|
|
210
|
+
template: `
|
|
211
|
+
<ngt-group ngtCompound>
|
|
212
|
+
<ngt-group [traverse]="nullTraverse" [ref]="accumulativeShadowsRef">
|
|
213
|
+
<ng-content />
|
|
214
|
+
</ngt-group>
|
|
215
|
+
<ngt-mesh [receiveShadow]="true" [ref]="meshRef" [scale]="scale()" [rotation]="[-Math.PI / 2, 0, 0]">
|
|
216
|
+
<ngt-plane-geometry />
|
|
217
|
+
<ngt-soft-shadow-material
|
|
218
|
+
[transparent]="true"
|
|
219
|
+
[depthWrite]="false"
|
|
220
|
+
[toneMapped]="toneMapped()"
|
|
221
|
+
[color]="color()"
|
|
222
|
+
[blend]="colorBlend()"
|
|
223
|
+
[map]="map()"
|
|
224
|
+
/>
|
|
225
|
+
</ngt-mesh>
|
|
226
|
+
</ngt-group>
|
|
227
|
+
`,
|
|
228
|
+
providers: [provideNgtsAccumulativeShadowsApi()],
|
|
229
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
230
|
+
}]
|
|
231
|
+
}], ctorParameters: function () { return []; }, propDecorators: { accumulativeShadowsRef: [{
|
|
232
|
+
type: Input
|
|
233
|
+
}], _frames: [{
|
|
234
|
+
type: Input,
|
|
235
|
+
args: [{ alias: 'frames' }]
|
|
236
|
+
}], _blend: [{
|
|
237
|
+
type: Input,
|
|
238
|
+
args: [{ alias: 'blend' }]
|
|
239
|
+
}], _limit: [{
|
|
240
|
+
type: Input,
|
|
241
|
+
args: [{ alias: 'limit' }]
|
|
242
|
+
}], _scale: [{
|
|
243
|
+
type: Input,
|
|
244
|
+
args: [{ alias: 'scale' }]
|
|
245
|
+
}], _temporal: [{
|
|
246
|
+
type: Input,
|
|
247
|
+
args: [{ alias: 'temporal' }]
|
|
248
|
+
}], _opacity: [{
|
|
249
|
+
type: Input,
|
|
250
|
+
args: [{ alias: 'opacity' }]
|
|
251
|
+
}], _alphaTest: [{
|
|
252
|
+
type: Input,
|
|
253
|
+
args: [{ alias: 'alphaTest' }]
|
|
254
|
+
}], _color: [{
|
|
255
|
+
type: Input,
|
|
256
|
+
args: [{ alias: 'color' }]
|
|
257
|
+
}], _colorBlend: [{
|
|
258
|
+
type: Input,
|
|
259
|
+
args: [{ alias: 'colorBlend' }]
|
|
260
|
+
}], _resolution: [{
|
|
261
|
+
type: Input,
|
|
262
|
+
args: [{ alias: 'resolution' }]
|
|
263
|
+
}], _toneMapped: [{
|
|
264
|
+
type: Input,
|
|
265
|
+
args: [{ alias: 'toneMapped' }]
|
|
266
|
+
}] } });
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjdW11bGF0aXZlLXNoYWRvd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc3RhZ2luZy9zcmMvYWNjdW11bGF0aXZlLXNoYWRvd3MvYWNjdW11bGF0aXZlLXNoYWRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLE1BQU0sRUFDTixVQUFVLEVBQ1YsS0FBSyxFQUVMLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ04sb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixjQUFjLEVBQ2QsV0FBVyxHQUVYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBbUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBRTlELE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztBQXNDM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsRUFBRSxpQ0FBaUMsQ0FBQyxHQUFHLG9CQUFvQixDQUN4RyxDQUFDLE9BQWdDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQ2pELEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQ3BFLENBQUM7QUEwQkYsTUFBTSxPQUFPLHVCQUF1QjtJQW9CbkMseUZBQXlGO0lBQ3pGLElBQWdDLE9BQU8sQ0FBQyxNQUFjO1FB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QXNCLENBQUM7aUJBQ2pDOzBFQW1CUyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBRzBCLE9BQU87c0JBQXRDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO2dCQUtLLE1BQU07c0JBQXBDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO2dCQUtNLE1BQU07c0JBQXBDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO2dCQUtNLE1BQU07c0JBQXBDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO2dCQUtTLFNBQVM7c0JBQTFDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO2dCQUtLLFFBQVE7c0JBQXhDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUtRLFVBQVU7c0JBQTVDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO2dCQUtFLE1BQU07c0JBQXBDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO2dCQUtXLFdBQVc7c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO2dCQUtNLFdBQVc7c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO2dCQUtNLFdBQVc7c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0ZWZmZWN0LFxuXHRmb3J3YXJkUmVmLFxuXHRJbnB1dCxcblx0U2lnbmFsLFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Y3JlYXRlSW5qZWN0aW9uVG9rZW4sXG5cdGV4dGVuZCxcblx0Z2V0TG9jYWxTdGF0ZSxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3ROZ3RSZWYsXG5cdGluamVjdE5ndFN0b3JlLFxuXHRzaWduYWxTdG9yZSxcblx0dHlwZSBOZ3RHcm91cCxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBTb2Z0U2hhZG93TWF0ZXJpYWwsIHR5cGUgTmd0U29mdFNoYWRvd01hdGVyaWFsU3RhdGUgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvc2hhZGVycyc7XG5pbXBvcnQgeyBHcm91cCwgTWVzaCwgUGxhbmVHZW9tZXRyeSB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IFByb2dyZXNzaXZlTGlnaHRNYXAgfSBmcm9tICcuL3Byb2dyZXNzaXZlLWxpZ2h0LW1hcCc7XG5cbmV4dGVuZCh7IEdyb3VwLCBTb2Z0U2hhZG93TWF0ZXJpYWwsIE1lc2gsIFBsYW5lR2VvbWV0cnkgfSk7XG5cbmV4cG9ydCB0eXBlIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzU3RhdGUgPSB7XG5cdC8qKiBIb3cgbWFueSBmcmFtZXMgaXQgY2FuIHJlbmRlciwgbW9yZSB5aWVsZHMgY2xlYW5lciByZXN1bHRzIGJ1dCB0YWtlcyBtb3JlIHRpbWUsIDQwICovXG5cdGZyYW1lczogbnVtYmVyO1xuXHQvKiogSWYgZnJhbWVzID09PSBJbmZpbml0eSBibGVuZCBjb250cm9scyB0aGUgcmVmcmVzaCByYXRpbywgMTAwICovXG5cdGJsZW5kOiBudW1iZXI7XG5cdC8qKiBDYW4gbGltaXQgdGhlIGFtb3VudCBvZiBmcmFtZXMgcmVuZGVyZWQgaWYgZnJhbWVzID09PSBJbmZpbml0eSwgdXN1YWxseSB0byBnZXQgc29tZSBwZXJmb3JtYW5jZSBiYWNrIG9uY2UgYSBtb3ZhYmxlIHNjZW5lIGhhcyBzZXR0bGVkLCBJbmZpbml0eSAqL1xuXHRsaW1pdDogbnVtYmVyO1xuXHQvKiogU2NhbGUgb2YgdGhlIHBsYW5lLCAgKi9cblx0c2NhbGU6IG51bWJlcjtcblx0LyoqIFRlbXBvcmFsIGFjY3VtdWxhdGVzIHNoYWRvd3Mgb3ZlciB0aW1lIHdoaWNoIGlzIG1vcmUgcGVyZm9ybWFudCBidXQgaGFzIGEgdmlzdWFsIHJlZ3Jlc3Npb24gb3ZlciBpbnN0YW50IHJlc3VsdHMsIGZhbHNlICAqL1xuXHR0ZW1wb3JhbDogYm9vbGVhbjtcblx0LyoqIE9wYWNpdHkgb2YgdGhlIHBsYW5lLCAxICovXG5cdG9wYWNpdHk6IG51bWJlcjtcblx0LyoqIERpc2NhcmRzIGFscGhhIHBpeGVscywgMC42NSAqL1xuXHRhbHBoYVRlc3Q6IG51bWJlcjtcblx0LyoqIFNoYWRvdyBjb2xvciwgYmxhY2sgKi9cblx0Y29sb3I6IHN0cmluZztcblx0LyoqIENvbG9yYmxlbmQsIGhvdyBtdWNoIGNvbG9ycyB0dXJuIHRvIGJsYWNrLCAwIGlzIGJsYWNrLCAyICovXG5cdGNvbG9yQmxlbmQ6IG51bWJlcjtcblx0LyoqIEJ1ZmZlciByZXNvbHV0aW9uLCAxMDI0ICovXG5cdHJlc29sdXRpb246IG51bWJlcjtcblx0LyoqIFRleHR1cmUgdG9uZW1hcHBpbmcgKi9cblx0dG9uZU1hcHBlZDogYm9vbGVhbjtcbn07XG5cbmRlY2xhcmUgZ2xvYmFsIHtcblx0aW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG5cdFx0LyoqXG5cdFx0ICogQGV4dGVuZHMgbmd0LWdyb3VwXG5cdFx0ICovXG5cdFx0J25ndHMtYWNjdW11bGF0aXZlLXNoYWRvd3MnOiBOZ3RzQWNjdW11bGF0aXZlU2hhZG93c1N0YXRlICYgTmd0R3JvdXA7XG5cdH1cbn1cblxuZXhwb3J0IHR5cGUgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaSA9IHsgdXBkYXRlOiAoKSA9PiB2b2lkIH07XG5cbmV4cG9ydCBjb25zdCBbaW5qZWN0Tmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NBcGksIHByb3ZpZGVOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0FwaV0gPSBjcmVhdGVJbmplY3Rpb25Ub2tlbihcblx0KHNoYWRvd3M6IE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzKSA9PiBzaGFkb3dzLmFwaSxcblx0eyBpc1Jvb3Q6IGZhbHNlLCBkZXBzOiBbZm9yd2FyZFJlZigoKSA9PiBOZ3RzQWNjdW11bGF0aXZlU2hhZG93cyldIH0sXG4pO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWFjY3VtdWxhdGl2ZS1zaGFkb3dzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwIG5ndENvbXBvdW5kPlxuXHRcdFx0PG5ndC1ncm91cCBbdHJhdmVyc2VdPVwibnVsbFRyYXZlcnNlXCIgW3JlZl09XCJhY2N1bXVsYXRpdmVTaGFkb3dzUmVmXCI+XG5cdFx0XHRcdDxuZy1jb250ZW50IC8+XG5cdFx0XHQ8L25ndC1ncm91cD5cblx0XHRcdDxuZ3QtbWVzaCBbcmVjZWl2ZVNoYWRvd109XCJ0cnVlXCIgW3JlZl09XCJtZXNoUmVmXCIgW3NjYWxlXT1cInNjYWxlKClcIiBbcm90YXRpb25dPVwiWy1NYXRoLlBJIC8gMiwgMCwgMF1cIj5cblx0XHRcdFx0PG5ndC1wbGFuZS1nZW9tZXRyeSAvPlxuXHRcdFx0XHQ8bmd0LXNvZnQtc2hhZG93LW1hdGVyaWFsXG5cdFx0XHRcdFx0W3RyYW5zcGFyZW50XT1cInRydWVcIlxuXHRcdFx0XHRcdFtkZXB0aFdyaXRlXT1cImZhbHNlXCJcblx0XHRcdFx0XHRbdG9uZU1hcHBlZF09XCJ0b25lTWFwcGVkKClcIlxuXHRcdFx0XHRcdFtjb2xvcl09XCJjb2xvcigpXCJcblx0XHRcdFx0XHRbYmxlbmRdPVwiY29sb3JCbGVuZCgpXCJcblx0XHRcdFx0XHRbbWFwXT1cIm1hcCgpXCJcblx0XHRcdFx0Lz5cblx0XHRcdDwvbmd0LW1lc2g+XG5cdFx0PC9uZ3QtZ3JvdXA+XG5cdGAsXG5cdHByb3ZpZGVyczogW3Byb3ZpZGVOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0FwaSgpXSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQWNjdW11bGF0aXZlU2hhZG93cyB7XG5cdHByaXZhdGUgaW5wdXRzID0gc2lnbmFsU3RvcmU8Tmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NTdGF0ZT4oe1xuXHRcdGZyYW1lczogNDAsXG5cdFx0bGltaXQ6IEluZmluaXR5LFxuXHRcdGJsZW5kOiAyMCxcblx0XHRzY2FsZTogMTAsXG5cdFx0b3BhY2l0eTogMSxcblx0XHRhbHBoYVRlc3Q6IDAuNzUsXG5cdFx0Y29sb3I6ICdibGFjaycsXG5cdFx0Y29sb3JCbGVuZDogMixcblx0XHRyZXNvbHV0aW9uOiAxMDI0LFxuXHRcdHRvbmVNYXBwZWQ6IHRydWUsXG5cdFx0dGVtcG9yYWw6IGZhbHNlLFxuXHR9KTtcblxuXHRudWxsVHJhdmVyc2UgPSAoKSA9PiBudWxsO1xuXHRNYXRoID0gTWF0aDtcblxuXHRASW5wdXQoKSBhY2N1bXVsYXRpdmVTaGFkb3dzUmVmID0gaW5qZWN0Tmd0UmVmPFRIUkVFLkdyb3VwPigpO1xuXG5cdC8qKiBIb3cgbWFueSBmcmFtZXMgaXQgY2FuIHJlbmRlciwgbW9yZSB5aWVsZHMgY2xlYW5lciByZXN1bHRzIGJ1dCB0YWtlcyBtb3JlIHRpbWUsIDQwICovXG5cdEBJbnB1dCh7IGFsaWFzOiAnZnJhbWVzJyB9KSBzZXQgX2ZyYW1lcyhmcmFtZXM6IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IGZyYW1lcyB9KTtcblx0fVxuXG5cdC8qKiBJZiBmcmFtZXMgPT09IEluZmluaXR5IGJsZW5kIGNvbnRyb2xzIHRoZSByZWZyZXNoIHJhdGlvLCAxMDAgKi9cblx0QElucHV0KHsgYWxpYXM6ICdibGVuZCcgfSkgc2V0IF9ibGVuZChibGVuZDogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgYmxlbmQgfSk7XG5cdH1cblxuXHQvKiogQ2FuIGxpbWl0IHRoZSBhbW91bnQgb2YgZnJhbWVzIHJlbmRlcmVkIGlmIGZyYW1lcyA9PT0gSW5maW5pdHksIHVzdWFsbHkgdG8gZ2V0IHNvbWUgcGVyZm9ybWFuY2UgYmFjayBvbmNlIGEgbW92YWJsZSBzY2VuZSBoYXMgc2V0dGxlZCwgSW5maW5pdHkgKi9cblx0QElucHV0KHsgYWxpYXM6ICdsaW1pdCcgfSkgc2V0IF9saW1pdChsaW1pdDogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgbGltaXQgfSk7XG5cdH1cblxuXHQvKiogU2NhbGUgb2YgdGhlIHBsYW5lLCAgKi9cblx0QElucHV0KHsgYWxpYXM6ICdzY2FsZScgfSkgc2V0IF9zY2FsZShzY2FsZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgc2NhbGUgfSk7XG5cdH1cblxuXHQvKiogVGVtcG9yYWwgYWNjdW11bGF0ZXMgc2hhZG93cyBvdmVyIHRpbWUgd2hpY2ggaXMgbW9yZSBwZXJmb3JtYW50IGJ1dCBoYXMgYSB2aXN1YWwgcmVncmVzc2lvbiBvdmVyIGluc3RhbnQgcmVzdWx0cywgZmFsc2UgICovXG5cdEBJbnB1dCh7IGFsaWFzOiAndGVtcG9yYWwnIH0pIHNldCBfdGVtcG9yYWwodGVtcG9yYWw6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyB0ZW1wb3JhbCB9KTtcblx0fVxuXG5cdC8qKiBPcGFjaXR5IG9mIHRoZSBwbGFuZSwgMSAqL1xuXHRASW5wdXQoeyBhbGlhczogJ29wYWNpdHknIH0pIHNldCBfb3BhY2l0eShvcGFjaXR5OiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBvcGFjaXR5IH0pO1xuXHR9XG5cblx0LyoqIERpc2NhcmRzIGFscGhhIHBpeGVscywgMC42NSAqL1xuXHRASW5wdXQoeyBhbGlhczogJ2FscGhhVGVzdCcgfSkgc2V0IF9hbHBoYVRlc3QoYWxwaGFUZXN0OiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBhbHBoYVRlc3QgfSk7XG5cdH1cblxuXHQvKiogU2hhZG93IGNvbG9yLCBibGFjayAqL1xuXHRASW5wdXQoeyBhbGlhczogJ2NvbG9yJyB9KSBzZXQgX2NvbG9yKGNvbG9yOiBzdHJpbmcpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBjb2xvciB9KTtcblx0fVxuXG5cdC8qKiBDb2xvcmJsZW5kLCBob3cgbXVjaCBjb2xvcnMgdHVybiB0byBibGFjaywgMCBpcyBibGFjaywgMiAqL1xuXHRASW5wdXQoeyBhbGlhczogJ2NvbG9yQmxlbmQnIH0pIHNldCBfY29sb3JCbGVuZChjb2xvckJsZW5kOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBjb2xvckJsZW5kIH0pO1xuXHR9XG5cblx0LyoqIEJ1ZmZlciByZXNvbHV0aW9uLCAxMDI0ICovXG5cdEBJbnB1dCh7IGFsaWFzOiAncmVzb2x1dGlvbicgfSkgc2V0IF9yZXNvbHV0aW9uKHJlc29sdXRpb246IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHJlc29sdXRpb24gfSk7XG5cdH1cblxuXHQvKiogVGV4dHVyZSB0b25lbWFwcGluZyAqL1xuXHRASW5wdXQoeyBhbGlhczogJ3RvbmVNYXBwZWQnIH0pIHNldCBfdG9uZU1hcHBlZCh0b25lTWFwcGVkOiBib29sZWFuKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgdG9uZU1hcHBlZCB9KTtcblx0fVxuXG5cdG1lc2hSZWYgPSBpbmplY3ROZ3RSZWY8VEhSRUUuTWVzaDxUSFJFRS5QbGFuZUdlb21ldHJ5LCBOZ3RTb2Z0U2hhZG93TWF0ZXJpYWxTdGF0ZSAmIFRIUkVFLlNoYWRlck1hdGVyaWFsPj4oKTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0Tmd0U3RvcmUoKTtcblx0cHJpdmF0ZSBnbCA9IHRoaXMuc3RvcmUuc2VsZWN0KCdnbCcpO1xuXHRwcml2YXRlIHNjZW5lID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NjZW5lJyk7XG5cdHByaXZhdGUgY2FtZXJhID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2NhbWVyYScpO1xuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXG5cdHByaXZhdGUgcmVzb2x1dGlvbiA9IHRoaXMuaW5wdXRzLnNlbGVjdCgncmVzb2x1dGlvbicpO1xuXHRwcml2YXRlIGFscGhhVGVzdCA9IHRoaXMuaW5wdXRzLnNlbGVjdCgnYWxwaGFUZXN0Jyk7XG5cdHByaXZhdGUgb3BhY2l0eSA9IHRoaXMuaW5wdXRzLnNlbGVjdCgnb3BhY2l0eScpO1xuXHRwcml2YXRlIHRlbXBvcmFsID0gdGhpcy5pbnB1dHMuc2VsZWN0KCd0ZW1wb3JhbCcpO1xuXHRwcml2YXRlIGJsZW5kID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdibGVuZCcpO1xuXHRwcml2YXRlIGZyYW1lcyA9IHRoaXMuaW5wdXRzLnNlbGVjdCgnZnJhbWVzJyk7XG5cblx0cExNID0gY29tcHV0ZWQoKCkgPT4gbmV3IFByb2dyZXNzaXZlTGlnaHRNYXAodW50cmFja2VkKHRoaXMuZ2wpLCB1bnRyYWNrZWQodGhpcy5zY2VuZSksIHRoaXMucmVzb2x1dGlvbigpKSk7XG5cblx0c2NhbGUgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ3NjYWxlJyk7XG5cdHRvbmVNYXBwZWQgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ3RvbmVNYXBwZWQnKTtcblx0Y29sb3IgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ2NvbG9yJyk7XG5cdGNvbG9yQmxlbmQgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ2NvbG9yQmxlbmQnKTtcblx0bWFwID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wTE0oKS5wcm9ncmVzc2l2ZUxpZ2h0TWFwMi50ZXh0dXJlKTtcblxuXHRhcGkgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgW3BMTSwgYWxwaGFUZXN0LCBvcGFjaXR5LCBjYW1lcmEsIHRlbXBvcmFsLCBibGVuZCwgZnJhbWVzXSA9IFtcblx0XHRcdHRoaXMucExNKCksXG5cdFx0XHR0aGlzLmFscGhhVGVzdCgpLFxuXHRcdFx0dGhpcy5vcGFjaXR5KCksXG5cdFx0XHR0aGlzLmNhbWVyYSgpLFxuXHRcdFx0dGhpcy50ZW1wb3JhbCgpLFxuXHRcdFx0dGhpcy5ibGVuZCgpLFxuXHRcdFx0dGhpcy5mcmFtZXMoKSxcblx0XHRdO1xuXHRcdGNvbnN0IGFwaSA9IHtcblx0XHRcdGxpZ2h0czogbmV3IE1hcDxzdHJpbmcsIFNpZ25hbDxOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0xpZ2h0QXBpPj4oKSxcblx0XHRcdHRlbXBvcmFsLFxuXHRcdFx0ZnJhbWVzOiBNYXRoLm1heCgyLCBmcmFtZXMpLFxuXHRcdFx0YmxlbmQ6IE1hdGgubWF4KDIsIGZyYW1lcyA9PT0gSW5maW5pdHkgPyBibGVuZCA6IGZyYW1lcyksXG5cdFx0XHRjb3VudDogMCxcblx0XHRcdGdldE1lc2g6ICgpID0+IHRoaXMubWVzaFJlZi5uYXRpdmVFbGVtZW50LFxuXHRcdFx0cmVzZXQ6ICgpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLm1lc2hSZWYubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXHRcdFx0XHQvLyBDbGVhciBidWZmZXJzLCByZXNldCBvcGFjaXRpZXMsIHNldCBmcmFtZSBjb3VudCB0byAwXG5cdFx0XHRcdHBMTS5jbGVhcigpO1xuXHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWVzaFJlZi5uYXRpdmVFbGVtZW50Lm1hdGVyaWFsO1xuXHRcdFx0XHRtYXRlcmlhbC5vcGFjaXR5ID0gMDtcblx0XHRcdFx0bWF0ZXJpYWwuYWxwaGFUZXN0ID0gMDtcblx0XHRcdFx0YXBpLmNvdW50ID0gMDtcblx0XHRcdH0sXG5cdFx0XHR1cGRhdGU6IChmcmFtZXMgPSAxKSA9PiB7XG5cdFx0XHRcdGlmICghdGhpcy5tZXNoUmVmLm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblx0XHRcdFx0Ly8gQWRhcHQgdGhlIG9wYWNpdHktYmxlbmQgcmF0aW8gdG8gdGhlIG51bWJlciBvZiBmcmFtZXNcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1lc2hSZWYubmF0aXZlRWxlbWVudC5tYXRlcmlhbDtcblx0XHRcdFx0aWYgKCFhcGkudGVtcG9yYWwpIHtcblx0XHRcdFx0XHRtYXRlcmlhbC5vcGFjaXR5ID0gb3BhY2l0eTtcblx0XHRcdFx0XHRtYXRlcmlhbC5hbHBoYVRlc3QgPSBhbHBoYVRlc3Q7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWF0ZXJpYWwub3BhY2l0eSA9IE1hdGgubWluKG9wYWNpdHksIG1hdGVyaWFsLm9wYWNpdHkgKyBvcGFjaXR5IC8gYXBpLmJsZW5kKTtcblx0XHRcdFx0XHRtYXRlcmlhbC5hbHBoYVRlc3QgPSBNYXRoLm1pbihhbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCArIGFscGhhVGVzdCAvIGFwaS5ibGVuZCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTd2l0Y2ggYWNjdW11bGF0aXZlIGxpZ2h0cyBvblxuXHRcdFx0XHR0aGlzLmFjY3VtdWxhdGl2ZVNoYWRvd3NSZWYubmF0aXZlRWxlbWVudC52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0Ly8gQ29sbGVjdCBzY2VuZSBsaWdodHMgYW5kIG1lc2hlc1xuXHRcdFx0XHRwTE0ucHJlcGFyZSgpO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgbGlnaHRtYXAgYW5kIHRoZSBhY2N1bXVsYXRpdmUgbGlnaHRzXG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVzOyBpKyspIHtcblx0XHRcdFx0XHRhcGkubGlnaHRzLmZvckVhY2goKGxpZ2h0KSA9PiBsaWdodCgpLnVwZGF0ZSgpKTtcblx0XHRcdFx0XHRwTE0udXBkYXRlKGNhbWVyYSwgYXBpLmJsZW5kKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN3aXRjaCBsaWdodHMgb2ZmXG5cdFx0XHRcdHRoaXMuYWNjdW11bGF0aXZlU2hhZG93c1JlZi5uYXRpdmVFbGVtZW50LnZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0Ly8gUmVzdG9yZSBsaWdodHMgYW5kIG1lc2hlc1xuXHRcdFx0XHRwTE0uZmluaXNoKCk7XG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRyZXR1cm4gYXBpO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmNvbmZpZ3VyZSgpO1xuXHRcdHRoaXMucmVzZXRBbmRVcGRhdGUoKTtcblx0XHR0aGlzLmJlZm9yZVJlbmRlcigpO1xuXHR9XG5cblx0cHJpdmF0ZSBjb25maWd1cmUoKSB7XG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IFtwTE0sIG1lc2hdID0gW3RoaXMucExNKCksIHRoaXMubWVzaFJlZi5uYXRpdmVFbGVtZW50XTtcblx0XHRcdGlmICghbWVzaCkgcmV0dXJuO1xuXHRcdFx0cExNLmNvbmZpZ3VyZShtZXNoKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcmVzZXRBbmRVcGRhdGUoKSB7XG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IFssICwgbWVzaF0gPSBbXG5cdFx0XHRcdHRoaXMuaW5wdXRzLnN0YXRlKCksXG5cdFx0XHRcdGdldExvY2FsU3RhdGUodW50cmFja2VkKHRoaXMuc2NlbmUpKS5vYmplY3RzKCksXG5cdFx0XHRcdHRoaXMubWVzaFJlZi5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XTtcblx0XHRcdGlmICghbWVzaCkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgYXBpID0gdW50cmFja2VkKHRoaXMuYXBpKTtcblx0XHRcdC8vIFJlc2V0IGludGVybmFscywgYnVmZmVycywgLi4uXG5cdFx0XHRhcGkucmVzZXQoKTtcblx0XHRcdC8vIFVwZGF0ZSBsaWdodG1hcFxuXHRcdFx0aWYgKCFhcGkudGVtcG9yYWwgJiYgYXBpLmZyYW1lcyAhPT0gSW5maW5pdHkpIGFwaS51cGRhdGUoYXBpLmJsZW5kKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYmVmb3JlUmVuZGVyKCkge1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoKSA9PiB7XG5cdFx0XHRjb25zdCBbYXBpLCBsaW1pdF0gPSBbdGhpcy5hcGkoKSwgdGhpcy5pbnB1dHMuZ2V0KCdsaW1pdCcpXTtcblx0XHRcdGlmICgoYXBpLnRlbXBvcmFsIHx8IGFwaS5mcmFtZXMgPT09IEluZmluaXR5KSAmJiBhcGkuY291bnQgPCBhcGkuZnJhbWVzICYmIGFwaS5jb3VudCA8IGxpbWl0KSB7XG5cdFx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRhcGkudXBkYXRlKCk7XG5cdFx0XHRcdGFwaS5jb3VudCsrO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { DiscardMaterial } from 'angular-three-soba/shaders';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
function isLight(object) {
|
|
4
|
+
return object.isLight;
|
|
5
|
+
}
|
|
6
|
+
function isGeometry(object) {
|
|
7
|
+
return !!object.geometry;
|
|
8
|
+
}
|
|
9
|
+
// Based on "Progressive Light Map Accumulator", by [zalo](https://github.com/zalo/)
|
|
10
|
+
export class ProgressiveLightMap {
|
|
11
|
+
constructor(renderer, scene, res = 1024) {
|
|
12
|
+
this.renderer = renderer;
|
|
13
|
+
this.res = res;
|
|
14
|
+
this.scene = scene;
|
|
15
|
+
this.buffer1Active = false;
|
|
16
|
+
this.lights = [];
|
|
17
|
+
this.meshes = [];
|
|
18
|
+
this.object = null;
|
|
19
|
+
this.clearColor = new THREE.Color();
|
|
20
|
+
this.clearAlpha = 0;
|
|
21
|
+
// Create the Progressive LightMap Texture
|
|
22
|
+
const format = /(Android|iPad|iPhone|iPod)/g.test(navigator.userAgent) ? THREE.HalfFloatType : THREE.FloatType;
|
|
23
|
+
this.progressiveLightMap1 = new THREE.WebGLRenderTarget(this.res, this.res, {
|
|
24
|
+
type: format,
|
|
25
|
+
});
|
|
26
|
+
this.progressiveLightMap2 = new THREE.WebGLRenderTarget(this.res, this.res, {
|
|
27
|
+
type: format,
|
|
28
|
+
});
|
|
29
|
+
// Inject some spicy new logic into a standard phong material
|
|
30
|
+
this.discardMat = new DiscardMaterial();
|
|
31
|
+
this.targetMat = new THREE.MeshLambertMaterial({ fog: false });
|
|
32
|
+
this.previousShadowMap = { value: this.progressiveLightMap1.texture };
|
|
33
|
+
this.averagingWindow = { value: 100 };
|
|
34
|
+
this.targetMat.onBeforeCompile = (shader) => {
|
|
35
|
+
// Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions
|
|
36
|
+
shader.vertexShader =
|
|
37
|
+
'varying vec2 vUv;\n' +
|
|
38
|
+
shader.vertexShader.slice(0, -1) +
|
|
39
|
+
'vUv = uv; gl_Position = vec4((uv - 0.5) * 2.0, 1.0, 1.0); }';
|
|
40
|
+
// Fragment Shader: Set Pixels to average in the Previous frame's Shadows
|
|
41
|
+
const bodyStart = shader.fragmentShader.indexOf('void main() {');
|
|
42
|
+
shader.fragmentShader =
|
|
43
|
+
'varying vec2 vUv;\n' +
|
|
44
|
+
shader.fragmentShader.slice(0, bodyStart) +
|
|
45
|
+
'uniform sampler2D previousShadowMap;\n uniform float averagingWindow;\n' +
|
|
46
|
+
shader.fragmentShader.slice(bodyStart - 1, -1) +
|
|
47
|
+
`\nvec3 texelOld = texture2D(previousShadowMap, vUv).rgb;
|
|
48
|
+
gl_FragColor.rgb = mix(texelOld, gl_FragColor.rgb, 1.0/ averagingWindow);
|
|
49
|
+
}`;
|
|
50
|
+
// Set the Previous Frame's Texture Buffer and Averaging Window
|
|
51
|
+
// Set the Previous Frame's Texture Buffer and Averaging Window
|
|
52
|
+
shader.uniforms['previousShadowMap'] = this.previousShadowMap;
|
|
53
|
+
shader.uniforms['averagingWindow'] = this.averagingWindow;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
clear() {
|
|
57
|
+
this.renderer.getClearColor(this.clearColor);
|
|
58
|
+
this.clearAlpha = this.renderer.getClearAlpha();
|
|
59
|
+
this.renderer.setClearColor('black', 1);
|
|
60
|
+
this.renderer.setRenderTarget(this.progressiveLightMap1);
|
|
61
|
+
this.renderer.clear();
|
|
62
|
+
this.renderer.setRenderTarget(this.progressiveLightMap2);
|
|
63
|
+
this.renderer.clear();
|
|
64
|
+
this.renderer.setRenderTarget(null);
|
|
65
|
+
this.renderer.setClearColor(this.clearColor, this.clearAlpha);
|
|
66
|
+
this.lights = [];
|
|
67
|
+
this.meshes = [];
|
|
68
|
+
this.scene.traverse((object) => {
|
|
69
|
+
if (isGeometry(object)) {
|
|
70
|
+
this.meshes.push({ object, material: object.material });
|
|
71
|
+
}
|
|
72
|
+
else if (isLight(object)) {
|
|
73
|
+
this.lights.push({ object, intensity: object.intensity });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
prepare() {
|
|
78
|
+
this.lights.forEach((light) => (light.object.intensity = 0));
|
|
79
|
+
this.meshes.forEach((mesh) => (mesh.object.material = this.discardMat));
|
|
80
|
+
}
|
|
81
|
+
finish() {
|
|
82
|
+
this.lights.forEach((light) => (light.object.intensity = light.intensity));
|
|
83
|
+
this.meshes.forEach((mesh) => (mesh.object.material = mesh.material));
|
|
84
|
+
}
|
|
85
|
+
configure(object) {
|
|
86
|
+
this.object = object;
|
|
87
|
+
}
|
|
88
|
+
update(camera, blendWindow = 100) {
|
|
89
|
+
if (!this.object)
|
|
90
|
+
return;
|
|
91
|
+
// Set each object's material to the UV Unwrapped Surface Mapping Version
|
|
92
|
+
this.averagingWindow.value = blendWindow;
|
|
93
|
+
this.object.material = this.targetMat;
|
|
94
|
+
// Ping-pong two surface buffers for reading/writing
|
|
95
|
+
const activeMap = this.buffer1Active ? this.progressiveLightMap1 : this.progressiveLightMap2;
|
|
96
|
+
const inactiveMap = this.buffer1Active ? this.progressiveLightMap2 : this.progressiveLightMap1;
|
|
97
|
+
// Render the object's surface maps
|
|
98
|
+
const oldBg = this.scene.background;
|
|
99
|
+
this.scene.background = null;
|
|
100
|
+
this.renderer.setRenderTarget(activeMap);
|
|
101
|
+
this.previousShadowMap.value = inactiveMap.texture;
|
|
102
|
+
this.buffer1Active = !this.buffer1Active;
|
|
103
|
+
this.renderer.render(this.scene, camera);
|
|
104
|
+
this.renderer.setRenderTarget(null);
|
|
105
|
+
this.scene.background = oldBg;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3NpdmUtbGlnaHQtbWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2FjY3VtdWxhdGl2ZS1zaGFkb3dzL3Byb2dyZXNzaXZlLWxpZ2h0LW1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsU0FBUyxPQUFPLENBQUMsTUFBVztJQUMzQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE1BQVc7SUFDOUIsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUMxQixDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sT0FBTyxtQkFBbUI7SUFpQi9CLFlBQVksUUFBNkIsRUFBRSxLQUFrQixFQUFFLE1BQWMsSUFBSTtRQUNoRixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFcEIsMENBQTBDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLDZCQUE2QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FB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LGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlzY2FyZE1hdGVyaWFsIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3NoYWRlcnMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5mdW5jdGlvbiBpc0xpZ2h0KG9iamVjdDogYW55KTogb2JqZWN0IGlzIFRIUkVFLkxpZ2h0IHtcblx0cmV0dXJuIG9iamVjdC5pc0xpZ2h0O1xufVxuXG5mdW5jdGlvbiBpc0dlb21ldHJ5KG9iamVjdDogYW55KTogb2JqZWN0IGlzIFRIUkVFLk1lc2gge1xuXHRyZXR1cm4gISFvYmplY3QuZ2VvbWV0cnk7XG59XG5cbi8vIEJhc2VkIG9uIFwiUHJvZ3Jlc3NpdmUgTGlnaHQgTWFwIEFjY3VtdWxhdG9yXCIsIGJ5IFt6YWxvXShodHRwczovL2dpdGh1Yi5jb20vemFsby8pXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NpdmVMaWdodE1hcCB7XG5cdHJlbmRlcmVyOiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xuXHRyZXM6IG51bWJlcjtcblx0c2NlbmU6IFRIUkVFLlNjZW5lO1xuXHRvYmplY3Q6IFRIUkVFLk1lc2ggfCBudWxsO1xuXHRidWZmZXIxQWN0aXZlOiBib29sZWFuO1xuXHRwcm9ncmVzc2l2ZUxpZ2h0TWFwMTogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XG5cdHByb2dyZXNzaXZlTGlnaHRNYXAyOiBUSFJFRS5XZWJHTFJlbmRlclRhcmdldDtcblx0ZGlzY2FyZE1hdDogVEhSRUUuU2hhZGVyTWF0ZXJpYWw7XG5cdHRhcmdldE1hdDogVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbDtcblx0cHJldmlvdXNTaGFkb3dNYXA6IHsgdmFsdWU6IFRIUkVFLlRleHR1cmUgfTtcblx0YXZlcmFnaW5nV2luZG93OiB7IHZhbHVlOiBudW1iZXIgfTtcblx0Y2xlYXJDb2xvcjogVEhSRUUuQ29sb3I7XG5cdGNsZWFyQWxwaGE6IG51bWJlcjtcblx0bGlnaHRzOiB7IG9iamVjdDogVEhSRUUuTGlnaHQ7IGludGVuc2l0eTogbnVtYmVyIH1bXTtcblx0bWVzaGVzOiB7IG9iamVjdDogVEhSRUUuTWVzaDsgbWF0ZXJpYWw6IFRIUkVFLk1hdGVyaWFsIHwgVEhSRUUuTWF0ZXJpYWxbXSB9W107XG5cblx0Y29uc3RydWN0b3IocmVuZGVyZXI6IFRIUkVFLldlYkdMUmVuZGVyZXIsIHNjZW5lOiBUSFJFRS5TY2VuZSwgcmVzOiBudW1iZXIgPSAxMDI0KSB7XG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXHRcdHRoaXMucmVzID0gcmVzO1xuXHRcdHRoaXMuc2NlbmUgPSBzY2VuZTtcblx0XHR0aGlzLmJ1ZmZlcjFBY3RpdmUgPSBmYWxzZTtcblx0XHR0aGlzLmxpZ2h0cyA9IFtdO1xuXHRcdHRoaXMubWVzaGVzID0gW107XG5cdFx0dGhpcy5vYmplY3QgPSBudWxsO1xuXHRcdHRoaXMuY2xlYXJDb2xvciA9IG5ldyBUSFJFRS5Db2xvcigpO1xuXHRcdHRoaXMuY2xlYXJBbHBoYSA9IDA7XG5cblx0XHQvLyBDcmVhdGUgdGhlIFByb2dyZXNzaXZlIExpZ2h0TWFwIFRleHR1cmVcblx0XHRjb25zdCBmb3JtYXQgPSAvKEFuZHJvaWR8aVBhZHxpUGhvbmV8aVBvZCkvZy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpID8gVEhSRUUuSGFsZkZsb2F0VHlwZSA6IFRIUkVFLkZsb2F0VHlwZTtcblx0XHR0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAxID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KHRoaXMucmVzLCB0aGlzLnJlcywge1xuXHRcdFx0dHlwZTogZm9ybWF0LFxuXHRcdH0pO1xuXHRcdHRoaXMucHJvZ3Jlc3NpdmVMaWdodE1hcDIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQodGhpcy5yZXMsIHRoaXMucmVzLCB7XG5cdFx0XHR0eXBlOiBmb3JtYXQsXG5cdFx0fSk7XG5cblx0XHQvLyBJbmplY3Qgc29tZSBzcGljeSBuZXcgbG9naWMgaW50byBhIHN0YW5kYXJkIHBob25nIG1hdGVyaWFsXG5cdFx0dGhpcy5kaXNjYXJkTWF0ID0gbmV3IERpc2NhcmRNYXRlcmlhbCgpO1xuXHRcdHRoaXMudGFyZ2V0TWF0ID0gbmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoeyBmb2c6IGZhbHNlIH0pO1xuXHRcdHRoaXMucHJldmlvdXNTaGFkb3dNYXAgPSB7IHZhbHVlOiB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAxLnRleHR1cmUgfTtcblx0XHR0aGlzLmF2ZXJhZ2luZ1dpbmRvdyA9IHsgdmFsdWU6IDEwMCB9O1xuXHRcdHRoaXMudGFyZ2V0TWF0Lm9uQmVmb3JlQ29tcGlsZSA9IChzaGFkZXIpID0+IHtcblx0XHRcdC8vIFZlcnRleCBTaGFkZXI6IFNldCBWZXJ0ZXggUG9zaXRpb25zIHRvIHRoZSBVbndyYXBwZWQgVVYgUG9zaXRpb25zXG5cdFx0XHRzaGFkZXIudmVydGV4U2hhZGVyID1cblx0XHRcdFx0J3ZhcnlpbmcgdmVjMiB2VXY7XFxuJyArXG5cdFx0XHRcdHNoYWRlci52ZXJ0ZXhTaGFkZXIuc2xpY2UoMCwgLTEpICtcblx0XHRcdFx0J3ZVdiA9IHV2OyBnbF9Qb3NpdGlvbiA9IHZlYzQoKHV2IC0gMC41KSAqIDIuMCwgMS4wLCAxLjApOyB9JztcblxuXHRcdFx0Ly8gRnJhZ21lbnQgU2hhZGVyOiBTZXQgUGl4ZWxzIHRvIGF2ZXJhZ2UgaW4gdGhlIFByZXZpb3VzIGZyYW1lJ3MgU2hhZG93c1xuXHRcdFx0Y29uc3QgYm9keVN0YXJ0ID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyLmluZGV4T2YoJ3ZvaWQgbWFpbigpIHsnKTtcblx0XHRcdHNoYWRlci5mcmFnbWVudFNoYWRlciA9XG5cdFx0XHRcdCd2YXJ5aW5nIHZlYzIgdlV2O1xcbicgK1xuXHRcdFx0XHRzaGFkZXIuZnJhZ21lbnRTaGFkZXIuc2xpY2UoMCwgYm9keVN0YXJ0KSArXG5cdFx0XHRcdCd1bmlmb3JtIHNhbXBsZXIyRCBwcmV2aW91c1NoYWRvd01hcDtcXG5cdHVuaWZvcm0gZmxvYXQgYXZlcmFnaW5nV2luZG93O1xcbicgK1xuXHRcdFx0XHRzaGFkZXIuZnJhZ21lbnRTaGFkZXIuc2xpY2UoYm9keVN0YXJ0IC0gMSwgLTEpICtcblx0XHRcdFx0YFxcbnZlYzMgdGV4ZWxPbGQgPSB0ZXh0dXJlMkQocHJldmlvdXNTaGFkb3dNYXAsIHZVdikucmdiO1xuICAgICAgICBnbF9GcmFnQ29sb3IucmdiID0gbWl4KHRleGVsT2xkLCBnbF9GcmFnQ29sb3IucmdiLCAxLjAvIGF2ZXJhZ2luZ1dpbmRvdyk7XG4gICAgICB9YDtcblxuXHRcdFx0Ly8gU2V0IHRoZSBQcmV2aW91cyBGcmFtZSdzIFRleHR1cmUgQnVmZmVyIGFuZCBBdmVyYWdpbmcgV2luZG93XG5cdFx0XHQvLyBTZXQgdGhlIFByZXZpb3VzIEZyYW1lJ3MgVGV4dHVyZSBCdWZmZXIgYW5kIEF2ZXJhZ2luZyBXaW5kb3dcblx0XHRcdHNoYWRlci51bmlmb3Jtc1sncHJldmlvdXNTaGFkb3dNYXAnXSA9IHRoaXMucHJldmlvdXNTaGFkb3dNYXA7XG5cdFx0XHRzaGFkZXIudW5pZm9ybXNbJ2F2ZXJhZ2luZ1dpbmRvdyddID0gdGhpcy5hdmVyYWdpbmdXaW5kb3c7XG5cdFx0fTtcblx0fVxuXG5cdGNsZWFyKCkge1xuXHRcdHRoaXMucmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcih0aGlzLmNsZWFyQ29sb3IpO1xuXHRcdHRoaXMuY2xlYXJBbHBoYSA9IHRoaXMucmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpO1xuXHRcdHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcignYmxhY2snLCAxKTtcblx0XHR0aGlzLnJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAxKTtcblx0XHR0aGlzLnJlbmRlcmVyLmNsZWFyKCk7XG5cdFx0dGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMik7XG5cdFx0dGhpcy5yZW5kZXJlci5jbGVhcigpO1xuXHRcdHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KG51bGwpO1xuXHRcdHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcih0aGlzLmNsZWFyQ29sb3IsIHRoaXMuY2xlYXJBbHBoYSk7XG5cblx0XHR0aGlzLmxpZ2h0cyA9IFtdO1xuXHRcdHRoaXMubWVzaGVzID0gW107XG5cdFx0dGhpcy5zY2VuZS50cmF2ZXJzZSgob2JqZWN0KSA9PiB7XG5cdFx0XHRpZiAoaXNHZW9tZXRyeShvYmplY3QpKSB7XG5cdFx0XHRcdHRoaXMubWVzaGVzLnB1c2goeyBvYmplY3QsIG1hdGVyaWFsOiBvYmplY3QubWF0ZXJpYWwgfSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlzTGlnaHQob2JqZWN0KSkge1xuXHRcdFx0XHR0aGlzLmxpZ2h0cy5wdXNoKHsgb2JqZWN0LCBpbnRlbnNpdHk6IG9iamVjdC5pbnRlbnNpdHkgfSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcmVwYXJlKCkge1xuXHRcdHRoaXMubGlnaHRzLmZvckVhY2goKGxpZ2h0KSA9PiAobGlnaHQub2JqZWN0LmludGVuc2l0eSA9IDApKTtcblx0XHR0aGlzLm1lc2hlcy5mb3JFYWNoKChtZXNoKSA9PiAobWVzaC5vYmplY3QubWF0ZXJpYWwgPSB0aGlzLmRpc2NhcmRNYXQpKTtcblx0fVxuXG5cdGZpbmlzaCgpIHtcblx0XHR0aGlzLmxpZ2h0cy5mb3JFYWNoKChsaWdodCkgPT4gKGxpZ2h0Lm9iamVjdC5pbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHkpKTtcblx0XHR0aGlzLm1lc2hlcy5mb3JFYWNoKChtZXNoKSA9PiAobWVzaC5vYmplY3QubWF0ZXJpYWwgPSBtZXNoLm1hdGVyaWFsKSk7XG5cdH1cblxuXHRjb25maWd1cmUob2JqZWN0OiBUSFJFRS5NZXNoKSB7XG5cdFx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cdH1cblxuXHR1cGRhdGUoY2FtZXJhOiBUSFJFRS5DYW1lcmEsIGJsZW5kV2luZG93ID0gMTAwKSB7XG5cdFx0aWYgKCF0aGlzLm9iamVjdCkgcmV0dXJuO1xuXHRcdC8vIFNldCBlYWNoIG9iamVjdCdzIG1hdGVyaWFsIHRvIHRoZSBVViBVbndyYXBwZWQgU3VyZmFjZSBNYXBwaW5nIFZlcnNpb25cblx0XHR0aGlzLmF2ZXJhZ2luZ1dpbmRvdy52YWx1ZSA9IGJsZW5kV2luZG93O1xuXHRcdHRoaXMub2JqZWN0Lm1hdGVyaWFsID0gdGhpcy50YXJnZXRNYXQ7XG5cdFx0Ly8gUGluZy1wb25nIHR3byBzdXJmYWNlIGJ1ZmZlcnMgZm9yIHJlYWRpbmcvd3JpdGluZ1xuXHRcdGNvbnN0IGFjdGl2ZU1hcCA9IHRoaXMuYnVmZmVyMUFjdGl2ZSA/IHRoaXMucHJvZ3Jlc3NpdmVMaWdodE1hcDEgOiB0aGlzLnByb2dyZXNzaXZlTGlnaHRNYXAyO1xuXHRcdGNvbnN0IGluYWN0aXZlTWFwID0gdGhpcy5idWZmZXIxQWN0aXZlID8gdGhpcy5wcm9ncmVzc2l2ZUxpZ2h0TWFwMiA6IHRoaXMucHJvZ3Jlc3NpdmVMaWdodE1hcDE7XG5cdFx0Ly8gUmVuZGVyIHRoZSBvYmplY3QncyBzdXJmYWNlIG1hcHNcblx0XHRjb25zdCBvbGRCZyA9IHRoaXMuc2NlbmUuYmFja2dyb3VuZDtcblx0XHR0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xuXHRcdHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KGFjdGl2ZU1hcCk7XG5cdFx0dGhpcy5wcmV2aW91c1NoYWRvd01hcC52YWx1ZSA9IGluYWN0aXZlTWFwLnRleHR1cmU7XG5cdFx0dGhpcy5idWZmZXIxQWN0aXZlID0gIXRoaXMuYnVmZmVyMUFjdGl2ZTtcblx0XHR0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCBjYW1lcmEpO1xuXHRcdHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KG51bGwpO1xuXHRcdHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IG9sZEJnO1xuXHR9XG59XG4iXX0=
|