@zephyr3d/scene 0.9.26 → 0.10.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/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +146 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +300 -56
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +177 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +178 -200
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +30475 -19865
- package/dist/index.js +67 -12
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +223 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +733 -190
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +2009 -201
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +34 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +26 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +53 -53
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +23 -9
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +524 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +36 -36
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +997 -96
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +87 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +140 -279
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import { getAtmosphereParamsStruct, rayIntersectSphere, transmittanceToSky, getSkyView } from '../../shaders/atmosphere.js';
|
|
2
|
+
|
|
3
|
+
/** @internal */ const CLOUD_SAMPLE_COUNT_MIN = 2;
|
|
4
|
+
/** @internal */ const CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX = 15000;
|
|
5
|
+
/** @internal */ const CLOUD_TRACING_START_MAX_DISTANCE = 350000;
|
|
6
|
+
/** @internal */ const CLOUD_BASE_VIEW_SAMPLE_COUNT = 96;
|
|
7
|
+
/** @internal */ const CLOUD_VIEW_SAMPLE_COUNT_MAX = 768;
|
|
8
|
+
/** @internal */ const CLOUD_BASE_SHADOW_SAMPLE_COUNT = 10;
|
|
9
|
+
/** @internal */ const CLOUD_SHADOW_SAMPLE_COUNT_MAX = 80;
|
|
10
|
+
/** @internal */ const CLOUD_DISTANT_SKY_LIGHT_ALTITUDE = 6000;
|
|
11
|
+
/**
|
|
12
|
+
* 5th/95th percentiles of the generated Perlin-Worley base shape (seeds 0-2), remapped to [0, 1].
|
|
13
|
+
* Imported volumes may have another range.
|
|
14
|
+
*/ const CLOUD_COVERAGE_BASE_RANGE = [
|
|
15
|
+
0.1552,
|
|
16
|
+
0.4032
|
|
17
|
+
];
|
|
18
|
+
/** 5th/95th percentiles of the generated detail fbm (0.625 R + 0.25 G + 0.125 B), remapped to [0, 1]. */ const CLOUD_DETAIL_RANGE = [
|
|
19
|
+
0.53,
|
|
20
|
+
0.85
|
|
21
|
+
];
|
|
22
|
+
/** Largest envelope erosion by the base noise; envelope values above it stay solid. */ const CLOUD_SHAPE_EROSION = 0.6;
|
|
23
|
+
/** Largest envelope erosion by the detail noise, at detail erosion 1. */ const CLOUD_DETAIL_EROSION = 0.4;
|
|
24
|
+
/** Envelope margin over which the density rises from 0 to 1 below the cloud surface. */ const CLOUD_EDGE_WIDTH = 0.35;
|
|
25
|
+
/**
|
|
26
|
+
* Softer edge for the march towards the sun: its few unjittered x^2 samples would otherwise
|
|
27
|
+
* streak the lighting along the sun direction.
|
|
28
|
+
*/ const CLOUD_SHADOW_EDGE_WIDTH = 0.7;
|
|
29
|
+
/** Weather value range over which the local coverage ramps from 0 to 1. */ const CLOUD_COVERAGE_RAMP = 0.4;
|
|
30
|
+
/**
|
|
31
|
+
* Weather threshold of a global coverage: connected can fill the map, isolated keeps its gaps.
|
|
32
|
+
* @internal
|
|
33
|
+
*/ function cloudCoverageThreshold(coverage, formation) {
|
|
34
|
+
const c = Math.min(1, Math.max(0, coverage));
|
|
35
|
+
return 1 - c * (formation === 'connected' ? 1 + CLOUD_COVERAGE_RAMP : 1);
|
|
36
|
+
}
|
|
37
|
+
/** Width of the cloud base transition, in meters. */ const CLOUD_BOTTOM_TRANSITION_METERS = 150;
|
|
38
|
+
/** [Schneider15] cloud_top_offset: how far the wind pushes cloud tops ahead of their base, in meters */ const CLOUD_TOP_OFFSET = 500;
|
|
39
|
+
/**
|
|
40
|
+
* Uniform block of the cloud passes.
|
|
41
|
+
* @internal
|
|
42
|
+
*/ function getCloudParamsStruct(pb) {
|
|
43
|
+
return pb.defineStruct([
|
|
44
|
+
// World (planet-fixed) to observer-local rotation the trace was set up with
|
|
45
|
+
pb.mat4('referential'),
|
|
46
|
+
// (bottom radius, top radius, planet radius, tracing max distance)
|
|
47
|
+
pb.vec4('layer'),
|
|
48
|
+
// (view sample count max, shadow sample count max, shadow tracing distance, stop transmittance)
|
|
49
|
+
pb.vec4('march'),
|
|
50
|
+
// (observer-local eye position, 0)
|
|
51
|
+
pb.vec4('eye'),
|
|
52
|
+
// (direction to the sun, per-sample atmosphere transmittance 0/1)
|
|
53
|
+
pb.vec4('sunDir'),
|
|
54
|
+
// (sun illuminance outside the atmosphere, 0)
|
|
55
|
+
pb.vec4('sunIlluminance'),
|
|
56
|
+
// (phase g, phase g2, phase blend, sky light bottom visibility)
|
|
57
|
+
pb.vec4('phase'),
|
|
58
|
+
// (multiple scattering contribution, occlusion, eccentricity, 0)
|
|
59
|
+
pb.vec4('ms'),
|
|
60
|
+
// (weather coverage threshold, extinction per meter, detail erosion, anvil bias)
|
|
61
|
+
pb.vec4('density'),
|
|
62
|
+
// (base noise shaping strength, bottom detail erosion multiplier, global coverage, base variation meters)
|
|
63
|
+
pb.vec4('shape'),
|
|
64
|
+
// (albedo, 0)
|
|
65
|
+
pb.vec4('albedo'),
|
|
66
|
+
// (1 / weather map scale, 1 / base noise scale, 1 / detail noise scale, cloud top offset)
|
|
67
|
+
pb.vec4('scales'),
|
|
68
|
+
// (wind offset of the noise in planet-fixed meters, 0)
|
|
69
|
+
pb.vec4('windOffset'),
|
|
70
|
+
// (horizontal wind direction x, z, formation: 0 connected / 1 isolated, 0)
|
|
71
|
+
pb.vec4('windDir')
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Both roots of a ray / origin-centred sphere intersection, (-1, -1) when missed.
|
|
76
|
+
*/ function raySphereSolutions(scope, origin, dir, radius) {
|
|
77
|
+
const pb = scope.$builder;
|
|
78
|
+
const funcName = 'Z_cloudRaySphereSolutions';
|
|
79
|
+
pb.func(funcName, [
|
|
80
|
+
pb.vec3('o'),
|
|
81
|
+
pb.vec3('d'),
|
|
82
|
+
pb.float('r')
|
|
83
|
+
], function() {
|
|
84
|
+
this.$l.b = pb.dot(this.o, this.d);
|
|
85
|
+
this.$l.c = pb.sub(pb.dot(this.o, this.o), pb.mul(this.r, this.r));
|
|
86
|
+
this.$l.disc = pb.sub(pb.mul(this.b, this.b), this.c);
|
|
87
|
+
this.$if(pb.lessThan(this.disc, 0), function() {
|
|
88
|
+
this.$return(pb.vec2(-1));
|
|
89
|
+
});
|
|
90
|
+
this.$l.s = pb.sqrt(this.disc);
|
|
91
|
+
this.$return(pb.vec2(pb.sub(pb.neg(this.b), this.s), pb.add(pb.neg(this.b), this.s)));
|
|
92
|
+
});
|
|
93
|
+
return pb.getGlobalScope()[funcName](origin, dir, radius);
|
|
94
|
+
}
|
|
95
|
+
/** Henyey-Greenstein with the forward peak where the view looks into the light. */ function hgPhase(scope, g, cosTheta) {
|
|
96
|
+
const pb = scope.$builder;
|
|
97
|
+
const funcName = 'Z_cloudHGPhase';
|
|
98
|
+
pb.func(funcName, [
|
|
99
|
+
pb.float('g'),
|
|
100
|
+
pb.float('c')
|
|
101
|
+
], function() {
|
|
102
|
+
this.$l.numer = pb.sub(1, pb.mul(this.g, this.g));
|
|
103
|
+
this.$l.denom = pb.max(pb.sub(pb.add(1, pb.mul(this.g, this.g)), pb.mul(this.g, this.c, 2)), 1e-6);
|
|
104
|
+
this.$return(pb.div(this.numer, pb.mul(4 * Math.PI, this.denom, pb.sqrt(this.denom))));
|
|
105
|
+
});
|
|
106
|
+
return pb.getGlobalScope()[funcName](g, cosTheta);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Returns (height profile, height within the cloud type, bottom ramp, top cut) for a cloud type
|
|
110
|
+
* of 0 (stratus), 0.5 (stratocumulus) or 1 (cumulus), the base lifted by `baseOffsetMeters`.
|
|
111
|
+
* @internal
|
|
112
|
+
*/ function cloudHeightProfile(scope, heightFrac, cloudType, layerHeight, baseOffsetMeters = 0) {
|
|
113
|
+
const pb = scope.$builder;
|
|
114
|
+
const funcName = 'Z_cloudVerticalProfile';
|
|
115
|
+
pb.func(funcName, [
|
|
116
|
+
pb.float('h'),
|
|
117
|
+
pb.float('t'),
|
|
118
|
+
pb.float('layerHeight'),
|
|
119
|
+
pb.float('baseOffsetMeters')
|
|
120
|
+
], function() {
|
|
121
|
+
this.$l.cloudType = pb.clamp(this.t, 0, 1);
|
|
122
|
+
this.$l.stratus = pb.sub(1, pb.clamp(pb.mul(this.cloudType, 2), 0, 1));
|
|
123
|
+
this.$l.stratocumulus = pb.sub(1, pb.mul(pb.abs(pb.sub(this.cloudType, 0.5)), 2));
|
|
124
|
+
this.$l.cumulus = pb.mul(pb.clamp(pb.sub(this.cloudType, 0.5), 0, 1), 2);
|
|
125
|
+
// (base, nominal end of the bottom ramp, start of the top falloff, top)
|
|
126
|
+
this.$l.g = pb.add(pb.mul(pb.vec4(0, 0.05, 0.09, 0.11), this.stratus), pb.mul(pb.vec4(0, 0.2, 0.2, 0.625), this.stratocumulus), pb.mul(pb.vec4(0, 0.0625, 0.2, 1), this.cumulus));
|
|
127
|
+
this.$l.bottomWidth = pb.min(pb.min(this.g.y, pb.div(CLOUD_BOTTOM_TRANSITION_METERS, pb.max(this.layerHeight, 1))), pb.mul(this.g.w, 0.15));
|
|
128
|
+
this.$l.localBase = pb.clamp(pb.div(this.baseOffsetMeters, pb.max(this.layerHeight, 1)), 0, pb.mul(this.g.w, 0.25));
|
|
129
|
+
this.$l.bottom = pb.smoothStep(this.localBase, pb.add(this.localBase, pb.max(this.bottomWidth, 1e-6)), this.h);
|
|
130
|
+
this.$l.top = pb.sub(1, pb.smoothStep(this.g.z, this.g.w, this.h));
|
|
131
|
+
this.$return(pb.vec4(pb.mul(this.bottom, this.top), pb.clamp(pb.div(pb.sub(this.h, this.localBase), pb.max(pb.sub(this.g.w, this.localBase), 1e-6)), 0, 1), this.bottom, pb.sub(1, this.top)));
|
|
132
|
+
});
|
|
133
|
+
return pb.getGlobalScope()[funcName](heightFrac, cloudType, layerHeight, baseOffsetMeters);
|
|
134
|
+
}
|
|
135
|
+
/** remap(v, l0, h0, l1, h1) of [Schneider15] */ function remap(pb, v, l0, h0, l1, h1) {
|
|
136
|
+
return pb.add(l1, pb.mul(pb.div(pb.sub(v, l0), pb.sub(h0, l0)), h1 - l1));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Cloud medium at an observer-local position.
|
|
140
|
+
*
|
|
141
|
+
* Returns (extinction per meter, conservative density, normalized altitude in the layer,
|
|
142
|
+
* altitude in the layer in meters). The conservative density omits the detail erosion, so a
|
|
143
|
+
* zero lets the march skip the sample.
|
|
144
|
+
*
|
|
145
|
+
* envelope = bottom(h) * max(coverage - topCut(h), 0)
|
|
146
|
+
* margin = envelope - shape * CLOUD_SHAPE_EROSION * (1 - baseNoise)
|
|
147
|
+
* - detail * CLOUD_DETAIL_EROSION * detailModifier
|
|
148
|
+
* density = saturate(margin / edgeWidth)
|
|
149
|
+
*
|
|
150
|
+
* @internal
|
|
151
|
+
*/ function cloudSampleDensity(scope, cloud, pos, weatherMap, baseNoise, detailNoise, stage = 'density', edgeWidth = CLOUD_EDGE_WIDTH) {
|
|
152
|
+
const pb = scope.$builder;
|
|
153
|
+
const CloudParams = getCloudParamsStruct(pb);
|
|
154
|
+
const funcName = `Z_cloudSampleDensity_${stage}${edgeWidth === CLOUD_EDGE_WIDTH ? '' : '_shadow'}`;
|
|
155
|
+
pb.func(funcName, [
|
|
156
|
+
CloudParams('cloud'),
|
|
157
|
+
pb.vec3('p')
|
|
158
|
+
], function() {
|
|
159
|
+
this.$l.r = pb.length(this.p);
|
|
160
|
+
this.$l.altInLayer = pb.sub(this.r, this.cloud.layer.x);
|
|
161
|
+
this.$l.h = pb.div(this.altInLayer, pb.sub(this.cloud.layer.y, this.cloud.layer.x));
|
|
162
|
+
this.$if(pb.or(pb.lessThanEqual(this.cloud.shape.z, 0), pb.lessThanEqual(this.h, 0), pb.greaterThanEqual(this.h, 1)), function() {
|
|
163
|
+
this.$return(pb.vec4(0, 0, this.h, this.altInLayer));
|
|
164
|
+
});
|
|
165
|
+
// Planet-fixed position, altitude as height so the noise follows the curvature
|
|
166
|
+
this.$l.planet = pb.mul(pb.vec4(this.p, 0), this.cloud.referential).xyz;
|
|
167
|
+
this.$l.q = pb.vec3(this.planet.x, pb.sub(this.r, this.cloud.layer.z), this.planet.z);
|
|
168
|
+
// Tops skewed along the wind (Nubis 2017); the noise drifts, the coverage stays put
|
|
169
|
+
this.q = pb.add(this.q, pb.mul(pb.vec3(this.cloud.windDir.x, 0, this.cloud.windDir.y), pb.mul(this.cloud.scales.w, this.h)));
|
|
170
|
+
this.$l.weather = pb.clamp(pb.textureSampleLevel(weatherMap, pb.mul(this.q.xz, this.cloud.scales.x), 0), pb.vec4(0), pb.vec4(1));
|
|
171
|
+
this.q = pb.add(this.q, this.cloud.windOffset.xyz);
|
|
172
|
+
this.$l.coverage = pb.clamp(pb.div(pb.sub(pb.mix(this.weather.r, this.weather.g, this.cloud.windDir.z), this.cloud.density.x), CLOUD_COVERAGE_RAMP), 0, 1);
|
|
173
|
+
// Anvils: coverage inflated towards the layer top (Nubis 2017)
|
|
174
|
+
this.coverage = pb.pow(this.coverage, pb.mix(1, pb.mix(1, 0.5, this.cloud.density.w), pb.clamp(pb.mul(pb.sub(this.h, 0.7), 10), 0, 1)));
|
|
175
|
+
this.$if(pb.lessThanEqual(this.coverage, 0), function() {
|
|
176
|
+
this.$return(pb.vec4(0, 0, this.h, this.altInLayer));
|
|
177
|
+
});
|
|
178
|
+
// Base lift: higher for cumulus and towards the footprint edges
|
|
179
|
+
this.$l.baseOffset = pb.mul(this.cloud.shape.w, pb.add(0.15, pb.mul(this.weather.b, 0.45), pb.mul(pb.sub(1, this.coverage), 0.4)));
|
|
180
|
+
this.$l.heightProfile = cloudHeightProfile(this, this.h, this.weather.b, pb.sub(this.cloud.layer.y, this.cloud.layer.x), this.baseOffset);
|
|
181
|
+
this.$l.profile = pb.mul(this.heightProfile.z, pb.max(pb.sub(this.coverage, this.heightProfile.w), 0));
|
|
182
|
+
if (stage === 'profile') {
|
|
183
|
+
this.$return(pb.vec4(pb.mul(this.profile, this.cloud.density.y), this.profile, this.h, this.altInLayer));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.$l.noise = pb.float(1);
|
|
187
|
+
this.$if(pb.greaterThan(this.cloud.shape.x, 0), function() {
|
|
188
|
+
this.$l.n = pb.textureSampleLevel(baseNoise, pb.mul(this.q, this.cloud.scales.y), 0);
|
|
189
|
+
this.$l.lowFbm = pb.add(pb.mul(this.n.g, 0.625), pb.mul(this.n.b, 0.25), pb.mul(this.n.a, 0.125));
|
|
190
|
+
this.$l.rawBase = remap(pb, this.n.r, pb.sub(this.lowFbm, 1), 1, 0, 1);
|
|
191
|
+
this.noise = pb.clamp(remap(pb, this.rawBase, CLOUD_COVERAGE_BASE_RANGE[0], CLOUD_COVERAGE_BASE_RANGE[1], 0, 1), 0, 1);
|
|
192
|
+
});
|
|
193
|
+
this.$l.margin = pb.sub(this.profile, pb.mul(this.cloud.shape.x, CLOUD_SHAPE_EROSION, pb.sub(1, this.noise)));
|
|
194
|
+
this.$l.base = pb.clamp(pb.div(this.margin, edgeWidth), 0, 1);
|
|
195
|
+
this.$if(pb.lessThanEqual(this.base, 0), function() {
|
|
196
|
+
this.$return(pb.vec4(0, 0, this.h, this.altInLayer));
|
|
197
|
+
});
|
|
198
|
+
if (stage === 'base') {
|
|
199
|
+
this.$return(pb.vec4(pb.mul(this.base, this.cloud.density.y), this.base, this.h, this.altInLayer));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
this.$if(pb.lessThanEqual(this.cloud.density.z, 0), function() {
|
|
203
|
+
this.$return(pb.vec4(pb.mul(this.base, this.cloud.density.y), this.base, this.h, this.altInLayer));
|
|
204
|
+
});
|
|
205
|
+
this.$l.d = pb.textureSampleLevel(detailNoise, pb.mul(this.q, this.cloud.scales.z), 0).rgb;
|
|
206
|
+
this.$l.highFbm = pb.clamp(remap(pb, pb.add(pb.mul(this.d.r, 0.625), pb.mul(this.d.g, 0.25), pb.mul(this.d.b, 0.125)), CLOUD_DETAIL_RANGE[0], CLOUD_DETAIL_RANGE[1], 0, 1), 0, 1);
|
|
207
|
+
// Wispy at the base, billowy above
|
|
208
|
+
this.$l.modifier = pb.mix(this.highFbm, pb.sub(1, this.highFbm), pb.clamp(pb.mul(this.heightProfile.y, 10), 0, 1));
|
|
209
|
+
this.$l.bottomErosion = pb.mix(this.cloud.shape.y, 1, pb.smoothStep(0, 0.25, this.heightProfile.y));
|
|
210
|
+
this.margin = pb.sub(this.margin, pb.mul(this.modifier, this.cloud.density.z, this.bottomErosion, CLOUD_DETAIL_EROSION));
|
|
211
|
+
this.$l.eroded = pb.clamp(pb.div(this.margin, edgeWidth), 0, 1);
|
|
212
|
+
this.$return(pb.vec4(pb.mul(this.eroded, this.cloud.density.y), this.base, this.h, this.altInLayer));
|
|
213
|
+
});
|
|
214
|
+
return pb.getGlobalScope()[funcName](cloud, pos);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Traces the clouds along one view ray from the cloud eye position.
|
|
218
|
+
*
|
|
219
|
+
* Returns (scattered luminance with aerial perspective, mean transmittance), the luminance in the
|
|
220
|
+
* units of the atmosphere (`params.lightColor`) so it composites directly over `skyBox()`:
|
|
221
|
+
* `sky * a + rgb`.
|
|
222
|
+
*
|
|
223
|
+
* @param msCount - 1 + multiple scattering octaves, compile time
|
|
224
|
+
* @param jitter - start offset of the march in steps, 0..1
|
|
225
|
+
* @param stepScale - scales the sample count, below 1 for quick previews
|
|
226
|
+
* @internal
|
|
227
|
+
*/ function cloudTrace(scope, msCount, atmosphere, cloud, dir, jitter, stepScale, ambient, textures) {
|
|
228
|
+
const pb = scope.$builder;
|
|
229
|
+
const AtmosphereParams = getAtmosphereParamsStruct(pb);
|
|
230
|
+
const CloudParams = getCloudParamsStruct(pb);
|
|
231
|
+
const funcName = `Z_cloudTrace${msCount}`;
|
|
232
|
+
const density = (s, p, edgeWidth = CLOUD_EDGE_WIDTH)=>cloudSampleDensity(s, s.cloud, p, textures.weatherMap, textures.baseNoise, textures.detailNoise, 'density', edgeWidth);
|
|
233
|
+
pb.func(funcName, [
|
|
234
|
+
AtmosphereParams('atmo'),
|
|
235
|
+
CloudParams('cloud'),
|
|
236
|
+
pb.vec3('dir'),
|
|
237
|
+
pb.float('jitter'),
|
|
238
|
+
pb.float('stepScale'),
|
|
239
|
+
pb.vec3('ambient')
|
|
240
|
+
], function() {
|
|
241
|
+
this.$l.eye = this.cloud.eye.xyz;
|
|
242
|
+
this.$l.tTop2 = raySphereSolutions(this, this.eye, this.dir, this.cloud.layer.y);
|
|
243
|
+
this.$l.tBottom2 = raySphereSolutions(this, this.eye, this.dir, this.cloud.layer.x);
|
|
244
|
+
this.$l.tMin = pb.float(0);
|
|
245
|
+
this.$l.tMax = pb.float(0);
|
|
246
|
+
this.$if(pb.and(pb.lessThan(this.tTop2.x, 0), pb.lessThan(this.tTop2.y, 0)), function() {
|
|
247
|
+
this.$return(pb.vec4(0, 0, 0, 1));
|
|
248
|
+
});
|
|
249
|
+
this.$if(pb.greaterThan(pb.abs(pb.sub(this.tBottom2.x, this.tBottom2.y)), 0), function() {
|
|
250
|
+
this.$l.bottomBothAhead = pb.all(pb.greaterThan(this.tBottom2, pb.vec2(0)));
|
|
251
|
+
this.$l.tempTop = this.$choice(pb.all(pb.greaterThan(this.tTop2, pb.vec2(0))), pb.min(this.tTop2.x, this.tTop2.y), pb.max(this.tTop2.x, this.tTop2.y));
|
|
252
|
+
this.$l.tempBottom = this.$choice(this.bottomBothAhead, pb.min(this.tBottom2.x, this.tBottom2.y), pb.max(this.tBottom2.x, this.tBottom2.y));
|
|
253
|
+
this.$if(this.bottomBothAhead, function() {
|
|
254
|
+
this.tempTop = pb.max(0, pb.min(this.tTop2.x, this.tTop2.y));
|
|
255
|
+
});
|
|
256
|
+
this.tMin = pb.min(this.tempBottom, this.tempTop);
|
|
257
|
+
this.tMax = pb.max(this.tempBottom, this.tempTop);
|
|
258
|
+
}).$else(function() {
|
|
259
|
+
this.tMin = this.tTop2.x;
|
|
260
|
+
this.tMax = this.tTop2.y;
|
|
261
|
+
});
|
|
262
|
+
this.tMin = pb.max(this.tMin, 0);
|
|
263
|
+
this.tMax = pb.max(this.tMax, 0);
|
|
264
|
+
this.$l.tGround = rayIntersectSphere(this, pb.vec3(0), this.cloud.layer.z, this.eye, this.dir);
|
|
265
|
+
this.$if(pb.greaterThan(this.tGround, 0), function() {
|
|
266
|
+
this.tMax = pb.min(this.tMax, this.tGround);
|
|
267
|
+
});
|
|
268
|
+
this.$if(pb.or(pb.lessThanEqual(this.tMax, this.tMin), pb.greaterThan(this.tMin, CLOUD_TRACING_START_MAX_DISTANCE)), function() {
|
|
269
|
+
this.$return(pb.vec4(0, 0, 0, 1));
|
|
270
|
+
});
|
|
271
|
+
// TracingMaxDistanceMode 0: distance after the layer entry
|
|
272
|
+
this.tMax = pb.add(this.tMin, pb.min(this.cloud.layer.w, pb.sub(this.tMax, this.tMin)));
|
|
273
|
+
this.$l.stepCount = pb.max(pb.floor(pb.mul(this.cloud.march.x, this.stepScale, pb.clamp(pb.div(pb.sub(this.tMax, this.tMin), CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX), 0, 1))), CLOUD_SAMPLE_COUNT_MIN);
|
|
274
|
+
this.$l.stepT = pb.div(pb.sub(this.tMax, this.tMin), this.stepCount);
|
|
275
|
+
this.$l.iStepCount = pb.int(this.stepCount);
|
|
276
|
+
this.$l.msScatt = this.cloud.ms.x;
|
|
277
|
+
this.$l.msExtin = pb.clamp(this.cloud.ms.y, 0, 1);
|
|
278
|
+
this.$l.cosTheta = pb.dot(this.cloud.sunDir.xyz, this.dir);
|
|
279
|
+
this.$l.phase0 = pb.mix(hgPhase(this, this.cloud.phase.x, this.cosTheta), hgPhase(this, this.cloud.phase.y, this.cosTheta), this.cloud.phase.z);
|
|
280
|
+
// SetupParticipatingMediaPhaseContext
|
|
281
|
+
const isotropic = 1 / (4 * Math.PI);
|
|
282
|
+
this.$l.msPhaseFactor = pb.clamp(this.cloud.ms.z, 0, 1);
|
|
283
|
+
for(let ms = 0; ms < msCount; ms++){
|
|
284
|
+
if (ms === 0) {
|
|
285
|
+
this.$l.phaseMs0 = this.phase0;
|
|
286
|
+
} else {
|
|
287
|
+
this.$l[`phaseMs${ms}`] = pb.mix(isotropic, this.phase0, this.msPhaseFactor);
|
|
288
|
+
this.msPhaseFactor = pb.mul(this.msPhaseFactor, this.msPhaseFactor);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Sun illuminance: outside the atmosphere with per-sample transmittance, else at the eye
|
|
292
|
+
this.$l.perSample = pb.notEqual(this.cloud.sunDir.w, 0);
|
|
293
|
+
this.$l.lightIlluminance = this.cloud.sunIlluminance.xyz;
|
|
294
|
+
this.$if(pb.not(this.perSample), function() {
|
|
295
|
+
this.lightIlluminance = pb.mul(this.lightIlluminance, transmittanceToSky(this, this.atmo, this.eye, this.cloud.sunDir.xyz, textures.transmittanceLut));
|
|
296
|
+
});
|
|
297
|
+
this.$l.luminance = pb.vec3(0);
|
|
298
|
+
this.$l.transmittanceToView = pb.float(1);
|
|
299
|
+
this.$l.tAPWeightedSum = pb.float(0);
|
|
300
|
+
this.$l.tAPWeightsSum = pb.float(0);
|
|
301
|
+
this.$l.t = pb.add(this.tMin, pb.mul(this.jitter, this.stepT));
|
|
302
|
+
this.$l.shadowCount = this.cloud.march.y;
|
|
303
|
+
this.$l.shadowLength = this.cloud.march.z;
|
|
304
|
+
this.$for(pb.int('i'), 0, this.iStepCount, function() {
|
|
305
|
+
this.$l.samplePos = pb.add(this.eye, pb.mul(this.dir, this.t));
|
|
306
|
+
this.$l.medium = density(this, this.samplePos);
|
|
307
|
+
// Conservative density 0 or outside the layer: skip (StepSizeOnZeroConservativeDensity 1)
|
|
308
|
+
this.$if(pb.lessThanEqual(this.medium.y, 0), function() {
|
|
309
|
+
this.t = pb.add(this.t, this.stepT);
|
|
310
|
+
this.$continue();
|
|
311
|
+
});
|
|
312
|
+
this.$l.extinction = this.medium.x;
|
|
313
|
+
this.$l.scattering = pb.mul(this.cloud.albedo.xyz, this.extinction);
|
|
314
|
+
// SetupParticipatingMediaContext
|
|
315
|
+
this.$l.sFactor = this.msScatt;
|
|
316
|
+
this.$l.eFactor = this.msExtin;
|
|
317
|
+
this.$l.atmoTransmittance = pb.vec3(1);
|
|
318
|
+
this.$if(this.perSample, function() {
|
|
319
|
+
this.atmoTransmittance = transmittanceToSky(this, this.atmo, this.samplePos, this.cloud.sunDir.xyz, textures.transmittanceLut);
|
|
320
|
+
});
|
|
321
|
+
for(let ms = 0; ms < msCount; ms++){
|
|
322
|
+
if (ms === 0) {
|
|
323
|
+
this.$l.scat0 = this.scattering;
|
|
324
|
+
this.$l.ext0 = this.extinction;
|
|
325
|
+
} else {
|
|
326
|
+
this.$l[`scat${ms}`] = pb.mul(this[`scat${ms - 1}`], this.sFactor);
|
|
327
|
+
this.$l[`ext${ms}`] = pb.mul(this[`ext${ms - 1}`], this.eFactor);
|
|
328
|
+
this.sFactor = pb.mul(this.sFactor, this.sFactor);
|
|
329
|
+
this.eFactor = pb.mul(this.eFactor, this.eFactor);
|
|
330
|
+
}
|
|
331
|
+
this.$l[`lightT${ms}`] = this.atmoTransmittance;
|
|
332
|
+
}
|
|
333
|
+
this.$l.distantLight = pb.mul(this.ambient, pb.clamp(pb.add(this.cloud.phase.w, this.medium.z), 0, 1));
|
|
334
|
+
this.$if(pb.greaterThan(this.extinction, 0), function() {
|
|
335
|
+
for(let ms = 0; ms < msCount; ms++){
|
|
336
|
+
this.$l[`extAcc${ms}`] = pb.float(0);
|
|
337
|
+
}
|
|
338
|
+
this.$l.prevNormT = pb.float(0);
|
|
339
|
+
this.$for(pb.int('j'), 1, pb.add(pb.int(this.shadowCount), 1), function() {
|
|
340
|
+
this.$l.normT = pb.div(pb.float(this.j), this.shadowCount);
|
|
341
|
+
this.$l.curNormT = pb.mul(this.normT, this.normT);
|
|
342
|
+
this.$l.deltaNormT = pb.sub(this.curNormT, this.prevNormT);
|
|
343
|
+
this.$l.shadowPos = pb.add(this.samplePos, pb.mul(this.cloud.sunDir.xyz, this.shadowLength, pb.add(this.prevNormT, pb.mul(this.deltaNormT, 0.5))));
|
|
344
|
+
this.prevNormT = this.curNormT;
|
|
345
|
+
this.$l.shadowMedium = density(this, this.shadowPos, CLOUD_SHADOW_EDGE_WIDTH);
|
|
346
|
+
this.$if(pb.or(pb.lessThanEqual(this.shadowMedium.z, 0), pb.greaterThanEqual(this.shadowMedium.z, 1)), function() {
|
|
347
|
+
this.$break();
|
|
348
|
+
});
|
|
349
|
+
this.$if(pb.lessThanEqual(this.shadowMedium.y, 0), function() {
|
|
350
|
+
this.$continue();
|
|
351
|
+
});
|
|
352
|
+
this.$l.shadowExt = this.shadowMedium.x;
|
|
353
|
+
this.$l.shadowEFactor = this.msExtin;
|
|
354
|
+
for(let ms = 0; ms < msCount; ms++){
|
|
355
|
+
this[`extAcc${ms}`] = pb.add(this[`extAcc${ms}`], pb.mul(this.shadowExt, this.deltaNormT));
|
|
356
|
+
if (ms + 1 < msCount) {
|
|
357
|
+
this.shadowExt = pb.mul(this.shadowExt, this.shadowEFactor);
|
|
358
|
+
this.shadowEFactor = pb.mul(this.shadowEFactor, this.shadowEFactor);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
for(let ms = 0; ms < msCount; ms++){
|
|
363
|
+
this[`lightT${ms}`] = pb.mul(this[`lightT${ms}`], pb.exp(pb.neg(pb.mul(this[`extAcc${ms}`], this.shadowLength))));
|
|
364
|
+
}
|
|
365
|
+
// Transmittance-weighted depth for the aerial perspective
|
|
366
|
+
this.tAPWeightedSum = pb.add(this.tAPWeightedSum, pb.mul(this.t, this.transmittanceToView));
|
|
367
|
+
this.tAPWeightsSum = pb.add(this.tAPWeightsSum, this.transmittanceToView);
|
|
368
|
+
});
|
|
369
|
+
for(let ms = msCount - 1; ms >= 0; ms--){
|
|
370
|
+
this.$l.sunSky = pb.mul(this[`lightT${ms}`], this.lightIlluminance, this[`phaseMs${ms}`]);
|
|
371
|
+
if (ms === 0) {
|
|
372
|
+
this.sunSky = pb.add(this.sunSky, this.distantLight);
|
|
373
|
+
}
|
|
374
|
+
this.$l.scattered = pb.mul(this.sunSky, this[`scat${ms}`]);
|
|
375
|
+
this.$l.safeExt = pb.max(this[`ext${ms}`], 1e-6);
|
|
376
|
+
this.$l.segT = pb.exp(pb.neg(pb.mul(this.safeExt, this.stepT)));
|
|
377
|
+
this.luminance = pb.add(this.luminance, pb.mul(this.transmittanceToView, pb.div(pb.sub(this.scattered, pb.mul(this.scattered, this.segT)), this.safeExt)));
|
|
378
|
+
if (ms === 0) {
|
|
379
|
+
this.transmittanceToView = pb.mul(this.transmittanceToView, this.segT);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
this.$if(pb.lessThan(this.transmittanceToView, this.cloud.march.w), function() {
|
|
383
|
+
this.$break();
|
|
384
|
+
});
|
|
385
|
+
this.t = pb.add(this.t, this.stepT);
|
|
386
|
+
});
|
|
387
|
+
// Aerial perspective at the mean cloud depth, integrated along the direction since
|
|
388
|
+
// the cache covers directions outside any camera's AP froxel volume
|
|
389
|
+
this.$if(pb.greaterThan(this.tAPWeightsSum, 0), function() {
|
|
390
|
+
this.$l.tAP = pb.div(this.tAPWeightedSum, pb.max(this.tAPWeightsSum, 1e-10));
|
|
391
|
+
this.$l.ap = getSkyView(this, this.atmo, this.eye, this.dir, this.tAP, textures.transmittanceLut, textures.multiScatteringLut);
|
|
392
|
+
this.luminance = pb.add(pb.mul(this.ap.rgb, pb.sub(1, this.transmittanceToView)), pb.mul(this.luminance, this.ap.a));
|
|
393
|
+
});
|
|
394
|
+
this.$return(pb.vec4(this.luminance, this.transmittanceToView));
|
|
395
|
+
});
|
|
396
|
+
return pb.getGlobalScope()[funcName](atmosphere, cloud, dir, jitter, stepScale, ambient);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Average sky luminance over the sphere at the distant sky light altitude.
|
|
400
|
+
* @internal
|
|
401
|
+
*/ function cloudDistantSkyLight(scope, atmosphere, sphereSamples, transmittanceLut, multiScatteringLut) {
|
|
402
|
+
const pb = scope.$builder;
|
|
403
|
+
const AtmosphereParams = getAtmosphereParamsStruct(pb);
|
|
404
|
+
const funcName = 'Z_cloudDistantSkyLight';
|
|
405
|
+
pb.func(funcName, [
|
|
406
|
+
AtmosphereParams('atmo')
|
|
407
|
+
], function() {
|
|
408
|
+
this.$l.pos = pb.vec3(0, pb.add(this.atmo.plantRadius, CLOUD_DISTANT_SKY_LIGHT_ALTITUDE), 0);
|
|
409
|
+
this.$l.sum = pb.vec3(0);
|
|
410
|
+
this.$for(pb.int('i'), 0, 64, function() {
|
|
411
|
+
this.sum = pb.add(this.sum, getSkyView(this, this.atmo, this.pos, sphereSamples.at(this.i).xyz, pb.float(-1), transmittanceLut, multiScatteringLut, false).rgb);
|
|
412
|
+
});
|
|
413
|
+
// sum * (4 pi / 64) * (1 / (4 pi))
|
|
414
|
+
this.$return(pb.div(this.sum, 64));
|
|
415
|
+
});
|
|
416
|
+
return pb.getGlobalScope()[funcName](atmosphere);
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Elevation of the cached sky remapped so [-delta, pi/2] fills the hemisphere: the cache also
|
|
420
|
+
* holds clouds a raised observer sees below the horizon.
|
|
421
|
+
*/ function remapElevation(pb, elevation, delta, encode) {
|
|
422
|
+
const span = pb.add(Math.PI / 2, delta);
|
|
423
|
+
return encode ? pb.mul(pb.div(pb.add(elevation, delta), span), Math.PI / 2) : pb.sub(pb.mul(pb.div(elevation, Math.PI / 2), span), delta);
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Observer-local direction to cloud cache uv: the upper hemisphere octahedron rotated 45 degrees
|
|
427
|
+
* to fill the square (clayjohn clouds.gdshader vec3_to_oct, after J. White, "Signed Octahedron
|
|
428
|
+
* Normal Encoding"), elevation remapped by `delta`. Directions below -delta are clamped to it.
|
|
429
|
+
* @internal
|
|
430
|
+
*/ function cloudCacheEncode(scope, dir, delta) {
|
|
431
|
+
const pb = scope.$builder;
|
|
432
|
+
const funcName = 'Z_cloudCacheEncode';
|
|
433
|
+
pb.func(funcName, [
|
|
434
|
+
pb.vec3('d'),
|
|
435
|
+
pb.float('delta')
|
|
436
|
+
], function() {
|
|
437
|
+
this.$l.horizontal = pb.length(this.d.xz);
|
|
438
|
+
this.$l.azimuth = this.$choice(pb.greaterThan(this.horizontal, 1e-6), pb.div(this.d.xz, this.horizontal), pb.vec2(1, 0));
|
|
439
|
+
this.$l.elevation = pb.asin(pb.clamp(this.d.y, -1, 1));
|
|
440
|
+
this.elevation = pb.clamp(remapElevation(pb, this.elevation, this.delta, true), 0, Math.PI / 2);
|
|
441
|
+
// Octahedron frame: x, y horizontal, z up
|
|
442
|
+
this.$l.e = pb.vec3(pb.mul(this.azimuth, pb.cos(this.elevation)), pb.sin(this.elevation));
|
|
443
|
+
this.e = pb.div(this.e, pb.add(pb.abs(this.e.x), pb.abs(this.e.y), pb.abs(this.e.z)));
|
|
444
|
+
this.$return(pb.vec2(pb.add(0.5, pb.mul(pb.add(this.e.x, this.e.y), 0.5)), pb.add(0.5, pb.mul(pb.sub(this.e.y, this.e.x), 0.5))));
|
|
445
|
+
});
|
|
446
|
+
return pb.getGlobalScope()[funcName](dir, delta);
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Cloud cache uv to observer-local direction, inverse of {@link cloudCacheEncode}
|
|
450
|
+
* (clayjohn clouds.glsl oct_to_vec3).
|
|
451
|
+
* @internal
|
|
452
|
+
*/ function cloudCacheDecode(scope, uv, delta) {
|
|
453
|
+
const pb = scope.$builder;
|
|
454
|
+
const funcName = 'Z_cloudCacheDecode';
|
|
455
|
+
pb.func(funcName, [
|
|
456
|
+
pb.vec2('uv'),
|
|
457
|
+
pb.float('delta')
|
|
458
|
+
], function() {
|
|
459
|
+
this.$l.n = pb.vec3(pb.sub(this.uv.x, this.uv.y), pb.sub(pb.add(this.uv.x, this.uv.y), 1), 0);
|
|
460
|
+
this.n.z = pb.max(pb.sub(pb.sub(1, pb.abs(this.n.x)), pb.abs(this.n.y)), 0);
|
|
461
|
+
this.n = pb.normalize(this.n);
|
|
462
|
+
this.$l.elevation = remapElevation(pb, pb.asin(this.n.z), this.delta, false);
|
|
463
|
+
this.$l.horizontal = pb.length(this.n.xy);
|
|
464
|
+
this.$l.azimuth = this.$choice(pb.greaterThan(this.horizontal, 1e-6), pb.div(this.n.xy, this.horizontal), pb.vec2(1, 0));
|
|
465
|
+
this.$l.c = pb.cos(this.elevation);
|
|
466
|
+
this.$return(pb.vec3(pb.mul(this.azimuth.x, this.c), pb.sin(this.elevation), pb.mul(this.azimuth.y, this.c)));
|
|
467
|
+
});
|
|
468
|
+
return pb.getGlobalScope()[funcName](uv, delta);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
export { CLOUD_BASE_SHADOW_SAMPLE_COUNT, CLOUD_BASE_VIEW_SAMPLE_COUNT, CLOUD_BOTTOM_TRANSITION_METERS, CLOUD_COVERAGE_BASE_RANGE, CLOUD_COVERAGE_RAMP, CLOUD_DETAIL_EROSION, CLOUD_DETAIL_RANGE, CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX, CLOUD_DISTANT_SKY_LIGHT_ALTITUDE, CLOUD_EDGE_WIDTH, CLOUD_SAMPLE_COUNT_MIN, CLOUD_SHADOW_EDGE_WIDTH, CLOUD_SHADOW_SAMPLE_COUNT_MAX, CLOUD_SHAPE_EROSION, CLOUD_TOP_OFFSET, CLOUD_TRACING_START_MAX_DISTANCE, CLOUD_VIEW_SAMPLE_COUNT_MAX, cloudCacheDecode, cloudCacheEncode, cloudCoverageThreshold, cloudDistantSkyLight, cloudHeightProfile, cloudSampleDensity, cloudTrace, getCloudParamsStruct };
|
|
472
|
+
//# sourceMappingURL=cloud_common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud_common.js","sources":["../../../src/render/volumetric_cloud/cloud_common.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, ProgramBuilder } from '@zephyr3d/device';\r\nimport type { CloudFormation } from './volumetric_cloud';\r\nimport {\r\n getAtmosphereParamsStruct,\r\n getSkyView,\r\n rayIntersectSphere,\r\n transmittanceToSky\r\n} from '../../shaders/atmosphere';\r\n\r\n/** @internal */\r\nexport const CLOUD_SAMPLE_COUNT_MIN = 2;\r\n/** @internal */\r\nexport const CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX = 15000;\r\n/** @internal */\r\nexport const CLOUD_TRACING_START_MAX_DISTANCE = 350000;\r\n/** @internal */\r\nexport const CLOUD_BASE_VIEW_SAMPLE_COUNT = 96;\r\n/** @internal */\r\nexport const CLOUD_VIEW_SAMPLE_COUNT_MAX = 768;\r\n/** @internal */\r\nexport const CLOUD_BASE_SHADOW_SAMPLE_COUNT = 10;\r\n/** @internal */\r\nexport const CLOUD_SHADOW_SAMPLE_COUNT_MAX = 80;\r\n/** @internal */\r\nexport const CLOUD_DISTANT_SKY_LIGHT_ALTITUDE = 6000;\r\n/**\r\n * 5th/95th percentiles of the generated Perlin-Worley base shape (seeds 0-2), remapped to [0, 1].\r\n * Imported volumes may have another range.\r\n */\r\nexport const CLOUD_COVERAGE_BASE_RANGE = [0.1552, 0.4032];\r\n/** 5th/95th percentiles of the generated detail fbm (0.625 R + 0.25 G + 0.125 B), remapped to [0, 1]. */\r\nexport const CLOUD_DETAIL_RANGE = [0.53, 0.85];\r\n/** Largest envelope erosion by the base noise; envelope values above it stay solid. */\r\nexport const CLOUD_SHAPE_EROSION = 0.6;\r\n/** Largest envelope erosion by the detail noise, at detail erosion 1. */\r\nexport const CLOUD_DETAIL_EROSION = 0.4;\r\n/** Envelope margin over which the density rises from 0 to 1 below the cloud surface. */\r\nexport const CLOUD_EDGE_WIDTH = 0.35;\r\n/**\r\n * Softer edge for the march towards the sun: its few unjittered x^2 samples would otherwise\r\n * streak the lighting along the sun direction.\r\n */\r\nexport const CLOUD_SHADOW_EDGE_WIDTH = 0.7;\r\n/** Weather value range over which the local coverage ramps from 0 to 1. */\r\nexport const CLOUD_COVERAGE_RAMP = 0.4;\r\n/**\r\n * Weather threshold of a global coverage: connected can fill the map, isolated keeps its gaps.\r\n * @internal\r\n */\r\nexport function cloudCoverageThreshold(coverage: number, formation: CloudFormation) {\r\n const c = Math.min(1, Math.max(0, coverage));\r\n return 1 - c * (formation === 'connected' ? 1 + CLOUD_COVERAGE_RAMP : 1);\r\n}\r\n/** Width of the cloud base transition, in meters. */\r\nexport const CLOUD_BOTTOM_TRANSITION_METERS = 150;\r\n/** [Schneider15] cloud_top_offset: how far the wind pushes cloud tops ahead of their base, in meters */\r\nexport const CLOUD_TOP_OFFSET = 500;\r\n\r\n/**\r\n * Uniform block of the cloud passes.\r\n * @internal\r\n */\r\nexport function getCloudParamsStruct(pb: ProgramBuilder) {\r\n return pb.defineStruct([\r\n // World (planet-fixed) to observer-local rotation the trace was set up with\r\n pb.mat4('referential'),\r\n // (bottom radius, top radius, planet radius, tracing max distance)\r\n pb.vec4('layer'),\r\n // (view sample count max, shadow sample count max, shadow tracing distance, stop transmittance)\r\n pb.vec4('march'),\r\n // (observer-local eye position, 0)\r\n pb.vec4('eye'),\r\n // (direction to the sun, per-sample atmosphere transmittance 0/1)\r\n pb.vec4('sunDir'),\r\n // (sun illuminance outside the atmosphere, 0)\r\n pb.vec4('sunIlluminance'),\r\n // (phase g, phase g2, phase blend, sky light bottom visibility)\r\n pb.vec4('phase'),\r\n // (multiple scattering contribution, occlusion, eccentricity, 0)\r\n pb.vec4('ms'),\r\n // (weather coverage threshold, extinction per meter, detail erosion, anvil bias)\r\n pb.vec4('density'),\r\n // (base noise shaping strength, bottom detail erosion multiplier, global coverage, base variation meters)\r\n pb.vec4('shape'),\r\n // (albedo, 0)\r\n pb.vec4('albedo'),\r\n // (1 / weather map scale, 1 / base noise scale, 1 / detail noise scale, cloud top offset)\r\n pb.vec4('scales'),\r\n // (wind offset of the noise in planet-fixed meters, 0)\r\n pb.vec4('windOffset'),\r\n // (horizontal wind direction x, z, formation: 0 connected / 1 isolated, 0)\r\n pb.vec4('windDir')\r\n ]);\r\n}\r\n\r\n/**\r\n * Both roots of a ray / origin-centred sphere intersection, (-1, -1) when missed.\r\n */\r\nfunction raySphereSolutions(\r\n scope: PBInsideFunctionScope,\r\n origin: PBShaderExp,\r\n dir: PBShaderExp,\r\n radius: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudRaySphereSolutions';\r\n pb.func(funcName, [pb.vec3('o'), pb.vec3('d'), pb.float('r')], function () {\r\n this.$l.b = pb.dot(this.o, this.d);\r\n this.$l.c = pb.sub(pb.dot(this.o, this.o), pb.mul(this.r, this.r));\r\n this.$l.disc = pb.sub(pb.mul(this.b, this.b), this.c);\r\n this.$if(pb.lessThan(this.disc, 0), function () {\r\n this.$return(pb.vec2(-1));\r\n });\r\n this.$l.s = pb.sqrt(this.disc);\r\n this.$return(pb.vec2(pb.sub(pb.neg(this.b), this.s), pb.add(pb.neg(this.b), this.s)));\r\n });\r\n return pb.getGlobalScope()[funcName](origin, dir, radius) as PBShaderExp;\r\n}\r\n\r\n/** Henyey-Greenstein with the forward peak where the view looks into the light. */\r\nfunction hgPhase(scope: PBInsideFunctionScope, g: PBShaderExp, cosTheta: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudHGPhase';\r\n pb.func(funcName, [pb.float('g'), pb.float('c')], function () {\r\n this.$l.numer = pb.sub(1, pb.mul(this.g, this.g));\r\n this.$l.denom = pb.max(pb.sub(pb.add(1, pb.mul(this.g, this.g)), pb.mul(this.g, this.c, 2)), 1e-6);\r\n this.$return(pb.div(this.numer, pb.mul(4 * Math.PI, this.denom, pb.sqrt(this.denom))));\r\n });\r\n return pb.getGlobalScope()[funcName](g, cosTheta) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Returns (height profile, height within the cloud type, bottom ramp, top cut) for a cloud type\r\n * of 0 (stratus), 0.5 (stratocumulus) or 1 (cumulus), the base lifted by `baseOffsetMeters`.\r\n * @internal\r\n */\r\nexport function cloudHeightProfile(\r\n scope: PBInsideFunctionScope,\r\n heightFrac: PBShaderExp,\r\n cloudType: PBShaderExp,\r\n layerHeight: PBShaderExp,\r\n baseOffsetMeters: PBShaderExp | number = 0\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudVerticalProfile';\r\n pb.func(\r\n funcName,\r\n [pb.float('h'), pb.float('t'), pb.float('layerHeight'), pb.float('baseOffsetMeters')],\r\n function () {\r\n this.$l.cloudType = pb.clamp(this.t, 0, 1);\r\n this.$l.stratus = pb.sub(1, pb.clamp(pb.mul(this.cloudType, 2), 0, 1));\r\n this.$l.stratocumulus = pb.sub(1, pb.mul(pb.abs(pb.sub(this.cloudType, 0.5)), 2));\r\n this.$l.cumulus = pb.mul(pb.clamp(pb.sub(this.cloudType, 0.5), 0, 1), 2);\r\n // (base, nominal end of the bottom ramp, start of the top falloff, top)\r\n this.$l.g = pb.add(\r\n pb.mul(pb.vec4(0, 0.05, 0.09, 0.11), this.stratus),\r\n pb.mul(pb.vec4(0, 0.2, 0.2, 0.625), this.stratocumulus),\r\n pb.mul(pb.vec4(0, 0.0625, 0.2, 1), this.cumulus)\r\n );\r\n this.$l.bottomWidth = pb.min(\r\n pb.min(this.g.y, pb.div(CLOUD_BOTTOM_TRANSITION_METERS, pb.max(this.layerHeight, 1))),\r\n pb.mul(this.g.w, 0.15)\r\n );\r\n this.$l.localBase = pb.clamp(\r\n pb.div(this.baseOffsetMeters, pb.max(this.layerHeight, 1)),\r\n 0,\r\n pb.mul(this.g.w, 0.25)\r\n );\r\n this.$l.bottom = pb.smoothStep(\r\n this.localBase,\r\n pb.add(this.localBase, pb.max(this.bottomWidth, 1e-6)),\r\n this.h\r\n );\r\n this.$l.top = pb.sub(1, pb.smoothStep(this.g.z, this.g.w, this.h));\r\n this.$return(\r\n pb.vec4(\r\n pb.mul(this.bottom, this.top),\r\n pb.clamp(\r\n pb.div(pb.sub(this.h, this.localBase), pb.max(pb.sub(this.g.w, this.localBase), 1e-6)),\r\n 0,\r\n 1\r\n ),\r\n this.bottom,\r\n pb.sub(1, this.top)\r\n )\r\n );\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](heightFrac, cloudType, layerHeight, baseOffsetMeters) as PBShaderExp;\r\n}\r\n\r\n/** remap(v, l0, h0, l1, h1) of [Schneider15] */\r\nfunction remap(\r\n pb: ProgramBuilder,\r\n v: PBShaderExp | number,\r\n l0: PBShaderExp | number,\r\n h0: PBShaderExp | number,\r\n l1: number,\r\n h1: number\r\n) {\r\n return pb.add(l1, pb.mul(pb.div(pb.sub(v, l0), pb.sub(h0, l0)), h1 - l1));\r\n}\r\n\r\n/**\r\n * Cloud medium at an observer-local position.\r\n *\r\n * Returns (extinction per meter, conservative density, normalized altitude in the layer,\r\n * altitude in the layer in meters). The conservative density omits the detail erosion, so a\r\n * zero lets the march skip the sample.\r\n *\r\n * envelope = bottom(h) * max(coverage - topCut(h), 0)\r\n * margin = envelope - shape * CLOUD_SHAPE_EROSION * (1 - baseNoise)\r\n * - detail * CLOUD_DETAIL_EROSION * detailModifier\r\n * density = saturate(margin / edgeWidth)\r\n *\r\n * @internal\r\n */\r\nexport function cloudSampleDensity(\r\n scope: PBInsideFunctionScope,\r\n cloud: PBShaderExp,\r\n pos: PBShaderExp,\r\n weatherMap: PBShaderExp,\r\n baseNoise: PBShaderExp,\r\n detailNoise: PBShaderExp,\r\n stage: 'profile' | 'base' | 'density' = 'density',\r\n edgeWidth = CLOUD_EDGE_WIDTH\r\n) {\r\n const pb = scope.$builder;\r\n const CloudParams = getCloudParamsStruct(pb);\r\n const funcName = `Z_cloudSampleDensity_${stage}${edgeWidth === CLOUD_EDGE_WIDTH ? '' : '_shadow'}`;\r\n pb.func(funcName, [CloudParams('cloud'), pb.vec3('p')], function () {\r\n this.$l.r = pb.length(this.p);\r\n this.$l.altInLayer = pb.sub(this.r, this.cloud.layer.x);\r\n this.$l.h = pb.div(this.altInLayer, pb.sub(this.cloud.layer.y, this.cloud.layer.x));\r\n this.$if(\r\n pb.or(\r\n pb.lessThanEqual(this.cloud.shape.z, 0),\r\n pb.lessThanEqual(this.h, 0),\r\n pb.greaterThanEqual(this.h, 1)\r\n ),\r\n function () {\r\n this.$return(pb.vec4(0, 0, this.h, this.altInLayer));\r\n }\r\n );\r\n // Planet-fixed position, altitude as height so the noise follows the curvature\r\n this.$l.planet = pb.mul(pb.vec4(this.p, 0), this.cloud.referential).xyz;\r\n this.$l.q = pb.vec3(this.planet.x, pb.sub(this.r, this.cloud.layer.z), this.planet.z);\r\n // Tops skewed along the wind (Nubis 2017); the noise drifts, the coverage stays put\r\n this.q = pb.add(\r\n this.q,\r\n pb.mul(pb.vec3(this.cloud.windDir.x, 0, this.cloud.windDir.y), pb.mul(this.cloud.scales.w, this.h))\r\n );\r\n this.$l.weather = pb.clamp(\r\n pb.textureSampleLevel(weatherMap, pb.mul(this.q.xz, this.cloud.scales.x), 0),\r\n pb.vec4(0),\r\n pb.vec4(1)\r\n );\r\n this.q = pb.add(this.q, this.cloud.windOffset.xyz);\r\n this.$l.coverage = pb.clamp(\r\n pb.div(\r\n pb.sub(pb.mix(this.weather.r, this.weather.g, this.cloud.windDir.z), this.cloud.density.x),\r\n CLOUD_COVERAGE_RAMP\r\n ),\r\n 0,\r\n 1\r\n );\r\n // Anvils: coverage inflated towards the layer top (Nubis 2017)\r\n this.coverage = pb.pow(\r\n this.coverage,\r\n pb.mix(1, pb.mix(1, 0.5, this.cloud.density.w), pb.clamp(pb.mul(pb.sub(this.h, 0.7), 10), 0, 1))\r\n );\r\n this.$if(pb.lessThanEqual(this.coverage, 0), function () {\r\n this.$return(pb.vec4(0, 0, this.h, this.altInLayer));\r\n });\r\n // Base lift: higher for cumulus and towards the footprint edges\r\n this.$l.baseOffset = pb.mul(\r\n this.cloud.shape.w,\r\n pb.add(0.15, pb.mul(this.weather.b, 0.45), pb.mul(pb.sub(1, this.coverage), 0.4))\r\n );\r\n this.$l.heightProfile = cloudHeightProfile(\r\n this,\r\n this.h,\r\n this.weather.b,\r\n pb.sub(this.cloud.layer.y, this.cloud.layer.x),\r\n this.baseOffset\r\n );\r\n this.$l.profile = pb.mul(this.heightProfile.z, pb.max(pb.sub(this.coverage, this.heightProfile.w), 0));\r\n if (stage === 'profile') {\r\n this.$return(\r\n pb.vec4(pb.mul(this.profile, this.cloud.density.y), this.profile, this.h, this.altInLayer)\r\n );\r\n return;\r\n }\r\n this.$l.noise = pb.float(1);\r\n this.$if(pb.greaterThan(this.cloud.shape.x, 0), function () {\r\n this.$l.n = pb.textureSampleLevel(baseNoise, pb.mul(this.q, this.cloud.scales.y), 0);\r\n this.$l.lowFbm = pb.add(pb.mul(this.n.g, 0.625), pb.mul(this.n.b, 0.25), pb.mul(this.n.a, 0.125));\r\n this.$l.rawBase = remap(pb, this.n.r, pb.sub(this.lowFbm, 1), 1, 0, 1);\r\n this.noise = pb.clamp(\r\n remap(pb, this.rawBase, CLOUD_COVERAGE_BASE_RANGE[0], CLOUD_COVERAGE_BASE_RANGE[1], 0, 1),\r\n 0,\r\n 1\r\n );\r\n });\r\n this.$l.margin = pb.sub(\r\n this.profile,\r\n pb.mul(this.cloud.shape.x, CLOUD_SHAPE_EROSION, pb.sub(1, this.noise))\r\n );\r\n this.$l.base = pb.clamp(pb.div(this.margin, edgeWidth), 0, 1);\r\n this.$if(pb.lessThanEqual(this.base, 0), function () {\r\n this.$return(pb.vec4(0, 0, this.h, this.altInLayer));\r\n });\r\n if (stage === 'base') {\r\n this.$return(pb.vec4(pb.mul(this.base, this.cloud.density.y), this.base, this.h, this.altInLayer));\r\n return;\r\n }\r\n this.$if(pb.lessThanEqual(this.cloud.density.z, 0), function () {\r\n this.$return(pb.vec4(pb.mul(this.base, this.cloud.density.y), this.base, this.h, this.altInLayer));\r\n });\r\n this.$l.d = pb.textureSampleLevel(detailNoise, pb.mul(this.q, this.cloud.scales.z), 0).rgb;\r\n this.$l.highFbm = pb.clamp(\r\n remap(\r\n pb,\r\n pb.add(pb.mul(this.d.r, 0.625), pb.mul(this.d.g, 0.25), pb.mul(this.d.b, 0.125)),\r\n CLOUD_DETAIL_RANGE[0],\r\n CLOUD_DETAIL_RANGE[1],\r\n 0,\r\n 1\r\n ),\r\n 0,\r\n 1\r\n );\r\n // Wispy at the base, billowy above\r\n this.$l.modifier = pb.mix(\r\n this.highFbm,\r\n pb.sub(1, this.highFbm),\r\n pb.clamp(pb.mul(this.heightProfile.y, 10), 0, 1)\r\n );\r\n this.$l.bottomErosion = pb.mix(this.cloud.shape.y, 1, pb.smoothStep(0, 0.25, this.heightProfile.y));\r\n this.margin = pb.sub(\r\n this.margin,\r\n pb.mul(this.modifier, this.cloud.density.z, this.bottomErosion, CLOUD_DETAIL_EROSION)\r\n );\r\n this.$l.eroded = pb.clamp(pb.div(this.margin, edgeWidth), 0, 1);\r\n this.$return(pb.vec4(pb.mul(this.eroded, this.cloud.density.y), this.base, this.h, this.altInLayer));\r\n });\r\n return pb.getGlobalScope()[funcName](cloud, pos) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Traces the clouds along one view ray from the cloud eye position.\r\n *\r\n * Returns (scattered luminance with aerial perspective, mean transmittance), the luminance in the\r\n * units of the atmosphere (`params.lightColor`) so it composites directly over `skyBox()`:\r\n * `sky * a + rgb`.\r\n *\r\n * @param msCount - 1 + multiple scattering octaves, compile time\r\n * @param jitter - start offset of the march in steps, 0..1\r\n * @param stepScale - scales the sample count, below 1 for quick previews\r\n * @internal\r\n */\r\nexport function cloudTrace(\r\n scope: PBInsideFunctionScope,\r\n msCount: number,\r\n atmosphere: PBShaderExp,\r\n cloud: PBShaderExp,\r\n dir: PBShaderExp,\r\n jitter: PBShaderExp,\r\n stepScale: PBShaderExp,\r\n ambient: PBShaderExp,\r\n textures: {\r\n weatherMap: PBShaderExp;\r\n baseNoise: PBShaderExp;\r\n detailNoise: PBShaderExp;\r\n transmittanceLut: PBShaderExp;\r\n multiScatteringLut: PBShaderExp;\r\n }\r\n) {\r\n const pb = scope.$builder;\r\n const AtmosphereParams = getAtmosphereParamsStruct(pb);\r\n const CloudParams = getCloudParamsStruct(pb);\r\n const funcName = `Z_cloudTrace${msCount}`;\r\n const density = (s: PBInsideFunctionScope, p: PBShaderExp, edgeWidth = CLOUD_EDGE_WIDTH) =>\r\n cloudSampleDensity(\r\n s,\r\n s.cloud,\r\n p,\r\n textures.weatherMap,\r\n textures.baseNoise,\r\n textures.detailNoise,\r\n 'density',\r\n edgeWidth\r\n );\r\n pb.func(\r\n funcName,\r\n [\r\n AtmosphereParams('atmo'),\r\n CloudParams('cloud'),\r\n pb.vec3('dir'),\r\n pb.float('jitter'),\r\n pb.float('stepScale'),\r\n pb.vec3('ambient')\r\n ],\r\n function () {\r\n this.$l.eye = this.cloud.eye.xyz;\r\n this.$l.tTop2 = raySphereSolutions(this, this.eye, this.dir, this.cloud.layer.y);\r\n this.$l.tBottom2 = raySphereSolutions(this, this.eye, this.dir, this.cloud.layer.x);\r\n this.$l.tMin = pb.float(0);\r\n this.$l.tMax = pb.float(0);\r\n this.$if(pb.and(pb.lessThan(this.tTop2.x, 0), pb.lessThan(this.tTop2.y, 0)), function () {\r\n this.$return(pb.vec4(0, 0, 0, 1));\r\n });\r\n this.$if(pb.greaterThan(pb.abs(pb.sub(this.tBottom2.x, this.tBottom2.y)), 0), function () {\r\n this.$l.bottomBothAhead = pb.all(pb.greaterThan(this.tBottom2, pb.vec2(0)));\r\n this.$l.tempTop = this.$choice(\r\n pb.all(pb.greaterThan(this.tTop2, pb.vec2(0))),\r\n pb.min(this.tTop2.x, this.tTop2.y),\r\n pb.max(this.tTop2.x, this.tTop2.y)\r\n );\r\n this.$l.tempBottom = this.$choice(\r\n this.bottomBothAhead,\r\n pb.min(this.tBottom2.x, this.tBottom2.y),\r\n pb.max(this.tBottom2.x, this.tBottom2.y)\r\n );\r\n this.$if(this.bottomBothAhead, function () {\r\n this.tempTop = pb.max(0, pb.min(this.tTop2.x, this.tTop2.y));\r\n });\r\n this.tMin = pb.min(this.tempBottom, this.tempTop);\r\n this.tMax = pb.max(this.tempBottom, this.tempTop);\r\n }).$else(function () {\r\n this.tMin = this.tTop2.x;\r\n this.tMax = this.tTop2.y;\r\n });\r\n this.tMin = pb.max(this.tMin, 0);\r\n this.tMax = pb.max(this.tMax, 0);\r\n this.$l.tGround = rayIntersectSphere(this, pb.vec3(0), this.cloud.layer.z, this.eye, this.dir);\r\n this.$if(pb.greaterThan(this.tGround, 0), function () {\r\n this.tMax = pb.min(this.tMax, this.tGround);\r\n });\r\n this.$if(\r\n pb.or(\r\n pb.lessThanEqual(this.tMax, this.tMin),\r\n pb.greaterThan(this.tMin, CLOUD_TRACING_START_MAX_DISTANCE)\r\n ),\r\n function () {\r\n this.$return(pb.vec4(0, 0, 0, 1));\r\n }\r\n );\r\n // TracingMaxDistanceMode 0: distance after the layer entry\r\n this.tMax = pb.add(this.tMin, pb.min(this.cloud.layer.w, pb.sub(this.tMax, this.tMin)));\r\n this.$l.stepCount = pb.max(\r\n pb.floor(\r\n pb.mul(\r\n this.cloud.march.x,\r\n this.stepScale,\r\n pb.clamp(pb.div(pb.sub(this.tMax, this.tMin), CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX), 0, 1)\r\n )\r\n ),\r\n CLOUD_SAMPLE_COUNT_MIN\r\n );\r\n this.$l.stepT = pb.div(pb.sub(this.tMax, this.tMin), this.stepCount);\r\n this.$l.iStepCount = pb.int(this.stepCount);\r\n\r\n this.$l.msScatt = this.cloud.ms.x;\r\n this.$l.msExtin = pb.clamp(this.cloud.ms.y, 0, 1);\r\n this.$l.cosTheta = pb.dot(this.cloud.sunDir.xyz, this.dir);\r\n this.$l.phase0 = pb.mix(\r\n hgPhase(this, this.cloud.phase.x, this.cosTheta),\r\n hgPhase(this, this.cloud.phase.y, this.cosTheta),\r\n this.cloud.phase.z\r\n );\r\n // SetupParticipatingMediaPhaseContext\r\n const isotropic = 1 / (4 * Math.PI);\r\n this.$l.msPhaseFactor = pb.clamp(this.cloud.ms.z, 0, 1);\r\n for (let ms = 0; ms < msCount; ms++) {\r\n if (ms === 0) {\r\n this.$l.phaseMs0 = this.phase0;\r\n } else {\r\n this.$l[`phaseMs${ms}`] = pb.mix(isotropic, this.phase0, this.msPhaseFactor);\r\n this.msPhaseFactor = pb.mul(this.msPhaseFactor, this.msPhaseFactor);\r\n }\r\n }\r\n // Sun illuminance: outside the atmosphere with per-sample transmittance, else at the eye\r\n this.$l.perSample = pb.notEqual(this.cloud.sunDir.w, 0);\r\n this.$l.lightIlluminance = this.cloud.sunIlluminance.xyz;\r\n this.$if(pb.not(this.perSample), function () {\r\n this.lightIlluminance = pb.mul(\r\n this.lightIlluminance,\r\n transmittanceToSky(this, this.atmo, this.eye, this.cloud.sunDir.xyz, textures.transmittanceLut)\r\n );\r\n });\r\n\r\n this.$l.luminance = pb.vec3(0);\r\n this.$l.transmittanceToView = pb.float(1);\r\n this.$l.tAPWeightedSum = pb.float(0);\r\n this.$l.tAPWeightsSum = pb.float(0);\r\n this.$l.t = pb.add(this.tMin, pb.mul(this.jitter, this.stepT));\r\n this.$l.shadowCount = this.cloud.march.y;\r\n this.$l.shadowLength = this.cloud.march.z;\r\n this.$for(pb.int('i'), 0, this.iStepCount, function () {\r\n this.$l.samplePos = pb.add(this.eye, pb.mul(this.dir, this.t));\r\n this.$l.medium = density(this, this.samplePos);\r\n // Conservative density 0 or outside the layer: skip (StepSizeOnZeroConservativeDensity 1)\r\n this.$if(pb.lessThanEqual(this.medium.y, 0), function () {\r\n this.t = pb.add(this.t, this.stepT);\r\n this.$continue();\r\n });\r\n this.$l.extinction = this.medium.x;\r\n this.$l.scattering = pb.mul(this.cloud.albedo.xyz, this.extinction);\r\n // SetupParticipatingMediaContext\r\n this.$l.sFactor = this.msScatt;\r\n this.$l.eFactor = this.msExtin;\r\n this.$l.atmoTransmittance = pb.vec3(1);\r\n this.$if(this.perSample, function () {\r\n this.atmoTransmittance = transmittanceToSky(\r\n this,\r\n this.atmo,\r\n this.samplePos,\r\n this.cloud.sunDir.xyz,\r\n textures.transmittanceLut\r\n );\r\n });\r\n for (let ms = 0; ms < msCount; ms++) {\r\n if (ms === 0) {\r\n this.$l.scat0 = this.scattering;\r\n this.$l.ext0 = this.extinction;\r\n } else {\r\n this.$l[`scat${ms}`] = pb.mul(this[`scat${ms - 1}`], this.sFactor);\r\n this.$l[`ext${ms}`] = pb.mul(this[`ext${ms - 1}`], this.eFactor);\r\n this.sFactor = pb.mul(this.sFactor, this.sFactor);\r\n this.eFactor = pb.mul(this.eFactor, this.eFactor);\r\n }\r\n this.$l[`lightT${ms}`] = this.atmoTransmittance;\r\n }\r\n this.$l.distantLight = pb.mul(\r\n this.ambient,\r\n pb.clamp(pb.add(this.cloud.phase.w, this.medium.z), 0, 1)\r\n );\r\n this.$if(pb.greaterThan(this.extinction, 0), function () {\r\n for (let ms = 0; ms < msCount; ms++) {\r\n this.$l[`extAcc${ms}`] = pb.float(0);\r\n }\r\n this.$l.prevNormT = pb.float(0);\r\n this.$for(pb.int('j'), 1, pb.add(pb.int(this.shadowCount), 1), function () {\r\n this.$l.normT = pb.div(pb.float(this.j), this.shadowCount);\r\n this.$l.curNormT = pb.mul(this.normT, this.normT);\r\n this.$l.deltaNormT = pb.sub(this.curNormT, this.prevNormT);\r\n this.$l.shadowPos = pb.add(\r\n this.samplePos,\r\n pb.mul(\r\n this.cloud.sunDir.xyz,\r\n this.shadowLength,\r\n pb.add(this.prevNormT, pb.mul(this.deltaNormT, 0.5))\r\n )\r\n );\r\n this.prevNormT = this.curNormT;\r\n this.$l.shadowMedium = density(this, this.shadowPos, CLOUD_SHADOW_EDGE_WIDTH);\r\n this.$if(\r\n pb.or(pb.lessThanEqual(this.shadowMedium.z, 0), pb.greaterThanEqual(this.shadowMedium.z, 1)),\r\n function () {\r\n this.$break();\r\n }\r\n );\r\n this.$if(pb.lessThanEqual(this.shadowMedium.y, 0), function () {\r\n this.$continue();\r\n });\r\n this.$l.shadowExt = this.shadowMedium.x;\r\n this.$l.shadowEFactor = this.msExtin;\r\n for (let ms = 0; ms < msCount; ms++) {\r\n this[`extAcc${ms}`] = pb.add(this[`extAcc${ms}`], pb.mul(this.shadowExt, this.deltaNormT));\r\n if (ms + 1 < msCount) {\r\n this.shadowExt = pb.mul(this.shadowExt, this.shadowEFactor);\r\n this.shadowEFactor = pb.mul(this.shadowEFactor, this.shadowEFactor);\r\n }\r\n }\r\n });\r\n for (let ms = 0; ms < msCount; ms++) {\r\n this[`lightT${ms}`] = pb.mul(\r\n this[`lightT${ms}`],\r\n pb.exp(pb.neg(pb.mul(this[`extAcc${ms}`], this.shadowLength)))\r\n );\r\n }\r\n // Transmittance-weighted depth for the aerial perspective\r\n this.tAPWeightedSum = pb.add(this.tAPWeightedSum, pb.mul(this.t, this.transmittanceToView));\r\n this.tAPWeightsSum = pb.add(this.tAPWeightsSum, this.transmittanceToView);\r\n });\r\n for (let ms = msCount - 1; ms >= 0; ms--) {\r\n this.$l.sunSky = pb.mul(this[`lightT${ms}`], this.lightIlluminance, this[`phaseMs${ms}`]);\r\n if (ms === 0) {\r\n this.sunSky = pb.add(this.sunSky, this.distantLight);\r\n }\r\n this.$l.scattered = pb.mul(this.sunSky, this[`scat${ms}`]);\r\n this.$l.safeExt = pb.max(this[`ext${ms}`], 1e-6);\r\n this.$l.segT = pb.exp(pb.neg(pb.mul(this.safeExt, this.stepT)));\r\n this.luminance = pb.add(\r\n this.luminance,\r\n pb.mul(\r\n this.transmittanceToView,\r\n pb.div(pb.sub(this.scattered, pb.mul(this.scattered, this.segT)), this.safeExt)\r\n )\r\n );\r\n if (ms === 0) {\r\n this.transmittanceToView = pb.mul(this.transmittanceToView, this.segT);\r\n }\r\n }\r\n this.$if(pb.lessThan(this.transmittanceToView, this.cloud.march.w), function () {\r\n this.$break();\r\n });\r\n this.t = pb.add(this.t, this.stepT);\r\n });\r\n // Aerial perspective at the mean cloud depth, integrated along the direction since\r\n // the cache covers directions outside any camera's AP froxel volume\r\n this.$if(pb.greaterThan(this.tAPWeightsSum, 0), function () {\r\n this.$l.tAP = pb.div(this.tAPWeightedSum, pb.max(this.tAPWeightsSum, 1e-10));\r\n this.$l.ap = getSkyView(\r\n this,\r\n this.atmo,\r\n this.eye,\r\n this.dir,\r\n this.tAP,\r\n textures.transmittanceLut,\r\n textures.multiScatteringLut\r\n );\r\n this.luminance = pb.add(\r\n pb.mul(this.ap.rgb, pb.sub(1, this.transmittanceToView)),\r\n pb.mul(this.luminance, this.ap.a)\r\n );\r\n });\r\n this.$return(pb.vec4(this.luminance, this.transmittanceToView));\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](atmosphere, cloud, dir, jitter, stepScale, ambient) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Average sky luminance over the sphere at the distant sky light altitude.\r\n * @internal\r\n */\r\nexport function cloudDistantSkyLight(\r\n scope: PBInsideFunctionScope,\r\n atmosphere: PBShaderExp,\r\n sphereSamples: PBShaderExp,\r\n transmittanceLut: PBShaderExp,\r\n multiScatteringLut: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const AtmosphereParams = getAtmosphereParamsStruct(pb);\r\n const funcName = 'Z_cloudDistantSkyLight';\r\n pb.func(funcName, [AtmosphereParams('atmo')], function () {\r\n this.$l.pos = pb.vec3(0, pb.add(this.atmo.plantRadius, CLOUD_DISTANT_SKY_LIGHT_ALTITUDE), 0);\r\n this.$l.sum = pb.vec3(0);\r\n this.$for(pb.int('i'), 0, 64, function () {\r\n this.sum = pb.add(\r\n this.sum,\r\n getSkyView(\r\n this,\r\n this.atmo,\r\n this.pos,\r\n sphereSamples.at(this.i).xyz,\r\n pb.float(-1),\r\n transmittanceLut,\r\n multiScatteringLut,\r\n false\r\n ).rgb\r\n );\r\n });\r\n // sum * (4 pi / 64) * (1 / (4 pi))\r\n this.$return(pb.div(this.sum, 64));\r\n });\r\n return pb.getGlobalScope()[funcName](atmosphere) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Elevation of the cached sky remapped so [-delta, pi/2] fills the hemisphere: the cache also\r\n * holds clouds a raised observer sees below the horizon.\r\n */\r\nfunction remapElevation(pb: ProgramBuilder, elevation: PBShaderExp, delta: PBShaderExp, encode: boolean) {\r\n const span = pb.add(Math.PI / 2, delta);\r\n return encode\r\n ? pb.mul(pb.div(pb.add(elevation, delta), span), Math.PI / 2)\r\n : pb.sub(pb.mul(pb.div(elevation, Math.PI / 2), span), delta);\r\n}\r\n\r\n/**\r\n * Observer-local direction to cloud cache uv: the upper hemisphere octahedron rotated 45 degrees\r\n * to fill the square (clayjohn clouds.gdshader vec3_to_oct, after J. White, \"Signed Octahedron\r\n * Normal Encoding\"), elevation remapped by `delta`. Directions below -delta are clamped to it.\r\n * @internal\r\n */\r\nexport function cloudCacheEncode(scope: PBInsideFunctionScope, dir: PBShaderExp, delta: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudCacheEncode';\r\n pb.func(funcName, [pb.vec3('d'), pb.float('delta')], function () {\r\n this.$l.horizontal = pb.length(this.d.xz);\r\n this.$l.azimuth = this.$choice(\r\n pb.greaterThan(this.horizontal, 1e-6),\r\n pb.div(this.d.xz, this.horizontal),\r\n pb.vec2(1, 0)\r\n );\r\n this.$l.elevation = pb.asin(pb.clamp(this.d.y, -1, 1));\r\n this.elevation = pb.clamp(remapElevation(pb, this.elevation, this.delta, true), 0, Math.PI / 2);\r\n // Octahedron frame: x, y horizontal, z up\r\n this.$l.e = pb.vec3(pb.mul(this.azimuth, pb.cos(this.elevation)), pb.sin(this.elevation));\r\n this.e = pb.div(this.e, pb.add(pb.abs(this.e.x), pb.abs(this.e.y), pb.abs(this.e.z)));\r\n this.$return(\r\n pb.vec2(\r\n pb.add(0.5, pb.mul(pb.add(this.e.x, this.e.y), 0.5)),\r\n pb.add(0.5, pb.mul(pb.sub(this.e.y, this.e.x), 0.5))\r\n )\r\n );\r\n });\r\n return pb.getGlobalScope()[funcName](dir, delta) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Cloud cache uv to observer-local direction, inverse of {@link cloudCacheEncode}\r\n * (clayjohn clouds.glsl oct_to_vec3).\r\n * @internal\r\n */\r\nexport function cloudCacheDecode(scope: PBInsideFunctionScope, uv: PBShaderExp, delta: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudCacheDecode';\r\n pb.func(funcName, [pb.vec2('uv'), pb.float('delta')], function () {\r\n this.$l.n = pb.vec3(pb.sub(this.uv.x, this.uv.y), pb.sub(pb.add(this.uv.x, this.uv.y), 1), 0);\r\n this.n.z = pb.max(pb.sub(pb.sub(1, pb.abs(this.n.x)), pb.abs(this.n.y)), 0);\r\n this.n = pb.normalize(this.n);\r\n this.$l.elevation = remapElevation(pb, pb.asin(this.n.z), this.delta, false);\r\n this.$l.horizontal = pb.length(this.n.xy);\r\n this.$l.azimuth = this.$choice(\r\n pb.greaterThan(this.horizontal, 1e-6),\r\n pb.div(this.n.xy, this.horizontal),\r\n pb.vec2(1, 0)\r\n );\r\n this.$l.c = pb.cos(this.elevation);\r\n this.$return(\r\n pb.vec3(pb.mul(this.azimuth.x, this.c), pb.sin(this.elevation), pb.mul(this.azimuth.y, this.c))\r\n );\r\n });\r\n return pb.getGlobalScope()[funcName](uv, delta) as PBShaderExp;\r\n}\r\n"],"names":["CLOUD_SAMPLE_COUNT_MIN","CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX","CLOUD_TRACING_START_MAX_DISTANCE","CLOUD_BASE_VIEW_SAMPLE_COUNT","CLOUD_VIEW_SAMPLE_COUNT_MAX","CLOUD_BASE_SHADOW_SAMPLE_COUNT","CLOUD_SHADOW_SAMPLE_COUNT_MAX","CLOUD_DISTANT_SKY_LIGHT_ALTITUDE","CLOUD_COVERAGE_BASE_RANGE","CLOUD_DETAIL_RANGE","CLOUD_SHAPE_EROSION","CLOUD_DETAIL_EROSION","CLOUD_EDGE_WIDTH","CLOUD_SHADOW_EDGE_WIDTH","CLOUD_COVERAGE_RAMP","cloudCoverageThreshold","coverage","formation","c","Math","min","max","CLOUD_BOTTOM_TRANSITION_METERS","CLOUD_TOP_OFFSET","getCloudParamsStruct","pb","defineStruct","mat4","vec4","raySphereSolutions","scope","origin","dir","radius","$builder","funcName","func","vec3","float","$l","b","dot","o","d","sub","mul","r","disc","$if","lessThan","$return","vec2","s","sqrt","neg","add","getGlobalScope","hgPhase","g","cosTheta","numer","denom","div","PI","cloudHeightProfile","heightFrac","cloudType","layerHeight","baseOffsetMeters","clamp","t","stratus","stratocumulus","abs","cumulus","bottomWidth","y","w","localBase","bottom","smoothStep","h","top","z","remap","v","l0","h0","l1","h1","cloudSampleDensity","cloud","pos","weatherMap","baseNoise","detailNoise","stage","edgeWidth","CloudParams","length","p","altInLayer","layer","x","or","lessThanEqual","shape","greaterThanEqual","planet","referential","xyz","q","windDir","scales","weather","textureSampleLevel","xz","windOffset","mix","density","pow","baseOffset","heightProfile","profile","noise","greaterThan","n","lowFbm","a","rawBase","margin","base","rgb","highFbm","modifier","bottomErosion","eroded","cloudTrace","msCount","atmosphere","jitter","stepScale","ambient","textures","AtmosphereParams","getAtmosphereParamsStruct","eye","tTop2","tBottom2","tMin","tMax","and","bottomBothAhead","all","tempTop","$choice","tempBottom","$else","tGround","rayIntersectSphere","stepCount","floor","march","stepT","iStepCount","int","msScatt","ms","msExtin","sunDir","phase0","phase","isotropic","msPhaseFactor","phaseMs0","perSample","notEqual","lightIlluminance","sunIlluminance","not","transmittanceToSky","atmo","transmittanceLut","luminance","transmittanceToView","tAPWeightedSum","tAPWeightsSum","shadowCount","shadowLength","$for","samplePos","medium","$continue","extinction","scattering","albedo","sFactor","eFactor","atmoTransmittance","scat0","ext0","distantLight","prevNormT","normT","j","curNormT","deltaNormT","shadowPos","shadowMedium","$break","shadowExt","shadowEFactor","exp","sunSky","scattered","safeExt","segT","tAP","ap","getSkyView","multiScatteringLut","cloudDistantSkyLight","sphereSamples","plantRadius","sum","at","i","remapElevation","elevation","delta","encode","span","cloudCacheEncode","horizontal","azimuth","asin","e","cos","sin","cloudCacheDecode","uv","normalize","xy"],"mappings":";;AASA,iBACaA,MAAAA,sBAAAA,GAAyB;AACtC,iBACaC,MAAAA,kCAAAA,GAAqC;AAClD,iBACaC,MAAAA,gCAAAA,GAAmC;AAChD,iBACaC,MAAAA,4BAAAA,GAA+B;AAC5C,iBACaC,MAAAA,2BAAAA,GAA8B;AAC3C,iBACaC,MAAAA,8BAAAA,GAAiC;AAC9C,iBACaC,MAAAA,6BAAAA,GAAgC;AAC7C,iBACaC,MAAAA,gCAAAA,GAAmC;AAChD;;;UAIaC,yBAA4B,GAAA;AAAC,IAAA,MAAA;AAAQ,IAAA;;AAClD,0GACO,MAAMC,kBAAqB,GAAA;AAAC,IAAA,IAAA;AAAM,IAAA;;AACzC,wFACaC,MAAAA,mBAAAA,GAAsB;AACnC,0EACaC,MAAAA,oBAAAA,GAAuB;AACpC,yFACaC,MAAAA,gBAAAA,GAAmB;AAChC;;;IAIaC,MAAAA,uBAAAA,GAA0B;AACvC,4EACaC,MAAAA,mBAAAA,GAAsB;AACnC;;;AAGC,IACM,SAASC,sBAAuBC,CAAAA,QAAgB,EAAEC,SAAyB,EAAA;IAChF,MAAMC,CAAAA,GAAIC,KAAKC,GAAG,CAAC,GAAGD,IAAKE,CAAAA,GAAG,CAAC,CAAGL,EAAAA,QAAAA,CAAAA,CAAAA;AAClC,IAAA,OAAO,IAAIE,CAAKD,IAAAA,cAAc,WAAc,GAAA,CAAA,GAAIH,sBAAsB,CAAA,CAAA;AACxE;AACA,sDACaQ,MAAAA,8BAAAA,GAAiC;AAC9C,yGACaC,MAAAA,gBAAAA,GAAmB;AAEhC;;;IAIO,SAASC,oBAAAA,CAAqBC,EAAkB,EAAA;IACrD,OAAOA,EAAAA,CAAGC,YAAY,CAAC;;AAErBD,QAAAA,EAAAA,CAAGE,IAAI,CAAC,aAAA,CAAA;;AAERF,QAAAA,EAAAA,CAAGG,IAAI,CAAC,OAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,OAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,KAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,QAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,gBAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,OAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,IAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,SAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,OAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,QAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,QAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,YAAA,CAAA;;AAERH,QAAAA,EAAAA,CAAGG,IAAI,CAAC,SAAA;AACT,KAAA,CAAA;AACH;AAEA;;IAGA,SAASC,mBACPC,KAA4B,EAC5BC,MAAmB,EACnBC,GAAgB,EAChBC,MAAmB,EAAA;IAEnB,MAAMR,EAAAA,GAAKK,MAAMI,QAAQ;AACzB,IAAA,MAAMC,QAAW,GAAA,2BAAA;IACjBV,EAAGW,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACV,QAAAA,EAAAA,CAAGY,IAAI,CAAC,GAAA,CAAA;AAAMZ,QAAAA,EAAAA,CAAGY,IAAI,CAAC,GAAA,CAAA;AAAMZ,QAAAA,EAAAA,CAAGa,KAAK,CAAC,GAAA;KAAK,EAAE,WAAA;AAC7D,QAAA,IAAI,CAACC,EAAE,CAACC,CAAC,GAAGf,EAAGgB,CAAAA,GAAG,CAAC,IAAI,CAACC,CAAC,EAAE,IAAI,CAACC,CAAC,CAAA;AACjC,QAAA,IAAI,CAACJ,EAAE,CAACrB,CAAC,GAAGO,EAAAA,CAAGmB,GAAG,CAACnB,EAAGgB,CAAAA,GAAG,CAAC,IAAI,CAACC,CAAC,EAAE,IAAI,CAACA,CAAC,CAAGjB,EAAAA,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACC,CAAC,EAAE,IAAI,CAACA,CAAC,CAAA,CAAA;QAChE,IAAI,CAACP,EAAE,CAACQ,IAAI,GAAGtB,EAAGmB,CAAAA,GAAG,CAACnB,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACL,CAAC,EAAE,IAAI,CAACA,CAAC,CAAA,EAAG,IAAI,CAACtB,CAAC,CAAA;QACpD,IAAI,CAAC8B,GAAG,CAACvB,EAAGwB,CAAAA,QAAQ,CAAC,IAAI,CAACF,IAAI,EAAE,CAAI,CAAA,EAAA,WAAA;AAClC,YAAA,IAAI,CAACG,OAAO,CAACzB,EAAG0B,CAAAA,IAAI,CAAC,EAAC,CAAA,CAAA;AACxB,SAAA,CAAA;QACA,IAAI,CAACZ,EAAE,CAACa,CAAC,GAAG3B,GAAG4B,IAAI,CAAC,IAAI,CAACN,IAAI,CAAA;AAC7B,QAAA,IAAI,CAACG,OAAO,CAACzB,EAAAA,CAAG0B,IAAI,CAAC1B,EAAAA,CAAGmB,GAAG,CAACnB,EAAG6B,CAAAA,GAAG,CAAC,IAAI,CAACd,CAAC,CAAA,EAAG,IAAI,CAACY,CAAC,CAAA,EAAG3B,EAAG8B,CAAAA,GAAG,CAAC9B,EAAG6B,CAAAA,GAAG,CAAC,IAAI,CAACd,CAAC,CAAG,EAAA,IAAI,CAACY,CAAC,CAAA,CAAA,CAAA;AACpF,KAAA,CAAA;AACA,IAAA,OAAO3B,GAAG+B,cAAc,EAAE,CAACrB,QAAS,CAAA,CAACJ,QAAQC,GAAKC,EAAAA,MAAAA,CAAAA;AACpD;AAEA,oFACA,SAASwB,OAAAA,CAAQ3B,KAA4B,EAAE4B,CAAc,EAAEC,QAAqB,EAAA;IAClF,MAAMlC,EAAAA,GAAKK,MAAMI,QAAQ;AACzB,IAAA,MAAMC,QAAW,GAAA,gBAAA;IACjBV,EAAGW,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACV,QAAAA,EAAAA,CAAGa,KAAK,CAAC,GAAA,CAAA;AAAMb,QAAAA,EAAAA,CAAGa,KAAK,CAAC,GAAA;KAAK,EAAE,WAAA;AAChD,QAAA,IAAI,CAACC,EAAE,CAACqB,KAAK,GAAGnC,EAAAA,CAAGmB,GAAG,CAAC,CAAA,EAAGnB,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACa,CAAC,EAAE,IAAI,CAACA,CAAC,CAAA,CAAA;AAC/C,QAAA,IAAI,CAACnB,EAAE,CAACsB,KAAK,GAAGpC,GAAGJ,GAAG,CAACI,EAAGmB,CAAAA,GAAG,CAACnB,EAAG8B,CAAAA,GAAG,CAAC,CAAA,EAAG9B,GAAGoB,GAAG,CAAC,IAAI,CAACa,CAAC,EAAE,IAAI,CAACA,CAAC,IAAIjC,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACa,CAAC,EAAE,IAAI,CAACxC,CAAC,EAAE,CAAK,CAAA,CAAA,EAAA,IAAA,CAAA;QAC7F,IAAI,CAACgC,OAAO,CAACzB,EAAGqC,CAAAA,GAAG,CAAC,IAAI,CAACF,KAAK,EAAEnC,EAAAA,CAAGoB,GAAG,CAAC,IAAI1B,IAAK4C,CAAAA,EAAE,EAAE,IAAI,CAACF,KAAK,EAAEpC,EAAAA,CAAG4B,IAAI,CAAC,IAAI,CAACQ,KAAK,CAAA,CAAA,CAAA,CAAA;AACpF,KAAA,CAAA;AACA,IAAA,OAAOpC,GAAG+B,cAAc,EAAE,CAACrB,QAAAA,CAAS,CAACuB,CAAGC,EAAAA,QAAAA,CAAAA;AAC1C;AAEA;;;;AAIC,IACM,SAASK,kBACdlC,CAAAA,KAA4B,EAC5BmC,UAAuB,EACvBC,SAAsB,EACtBC,WAAwB,EACxBC,gBAAAA,GAAyC,CAAC,EAAA;IAE1C,MAAM3C,EAAAA,GAAKK,MAAMI,QAAQ;AACzB,IAAA,MAAMC,QAAW,GAAA,wBAAA;IACjBV,EAAGW,CAAAA,IAAI,CACLD,QACA,EAAA;AAACV,QAAAA,EAAAA,CAAGa,KAAK,CAAC,GAAA,CAAA;AAAMb,QAAAA,EAAAA,CAAGa,KAAK,CAAC,GAAA,CAAA;AAAMb,QAAAA,EAAAA,CAAGa,KAAK,CAAC,aAAA,CAAA;AAAgBb,QAAAA,EAAAA,CAAGa,KAAK,CAAC,kBAAA;KAAoB,EACrF,WAAA;AACE,QAAA,IAAI,CAACC,EAAE,CAAC2B,SAAS,GAAGzC,EAAAA,CAAG4C,KAAK,CAAC,IAAI,CAACC,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;QACxC,IAAI,CAAC/B,EAAE,CAACgC,OAAO,GAAG9C,EAAGmB,CAAAA,GAAG,CAAC,CAAGnB,EAAAA,EAAAA,CAAG4C,KAAK,CAAC5C,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACqB,SAAS,EAAE,IAAI,CAAG,EAAA,CAAA,CAAA,CAAA;QACnE,IAAI,CAAC3B,EAAE,CAACiC,aAAa,GAAG/C,EAAGmB,CAAAA,GAAG,CAAC,CAAA,EAAGnB,EAAGoB,CAAAA,GAAG,CAACpB,EAAGgD,CAAAA,GAAG,CAAChD,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAACsB,SAAS,EAAE,GAAO,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA;QAC9E,IAAI,CAAC3B,EAAE,CAACmC,OAAO,GAAGjD,EAAGoB,CAAAA,GAAG,CAACpB,EAAG4C,CAAAA,KAAK,CAAC5C,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAACsB,SAAS,EAAE,GAAA,CAAA,EAAM,GAAG,CAAI,CAAA,EAAA,CAAA,CAAA;;QAEtE,IAAI,CAAC3B,EAAE,CAACmB,CAAC,GAAGjC,EAAG8B,CAAAA,GAAG,CAChB9B,EAAAA,CAAGoB,GAAG,CAACpB,GAAGG,IAAI,CAAC,GAAG,IAAM,EAAA,IAAA,EAAM,OAAO,IAAI,CAAC2C,OAAO,CAAA,EACjD9C,EAAGoB,CAAAA,GAAG,CAACpB,EAAGG,CAAAA,IAAI,CAAC,CAAG,EAAA,GAAA,EAAK,KAAK,KAAQ,CAAA,EAAA,IAAI,CAAC4C,aAAa,CACtD/C,EAAAA,EAAAA,CAAGoB,GAAG,CAACpB,EAAAA,CAAGG,IAAI,CAAC,CAAA,EAAG,QAAQ,GAAK,EAAA,CAAA,CAAA,EAAI,IAAI,CAAC8C,OAAO,CAAA,CAAA;AAEjD,QAAA,IAAI,CAACnC,EAAE,CAACoC,WAAW,GAAGlD,GAAGL,GAAG,CAC1BK,EAAGL,CAAAA,GAAG,CAAC,IAAI,CAACsC,CAAC,CAACkB,CAAC,EAAEnD,EAAAA,CAAGqC,GAAG,CAACxC,gCAAgCG,EAAGJ,CAAAA,GAAG,CAAC,IAAI,CAAC8C,WAAW,EAAE,CACjF1C,CAAAA,CAAAA,CAAAA,EAAAA,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACa,CAAC,CAACmB,CAAC,EAAE,IAAA,CAAA,CAAA;AAEnB,QAAA,IAAI,CAACtC,EAAE,CAACuC,SAAS,GAAGrD,EAAG4C,CAAAA,KAAK,CAC1B5C,EAAAA,CAAGqC,GAAG,CAAC,IAAI,CAACM,gBAAgB,EAAE3C,EAAAA,CAAGJ,GAAG,CAAC,IAAI,CAAC8C,WAAW,EAAE,KACvD,CACA1C,EAAAA,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACa,CAAC,CAACmB,CAAC,EAAE,IAAA,CAAA,CAAA;AAEnB,QAAA,IAAI,CAACtC,EAAE,CAACwC,MAAM,GAAGtD,EAAAA,CAAGuD,UAAU,CAC5B,IAAI,CAACF,SAAS,EACdrD,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAACuB,SAAS,EAAErD,EAAAA,CAAGJ,GAAG,CAAC,IAAI,CAACsD,WAAW,EAAE,IAChD,CAAA,CAAA,EAAA,IAAI,CAACM,CAAC,CAAA;QAER,IAAI,CAAC1C,EAAE,CAAC2C,GAAG,GAAGzD,EAAGmB,CAAAA,GAAG,CAAC,CAAA,EAAGnB,EAAGuD,CAAAA,UAAU,CAAC,IAAI,CAACtB,CAAC,CAACyB,CAAC,EAAE,IAAI,CAACzB,CAAC,CAACmB,CAAC,EAAE,IAAI,CAACI,CAAC,CAAA,CAAA;AAChE,QAAA,IAAI,CAAC/B,OAAO,CACVzB,EAAAA,CAAGG,IAAI,CACLH,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACkC,MAAM,EAAE,IAAI,CAACG,GAAG,CAC5BzD,EAAAA,EAAAA,CAAG4C,KAAK,CACN5C,EAAGqC,CAAAA,GAAG,CAACrC,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACqC,CAAC,EAAE,IAAI,CAACH,SAAS,CAAGrD,EAAAA,EAAAA,CAAGJ,GAAG,CAACI,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAACc,CAAC,CAACmB,CAAC,EAAE,IAAI,CAACC,SAAS,CAAA,EAAG,IAChF,CAAA,CAAA,EAAA,CAAA,EACA,CAEF,CAAA,EAAA,IAAI,CAACC,MAAM,EACXtD,EAAAA,CAAGmB,GAAG,CAAC,CAAG,EAAA,IAAI,CAACsC,GAAG,CAAA,CAAA,CAAA;AAGxB,KAAA,CAAA;IAEF,OAAOzD,EAAAA,CAAG+B,cAAc,EAAE,CAACrB,SAAS,CAAC8B,UAAAA,EAAYC,WAAWC,WAAaC,EAAAA,gBAAAA,CAAAA;AAC3E;AAEA,iDACA,SAASgB,KACP3D,CAAAA,EAAkB,EAClB4D,CAAuB,EACvBC,EAAwB,EACxBC,EAAwB,EACxBC,EAAU,EACVC,EAAU,EAAA;IAEV,OAAOhE,EAAAA,CAAG8B,GAAG,CAACiC,EAAAA,EAAI/D,GAAGoB,GAAG,CAACpB,GAAGqC,GAAG,CAACrC,GAAGmB,GAAG,CAACyC,GAAGC,EAAK7D,CAAAA,EAAAA,EAAAA,CAAGmB,GAAG,CAAC2C,EAAAA,EAAID,MAAMG,EAAKD,GAAAA,EAAAA,CAAAA,CAAAA;AACvE;AAEA;;;;;;;;;;;;;AAaC,IACM,SAASE,kBAAAA,CACd5D,KAA4B,EAC5B6D,KAAkB,EAClBC,GAAgB,EAChBC,UAAuB,EACvBC,SAAsB,EACtBC,WAAwB,EACxBC,QAAwC,SAAS,EACjDC,YAAYrF,gBAAgB,EAAA;IAE5B,MAAMa,EAAAA,GAAKK,MAAMI,QAAQ;AACzB,IAAA,MAAMgE,cAAc1E,oBAAqBC,CAAAA,EAAAA,CAAAA;IACzC,MAAMU,QAAAA,GAAW,CAAC,qBAAqB,EAAE6D,QAAQC,SAAcrF,KAAAA,gBAAAA,GAAmB,KAAK,SAAW,CAAA,CAAA;IAClGa,EAAGW,CAAAA,IAAI,CAACD,QAAU,EAAA;QAAC+D,WAAY,CAAA,OAAA,CAAA;AAAUzE,QAAAA,EAAAA,CAAGY,IAAI,CAAC,GAAA;KAAK,EAAE,WAAA;QACtD,IAAI,CAACE,EAAE,CAACO,CAAC,GAAGrB,GAAG0E,MAAM,CAAC,IAAI,CAACC,CAAC,CAAA;AAC5B,QAAA,IAAI,CAAC7D,EAAE,CAAC8D,UAAU,GAAG5E,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACE,CAAC,EAAE,IAAI,CAAC6C,KAAK,CAACW,KAAK,CAACC,CAAC,CAAA;AACtD,QAAA,IAAI,CAAChE,EAAE,CAAC0C,CAAC,GAAGxD,EAAAA,CAAGqC,GAAG,CAAC,IAAI,CAACuC,UAAU,EAAE5E,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAAC+C,KAAK,CAACW,KAAK,CAAC1B,CAAC,EAAE,IAAI,CAACe,KAAK,CAACW,KAAK,CAACC,CAAC,CAAA,CAAA;AACjF,QAAA,IAAI,CAACvD,GAAG,CACNvB,EAAAA,CAAG+E,EAAE,CACH/E,EAAAA,CAAGgF,aAAa,CAAC,IAAI,CAACd,KAAK,CAACe,KAAK,CAACvB,CAAC,EAAE,CAAA,CAAA,EACrC1D,EAAGgF,CAAAA,aAAa,CAAC,IAAI,CAACxB,CAAC,EAAE,CACzBxD,CAAAA,EAAAA,EAAAA,CAAGkF,gBAAgB,CAAC,IAAI,CAAC1B,CAAC,EAAE,CAE9B,CAAA,CAAA,EAAA,WAAA;AACE,YAAA,IAAI,CAAC/B,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,IAAI,CAACqD,CAAC,EAAE,IAAI,CAACoB,UAAU,CAAA,CAAA;AACpD,SAAA,CAAA;;QAGF,IAAI,CAAC9D,EAAE,CAACqE,MAAM,GAAGnF,EAAGoB,CAAAA,GAAG,CAACpB,EAAAA,CAAGG,IAAI,CAAC,IAAI,CAACwE,CAAC,EAAE,CAAI,CAAA,EAAA,IAAI,CAACT,KAAK,CAACkB,WAAW,CAAA,CAAEC,GAAG;AACvE,QAAA,IAAI,CAACvE,EAAE,CAACwE,CAAC,GAAGtF,EAAGY,CAAAA,IAAI,CAAC,IAAI,CAACuE,MAAM,CAACL,CAAC,EAAE9E,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAACE,CAAC,EAAE,IAAI,CAAC6C,KAAK,CAACW,KAAK,CAACnB,CAAC,CAAG,EAAA,IAAI,CAACyB,MAAM,CAACzB,CAAC,CAAA;;QAEpF,IAAI,CAAC4B,CAAC,GAAGtF,EAAAA,CAAG8B,GAAG,CACb,IAAI,CAACwD,CAAC,EACNtF,GAAGoB,GAAG,CAACpB,GAAGY,IAAI,CAAC,IAAI,CAACsD,KAAK,CAACqB,OAAO,CAACT,CAAC,EAAE,CAAG,EAAA,IAAI,CAACZ,KAAK,CAACqB,OAAO,CAACpC,CAAC,GAAGnD,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC8C,KAAK,CAACsB,MAAM,CAACpC,CAAC,EAAE,IAAI,CAACI,CAAC,CAAA,CAAA,CAAA;AAEnG,QAAA,IAAI,CAAC1C,EAAE,CAAC2E,OAAO,GAAGzF,GAAG4C,KAAK,CACxB5C,EAAG0F,CAAAA,kBAAkB,CAACtB,UAAYpE,EAAAA,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACkE,CAAC,CAACK,EAAE,EAAE,IAAI,CAACzB,KAAK,CAACsB,MAAM,CAACV,CAAC,CAAG,EAAA,CAAA,CAAA,EAC1E9E,GAAGG,IAAI,CAAC,CACRH,CAAAA,EAAAA,EAAAA,CAAGG,IAAI,CAAC,CAAA,CAAA,CAAA;AAEV,QAAA,IAAI,CAACmF,CAAC,GAAGtF,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAACwD,CAAC,EAAE,IAAI,CAACpB,KAAK,CAAC0B,UAAU,CAACP,GAAG,CAAA;QACjD,IAAI,CAACvE,EAAE,CAACvB,QAAQ,GAAGS,EAAG4C,CAAAA,KAAK,CACzB5C,EAAGqC,CAAAA,GAAG,CACJrC,EAAGmB,CAAAA,GAAG,CAACnB,EAAG6F,CAAAA,GAAG,CAAC,IAAI,CAACJ,OAAO,CAACpE,CAAC,EAAE,IAAI,CAACoE,OAAO,CAACxD,CAAC,EAAE,IAAI,CAACiC,KAAK,CAACqB,OAAO,CAAC7B,CAAC,CAAG,EAAA,IAAI,CAACQ,KAAK,CAAC4B,OAAO,CAAChB,CAAC,CACzFzF,EAAAA,mBAAAA,CAAAA,EAEF,CACA,EAAA,CAAA,CAAA;;AAGF,QAAA,IAAI,CAACE,QAAQ,GAAGS,GAAG+F,GAAG,CACpB,IAAI,CAACxG,QAAQ,EACbS,EAAG6F,CAAAA,GAAG,CAAC,CAAG7F,EAAAA,EAAAA,CAAG6F,GAAG,CAAC,CAAA,EAAG,KAAK,IAAI,CAAC3B,KAAK,CAAC4B,OAAO,CAAC1C,CAAC,GAAGpD,EAAG4C,CAAAA,KAAK,CAAC5C,EAAGoB,CAAAA,GAAG,CAACpB,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAACqC,CAAC,EAAE,GAAA,CAAA,EAAM,KAAK,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA;QAE/F,IAAI,CAACjC,GAAG,CAACvB,EAAGgF,CAAAA,aAAa,CAAC,IAAI,CAACzF,QAAQ,EAAE,CAAI,CAAA,EAAA,WAAA;AAC3C,YAAA,IAAI,CAACkC,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,IAAI,CAACqD,CAAC,EAAE,IAAI,CAACoB,UAAU,CAAA,CAAA;AACpD,SAAA,CAAA;;AAEA,QAAA,IAAI,CAAC9D,EAAE,CAACkF,UAAU,GAAGhG,EAAAA,CAAGoB,GAAG,CACzB,IAAI,CAAC8C,KAAK,CAACe,KAAK,CAAC7B,CAAC,EAClBpD,EAAAA,CAAG8B,GAAG,CAAC,IAAA,EAAM9B,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACqE,OAAO,CAAC1E,CAAC,EAAE,IAAOf,CAAAA,EAAAA,EAAAA,CAAGoB,GAAG,CAACpB,GAAGmB,GAAG,CAAC,GAAG,IAAI,CAAC5B,QAAQ,CAAG,EAAA,GAAA,CAAA,CAAA,CAAA;AAE9E,QAAA,IAAI,CAACuB,EAAE,CAACmF,aAAa,GAAG1D,mBACtB,IAAI,EACJ,IAAI,CAACiB,CAAC,EACN,IAAI,CAACiC,OAAO,CAAC1E,CAAC,EACdf,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAAC+C,KAAK,CAACW,KAAK,CAAC1B,CAAC,EAAE,IAAI,CAACe,KAAK,CAACW,KAAK,CAACC,CAAC,CAC7C,EAAA,IAAI,CAACkB,UAAU,CAAA;AAEjB,QAAA,IAAI,CAAClF,EAAE,CAACoF,OAAO,GAAGlG,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAAC6E,aAAa,CAACvC,CAAC,EAAE1D,EAAGJ,CAAAA,GAAG,CAACI,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAAC5B,QAAQ,EAAE,IAAI,CAAC0G,aAAa,CAAC7C,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA;AACnG,QAAA,IAAImB,UAAU,SAAW,EAAA;AACvB,YAAA,IAAI,CAAC9C,OAAO,CACVzB,EAAAA,CAAGG,IAAI,CAACH,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC8E,OAAO,EAAE,IAAI,CAAChC,KAAK,CAAC4B,OAAO,CAAC3C,CAAC,CAAA,EAAG,IAAI,CAAC+C,OAAO,EAAE,IAAI,CAAC1C,CAAC,EAAE,IAAI,CAACoB,UAAU,CAAA,CAAA;AAE3F,YAAA;AACF;AACA,QAAA,IAAI,CAAC9D,EAAE,CAACqF,KAAK,GAAGnG,EAAAA,CAAGa,KAAK,CAAC,CAAA,CAAA;AACzB,QAAA,IAAI,CAACU,GAAG,CAACvB,EAAAA,CAAGoG,WAAW,CAAC,IAAI,CAAClC,KAAK,CAACe,KAAK,CAACH,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;YAC9C,IAAI,CAAChE,EAAE,CAACuF,CAAC,GAAGrG,EAAG0F,CAAAA,kBAAkB,CAACrB,SAAAA,EAAWrE,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACkE,CAAC,EAAE,IAAI,CAACpB,KAAK,CAACsB,MAAM,CAACrC,CAAC,CAAG,EAAA,CAAA,CAAA;AAClF,YAAA,IAAI,CAACrC,EAAE,CAACwF,MAAM,GAAGtG,GAAG8B,GAAG,CAAC9B,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACiF,CAAC,CAACpE,CAAC,EAAE,KAAA,CAAA,EAAQjC,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACiF,CAAC,CAACtF,CAAC,EAAE,IAAA,CAAA,EAAOf,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACiF,CAAC,CAACE,CAAC,EAAE,KAAA,CAAA,CAAA;YAC1F,IAAI,CAACzF,EAAE,CAAC0F,OAAO,GAAG7C,KAAM3D,CAAAA,EAAAA,EAAI,IAAI,CAACqG,CAAC,CAAChF,CAAC,EAAErB,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACmF,MAAM,EAAE,CAAI,CAAA,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;YACpE,IAAI,CAACH,KAAK,GAAGnG,EAAAA,CAAG4C,KAAK,CACnBe,KAAAA,CAAM3D,EAAI,EAAA,IAAI,CAACwG,OAAO,EAAEzH,yBAAyB,CAAC,EAAE,EAAEA,yBAAyB,CAAC,CAAE,CAAA,EAAE,CAAG,EAAA,CAAA,CAAA,EACvF,CACA,EAAA,CAAA,CAAA;AAEJ,SAAA,CAAA;AACA,QAAA,IAAI,CAAC+B,EAAE,CAAC2F,MAAM,GAAGzG,EAAAA,CAAGmB,GAAG,CACrB,IAAI,CAAC+E,OAAO,EACZlG,GAAGoB,GAAG,CAAC,IAAI,CAAC8C,KAAK,CAACe,KAAK,CAACH,CAAC,EAAE7F,mBAAqBe,EAAAA,EAAAA,CAAGmB,GAAG,CAAC,CAAG,EAAA,IAAI,CAACgF,KAAK,CAAA,CAAA,CAAA;AAEtE,QAAA,IAAI,CAACrF,EAAE,CAAC4F,IAAI,GAAG1G,GAAG4C,KAAK,CAAC5C,EAAGqC,CAAAA,GAAG,CAAC,IAAI,CAACoE,MAAM,EAAEjC,YAAY,CAAG,EAAA,CAAA,CAAA;QAC3D,IAAI,CAACjD,GAAG,CAACvB,EAAGgF,CAAAA,aAAa,CAAC,IAAI,CAAC0B,IAAI,EAAE,CAAI,CAAA,EAAA,WAAA;AACvC,YAAA,IAAI,CAACjF,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,IAAI,CAACqD,CAAC,EAAE,IAAI,CAACoB,UAAU,CAAA,CAAA;AACpD,SAAA,CAAA;AACA,QAAA,IAAIL,UAAU,MAAQ,EAAA;AACpB,YAAA,IAAI,CAAC9C,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAACH,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACsF,IAAI,EAAE,IAAI,CAACxC,KAAK,CAAC4B,OAAO,CAAC3C,CAAC,CAAA,EAAG,IAAI,CAACuD,IAAI,EAAE,IAAI,CAAClD,CAAC,EAAE,IAAI,CAACoB,UAAU,CAAA,CAAA;AAChG,YAAA;AACF;AACA,QAAA,IAAI,CAACrD,GAAG,CAACvB,EAAAA,CAAGgF,aAAa,CAAC,IAAI,CAACd,KAAK,CAAC4B,OAAO,CAACpC,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AAClD,YAAA,IAAI,CAACjC,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAACH,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACsF,IAAI,EAAE,IAAI,CAACxC,KAAK,CAAC4B,OAAO,CAAC3C,CAAC,CAAA,EAAG,IAAI,CAACuD,IAAI,EAAE,IAAI,CAAClD,CAAC,EAAE,IAAI,CAACoB,UAAU,CAAA,CAAA;AAClG,SAAA,CAAA;QACA,IAAI,CAAC9D,EAAE,CAACI,CAAC,GAAGlB,GAAG0F,kBAAkB,CAACpB,WAAatE,EAAAA,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACkE,CAAC,EAAE,IAAI,CAACpB,KAAK,CAACsB,MAAM,CAAC9B,CAAC,CAAG,EAAA,CAAA,CAAA,CAAGiD,GAAG;QAC1F,IAAI,CAAC7F,EAAE,CAAC8F,OAAO,GAAG5G,GAAG4C,KAAK,CACxBe,KACE3D,CAAAA,EAAAA,EACAA,EAAG8B,CAAAA,GAAG,CAAC9B,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACF,CAAC,CAACG,CAAC,EAAE,KAAQrB,CAAAA,EAAAA,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACF,CAAC,CAACe,CAAC,EAAE,IAAA,CAAA,EAAOjC,GAAGoB,GAAG,CAAC,IAAI,CAACF,CAAC,CAACH,CAAC,EAAE,KAAA,CAAA,CAAA,EACzE/B,kBAAkB,CAAC,CAAE,CAAA,EACrBA,kBAAkB,CAAC,CAAE,CAAA,EACrB,CACA,EAAA,CAAA,CAAA,EAEF,CACA,EAAA,CAAA,CAAA;;AAGF,QAAA,IAAI,CAAC8B,EAAE,CAAC+F,QAAQ,GAAG7G,EAAG6F,CAAAA,GAAG,CACvB,IAAI,CAACe,OAAO,EACZ5G,EAAAA,CAAGmB,GAAG,CAAC,CAAA,EAAG,IAAI,CAACyF,OAAO,CAAA,EACtB5G,EAAG4C,CAAAA,KAAK,CAAC5C,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC6E,aAAa,CAAC9C,CAAC,EAAE,KAAK,CAAG,EAAA,CAAA,CAAA,CAAA;QAEhD,IAAI,CAACrC,EAAE,CAACgG,aAAa,GAAG9G,EAAG6F,CAAAA,GAAG,CAAC,IAAI,CAAC3B,KAAK,CAACe,KAAK,CAAC9B,CAAC,EAAE,CAAGnD,EAAAA,EAAAA,CAAGuD,UAAU,CAAC,CAAG,EAAA,IAAA,EAAM,IAAI,CAAC0C,aAAa,CAAC9C,CAAC,CAAA,CAAA;AACjG,QAAA,IAAI,CAACsD,MAAM,GAAGzG,EAAAA,CAAGmB,GAAG,CAClB,IAAI,CAACsF,MAAM,EACXzG,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACyF,QAAQ,EAAE,IAAI,CAAC3C,KAAK,CAAC4B,OAAO,CAACpC,CAAC,EAAE,IAAI,CAACoD,aAAa,EAAE5H,oBAAAA,CAAAA,CAAAA;AAElE,QAAA,IAAI,CAAC4B,EAAE,CAACiG,MAAM,GAAG/G,GAAG4C,KAAK,CAAC5C,EAAGqC,CAAAA,GAAG,CAAC,IAAI,CAACoE,MAAM,EAAEjC,YAAY,CAAG,EAAA,CAAA,CAAA;AAC7D,QAAA,IAAI,CAAC/C,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAACH,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC2F,MAAM,EAAE,IAAI,CAAC7C,KAAK,CAAC4B,OAAO,CAAC3C,CAAC,CAAA,EAAG,IAAI,CAACuD,IAAI,EAAE,IAAI,CAAClD,CAAC,EAAE,IAAI,CAACoB,UAAU,CAAA,CAAA;AACpG,KAAA,CAAA;AACA,IAAA,OAAO5E,GAAG+B,cAAc,EAAE,CAACrB,QAAAA,CAAS,CAACwD,KAAOC,EAAAA,GAAAA,CAAAA;AAC9C;AAEA;;;;;;;;;;;AAWC,IACM,SAAS6C,UAAAA,CACd3G,KAA4B,EAC5B4G,OAAe,EACfC,UAAuB,EACvBhD,KAAkB,EAClB3D,GAAgB,EAChB4G,MAAmB,EACnBC,SAAsB,EACtBC,OAAoB,EACpBC,QAMC,EAAA;IAED,MAAMtH,EAAAA,GAAKK,MAAMI,QAAQ;AACzB,IAAA,MAAM8G,mBAAmBC,yBAA0BxH,CAAAA,EAAAA,CAAAA;AACnD,IAAA,MAAMyE,cAAc1E,oBAAqBC,CAAAA,EAAAA,CAAAA;AACzC,IAAA,MAAMU,QAAW,GAAA,CAAC,YAAY,EAAEuG,OAAS,CAAA,CAAA;IACzC,MAAMnB,OAAAA,GAAU,CAACnE,CAA0BgD,EAAAA,CAAAA,EAAgBH,YAAYrF,gBAAgB,GACrF8E,kBACEtC,CAAAA,CAAAA,EACAA,CAAEuC,CAAAA,KAAK,EACPS,CACA2C,EAAAA,QAAAA,CAASlD,UAAU,EACnBkD,QAAAA,CAASjD,SAAS,EAClBiD,QAAAA,CAAShD,WAAW,EACpB,SACAE,EAAAA,SAAAA,CAAAA;IAEJxE,EAAGW,CAAAA,IAAI,CACLD,QACA,EAAA;QACE6G,gBAAiB,CAAA,MAAA,CAAA;QACjB9C,WAAY,CAAA,OAAA,CAAA;AACZzE,QAAAA,EAAAA,CAAGY,IAAI,CAAC,KAAA,CAAA;AACRZ,QAAAA,EAAAA,CAAGa,KAAK,CAAC,QAAA,CAAA;AACTb,QAAAA,EAAAA,CAAGa,KAAK,CAAC,WAAA,CAAA;AACTb,QAAAA,EAAAA,CAAGY,IAAI,CAAC,SAAA;KACT,EACD,WAAA;QACE,IAAI,CAACE,EAAE,CAAC2G,GAAG,GAAG,IAAI,CAACvD,KAAK,CAACuD,GAAG,CAACpC,GAAG;QAChC,IAAI,CAACvE,EAAE,CAAC4G,KAAK,GAAGtH,kBAAmB,CAAA,IAAI,EAAE,IAAI,CAACqH,GAAG,EAAE,IAAI,CAAClH,GAAG,EAAE,IAAI,CAAC2D,KAAK,CAACW,KAAK,CAAC1B,CAAC,CAAA;QAC/E,IAAI,CAACrC,EAAE,CAAC6G,QAAQ,GAAGvH,kBAAmB,CAAA,IAAI,EAAE,IAAI,CAACqH,GAAG,EAAE,IAAI,CAAClH,GAAG,EAAE,IAAI,CAAC2D,KAAK,CAACW,KAAK,CAACC,CAAC,CAAA;AAClF,QAAA,IAAI,CAAChE,EAAE,CAAC8G,IAAI,GAAG5H,EAAAA,CAAGa,KAAK,CAAC,CAAA,CAAA;AACxB,QAAA,IAAI,CAACC,EAAE,CAAC+G,IAAI,GAAG7H,EAAAA,CAAGa,KAAK,CAAC,CAAA,CAAA;QACxB,IAAI,CAACU,GAAG,CAACvB,EAAG8H,CAAAA,GAAG,CAAC9H,EAAGwB,CAAAA,QAAQ,CAAC,IAAI,CAACkG,KAAK,CAAC5C,CAAC,EAAE,CAAI9E,CAAAA,EAAAA,EAAAA,CAAGwB,QAAQ,CAAC,IAAI,CAACkG,KAAK,CAACvE,CAAC,EAAE,CAAK,CAAA,CAAA,EAAA,WAAA;YAC3E,IAAI,CAAC1B,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,CAAA,CAAA;AAChC,SAAA,CAAA;QACA,IAAI,CAACoB,GAAG,CAACvB,EAAGoG,CAAAA,WAAW,CAACpG,EAAGgD,CAAAA,GAAG,CAAChD,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACwG,QAAQ,CAAC7C,CAAC,EAAE,IAAI,CAAC6C,QAAQ,CAACxE,CAAC,CAAA,CAAA,EAAI,CAAI,CAAA,EAAA,WAAA;AAC5E,YAAA,IAAI,CAACrC,EAAE,CAACiH,eAAe,GAAG/H,GAAGgI,GAAG,CAAChI,EAAGoG,CAAAA,WAAW,CAAC,IAAI,CAACuB,QAAQ,EAAE3H,EAAAA,CAAG0B,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA;YACvE,IAAI,CAACZ,EAAE,CAACmH,OAAO,GAAG,IAAI,CAACC,OAAO,CAC5BlI,EAAGgI,CAAAA,GAAG,CAAChI,EAAGoG,CAAAA,WAAW,CAAC,IAAI,CAACsB,KAAK,EAAE1H,EAAG0B,CAAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,EAC1C1B,EAAGL,CAAAA,GAAG,CAAC,IAAI,CAAC+H,KAAK,CAAC5C,CAAC,EAAE,IAAI,CAAC4C,KAAK,CAACvE,CAAC,CACjCnD,EAAAA,EAAAA,CAAGJ,GAAG,CAAC,IAAI,CAAC8H,KAAK,CAAC5C,CAAC,EAAE,IAAI,CAAC4C,KAAK,CAACvE,CAAC,CAAA,CAAA;AAEnC,YAAA,IAAI,CAACrC,EAAE,CAACqH,UAAU,GAAG,IAAI,CAACD,OAAO,CAC/B,IAAI,CAACH,eAAe,EACpB/H,EAAAA,CAAGL,GAAG,CAAC,IAAI,CAACgI,QAAQ,CAAC7C,CAAC,EAAE,IAAI,CAAC6C,QAAQ,CAACxE,CAAC,CAAA,EACvCnD,GAAGJ,GAAG,CAAC,IAAI,CAAC+H,QAAQ,CAAC7C,CAAC,EAAE,IAAI,CAAC6C,QAAQ,CAACxE,CAAC,CAAA,CAAA;AAEzC,YAAA,IAAI,CAAC5B,GAAG,CAAC,IAAI,CAACwG,eAAe,EAAE,WAAA;gBAC7B,IAAI,CAACE,OAAO,GAAGjI,EAAAA,CAAGJ,GAAG,CAAC,CAAA,EAAGI,GAAGL,GAAG,CAAC,IAAI,CAAC+H,KAAK,CAAC5C,CAAC,EAAE,IAAI,CAAC4C,KAAK,CAACvE,CAAC,CAAA,CAAA;AAC5D,aAAA,CAAA;AACA,YAAA,IAAI,CAACyE,IAAI,GAAG5H,EAAAA,CAAGL,GAAG,CAAC,IAAI,CAACwI,UAAU,EAAE,IAAI,CAACF,OAAO,CAAA;AAChD,YAAA,IAAI,CAACJ,IAAI,GAAG7H,EAAAA,CAAGJ,GAAG,CAAC,IAAI,CAACuI,UAAU,EAAE,IAAI,CAACF,OAAO,CAAA;AAClD,SAAA,CAAA,CAAGG,KAAK,CAAC,WAAA;AACP,YAAA,IAAI,CAACR,IAAI,GAAG,IAAI,CAACF,KAAK,CAAC5C,CAAC;AACxB,YAAA,IAAI,CAAC+C,IAAI,GAAG,IAAI,CAACH,KAAK,CAACvE,CAAC;AAC1B,SAAA,CAAA;QACA,IAAI,CAACyE,IAAI,GAAG5H,EAAAA,CAAGJ,GAAG,CAAC,IAAI,CAACgI,IAAI,EAAE,CAAA,CAAA;QAC9B,IAAI,CAACC,IAAI,GAAG7H,EAAAA,CAAGJ,GAAG,CAAC,IAAI,CAACiI,IAAI,EAAE,CAAA,CAAA;QAC9B,IAAI,CAAC/G,EAAE,CAACuH,OAAO,GAAGC,kBAAmB,CAAA,IAAI,EAAEtI,EAAAA,CAAGY,IAAI,CAAC,CAAI,CAAA,EAAA,IAAI,CAACsD,KAAK,CAACW,KAAK,CAACnB,CAAC,EAAE,IAAI,CAAC+D,GAAG,EAAE,IAAI,CAAClH,GAAG,CAAA;QAC7F,IAAI,CAACgB,GAAG,CAACvB,EAAGoG,CAAAA,WAAW,CAAC,IAAI,CAACiC,OAAO,EAAE,CAAI,CAAA,EAAA,WAAA;AACxC,YAAA,IAAI,CAACR,IAAI,GAAG7H,EAAAA,CAAGL,GAAG,CAAC,IAAI,CAACkI,IAAI,EAAE,IAAI,CAACQ,OAAO,CAAA;AAC5C,SAAA,CAAA;QACA,IAAI,CAAC9G,GAAG,CACNvB,EAAG+E,CAAAA,EAAE,CACH/E,EAAGgF,CAAAA,aAAa,CAAC,IAAI,CAAC6C,IAAI,EAAE,IAAI,CAACD,IAAI,CAAA,EACrC5H,EAAGoG,CAAAA,WAAW,CAAC,IAAI,CAACwB,IAAI,EAAEnJ,gCAE5B,CAAA,CAAA,EAAA,WAAA;YACE,IAAI,CAACgD,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,CAAA,CAAA;AAChC,SAAA,CAAA;;AAGF,QAAA,IAAI,CAAC0H,IAAI,GAAG7H,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAAC8F,IAAI,EAAE5H,EAAGL,CAAAA,GAAG,CAAC,IAAI,CAACuE,KAAK,CAACW,KAAK,CAACzB,CAAC,EAAEpD,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAAC0G,IAAI,EAAE,IAAI,CAACD,IAAI,CAAA,CAAA,CAAA;QACpF,IAAI,CAAC9G,EAAE,CAACyH,SAAS,GAAGvI,EAAGJ,CAAAA,GAAG,CACxBI,EAAGwI,CAAAA,KAAK,CACNxI,EAAGoB,CAAAA,GAAG,CACJ,IAAI,CAAC8C,KAAK,CAACuE,KAAK,CAAC3D,CAAC,EAClB,IAAI,CAACsC,SAAS,EACdpH,EAAG4C,CAAAA,KAAK,CAAC5C,EAAGqC,CAAAA,GAAG,CAACrC,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAAC0G,IAAI,EAAE,IAAI,CAACD,IAAI,CAAA,EAAGpJ,kCAAqC,CAAA,EAAA,CAAA,EAAG,CAG1FD,CAAAA,CAAAA,CAAAA,EAAAA,sBAAAA,CAAAA;QAEF,IAAI,CAACuC,EAAE,CAAC4H,KAAK,GAAG1I,EAAGqC,CAAAA,GAAG,CAACrC,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAAC0G,IAAI,EAAE,IAAI,CAACD,IAAI,CAAA,EAAG,IAAI,CAACW,SAAS,CAAA;QACnE,IAAI,CAACzH,EAAE,CAAC6H,UAAU,GAAG3I,GAAG4I,GAAG,CAAC,IAAI,CAACL,SAAS,CAAA;QAE1C,IAAI,CAACzH,EAAE,CAAC+H,OAAO,GAAG,IAAI,CAAC3E,KAAK,CAAC4E,EAAE,CAAChE,CAAC;AACjC,QAAA,IAAI,CAAChE,EAAE,CAACiI,OAAO,GAAG/I,GAAG4C,KAAK,CAAC,IAAI,CAACsB,KAAK,CAAC4E,EAAE,CAAC3F,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;AAC/C,QAAA,IAAI,CAACrC,EAAE,CAACoB,QAAQ,GAAGlC,EAAAA,CAAGgB,GAAG,CAAC,IAAI,CAACkD,KAAK,CAAC8E,MAAM,CAAC3D,GAAG,EAAE,IAAI,CAAC9E,GAAG,CAAA;QACzD,IAAI,CAACO,EAAE,CAACmI,MAAM,GAAGjJ,EAAG6F,CAAAA,GAAG,CACrB7D,OAAQ,CAAA,IAAI,EAAE,IAAI,CAACkC,KAAK,CAACgF,KAAK,CAACpE,CAAC,EAAE,IAAI,CAAC5C,QAAQ,GAC/CF,OAAQ,CAAA,IAAI,EAAE,IAAI,CAACkC,KAAK,CAACgF,KAAK,CAAC/F,CAAC,EAAE,IAAI,CAACjB,QAAQ,GAC/C,IAAI,CAACgC,KAAK,CAACgF,KAAK,CAACxF,CAAC,CAAA;;AAGpB,QAAA,MAAMyF,YAAY,CAAK,IAAA,CAAIzJ,GAAAA,IAAAA,CAAK4C,EAAE,CAAD;AACjC,QAAA,IAAI,CAACxB,EAAE,CAACsI,aAAa,GAAGpJ,GAAG4C,KAAK,CAAC,IAAI,CAACsB,KAAK,CAAC4E,EAAE,CAACpF,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;AACrD,QAAA,IAAK,IAAIoF,EAAAA,GAAK,CAAGA,EAAAA,EAAAA,GAAK7B,SAAS6B,EAAM,EAAA,CAAA;AACnC,YAAA,IAAIA,OAAO,CAAG,EAAA;AACZ,gBAAA,IAAI,CAAChI,EAAE,CAACuI,QAAQ,GAAG,IAAI,CAACJ,MAAM;aACzB,MAAA;AACL,gBAAA,IAAI,CAACnI,EAAE,CAAC,CAAC,OAAO,EAAEgI,IAAI,CAAC,GAAG9I,GAAG6F,GAAG,CAACsD,WAAW,IAAI,CAACF,MAAM,EAAE,IAAI,CAACG,aAAa,CAAA;AAC3E,gBAAA,IAAI,CAACA,aAAa,GAAGpJ,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACgI,aAAa,EAAE,IAAI,CAACA,aAAa,CAAA;AACpE;AACF;;AAEA,QAAA,IAAI,CAACtI,EAAE,CAACwI,SAAS,GAAGtJ,EAAGuJ,CAAAA,QAAQ,CAAC,IAAI,CAACrF,KAAK,CAAC8E,MAAM,CAAC5F,CAAC,EAAE,CAAA,CAAA;QACrD,IAAI,CAACtC,EAAE,CAAC0I,gBAAgB,GAAG,IAAI,CAACtF,KAAK,CAACuF,cAAc,CAACpE,GAAG;QACxD,IAAI,CAAC9D,GAAG,CAACvB,EAAAA,CAAG0J,GAAG,CAAC,IAAI,CAACJ,SAAS,CAAG,EAAA,WAAA;AAC/B,YAAA,IAAI,CAACE,gBAAgB,GAAGxJ,EAAAA,CAAGoB,GAAG,CAC5B,IAAI,CAACoI,gBAAgB,EACrBG,kBAAmB,CAAA,IAAI,EAAE,IAAI,CAACC,IAAI,EAAE,IAAI,CAACnC,GAAG,EAAE,IAAI,CAACvD,KAAK,CAAC8E,MAAM,CAAC3D,GAAG,EAAEiC,SAASuC,gBAAgB,CAAA,CAAA;AAElG,SAAA,CAAA;AAEA,QAAA,IAAI,CAAC/I,EAAE,CAACgJ,SAAS,GAAG9J,EAAAA,CAAGY,IAAI,CAAC,CAAA,CAAA;AAC5B,QAAA,IAAI,CAACE,EAAE,CAACiJ,mBAAmB,GAAG/J,EAAAA,CAAGa,KAAK,CAAC,CAAA,CAAA;AACvC,QAAA,IAAI,CAACC,EAAE,CAACkJ,cAAc,GAAGhK,EAAAA,CAAGa,KAAK,CAAC,CAAA,CAAA;AAClC,QAAA,IAAI,CAACC,EAAE,CAACmJ,aAAa,GAAGjK,EAAAA,CAAGa,KAAK,CAAC,CAAA,CAAA;QACjC,IAAI,CAACC,EAAE,CAAC+B,CAAC,GAAG7C,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAAC8F,IAAI,EAAE5H,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAAC+F,MAAM,EAAE,IAAI,CAACuB,KAAK,CAAA,CAAA;QAC5D,IAAI,CAAC5H,EAAE,CAACoJ,WAAW,GAAG,IAAI,CAAChG,KAAK,CAACuE,KAAK,CAACtF,CAAC;QACxC,IAAI,CAACrC,EAAE,CAACqJ,YAAY,GAAG,IAAI,CAACjG,KAAK,CAACuE,KAAK,CAAC/E,CAAC;QACzC,IAAI,CAAC0G,IAAI,CAACpK,EAAG4I,CAAAA,GAAG,CAAC,GAAA,CAAA,EAAM,CAAG,EAAA,IAAI,CAACD,UAAU,EAAE,WAAA;YACzC,IAAI,CAAC7H,EAAE,CAACuJ,SAAS,GAAGrK,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAAC2F,GAAG,EAAEzH,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACb,GAAG,EAAE,IAAI,CAACsC,CAAC,CAAA,CAAA;YAC5D,IAAI,CAAC/B,EAAE,CAACwJ,MAAM,GAAGxE,QAAQ,IAAI,EAAE,IAAI,CAACuE,SAAS,CAAA;;AAE7C,YAAA,IAAI,CAAC9I,GAAG,CAACvB,EAAAA,CAAGgF,aAAa,CAAC,IAAI,CAACsF,MAAM,CAACnH,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AAC3C,gBAAA,IAAI,CAACN,CAAC,GAAG7C,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAACe,CAAC,EAAE,IAAI,CAAC6F,KAAK,CAAA;AAClC,gBAAA,IAAI,CAAC6B,SAAS,EAAA;AAChB,aAAA,CAAA;YACA,IAAI,CAACzJ,EAAE,CAAC0J,UAAU,GAAG,IAAI,CAACF,MAAM,CAACxF,CAAC;AAClC,YAAA,IAAI,CAAChE,EAAE,CAAC2J,UAAU,GAAGzK,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAAC8C,KAAK,CAACwG,MAAM,CAACrF,GAAG,EAAE,IAAI,CAACmF,UAAU,CAAA;;AAElE,YAAA,IAAI,CAAC1J,EAAE,CAAC6J,OAAO,GAAG,IAAI,CAAC9B,OAAO;AAC9B,YAAA,IAAI,CAAC/H,EAAE,CAAC8J,OAAO,GAAG,IAAI,CAAC7B,OAAO;AAC9B,YAAA,IAAI,CAACjI,EAAE,CAAC+J,iBAAiB,GAAG7K,EAAAA,CAAGY,IAAI,CAAC,CAAA,CAAA;AACpC,YAAA,IAAI,CAACW,GAAG,CAAC,IAAI,CAAC+H,SAAS,EAAE,WAAA;gBACvB,IAAI,CAACuB,iBAAiB,GAAGlB,kBAAAA,CACvB,IAAI,EACJ,IAAI,CAACC,IAAI,EACT,IAAI,CAACS,SAAS,EACd,IAAI,CAACnG,KAAK,CAAC8E,MAAM,CAAC3D,GAAG,EACrBiC,QAAAA,CAASuC,gBAAgB,CAAA;AAE7B,aAAA,CAAA;AACA,YAAA,IAAK,IAAIf,EAAAA,GAAK,CAAGA,EAAAA,EAAAA,GAAK7B,SAAS6B,EAAM,EAAA,CAAA;AACnC,gBAAA,IAAIA,OAAO,CAAG,EAAA;AACZ,oBAAA,IAAI,CAAChI,EAAE,CAACgK,KAAK,GAAG,IAAI,CAACL,UAAU;AAC/B,oBAAA,IAAI,CAAC3J,EAAE,CAACiK,IAAI,GAAG,IAAI,CAACP,UAAU;iBACzB,MAAA;oBACL,IAAI,CAAC1J,EAAE,CAAC,CAAC,IAAI,EAAEgI,EAAAA,CAAAA,CAAI,CAAC,GAAG9I,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE0H,EAAAA,GAAK,GAAG,CAAC,EAAE,IAAI,CAAC6B,OAAO,CAAA;oBACjE,IAAI,CAAC7J,EAAE,CAAC,CAAC,GAAG,EAAEgI,EAAAA,CAAAA,CAAI,CAAC,GAAG9I,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE0H,EAAAA,GAAK,GAAG,CAAC,EAAE,IAAI,CAAC8B,OAAO,CAAA;AAC/D,oBAAA,IAAI,CAACD,OAAO,GAAG3K,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACuJ,OAAO,EAAE,IAAI,CAACA,OAAO,CAAA;AAChD,oBAAA,IAAI,CAACC,OAAO,GAAG5K,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACwJ,OAAO,EAAE,IAAI,CAACA,OAAO,CAAA;AAClD;gBACA,IAAI,CAAC9J,EAAE,CAAC,CAAC,MAAM,EAAEgI,EAAAA,CAAAA,CAAI,CAAC,GAAG,IAAI,CAAC+B,iBAAiB;AACjD;AACA,YAAA,IAAI,CAAC/J,EAAE,CAACkK,YAAY,GAAGhL,EAAGoB,CAAAA,GAAG,CAC3B,IAAI,CAACiG,OAAO,EACZrH,EAAAA,CAAG4C,KAAK,CAAC5C,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAACoC,KAAK,CAACgF,KAAK,CAAC9F,CAAC,EAAE,IAAI,CAACkH,MAAM,CAAC5G,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA,CAAA;YAEzD,IAAI,CAACnC,GAAG,CAACvB,EAAGoG,CAAAA,WAAW,CAAC,IAAI,CAACoE,UAAU,EAAE,CAAI,CAAA,EAAA,WAAA;AAC3C,gBAAA,IAAK,IAAI1B,EAAAA,GAAK,CAAGA,EAAAA,EAAAA,GAAK7B,SAAS6B,EAAM,EAAA,CAAA;oBACnC,IAAI,CAAChI,EAAE,CAAC,CAAC,MAAM,EAAEgI,EAAAA,CAAAA,CAAI,CAAC,GAAG9I,EAAGa,CAAAA,KAAK,CAAC,CAAA,CAAA;AACpC;AACA,gBAAA,IAAI,CAACC,EAAE,CAACmK,SAAS,GAAGjL,EAAAA,CAAGa,KAAK,CAAC,CAAA,CAAA;AAC7B,gBAAA,IAAI,CAACuJ,IAAI,CAACpK,GAAG4I,GAAG,CAAC,MAAM,CAAG5I,EAAAA,EAAAA,CAAG8B,GAAG,CAAC9B,GAAG4I,GAAG,CAAC,IAAI,CAACsB,WAAW,GAAG,CAAI,CAAA,EAAA,WAAA;AAC7D,oBAAA,IAAI,CAACpJ,EAAE,CAACoK,KAAK,GAAGlL,GAAGqC,GAAG,CAACrC,EAAGa,CAAAA,KAAK,CAAC,IAAI,CAACsK,CAAC,CAAG,EAAA,IAAI,CAACjB,WAAW,CAAA;AACzD,oBAAA,IAAI,CAACpJ,EAAE,CAACsK,QAAQ,GAAGpL,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC8J,KAAK,EAAE,IAAI,CAACA,KAAK,CAAA;AAChD,oBAAA,IAAI,CAACpK,EAAE,CAACuK,UAAU,GAAGrL,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAACiK,QAAQ,EAAE,IAAI,CAACH,SAAS,CAAA;AACzD,oBAAA,IAAI,CAACnK,EAAE,CAACwK,SAAS,GAAGtL,EAAAA,CAAG8B,GAAG,CACxB,IAAI,CAACuI,SAAS,EACdrK,EAAGoB,CAAAA,GAAG,CACJ,IAAI,CAAC8C,KAAK,CAAC8E,MAAM,CAAC3D,GAAG,EACrB,IAAI,CAAC8E,YAAY,EACjBnK,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAACmJ,SAAS,EAAEjL,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACiK,UAAU,EAAE,GAAA,CAAA,CAAA,CAAA,CAAA;AAGnD,oBAAA,IAAI,CAACJ,SAAS,GAAG,IAAI,CAACG,QAAQ;oBAC9B,IAAI,CAACtK,EAAE,CAACyK,YAAY,GAAGzF,OAAQ,CAAA,IAAI,EAAE,IAAI,CAACwF,SAAS,EAAElM,uBAAAA,CAAAA;oBACrD,IAAI,CAACmC,GAAG,CACNvB,EAAG+E,CAAAA,EAAE,CAAC/E,EAAGgF,CAAAA,aAAa,CAAC,IAAI,CAACuG,YAAY,CAAC7H,CAAC,EAAE,CAAI1D,CAAAA,EAAAA,EAAAA,CAAGkF,gBAAgB,CAAC,IAAI,CAACqG,YAAY,CAAC7H,CAAC,EAAE,CACzF,CAAA,CAAA,EAAA,WAAA;AACE,wBAAA,IAAI,CAAC8H,MAAM,EAAA;AACb,qBAAA,CAAA;AAEF,oBAAA,IAAI,CAACjK,GAAG,CAACvB,EAAAA,CAAGgF,aAAa,CAAC,IAAI,CAACuG,YAAY,CAACpI,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AACjD,wBAAA,IAAI,CAACoH,SAAS,EAAA;AAChB,qBAAA,CAAA;oBACA,IAAI,CAACzJ,EAAE,CAAC2K,SAAS,GAAG,IAAI,CAACF,YAAY,CAACzG,CAAC;AACvC,oBAAA,IAAI,CAAChE,EAAE,CAAC4K,aAAa,GAAG,IAAI,CAAC3C,OAAO;AACpC,oBAAA,IAAK,IAAID,EAAAA,GAAK,CAAGA,EAAAA,EAAAA,GAAK7B,SAAS6B,EAAM,EAAA,CAAA;wBACnC,IAAI,CAAC,CAAC,MAAM,EAAEA,EAAAA,CAAAA,CAAI,CAAC,GAAG9I,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAEgH,EAAI,CAAA,CAAA,CAAC,EAAE9I,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACqK,SAAS,EAAE,IAAI,CAACJ,UAAU,CAAA,CAAA;wBACxF,IAAIvC,EAAAA,GAAK,IAAI7B,OAAS,EAAA;AACpB,4BAAA,IAAI,CAACwE,SAAS,GAAGzL,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACqK,SAAS,EAAE,IAAI,CAACC,aAAa,CAAA;AAC1D,4BAAA,IAAI,CAACA,aAAa,GAAG1L,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACsK,aAAa,EAAE,IAAI,CAACA,aAAa,CAAA;AACpE;AACF;AACF,iBAAA,CAAA;AACA,gBAAA,IAAK,IAAI5C,EAAAA,GAAK,CAAGA,EAAAA,EAAAA,GAAK7B,SAAS6B,EAAM,EAAA,CAAA;AACnC,oBAAA,IAAI,CAAC,CAAC,MAAM,EAAEA,EAAAA,CAAAA,CAAI,CAAC,GAAG9I,EAAAA,CAAGoB,GAAG,CAC1B,IAAI,CAAC,CAAC,MAAM,EAAE0H,IAAI,CAAC,EACnB9I,EAAG2L,CAAAA,GAAG,CAAC3L,EAAG6B,CAAAA,GAAG,CAAC7B,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE0H,EAAAA,CAAAA,CAAI,CAAC,EAAE,IAAI,CAACqB,YAAY,CAAA,CAAA,CAAA,CAAA;AAE/D;;AAEA,gBAAA,IAAI,CAACH,cAAc,GAAGhK,GAAG8B,GAAG,CAAC,IAAI,CAACkI,cAAc,EAAEhK,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAACyB,CAAC,EAAE,IAAI,CAACkH,mBAAmB,CAAA,CAAA;AACzF,gBAAA,IAAI,CAACE,aAAa,GAAGjK,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAACmI,aAAa,EAAE,IAAI,CAACF,mBAAmB,CAAA;AAC1E,aAAA,CAAA;AACA,YAAA,IAAK,IAAIjB,EAAK7B,GAAAA,OAAAA,GAAU,CAAG6B,EAAAA,EAAAA,IAAM,GAAGA,EAAM,EAAA,CAAA;gBACxC,IAAI,CAAChI,EAAE,CAAC8K,MAAM,GAAG5L,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE0H,IAAI,CAAC,EAAE,IAAI,CAACU,gBAAgB,EAAE,IAAI,CAAC,CAAC,OAAO,EAAEV,EAAAA,CAAAA,CAAI,CAAC,CAAA;AACxF,gBAAA,IAAIA,OAAO,CAAG,EAAA;AACZ,oBAAA,IAAI,CAAC8C,MAAM,GAAG5L,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAAC8J,MAAM,EAAE,IAAI,CAACZ,YAAY,CAAA;AACrD;AACA,gBAAA,IAAI,CAAClK,EAAE,CAAC+K,SAAS,GAAG7L,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACwK,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE9C,IAAI,CAAC,CAAA;AACzD,gBAAA,IAAI,CAAChI,EAAE,CAACgL,OAAO,GAAG9L,EAAGJ,CAAAA,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAEkJ,EAAAA,CAAAA,CAAI,CAAC,EAAE,IAAA,CAAA;gBAC3C,IAAI,CAAChI,EAAE,CAACiL,IAAI,GAAG/L,EAAG2L,CAAAA,GAAG,CAAC3L,EAAG6B,CAAAA,GAAG,CAAC7B,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC0K,OAAO,EAAE,IAAI,CAACpD,KAAK,CAAA,CAAA,CAAA;AAC5D,gBAAA,IAAI,CAACoB,SAAS,GAAG9J,GAAG8B,GAAG,CACrB,IAAI,CAACgI,SAAS,EACd9J,EAAAA,CAAGoB,GAAG,CACJ,IAAI,CAAC2I,mBAAmB,EACxB/J,GAAGqC,GAAG,CAACrC,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAAC0K,SAAS,EAAE7L,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAACyK,SAAS,EAAE,IAAI,CAACE,IAAI,CAAI,CAAA,EAAA,IAAI,CAACD,OAAO,CAAA,CAAA,CAAA;AAGlF,gBAAA,IAAIhD,OAAO,CAAG,EAAA;AACZ,oBAAA,IAAI,CAACiB,mBAAmB,GAAG/J,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAAC2I,mBAAmB,EAAE,IAAI,CAACgC,IAAI,CAAA;AACvE;AACF;AACA,YAAA,IAAI,CAACxK,GAAG,CAACvB,EAAGwB,CAAAA,QAAQ,CAAC,IAAI,CAACuI,mBAAmB,EAAE,IAAI,CAAC7F,KAAK,CAACuE,KAAK,CAACrF,CAAC,CAAG,EAAA,WAAA;AAClE,gBAAA,IAAI,CAACoI,MAAM,EAAA;AACb,aAAA,CAAA;AACA,YAAA,IAAI,CAAC3I,CAAC,GAAG7C,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAACe,CAAC,EAAE,IAAI,CAAC6F,KAAK,CAAA;AACpC,SAAA,CAAA;;;QAGA,IAAI,CAACnH,GAAG,CAACvB,EAAGoG,CAAAA,WAAW,CAAC,IAAI,CAAC6D,aAAa,EAAE,CAAI,CAAA,EAAA,WAAA;AAC9C,YAAA,IAAI,CAACnJ,EAAE,CAACkL,GAAG,GAAGhM,EAAAA,CAAGqC,GAAG,CAAC,IAAI,CAAC2H,cAAc,EAAEhK,EAAGJ,CAAAA,GAAG,CAAC,IAAI,CAACqK,aAAa,EAAE,KAAA,CAAA,CAAA;AACrE,YAAA,IAAI,CAACnJ,EAAE,CAACmL,EAAE,GAAGC,UAAAA,CACX,IAAI,EACJ,IAAI,CAACtC,IAAI,EACT,IAAI,CAACnC,GAAG,EACR,IAAI,CAAClH,GAAG,EACR,IAAI,CAACyL,GAAG,EACR1E,QAASuC,CAAAA,gBAAgB,EACzBvC,QAAAA,CAAS6E,kBAAkB,CAAA;AAE7B,YAAA,IAAI,CAACrC,SAAS,GAAG9J,EAAAA,CAAG8B,GAAG,CACrB9B,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAAC6K,EAAE,CAACtF,GAAG,EAAE3G,EAAGmB,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC4I,mBAAmB,CAAA,CAAA,EACtD/J,GAAGoB,GAAG,CAAC,IAAI,CAAC0I,SAAS,EAAE,IAAI,CAACmC,EAAE,CAAC1F,CAAC,CAAA,CAAA;AAEpC,SAAA,CAAA;AACA,QAAA,IAAI,CAAC9E,OAAO,CAACzB,EAAAA,CAAGG,IAAI,CAAC,IAAI,CAAC2J,SAAS,EAAE,IAAI,CAACC,mBAAmB,CAAA,CAAA;AAC/D,KAAA,CAAA;IAEF,OAAO/J,EAAAA,CAAG+B,cAAc,EAAE,CAACrB,QAAAA,CAAS,CAACwG,UAAYhD,EAAAA,KAAAA,EAAO3D,GAAK4G,EAAAA,MAAAA,EAAQC,SAAWC,EAAAA,OAAAA,CAAAA;AAClF;AAEA;;;IAIO,SAAS+E,oBAAAA,CACd/L,KAA4B,EAC5B6G,UAAuB,EACvBmF,aAA0B,EAC1BxC,gBAA6B,EAC7BsC,kBAA+B,EAAA;IAE/B,MAAMnM,EAAAA,GAAKK,MAAMI,QAAQ;AACzB,IAAA,MAAM8G,mBAAmBC,yBAA0BxH,CAAAA,EAAAA,CAAAA;AACnD,IAAA,MAAMU,QAAW,GAAA,wBAAA;IACjBV,EAAGW,CAAAA,IAAI,CAACD,QAAU,EAAA;QAAC6G,gBAAiB,CAAA,MAAA;KAAQ,EAAE,WAAA;AAC5C,QAAA,IAAI,CAACzG,EAAE,CAACqD,GAAG,GAAGnE,EAAAA,CAAGY,IAAI,CAAC,CAAA,EAAGZ,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAAC8H,IAAI,CAAC0C,WAAW,EAAExN,gCAAmC,CAAA,EAAA,CAAA,CAAA;AAC1F,QAAA,IAAI,CAACgC,EAAE,CAACyL,GAAG,GAAGvM,EAAAA,CAAGY,IAAI,CAAC,CAAA,CAAA;QACtB,IAAI,CAACwJ,IAAI,CAACpK,EAAAA,CAAG4I,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG,EAAI,EAAA,WAAA;AAC5B,YAAA,IAAI,CAAC2D,GAAG,GAAGvM,EAAG8B,CAAAA,GAAG,CACf,IAAI,CAACyK,GAAG,EACRL,WACE,IAAI,EACJ,IAAI,CAACtC,IAAI,EACT,IAAI,CAACzF,GAAG,EACRkI,cAAcG,EAAE,CAAC,IAAI,CAACC,CAAC,CAAEpH,CAAAA,GAAG,EAC5BrF,EAAAA,CAAGa,KAAK,CAAC,KACTgJ,gBACAsC,EAAAA,kBAAAA,EACA,OACAxF,GAAG,CAAA;AAET,SAAA,CAAA;;QAEA,IAAI,CAAClF,OAAO,CAACzB,EAAAA,CAAGqC,GAAG,CAAC,IAAI,CAACkK,GAAG,EAAE,EAAA,CAAA,CAAA;AAChC,KAAA,CAAA;AACA,IAAA,OAAOvM,EAAG+B,CAAAA,cAAc,EAAE,CAACrB,SAAS,CAACwG,UAAAA,CAAAA;AACvC;AAEA;;;IAIA,SAASwF,eAAe1M,EAAkB,EAAE2M,SAAsB,EAAEC,KAAkB,EAAEC,MAAe,EAAA;AACrG,IAAA,MAAMC,OAAO9M,EAAG8B,CAAAA,GAAG,CAACpC,IAAK4C,CAAAA,EAAE,GAAG,CAAGsK,EAAAA,KAAAA,CAAAA;AACjC,IAAA,OAAOC,MACH7M,GAAAA,EAAAA,CAAGoB,GAAG,CAACpB,EAAGqC,CAAAA,GAAG,CAACrC,EAAAA,CAAG8B,GAAG,CAAC6K,SAAWC,EAAAA,KAAAA,CAAAA,EAAQE,OAAOpN,IAAK4C,CAAAA,EAAE,GAAG,CAAA,CAAA,GACzDtC,EAAGmB,CAAAA,GAAG,CAACnB,EAAAA,CAAGoB,GAAG,CAACpB,EAAAA,CAAGqC,GAAG,CAACsK,SAAWjN,EAAAA,IAAAA,CAAK4C,EAAE,GAAG,IAAIwK,IAAOF,CAAAA,EAAAA,KAAAA,CAAAA;AAC3D;AAEA;;;;;AAKC,IACM,SAASG,gBAAAA,CAAiB1M,KAA4B,EAAEE,GAAgB,EAAEqM,KAAkB,EAAA;IACjG,MAAM5M,EAAAA,GAAKK,MAAMI,QAAQ;AACzB,IAAA,MAAMC,QAAW,GAAA,oBAAA;IACjBV,EAAGW,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACV,QAAAA,EAAAA,CAAGY,IAAI,CAAC,GAAA,CAAA;AAAMZ,QAAAA,EAAAA,CAAGa,KAAK,CAAC,OAAA;KAAS,EAAE,WAAA;AACnD,QAAA,IAAI,CAACC,EAAE,CAACkM,UAAU,GAAGhN,EAAAA,CAAG0E,MAAM,CAAC,IAAI,CAACxD,CAAC,CAACyE,EAAE,CAAA;AACxC,QAAA,IAAI,CAAC7E,EAAE,CAACmM,OAAO,GAAG,IAAI,CAAC/E,OAAO,CAC5BlI,EAAGoG,CAAAA,WAAW,CAAC,IAAI,CAAC4G,UAAU,EAAE,IAChChN,CAAAA,EAAAA,EAAAA,CAAGqC,GAAG,CAAC,IAAI,CAACnB,CAAC,CAACyE,EAAE,EAAE,IAAI,CAACqH,UAAU,CAAA,EACjChN,EAAG0B,CAAAA,IAAI,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA;AAEb,QAAA,IAAI,CAACZ,EAAE,CAAC6L,SAAS,GAAG3M,EAAAA,CAAGkN,IAAI,CAAClN,EAAAA,CAAG4C,KAAK,CAAC,IAAI,CAAC1B,CAAC,CAACiC,CAAC,EAAE,EAAI,EAAA,CAAA,CAAA,CAAA;QACnD,IAAI,CAACwJ,SAAS,GAAG3M,EAAAA,CAAG4C,KAAK,CAAC8J,cAAAA,CAAe1M,IAAI,IAAI,CAAC2M,SAAS,EAAE,IAAI,CAACC,KAAK,EAAE,OAAO,CAAGlN,EAAAA,IAAAA,CAAK4C,EAAE,GAAG,CAAA,CAAA;;QAE7F,IAAI,CAACxB,EAAE,CAACqM,CAAC,GAAGnN,EAAGY,CAAAA,IAAI,CAACZ,EAAAA,CAAGoB,GAAG,CAAC,IAAI,CAAC6L,OAAO,EAAEjN,EAAGoN,CAAAA,GAAG,CAAC,IAAI,CAACT,SAAS,CAAI3M,CAAAA,EAAAA,EAAAA,CAAGqN,GAAG,CAAC,IAAI,CAACV,SAAS,CAAA,CAAA;AACvF,QAAA,IAAI,CAACQ,CAAC,GAAGnN,EAAGqC,CAAAA,GAAG,CAAC,IAAI,CAAC8K,CAAC,EAAEnN,GAAG8B,GAAG,CAAC9B,GAAGgD,GAAG,CAAC,IAAI,CAACmK,CAAC,CAACrI,CAAC,GAAG9E,EAAGgD,CAAAA,GAAG,CAAC,IAAI,CAACmK,CAAC,CAAChK,CAAC,CAAA,EAAGnD,GAAGgD,GAAG,CAAC,IAAI,CAACmK,CAAC,CAACzJ,CAAC,CAAA,CAAA,CAAA;QAClF,IAAI,CAACjC,OAAO,CACVzB,EAAAA,CAAG0B,IAAI,CACL1B,EAAAA,CAAG8B,GAAG,CAAC,GAAK9B,EAAAA,EAAAA,CAAGoB,GAAG,CAACpB,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAACqL,CAAC,CAACrI,CAAC,EAAE,IAAI,CAACqI,CAAC,CAAChK,CAAC,CAAA,EAAG,OAC/CnD,EAAG8B,CAAAA,GAAG,CAAC,GAAK9B,EAAAA,EAAAA,CAAGoB,GAAG,CAACpB,EAAGmB,CAAAA,GAAG,CAAC,IAAI,CAACgM,CAAC,CAAChK,CAAC,EAAE,IAAI,CAACgK,CAAC,CAACrI,CAAC,CAAG,EAAA,GAAA,CAAA,CAAA,CAAA,CAAA;AAGrD,KAAA,CAAA;AACA,IAAA,OAAO9E,GAAG+B,cAAc,EAAE,CAACrB,QAAAA,CAAS,CAACH,GAAKqM,EAAAA,KAAAA,CAAAA;AAC5C;AAEA;;;;AAIC,IACM,SAASU,gBAAAA,CAAiBjN,KAA4B,EAAEkN,EAAe,EAAEX,KAAkB,EAAA;IAChG,MAAM5M,EAAAA,GAAKK,MAAMI,QAAQ;AACzB,IAAA,MAAMC,QAAW,GAAA,oBAAA;IACjBV,EAAGW,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACV,QAAAA,EAAAA,CAAG0B,IAAI,CAAC,IAAA,CAAA;AAAO1B,QAAAA,EAAAA,CAAGa,KAAK,CAAC,OAAA;KAAS,EAAE,WAAA;AACpD,QAAA,IAAI,CAACC,EAAE,CAACuF,CAAC,GAAGrG,EAAAA,CAAGY,IAAI,CAACZ,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACoM,EAAE,CAACzI,CAAC,EAAE,IAAI,CAACyI,EAAE,CAACpK,CAAC,GAAGnD,EAAGmB,CAAAA,GAAG,CAACnB,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAACyL,EAAE,CAACzI,CAAC,EAAE,IAAI,CAACyI,EAAE,CAACpK,CAAC,GAAG,CAAI,CAAA,EAAA,CAAA,CAAA;AAC3F,QAAA,IAAI,CAACkD,CAAC,CAAC3C,CAAC,GAAG1D,EAAGJ,CAAAA,GAAG,CAACI,EAAAA,CAAGmB,GAAG,CAACnB,EAAGmB,CAAAA,GAAG,CAAC,CAAGnB,EAAAA,EAAAA,CAAGgD,GAAG,CAAC,IAAI,CAACqD,CAAC,CAACvB,CAAC,CAAI9E,CAAAA,EAAAA,EAAAA,CAAGgD,GAAG,CAAC,IAAI,CAACqD,CAAC,CAAClD,CAAC,CAAI,CAAA,EAAA,CAAA,CAAA;QACzE,IAAI,CAACkD,CAAC,GAAGrG,EAAAA,CAAGwN,SAAS,CAAC,IAAI,CAACnH,CAAC,CAAA;AAC5B,QAAA,IAAI,CAACvF,EAAE,CAAC6L,SAAS,GAAGD,cAAAA,CAAe1M,IAAIA,EAAGkN,CAAAA,IAAI,CAAC,IAAI,CAAC7G,CAAC,CAAC3C,CAAC,GAAG,IAAI,CAACkJ,KAAK,EAAE,KAAA,CAAA;AACtE,QAAA,IAAI,CAAC9L,EAAE,CAACkM,UAAU,GAAGhN,EAAAA,CAAG0E,MAAM,CAAC,IAAI,CAAC2B,CAAC,CAACoH,EAAE,CAAA;AACxC,QAAA,IAAI,CAAC3M,EAAE,CAACmM,OAAO,GAAG,IAAI,CAAC/E,OAAO,CAC5BlI,EAAGoG,CAAAA,WAAW,CAAC,IAAI,CAAC4G,UAAU,EAAE,IAChChN,CAAAA,EAAAA,EAAAA,CAAGqC,GAAG,CAAC,IAAI,CAACgE,CAAC,CAACoH,EAAE,EAAE,IAAI,CAACT,UAAU,CAAA,EACjChN,EAAG0B,CAAAA,IAAI,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA;QAEb,IAAI,CAACZ,EAAE,CAACrB,CAAC,GAAGO,GAAGoN,GAAG,CAAC,IAAI,CAACT,SAAS,CAAA;AACjC,QAAA,IAAI,CAAClL,OAAO,CACVzB,EAAGY,CAAAA,IAAI,CAACZ,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC6L,OAAO,CAACnI,CAAC,EAAE,IAAI,CAACrF,CAAC,CAAGO,EAAAA,EAAAA,CAAGqN,GAAG,CAAC,IAAI,CAACV,SAAS,GAAG3M,EAAGoB,CAAAA,GAAG,CAAC,IAAI,CAAC6L,OAAO,CAAC9J,CAAC,EAAE,IAAI,CAAC1D,CAAC,CAAA,CAAA,CAAA;AAEjG,KAAA,CAAA;AACA,IAAA,OAAOO,GAAG+B,cAAc,EAAE,CAACrB,QAAAA,CAAS,CAAC6M,EAAIX,EAAAA,KAAAA,CAAAA;AAC3C;;;;"}
|